Sync with 2.30.5

* maint-2.30:
  Git 2.30.5
  setup: tighten ownership checks post CVE-2022-24765
  git-compat-util: allow root to access both SUDO_UID and root owned
  t0034: add negative tests and allow git init to mostly work under sudo
  git-compat-util: avoid failing dir ownership checks if running privileged
  t: regression git needs safe.directory when using sudo
diff --git a/.gitattributes b/.gitattributes
index b08a141..b0044cf 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -6,6 +6,7 @@
 *.pm eol=lf diff=perl
 *.py eol=lf diff=python
 *.bat eol=crlf
+CODE_OF_CONDUCT.md -whitespace
 /Documentation/**/*.txt eol=lf
 /command-list.txt eol=lf
 /GIT-VERSION-GEN eol=lf
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index a3fbbe6..5f2f884 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -289,7 +289,7 @@
           - jobname: osx-gcc
             cc: gcc
             pool: macos-latest
-          - jobname: GETTEXT_POISON
+          - jobname: linux-gcc-default
             cc: gcc
             pool: ubuntu-latest
     env:
diff --git a/.travis.yml b/.travis.yml
index 05f3e3f..908330a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -16,7 +16,7 @@
 
 matrix:
   include:
-    - env: jobname=GETTEXT_POISON
+    - env: jobname=linux-gcc-default
       os: linux
       compiler:
       addons:
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index fc4645d..65651be 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -8,73 +8,64 @@
 
 ## Our Pledge
 
-In the interest of fostering an open and welcoming environment, we as
-contributors and maintainers pledge to make participation in our project and
-our community a harassment-free experience for everyone, regardless of age,
-body size, disability, ethnicity, sex characteristics, gender identity and
-expression, level of experience, education, socio-economic status,
-nationality, personal appearance, race, religion, or sexual identity and
-orientation.
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, religion, or sexual identity
+and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
 
 ## Our Standards
 
-Examples of behavior that contributes to creating a positive environment
-include:
+Examples of behavior that contributes to a positive environment for our
+community include:
 
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+  and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the
+  overall community
 
-Examples of unacceptable behavior by participants include:
+Examples of unacceptable behavior include:
 
-* The use of sexualized language or imagery and unwelcome sexual attention or
-  advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
+* The use of sexualized language or imagery, and sexual attention or
+  advances of any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
 * Public or private harassment
-* Publishing others' private information, such as a physical or electronic
-  address, without explicit permission
+* Publishing others' private information, such as a physical or email
+  address, without their explicit permission
 * Other conduct which could reasonably be considered inappropriate in a
   professional setting
 
-## Our Responsibilities
+## Enforcement Responsibilities
 
-Project maintainers are responsible for clarifying the standards of acceptable
-behavior and are expected to take appropriate and fair corrective action in
-response to any instances of unacceptable behavior.
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
 
-Project maintainers have the right and responsibility to remove, edit, or
-reject comments, commits, code, wiki edits, issues, and other contributions
-that are not aligned to this Code of Conduct, or to ban temporarily or
-permanently any contributor for other behaviors that they deem inappropriate,
-threatening, offensive, or harmful.
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
 
 ## Scope
 
-This Code of Conduct applies within all project spaces, and it also applies
-when an individual is representing the project or its community in public
-spaces. Examples of representing a project or community include using an
-official project e-mail address, posting via an official social media account,
-or acting as an appointed representative at an online or offline event.
-Representation of a project may be further defined and clarified by project
-maintainers.
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
 
 ## Enforcement
 
 Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported by contacting the project team at git@sfconservancy.org. All
-complaints will be reviewed and investigated and will result in a response
-that is deemed necessary and appropriate to the circumstances. The project
-team is obligated to maintain confidentiality with regard to the reporter of
-an incident. Further details of specific enforcement policies may be posted
-separately.
-
-Project maintainers who do not follow or enforce the Code of Conduct in good
-faith may face temporary or permanent repercussions as determined by other
-members of the project's leadership.
-
-The project leadership team can be contacted by email as a whole at
+reported to the community leaders responsible for enforcement at
 git@sfconservancy.org, or individually:
 
   - Ævar Arnfjörð Bjarmason <avarab@gmail.com>
@@ -82,12 +73,73 @@
   - Jeff King <peff@peff.net>
   - Junio C Hamano <gitster@pobox.com>
 
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series
+of actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or
+permanent ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior,  harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within
+the community.
+
 ## Attribution
 
 This Code of Conduct is adapted from the [Contributor Covenant][homepage],
-version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+version 2.0, available at
+[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].
+
+Community Impact Guidelines were inspired by 
+[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
+
+For answers to common questions about this code of conduct, see the FAQ at
+[https://www.contributor-covenant.org/faq][FAQ]. Translations are available 
+at [https://www.contributor-covenant.org/translations][translations].
 
 [homepage]: https://www.contributor-covenant.org
+[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
+[Mozilla CoC]: https://github.com/mozilla/diversity
+[FAQ]: https://www.contributor-covenant.org/faq
+[translations]: https://www.contributor-covenant.org/translations
 
-For answers to common questions about this code of conduct, see
-https://www.contributor-covenant.org/faq
diff --git a/Documentation/Makefile b/Documentation/Makefile
index b980407..81d1bf7 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -21,6 +21,7 @@
 MAN5_TXT += gitattributes.txt
 MAN5_TXT += githooks.txt
 MAN5_TXT += gitignore.txt
+MAN5_TXT += gitmailmap.txt
 MAN5_TXT += gitmodules.txt
 MAN5_TXT += gitrepository-layout.txt
 MAN5_TXT += gitweb.conf.txt
diff --git a/Documentation/MyFirstContribution.txt b/Documentation/MyFirstContribution.txt
index 7c9a037..af0a9da 100644
--- a/Documentation/MyFirstContribution.txt
+++ b/Documentation/MyFirstContribution.txt
@@ -664,7 +664,7 @@
 ----
 test_expect_success 'runs correctly with no args and good output' '
 	git psuh >actual &&
-	test_i18ngrep Pony actual
+	grep Pony actual
 '
 ----
 
diff --git a/Documentation/RelNotes/2.31.0.txt b/Documentation/RelNotes/2.31.0.txt
new file mode 100644
index 0000000..cf0c7d8
--- /dev/null
+++ b/Documentation/RelNotes/2.31.0.txt
@@ -0,0 +1,365 @@
+Git 2.31 Release Notes
+======================
+
+Updates since v2.30
+-------------------
+
+Backward incompatible and other important changes
+
+ * The "pack-redundant" command, which has been left stale with almost
+   unusable performance issues, now warns loudly when it gets used, as
+   we no longer want to recommend its use (instead just "repack -d"
+   instead).
+
+ * The development community has adopted Contributor Covenant v2.0 to
+   update from v1.4 that we have been using.
+
+ * The support for deprecated PCRE1 library has been dropped.
+
+ * Fixes for CVE-2021-21300 in Git 2.30.2 (and earlier) is included.
+
+
+UI, Workflows & Features
+
+ * The "--format=%(trailers)" mechanism gets enhanced to make it
+   easier to design output for machine consumption.
+
+ * When a user does not tell "git pull" to use rebase or merge, the
+   command gives a loud message telling a user to choose between
+   rebase or merge but creates a merge anyway, forcing users who would
+   want to rebase to redo the operation.  Fix an early part of this
+   problem by tightening the condition to give the message---there is
+   no reason to stop or force the user to choose between rebase or
+   merge if the history fast-forwards.
+
+ * The configuration variable 'core.abbrev' can be set to 'no' to
+   force no abbreviation regardless of the hash algorithm.
+
+ * "git rev-parse" can be explicitly told to give output as absolute
+   or relative path with the `--path-format=(absolute|relative)` option.
+
+ * Bash completion (in contrib/) update to make it easier for
+   end-users to add completion for their custom "git" subcommands.
+
+ * "git maintenance" learned to drive scheduled maintenance on
+   platforms whose native scheduling methods are not 'cron'.
+
+ * After expiring a reflog and making a single commit, the reflog for
+   the branch would record a single entry that knows both @{0} and
+   @{1}, but we failed to answer "what commit were we on?", i.e. @{1}
+
+ * "git bundle" learns "--stdin" option to read its refs from the
+   standard input.  Also, it now does not lose refs whey they point
+   at the same object.
+
+ * "git log" learned a new "--diff-merges=<how>" option.
+
+ * "git ls-files" can and does show multiple entries when the index is
+   unmerged, which is a source for confusion unless -s/-u option is in
+   use.  A new option --deduplicate has been introduced.
+
+ * `git worktree list` now annotates worktrees as prunable, shows
+   locked and prunable attributes in --porcelain mode, and gained
+   a --verbose option.
+
+ * "git clone" tries to locally check out the branch pointed at by
+   HEAD of the remote repository after it is done, but the protocol
+   did not convey the information necessary to do so when copying an
+   empty repository.  The protocol v2 learned how to do so.
+
+ * There are other ways than ".." for a single token to denote a
+   "commit range", namely "<rev>^!" and "<rev>^-<n>", but "git
+   range-diff" did not understand them.
+
+ * The "git range-diff" command learned "--(left|right)-only" option
+   to show only one side of the compared range.
+
+ * "git mergetool" feeds three versions (base, local and remote) of
+   a conflicted path unmodified.  The command learned to optionally
+   prepare these files with unconflicted parts already resolved.
+
+ * The .mailmap is documented to be read only from the root level of a
+   working tree, but a stray file in a bare repository also was read
+   by accident, which has been corrected.
+
+ * "git maintenance" tool learned a new "pack-refs" maintenance task.
+
+ * The error message given when a configuration variable that is
+   expected to have a boolean value has been improved.
+
+ * Signed commits and tags now allow verification of objects, whose
+   two object names (one in SHA-1, the other in SHA-256) are both
+   signed.
+
+ * "git rev-list" command learned "--disk-usage" option.
+
+ * "git {diff,log} --{skip,rotate}-to=<path>" allows the user to
+   discard diff output for early paths or move them to the end of the
+   output.
+
+ * "git difftool" learned "--skip-to=<path>" option to restart an
+   interrupted session from an arbitrary path.
+
+ * "git grep" has been tweaked to be limited to the sparse checkout
+   paths.
+
+ * "git rebase --[no-]fork-point" gained a configuration variable
+   rebase.forkPoint so that users do not have to keep specifying a
+   non-default setting.
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * A 3-year old test that was not testing anything useful has been
+   corrected.
+
+ * Retire more names with "sha1" in it.
+
+ * The topological walk codepath is covered by new trace2 stats.
+
+ * Update the Code-of-conduct to version 2.0 from the upstream (we've
+   been using version 1.4).
+
+ * "git mktag" validates its input using its own rules before writing
+   a tag object---it has been updated to share the logic with "git
+   fsck".
+
+ * Two new ways to feed configuration variable-value pairs via
+   environment variables have been introduced, and the way
+   GIT_CONFIG_PARAMETERS encodes variable/value pairs has been tweaked
+   to make it more robust.
+
+ * Tests have been updated so that they do not to get affected by the
+   name of the default branch "git init" creates.
+
+ * "git fetch" learns to treat ref updates atomically in all-or-none
+   fashion, just like "git push" does, with the new "--atomic" option.
+
+ * The peel_ref() API has been replaced with peel_iterated_oid().
+
+ * The .use_shell flag in struct child_process that is passed to
+   run_command() API has been clarified with a bit more documentation.
+
+ * Document, clean-up and optimize the code around the cache-tree
+   extension in the index.
+
+ * The ls-refs protocol operation has been optimized to narrow the
+   sub-hierarchy of refs/ it walks to produce response.
+
+ * When removing many branches and tags, the code used to do so one
+   ref at a time.  There is another API it can use to delete multiple
+   refs, and it makes quite a lot of performance difference when the
+   refs are packed.
+
+ * The "pack-objects" command needs to iterate over all the tags when
+   automatic tag following is enabled, but it actually iterated over
+   all refs and then discarded everything outside "refs/tags/"
+   hierarchy, which was quite wasteful.
+
+ * A perf script was made more portable.
+
+ * Our setting of GitHub CI test jobs were a bit too eager to give up
+   once there is even one failure found.  Tweak the knob to allow
+   other jobs keep running even when we see a failure, so that we can
+   find more failures in a single run.
+
+ * We've carried compatibility codepaths for compilers without
+   variadic macros for quite some time, but the world may be ready for
+   them to be removed.  Force compilation failure on exotic platforms
+   where variadic macros are not available to find out who screams in
+   such a way that we can easily revert if it turns out that the world
+   is not yet ready.
+
+ * Code clean-up to ensure our use of hashtables using object names as
+   keys use the "struct object_id" objects, not the raw hash values.
+
+ * Lose the debugging aid that may have been useful in the past, but
+   no longer is, in the "grep" codepaths.
+
+ * Some pretty-format specifiers do not need the data in commit object
+   (e.g. "%H"), but we were over-eager to load and parse it, which has
+   been made even lazier.
+
+ * Get rid of "GETTEXT_POISON" support altogether, which may or may
+   not be controversial.
+
+ * Introduce an on-disk file to record revindex for packdata, which
+   traditionally was always created on the fly and only in-core.
+
+ * The commit-graph learned to use corrected commit dates instead of
+   the generation number to help topological revision traversal.
+
+ * Piecemeal of rewrite of "git bisect" in C continues.
+
+ * When a pager spawned by us exited, the trace log did not record its
+   exit status correctly, which has been corrected.
+
+ * Removal of GIT_TEST_GETTEXT_POISON continues.
+
+ * The code to implement "git merge-base --independent" was poorly
+   done and was kept from the very beginning of the feature.
+
+ * Preliminary changes to fsmonitor integration.
+
+ * Performance improvements for rename detection.
+
+ * The common code to deal with "chunked file format" that is shared
+   by the multi-pack-index and commit-graph files have been factored
+   out, to help codepaths for both filetypes to become more robust.
+
+ * The approach to "fsck" the incoming objects in "index-pack" is
+   attractive for performance reasons (we have them already in core,
+   inflated and ready to be inspected), but fundamentally cannot be
+   applied fully when we receive more than one pack stream, as a tree
+   object in one pack may refer to a blob object in another pack as
+   ".gitmodules", when we want to inspect blobs that are used as
+   ".gitmodules" file, for example.  Teach "index-pack" to emit
+   objects that must be inspected later and check them in the calling
+   "fetch-pack" process.
+
+ * The logic to handle "trailer" related placeholders in the
+   "--format=" mechanisms in the "log" family and "for-each-ref"
+   family is getting unified.
+
+ * Raise the buffer size used when writing the index file out from
+   (obviously too small) 8kB to (clearly sufficiently large) 128kB.
+
+ * It is reported that open() on some platforms (e.g. macOS Big Sur)
+   can return EINTR even though our timers are set up with SA_RESTART.
+   A workaround has been implemented and enabled for macOS to rerun
+   open() transparently from the caller when this happens.
+
+
+Fixes since v2.30
+-----------------
+
+ * Diagnose command line error of "git rebase" early.
+
+ * Clean up option descriptions in "git cmd --help".
+
+ * "git stash" did not work well in a sparsely checked out working
+   tree.
+
+ * Some tests expect that "ls -l" output has either '-' or 'x' for
+   group executable bit, but setgid bit can be inherited from parent
+   directory and make these fields 'S' or 's' instead, causing test
+   failures.
+
+ * "git for-each-repo --config=<var> <cmd>" should not run <cmd> for
+   any repository when the configuration variable <var> is not defined
+   even once.
+
+ * Fix 2.29 regression where "git mergetool --tool-help" fails to list
+   all the available tools.
+
+ * Fix for procedure to building CI test environment for mac.
+
+ * The implementation of "git branch --sort" wrt the detached HEAD
+   display has always been hacky, which has been cleaned up.
+
+ * Newline characters in the host and path part of git:// URL are
+   now forbidden.
+
+ * "git diff" showed a submodule working tree with untracked cruft as
+   "Submodule commit <objectname>-dirty", but a natural expectation is
+   that the "-dirty" indicator would align with "git describe --dirty",
+   which does not consider having untracked files in the working tree
+   as source of dirtiness.  The inconsistency has been fixed.
+
+ * When more than one commit with the same patch ID appears on one
+   side, "git log --cherry-pick A...B" did not exclude them all when a
+   commit with the same patch ID appears on the other side.  Now it
+   does.
+
+ * Documentation for "git fsck" lost stale bits that has become
+   incorrect.
+
+ * Doc fix for packfile URI feature.
+
+ * When "git rebase -i" processes "fixup" insn, there is no reason to
+   clean up the commit log message, but we did the usual stripspace
+   processing.  This has been corrected.
+   (merge f7d42ceec5 js/rebase-i-commit-cleanup-fix later to maint).
+
+ * Fix in passing custom args from "git clone" to "upload-pack" on the
+   other side.
+   (merge ad6b5fefbd jv/upload-pack-filter-spec-quotefix later to maint).
+
+ * The command line completion (in contrib/) completed "git branch -d"
+   with branch names, but "git branch -D" offered tagnames in addition,
+   which has been corrected.  "git branch -M" had the same problem.
+   (merge 27dc071b9a jk/complete-branch-force-delete later to maint).
+
+ * When commands are started from a subdirectory, they may have to
+   compare the path to the subdirectory (called prefix and found out
+   from $(pwd)) with the tracked paths.  On macOS, $(pwd) and
+   readdir() yield decomposed path, while the tracked paths are
+   usually normalized to the precomposed form, causing mismatch.  This
+   has been fixed by taking the same approach used to normalize the
+   command line arguments.
+   (merge 5c327502db tb/precompose-prefix-too later to maint).
+
+ * Even though invocations of "die()" were logged to the trace2
+   system, "BUG()"s were not, which has been corrected.
+   (merge 0a9dde4a04 jt/trace2-BUG later to maint).
+
+ * "git grep --untracked" is meant to be "let's ALSO find in these
+   files on the filesystem" when looking for matches in the working
+   tree files, and does not make any sense if the primary search is
+   done against the index, or the tree objects.  The "--cached" and
+   "--untracked" options have been marked as mutually incompatible.
+   (merge 0c5d83b248 mt/grep-cached-untracked later to maint).
+
+ * Fix "git fsck --name-objects" which apparently has not been used by
+   anybody who is motivated enough to report breakage.
+   (merge e89f89361c js/fsck-name-objects-fix later to maint).
+
+ * Avoid individual tests in t5411 from getting affected by each other
+   by forcing them to use separate output files during the test.
+   (merge 822ee894f6 jx/t5411-unique-filenames later to maint).
+
+ * Test to make sure "git rev-parse one-thing one-thing" gives
+   the same thing twice (when one-thing is --since=X).
+   (merge a5cdca4520 ew/rev-parse-since-test later to maint).
+
+ * When certain features (e.g. grafts) used in the repository are
+   incompatible with the use of the commit-graph, we used to silently
+   turned commit-graph off; we now tell the user what we are doing.
+   (merge c85eec7fc3 js/commit-graph-warning later to maint).
+
+ * Objects that lost references can be pruned away, even when they
+   have notes attached to it (and these notes will become dangling,
+   which in turn can be pruned with "git notes prune").  This has been
+   clarified in the documentation.
+   (merge fa9ab027ba mz/doc-notes-are-not-anchors later to maint).
+
+ * The error codepath around the "--temp/--prefix" feature of "git
+   checkout-index" has been improved.
+   (merge 3f7ba60350 mt/checkout-index-corner-cases later to maint).
+
+ * The "git maintenance register" command had trouble registering bare
+   repositories, which had been corrected.
+
+ * A handful of multi-word configuration variable names in
+   documentation that are spelled in all lowercase have been corrected
+   to use the more canonical camelCase.
+   (merge 7dd0eaa39c dl/doc-config-camelcase later to maint).
+
+ * "git push $there --delete ''" should have been diagnosed as an
+   error, but instead turned into a matching push, which has been
+   corrected.
+   (merge 20e416409f jc/push-delete-nothing later to maint).
+
+ * Test script modernization.
+   (merge 488acf15df sv/t7001-modernize later to maint).
+
+ * An under-allocation for the untracked cache data has been corrected.
+   (merge 6347d649bc jh/untracked-cache-fix later to maint).
+
+ * Other code cleanup, docfix, build fix, etc.
+   (merge e3f5da7e60 sg/t7800-difftool-robustify later to maint).
+   (merge 9d336655ba js/doc-proto-v2-response-end later to maint).
+   (merge 1b5b8cf072 jc/maint-column-doc-typofix later to maint).
+   (merge 3a837b58e3 cw/pack-config-doc later to maint).
+   (merge 01168a9d89 ug/doc-commit-approxidate later to maint).
+   (merge b865734760 js/params-vs-args later to maint).
diff --git a/Documentation/RelNotes/2.31.1.txt b/Documentation/RelNotes/2.31.1.txt
new file mode 100644
index 0000000..f9b06b8
--- /dev/null
+++ b/Documentation/RelNotes/2.31.1.txt
@@ -0,0 +1,27 @@
+Git 2.31.1 Release Notes
+========================
+
+Fixes since v2.31
+-----------------
+
+ * The fsmonitor interface read from its input without making sure
+   there is something to read from.  This bug is new in 2.31
+   timeframe.
+
+ * The data structure used by fsmonitor interface was not properly
+   duplicated during an in-core merge, leading to use-after-free etc.
+
+ * "git bisect" reimplemented more in C during 2.30 timeframe did not
+   take an annotated tag as a good/bad endpoint well.  This regression
+   has been corrected.
+
+ * Fix macros that can silently inject unintended null-statements.
+
+ * CALLOC_ARRAY() macro replaces many uses of xcalloc().
+
+ * Update insn in Makefile comments to run fuzz-all target.
+
+ * Fix a corner case bug in "git mv" on case insensitive systems,
+   which was introduced in 2.29 timeframe.
+
+Also contains various documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.31.2.txt b/Documentation/RelNotes/2.31.2.txt
new file mode 100644
index 0000000..aa13a5b
--- /dev/null
+++ b/Documentation/RelNotes/2.31.2.txt
@@ -0,0 +1,6 @@
+Git v2.31.2 Release Notes
+=========================
+
+This release merges up the fixes that appear in v2.30.3 to address
+the security issue CVE-2022-24765; see the release notes for that
+version for details.
diff --git a/Documentation/RelNotes/2.31.3.txt b/Documentation/RelNotes/2.31.3.txt
new file mode 100644
index 0000000..ca143ab
--- /dev/null
+++ b/Documentation/RelNotes/2.31.3.txt
@@ -0,0 +1,4 @@
+Git Documentation/RelNotes/2.31.3.txt Release Notes
+=========================
+
+This release merges up the fixes that appear in v2.31.3.
diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt
index dc3bceb..117f4cf 100644
--- a/Documentation/blame-options.txt
+++ b/Documentation/blame-options.txt
@@ -1,6 +1,6 @@
 -b::
 	Show blank SHA-1 for boundary commits.  This can also
-	be controlled via the `blame.blankboundary` config option.
+	be controlled via the `blame.blankBoundary` config option.
 
 --root::
 	Do not treat root commits as boundaries.  This can also be
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 34e6d47..a1efd74 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -46,7 +46,7 @@
 newline and the null byte. Doublequote `"` and backslash can be included
 by escaping them as `\"` and `\\`, respectively. Backslashes preceding
 other characters are dropped when reading; for example, `\t` is read as
-`t` and `\0` is read as `0` Section headers cannot span multiple lines.
+`t` and `\0` is read as `0`. Section headers cannot span multiple lines.
 Variables may belong directly to a section or to a given subsection. You
 can have `[section]` if you have `[section "subsection"]`, but you don't
 need to.
@@ -398,6 +398,8 @@
 
 include::config/log.txt[]
 
+include::config/lsrefs.txt[]
+
 include::config/mailinfo.txt[]
 
 include::config/mailmap.txt[]
diff --git a/Documentation/config/core.txt b/Documentation/config/core.txt
index 160aaca..c04f62a 100644
--- a/Documentation/config/core.txt
+++ b/Documentation/config/core.txt
@@ -625,4 +625,6 @@
 	computed based on the approximate number of packed objects
 	in your repository, which hopefully is enough for
 	abbreviated object names to stay unique for some time.
+	If set to "no", no abbreviation is made and the object names
+	are shown in their full length.
 	The minimum length is 4.
diff --git a/Documentation/config/diff.txt b/Documentation/config/diff.txt
index c3ae136..2d3331f 100644
--- a/Documentation/config/diff.txt
+++ b/Documentation/config/diff.txt
@@ -85,6 +85,8 @@
 	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.
+	By default this is set to untracked so that any untracked
+	submodules are ignored.
 
 diff.mnemonicPrefix::
 	If set, 'git diff' uses a prefix pair that is different from the
diff --git a/Documentation/config/init.txt b/Documentation/config/init.txt
index dc77f8c..79c79d6 100644
--- a/Documentation/config/init.txt
+++ b/Documentation/config/init.txt
@@ -4,4 +4,4 @@
 
 init.defaultBranch::
 	Allows overriding the default branch name e.g. when initializing
-	a new repository or when cloning an empty repository.
+	a new repository.
diff --git a/Documentation/config/lsrefs.txt b/Documentation/config/lsrefs.txt
new file mode 100644
index 0000000..adeda0f
--- /dev/null
+++ b/Documentation/config/lsrefs.txt
@@ -0,0 +1,9 @@
+lsrefs.unborn::
+	May be "advertise" (the default), "allow", or "ignore". If "advertise",
+	the server will respond to the client sending "unborn" (as described in
+	protocol-v2.txt) and will advertise support for this feature during the
+	protocol v2 capability advertisement. "allow" is the same as
+	"advertise" except that the server will not advertise support for this
+	feature; this is useful for load-balanced servers that cannot be
+	updated atomically (for example), since the administrator could
+	configure "allow", then after a delay, configure "advertise".
diff --git a/Documentation/config/maintenance.txt b/Documentation/config/maintenance.txt
index a5ead09..18f0562 100644
--- a/Documentation/config/maintenance.txt
+++ b/Documentation/config/maintenance.txt
@@ -15,8 +15,9 @@
 * `none`: This default setting implies no task are run at any schedule.
 * `incremental`: This setting optimizes for performing small maintenance
   activities that do not delete any data. This does not schedule the `gc`
-  task, but runs the `prefetch` and `commit-graph` tasks hourly and the
-  `loose-objects` and `incremental-repack` tasks daily.
+  task, but runs the `prefetch` and `commit-graph` tasks hourly, the
+  `loose-objects` and `incremental-repack` tasks daily, and the `pack-refs`
+  task weekly.
 
 maintenance.<task>.enabled::
 	This boolean config option controls whether the maintenance task
diff --git a/Documentation/config/mergetool.txt b/Documentation/config/mergetool.txt
index 16a2744..cafbbef 100644
--- a/Documentation/config/mergetool.txt
+++ b/Documentation/config/mergetool.txt
@@ -13,6 +13,11 @@
 	merged; 'MERGED' contains the name of the file to which the merge
 	tool should write the results of a successful merge.
 
+mergetool.<tool>.hideResolved::
+	Allows the user to override the global `mergetool.hideResolved` value
+	for a specific tool. See `mergetool.hideResolved` for the full
+	description.
+
 mergetool.<tool>.trustExitCode::
 	For a custom merge command, specify whether the exit code of
 	the merge command can be used to determine whether the merge was
@@ -40,6 +45,16 @@
 	value of `false` avoids using `--auto-merge` altogether, and is the
 	default value.
 
+mergetool.hideResolved::
+	During a merge Git will automatically resolve as many conflicts as
+	possible and write the 'MERGED' file containing conflict markers around
+	any conflicts that it cannot resolve; 'LOCAL' and 'REMOTE' normally
+	represent the versions of the file from before Git's conflict
+	resolution. This flag causes 'LOCAL' and 'REMOTE' to be overwriten so
+	that only the unresolved conflicts are presented to the merge tool. Can
+	be configured per-tool via the `mergetool.<tool>.hideResolved`
+	configuration variable. Defaults to `false`.
+
 mergetool.keepBackup::
 	After performing a merge, the original file with conflict markers
 	can be saved as a file with a `.orig` extension.  If this variable
diff --git a/Documentation/config/pack.txt b/Documentation/config/pack.txt
index 837f1b1..3da4ea9 100644
--- a/Documentation/config/pack.txt
+++ b/Documentation/config/pack.txt
@@ -133,3 +133,10 @@
 	between an older, bitmapped pack and objects that have been
 	pushed since the last gc). The downside is that it consumes 4
 	bytes per object of disk space. Defaults to true.
+
+pack.writeReverseIndex::
+	When true, git will write a corresponding .rev file (see:
+	link:../technical/pack-format.html[Documentation/technical/pack-format.txt])
+	for each new packfile that it writes in all places except for
+	linkgit:git-fast-import[1] and in the bulk checkin mechanism.
+	Defaults to false.
diff --git a/Documentation/config/rebase.txt b/Documentation/config/rebase.txt
index 7f7a07d..214f31b 100644
--- a/Documentation/config/rebase.txt
+++ b/Documentation/config/rebase.txt
@@ -68,3 +68,6 @@
 	Automatically reschedule `exec` commands that failed. This only makes
 	sense in interactive mode (or when an `--exec` option was provided).
 	This is the same as specifying the `--reschedule-failed-exec` option.
+
+rebase.forkPoint::
+	If set to false set `--no-fork-point` option by default.
diff --git a/Documentation/date-formats.txt b/Documentation/date-formats.txt
index f1097fa..99c455f 100644
--- a/Documentation/date-formats.txt
+++ b/Documentation/date-formats.txt
@@ -1,10 +1,7 @@
 DATE FORMATS
 ------------
 
-The `GIT_AUTHOR_DATE`, `GIT_COMMITTER_DATE` environment variables
-ifdef::git-commit[]
-and the `--date` option
-endif::git-commit[]
+The `GIT_AUTHOR_DATE` and `GIT_COMMITTER_DATE` environment variables
 support the following date formats:
 
 Git internal format::
@@ -26,3 +23,9 @@
 +
 NOTE: In addition, the date part is accepted in the following formats:
 `YYYY.MM.DD`, `MM/DD/YYYY` and `DD.MM.YYYY`.
+
+ifdef::git-commit[]
+In addition to recognizing all date formats above, the `--date` option
+will also try to make sense of other, more human-centric date formats,
+such as relative dates like "yesterday" or "last Friday at noon".
+endif::git-commit[]
diff --git a/Documentation/diff-generate-patch.txt b/Documentation/diff-generate-patch.txt
index b10ff4c..2db8eac 100644
--- a/Documentation/diff-generate-patch.txt
+++ b/Documentation/diff-generate-patch.txt
@@ -81,9 +81,9 @@
 Any diff-generating command can take the `-c` or `--cc` option to
 produce a 'combined diff' when showing a merge. This is the default
 format when showing merges with linkgit:git-diff[1] or
-linkgit:git-show[1]. Note also that you can give the `-m` option to any
-of these commands to force generation of diffs with individual parents
-of a merge.
+linkgit:git-show[1]. Note also that you can give suitable
+`--diff-merges` option to any of these commands to force generation of
+diffs in specific format.
 
 A "combined diff" format looks like this:
 
diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt
index 746b144..aa2b5c1 100644
--- a/Documentation/diff-options.txt
+++ b/Documentation/diff-options.txt
@@ -33,6 +33,57 @@
 	show the patch by default, or to cancel the effect of `--patch`.
 endif::git-format-patch[]
 
+ifdef::git-log[]
+--diff-merges=(off|none|first-parent|1|separate|m|combined|c|dense-combined|cc)::
+--no-diff-merges::
+	Specify diff format to be used for merge commits. Default is
+	{diff-merges-default} unless `--first-parent` is in use, in which case
+	`first-parent` is the default.
++
+--diff-merges=(off|none):::
+--no-diff-merges:::
+	Disable output of diffs for merge commits. Useful to override
+	implied value.
++
+--diff-merges=first-parent:::
+--diff-merges=1:::
+	This option makes merge commits show the full diff with
+	respect to the first parent only.
++
+--diff-merges=separate:::
+--diff-merges=m:::
+-m:::
+	This makes merge commits show the full diff with respect to
+	each of the parents. Separate log entry and diff is generated
+	for each parent. `-m` doesn't produce any output without `-p`.
++
+--diff-merges=combined:::
+--diff-merges=c:::
+-c:::
+	With this option, diff output for a merge commit 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. Furthermore, it lists
+	only files which were modified from all parents. `-c` implies
+	`-p`.
++
+--diff-merges=dense-combined:::
+--diff-merges=cc:::
+--cc:::
+	With this option the output produced by
+	`--diff-merges=combined` is further compressed by omitting
+	uninteresting hunks whose contents in the parents have only
+	two variants and the merge result picks one of them without
+	modification.  `--cc` implies `-p`.
+
+--combined-all-paths::
+	This flag causes combined diffs (used for merge commits) to
+	list the name of the file from all parents.  It thus only has
+	effect when `--diff-merges=[dense-]combined` is in use, and
+	is likely only useful if filename changes are detected (i.e.
+	when either rename or copy detection have been requested).
+endif::git-log[]
+
 -U<n>::
 --unified=<n>::
 	Generate diffs with <n> lines of context instead of
@@ -649,6 +700,14 @@
 components matches the pattern.  For example, the pattern "`foo*bar`"
 matches "`fooasdfbar`" and "`foo/bar/baz/asdf`" but not "`foobarx`".
 
+--skip-to=<file>::
+--rotate-to=<file>::
+	Discard the files before the named <file> from the output
+	(i.e. 'skip to'), or move them to the end of the output
+	(i.e. 'rotate to').  These were invented primarily for use
+	of the `git difftool` command, and may not be very useful
+	otherwise.
+
 ifndef::git-format-patch[]
 -R::
 	Swap two inputs; that is, show differences from index or
diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
index 2bf77b4..07783de 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.txt
@@ -7,6 +7,10 @@
 	existing contents of `.git/FETCH_HEAD`.  Without this
 	option old data in `.git/FETCH_HEAD` will be overwritten.
 
+--atomic::
+	Use an atomic transaction to update local refs. Either all refs are
+	updated, or on error, no refs are updated.
+
 --depth=<depth>::
 	Limit fetching to the specified number of commits from the tip of
 	each remote branch history. If fetching to a 'shallow' repository
diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt
index 06bc063..decd8ae 100644
--- a/Documentation/git-am.txt
+++ b/Documentation/git-am.txt
@@ -79,7 +79,7 @@
 	Pass `-u` flag to 'git mailinfo' (see linkgit:git-mailinfo[1]).
 	The proposed commit log message taken from the e-mail
 	is re-coded into UTF-8 encoding (configuration variable
-	`i18n.commitencoding` can be used to specify project's
+	`i18n.commitEncoding` can be used to specify project's
 	preferred encoding if it is not UTF-8).
 +
 This was optional in prior versions of git, but now it is the
diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt
index 34b496d..3bf5d5d 100644
--- a/Documentation/git-blame.txt
+++ b/Documentation/git-blame.txt
@@ -226,7 +226,7 @@
 MAPPING AUTHORS
 ---------------
 
-include::mailmap.txt[]
+See linkgit:gitmailmap[5].
 
 
 SEE ALSO
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt
index adaa178..94dc9a5 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.txt
@@ -78,8 +78,8 @@
 to happen.
 
 The `-c` and `-C` options have the exact same semantics as `-m` and
-`-M`, except instead of the branch being renamed it along with its
-config and reflog will be copied to a new name.
+`-M`, except instead of the branch being renamed, it will be copied to a
+new name, along with its config and reflog.
 
 With a `-d` or `-D` option, `<branchname>` will be deleted.  You may
 specify more than one branch for deletion.  If the branch currently
@@ -153,7 +153,7 @@
 --column[=<options>]::
 --no-column::
 	Display branch listing in columns. See configuration variable
-	column.branch for option syntax.`--column` and `--no-column`
+	`column.branch` for option syntax. `--column` and `--no-column`
 	without options are equivalent to 'always' and 'never' respectively.
 +
 This option is only applicable in non-verbose mode.
diff --git a/Documentation/git-check-mailmap.txt b/Documentation/git-check-mailmap.txt
index aa2055d..02f4418 100644
--- a/Documentation/git-check-mailmap.txt
+++ b/Documentation/git-check-mailmap.txt
@@ -36,10 +36,17 @@
 printed; otherwise only ``$$<user@host>$$'' is printed.
 
 
+CONFIGURATION
+-------------
+
+See `mailmap.file` and `mailmap.blob` in linkgit:git-config[1] for how
+to specify a custom `.mailmap` target file or object.
+
+
 MAPPING AUTHORS
 ---------------
 
-include::mailmap.txt[]
+See linkgit:gitmailmap[5].
 
 
 GIT
diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
index 0e9351d..4b4cc5c 100644
--- a/Documentation/git-config.txt
+++ b/Documentation/git-config.txt
@@ -346,6 +346,22 @@
 
 See also <<FILES>>.
 
+GIT_CONFIG_COUNT::
+GIT_CONFIG_KEY_<n>::
+GIT_CONFIG_VALUE_<n>::
+	If GIT_CONFIG_COUNT is set to a positive number, all environment pairs
+	GIT_CONFIG_KEY_<n> and GIT_CONFIG_VALUE_<n> up to that number will be
+	added to the process's runtime configuration. The config pairs are
+	zero-indexed. Any missing key or value is treated as an error. An empty
+	GIT_CONFIG_COUNT is treated the same as GIT_CONFIG_COUNT=0, namely no
+	pairs are processed. These environment variables will override values
+	in configuration files, but will be overridden by any explicit options
+	passed via `git -c`.
++
+This is useful for cases where you want to spawn multiple git commands
+with a common configuration but cannot depend on a configuration file,
+for example when writing scripts.
+
 
 [[EXAMPLES]]
 EXAMPLES
diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt
index 484c485..143b0c4 100644
--- a/Documentation/git-difftool.txt
+++ b/Documentation/git-difftool.txt
@@ -34,6 +34,14 @@
 	This is the default behaviour; the option is provided to
 	override any configuration settings.
 
+--rotate-to=<file>::
+	Start showing the diff for the given path,
+	the paths before it will move to end and output.
+
+--skip-to=<file>::
+	Start showing the diff for the given path, skipping all
+	the paths before it.
+
 -t <tool>::
 --tool=<tool>::
 	Use the diff tool specified by <tool>.  Valid values include
diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
index 2962f85..2ae2478 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -260,11 +260,9 @@
 	The first `N` lines of the message.
 
 Additionally, the trailers as interpreted by linkgit:git-interpret-trailers[1]
-are obtained as `trailers` (or by using the historical alias
-`contents:trailers`).  Non-trailer lines from the trailer block can be omitted
-with `trailers:only`. Whitespace-continuations can be removed from trailers so
-that each trailer appears on a line by itself with its full content with
-`trailers:unfold`. Both can be used together as `trailers:unfold,only`.
+are obtained as `trailers[:options]` (or by using the historical alias
+`contents:trailers[:options]`). For valid [:option] values see `trailers`
+section of linkgit:git-log[1].
 
 For sorting purposes, fields with numeric values sort in numeric order
 (`objectsize`, `authordate`, `committerdate`, `creatordate`, `taggerdate`).
diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt
index 0c114ad..853967d 100644
--- a/Documentation/git-gc.txt
+++ b/Documentation/git-gc.txt
@@ -117,12 +117,14 @@
 'git gc' tries very hard not to delete objects that are referenced
 anywhere in your repository. In particular, it will keep not only
 objects referenced by your current set of branches and tags, but also
-objects referenced by the index, remote-tracking branches, notes saved
-by 'git notes' under refs/notes/, reflogs (which may reference commits
-in branches that were later amended or rewound), and anything else in
-the refs/* namespace.  If you are expecting some objects to be deleted
-and they aren't, check all of those locations and decide whether it
-makes sense in your case to remove those references.
+objects referenced by the index, remote-tracking branches, reflogs
+(which may reference commits in branches that were later amended or
+rewound), and anything else in the refs/* namespace. Note that a note
+(of the kind created by 'git notes') attached to an object does not
+contribute in keeping the object alive. If you are expecting some
+objects to be deleted and they aren't, check all of those locations
+and decide whether it makes sense in your case to remove those
+references.
 
 On the other hand, when 'git gc' runs concurrently with another process,
 there is a risk of it deleting an object that the other process is using
diff --git a/Documentation/git-http-fetch.txt b/Documentation/git-http-fetch.txt
index 4deb489..9fa17b6 100644
--- a/Documentation/git-http-fetch.txt
+++ b/Documentation/git-http-fetch.txt
@@ -41,11 +41,17 @@
 		<commit-id>['\t'<filename-as-in--w>]
 
 --packfile=<hash>::
-	Instead of a commit id on the command line (which is not expected in
+	For internal use only. Instead of a commit id on the command
+	line (which is not expected in
 	this case), 'git http-fetch' fetches the packfile directly at the given
 	URL and uses index-pack to generate corresponding .idx and .keep files.
 	The hash is used to determine the name of the temporary file and is
-	arbitrary. The output of index-pack is printed to stdout.
+	arbitrary. The output of index-pack is printed to stdout. Requires
+	--index-pack-args.
+
+--index-pack-args=<args>::
+	For internal use only. The command to run on the contents of the
+	downloaded pack. Arguments are URL-encoded separated by spaces.
 
 --recover::
 	Verify that everything reachable from target is fetched.  Used after
diff --git a/Documentation/git-index-pack.txt b/Documentation/git-index-pack.txt
index af0c262..7fa74b9 100644
--- a/Documentation/git-index-pack.txt
+++ b/Documentation/git-index-pack.txt
@@ -9,17 +9,18 @@
 SYNOPSIS
 --------
 [verse]
-'git index-pack' [-v] [-o <index-file>] <pack-file>
+'git index-pack' [-v] [-o <index-file>] [--[no-]rev-index] <pack-file>
 'git index-pack' --stdin [--fix-thin] [--keep] [-v] [-o <index-file>]
-                 [<pack-file>]
+		  [--[no-]rev-index] [<pack-file>]
 
 
 DESCRIPTION
 -----------
 Reads a packed archive (.pack) from the specified file, and
-builds a pack index file (.idx) for it.  The packed archive
-together with the pack index can then be placed in the
-objects/pack/ directory of a Git repository.
+builds a pack index file (.idx) for it. Optionally writes a
+reverse-index (.rev) for the specified pack. The packed
+archive together with the pack index can then be placed in
+the objects/pack/ directory of a Git repository.
 
 
 OPTIONS
@@ -35,6 +36,13 @@
 	fails if the name of packed archive does not end
 	with .pack).
 
+--[no-]rev-index::
+	When this flag is provided, generate a reverse index
+	(a `.rev` file) corresponding to the given pack. If
+	`--verify` is given, ensure that the existing
+	reverse index is correct. Takes precedence over
+	`pack.writeReverseIndex`.
+
 --stdin::
 	When this flag is provided, the pack is read from stdin
 	instead and a copy is then written to <pack-file>. If
@@ -78,7 +86,12 @@
 	Die if the pack contains broken links. For internal use only.
 
 --fsck-objects::
-	Die if the pack contains broken objects. For internal use only.
+	For internal use only.
++
+Die if the pack contains broken objects. If the pack contains a tree
+pointing to a .gitmodules blob that does not exist, prints the hash of
+that blob (for the caller to check) after the hash that goes into the
+name of the pack/idx file (see "Notes").
 
 --threads=<n>::
 	Specifies the number of threads to spawn when resolving
diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt
index dd189a3..1bbf865 100644
--- a/Documentation/git-log.txt
+++ b/Documentation/git-log.txt
@@ -107,47 +107,15 @@
 By default, `git log` does not generate any diff output. The options
 below can be used to show the changes made by each commit.
 
-Note that unless one of `-c`, `--cc`, or `-m` is given, merge commits
-will never show a diff, even if a diff format like `--patch` is
-selected, nor will they match search options like `-S`. The exception is
-when `--first-parent` is in use, in which merges are treated like normal
-single-parent commits (this can be overridden by providing a
-combined-diff option or with `--no-diff-merges`).
-
--c::
-	With this option, diff output for a merge commit
-	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. Furthermore, it lists only files
-	which were modified from all parents.
-
---cc::
-	This flag implies the `-c` option and further compresses the
-	patch output by omitting uninteresting hunks whose contents in
-	the parents have only two variants and the merge result picks
-	one of them without modification.
-
---combined-all-paths::
-	This flag causes combined diffs (used for merge commits) to
-	list the name of the file from all parents.  It thus only has
-	effect when -c or --cc are specified, and is likely only
-	useful if filename changes are detected (i.e. when either
-	rename or copy detection have been requested).
-
--m::
-	This flag makes the merge commits show the full diff like
-	regular commits; for each merge parent, a separate log entry
-	and diff is generated. An exception is that only diff against
-	the first parent is shown when `--first-parent` option is given;
-	in that case, the output represents the changes the merge
-	brought _into_ the then-current branch.
-
---diff-merges=off::
---no-diff-merges::
-	Disable output of diffs for merge commits (default). Useful to
-	override `-m`, `-c`, or `--cc`.
+Note that unless one of `--diff-merges` variants (including short
+`-m`, `-c`, and `--cc` options) is explicitly given, merge commits
+will not show a diff, even if a diff format like `--patch` is
+selected, nor will they match search options like `-S`. The exception
+is when `--first-parent` is in use, in which case `first-parent` is
+the default format.
 
 :git-log: 1
+:diff-merges-default: `off`
 include::diff-options.txt[]
 
 include::diff-generate-patch.txt[]
diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt
index 0a3b526..6d11ab5 100644
--- a/Documentation/git-ls-files.txt
+++ b/Documentation/git-ls-files.txt
@@ -13,6 +13,7 @@
 		(--[cached|deleted|others|ignored|stage|unmerged|killed|modified])*
 		(-[c|d|o|i|s|u|k|m])*
 		[--eol]
+		[--deduplicate]
 		[-x <pattern>|--exclude=<pattern>]
 		[-X <file>|--exclude-from=<file>]
 		[--exclude-per-directory=<file>]
@@ -80,6 +81,13 @@
 	\0 line termination on output and do not quote filenames.
 	See OUTPUT below for more information.
 
+--deduplicate::
+	When only filenames are shown, suppress duplicates that may
+	come from having multiple stages during a merge, or giving
+	`--deleted` and `--modified` option at the same time.
+	When any of the `-t`, `--unmerged`, or `--stage` option is
+	in use, this option has no effect.
+
 -x <pattern>::
 --exclude=<pattern>::
 	Skip untracked files matching pattern.
diff --git a/Documentation/git-mailinfo.txt b/Documentation/git-mailinfo.txt
index 7a6aed0..d343f04 100644
--- a/Documentation/git-mailinfo.txt
+++ b/Documentation/git-mailinfo.txt
@@ -53,7 +53,7 @@
 	The commit log message, author name and author email are
 	taken from the e-mail, and after minimally decoding MIME
 	transfer encoding, re-coded in the charset specified by
-	i18n.commitencoding (defaulting to UTF-8) by transliterating
+	`i18n.commitEncoding` (defaulting to UTF-8) by transliterating
 	them.  This used to be optional but now it is the default.
 +
 Note that the patch is always used as-is without charset
@@ -61,7 +61,7 @@
 
 --encoding=<encoding>::
 	Similar to -u.  But when re-coding, the charset specified here is
-	used instead of the one specified by i18n.commitencoding or UTF-8.
+	used instead of the one specified by `i18n.commitEncoding` or UTF-8.
 
 -n::
 	Disable all charset re-coding of the metadata.
diff --git a/Documentation/git-maintenance.txt b/Documentation/git-maintenance.txt
index 6fe1e5e..80ddd33 100644
--- a/Documentation/git-maintenance.txt
+++ b/Documentation/git-maintenance.txt
@@ -145,6 +145,12 @@
 	which is a special case that attempts to repack all pack-files
 	into a single pack-file.
 
+pack-refs::
+	The `pack-refs` task collects the loose reference files and
+	collects them into a single file. This speeds up operations that
+	need to iterate across many references. See linkgit:git-pack-refs[1]
+	for more information.
+
 OPTIONS
 -------
 --auto::
@@ -218,6 +224,122 @@
 but does not take the lock in the same way as `git maintenance run`. If
 possible, use `git maintenance run --task=gc` instead of `git gc`.
 
+The following sections describe the mechanisms put in place to run
+background maintenance by `git maintenance start` and how to customize
+them.
+
+BACKGROUND MAINTENANCE ON POSIX SYSTEMS
+---------------------------------------
+
+The standard mechanism for scheduling background tasks on POSIX systems
+is cron(8). This tool executes commands based on a given schedule. The
+current list of user-scheduled tasks can be found by running `crontab -l`.
+The schedule written by `git maintenance start` is similar to this:
+
+-----------------------------------------------------------------------
+# BEGIN GIT MAINTENANCE SCHEDULE
+# The following schedule was created by Git
+# Any edits made in this region might be
+# replaced in the future by a Git command.
+
+0 1-23 * * * "/<path>/git" --exec-path="/<path>" for-each-repo --config=maintenance.repo maintenance run --schedule=hourly
+0 0 * * 1-6 "/<path>/git" --exec-path="/<path>" for-each-repo --config=maintenance.repo maintenance run --schedule=daily
+0 0 * * 0 "/<path>/git" --exec-path="/<path>" for-each-repo --config=maintenance.repo maintenance run --schedule=weekly
+
+# END GIT MAINTENANCE SCHEDULE
+-----------------------------------------------------------------------
+
+The comments are used as a region to mark the schedule as written by Git.
+Any modifications within this region will be completely deleted by
+`git maintenance stop` or overwritten by `git maintenance start`.
+
+The `crontab` entry specifies the full path of the `git` executable to
+ensure that the executed `git` command is the same one with which
+`git maintenance start` was issued independent of `PATH`. If the same user
+runs `git maintenance start` with multiple Git executables, then only the
+latest executable is used.
+
+These commands use `git for-each-repo --config=maintenance.repo` to run
+`git maintenance run --schedule=<frequency>` on each repository listed in
+the multi-valued `maintenance.repo` config option. These are typically
+loaded from the user-specific global config. The `git maintenance` process
+then determines which maintenance tasks are configured to run on each
+repository with each `<frequency>` using the `maintenance.<task>.schedule`
+config options. These values are loaded from the global or repository
+config values.
+
+If the config values are insufficient to achieve your desired background
+maintenance schedule, then you can create your own schedule. If you run
+`crontab -e`, then an editor will load with your user-specific `cron`
+schedule. In that editor, you can add your own schedule lines. You could
+start by adapting the default schedule listed earlier, or you could read
+the crontab(5) documentation for advanced scheduling techniques. Please
+do use the full path and `--exec-path` techniques from the default
+schedule to ensure you are executing the correct binaries in your
+schedule.
+
+
+BACKGROUND MAINTENANCE ON MACOS SYSTEMS
+---------------------------------------
+
+While macOS technically supports `cron`, using `crontab -e` requires
+elevated privileges and the executed process does not have a full user
+context. Without a full user context, Git and its credential helpers
+cannot access stored credentials, so some maintenance tasks are not
+functional.
+
+Instead, `git maintenance start` interacts with the `launchctl` tool,
+which is the recommended way to schedule timed jobs in macOS. Scheduling
+maintenance through `git maintenance (start|stop)` requires some
+`launchctl` features available only in macOS 10.11 or later.
+
+Your user-specific scheduled tasks are stored as XML-formatted `.plist`
+files in `~/Library/LaunchAgents/`. You can see the currently-registered
+tasks using the following command:
+
+-----------------------------------------------------------------------
+$ ls ~/Library/LaunchAgents/org.git-scm.git*
+org.git-scm.git.daily.plist
+org.git-scm.git.hourly.plist
+org.git-scm.git.weekly.plist
+-----------------------------------------------------------------------
+
+One task is registered for each `--schedule=<frequency>` option. To
+inspect how the XML format describes each schedule, open one of these
+`.plist` files in an editor and inspect the `<array>` element following
+the `<key>StartCalendarInterval</key>` element.
+
+`git maintenance start` will overwrite these files and register the
+tasks again with `launchctl`, so any customizations should be done by
+creating your own `.plist` files with distinct names. Similarly, the
+`git maintenance stop` command will unregister the tasks with `launchctl`
+and delete the `.plist` files.
+
+To create more advanced customizations to your background tasks, see
+launchctl.plist(5) for more information.
+
+
+BACKGROUND MAINTENANCE ON WINDOWS SYSTEMS
+-----------------------------------------
+
+Windows does not support `cron` and instead has its own system for
+scheduling background tasks. The `git maintenance start` command uses
+the `schtasks` command to submit tasks to this system. You can inspect
+all background tasks using the Task Scheduler application. The tasks
+added by Git have names of the form `Git Maintenance (<frequency>)`.
+The Task Scheduler GUI has ways to inspect these tasks, but you can also
+export the tasks to XML files and view the details there.
+
+Note that since Git is a console application, these background tasks
+create a console window visible to the current user. This can be changed
+manually by selecting the "Run whether user is logged in or not" option
+in Task Scheduler. This change requires a password input, which is why
+`git maintenance start` does not select it by default.
+
+If you want to customize the background tasks, please rename the tasks
+so future calls to `git maintenance (start|stop)` do not overwrite your
+custom tasks.
+
 
 GIT
 ---
diff --git a/Documentation/git-mergetool--lib.txt b/Documentation/git-mergetool--lib.txt
index 4da9d24..3e8f59a 100644
--- a/Documentation/git-mergetool--lib.txt
+++ b/Documentation/git-mergetool--lib.txt
@@ -38,6 +38,10 @@
 get_merge_tool_path::
 	returns the custom path for a merge tool.
 
+initialize_merge_tool::
+	bring merge tool specific functions into scope so they can be used or
+	overridden.
+
 run_merge_tool::
 	launches a merge tool given the tool name and a true/false
 	flag to indicate whether a merge base is present.
diff --git a/Documentation/git-mergetool.txt b/Documentation/git-mergetool.txt
index 6b14702..e587c77 100644
--- a/Documentation/git-mergetool.txt
+++ b/Documentation/git-mergetool.txt
@@ -99,6 +99,10 @@
 	(see linkgit:git-config[1]).  To cancel `diff.orderFile`,
 	use `-O/dev/null`.
 
+CONFIGURATION
+-------------
+include::config/mergetool.txt[]
+
 TEMPORARY FILES
 ---------------
 `git mergetool` creates `*.orig` backup files while resolving merges.
diff --git a/Documentation/git-mktag.txt b/Documentation/git-mktag.txt
index fa6a756..17a2603 100644
--- a/Documentation/git-mktag.txt
+++ b/Documentation/git-mktag.txt
@@ -3,7 +3,7 @@
 
 NAME
 ----
-git-mktag - Creates a tag object
+git-mktag - Creates a tag object with extra validation
 
 
 SYNOPSIS
@@ -11,25 +11,52 @@
 [verse]
 'git mktag'
 
+OPTIONS
+-------
+
+--strict::
+	By default mktag turns on the equivalent of
+	linkgit:git-fsck[1] `--strict` mode. Use `--no-strict` to
+	disable it.
+
 DESCRIPTION
 -----------
-Reads a tag contents on standard input and creates a tag object
-that can also be used to sign other objects.
 
-The output is the new tag's <object> identifier.
+Reads a tag contents on standard input and creates a tag object. The
+output is the new tag's <object> identifier.
+
+This command is mostly equivalent to linkgit:git-hash-object[1]
+invoked with `-t tag -w --stdin`. I.e. both of these will create and
+write a tag found in `my-tag`:
+
+    git mktag <my-tag
+    git hash-object -t tag -w --stdin <my-tag
+
+The difference is that mktag will die before writing the tag if the
+tag doesn't pass a linkgit:git-fsck[1] check.
+
+The "fsck" check done mktag is stricter than what linkgit:git-fsck[1]
+would run by default in that all `fsck.<msg-id>` messages are promoted
+from warnings to errors (so e.g. a missing "tagger" line is an error).
+
+Extra headers in the object are also an error under mktag, but ignored
+by linkgit:git-fsck[1]. This extra check can be turned off by setting
+the appropriate `fsck.<msg-id>` varible:
+
+    git -c fsck.extraHeaderEntry=ignore mktag <my-tag-with-headers
 
 Tag Format
 ----------
 A tag signature file, to be fed to this command's standard input,
 has a very simple fixed format: four lines of
 
-  object <sha1>
+  object <hash>
   type <typename>
   tag <tagname>
   tagger <tagger>
 
 followed by some 'optional' free-form message (some tags created
-by older Git may not have `tagger` line).  The message, when
+by older Git may not have `tagger` line).  The message, when it
 exists, is separated by a blank line from the header.  The
 message part may contain a signature that Git itself doesn't
 care about, but that can be verified with gpg.
diff --git a/Documentation/git-pack-objects.txt b/Documentation/git-pack-objects.txt
index 54d715e..f85cb7e 100644
--- a/Documentation/git-pack-objects.txt
+++ b/Documentation/git-pack-objects.txt
@@ -400,6 +400,17 @@
 one wins" ordering (which allows repo-specific config to take precedence
 over user-wide config, and so forth).
 
+
+CONFIGURATION
+-------------
+
+Various configuration variables affect packing, see
+linkgit:git-config[1] (search for "pack" and "delta").
+
+Notably, delta compression is not used on objects larger than the
+`core.bigFileThreshold` configuration variable and on files with the
+attribute `delta` set to false.
+
 SEE ALSO
 --------
 linkgit:git-rev-list[1]
diff --git a/Documentation/git-range-diff.txt b/Documentation/git-range-diff.txt
index 9701c1e..fe350d7 100644
--- a/Documentation/git-range-diff.txt
+++ b/Documentation/git-range-diff.txt
@@ -10,6 +10,7 @@
 [verse]
 'git range-diff' [--color=[<when>]] [--no-color] [<diff-options>]
 	[--no-dual-color] [--creation-factor=<factor>]
+	[--left-only | --right-only]
 	( <range1> <range2> | <rev1>...<rev2> | <base> <rev1> <rev2> )
 
 DESCRIPTION
@@ -28,6 +29,17 @@
 second commit range, with unmatched commits being inserted just after
 all of their ancestors have been shown.
 
+There are three ways to specify the commit ranges:
+
+- `<range1> <range2>`: Either commit range can be of the form
+  `<base>..<rev>`, `<rev>^!` or `<rev>^-<n>`. See `SPECIFYING RANGES`
+  in linkgit:gitrevisions[7] for more details.
+
+- `<rev1>...<rev2>`. This is equivalent to
+  `<rev2>..<rev1> <rev1>..<rev2>`.
+
+- `<base> <rev1> <rev2>`: This is equivalent to `<base>..<rev1>
+  <base>..<rev2>`.
 
 OPTIONS
 -------
@@ -57,6 +69,14 @@
 	See the ``Algorithm`` section below for an explanation why this is
 	needed.
 
+--left-only::
+	Suppress commits that are missing from the first specified range
+	(or the "left range" when using the `<rev1>...<rev2>` format).
+
+--right-only::
+	Suppress commits that are missing from the second specified range
+	(or the "right range" when using the `<rev1>...<rev2>` format).
+
 --[no-]notes[=<ref>]::
 	This flag is passed to the `git log` program
 	(see linkgit:git-log[1]) that generates the patches.
diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index 92f146d..fbd4b4a 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -165,9 +165,12 @@
 	Pass the `--delta-islands` option to `git-pack-objects`, see
 	linkgit:git-pack-objects[1].
 
-Configuration
+CONFIGURATION
 -------------
 
+Various configuration variables affect packing, see
+linkgit:git-config[1] (search for "pack" and "delta").
+
 By default, the command passes `--delta-base-offset` option to
 'git pack-objects'; this typically results in slightly smaller packs,
 but the generated packs are incompatible with versions of Git older than
@@ -178,6 +181,10 @@
 is unaffected by this option as the conversion is performed on the fly
 as needed in that case.
 
+Delta compression is not used on objects larger than the
+`core.bigFileThreshold` configuration variable and on files with the
+attribute `delta` set to false.
+
 SEE ALSO
 --------
 linkgit:git-pack-objects[1]
diff --git a/Documentation/git-rev-list.txt b/Documentation/git-rev-list.txt
index 5da6623..20bb8e8 100644
--- a/Documentation/git-rev-list.txt
+++ b/Documentation/git-rev-list.txt
@@ -31,6 +31,99 @@
 
 include::pretty-formats.txt[]
 
+EXAMPLES
+--------
+
+* Print the list of commits reachable from the current branch.
++
+----------
+git rev-list HEAD
+----------
+
+* Print the list of commits on this branch, but not present in the
+  upstream branch.
++
+----------
+git rev-list @{upstream}..HEAD
+----------
+
+* Format commits with their author and commit message (see also the
+  porcelain linkgit:git-log[1]).
++
+----------
+git rev-list --format=medium HEAD
+----------
+
+* Format commits along with their diffs (see also the porcelain
+  linkgit:git-log[1], which can do this in a single process).
++
+----------
+git rev-list HEAD |
+git diff-tree --stdin --format=medium -p
+----------
+
+* Print the list of commits on the current branch that touched any
+  file in the `Documentation` directory.
++
+----------
+git rev-list HEAD -- Documentation/
+----------
+
+* Print the list of commits authored by you in the past year, on
+  any branch, tag, or other ref.
++
+----------
+git rev-list --author=you@example.com --since=1.year.ago --all
+----------
+
+* Print the list of objects reachable from the current branch (i.e., all
+  commits and the blobs and trees they contain).
++
+----------
+git rev-list --objects HEAD
+----------
+
+* Compare the disk size of all reachable objects, versus those
+  reachable from reflogs, versus the total packed size. This can tell
+  you whether running `git repack -ad` might reduce the repository size
+  (by dropping unreachable objects), and whether expiring reflogs might
+  help.
++
+----------
+# reachable objects
+git rev-list --disk-usage --objects --all
+# plus reflogs
+git rev-list --disk-usage --objects --all --reflog
+# total disk size used
+du -c .git/objects/pack/*.pack .git/objects/??/*
+# alternative to du: add up "size" and "size-pack" fields
+git count-objects -v
+----------
+
+* Report the disk size of each branch, not including objects used by the
+  current branch. This can find outliers that are contributing to a
+  bloated repository size (e.g., because somebody accidentally committed
+  large build artifacts).
++
+----------
+git for-each-ref --format='%(refname)' |
+while read branch
+do
+	size=$(git rev-list --disk-usage --objects HEAD..$branch)
+	echo "$size $branch"
+done |
+sort -n
+----------
+
+* Compare the on-disk size of branches in one group of refs, excluding
+  another. If you co-mingle objects from multiple remotes in a single
+  repository, this can show which remotes are contributing to the
+  repository size (taking the size of `origin` as a baseline).
++
+----------
+git rev-list --disk-usage --objects --remotes=$suspect --not --remotes=origin
+----------
+
 GIT
 ---
 Part of the linkgit:git[1] suite
diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index 5013daa..6b8ca08 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -212,6 +212,18 @@
 	Only the names of the variables are listed, not their value,
 	even if they are set.
 
+--path-format=(absolute|relative)::
+	Controls the behavior of certain other options. If specified as absolute, the
+	paths printed by those options will be absolute and canonical. If specified as
+	relative, the paths will be relative to the current working directory if that
+	is possible.  The default is option specific.
++
+This option may be specified multiple times and affects only the arguments that
+follow it on the command line, either to the end of the command line or the next
+instance of this option.
+
+The following options are modified by `--path-format`:
+
 --git-dir::
 	Show `$GIT_DIR` if defined. Otherwise show the path to
 	the .git directory. The path shown, when relative, is
@@ -221,13 +233,42 @@
 is not detected to lie in a Git repository or work tree
 print a message to stderr and exit with nonzero status.
 
+--git-common-dir::
+	Show `$GIT_COMMON_DIR` if defined, else `$GIT_DIR`.
+
+--resolve-git-dir <path>::
+	Check if <path> is a valid repository or a gitfile that
+	points at a valid repository, and print the location of the
+	repository.  If <path> is a gitfile then the resolved path
+	to the real repository is printed.
+
+--git-path <path>::
+	Resolve "$GIT_DIR/<path>" and takes other path relocation
+	variables such as $GIT_OBJECT_DIRECTORY,
+	$GIT_INDEX_FILE... into account. For example, if
+	$GIT_OBJECT_DIRECTORY is set to /foo/bar then "git rev-parse
+	--git-path objects/abc" returns /foo/bar/abc.
+
+--show-toplevel::
+	Show the (by default, absolute) path of the top-level directory
+	of the working tree. If there is no working tree, report an error.
+
+--show-superproject-working-tree::
+	Show the absolute path of the root of the superproject's
+	working tree (if exists) that uses the current repository as
+	its submodule.  Outputs nothing if the current repository is
+	not used as a submodule by any project.
+
+--shared-index-path::
+	Show the path to the shared index file in split index mode, or
+	empty if not in split-index mode.
+
+The following options are unaffected by `--path-format`:
+
 --absolute-git-dir::
 	Like `--git-dir`, but its output is always the canonicalized
 	absolute path.
 
---git-common-dir::
-	Show `$GIT_COMMON_DIR` if defined, else `$GIT_DIR`.
-
 --is-inside-git-dir::
 	When the current working directory is below the repository
 	directory print "true", otherwise "false".
@@ -242,19 +283,6 @@
 --is-shallow-repository::
 	When the repository is shallow print "true", otherwise "false".
 
---resolve-git-dir <path>::
-	Check if <path> is a valid repository or a gitfile that
-	points at a valid repository, and print the location of the
-	repository.  If <path> is a gitfile then the resolved path
-	to the real repository is printed.
-
---git-path <path>::
-	Resolve "$GIT_DIR/<path>" and takes other path relocation
-	variables such as $GIT_OBJECT_DIRECTORY,
-	$GIT_INDEX_FILE... into account. For example, if
-	$GIT_OBJECT_DIRECTORY is set to /foo/bar then "git rev-parse
-	--git-path objects/abc" returns /foo/bar/abc.
-
 --show-cdup::
 	When the command is invoked from a subdirectory, show the
 	path of the top-level directory relative to the current
@@ -265,20 +293,6 @@
 	path of the current directory relative to the top-level
 	directory.
 
---show-toplevel::
-	Show the absolute path of the top-level directory of the working
-	tree. If there is no working tree, report an error.
-
---show-superproject-working-tree::
-	Show the absolute path of the root of the superproject's
-	working tree (if exists) that uses the current repository as
-	its submodule.  Outputs nothing if the current repository is
-	not used as a submodule by any project.
-
---shared-index-path::
-	Show the path to the shared index file in split index mode, or
-	empty if not in split-index mode.
-
 --show-object-format[=(storage|input|output)]::
 	Show the object format (hash algorithm) used for the repository
 	for storage inside the `.git` directory, input, or output. For
diff --git a/Documentation/git-shortlog.txt b/Documentation/git-shortlog.txt
index fd93cd4..c9c7f30 100644
--- a/Documentation/git-shortlog.txt
+++ b/Documentation/git-shortlog.txt
@@ -111,11 +111,11 @@
 MAPPING AUTHORS
 ---------------
 
-The `.mailmap` feature is used to coalesce together commits by the same
-person in the shortlog, where their name and/or email address was
-spelled differently.
+See linkgit:gitmailmap[5].
 
-include::mailmap.txt[]
+Note that if `git shortlog` is run outside of a repository (to process
+log contents on standard input), it will look for a `.mailmap` file in
+the current directory.
 
 GIT
 ---
diff --git a/Documentation/git-show.txt b/Documentation/git-show.txt
index fcf528c..2b1bc72 100644
--- a/Documentation/git-show.txt
+++ b/Documentation/git-show.txt
@@ -45,10 +45,13 @@
 include::pretty-formats.txt[]
 
 
-COMMON DIFF OPTIONS
--------------------
+DIFF FORMATTING
+---------------
+The options below can be used to change the way `git show` generates
+diff output.
 
 :git-log: 1
+:diff-merges-default: `dense-combined`
 include::diff-options.txt[]
 
 include::diff-generate-patch.txt[]
diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt
index 31f1beb..f1197d6 100644
--- a/Documentation/git-stash.txt
+++ b/Documentation/git-stash.txt
@@ -8,8 +8,8 @@
 SYNOPSIS
 --------
 [verse]
-'git stash' list [<options>]
-'git stash' show [<options>] [<stash>]
+'git stash' list [<log-options>]
+'git stash' show [<diff-options>] [<stash>]
 'git stash' drop [-q|--quiet] [<stash>]
 'git stash' ( pop | apply ) [--index] [-q|--quiet] [<stash>]
 'git stash' branch <branchname> [<stash>]
@@ -67,7 +67,7 @@
 	Instead, all non-option arguments are concatenated to form the stash
 	message.
 
-list [<options>]::
+list [<log-options>]::
 
 	List the stash entries that you currently have.  Each 'stash entry' is
 	listed with its name (e.g. `stash@{0}` is the latest entry, `stash@{1}` is
@@ -83,7 +83,7 @@
 The command takes options applicable to the 'git log'
 command to control what is shown and how. See linkgit:git-log[1].
 
-show [<options>] [<stash>]::
+show [<diff-options>] [<stash>]::
 
 	Show the changes recorded in the stash entry as a diff between the
 	stashed contents and the commit back when the stash entry was first
diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt
index c0764e8..83f38e3 100644
--- a/Documentation/git-status.txt
+++ b/Documentation/git-status.txt
@@ -130,7 +130,7 @@
 --column[=<options>]::
 --no-column::
 	Display untracked files in columns. See configuration variable
-	column.status for option syntax.`--column` and `--no-column`
+	`column.status` for option syntax. `--column` and `--no-column`
 	without options are equivalent to 'always' and 'never'
 	respectively.
 
diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index 56656d1..31a97a1 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -134,7 +134,7 @@
 --column[=<options>]::
 --no-column::
 	Display tag listing in columns. See configuration variable
-	column.tag for option syntax.`--column` and `--no-column`
+	`column.tag` for option syntax. `--column` and `--no-column`
 	without options are equivalent to 'always' and 'never' respectively.
 +
 This option is only applicable when listing tags without annotation lines.
diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
index af06128..f1bb1fa 100644
--- a/Documentation/git-worktree.txt
+++ b/Documentation/git-worktree.txt
@@ -97,8 +97,9 @@
 List details of each working tree.  The main working tree is listed first,
 followed by each of the linked working trees.  The output details include
 whether the working tree is bare, the revision currently checked out, the
-branch currently checked out (or "detached HEAD" if none), and "locked" if
-the worktree is locked.
+branch currently checked out (or "detached HEAD" if none), "locked" if
+the worktree is locked, "prunable" if the worktree can be pruned by `prune`
+command.
 
 lock::
 
@@ -143,6 +144,11 @@
 reestablish the connection. If multiple linked working trees are moved,
 running `repair` from any working tree with each tree's new `<path>` as
 an argument, will reestablish the connection to all the specified paths.
++
+If both the main working tree and linked working trees have been moved
+manually, then running `repair` in the main working tree and specifying the
+new `<path>` of each linked working tree will reestablish all connections
+in both directions.
 
 unlock::
 
@@ -226,9 +232,14 @@
 -v::
 --verbose::
 	With `prune`, report all removals.
++
+With `list`, output additional information about worktrees (see below).
 
 --expire <time>::
 	With `prune`, only expire unused working trees older than `<time>`.
++
+With `list`, annotate missing working trees as prunable if they are
+older than `<time>`.
 
 --reason <string>::
 	With `lock`, an explanation why the working tree is locked.
@@ -367,13 +378,46 @@
 /path/to/other-linked-worktree  1234abc  (detached HEAD)
 ------------
 
+The command also shows annotations for each working tree, according to its state.
+These annotations are:
+
+ * `locked`, if the working tree is locked.
+ * `prunable`, if the working tree can be pruned via `git worktree prune`.
+
+------------
+$ git worktree list
+/path/to/linked-worktree    abcd1234 [master]
+/path/to/locked-worktreee   acbd5678 (brancha) locked
+/path/to/prunable-worktree  5678abc  (detached HEAD) prunable
+------------
+
+For these annotations, a reason might also be available and this can be
+seen using the verbose mode. The annotation is then moved to the next line
+indented followed by the additional information.
+
+------------
+$ git worktree list --verbose
+/path/to/linked-worktree              abcd1234 [master]
+/path/to/locked-worktree-no-reason    abcd5678 (detached HEAD) locked
+/path/to/locked-worktree-with-reason  1234abcd (brancha)
+	locked: working tree path is mounted on a portable device
+/path/to/prunable-worktree            5678abc1 (detached HEAD)
+	prunable: gitdir file points to non-existent location
+------------
+
+Note that the annotation is moved to the next line if the additional
+information is available, otherwise it stays on the same line as the
+working tree itself.
+
 Porcelain Format
 ~~~~~~~~~~~~~~~~
 The porcelain format has a line per attribute.  Attributes are listed with a
 label and value separated by a single space.  Boolean attributes (like `bare`
 and `detached`) are listed as a label only, and are present only
-if the value is true.  The first attribute of a working tree is always
-`worktree`, an empty line indicates the end of the record.  For example:
+if the value is true.  Some attributes (like `locked`) can be listed as a label
+only or with a value depending upon whether a reason is available.  The first
+attribute of a working tree is always `worktree`, an empty line indicates the
+end of the record.  For example:
 
 ------------
 $ git worktree list --porcelain
@@ -388,6 +432,33 @@
 HEAD 1234abc1234abc1234abc1234abc1234abc1234a
 detached
 
+worktree /path/to/linked-worktree-locked-no-reason
+HEAD 5678abc5678abc5678abc5678abc5678abc5678c
+branch refs/heads/locked-no-reason
+locked
+
+worktree /path/to/linked-worktree-locked-with-reason
+HEAD 3456def3456def3456def3456def3456def3456b
+branch refs/heads/locked-with-reason
+locked reason why is locked
+
+worktree /path/to/linked-worktree-prunable
+HEAD 1233def1234def1234def1234def1234def1234b
+detached
+prunable gitdir file points to non-existent location
+
+------------
+
+If the lock reason contains "unusual" characters such as newline, they
+are escaped and the entire reason is quoted as explained for the
+configuration variable `core.quotePath` (see linkgit:git-config[1]).
+For Example:
+
+------------
+$ git worktree list --porcelain
+...
+locked "reason\nwhy is locked"
+...
 ------------
 
 EXAMPLES
diff --git a/Documentation/git.txt b/Documentation/git.txt
index a6d4ad0..3a9c449 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -13,7 +13,7 @@
     [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
     [-p|--paginate|-P|--no-pager] [--no-replace-objects] [--bare]
     [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
-    [--super-prefix=<path>]
+    [--super-prefix=<path>] [--config-env <name>=<envvar>]
     <command> [<args>]
 
 DESCRIPTION
@@ -80,6 +80,28 @@
 foo.bar= ...`) sets `foo.bar` to the empty string which `git config
 --type=bool` will convert to `false`.
 
+--config-env=<name>=<envvar>::
+	Like `-c <name>=<value>`, give configuration variable
+	'<name>' a value, where <envvar> is the name of an
+	environment variable from which to retrieve the value. Unlike
+	`-c` there is no shortcut for directly setting the value to an
+	empty string, instead the environment variable itself must be
+	set to the empty string.  It is an error if the `<envvar>` does not exist
+	in the environment. `<envvar>` may not contain an equals sign
+	to avoid ambiguity with `<name>` containing one.
++
+This is useful for cases where you want to pass transitory
+configuration options to git, but are doing so on OS's where
+other processes might be able to read your cmdline
+(e.g. `/proc/self/cmdline`), but not your environ
+(e.g. `/proc/self/environ`). That behavior is the default on
+Linux, but may not be on your system.
++
+Note that this might add security for variables such as
+`http.extraHeader` where the sensitive information is part of
+the value, but not e.g. `url.<base>.insteadOf` where the
+sensitive information can be part of the key.
+
 --exec-path[=<path>]::
 	Path to wherever your core Git programs are installed.
 	This can also be controlled by setting the GIT_EXEC_PATH
diff --git a/Documentation/gitdiffcore.txt b/Documentation/gitdiffcore.txt
index c970d9f..1c72696 100644
--- a/Documentation/gitdiffcore.txt
+++ b/Documentation/gitdiffcore.txt
@@ -74,6 +74,7 @@
 - diffcore-merge-broken
 - diffcore-pickaxe
 - diffcore-order
+- diffcore-rotate
 
 These are applied in sequence.  The set of filepairs 'git diff-{asterisk}'
 commands find are used as the input to diffcore-break, and
@@ -168,6 +169,26 @@
 number after the "-M" or "-C" option (e.g. "-M8" to tell it to use
 8/10 = 80%).
 
+Note that when rename detection is on but both copy and break
+detection are off, rename detection adds a preliminary step that first
+checks if files are moved across directories while keeping their
+filename the same.  If there is a file added to a directory whose
+contents is sufficiently similar to a file with the same name that got
+deleted from a different directory, it will mark them as renames and
+exclude them from the later quadratic step (the one that pairwise
+compares all unmatched files to find the "best" matches, determined by
+the highest content similarity).  So, for example, if a deleted
+docs/ext.txt and an added docs/config/ext.txt are similar enough, they
+will be marked as a rename and prevent an added docs/ext.md that may
+be even more similar to the deleted docs/ext.txt from being considered
+as the rename destination in the later step.  For this reason, the
+preliminary "match same filename" step uses a bit higher threshold to
+mark a file pair as a rename and stop considering other candidates for
+better matches.  At most, one comparison is done per file in this
+preliminary pass; so if there are several remaining ext.txt files
+throughout the directory hierarchy after exact rename detection, this
+preliminary step will be skipped for those files.
+
 Note.  When the "-C" option is used with `--find-copies-harder`
 option, 'git diff-{asterisk}' commands feed unmodified filepairs to
 diffcore mechanism as well as modified ones.  This lets the copy
@@ -276,6 +297,26 @@
 t
 ------------------------------------------------
 
+diffcore-rotate: For Changing At Which Path Output Starts
+---------------------------------------------------------
+
+This transformation takes one pathname, and rotates the set of
+filepairs so that the filepair for the given pathname comes first,
+optionally discarding the paths that come before it.  This is used
+to implement the `--skip-to` and the `--rotate-to` options.  It is
+an error when the specified pathname is not in the set of filepairs,
+but it is not useful to error out when used with "git log" family of
+commands, because it is unreasonable to expect that a given path
+would be modified by each and every commit shown by the "git log"
+command.  For this reason, when used with "git log", the filepair
+that sorts the same as, or the first one that sorts after, the given
+pathname is where the output starts.
+
+Use of this transformation combined with diffcore-order will produce
+unexpected results, as the input to this transformation is likely
+not sorted when diffcore-order is in effect.
+
+
 SEE ALSO
 --------
 linkgit:git-diff[1],
diff --git a/Documentation/gitmailmap.txt b/Documentation/gitmailmap.txt
new file mode 100644
index 0000000..3fb39f8
--- /dev/null
+++ b/Documentation/gitmailmap.txt
@@ -0,0 +1,123 @@
+gitmailmap(5)
+=============
+
+NAME
+----
+gitmailmap - Map author/committer names and/or E-Mail addresses
+
+SYNOPSIS
+--------
+$GIT_WORK_TREE/.mailmap
+
+
+DESCRIPTION
+-----------
+
+If the file `.mailmap` exists at the toplevel of the repository, or at
+the location pointed to by the `mailmap.file` or `mailmap.blob`
+configuration options (see linkgit:git-config[1]), it
+is used to map author and committer names and email addresses to
+canonical real names and email addresses.
+
+
+SYNTAX
+------
+
+The '#' character begins a comment to the end of line, blank lines
+are ignored.
+
+In the simple form, each line in the file consists of the canonical
+real name of an author, whitespace, and an email address used in the
+commit (enclosed by '<' and '>') to map to the name. For example:
+--
+	Proper Name <commit@email.xx>
+--
+
+The more complex forms are:
+--
+	<proper@email.xx> <commit@email.xx>
+--
+which allows mailmap to replace only the email part of a commit, and:
+--
+	Proper Name <proper@email.xx> <commit@email.xx>
+--
+which allows mailmap to replace both the name and the email of a
+commit matching the specified commit email address, and:
+--
+	Proper Name <proper@email.xx> Commit Name <commit@email.xx>
+--
+which allows mailmap to replace both the name and the email of a
+commit matching both the specified commit name and email address.
+
+Both E-Mails and names are matched case-insensitively. For example
+this would also match the 'Commit Name <commit&#64;email.xx>' above:
+--
+	Proper Name <proper@email.xx> CoMmIt NaMe <CoMmIt@EmAiL.xX>
+--
+
+EXAMPLES
+--------
+
+Your history contains commits by two authors, Jane
+and Joe, whose names appear in the repository under several forms:
+
+------------
+Joe Developer <joe@example.com>
+Joe R. Developer <joe@example.com>
+Jane Doe <jane@example.com>
+Jane Doe <jane@laptop.(none)>
+Jane D. <jane@desktop.(none)>
+------------
+
+Now suppose that Joe wants his middle name initial used, and Jane
+prefers her family name fully spelled out. A `.mailmap` file to
+correct the names would look like:
+
+------------
+Joe R. Developer <joe@example.com>
+Jane Doe <jane@example.com>
+Jane Doe <jane@desktop.(none)>
+------------
+
+Note that there's no need to map the name for '<jane&#64;laptop.(none)>' to
+only correct the names. However, leaving the obviously broken
+'<jane&#64;laptop.(none)>' and '<jane&#64;desktop.(none)>' E-Mails as-is is
+usually not what you want. A `.mailmap` file which also corrects those
+is:
+
+------------
+Joe R. Developer <joe@example.com>
+Jane Doe <jane@example.com> <jane@laptop.(none)>
+Jane Doe <jane@example.com> <jane@desktop.(none)>
+------------
+
+Finally, let's say that Joe and Jane shared an E-Mail address, but not
+a name, e.g. by having these two commits in the history generated by a
+bug reporting system. I.e. names appearing in history as:
+
+------------
+Joe <bugs@example.com>
+Jane <bugs@example.com>
+------------
+
+A full `.mailmap` file which also handles those cases (an addition of
+two lines to the above example) would be:
+
+------------
+Joe R. Developer <joe@example.com>
+Jane Doe <jane@example.com> <jane@laptop.(none)>
+Jane Doe <jane@example.com> <jane@desktop.(none)>
+Joe R. Developer <joe@example.com> Joe <bugs@example.com>
+Jane Doe <jane@example.com> Jane <bugs@example.com>
+------------
+
+
+
+SEE ALSO
+--------
+linkgit:git-check-mailmap[1]
+
+
+GIT
+---
+Part of the linkgit:git[1] suite
diff --git a/Documentation/i18n.txt b/Documentation/i18n.txt
index 7e36e5b..6c6baee 100644
--- a/Documentation/i18n.txt
+++ b/Documentation/i18n.txt
@@ -38,7 +38,7 @@
   a warning if the commit log message given to it does not look
   like a valid UTF-8 string, unless you explicitly say your
   project uses a legacy encoding.  The way to say this is to
-  have i18n.commitencoding in `.git/config` file, like this:
+  have `i18n.commitEncoding` in `.git/config` file, like this:
 +
 ------------
 [i18n]
diff --git a/Documentation/mailmap.txt b/Documentation/mailmap.txt
deleted file mode 100644
index 4a8c276..0000000
--- a/Documentation/mailmap.txt
+++ /dev/null
@@ -1,75 +0,0 @@
-If the file `.mailmap` exists at the toplevel of the repository, or at
-the location pointed to by the mailmap.file or mailmap.blob
-configuration options, it
-is used to map author and committer names and email addresses to
-canonical real names and email addresses.
-
-In the simple form, each line in the file consists of the canonical
-real name of an author, whitespace, and an email address used in the
-commit (enclosed by '<' and '>') to map to the name. For example:
---
-	Proper Name <commit@email.xx>
---
-
-The more complex forms are:
---
-	<proper@email.xx> <commit@email.xx>
---
-which allows mailmap to replace only the email part of a commit, and:
---
-	Proper Name <proper@email.xx> <commit@email.xx>
---
-which allows mailmap to replace both the name and the email of a
-commit matching the specified commit email address, and:
---
-	Proper Name <proper@email.xx> Commit Name <commit@email.xx>
---
-which allows mailmap to replace both the name and the email of a
-commit matching both the specified commit name and email address.
-
-Example 1: Your history contains commits by two authors, Jane
-and Joe, whose names appear in the repository under several forms:
-
-------------
-Joe Developer <joe@example.com>
-Joe R. Developer <joe@example.com>
-Jane Doe <jane@example.com>
-Jane Doe <jane@laptop.(none)>
-Jane D. <jane@desktop.(none)>
-------------
-
-Now suppose that Joe wants his middle name initial used, and Jane
-prefers her family name fully spelled out. A proper `.mailmap` file
-would look like:
-
-------------
-Jane Doe         <jane@desktop.(none)>
-Joe R. Developer <joe@example.com>
-------------
-
-Note how there is no need for an entry for `<jane@laptop.(none)>`, because the
-real name of that author is already correct.
-
-Example 2: Your repository contains commits from the following
-authors:
-
-------------
-nick1 <bugs@company.xx>
-nick2 <bugs@company.xx>
-nick2 <nick2@company.xx>
-santa <me@company.xx>
-claus <me@company.xx>
-CTO <cto@coompany.xx>
-------------
-
-Then you might want a `.mailmap` file that looks like:
-------------
-<cto@company.xx>                       <cto@coompany.xx>
-Some Dude <some@dude.xx>         nick1 <bugs@company.xx>
-Other Author <other@author.xx>   nick2 <bugs@company.xx>
-Other Author <other@author.xx>         <nick2@company.xx>
-Santa Claus <santa.claus@northpole.xx> <me@company.xx>
-------------
-
-Use hash '#' for comments that are either on their own line, or after
-the email address.
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index 84bbc74..6b59e28 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -252,7 +252,15 @@
 			  interpreted by
 			  linkgit:git-interpret-trailers[1]. The
 			  `trailers` string may be followed by a colon
-			  and zero or more comma-separated options:
+			  and zero or more comma-separated options.
+			  If any option is provided multiple times the
+			  last occurance wins.
++
+The boolean options accept an optional value `[=<BOOL>]`. The values
+`true`, `false`, `on`, `off` etc. are all accepted. See the "boolean"
+sub-section in "EXAMPLES" in linkgit:git-config[1]. If a boolean
+option is given with no value, it's enabled.
++
 ** 'key=<K>': only show trailers with specified key. Matching is done
    case-insensitively and trailing colon is optional. If option is
    given multiple times trailer lines matching any of the keys are
@@ -261,27 +269,25 @@
    desired it can be disabled with `only=false`.  E.g.,
    `%(trailers:key=Reviewed-by)` shows trailer lines with key
    `Reviewed-by`.
-** 'only[=val]': select whether non-trailer lines from the trailer
-   block should be included. The `only` keyword may optionally be
-   followed by an equal sign and one of `true`, `on`, `yes` to omit or
-   `false`, `off`, `no` to show the non-trailer lines. If option is
-   given without value it is enabled. If given multiple times the last
-   value is used.
+** 'only[=<BOOL>]': select whether non-trailer lines from the trailer
+   block should be included.
 ** 'separator=<SEP>': specify a separator inserted between trailer
    lines. When this option is not given each trailer line is
    terminated with a line feed character. The string SEP may contain
    the literal formatting codes described above. To use comma as
    separator one must use `%x2C` as it would otherwise be parsed as
-   next option. If separator option is given multiple times only the
-   last one is used. E.g., `%(trailers:key=Ticket,separator=%x2C )`
+   next option. E.g., `%(trailers:key=Ticket,separator=%x2C )`
    shows all trailer lines whose key is "Ticket" separated by a comma
    and a space.
-** 'unfold[=val]': make it behave as if interpret-trailer's `--unfold`
-   option was given. In same way as to for `only` it can be followed
-   by an equal sign and explicit value. E.g.,
+** 'unfold[=<BOOL>]': make it behave as if interpret-trailer's `--unfold`
+   option was given. E.g.,
    `%(trailers:only,unfold=true)` unfolds and shows all trailer lines.
-** 'valueonly[=val]': skip over the key part of the trailer line and only
-   show the value part. Also this optionally allows explicit value.
+** 'keyonly[=<BOOL>]': only show the key part of the trailer.
+** 'valueonly[=<BOOL>]': only show the value part of the trailer.
+** 'key_value_separator=<SEP>': specify a separator inserted between
+   trailer lines. When this option is not given each trailer key-value
+   pair is separated by ": ". Otherwise it shares the same semantics
+   as 'separator=<SEP>' above.
 
 NOTE: Some placeholders may depend on other options given to the
 revision traversal engine. For example, the `%g*` reflog options will
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index 0023790..b1c8f86 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -129,6 +129,11 @@
 	adjusting to updated upstream from time to time, and
 	this option allows you to ignore the individual commits
 	brought in to your history by such a merge.
+ifdef::git-log[]
++
+This option also changes default diff format for merge commits
+to `first-parent`, see `--diff-merges=first-parent` for details.
+endif::git-log[]
 
 --not::
 	Reverses the meaning of the '{caret}' prefix (or lack thereof)
@@ -222,6 +227,15 @@
 	test the exit status to see if a range of objects is fully
 	connected (or not).  It is faster than redirecting stdout
 	to `/dev/null` as the output does not have to be formatted.
+
+--disk-usage::
+	Suppress normal output; instead, print the sum of the bytes used
+	for on-disk storage by the selected commits or objects. This is
+	equivalent to piping the output into `git cat-file
+	--batch-check='%(objectsize:disk)'`, except that it runs much
+	faster (especially with `--use-bitmap-index`). See the `CAVEATS`
+	section in linkgit:git-cat-file[1] for the limitations of what
+	"on-disk storage" means.
 endif::git-rev-list[]
 
 --cherry-mark::
diff --git a/Documentation/technical/chunk-format.txt b/Documentation/technical/chunk-format.txt
new file mode 100644
index 0000000..593614f
--- /dev/null
+++ b/Documentation/technical/chunk-format.txt
@@ -0,0 +1,116 @@
+Chunk-based file formats
+========================
+
+Some file formats in Git use a common concept of "chunks" to describe
+sections of the file. This allows structured access to a large file by
+scanning a small "table of contents" for the remaining data. This common
+format is used by the `commit-graph` and `multi-pack-index` files. See
+link:technical/pack-format.html[the `multi-pack-index` format] and
+link:technical/commit-graph-format.html[the `commit-graph` format] for
+how they use the chunks to describe structured data.
+
+A chunk-based file format begins with some header information custom to
+that format. That header should include enough information to identify
+the file type, format version, and number of chunks in the file. From this
+information, that file can determine the start of the chunk-based region.
+
+The chunk-based region starts with a table of contents describing where
+each chunk starts and ends. This consists of (C+1) rows of 12 bytes each,
+where C is the number of chunks. Consider the following table:
+
+  | Chunk ID (4 bytes) | Chunk Offset (8 bytes) |
+  |--------------------|------------------------|
+  | ID[0]              | OFFSET[0]              |
+  | ...                | ...                    |
+  | ID[C]              | OFFSET[C]              |
+  | 0x0000             | OFFSET[C+1]            |
+
+Each row consists of a 4-byte chunk identifier (ID) and an 8-byte offset.
+Each integer is stored in network-byte order.
+
+The chunk identifier `ID[i]` is a label for the data stored within this
+fill from `OFFSET[i]` (inclusive) to `OFFSET[i+1]` (exclusive). Thus, the
+size of the `i`th chunk is equal to the difference between `OFFSET[i+1]`
+and `OFFSET[i]`. This requires that the chunk data appears contiguously
+in the same order as the table of contents.
+
+The final entry in the table of contents must be four zero bytes. This
+confirms that the table of contents is ending and provides the offset for
+the end of the chunk-based data.
+
+Note: The chunk-based format expects that the file contains _at least_ a
+trailing hash after `OFFSET[C+1]`.
+
+Functions for working with chunk-based file formats are declared in
+`chunk-format.h`. Using these methods provide extra checks that assist
+developers when creating new file formats.
+
+Writing chunk-based file formats
+--------------------------------
+
+To write a chunk-based file format, create a `struct chunkfile` by
+calling `init_chunkfile()` and pass a `struct hashfile` pointer. The
+caller is responsible for opening the `hashfile` and writing header
+information so the file format is identifiable before the chunk-based
+format begins.
+
+Then, call `add_chunk()` for each chunk that is intended for write. This
+populates the `chunkfile` with information about the order and size of
+each chunk to write. Provide a `chunk_write_fn` function pointer to
+perform the write of the chunk data upon request.
+
+Call `write_chunkfile()` to write the table of contents to the `hashfile`
+followed by each of the chunks. This will verify that each chunk wrote
+the expected amount of data so the table of contents is correct.
+
+Finally, call `free_chunkfile()` to clear the `struct chunkfile` data. The
+caller is responsible for finalizing the `hashfile` by writing the trailing
+hash and closing the file.
+
+Reading chunk-based file formats
+--------------------------------
+
+To read a chunk-based file format, the file must be opened as a
+memory-mapped region. The chunk-format API expects that the entire file
+is mapped as a contiguous memory region.
+
+Initialize a `struct chunkfile` pointer with `init_chunkfile(NULL)`.
+
+After reading the header information from the beginning of the file,
+including the chunk count, call `read_table_of_contents()` to populate
+the `struct chunkfile` with the list of chunks, their offsets, and their
+sizes.
+
+Extract the data information for each chunk using `pair_chunk()` or
+`read_chunk()`:
+
+* `pair_chunk()` assigns a given pointer with the location inside the
+  memory-mapped file corresponding to that chunk's offset. If the chunk
+  does not exist, then the pointer is not modified.
+
+* `read_chunk()` takes a `chunk_read_fn` function pointer and calls it
+  with the appropriate initial pointer and size information. The function
+  is not called if the chunk does not exist. Use this method to read chunks
+  if you need to perform immediate parsing or if you need to execute logic
+  based on the size of the chunk.
+
+After calling these methods, call `free_chunkfile()` to clear the
+`struct chunkfile` data. This will not close the memory-mapped region.
+Callers are expected to own that data for the timeframe the pointers into
+the region are needed.
+
+Examples
+--------
+
+These file formats use the chunk-format API, and can be used as examples
+for future formats:
+
+* *commit-graph:* see `write_commit_graph_file()` and `parse_commit_graph()`
+  in `commit-graph.c` for how the chunk-format API is used to write and
+  parse the commit-graph file format documented in
+  link:technical/commit-graph-format.html[the commit-graph file format].
+
+* *multi-pack-index:* see `write_midx_internal()` and `load_multi_pack_index()`
+  in `midx.c` for how the chunk-format API is used to write and
+  parse the multi-pack-index file format documented in
+  link:technical/pack-format.html[the multi-pack-index file format].
diff --git a/Documentation/technical/commit-graph-format.txt b/Documentation/technical/commit-graph-format.txt
index b3b5888..87971c2 100644
--- a/Documentation/technical/commit-graph-format.txt
+++ b/Documentation/technical/commit-graph-format.txt
@@ -4,11 +4,7 @@
 The Git commit graph stores a list of commit OIDs and some associated
 metadata, including:
 
-- The generation number of the commit. Commits with no parents have
-  generation number 1; commits with parents have generation number
-  one more than the maximum generation number of its parents. We
-  reserve zero as special, and can be used to mark a generation
-  number invalid or as "not computed".
+- The generation number of the commit.
 
 - The root tree OID.
 
@@ -65,6 +61,9 @@
       the length using the next chunk position if necessary.) Each chunk
       ID appears at most once.
 
+  The CHUNK LOOKUP matches the table of contents from
+  link:technical/chunk-format.html[the chunk-based file format].
+
   The remaining data in the body is described one chunk at a time, and
   these chunks may be given in any order. Chunks are required unless
   otherwise specified.
@@ -86,13 +85,33 @@
       position. If there are more than two parents, the second value
       has its most-significant bit on and the other bits store an array
       position into the Extra Edge List chunk.
-    * The next 8 bytes store the generation number of the commit and
+    * The next 8 bytes store the topological level (generation number v1)
+      of the commit and
       the commit time in seconds since EPOCH. The generation number
       uses the higher 30 bits of the first 4 bytes, while the commit
       time uses the 32 bits of the second 4 bytes, along with the lowest
       2 bits of the lowest byte, storing the 33rd and 34th bit of the
       commit time.
 
+  Generation Data (ID: {'G', 'D', 'A', 'T' }) (N * 4 bytes) [Optional]
+    * This list of 4-byte values store corrected commit date offsets for the
+      commits, arranged in the same order as commit data chunk.
+    * If the corrected commit date offset cannot be stored within 31 bits,
+      the value has its most-significant bit on and the other bits store
+      the position of corrected commit date into the Generation Data Overflow
+      chunk.
+    * Generation Data chunk is present only when commit-graph file is written
+      by compatible versions of Git and in case of split commit-graph chains,
+      the topmost layer also has Generation Data chunk.
+
+  Generation Data Overflow (ID: {'G', 'D', 'O', 'V' }) [Optional]
+    * This list of 8-byte values stores the corrected commit date offsets
+      for commits with corrected commit date offsets that cannot be
+      stored within 31 bits.
+    * Generation Data Overflow chunk is present only when Generation Data
+      chunk is present and atleast one corrected commit date offset cannot
+      be stored within 31 bits.
+
   Extra Edge List (ID: {'E', 'D', 'G', 'E'}) [Optional]
       This list of 4-byte values store the second through nth parents for
       all octopus merges. The second parent value in the commit data stores
diff --git a/Documentation/technical/commit-graph.txt b/Documentation/technical/commit-graph.txt
index f14a765..f05e7bd 100644
--- a/Documentation/technical/commit-graph.txt
+++ b/Documentation/technical/commit-graph.txt
@@ -38,14 +38,31 @@
 
 Values 1-4 satisfy the requirements of parse_commit_gently().
 
-Define the "generation number" of a commit recursively as follows:
+There are two definitions of generation number:
+1. Corrected committer dates (generation number v2)
+2. Topological levels (generation nummber v1)
 
- * A commit with no parents (a root commit) has generation number one.
+Define "corrected committer date" of a commit recursively as follows:
 
- * A commit with at least one parent has generation number one more than
-   the largest generation number among its parents.
+ * A commit with no parents (a root commit) has corrected committer date
+    equal to its committer date.
 
-Equivalently, the generation number of a commit A is one more than the
+ * A commit with at least one parent has corrected committer date equal to
+    the maximum of its commiter date and one more than the largest corrected
+    committer date among its parents.
+
+ * As a special case, a root commit with timestamp zero has corrected commit
+    date of 1, to be able to distinguish it from GENERATION_NUMBER_ZERO
+    (that is, an uncomputed corrected commit date).
+
+Define the "topological level" of a commit recursively as follows:
+
+ * A commit with no parents (a root commit) has topological level of one.
+
+ * A commit with at least one parent has topological level one more than
+   the largest topological level among its parents.
+
+Equivalently, the topological level of a commit A is one more than the
 length of a longest path from A to a root commit. The recursive definition
 is easier to use for computation and observing the following property:
 
@@ -60,6 +77,9 @@
     generation numbers, then we always expand the boundary commit with highest
     generation number and can easily detect the stopping condition.
 
+The property applies to both versions of generation number, that is both
+corrected committer dates and topological levels.
+
 This property can be used to significantly reduce the time it takes to
 walk commits and determine topological relationships. Without generation
 numbers, the general heuristic is the following:
@@ -67,7 +87,9 @@
     If A and B are commits with commit time X and Y, respectively, and
     X < Y, then A _probably_ cannot reach B.
 
-This heuristic is currently used whenever the computation is allowed to
+In absence of corrected commit dates (for example, old versions of Git or
+mixed generation graph chains),
+this heuristic is currently used whenever the computation is allowed to
 violate topological relationships due to clock skew (such as "git log"
 with default order), but is not used when the topological order is
 required (such as merge base calculations, "git log --graph").
@@ -77,7 +99,7 @@
 generation number and walk until reaching commits with known generation
 number.
 
-We use the macro GENERATION_NUMBER_INFINITY = 0xFFFFFFFF to mark commits not
+We use the macro GENERATION_NUMBER_INFINITY to mark commits not
 in the commit-graph file. If a commit-graph file was written by a version
 of Git that did not compute generation numbers, then those commits will
 have generation number represented by the macro GENERATION_NUMBER_ZERO = 0.
@@ -93,12 +115,12 @@
 walking a few extra commits, but the simplicity in dealing with commits
 with generation number *_INFINITY or *_ZERO is valuable.
 
-We use the macro GENERATION_NUMBER_MAX = 0x3FFFFFFF to for commits whose
-generation numbers are computed to be at least this value. We limit at
-this value since it is the largest value that can be stored in the
-commit-graph file using the 30 bits available to generation numbers. This
-presents another case where a commit can have generation number equal to
-that of a parent.
+We use the macro GENERATION_NUMBER_V1_MAX = 0x3FFFFFFF for commits whose
+topological levels (generation number v1) are computed to be at least
+this value. We limit at this value since it is the largest value that
+can be stored in the commit-graph file using the 30 bits available
+to topological levels. This presents another case where a commit can
+have generation number equal to that of a parent.
 
 Design Details
 --------------
@@ -267,6 +289,35 @@
 number of commits) could be extracted into config settings for full
 flexibility.
 
+## Handling Mixed Generation Number Chains
+
+With the introduction of generation number v2 and generation data chunk, the
+following scenario is possible:
+
+1. "New" Git writes a commit-graph with the corrected commit dates.
+2. "Old" Git writes a split commit-graph on top without corrected commit dates.
+
+A naive approach of using the newest available generation number from
+each layer would lead to violated expectations: the lower layer would
+use corrected commit dates which are much larger than the topological
+levels of the higher layer. For this reason, Git inspects the topmost
+layer to see if the layer is missing corrected commit dates. In such a case
+Git only uses topological level for generation numbers.
+
+When writing a new layer in split commit-graph, we write corrected commit
+dates if the topmost layer has corrected commit dates written. This
+guarantees that if a layer has corrected commit dates, all lower layers
+must have corrected commit dates as well.
+
+When merging layers, we do not consider whether the merged layers had corrected
+commit dates. Instead, the new layer will have corrected commit dates if the
+layer below the new layer has corrected commit dates.
+
+While writing or merging layers, if the new layer is the only layer, it will
+have corrected commit dates when written by compatible versions of Git. Thus,
+rewriting split commit-graph as a single file (`--split=replace`) creates a
+single layer with corrected commit dates.
+
 ## Deleting graph-{hash} files
 
 After a new tip file is written, some `graph-{hash}` files may no longer
diff --git a/Documentation/technical/hash-function-transition.txt b/Documentation/technical/hash-function-transition.txt
index 6fd20eb..7c1630b 100644
--- a/Documentation/technical/hash-function-transition.txt
+++ b/Documentation/technical/hash-function-transition.txt
@@ -33,16 +33,9 @@
 
 Git v2.13.0 and later subsequently moved to a hardened SHA-1
 implementation by default, which isn't vulnerable to the SHAttered
-attack.
+attack, but SHA-1 is still weak.
 
-Thus Git has in effect already migrated to a new hash that isn't SHA-1
-and doesn't share its vulnerabilities, its new hash function just
-happens to produce exactly the same output for all known inputs,
-except two PDFs published by the SHAttered researchers, and the new
-implementation (written by those researchers) claims to detect future
-cryptanalytic collision attacks.
-
-Regardless, it's considered prudent to move past any variant of SHA-1
+Thus it's considered prudent to move past any variant of SHA-1
 to a new hash. There's no guarantee that future attacks on SHA-1 won't
 be published in the future, and those attacks may not have viable
 mitigations.
@@ -57,6 +50,38 @@
 and safe error checking, but other hash functions are equally suitable
 that are believed to be cryptographically secure.
 
+Choice of Hash
+--------------
+The hash to replace the hardened SHA-1 should be stronger than SHA-1
+was: we would like it to be trustworthy and useful in practice for at
+least 10 years.
+
+Some other relevant properties:
+
+1. A 256-bit hash (long enough to match common security practice; not
+   excessively long to hurt performance and disk usage).
+
+2. High quality implementations should be widely available (e.g., in
+   OpenSSL and Apple CommonCrypto).
+
+3. The hash function's properties should match Git's needs (e.g. Git
+   requires collision and 2nd preimage resistance and does not require
+   length extension resistance).
+
+4. As a tiebreaker, the hash should be fast to compute (fortunately
+   many contenders are faster than SHA-1).
+
+There were several contenders for a successor hash to SHA-1, including
+SHA-256, SHA-512/256, SHA-256x16, K12, and BLAKE2bp-256.
+
+In late 2018 the project picked SHA-256 as its successor hash.
+
+See 0ed8d8da374 (doc hash-function-transition: pick SHA-256 as
+NewHash, 2018-08-04) and numerous mailing list threads at the time,
+particularly the one starting at
+https://lore.kernel.org/git/20180609224913.GC38834@genre.crustytoothpaste.net/
+for more information.
+
 Goals
 -----
 1. The transition to SHA-256 can be done one local repository at a time.
@@ -94,7 +119,7 @@
 --------
 We introduce a new repository format extension. Repositories with this
 extension enabled use SHA-256 instead of SHA-1 to name their objects.
-This affects both object names and object content --- both the names
+This affects both object names and object content -- both the names
 of objects and all references to other objects within an object are
 switched to the new hash function.
 
@@ -107,7 +132,7 @@
 interchangeably.
 
 "git cat-file" and "git hash-object" gain options to display an object
-in its sha1 form and write an object given its sha1 form. This
+in its SHA-1 form and write an object given its SHA-1 form. This
 requires all objects referenced by that object to be present in the
 object database so that they can be named using the appropriate name
 (using the bidirectional hash mapping).
@@ -115,7 +140,7 @@
 Fetches from a SHA-1 based server convert the fetched objects into
 SHA-256 form and record the mapping in the bidirectional mapping table
 (see below for details). Pushes to a SHA-1 based server convert the
-objects being pushed into sha1 form so the server does not have to be
+objects being pushed into SHA-1 form so the server does not have to be
 aware of the hash function the client is using.
 
 Detailed Design
@@ -151,38 +176,38 @@
 
 Object names
 ~~~~~~~~~~~~
-Objects can be named by their 40 hexadecimal digit sha1-name or 64
-hexadecimal digit sha256-name, plus names derived from those (see
+Objects can be named by their 40 hexadecimal digit SHA-1 name or 64
+hexadecimal digit SHA-256 name, plus names derived from those (see
 gitrevisions(7)).
 
-The sha1-name of an object is the SHA-1 of the concatenation of its
-type, length, a nul byte, and the object's sha1-content. This is the
+The SHA-1 name of an object is the SHA-1 of the concatenation of its
+type, length, a nul byte, and the object's SHA-1 content. This is the
 traditional <sha1> used in Git to name objects.
 
-The sha256-name of an object is the SHA-256 of the concatenation of its
-type, length, a nul byte, and the object's sha256-content.
+The SHA-256 name of an object is the SHA-256 of the concatenation of its
+type, length, a nul byte, and the object's SHA-256 content.
 
 Object format
 ~~~~~~~~~~~~~
 The content as a byte sequence of a tag, commit, or tree object named
-by sha1 and sha256 differ because an object named by sha256-name refers to
-other objects by their sha256-names and an object named by sha1-name
-refers to other objects by their sha1-names.
+by SHA-1 and SHA-256 differ because an object named by SHA-256 name refers to
+other objects by their SHA-256 names and an object named by SHA-1 name
+refers to other objects by their SHA-1 names.
 
-The sha256-content of an object is the same as its sha1-content, except
-that objects referenced by the object are named using their sha256-names
-instead of sha1-names. Because a blob object does not refer to any
-other object, its sha1-content and sha256-content are the same.
+The SHA-256 content of an object is the same as its SHA-1 content, except
+that objects referenced by the object are named using their SHA-256 names
+instead of SHA-1 names. Because a blob object does not refer to any
+other object, its SHA-1 content and SHA-256 content are the same.
 
-The format allows round-trip conversion between sha256-content and
-sha1-content.
+The format allows round-trip conversion between SHA-256 content and
+SHA-1 content.
 
 Object storage
 ~~~~~~~~~~~~~~
 Loose objects use zlib compression and packed objects use the packed
 format described in Documentation/technical/pack-format.txt, just like
-today. The content that is compressed and stored uses sha256-content
-instead of sha1-content.
+today. The content that is compressed and stored uses SHA-256 content
+instead of SHA-1 content.
 
 Pack index
 ~~~~~~~~~~
@@ -191,21 +216,21 @@
 network byte order):
 
 - A header appears at the beginning and consists of the following:
-  - The 4-byte pack index signature: '\377t0c'
-  - 4-byte version number: 3
-  - 4-byte length of the header section, including the signature and
+  * The 4-byte pack index signature: '\377t0c'
+  * 4-byte version number: 3
+  * 4-byte length of the header section, including the signature and
     version number
-  - 4-byte number of objects contained in the pack
-  - 4-byte number of object formats in this pack index: 2
-  - For each object format:
-    - 4-byte format identifier (e.g., 'sha1' for SHA-1)
-    - 4-byte length in bytes of shortened object names. This is the
+  * 4-byte number of objects contained in the pack
+  * 4-byte number of object formats in this pack index: 2
+  * For each object format:
+    ** 4-byte format identifier (e.g., 'sha1' for SHA-1)
+    ** 4-byte length in bytes of shortened object names. This is the
       shortest possible length needed to make names in the shortened
       object name table unambiguous.
-    - 4-byte integer, recording where tables relating to this format
+    ** 4-byte integer, recording where tables relating to this format
       are stored in this index file, as an offset from the beginning.
-  - 4-byte offset to the trailer from the beginning of this file.
-  - Zero or more additional key/value pairs (4-byte key, 4-byte
+  * 4-byte offset to the trailer from the beginning of this file.
+  * Zero or more additional key/value pairs (4-byte key, 4-byte
     value). Only one key is supported: 'PSRC'. See the "Loose objects
     and unreachable objects" section for supported values and how this
     is used.  All other keys are reserved. Readers must ignore
@@ -213,37 +238,36 @@
 - Zero or more NUL bytes. This can optionally be used to improve the
   alignment of the full object name table below.
 - Tables for the first object format:
-  - A sorted table of shortened object names.  These are prefixes of
+  * A sorted table of shortened object names.  These are prefixes of
     the names of all objects in this pack file, packed together
     without offset values to reduce the cache footprint of the binary
     search for a specific object name.
 
-  - A table of full object names in pack order. This allows resolving
+  * A table of full object names in pack order. This allows resolving
     a reference to "the nth object in the pack file" (from a
     reachability bitmap or from the next table of another object
     format) to its object name.
 
-  - A table of 4-byte values mapping object name order to pack order.
+  * A table of 4-byte values mapping object name order to pack order.
     For an object in the table of sorted shortened object names, the
     value at the corresponding index in this table is the index in the
     previous table for that same object.
-
     This can be used to look up the object in reachability bitmaps or
     to look up its name in another object format.
 
-  - A table of 4-byte CRC32 values of the packed object data, in the
+  * A table of 4-byte CRC32 values of the packed object data, in the
     order that the objects appear in the pack file. This is to allow
     compressed data to be copied directly from pack to pack during
     repacking without undetected data corruption.
 
-  - A table of 4-byte offset values. For an object in the table of
+  * A table of 4-byte offset values. For an object in the table of
     sorted shortened object names, the value at the corresponding
     index in this table indicates where that object can be found in
     the pack file. These are usually 31-bit pack file offsets, but
     large offsets are encoded as an index into the next table with the
     most significant bit set.
 
-  - A table of 8-byte offset entries (empty for pack files less than
+  * A table of 8-byte offset entries (empty for pack files less than
     2 GiB). Pack files are organized with heavily used objects toward
     the front, so most object references should not need to refer to
     this table.
@@ -252,10 +276,10 @@
   up to and not including the table of CRC32 values.
 - Zero or more NUL bytes.
 - The trailer consists of the following:
-  - A copy of the 20-byte SHA-256 checksum at the end of the
+  * A copy of the 20-byte SHA-256 checksum at the end of the
     corresponding packfile.
 
-  - 20-byte SHA-256 checksum of all of the above.
+  * 20-byte SHA-256 checksum of all of the above.
 
 Loose object index
 ~~~~~~~~~~~~~~~~~~
@@ -288,18 +312,18 @@
 
 Translation table
 ~~~~~~~~~~~~~~~~~
-The index files support a bidirectional mapping between sha1-names
-and sha256-names. The lookup proceeds similarly to ordinary object
-lookups. For example, to convert a sha1-name to a sha256-name:
+The index files support a bidirectional mapping between SHA-1 names
+and SHA-256 names. The lookup proceeds similarly to ordinary object
+lookups. For example, to convert a SHA-1 name to a SHA-256 name:
 
  1. Look for the object in idx files. If a match is present in the
-    idx's sorted list of truncated sha1-names, then:
-    a. Read the corresponding entry in the sha1-name order to pack
+    idx's sorted list of truncated SHA-1 names, then:
+    a. Read the corresponding entry in the SHA-1 name order to pack
        name order mapping.
-    b. Read the corresponding entry in the full sha1-name table to
+    b. Read the corresponding entry in the full SHA-1 name table to
        verify we found the right object. If it is, then
-    c. Read the corresponding entry in the full sha256-name table.
-       That is the object's sha256-name.
+    c. Read the corresponding entry in the full SHA-256 name table.
+       That is the object's SHA-256 name.
  2. Check for a loose object. Read lines from loose-object-idx until
     we find a match.
 
@@ -313,10 +337,10 @@
 the new objects to the corresponding index, this mapping is possible
 for all objects in the object store.
 
-Reading an object's sha1-content
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-The sha1-content of an object can be read by converting all sha256-names
-its sha256-content references to sha1-names using the translation table.
+Reading an object's SHA-1 content
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The SHA-1 content of an object can be read by converting all SHA-256 names
+of its SHA-256 content references to SHA-1 names using the translation table.
 
 Fetch
 ~~~~~
@@ -339,7 +363,7 @@
 1. index-pack: inflate each object in the packfile and compute its
    SHA-1. Objects can contain deltas in OBJ_REF_DELTA format against
    objects the client has locally. These objects can be looked up
-   using the translation table and their sha1-content read as
+   using the translation table and their SHA-1 content read as
    described above to resolve the deltas.
 2. topological sort: starting at the "want"s from the negotiation
    phase, walk through objects in the pack and emit a list of them,
@@ -348,12 +372,12 @@
    (This list only contains objects reachable from the "wants". If the
    pack from the server contained additional extraneous objects, then
    they will be discarded.)
-3. convert to sha256: open a new (sha256) packfile. Read the topologically
+3. convert to SHA-256: open a new SHA-256 packfile. Read the topologically
    sorted list just generated. For each object, inflate its
-   sha1-content, convert to sha256-content, and write it to the sha256
-   pack. Record the new sha1<->sha256 mapping entry for use in the idx.
+   SHA-1 content, convert to SHA-256 content, and write it to the SHA-256
+   pack. Record the new SHA-1<-->SHA-256 mapping entry for use in the idx.
 4. sort: reorder entries in the new pack to match the order of objects
-   in the pack the server generated and include blobs. Write a sha256 idx
+   in the pack the server generated and include blobs. Write a SHA-256 idx
    file
 5. clean up: remove the SHA-1 based pack file, index, and
    topologically sorted list obtained from the server in steps 1
@@ -378,19 +402,20 @@
 Push
 ~~~~
 Push is simpler than fetch because the objects referenced by the
-pushed objects are already in the translation table. The sha1-content
+pushed objects are already in the translation table. The SHA-1 content
 of each object being pushed can be read as described in the "Reading
-an object's sha1-content" section to generate the pack written by git
+an object's SHA-1 content" section to generate the pack written by git
 send-pack.
 
 Signed Commits
 ~~~~~~~~~~~~~~
 We add a new field "gpgsig-sha256" to the commit object format to allow
 signing commits without relying on SHA-1. It is similar to the
-existing "gpgsig" field. Its signed payload is the sha256-content of the
+existing "gpgsig" field. Its signed payload is the SHA-256 content of the
 commit object with any "gpgsig" and "gpgsig-sha256" fields removed.
 
 This means commits can be signed
+
 1. using SHA-1 only, as in existing signed commit objects
 2. using both SHA-1 and SHA-256, by using both gpgsig-sha256 and gpgsig
    fields.
@@ -404,10 +429,11 @@
 ~~~~~~~~~~~
 We add a new field "gpgsig-sha256" to the tag object format to allow
 signing tags without relying on SHA-1. Its signed payload is the
-sha256-content of the tag with its gpgsig-sha256 field and "-----BEGIN PGP
+SHA-256 content of the tag with its gpgsig-sha256 field and "-----BEGIN PGP
 SIGNATURE-----" delimited in-body signature removed.
 
 This means tags can be signed
+
 1. using SHA-1 only, as in existing signed tag objects
 2. using both SHA-1 and SHA-256, by using gpgsig-sha256 and an in-body
    signature.
@@ -415,11 +441,11 @@
 
 Mergetag embedding
 ~~~~~~~~~~~~~~~~~~
-The mergetag field in the sha1-content of a commit contains the
-sha1-content of a tag that was merged by that commit.
+The mergetag field in the SHA-1 content of a commit contains the
+SHA-1 content of a tag that was merged by that commit.
 
-The mergetag field in the sha256-content of the same commit contains the
-sha256-content of the same tag.
+The mergetag field in the SHA-256 content of the same commit contains the
+SHA-256 content of the same tag.
 
 Submodules
 ~~~~~~~~~~
@@ -494,7 +520,7 @@
 -------
 Invalid objects
 ~~~~~~~~~~~~~~~
-The conversion from sha1-content to sha256-content retains any
+The conversion from SHA-1 content to SHA-256 content retains any
 brokenness in the original object (e.g., tree entry modes encoded with
 leading 0, tree objects whose paths are not sorted correctly, and
 commit objects without an author or committer). This is a deliberate
@@ -513,15 +539,15 @@
 
 Alternates
 ~~~~~~~~~~
-For the same reason, a sha256 repository cannot borrow objects from a
-sha1 repository using objects/info/alternates or
+For the same reason, a SHA-256 repository cannot borrow objects from a
+SHA-1 repository using objects/info/alternates or
 $GIT_ALTERNATE_OBJECT_REPOSITORIES.
 
 git notes
 ~~~~~~~~~
-The "git notes" tool annotates objects using their sha1-name as key.
+The "git notes" tool annotates objects using their SHA-1 name as key.
 This design does not describe a way to migrate notes trees to use
-sha256-names. That migration is expected to happen separately (for
+SHA-256 names. That migration is expected to happen separately (for
 example using a file at the root of the notes tree to describe which
 hash it uses).
 
@@ -555,7 +581,7 @@
 
 	Git 2.12
 
-Does this mean Git v2.12.0 is the commit with sha1-name
+Does this mean Git v2.12.0 is the commit with SHA-1 name
 e7e07d5a4fcc2a203d9873968ad3e6bd4d7419d7 or the commit with
 new-40-digit-hash-name e7e07d5a4fcc2a203d9873968ad3e6bd4d7419d7?
 
@@ -598,44 +624,12 @@
 particular revision specifier and for output, overriding the mode. For
 example:
 
-git --output-format=sha1 log abac87a^{sha1}..f787cac^{sha256}
-
-Choice of Hash
---------------
-In early 2005, around the time that Git was written, Xiaoyun Wang,
-Yiqun Lisa Yin, and Hongbo Yu announced an attack finding SHA-1
-collisions in 2^69 operations. In August they published details.
-Luckily, no practical demonstrations of a collision in full SHA-1 were
-published until 10 years later, in 2017.
-
-Git v2.13.0 and later subsequently moved to a hardened SHA-1
-implementation by default that mitigates the SHAttered attack, but
-SHA-1 is still believed to be weak.
-
-The hash to replace this hardened SHA-1 should be stronger than SHA-1
-was: we would like it to be trustworthy and useful in practice for at
-least 10 years.
-
-Some other relevant properties:
-
-1. A 256-bit hash (long enough to match common security practice; not
-   excessively long to hurt performance and disk usage).
-
-2. High quality implementations should be widely available (e.g., in
-   OpenSSL and Apple CommonCrypto).
-
-3. The hash function's properties should match Git's needs (e.g. Git
-   requires collision and 2nd preimage resistance and does not require
-   length extension resistance).
-
-4. As a tiebreaker, the hash should be fast to compute (fortunately
-   many contenders are faster than SHA-1).
-
-We choose SHA-256.
+    git --output-format=sha1 log abac87a^{sha1}..f787cac^{sha256}
 
 Transition plan
 ---------------
 Some initial steps can be implemented independently of one another:
+
 - adding a hash function API (vtable)
 - teaching fsck to tolerate the gpgsig-sha256 field
 - excluding gpgsig-* from the fields copied by "git commit --amend"
@@ -647,9 +641,9 @@
 - introducing index v3
 - adding support for the PSRC field and safer object pruning
 
-
 The first user-visible change is the introduction of the objectFormat
 extension (without compatObjectFormat). This requires:
+
 - teaching fsck about this mode of operation
 - using the hash function API (vtable) when computing object names
 - signing objects and verifying signatures
@@ -657,6 +651,7 @@
   repository
 
 Next comes introduction of compatObjectFormat:
+
 - implementing the loose-object-idx
 - translating object names between object formats
 - translating object content between object formats
@@ -669,10 +664,11 @@
   "Object names on the command line" above)
 
 The next step is supporting fetches and pushes to SHA-1 repositories:
+
 - allow pushes to a repository using the compat format
 - generate a topologically sorted list of the SHA-1 names of fetched
   objects
-- convert the fetched packfile to sha256 format and generate an idx
+- convert the fetched packfile to SHA-256 format and generate an idx
   file
 - re-sort to match the order of objects in the fetched packfile
 
@@ -734,6 +730,7 @@
 Objects newly created would be addressed by the new hash, but inside
 such an object (e.g. commit) it is still possible to address objects
 using the old hash function.
+
 * You cannot trust its history (needed for bisectability) in the
   future without further work
 * Maintenance burden as the number of supported hash functions grows
@@ -743,36 +740,38 @@
 Signed objects with multiple hashes
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Instead of introducing the gpgsig-sha256 field in commit and tag objects
-for sha256-content based signatures, an earlier version of this design
-added "hash sha256 <sha256-name>" fields to strengthen the existing
-sha1-content based signatures.
+for SHA-256 content based signatures, an earlier version of this design
+added "hash sha256 <SHA-256 name>" fields to strengthen the existing
+SHA-1 content based signatures.
 
 In other words, a single signature was used to attest to the object
 content using both hash functions. This had some advantages:
+
 * Using one signature instead of two speeds up the signing process.
 * Having one signed payload with both hashes allows the signer to
-  attest to the sha1-name and sha256-name referring to the same object.
+  attest to the SHA-1 name and SHA-256 name referring to the same object.
 * All users consume the same signature. Broken signatures are likely
   to be detected quickly using current versions of git.
 
 However, it also came with disadvantages:
-* Verifying a signed object requires access to the sha1-names of all
+
+* Verifying a signed object requires access to the SHA-1 names of all
   objects it references, even after the transition is complete and
   translation table is no longer needed for anything else. To support
-  this, the design added fields such as "hash sha1 tree <sha1-name>"
-  and "hash sha1 parent <sha1-name>" to the sha256-content of a signed
+  this, the design added fields such as "hash sha1 tree <SHA-1 name>"
+  and "hash sha1 parent <SHA-1 name>" to the SHA-256 content of a signed
   commit, complicating the conversion process.
-* Allowing signed objects without a sha1 (for after the transition is
+* Allowing signed objects without a SHA-1 (for after the transition is
   complete) complicated the design further, requiring a "nohash sha1"
-  field to suppress including "hash sha1" fields in the sha256-content
+  field to suppress including "hash sha1" fields in the SHA-256 content
   and signed payload.
 
 Lazily populated translation table
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Some of the work of building the translation table could be deferred to
 push time, but that would significantly complicate and slow down pushes.
-Calculating the sha1-name at object creation time at the same time it is
-being streamed to disk and having its sha256-name calculated should be
+Calculating the SHA-1 name at object creation time at the same time it is
+being streamed to disk and having its SHA-256 name calculated should be
 an acceptable cost.
 
 Document History
@@ -782,18 +781,19 @@
 bmwill@google.com, jonathantanmy@google.com, jrnieder@gmail.com,
 sbeller@google.com
 
-Initial version sent to
-http://lore.kernel.org/git/20170304011251.GA26789@aiede.mtv.corp.google.com
+* Initial version sent to https://lore.kernel.org/git/20170304011251.GA26789@aiede.mtv.corp.google.com
 
 2017-03-03 jrnieder@gmail.com
 Incorporated suggestions from jonathantanmy and sbeller:
-* describe purpose of signed objects with each hash type
-* redefine signed object verification using object content under the
+
+* Describe purpose of signed objects with each hash type
+* Redefine signed object verification using object content under the
   first hash function
 
 2017-03-06 jrnieder@gmail.com
+
 * Use SHA3-256 instead of SHA2 (thanks, Linus and brian m. carlson).[1][2]
-* Make sha3-based signatures a separate field, avoiding the need for
+* Make SHA3-based signatures a separate field, avoiding the need for
   "hash" and "nohash" fields (thanks to peff[3]).
 * Add a sorting phase to fetch (thanks to Junio for noticing the need
   for this).
@@ -805,23 +805,26 @@
   especially Junio).
 
 2017-09-27 jrnieder@gmail.com, sbeller@google.com
-* use placeholder NewHash instead of SHA3-256
-* describe criteria for picking a hash function.
-* include a transition plan (thanks especially to Brandon Williams
+
+* Use placeholder NewHash instead of SHA3-256
+* Describe criteria for picking a hash function.
+* Include a transition plan (thanks especially to Brandon Williams
   for fleshing these ideas out)
-* define the translation table (thanks, Shawn Pearce[5], Jonathan
+* Define the translation table (thanks, Shawn Pearce[5], Jonathan
   Tan, and Masaya Suzuki)
-* avoid loose object overhead by packing more aggressively in
+* Avoid loose object overhead by packing more aggressively in
   "git gc --auto"
 
 Later history:
 
- See the history of this file in git.git for the history of subsequent
- edits. This document history is no longer being maintained as it
- would now be superfluous to the commit log
+* See the history of this file in git.git for the history of subsequent
+  edits. This document history is no longer being maintained as it
+  would now be superfluous to the commit log
 
-[1] http://lore.kernel.org/git/CA+55aFzJtejiCjV0e43+9oR3QuJK2PiFiLQemytoLpyJWe6P9w@mail.gmail.com/
-[2] http://lore.kernel.org/git/CA+55aFz+gkAsDZ24zmePQuEs1XPS9BP_s8O7Q4wQ7LV7X5-oDA@mail.gmail.com/
-[3] http://lore.kernel.org/git/20170306084353.nrns455dvkdsfgo5@sigill.intra.peff.net/
-[4] http://lore.kernel.org/git/20170304224936.rqqtkdvfjgyezsht@genre.crustytoothpaste.net
-[5] https://lore.kernel.org/git/CAJo=hJtoX9=AyLHHpUJS7fueV9ciZ_MNpnEPHUz8Whui6g9F0A@mail.gmail.com/
+References:
+
+ [1] https://lore.kernel.org/git/CA+55aFzJtejiCjV0e43+9oR3QuJK2PiFiLQemytoLpyJWe6P9w@mail.gmail.com/
+ [2] https://lore.kernel.org/git/CA+55aFz+gkAsDZ24zmePQuEs1XPS9BP_s8O7Q4wQ7LV7X5-oDA@mail.gmail.com/
+ [3] https://lore.kernel.org/git/20170306084353.nrns455dvkdsfgo5@sigill.intra.peff.net/
+ [4] https://lore.kernel.org/git/20170304224936.rqqtkdvfjgyezsht@genre.crustytoothpaste.net
+ [5] https://lore.kernel.org/git/CAJo=hJtoX9=AyLHHpUJS7fueV9ciZ_MNpnEPHUz8Whui6g9F0A@mail.gmail.com/
diff --git a/Documentation/technical/index-format.txt b/Documentation/technical/index-format.txt
index 69edf46..d363a71 100644
--- a/Documentation/technical/index-format.txt
+++ b/Documentation/technical/index-format.txt
@@ -26,7 +26,7 @@
      Extensions are identified by signature. Optional extensions can
      be ignored if Git does not understand them.
 
-     Git currently supports cached tree and resolve undo extensions.
+     Git currently supports cache tree and resolve undo extensions.
 
      4-byte extension signature. If the first byte is 'A'..'Z' the
      extension is optional and can be ignored.
@@ -136,14 +136,35 @@
 
 == Extensions
 
-=== Cached tree
+=== Cache tree
 
-  Cached tree extension contains pre-computed hashes for trees that can
-  be derived from the index. It helps speed up tree object generation
-  from index for a new commit.
+  Since the index does not record entries for directories, the cache
+  entries cannot describe tree objects that already exist in the object
+  database for regions of the index that are unchanged from an existing
+  commit. The cache tree extension stores a recursive tree structure that
+  describes the trees that already exist and completely match sections of
+  the cache entries. This speeds up tree object generation from the index
+  for a new commit by only computing the trees that are "new" to that
+  commit. It also assists when comparing the index to another tree, such
+  as `HEAD^{tree}`, since sections of the index can be skipped when a tree
+  comparison demonstrates equality.
 
-  When a path is updated in index, the path must be invalidated and
-  removed from tree cache.
+  The recursive tree structure uses nodes that store a number of cache
+  entries, a list of subnodes, and an object ID (OID). The OID references
+  the existing tree for that node, if it is known to exist. The subnodes
+  correspond to subdirectories that themselves have cache tree nodes. The
+  number of cache entries corresponds to the number of cache entries in
+  the index that describe paths within that tree's directory.
+
+  The extension tracks the full directory structure in the cache tree
+  extension, but this is generally smaller than the full cache entry list.
+
+  When a path is updated in index, Git invalidates all nodes of the
+  recursive cache tree corresponding to the parent directories of that
+  path. We store these tree nodes as being "invalid" by using "-1" as the
+  number of cache entries. Invalid nodes still store a span of index
+  entries, allowing Git to focus its efforts when reconstructing a full
+  cache tree.
 
   The signature for this extension is { 'T', 'R', 'E', 'E' }.
 
@@ -174,7 +195,8 @@
   first entry represents the root level of the repository, followed by the
   first subtree--let's call this A--of the root level (with its name
   relative to the root level), followed by the first subtree of A (with
-  its name relative to A), ...
+  its name relative to A), and so on. The specified number of subtrees
+  indicates when the current level of the recursive stack is complete.
 
 === Resolve undo
 
@@ -251,14 +273,14 @@
   - Stat data of $GIT_DIR/info/exclude. See "Index entry" section from
     ctime field until "file size".
 
-  - Stat data of core.excludesfile
+  - Stat data of core.excludesFile
 
   - 32-bit dir_flags (see struct dir_struct)
 
   - Hash of $GIT_DIR/info/exclude. A null hash means the file
     does not exist.
 
-  - Hash of core.excludesfile. A null hash means the file does
+  - Hash of core.excludesFile. A null hash means the file does
     not exist.
 
   - NUL-terminated string of per-dir exclude file name. This usually
diff --git a/Documentation/technical/pack-format.txt b/Documentation/technical/pack-format.txt
index 96d2fc5..1faa949 100644
--- a/Documentation/technical/pack-format.txt
+++ b/Documentation/technical/pack-format.txt
@@ -274,6 +274,26 @@
 
     Index checksum of all of the above.
 
+== pack-*.rev files have the format:
+
+  - A 4-byte magic number '0x52494458' ('RIDX').
+
+  - A 4-byte version identifier (= 1).
+
+  - A 4-byte hash function identifier (= 1 for SHA-1, 2 for SHA-256).
+
+  - A table of index positions (one per packed object, num_objects in
+    total, each a 4-byte unsigned integer in network order), sorted by
+    their corresponding offsets in the packfile.
+
+  - A trailer, containing a:
+
+    checksum of the corresponding packfile, and
+
+    a checksum of all of the above.
+
+All 4-byte numbers are in network order.
+
 == multi-pack-index (MIDX) files have the following format:
 
 The multi-pack-index files refer to multiple pack-files and loose objects.
@@ -316,6 +336,9 @@
 	    (Chunks are provided in file-order, so you can infer the length
 	    using the next chunk position if necessary.)
 
+	The CHUNK LOOKUP matches the table of contents from
+	link:technical/chunk-format.html[the chunk-based file format].
+
 	The remaining data in the body is described one chunk at a time, and
 	these chunks may be given in any order. Chunks are required unless
 	otherwise specified.
diff --git a/Documentation/technical/protocol-v2.txt b/Documentation/technical/protocol-v2.txt
index 85daeb5..a7c806a 100644
--- a/Documentation/technical/protocol-v2.txt
+++ b/Documentation/technical/protocol-v2.txt
@@ -33,8 +33,8 @@
 
   * '0000' Flush Packet (flush-pkt) - indicates the end of a message
   * '0001' Delimiter Packet (delim-pkt) - separates sections of a message
-  * '0002' Message Packet (response-end-pkt) - indicates the end of a response
-    for stateless connections
+  * '0002' Response End Packet (response-end-pkt) - indicates the end of a
+    response for stateless connections
 
 Initial Client Request
 ----------------------
@@ -192,11 +192,20 @@
 	When specified, only references having a prefix matching one of
 	the provided prefixes are displayed.
 
+If the 'unborn' feature is advertised the following argument can be
+included in the client's request.
+
+    unborn
+	The server will send information about HEAD even if it is a symref
+	pointing to an unborn branch in the form "unborn HEAD
+	symref-target:<target>".
+
 The output of ls-refs is as follows:
 
     output = *ref
 	     flush-pkt
-    ref = PKT-LINE(obj-id SP refname *(SP ref-attribute) LF)
+    obj-id-or-unborn = (obj-id | "unborn")
+    ref = PKT-LINE(obj-id-or-unborn SP refname *(SP ref-attribute) LF)
     ref-attribute = (symref | peeled)
     symref = "symref-target:" symref-target
     peeled = "peeled:" obj-id
diff --git a/Documentation/technical/reftable.txt b/Documentation/technical/reftable.txt
index 8095ab2..3ef169a 100644
--- a/Documentation/technical/reftable.txt
+++ b/Documentation/technical/reftable.txt
@@ -872,17 +872,11 @@
 Layout
 ^^^^^^
 
-A collection of reftable files are stored in the `$GIT_DIR/reftable/`
-directory:
-
-....
-00000001-00000001.log
-00000002-00000002.ref
-00000003-00000003.ref
-....
-
-where reftable files are named by a unique name such as produced by the
-function `${min_update_index}-${max_update_index}.ref`.
+A collection of reftable files are stored in the `$GIT_DIR/reftable/` directory.
+Their names should have a random element, such that each filename is globally
+unique; this helps avoid spurious failures on Windows, where open files cannot
+be removed or overwritten. It suggested to use
+`${min_update_index}-${max_update_index}-${random}.ref` as a naming convention.
 
 Log-only files use the `.log` extension, while ref-only and mixed ref
 and log files use `.ref`. extension.
@@ -893,9 +887,9 @@
 
 ....
 $ cat .git/reftable/tables.list
-00000001-00000001.log
-00000002-00000002.ref
-00000003-00000003.ref
+00000001-00000001-RANDOM1.log
+00000002-00000002-RANDOM2.ref
+00000003-00000003-RANDOM3.ref
 ....
 
 Readers must read `$GIT_DIR/reftable/tables.list` to determine which
@@ -940,7 +934,7 @@
 3.  Select `update_index` to be most recent file's
 `max_update_index + 1`.
 4.  Prepare temp reftable `tmp_XXXXXX`, including log entries.
-5.  Rename `tmp_XXXXXX` to `${update_index}-${update_index}.ref`.
+5.  Rename `tmp_XXXXXX` to `${update_index}-${update_index}-${random}.ref`.
 6.  Copy `tables.list` to `tables.list.lock`, appending file from (5).
 7.  Rename `tables.list.lock` to `tables.list`.
 
@@ -993,7 +987,7 @@
 should always be the case, assuming that other processes are adhering to
 the locking protocol.
 7.  Rename `${min_update_index}-${max_update_index}_XXXXXX` to
-`${min_update_index}-${max_update_index}.ref`.
+`${min_update_index}-${max_update_index}-${random}.ref`.
 8.  Write the new stack to `tables.list.lock`, replacing `B` and `C`
 with the file from (4).
 9.  Rename `tables.list.lock` to `tables.list`.
@@ -1005,6 +999,22 @@
 Each reftable (compacted or not) is uniquely identified by its name, so
 open reftables can be cached by their name.
 
+Windows
+^^^^^^^
+
+On windows, and other systems that do not allow deleting or renaming to open
+files, compaction may succeed, but other readers may prevent obsolete tables
+from being deleted.
+
+On these platforms, the following strategy can be followed: on closing a
+reftable stack, reload `tables.list`, and delete any tables no longer mentioned
+in `tables.list`.
+
+Irregular program exit may still leave about unused files. In this case, a
+cleanup operation can read `tables.list`, note its modification timestamp, and
+delete any unreferenced `*.ref` files that are older.
+
+
 Alternatives considered
 ~~~~~~~~~~~~~~~~~~~~~~~
 
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 39d0c99..da85367 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v2.30.5
+DEF_VER=v2.31.3
 
 LF='
 '
diff --git a/Makefile b/Makefile
index 4128b45..f3dc217 100644
--- a/Makefile
+++ b/Makefile
@@ -22,6 +22,9 @@
 # when attempting to read from an fopen'ed directory (or even to fopen
 # it at all).
 #
+# Define OPEN_RETURNS_EINTR if your open() system call may return EINTR
+# when a signal is received (as opposed to restarting).
+#
 # Define NO_OPENSSL environment variable if you do not have OpenSSL.
 #
 # Define USE_LIBPCRE if you have and want to use libpcre. Various
@@ -29,18 +32,11 @@
 # Perl-compatible regular expressions instead of standard or extended
 # POSIX regular expressions.
 #
-# USE_LIBPCRE is a synonym for USE_LIBPCRE2, define USE_LIBPCRE1
-# instead if you'd like to use the legacy version 1 of the PCRE
-# library. Support for version 1 will likely be removed in some future
-# release of Git, as upstream has all but abandoned it.
-#
-# When using USE_LIBPCRE1, define NO_LIBPCRE1_JIT if you want to
-# disable JIT even if supported by your library.
+# Only libpcre version 2 is supported. USE_LIBPCRE2 is a synonym for
+# USE_LIBPCRE, support for the old USE_LIBPCRE1 has been removed.
 #
 # Define LIBPCREDIR=/foo/bar if your PCRE header and library files are
-# in /foo/bar/include and /foo/bar/lib directories. Which version of
-# PCRE this points to determined by the USE_LIBPCRE1 and USE_LIBPCRE2
-# variables.
+# in /foo/bar/include and /foo/bar/lib directories.
 #
 # Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
 #
@@ -722,6 +718,7 @@
 TEST_BUILTINS_OBJS += test-parse-options.o
 TEST_BUILTINS_OBJS += test-parse-pathspec-file.o
 TEST_BUILTINS_OBJS += test-path-utils.o
+TEST_BUILTINS_OBJS += test-pcre2-config.o
 TEST_BUILTINS_OBJS += test-pkt-line.o
 TEST_BUILTINS_OBJS += test-prio-queue.o
 TEST_BUILTINS_OBJS += test-proc-receive.o
@@ -840,6 +837,7 @@
 LIB_OBJS += cache-tree.o
 LIB_OBJS += chdir-notify.o
 LIB_OBJS += checkout.o
+LIB_OBJS += chunk-format.o
 LIB_OBJS += color.o
 LIB_OBJS += column.o
 LIB_OBJS += combine-diff.o
@@ -860,6 +858,7 @@
 LIB_OBJS += decorate.o
 LIB_OBJS += delta-islands.o
 LIB_OBJS += diff-delta.o
+LIB_OBJS += diff-merges.o
 LIB_OBJS += diff-lib.o
 LIB_OBJS += diff-no-index.o
 LIB_OBJS += diff.o
@@ -868,6 +867,7 @@
 LIB_OBJS += diffcore-order.o
 LIB_OBJS += diffcore-pickaxe.o
 LIB_OBJS += diffcore-rename.o
+LIB_OBJS += diffcore-rotate.o
 LIB_OBJS += dir-iterator.o
 LIB_OBJS += dir.o
 LIB_OBJS += editor.o
@@ -887,6 +887,7 @@
 LIB_OBJS += gpg-interface.o
 LIB_OBJS += graph.o
 LIB_OBJS += grep.o
+LIB_OBJS += hash-lookup.o
 LIB_OBJS += hashmap.o
 LIB_OBJS += help.o
 LIB_OBJS += hex.o
@@ -923,6 +924,8 @@
 LIB_OBJS += notes-merge.o
 LIB_OBJS += notes-utils.o
 LIB_OBJS += notes.o
+LIB_OBJS += object-file.o
+LIB_OBJS += object-name.o
 LIB_OBJS += object.o
 LIB_OBJS += oid-array.o
 LIB_OBJS += oidmap.o
@@ -979,9 +982,6 @@
 LIB_OBJS += serve.o
 LIB_OBJS += server-info.o
 LIB_OBJS += setup.o
-LIB_OBJS += sha1-file.o
-LIB_OBJS += sha1-lookup.o
-LIB_OBJS += sha1-name.o
 LIB_OBJS += shallow.o
 LIB_OBJS += sideband.o
 LIB_OBJS += sigchain.o
@@ -1359,26 +1359,17 @@
 	COMPAT_OBJS += compat/basename.o
 endif
 
+ifdef USE_LIBPCRE1
+$(error The USE_LIBPCRE1 build option has been removed, use version 2 with USE_LIBPCRE)
+endif
+
 USE_LIBPCRE2 ?= $(USE_LIBPCRE)
 
 ifneq (,$(USE_LIBPCRE2))
-	ifdef USE_LIBPCRE1
-$(error Only set USE_LIBPCRE2 (or its alias USE_LIBPCRE) or USE_LIBPCRE1, not both!)
-	endif
-
 	BASIC_CFLAGS += -DUSE_LIBPCRE2
 	EXTLIBS += -lpcre2-8
 endif
 
-ifdef USE_LIBPCRE1
-	BASIC_CFLAGS += -DUSE_LIBPCRE1
-	EXTLIBS += -lpcre
-
-ifdef NO_LIBPCRE1_JIT
-	BASIC_CFLAGS += -DNO_LIBPCRE1_JIT
-endif
-endif
-
 ifdef LIBPCREDIR
 	BASIC_CFLAGS += -I$(LIBPCREDIR)/include
 	EXTLIBS += -L$(LIBPCREDIR)/$(lib) $(CC_LD_DYNPATH)$(LIBPCREDIR)/$(lib)
@@ -1551,6 +1542,10 @@
 	COMPAT_CFLAGS += -DFREAD_READS_DIRECTORIES
 	COMPAT_OBJS += compat/fopen.o
 endif
+ifdef OPEN_RETURNS_EINTR
+	COMPAT_CFLAGS += -DOPEN_RETURNS_EINTR
+	COMPAT_OBJS += compat/open.o
+endif
 ifdef NO_SYMLINK_HEAD
 	BASIC_CFLAGS += -DNO_SYMLINK_HEAD
 endif
@@ -2726,9 +2721,7 @@
 	@echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@+
 	@echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@+
 	@echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@+
-	@echo USE_LIBPCRE1=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE1)))'\' >>$@+
 	@echo USE_LIBPCRE2=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE2)))'\' >>$@+
-	@echo NO_LIBPCRE1_JIT=\''$(subst ','\'',$(subst ','\'',$(NO_LIBPCRE1_JIT)))'\' >>$@+
 	@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@+
 	@echo NO_PTHREADS=\''$(subst ','\'',$(subst ','\'',$(NO_PTHREADS)))'\' >>$@+
 	@echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@+
@@ -3306,11 +3299,11 @@
 # are not necessarily appropriate for general builds, and that vary greatly
 # depending on the compiler version used.
 #
-# An example command to build against libFuzzer from LLVM 4.0.0:
+# An example command to build against libFuzzer from LLVM 11.0.0:
 #
 # make CC=clang CXX=clang++ \
-#      CFLAGS="-fsanitize-coverage=trace-pc-guard -fsanitize=address" \
-#      LIB_FUZZING_ENGINE=/usr/lib/llvm-4.0/lib/libFuzzer.a \
+#      CFLAGS="-fsanitize=fuzzer-no-link,address" \
+#      LIB_FUZZING_ENGINE="-fsanitize=fuzzer" \
 #      fuzz-all
 #
 FUZZ_CXXFLAGS ?= $(CFLAGS)
diff --git a/RelNotes b/RelNotes
index 406d238..c3d6893 120000
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.30.5.txt
\ No newline at end of file
+Documentation/RelNotes/2.31.3.txt
\ No newline at end of file
diff --git a/abspath.c b/abspath.c
index 6f15a41..39e06b5 100644
--- a/abspath.c
+++ b/abspath.c
@@ -67,19 +67,15 @@ static void get_root_part(struct strbuf *resolved, struct strbuf *remaining)
 #endif
 
 /*
- * Return the real path (i.e., absolute path, with symlinks resolved
- * and extra slashes removed) equivalent to the specified path.  (If
- * you want an absolute path but don't mind links, use
- * absolute_path().)  Places the resolved realpath in the provided strbuf.
- *
- * The directory part of path (i.e., everything up to the last
- * dir_sep) must denote a valid, existing directory, but the last
- * component need not exist.  If die_on_error is set, then die with an
- * informative error message if there is a problem.  Otherwise, return
- * NULL on errors (without generating any output).
+ * If set, any number of trailing components may be missing; otherwise, only one
+ * may be.
  */
-char *strbuf_realpath(struct strbuf *resolved, const char *path,
-		      int die_on_error)
+#define REALPATH_MANY_MISSING (1 << 0)
+/* Should we die if there's an error? */
+#define REALPATH_DIE_ON_ERROR (1 << 1)
+
+static char *strbuf_realpath_1(struct strbuf *resolved, const char *path,
+			       int flags)
 {
 	struct strbuf remaining = STRBUF_INIT;
 	struct strbuf next = STRBUF_INIT;
@@ -89,7 +85,7 @@ char *strbuf_realpath(struct strbuf *resolved, const char *path,
 	struct stat st;
 
 	if (!*path) {
-		if (die_on_error)
+		if (flags & REALPATH_DIE_ON_ERROR)
 			die("The empty string is not a valid path");
 		else
 			goto error_out;
@@ -101,7 +97,7 @@ char *strbuf_realpath(struct strbuf *resolved, const char *path,
 	if (!resolved->len) {
 		/* relative path; can use CWD as the initial resolved path */
 		if (strbuf_getcwd(resolved)) {
-			if (die_on_error)
+			if (flags & REALPATH_DIE_ON_ERROR)
 				die_errno("unable to get current working directory");
 			else
 				goto error_out;
@@ -129,8 +125,9 @@ char *strbuf_realpath(struct strbuf *resolved, const char *path,
 
 		if (lstat(resolved->buf, &st)) {
 			/* error out unless this was the last component */
-			if (errno != ENOENT || remaining.len) {
-				if (die_on_error)
+			if (errno != ENOENT ||
+			   (!(flags & REALPATH_MANY_MISSING) && remaining.len)) {
+				if (flags & REALPATH_DIE_ON_ERROR)
 					die_errno("Invalid path '%s'",
 						  resolved->buf);
 				else
@@ -143,7 +140,7 @@ char *strbuf_realpath(struct strbuf *resolved, const char *path,
 			if (num_symlinks++ > MAXSYMLINKS) {
 				errno = ELOOP;
 
-				if (die_on_error)
+				if (flags & REALPATH_DIE_ON_ERROR)
 					die("More than %d nested symlinks "
 					    "on path '%s'", MAXSYMLINKS, path);
 				else
@@ -153,7 +150,7 @@ char *strbuf_realpath(struct strbuf *resolved, const char *path,
 			len = strbuf_readlink(&symlink, resolved->buf,
 					      st.st_size);
 			if (len < 0) {
-				if (die_on_error)
+				if (flags & REALPATH_DIE_ON_ERROR)
 					die_errno("Invalid symlink '%s'",
 						  resolved->buf);
 				else
@@ -202,6 +199,37 @@ char *strbuf_realpath(struct strbuf *resolved, const char *path,
 	return retval;
 }
 
+/*
+ * Return the real path (i.e., absolute path, with symlinks resolved
+ * and extra slashes removed) equivalent to the specified path.  (If
+ * you want an absolute path but don't mind links, use
+ * absolute_path().)  Places the resolved realpath in the provided strbuf.
+ *
+ * The directory part of path (i.e., everything up to the last
+ * dir_sep) must denote a valid, existing directory, but the last
+ * component need not exist.  If die_on_error is set, then die with an
+ * informative error message if there is a problem.  Otherwise, return
+ * NULL on errors (without generating any output).
+ */
+char *strbuf_realpath(struct strbuf *resolved, const char *path,
+		      int die_on_error)
+{
+	return strbuf_realpath_1(resolved, path,
+				 die_on_error ? REALPATH_DIE_ON_ERROR : 0);
+}
+
+/*
+ * Just like strbuf_realpath, but allows an arbitrary number of path
+ * components to be missing.
+ */
+char *strbuf_realpath_forgiving(struct strbuf *resolved, const char *path,
+				int die_on_error)
+{
+	return strbuf_realpath_1(resolved, path,
+				 ((die_on_error ? REALPATH_DIE_ON_ERROR : 0) |
+				  REALPATH_MANY_MISSING));
+}
+
 char *real_pathdup(const char *path, int die_on_error)
 {
 	struct strbuf realpath = STRBUF_INIT;
diff --git a/add-interactive.c b/add-interactive.c
index 9b8cdb4..36ebdbd 100644
--- a/add-interactive.c
+++ b/add-interactive.c
@@ -413,7 +413,7 @@ struct file_item {
 
 static void add_file_item(struct string_list *files, const char *name)
 {
-	struct file_item *item = xcalloc(sizeof(*item), 1);
+	struct file_item *item = xcalloc(1, sizeof(*item));
 
 	string_list_append(files, name)->util = item;
 }
@@ -476,7 +476,7 @@ static void collect_changes_cb(struct diff_queue_struct *q,
 
 			add_file_item(s->files, name);
 
-			entry = xcalloc(sizeof(*entry), 1);
+			CALLOC_ARRAY(entry, 1);
 			hashmap_entry_init(&entry->ent, hash);
 			entry->name = s->files->items[s->files->nr - 1].string;
 			entry->item = s->files->items[s->files->nr - 1].util;
@@ -1120,7 +1120,7 @@ int run_add_i(struct repository *r, const struct pathspec *ps)
 	int res = 0;
 
 	for (i = 0; i < ARRAY_SIZE(command_list); i++) {
-		struct command_item *util = xcalloc(sizeof(*util), 1);
+		struct command_item *util = xcalloc(1, sizeof(*util));
 		util->command = command_list[i].command;
 		string_list_append(&commands.items, command_list[i].string)
 			->util = util;
diff --git a/apply.c b/apply.c
index 668b16e..6695a93 100644
--- a/apply.c
+++ b/apply.c
@@ -1781,7 +1781,7 @@ static int parse_single_patch(struct apply_state *state,
 		struct fragment *fragment;
 		int len;
 
-		fragment = xcalloc(1, sizeof(*fragment));
+		CALLOC_ARRAY(fragment, 1);
 		fragment->linenr = state->linenr;
 		len = parse_fragment(state, line, size, patch, fragment);
 		if (len <= 0) {
@@ -1959,7 +1959,7 @@ static struct fragment *parse_binary_hunk(struct apply_state *state,
 		size -= llen;
 	}
 
-	frag = xcalloc(1, sizeof(*frag));
+	CALLOC_ARRAY(frag, 1);
 	frag->patch = inflate_it(data, hunk_size, origlen);
 	frag->free_patch = 1;
 	if (!frag->patch)
@@ -4681,7 +4681,7 @@ static int apply_patch(struct apply_state *state,
 		struct patch *patch;
 		int nr;
 
-		patch = xcalloc(1, sizeof(*patch));
+		CALLOC_ARRAY(patch, 1);
 		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);
diff --git a/archive-tar.c b/archive-tar.c
index a971fdc..05d2455 100644
--- a/archive-tar.c
+++ b/archive-tar.c
@@ -371,7 +371,7 @@ static int tar_filter_config(const char *var, const char *value, void *data)
 
 	ar = find_tar_filter(name, namelen);
 	if (!ar) {
-		ar = xcalloc(1, sizeof(*ar));
+		CALLOC_ARRAY(ar, 1);
 		ar->name = xmemdupz(name, namelen);
 		ar->write_archive = write_tar_filter_archive;
 		ar->flags = ARCHIVER_WANT_COMPRESSION_LEVELS |
diff --git a/attr.c b/attr.c
index 4ef85d6..59a8d8a 100644
--- a/attr.c
+++ b/attr.c
@@ -569,7 +569,7 @@ struct attr_check *attr_check_initl(const char *one, ...)
 	check = attr_check_alloc();
 	check->nr = cnt;
 	check->alloc = cnt;
-	check->items = xcalloc(cnt, sizeof(struct attr_check_item));
+	CALLOC_ARRAY(check->items, cnt);
 
 	check->items[0].attr = git_attr(one);
 	va_start(params, one);
@@ -670,7 +670,7 @@ static struct attr_stack *read_attr_from_array(const char **list)
 	const char *line;
 	int lineno = 0;
 
-	res = xcalloc(1, sizeof(*res));
+	CALLOC_ARRAY(res, 1);
 	while ((line = *(list++)) != NULL)
 		handle_attr_line(res, line, "[builtin]", ++lineno, 1);
 	return res;
@@ -707,7 +707,7 @@ static struct attr_stack *read_attr_from_file(const char *path, int macro_ok)
 
 	if (!fp)
 		return NULL;
-	res = xcalloc(1, sizeof(*res));
+	CALLOC_ARRAY(res, 1);
 	while (fgets(buf, sizeof(buf), fp)) {
 		char *bufp = buf;
 		if (!lineno)
@@ -733,7 +733,7 @@ static struct attr_stack *read_attr_from_index(const struct index_state *istate,
 	if (!buf)
 		return NULL;
 
-	res = xcalloc(1, sizeof(*res));
+	CALLOC_ARRAY(res, 1);
 	for (sp = buf; *sp; ) {
 		char *ep;
 		int more;
@@ -774,7 +774,7 @@ static struct attr_stack *read_attr(const struct index_state *istate,
 	}
 
 	if (!res)
-		res = xcalloc(1, sizeof(*res));
+		CALLOC_ARRAY(res, 1);
 	return res;
 }
 
@@ -874,7 +874,7 @@ static void bootstrap_attr_stack(const struct index_state *istate,
 	else
 		e = NULL;
 	if (!e)
-		e = xcalloc(1, sizeof(struct attr_stack));
+		CALLOC_ARRAY(e, 1);
 	push_stack(stack, e, NULL, 0);
 }
 
diff --git a/bisect.c b/bisect.c
index d8c2c8f..af2863d 100644
--- a/bisect.c
+++ b/bisect.c
@@ -6,7 +6,7 @@
 #include "refs.h"
 #include "list-objects.h"
 #include "quote.h"
-#include "sha1-lookup.h"
+#include "hash-lookup.h"
 #include "run-command.h"
 #include "log-tree.h"
 #include "bisect.h"
@@ -423,7 +423,7 @@ void find_bisection(struct commit_list **commit_list, int *reaches,
 	show_list("bisection 2 sorted", 0, nr, list);
 
 	*all = nr;
-	weights = xcalloc(on_list, sizeof(*weights));
+	CALLOC_ARRAY(weights, on_list);
 
 	/* Do the real work of finding bisection commit. */
 	best = do_find_bisection(list, nr, weights, bisect_flags);
@@ -1064,7 +1064,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)
 
 	if (!all) {
 		fprintf(stderr, _("No testable commit found.\n"
-			"Maybe you started with bad path parameters?\n"));
+			"Maybe you started with bad path arguments?\n"));
 
 		return BISECT_NO_TESTABLE_COMMIT;
 	}
diff --git a/blame.c b/blame.c
index a5044fc..5018bb8 100644
--- a/blame.c
+++ b/blame.c
@@ -951,13 +951,13 @@ static int *fuzzy_find_matching_lines(struct blame_origin *parent,
 	max_search_distance_b = ((2 * max_search_distance_a + 1) * length_b
 				 - 1) / length_a;
 
-	result = xcalloc(sizeof(int), length_b);
-	second_best_result = xcalloc(sizeof(int), length_b);
-	certainties = xcalloc(sizeof(int), length_b);
+	CALLOC_ARRAY(result, length_b);
+	CALLOC_ARRAY(second_best_result, length_b);
+	CALLOC_ARRAY(certainties, length_b);
 
 	/* See get_similarity() for details of similarities. */
 	similarity_count = length_b * (max_search_distance_a * 2 + 1);
-	similarities = xcalloc(sizeof(int), similarity_count);
+	CALLOC_ARRAY(similarities, similarity_count);
 
 	for (i = 0; i < length_b; ++i) {
 		result[i] = -1;
@@ -995,7 +995,7 @@ static void fill_origin_fingerprints(struct blame_origin *o)
 		return;
 	o->num_lines = find_line_starts(&line_starts, o->file.ptr,
 					o->file.size);
-	o->fingerprints = xcalloc(sizeof(struct fingerprint), o->num_lines);
+	CALLOC_ARRAY(o->fingerprints, o->num_lines);
 	get_line_fingerprints(o->fingerprints, o->file.ptr, line_starts,
 			      0, o->num_lines);
 	free(line_starts);
@@ -1853,8 +1853,7 @@ static void blame_chunk(struct blame_entry ***dstq, struct blame_entry ***srcq,
 	diffp = NULL;
 
 	if (ignore_diffs && same - tlno > 0) {
-		line_blames = xcalloc(sizeof(struct blame_line_tracker),
-				      same - tlno);
+		CALLOC_ARRAY(line_blames, same - tlno);
 		guess_line_blames(parent, target, tlno, offset, same,
 				  parent_len, line_blames);
 	}
@@ -2216,7 +2215,7 @@ static struct blame_list *setup_blame_list(struct blame_entry *unblamed,
 	for (e = unblamed, num_ents = 0; e; e = e->next)
 		num_ents++;
 	if (num_ents) {
-		blame_list = xcalloc(num_ents, sizeof(struct blame_list));
+		CALLOC_ARRAY(blame_list, num_ents);
 		for (e = unblamed, i = 0; e; e = e->next)
 			blame_list[i++].ent = e;
 	}
@@ -2428,7 +2427,7 @@ static void pass_blame(struct blame_scoreboard *sb, struct blame_origin *origin,
 	else if (num_sg < ARRAY_SIZE(sg_buf))
 		memset(sg_buf, 0, sizeof(sg_buf));
 	else
-		sg_origin = xcalloc(num_sg, sizeof(*sg_origin));
+		CALLOC_ARRAY(sg_origin, num_sg);
 
 	/*
 	 * The first pass looks for unrenamed path to optimize for
diff --git a/block-sha1/sha1.c b/block-sha1/sha1.c
index 8681031..1bb6e7c 100644
--- a/block-sha1/sha1.c
+++ b/block-sha1/sha1.c
@@ -70,7 +70,7 @@
  * the input data, the next mix it from the 512-bit array.
  */
 #define SHA_SRC(t) get_be32((unsigned char *) block + (t)*4)
-#define SHA_MIX(t) SHA_ROL(W((t)+13) ^ W((t)+8) ^ W((t)+2) ^ W(t), 1);
+#define SHA_MIX(t) SHA_ROL(W((t)+13) ^ W((t)+8) ^ W((t)+2) ^ W(t), 1)
 
 #define SHA_ROUND(t, input, fn, constant, A, B, C, D, E) do { \
 	unsigned int TEMP = input(t); setW(t, TEMP); \
diff --git a/bloom.c b/bloom.c
index b176f28..52b8747 100644
--- a/bloom.c
+++ b/bloom.c
@@ -277,7 +277,7 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
 				*computed |= BLOOM_TRUNC_EMPTY;
 			filter->len = 1;
 		}
-		filter->data = xcalloc(filter->len, sizeof(unsigned char));
+		CALLOC_ARRAY(filter->data, filter->len);
 
 		hashmap_for_each_entry(&pathmap, &iter, e, entry) {
 			struct bloom_key key;
diff --git a/builtin/add.c b/builtin/add.c
index a825887..ea762a4 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -38,19 +38,27 @@ struct update_callback_data {
 	int add_errors;
 };
 
-static void chmod_pathspec(struct pathspec *pathspec, char flip)
+static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only)
 {
-	int i;
+	int i, ret = 0;
 
 	for (i = 0; i < active_nr; i++) {
 		struct cache_entry *ce = active_cache[i];
+		int err;
 
 		if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL))
 			continue;
 
-		if (chmod_cache_entry(ce, flip) < 0)
-			fprintf(stderr, "cannot chmod %cx '%s'\n", flip, ce->name);
+		if (!show_only)
+			err = chmod_cache_entry(ce, flip);
+		else
+			err = S_ISREG(ce->ce_mode) ? 0 : -1;
+
+		if (err < 0)
+			ret = error(_("cannot chmod %cx '%s'"), flip, ce->name);
 	}
+
+	return ret;
 }
 
 static int fix_unmerged_status(struct diff_filepair *p,
@@ -609,7 +617,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 		exit_status |= add_files(&dir, flags);
 
 	if (chmod_arg && pathspec.nr)
-		chmod_pathspec(&pathspec, chmod_arg[0]);
+		exit_status |= chmod_pathspec(&pathspec, chmod_arg[0], show_only);
 	unplug_bulk_checkin();
 
 finish:
diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
index 709eb71..1fdb7d9 100644
--- a/builtin/bisect--helper.c
+++ b/builtin/bisect--helper.c
@@ -21,16 +21,15 @@ static GIT_PATH_FUNC(git_path_bisect_first_parent, "BISECT_FIRST_PARENT")
 
 static const char * const git_bisect_helper_usage[] = {
 	N_("git bisect--helper --bisect-reset [<commit>]"),
-	N_("git bisect--helper --bisect-write [--no-log] <state> <revision> <good_term> <bad_term>"),
-	N_("git bisect--helper --bisect-check-and-set-terms <command> <good_term> <bad_term>"),
 	N_("git bisect--helper --bisect-next-check <good_term> <bad_term> [<term>]"),
 	N_("git bisect--helper --bisect-terms [--term-good | --term-old | --term-bad | --term-new]"),
 	N_("git bisect--helper --bisect-start [--term-{new,bad}=<term> --term-{old,good}=<term>]"
 					    " [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] [<paths>...]"),
 	N_("git bisect--helper --bisect-next"),
-	N_("git bisect--helper --bisect-auto-next"),
 	N_("git bisect--helper --bisect-state (bad|new) [<rev>]"),
 	N_("git bisect--helper --bisect-state (good|old) [<rev>...]"),
+	N_("git bisect--helper --bisect-replay <filename>"),
+	N_("git bisect--helper --bisect-skip [(<rev>|<range>)...]"),
 	NULL
 };
 
@@ -875,12 +874,19 @@ static enum bisect_error bisect_state(struct bisect_terms *terms, const char **a
 	 */
 
 	for (; argc; argc--, argv++) {
+		struct commit *commit;
+
 		if (get_oid(*argv, &oid)){
 			error(_("Bad rev input: %s"), *argv);
 			oid_array_clear(&revs);
 			return BISECT_FAILED;
 		}
-		oid_array_append(&revs, &oid);
+
+		commit = lookup_commit_reference(the_repository, &oid);
+		if (!commit)
+			die(_("Bad rev input (not a commit): %s"), *argv);
+
+		oid_array_append(&revs, &commit->object.oid);
 	}
 
 	if (strbuf_read_file(&buf, git_path_bisect_expected_rev(), 0) < the_hash_algo->hexsz ||
@@ -904,28 +910,148 @@ static enum bisect_error bisect_state(struct bisect_terms *terms, const char **a
 	return bisect_auto_next(terms, NULL);
 }
 
+static enum bisect_error bisect_log(void)
+{
+	int fd, status;
+	const char* filename = git_path_bisect_log();
+
+	if (is_empty_or_missing_file(filename))
+		return error(_("We are not bisecting."));
+
+	fd = open(filename, O_RDONLY);
+	if (fd < 0)
+		return BISECT_FAILED;
+
+	status = copy_fd(fd, STDOUT_FILENO);
+	close(fd);
+	return status ? BISECT_FAILED : BISECT_OK;
+}
+
+static int process_replay_line(struct bisect_terms *terms, struct strbuf *line)
+{
+	const char *p = line->buf + strspn(line->buf, " \t");
+	char *word_end, *rev;
+
+	if ((!skip_prefix(p, "git bisect", &p) &&
+	!skip_prefix(p, "git-bisect", &p)) || !isspace(*p))
+		return 0;
+	p += strspn(p, " \t");
+
+	word_end = (char *)p + strcspn(p, " \t");
+	rev = word_end + strspn(word_end, " \t");
+	*word_end = '\0'; /* NUL-terminate the word */
+
+	get_terms(terms);
+	if (check_and_set_terms(terms, p))
+		return -1;
+
+	if (!strcmp(p, "start")) {
+		struct strvec argv = STRVEC_INIT;
+		int res;
+		sq_dequote_to_strvec(rev, &argv);
+		res = bisect_start(terms, argv.v, argv.nr);
+		strvec_clear(&argv);
+		return res;
+	}
+
+	if (one_of(p, terms->term_good,
+	   terms->term_bad, "skip", NULL))
+		return bisect_write(p, rev, terms, 0);
+
+	if (!strcmp(p, "terms")) {
+		struct strvec argv = STRVEC_INIT;
+		int res;
+		sq_dequote_to_strvec(rev, &argv);
+		res = bisect_terms(terms, argv.nr == 1 ? argv.v[0] : NULL);
+		strvec_clear(&argv);
+		return res;
+	}
+	error(_("'%s'?? what are you talking about?"), p);
+
+	return -1;
+}
+
+static enum bisect_error bisect_replay(struct bisect_terms *terms, const char *filename)
+{
+	FILE *fp = NULL;
+	enum bisect_error res = BISECT_OK;
+	struct strbuf line = STRBUF_INIT;
+
+	if (is_empty_or_missing_file(filename))
+		return error(_("cannot read file '%s' for replaying"), filename);
+
+	if (bisect_reset(NULL))
+		return BISECT_FAILED;
+
+	fp = fopen(filename, "r");
+	if (!fp)
+		return BISECT_FAILED;
+
+	while ((strbuf_getline(&line, fp) != EOF) && !res)
+		res = process_replay_line(terms, &line);
+
+	strbuf_release(&line);
+	fclose(fp);
+
+	if (res)
+		return BISECT_FAILED;
+
+	return bisect_auto_next(terms, NULL);
+}
+
+static enum bisect_error bisect_skip(struct bisect_terms *terms, const char **argv, int argc)
+{
+	int i;
+	enum bisect_error res;
+	struct strvec argv_state = STRVEC_INIT;
+
+	strvec_push(&argv_state, "skip");
+
+	for (i = 0; i < argc; i++) {
+		const char *dotdot = strstr(argv[i], "..");
+
+		if (dotdot) {
+			struct rev_info revs;
+			struct commit *commit;
+
+			init_revisions(&revs, NULL);
+			setup_revisions(2, argv + i - 1, &revs, NULL);
+
+			if (prepare_revision_walk(&revs))
+				die(_("revision walk setup failed\n"));
+			while ((commit = get_revision(&revs)) != NULL)
+				strvec_push(&argv_state,
+						oid_to_hex(&commit->object.oid));
+
+			reset_revision_walk();
+		} else {
+			strvec_push(&argv_state, argv[i]);
+		}
+	}
+	res = bisect_state(terms, argv_state.v, argv_state.nr);
+
+	strvec_clear(&argv_state);
+	return res;
+}
+
 int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 {
 	enum {
 		BISECT_RESET = 1,
-		BISECT_WRITE,
-		CHECK_AND_SET_TERMS,
 		BISECT_NEXT_CHECK,
 		BISECT_TERMS,
 		BISECT_START,
 		BISECT_AUTOSTART,
 		BISECT_NEXT,
-		BISECT_AUTO_NEXT,
-		BISECT_STATE
+		BISECT_STATE,
+		BISECT_LOG,
+		BISECT_REPLAY,
+		BISECT_SKIP
 	} cmdmode = 0;
 	int res = 0, nolog = 0;
 	struct option options[] = {
 		OPT_CMDMODE(0, "bisect-reset", &cmdmode,
 			 N_("reset the bisection state"), BISECT_RESET),
-		OPT_CMDMODE(0, "bisect-write", &cmdmode,
-			 N_("write out the bisection state in BISECT_LOG"), BISECT_WRITE),
-		OPT_CMDMODE(0, "check-and-set-terms", &cmdmode,
-			 N_("check and set terms in a bisection state"), CHECK_AND_SET_TERMS),
 		OPT_CMDMODE(0, "bisect-next-check", &cmdmode,
 			 N_("check whether bad or good terms exist"), BISECT_NEXT_CHECK),
 		OPT_CMDMODE(0, "bisect-terms", &cmdmode,
@@ -934,10 +1060,14 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 			 N_("start the bisect session"), BISECT_START),
 		OPT_CMDMODE(0, "bisect-next", &cmdmode,
 			 N_("find the next bisection commit"), BISECT_NEXT),
-		OPT_CMDMODE(0, "bisect-auto-next", &cmdmode,
-			 N_("verify the next bisection state then checkout the next bisection commit"), BISECT_AUTO_NEXT),
 		OPT_CMDMODE(0, "bisect-state", &cmdmode,
 			 N_("mark the state of ref (or refs)"), BISECT_STATE),
+		OPT_CMDMODE(0, "bisect-log", &cmdmode,
+			 N_("list the bisection steps so far"), BISECT_LOG),
+		OPT_CMDMODE(0, "bisect-replay", &cmdmode,
+			 N_("replay the bisection process from the given file"), BISECT_REPLAY),
+		OPT_CMDMODE(0, "bisect-skip", &cmdmode,
+			 N_("skip some commits for checkout"), BISECT_SKIP),
 		OPT_BOOL(0, "no-log", &nolog,
 			 N_("no log for BISECT_WRITE")),
 		OPT_END()
@@ -955,18 +1085,7 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 	case BISECT_RESET:
 		if (argc > 1)
 			return error(_("--bisect-reset requires either no argument or a commit"));
-		return !!bisect_reset(argc ? argv[0] : NULL);
-	case BISECT_WRITE:
-		if (argc != 4 && argc != 5)
-			return error(_("--bisect-write requires either 4 or 5 arguments"));
-		set_terms(&terms, argv[3], argv[2]);
-		res = bisect_write(argv[0], argv[1], &terms, nolog);
-		break;
-	case CHECK_AND_SET_TERMS:
-		if (argc != 3)
-			return error(_("--check-and-set-terms requires 3 arguments"));
-		set_terms(&terms, argv[2], argv[1]);
-		res = check_and_set_terms(&terms, argv[0]);
+		res = bisect_reset(argc ? argv[0] : NULL);
 		break;
 	case BISECT_NEXT_CHECK:
 		if (argc != 2 && argc != 3)
@@ -989,17 +1108,26 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 		get_terms(&terms);
 		res = bisect_next(&terms, prefix);
 		break;
-	case BISECT_AUTO_NEXT:
-		if (argc)
-			return error(_("--bisect-auto-next requires 0 arguments"));
-		get_terms(&terms);
-		res = bisect_auto_next(&terms, prefix);
-		break;
 	case BISECT_STATE:
 		set_terms(&terms, "bad", "good");
 		get_terms(&terms);
 		res = bisect_state(&terms, argv, argc);
 		break;
+	case BISECT_LOG:
+		if (argc)
+			return error(_("--bisect-log requires 0 arguments"));
+		res = bisect_log();
+		break;
+	case BISECT_REPLAY:
+		if (argc != 1)
+			return error(_("no logfile given"));
+		set_terms(&terms, "bad", "good");
+		res = bisect_replay(&terms, argv[0]);
+		break;
+	case BISECT_SKIP:
+		set_terms(&terms, "bad", "good");
+		res = bisect_skip(&terms, argv, argc);
+		break;
 	default:
 		BUG("unknown subcommand %d", cmdmode);
 	}
diff --git a/builtin/blame.c b/builtin/blame.c
index 2c1c02c..641523f 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -425,13 +425,11 @@ static void setup_default_color_by_age(void)
 	parse_color_fields("blue,12 month ago,white,1 month ago,red");
 }
 
-static void determine_line_heat(struct blame_entry *ent, const char **dest_color)
+static void determine_line_heat(struct commit_info *ci, const char **dest_color)
 {
 	int i = 0;
-	struct commit_info ci;
-	get_commit_info(ent->suspect->commit, &ci, 1);
 
-	while (i < colorfield_nr && ci.author_time > colorfield[i].hop)
+	while (i < colorfield_nr && ci->author_time > colorfield[i].hop)
 		i++;
 
 	*dest_color = colorfield[i].col;
@@ -453,7 +451,7 @@ static void emit_other(struct blame_scoreboard *sb, struct blame_entry *ent, int
 	cp = blame_nth_line(sb, ent->lno);
 
 	if (opt & OUTPUT_SHOW_AGE_WITH_COLOR) {
-		determine_line_heat(ent, &default_color);
+		determine_line_heat(&ci, &default_color);
 		color = default_color;
 		reset = GIT_COLOR_RESET;
 	}
@@ -1151,7 +1149,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
 	sb.xdl_opts = xdl_opts;
 	sb.no_whole_file_rename = no_whole_file_rename;
 
-	read_mailmap(&mailmap, NULL);
+	read_mailmap(&mailmap);
 
 	sb.found_guilty_entry = &found_guilty_entry;
 	sb.found_guilty_entry_data = &pi;
diff --git a/builtin/branch.c b/builtin/branch.c
index 8c0b428..bcc00bc 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -202,6 +202,9 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
 	int remote_branch = 0;
 	struct strbuf bname = STRBUF_INIT;
 	unsigned allowed_interpret;
+	struct string_list refs_to_delete = STRING_LIST_INIT_DUP;
+	struct string_list_item *item;
+	int branch_name_pos;
 
 	switch (kinds) {
 	case FILTER_REFS_REMOTES:
@@ -219,6 +222,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
 	default:
 		die(_("cannot use -a with -d"));
 	}
+	branch_name_pos = strcspn(fmt, "%");
 
 	if (!force) {
 		head_rev = lookup_commit_reference(the_repository, &head_oid);
@@ -265,30 +269,35 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
 			goto next;
 		}
 
-		if (delete_ref(NULL, name, is_null_oid(&oid) ? NULL : &oid,
-			       REF_NO_DEREF)) {
-			error(remote_branch
-			      ? _("Error deleting remote-tracking branch '%s'")
-			      : _("Error deleting branch '%s'"),
-			      bname.buf);
-			ret = 1;
-			goto next;
-		}
-		if (!quiet) {
-			printf(remote_branch
-			       ? _("Deleted remote-tracking branch %s (was %s).\n")
-			       : _("Deleted branch %s (was %s).\n"),
-			       bname.buf,
-			       (flags & REF_ISBROKEN) ? "broken"
-			       : (flags & REF_ISSYMREF) ? target
-			       : find_unique_abbrev(&oid, DEFAULT_ABBREV));
-		}
-		delete_branch_config(bname.buf);
+		item = string_list_append(&refs_to_delete, name);
+		item->util = xstrdup((flags & REF_ISBROKEN) ? "broken"
+				    : (flags & REF_ISSYMREF) ? target
+				    : find_unique_abbrev(&oid, DEFAULT_ABBREV));
 
 	next:
 		free(target);
 	}
 
+	if (delete_refs(NULL, &refs_to_delete, REF_NO_DEREF))
+		ret = 1;
+
+	for_each_string_list_item(item, &refs_to_delete) {
+		char *describe_ref = item->util;
+		char *name = item->string;
+		if (!ref_exists(name)) {
+			char *refname = name + branch_name_pos;
+			if (!quiet)
+				printf(remote_branch
+					? _("Deleted remote-tracking branch %s (was %s).\n")
+					: _("Deleted branch %s (was %s).\n"),
+					name + branch_name_pos, describe_ref);
+
+			delete_branch_config(refname);
+		}
+		free(describe_ref);
+	}
+	string_list_clear(&refs_to_delete, 0);
+
 	free(name);
 	strbuf_release(&bname);
 
diff --git a/builtin/check-mailmap.c b/builtin/check-mailmap.c
index cdce144..7dc47e4 100644
--- a/builtin/check-mailmap.c
+++ b/builtin/check-mailmap.c
@@ -47,7 +47,7 @@ int cmd_check_mailmap(int argc, const char **argv, const char *prefix)
 	if (argc == 0 && !use_stdin)
 		die(_("no contacts specified"));
 
-	read_mailmap(&mailmap, NULL);
+	read_mailmap(&mailmap);
 
 	for (i = 0; i < argc; ++i)
 		check_mailmap(&mailmap, argv[i]);
diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c
index 4bbfc92..023e49e 100644
--- a/builtin/checkout-index.c
+++ b/builtin/checkout-index.c
@@ -23,22 +23,35 @@ static struct checkout state = CHECKOUT_INIT;
 static void write_tempfile_record(const char *name, const char *prefix)
 {
 	int i;
+	int have_tempname = 0;
 
 	if (CHECKOUT_ALL == checkout_stage) {
-		for (i = 1; i < 4; i++) {
-			if (i > 1)
-				putchar(' ');
-			if (topath[i][0])
-				fputs(topath[i], stdout);
-			else
-				putchar('.');
-		}
-	} else
-		fputs(topath[checkout_stage], stdout);
+		for (i = 1; i < 4; i++)
+			if (topath[i][0]) {
+				have_tempname = 1;
+				break;
+			}
 
-	putchar('\t');
-	write_name_quoted_relative(name, prefix, stdout,
-				   nul_term_line ? '\0' : '\n');
+		if (have_tempname) {
+			for (i = 1; i < 4; i++) {
+				if (i > 1)
+					putchar(' ');
+				if (topath[i][0])
+					fputs(topath[i], stdout);
+				else
+					putchar('.');
+			}
+		}
+	} else if (topath[checkout_stage][0]) {
+		have_tempname = 1;
+		fputs(topath[checkout_stage], stdout);
+	}
+
+	if (have_tempname) {
+		putchar('\t');
+		write_name_quoted_relative(name, prefix, stdout,
+					   nul_term_line ? '\0' : '\n');
+	}
 
 	for (i = 0; i < 4; i++) {
 		topath[i][0] = 0;
diff --git a/builtin/checkout.c b/builtin/checkout.c
index c9ba23c..2d6550b 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -821,9 +821,6 @@ static int merge_working_tree(const struct checkout_opts *opts,
 		}
 	}
 
-	if (!active_cache_tree)
-		active_cache_tree = cache_tree();
-
 	if (!cache_tree_fully_valid(active_cache_tree))
 		cache_tree_update(&the_index, WRITE_TREE_SILENT | WRITE_TREE_REPAIR);
 
diff --git a/builtin/clean.c b/builtin/clean.c
index 687ab47..995053b 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -623,7 +623,7 @@ static int *list_and_choose(struct menu_opts *opts, struct menu_stuff *stuff)
 				nr += chosen[i];
 		}
 
-		result = xcalloc(st_add(nr, 1), sizeof(int));
+		CALLOC_ARRAY(result, st_add(nr, 1));
 		for (i = 0; i < stuff->nr && j < nr; i++) {
 			if (chosen[i])
 				result[j++] = i;
diff --git a/builtin/clone.c b/builtin/clone.c
index e335734..51e844a 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -979,7 +979,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 	int err = 0, complete_refs_before_fetch = 1;
 	int submodule_progress;
 
-	struct strvec ref_prefixes = STRVEC_INIT;
+	struct transport_ls_refs_options transport_ls_refs_options =
+		TRANSPORT_LS_REFS_OPTIONS_INIT;
 
 	packet_trace_identity("clone");
 
@@ -1257,14 +1258,17 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 		transport->smart_options->check_self_contained_and_connected = 1;
 
 
-	strvec_push(&ref_prefixes, "HEAD");
-	refspec_ref_prefixes(&remote->fetch, &ref_prefixes);
+	strvec_push(&transport_ls_refs_options.ref_prefixes, "HEAD");
+	refspec_ref_prefixes(&remote->fetch,
+			     &transport_ls_refs_options.ref_prefixes);
 	if (option_branch)
-		expand_ref_prefix(&ref_prefixes, option_branch);
+		expand_ref_prefix(&transport_ls_refs_options.ref_prefixes,
+				  option_branch);
 	if (!option_no_tags)
-		strvec_push(&ref_prefixes, "refs/tags/");
+		strvec_push(&transport_ls_refs_options.ref_prefixes,
+			    "refs/tags/");
 
-	refs = transport_get_remote_refs(transport, &ref_prefixes);
+	refs = transport_get_remote_refs(transport, &transport_ls_refs_options);
 
 	if (refs) {
 		int hash_algo = hash_algo_by_ptr(transport_get_hash_algo(transport));
@@ -1326,8 +1330,19 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 		remote_head = NULL;
 		option_no_checkout = 1;
 		if (!option_bare) {
-			const char *branch = git_default_branch_name(0);
-			char *ref = xstrfmt("refs/heads/%s", branch);
+			const char *branch;
+			char *ref;
+
+			if (transport_ls_refs_options.unborn_head_target &&
+			    skip_prefix(transport_ls_refs_options.unborn_head_target,
+					"refs/heads/", &branch)) {
+				ref = transport_ls_refs_options.unborn_head_target;
+				transport_ls_refs_options.unborn_head_target = NULL;
+				create_symref("HEAD", ref, reflog_msg.buf);
+			} else {
+				branch = git_default_branch_name(0);
+				ref = xstrfmt("refs/heads/%s", branch);
+			}
 
 			install_branch_config(0, branch, remote_name, ref);
 			free(ref);
@@ -1380,6 +1395,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 	strbuf_release(&key);
 	junk_mode = JUNK_LEAVE_ALL;
 
-	strvec_clear(&ref_prefixes);
+	strvec_clear(&transport_ls_refs_options.ref_prefixes);
+	free(transport_ls_refs_options.unborn_head_target);
 	return err;
 }
diff --git a/builtin/commit.c b/builtin/commit.c
index 505fe60..739110c 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -1039,7 +1039,7 @@ static const char *find_author_by_nickname(const char *name)
 	av[++ac] = NULL;
 	setup_revisions(ac, av, &revs, NULL);
 	revs.mailmap = &mailmap;
-	read_mailmap(revs.mailmap, NULL);
+	read_mailmap(revs.mailmap);
 
 	if (prepare_revision_walk(&revs))
 		die(_("revision walk setup failed"));
diff --git a/builtin/describe.c b/builtin/describe.c
index 7668591..40482d8 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -194,7 +194,7 @@ static int get_name(const char *path, const struct object_id *oid, int flag, voi
 	}
 
 	/* Is it annotated? */
-	if (!peel_ref(path, &peeled)) {
+	if (!peel_iterated_oid(oid, &peeled)) {
 		is_annotated = !oideq(oid, &peeled);
 	} else {
 		oidcpy(&peeled, oid);
diff --git a/builtin/diff-files.c b/builtin/diff-files.c
index 1e352dd..70103c4 100644
--- a/builtin/diff-files.c
+++ b/builtin/diff-files.c
@@ -7,6 +7,7 @@
 #include "cache.h"
 #include "config.h"
 #include "diff.h"
+#include "diff-merges.h"
 #include "commit.h"
 #include "revision.h"
 #include "builtin.h"
@@ -35,7 +36,7 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)
 	 */
 	rev.diffopt.ita_invisible_in_index = 1;
 
-	precompose_argv(argc, argv);
+	prefix = precompose_argv_prefix(argc, argv, prefix);
 
 	argc = setup_revisions(argc, argv, &rev, NULL);
 	while (1 < argc && argv[1][0] == '-') {
@@ -53,6 +54,7 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)
 	}
 	if (!rev.diffopt.output_format)
 		rev.diffopt.output_format = DIFF_FORMAT_RAW;
+	rev.diffopt.rotate_to_strict = 1;
 
 	/*
 	 * Make sure there are NO revision (i.e. pending object) parameter,
@@ -69,9 +71,9 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)
 	 * was not asked to.  "diff-files -c -p" should not densify
 	 * (the user should ask with "diff-files --cc" explicitly).
 	 */
-	if (rev.max_count == -1 && !rev.combine_merges &&
+	if (rev.max_count == -1 &&
 	    (rev.diffopt.output_format & DIFF_FORMAT_PATCH))
-		rev.combine_merges = rev.dense_combined_merges = 1;
+		diff_merges_set_dense_combined_if_unset(&rev);
 
 	if (read_cache_preload(&rev.diffopt.pathspec) < 0) {
 		perror("read_cache_preload");
diff --git a/builtin/diff-index.c b/builtin/diff-index.c
index 7f5281c..176fe7f 100644
--- a/builtin/diff-index.c
+++ b/builtin/diff-index.c
@@ -25,7 +25,7 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)
 	git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
 	repo_init_revisions(the_repository, &rev, prefix);
 	rev.abbrev = 0;
-	precompose_argv(argc, argv);
+	prefix = precompose_argv_prefix(argc, argv, prefix);
 
 	argc = setup_revisions(argc, argv, &rev, NULL);
 	for (i = 1; i < argc; i++) {
@@ -41,6 +41,8 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)
 	if (!rev.diffopt.output_format)
 		rev.diffopt.output_format = DIFF_FORMAT_RAW;
 
+	rev.diffopt.rotate_to_strict = 1;
+
 	/*
 	 * Make sure there is one revision (i.e. pending object),
 	 * and there is no revision filtering parameters.
diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c
index 9fc95e9..f33d30d 100644
--- a/builtin/diff-tree.c
+++ b/builtin/diff-tree.c
@@ -126,7 +126,7 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
 	memset(&s_r_opt, 0, sizeof(s_r_opt));
 	s_r_opt.tweak = diff_tree_tweak_rev;
 
-	precompose_argv(argc, argv);
+	prefix = precompose_argv_prefix(argc, argv, prefix);
 	argc = setup_revisions(argc, argv, opt, &s_r_opt);
 
 	memset(&w, 0, sizeof(w));
@@ -156,6 +156,8 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
 	if (merge_base && opt->pending.nr != 2)
 		die(_("--merge-base only works with two commits"));
 
+	opt->diffopt.rotate_to_strict = 1;
+
 	/*
 	 * NOTE!  We expect "a..b" to expand to "^a b" but it is
 	 * perfectly valid for revision range parser to yield "b ^a",
@@ -192,6 +194,7 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
 		int saved_nrl = 0;
 		int saved_dcctc = 0;
 
+		opt->diffopt.rotate_to_strict = 0;
 		if (opt->diffopt.detect_rename) {
 			if (!the_index.cache)
 				repo_read_index(the_repository);
diff --git a/builtin/diff.c b/builtin/diff.c
index 780c338..617b9a4 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -13,6 +13,7 @@
 #include "blob.h"
 #include "tag.h"
 #include "diff.h"
+#include "diff-merges.h"
 #include "diffcore.h"
 #include "revision.h"
 #include "log-tree.h"
@@ -216,8 +217,8 @@ static int builtin_diff_combined(struct rev_info *revs,
 	if (argc > 1)
 		usage(builtin_diff_usage);
 
-	if (!revs->dense_combined_merges && !revs->combine_merges)
-		revs->dense_combined_merges = revs->combine_merges = 1;
+	diff_merges_set_dense_combined_if_unset(revs);
+
 	for (i = 1; i < ents; i++)
 		oid_array_append(&parents, &ent[i].item->oid);
 	diff_tree_combined(&ent[0].item->oid, &parents, revs);
@@ -265,9 +266,9 @@ static int builtin_diff_files(struct rev_info *revs, int argc, const char **argv
 	 * dense one, --cc can be explicitly asked for, or just rely
 	 * on the default).
 	 */
-	if (revs->max_count == -1 && !revs->combine_merges &&
+	if (revs->max_count == -1 &&
 	    (revs->diffopt.output_format & DIFF_FORMAT_PATCH))
-		revs->combine_merges = revs->dense_combined_merges = 1;
+		diff_merges_set_dense_combined_if_unset(revs);
 
 	setup_work_tree();
 	if (read_cache_preload(&revs->diffopt.pathspec) < 0) {
@@ -452,7 +453,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
 
 	init_diff_ui_defaults();
 	git_config(git_diff_ui_config, NULL);
-	precompose_argv(argc, argv);
+	prefix = precompose_argv_prefix(argc, argv, prefix);
 
 	repo_init_revisions(the_repository, &rev, prefix);
 
@@ -490,6 +491,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
 	}
 
 	rev.diffopt.flags.recursive = 1;
+	rev.diffopt.rotate_to_strict = 1;
 
 	setup_diff_pager(&rev.diffopt);
 
diff --git a/builtin/fast-import.c b/builtin/fast-import.c
index dd4d09c..3afa81c 100644
--- a/builtin/fast-import.c
+++ b/builtin/fast-import.c
@@ -3322,7 +3322,7 @@ static void option_rewrite_submodules(const char *arg, struct string_list *list)
 		die(_("Expected format name:filename for submodule rewrite option"));
 	*f = '\0';
 	f++;
-	ms = xcalloc(1, sizeof(*ms));
+	CALLOC_ARRAY(ms, 1);
 
 	fp = fopen(f, "r");
 	if (!fp)
@@ -3519,9 +3519,9 @@ int cmd_fast_import(int argc, const char **argv, const char *prefix)
 
 	alloc_objects(object_entry_alloc);
 	strbuf_init(&command_buf, 0);
-	atom_table = xcalloc(atom_table_sz, sizeof(struct atom_str*));
-	branch_table = xcalloc(branch_table_sz, sizeof(struct branch*));
-	avail_tree_table = xcalloc(avail_tree_table_sz, sizeof(struct avail_tree_content*));
+	CALLOC_ARRAY(atom_table, atom_table_sz);
+	CALLOC_ARRAY(branch_table, branch_table_sz);
+	CALLOC_ARRAY(avail_tree_table, avail_tree_table_sz);
 	marks = mem_pool_calloc(&fi_mem_pool, 1, sizeof(struct mark_set));
 
 	hashmap_init(&object_table, object_entry_hashcmp, NULL, 0);
diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c
index 58b7c1f..c2d96f4 100644
--- a/builtin/fetch-pack.c
+++ b/builtin/fetch-pack.c
@@ -220,7 +220,8 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
 	version = discover_version(&reader);
 	switch (version) {
 	case protocol_v2:
-		get_remote_refs(fd[1], &reader, &ref, 0, NULL, NULL, args.stateless_rpc);
+		get_remote_refs(fd[1], &reader, &ref, 0, NULL, NULL,
+				args.stateless_rpc);
 		break;
 	case protocol_v1:
 	case protocol_v0:
diff --git a/builtin/fetch.c b/builtin/fetch.c
index ecf8537..0b90de8 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -63,6 +63,7 @@ static int enable_auto_gc = 1;
 static int tags = TAGS_DEFAULT, unshallow, update_shallow, deepen;
 static int max_jobs = -1, submodule_fetch_jobs_config = -1;
 static int fetch_parallel_config = 1;
+static int atomic_fetch;
 static enum transport_family family;
 static const char *depth;
 static const char *deepen_since;
@@ -144,6 +145,8 @@ static struct option builtin_fetch_options[] = {
 		 N_("set upstream for git pull/fetch")),
 	OPT_BOOL('a', "append", &append,
 		 N_("append to .git/FETCH_HEAD instead of overwriting")),
+	OPT_BOOL(0, "atomic", &atomic_fetch,
+		 N_("use atomic transaction to update references")),
 	OPT_STRING(0, "upload-pack", &upload_pack, N_("path"),
 		   N_("path to upload pack on remote end")),
 	OPT__FORCE(&force, N_("force overwrite of local reference"), 0),
@@ -583,13 +586,14 @@ static struct ref *get_ref_map(struct remote *remote,
 
 static int s_update_ref(const char *action,
 			struct ref *ref,
+			struct ref_transaction *transaction,
 			int check_old)
 {
 	char *msg;
 	char *rla = getenv("GIT_REFLOG_ACTION");
-	struct ref_transaction *transaction;
+	struct ref_transaction *our_transaction = NULL;
 	struct strbuf err = STRBUF_INIT;
-	int ret, df_conflict = 0;
+	int ret;
 
 	if (dry_run)
 		return 0;
@@ -597,31 +601,47 @@ static int s_update_ref(const char *action,
 		rla = default_rla.buf;
 	msg = xstrfmt("%s: %s", rla, action);
 
-	transaction = ref_transaction_begin(&err);
-	if (!transaction ||
-	    ref_transaction_update(transaction, ref->name,
-				   &ref->new_oid,
-				   check_old ? &ref->old_oid : NULL,
-				   0, msg, &err))
-		goto fail;
-
-	ret = ref_transaction_commit(transaction, &err);
-	if (ret) {
-		df_conflict = (ret == TRANSACTION_NAME_CONFLICT);
-		goto fail;
+	/*
+	 * If no transaction was passed to us, we manage the transaction
+	 * ourselves. Otherwise, we trust the caller to handle the transaction
+	 * lifecycle.
+	 */
+	if (!transaction) {
+		transaction = our_transaction = ref_transaction_begin(&err);
+		if (!transaction) {
+			ret = STORE_REF_ERROR_OTHER;
+			goto out;
+		}
 	}
 
-	ref_transaction_free(transaction);
+	ret = ref_transaction_update(transaction, ref->name, &ref->new_oid,
+				     check_old ? &ref->old_oid : NULL,
+				     0, msg, &err);
+	if (ret) {
+		ret = STORE_REF_ERROR_OTHER;
+		goto out;
+	}
+
+	if (our_transaction) {
+		switch (ref_transaction_commit(our_transaction, &err)) {
+		case 0:
+			break;
+		case TRANSACTION_NAME_CONFLICT:
+			ret = STORE_REF_ERROR_DF_CONFLICT;
+			goto out;
+		default:
+			ret = STORE_REF_ERROR_OTHER;
+			goto out;
+		}
+	}
+
+out:
+	ref_transaction_free(our_transaction);
+	if (ret)
+		error("%s", err.buf);
 	strbuf_release(&err);
 	free(msg);
-	return 0;
-fail:
-	ref_transaction_free(transaction);
-	error("%s", err.buf);
-	strbuf_release(&err);
-	free(msg);
-	return df_conflict ? STORE_REF_ERROR_DF_CONFLICT
-			   : STORE_REF_ERROR_OTHER;
+	return ret;
 }
 
 static int refcol_width = 10;
@@ -759,6 +779,7 @@ static void format_display(struct strbuf *display, char code,
 }
 
 static int update_local_ref(struct ref *ref,
+			    struct ref_transaction *transaction,
 			    const char *remote,
 			    const struct ref *remote_ref,
 			    struct strbuf *display,
@@ -799,7 +820,7 @@ static int update_local_ref(struct ref *ref,
 	    starts_with(ref->name, "refs/tags/")) {
 		if (force || ref->force) {
 			int r;
-			r = s_update_ref("updating tag", ref, 0);
+			r = s_update_ref("updating tag", ref, transaction, 0);
 			format_display(display, r ? '!' : 't', _("[tag update]"),
 				       r ? _("unable to update local ref") : NULL,
 				       remote, pretty_ref, summary_width);
@@ -836,7 +857,7 @@ static int update_local_ref(struct ref *ref,
 			what = _("[new ref]");
 		}
 
-		r = s_update_ref(msg, ref, 0);
+		r = s_update_ref(msg, ref, transaction, 0);
 		format_display(display, r ? '!' : '*', what,
 			       r ? _("unable to update local ref") : NULL,
 			       remote, pretty_ref, summary_width);
@@ -858,7 +879,7 @@ static int update_local_ref(struct ref *ref,
 		strbuf_add_unique_abbrev(&quickref, &current->object.oid, DEFAULT_ABBREV);
 		strbuf_addstr(&quickref, "..");
 		strbuf_add_unique_abbrev(&quickref, &ref->new_oid, DEFAULT_ABBREV);
-		r = s_update_ref("fast-forward", ref, 1);
+		r = s_update_ref("fast-forward", ref, transaction, 1);
 		format_display(display, r ? '!' : ' ', quickref.buf,
 			       r ? _("unable to update local ref") : NULL,
 			       remote, pretty_ref, summary_width);
@@ -870,7 +891,7 @@ static int update_local_ref(struct ref *ref,
 		strbuf_add_unique_abbrev(&quickref, &current->object.oid, DEFAULT_ABBREV);
 		strbuf_addstr(&quickref, "...");
 		strbuf_add_unique_abbrev(&quickref, &ref->new_oid, DEFAULT_ABBREV);
-		r = s_update_ref("forced-update", ref, 1);
+		r = s_update_ref("forced-update", ref, transaction, 1);
 		format_display(display, r ? '!' : '+', quickref.buf,
 			       r ? _("unable to update local ref") : _("forced update"),
 			       remote, pretty_ref, summary_width);
@@ -897,6 +918,89 @@ static int iterate_ref_map(void *cb_data, struct object_id *oid)
 	return 0;
 }
 
+struct fetch_head {
+	FILE *fp;
+	struct strbuf buf;
+};
+
+static int open_fetch_head(struct fetch_head *fetch_head)
+{
+	const char *filename = git_path_fetch_head(the_repository);
+
+	if (write_fetch_head) {
+		fetch_head->fp = fopen(filename, "a");
+		if (!fetch_head->fp)
+			return error_errno(_("cannot open %s"), filename);
+		strbuf_init(&fetch_head->buf, 0);
+	} else {
+		fetch_head->fp = NULL;
+	}
+
+	return 0;
+}
+
+static void append_fetch_head(struct fetch_head *fetch_head,
+			      const struct object_id *old_oid,
+			      enum fetch_head_status fetch_head_status,
+			      const char *note,
+			      const char *url, size_t url_len)
+{
+	char old_oid_hex[GIT_MAX_HEXSZ + 1];
+	const char *merge_status_marker;
+	size_t i;
+
+	if (!fetch_head->fp)
+		return;
+
+	switch (fetch_head_status) {
+	case FETCH_HEAD_NOT_FOR_MERGE:
+		merge_status_marker = "not-for-merge";
+		break;
+	case FETCH_HEAD_MERGE:
+		merge_status_marker = "";
+		break;
+	default:
+		/* do not write anything to FETCH_HEAD */
+		return;
+	}
+
+	strbuf_addf(&fetch_head->buf, "%s\t%s\t%s",
+		    oid_to_hex_r(old_oid_hex, old_oid), merge_status_marker, note);
+	for (i = 0; i < url_len; ++i)
+		if ('\n' == url[i])
+			strbuf_addstr(&fetch_head->buf, "\\n");
+		else
+			strbuf_addch(&fetch_head->buf, url[i]);
+	strbuf_addch(&fetch_head->buf, '\n');
+
+	/*
+	 * When using an atomic fetch, we do not want to update FETCH_HEAD if
+	 * any of the reference updates fails. We thus have to write all
+	 * updates to a buffer first and only commit it as soon as all
+	 * references have been successfully updated.
+	 */
+	if (!atomic_fetch) {
+		strbuf_write(&fetch_head->buf, fetch_head->fp);
+		strbuf_reset(&fetch_head->buf);
+	}
+}
+
+static void commit_fetch_head(struct fetch_head *fetch_head)
+{
+	if (!fetch_head->fp || !atomic_fetch)
+		return;
+	strbuf_write(&fetch_head->buf, fetch_head->fp);
+}
+
+static void close_fetch_head(struct fetch_head *fetch_head)
+{
+	if (!fetch_head->fp)
+		return;
+
+	fclose(fetch_head->fp);
+	strbuf_release(&fetch_head->buf);
+}
+
 static const char warn_show_forced_updates[] =
 N_("Fetch normally indicates which branches had a forced update,\n"
    "but that check has been disabled. To re-enable, use '--show-forced-updates'\n"
@@ -909,22 +1013,20 @@ N_("It took %.2f seconds to check forced updates. You can use\n"
 static int store_updated_refs(const char *raw_url, const char *remote_name,
 			      int connectivity_checked, struct ref *ref_map)
 {
-	FILE *fp;
+	struct fetch_head fetch_head;
 	struct commit *commit;
 	int url_len, i, rc = 0;
-	struct strbuf note = STRBUF_INIT;
+	struct strbuf note = STRBUF_INIT, err = STRBUF_INIT;
+	struct ref_transaction *transaction = NULL;
 	const char *what, *kind;
 	struct ref *rm;
 	char *url;
-	const char *filename = (!write_fetch_head
-				? "/dev/null"
-				: git_path_fetch_head(the_repository));
 	int want_status;
 	int summary_width = transport_summary_width(ref_map);
 
-	fp = fopen(filename, "a");
-	if (!fp)
-		return error_errno(_("cannot open %s"), filename);
+	rc = open_fetch_head(&fetch_head);
+	if (rc)
+		return -1;
 
 	if (raw_url)
 		url = transport_anonymize_url(raw_url);
@@ -941,6 +1043,14 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 		}
 	}
 
+	if (atomic_fetch) {
+		transaction = ref_transaction_begin(&err);
+		if (!transaction) {
+			error("%s", err.buf);
+			goto abort;
+		}
+	}
+
 	prepare_format_display(ref_map);
 
 	/*
@@ -953,7 +1063,6 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 	     want_status++) {
 		for (rm = ref_map; rm; rm = rm->next) {
 			struct ref *ref = NULL;
-			const char *merge_status_marker = "";
 
 			if (rm->status == REF_STATUS_REJECT_SHALLOW) {
 				if (want_status == FETCH_HEAD_MERGE)
@@ -1011,31 +1120,15 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 					strbuf_addf(&note, "%s ", kind);
 				strbuf_addf(&note, "'%s' of ", what);
 			}
-			switch (rm->fetch_head_status) {
-			case FETCH_HEAD_NOT_FOR_MERGE:
-				merge_status_marker = "not-for-merge";
-				/* fall-through */
-			case FETCH_HEAD_MERGE:
-				fprintf(fp, "%s\t%s\t%s",
-					oid_to_hex(&rm->old_oid),
-					merge_status_marker,
-					note.buf);
-				for (i = 0; i < url_len; ++i)
-					if ('\n' == url[i])
-						fputs("\\n", fp);
-					else
-						fputc(url[i], fp);
-				fputc('\n', fp);
-				break;
-			default:
-				/* do not write anything to FETCH_HEAD */
-				break;
-			}
+
+			append_fetch_head(&fetch_head, &rm->old_oid,
+					  rm->fetch_head_status,
+					  note.buf, url, url_len);
 
 			strbuf_reset(&note);
 			if (ref) {
-				rc |= update_local_ref(ref, what, rm, &note,
-						       summary_width);
+				rc |= update_local_ref(ref, transaction, what,
+						       rm, &note, summary_width);
 				free(ref);
 			} else if (write_fetch_head || dry_run) {
 				/*
@@ -1060,6 +1153,17 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 		}
 	}
 
+	if (!rc && transaction) {
+		rc = ref_transaction_commit(transaction, &err);
+		if (rc) {
+			error("%s", err.buf);
+			goto abort;
+		}
+	}
+
+	if (!rc)
+		commit_fetch_head(&fetch_head);
+
 	if (rc & STORE_REF_ERROR_DF_CONFLICT)
 		error(_("some local refs could not be updated; try running\n"
 		      " 'git remote prune %s' to remove any old, conflicting "
@@ -1076,8 +1180,10 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 
  abort:
 	strbuf_release(&note);
+	strbuf_release(&err);
+	ref_transaction_free(transaction);
 	free(url);
-	fclose(fp);
+	close_fetch_head(&fetch_head);
 	return rc;
 }
 
@@ -1349,7 +1455,8 @@ static int do_fetch(struct transport *transport,
 	int autotags = (transport->remote->fetch_tags == 1);
 	int retcode = 0;
 	const struct ref *remote_refs;
-	struct strvec ref_prefixes = STRVEC_INIT;
+	struct transport_ls_refs_options transport_ls_refs_options =
+		TRANSPORT_LS_REFS_OPTIONS_INIT;
 	int must_list_refs = 1;
 
 	if (tags == TAGS_DEFAULT) {
@@ -1369,7 +1476,7 @@ static int do_fetch(struct transport *transport,
 	if (rs->nr) {
 		int i;
 
-		refspec_ref_prefixes(rs, &ref_prefixes);
+		refspec_ref_prefixes(rs, &transport_ls_refs_options.ref_prefixes);
 
 		/*
 		 * We can avoid listing refs if all of them are exact
@@ -1383,22 +1490,25 @@ static int do_fetch(struct transport *transport,
 			}
 		}
 	} else if (transport->remote && transport->remote->fetch.nr)
-		refspec_ref_prefixes(&transport->remote->fetch, &ref_prefixes);
+		refspec_ref_prefixes(&transport->remote->fetch,
+				     &transport_ls_refs_options.ref_prefixes);
 
 	if (tags == TAGS_SET || tags == TAGS_DEFAULT) {
 		must_list_refs = 1;
-		if (ref_prefixes.nr)
-			strvec_push(&ref_prefixes, "refs/tags/");
+		if (transport_ls_refs_options.ref_prefixes.nr)
+			strvec_push(&transport_ls_refs_options.ref_prefixes,
+				    "refs/tags/");
 	}
 
 	if (must_list_refs) {
 		trace2_region_enter("fetch", "remote_refs", the_repository);
-		remote_refs = transport_get_remote_refs(transport, &ref_prefixes);
+		remote_refs = transport_get_remote_refs(transport,
+							&transport_ls_refs_options);
 		trace2_region_leave("fetch", "remote_refs", the_repository);
 	} else
 		remote_refs = NULL;
 
-	strvec_clear(&ref_prefixes);
+	strvec_clear(&transport_ls_refs_options.ref_prefixes);
 
 	ref_map = get_ref_map(transport->remote, remote_refs, rs,
 			      tags, &autotags);
@@ -1887,6 +1997,10 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
 			die(_("--filter can only be used with the remote "
 			      "configured in extensions.partialclone"));
 
+		if (atomic_fetch)
+			die(_("--atomic can only be used when fetching "
+			      "from one remote"));
+
 		if (stdin_refspecs)
 			die(_("--stdin can only be used when fetching "
 			      "from one remote"));
diff --git a/builtin/fsck.c b/builtin/fsck.c
index fbf26ca..821e779 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -73,25 +73,7 @@ static const char *printable_type(const struct object_id *oid,
 
 static int fsck_config(const char *var, const char *value, void *cb)
 {
-	if (strcmp(var, "fsck.skiplist") == 0) {
-		const char *path;
-		struct strbuf sb = STRBUF_INIT;
-
-		if (git_config_pathname(&path, var, value))
-			return 1;
-		strbuf_addf(&sb, "skiplist=%s", path);
-		free((char *)path);
-		fsck_set_msg_types(&fsck_obj_options, sb.buf);
-		strbuf_release(&sb);
-		return 0;
-	}
-
-	if (skip_prefix(var, "fsck.", &var)) {
-		fsck_set_msg_type(&fsck_obj_options, var, value);
-		return 0;
-	}
-
-	return git_default_config(var, value, cb);
+	return fsck_config_internal(var, value, cb, &fsck_obj_options);
 }
 
 static int objerror(struct object *obj, const char *err)
diff --git a/builtin/gc.c b/builtin/gc.c
index 64f2b52..ef7226d 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -54,7 +54,6 @@ static const char *prune_worktrees_expire = "3.months.ago";
 static unsigned long big_pack_threshold;
 static unsigned long max_delta_cache_size = DEFAULT_DELTA_CACHE_SIZE;
 
-static struct strvec pack_refs_cmd = STRVEC_INIT;
 static struct strvec reflog = STRVEC_INIT;
 static struct strvec repack = STRVEC_INIT;
 static struct strvec prune = STRVEC_INIT;
@@ -163,6 +162,15 @@ static void gc_config(void)
 	git_config(git_default_config, NULL);
 }
 
+struct maintenance_run_opts;
+static int maintenance_task_pack_refs(MAYBE_UNUSED struct maintenance_run_opts *opts)
+{
+	struct strvec pack_refs_cmd = STRVEC_INIT;
+	strvec_pushl(&pack_refs_cmd, "pack-refs", "--all", "--prune", NULL);
+
+	return run_command_v_opt(pack_refs_cmd.v, RUN_GIT_CMD);
+}
+
 static int too_many_loose_objects(void)
 {
 	/*
@@ -301,7 +309,7 @@ static uint64_t estimate_repack_memory(struct packed_git *pack)
 	/* and then obj_hash[], underestimated in fact */
 	heap += sizeof(struct object *) * nr_objects;
 	/* revindex is used also */
-	heap += sizeof(struct revindex_entry) * nr_objects;
+	heap += (sizeof(off_t) + sizeof(uint32_t)) * nr_objects;
 	/*
 	 * read_sha1_file() (either at delta calculation phase, or
 	 * writing phase) also fills up the delta base cache
@@ -518,8 +526,8 @@ static void gc_before_repack(void)
 	if (done++)
 		return;
 
-	if (pack_refs && run_command_v_opt(pack_refs_cmd.v, RUN_GIT_CMD))
-		die(FAILED_RUN, pack_refs_cmd.v[0]);
+	if (pack_refs && maintenance_task_pack_refs(NULL))
+		die(FAILED_RUN, "pack-refs");
 
 	if (prune_reflogs && run_command_v_opt(reflog.v, RUN_GIT_CMD))
 		die(FAILED_RUN, reflog.v[0]);
@@ -556,7 +564,6 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
 	if (argc == 2 && !strcmp(argv[1], "-h"))
 		usage_with_options(builtin_gc_usage, builtin_gc_options);
 
-	strvec_pushl(&pack_refs_cmd, "pack-refs", "--all", "--prune", NULL);
 	strvec_pushl(&reflog, "reflog", "expire", "--all", NULL);
 	strvec_pushl(&repack, "repack", "-d", "-l", NULL);
 	strvec_pushl(&prune, "prune", "--expire", NULL);
@@ -769,7 +776,7 @@ static int dfs_on_ref(const char *refname,
 	struct commit_list *stack = NULL;
 	struct commit *commit;
 
-	if (!peel_ref(refname, &peeled))
+	if (!peel_iterated_oid(oid, &peeled))
 		oid = &peeled;
 	if (oid_object_info(the_repository, oid, NULL) != OBJ_COMMIT)
 		return 0;
@@ -897,6 +904,12 @@ static int maintenance_task_prefetch(struct maintenance_run_opts *opts)
 	struct string_list_item *item;
 	struct string_list remotes = STRING_LIST_INIT_DUP;
 
+	git_config_set_multivar_gently("log.excludedecoration",
+					"refs/prefetch/",
+					"refs/prefetch/",
+					CONFIG_FLAGS_FIXED_VALUE |
+					CONFIG_FLAGS_MULTI_REPLACE);
+
 	if (for_each_remote(append_remote, &remotes)) {
 		error(_("failed to fill remotes"));
 		result = 1;
@@ -1218,6 +1231,7 @@ enum maintenance_task_label {
 	TASK_INCREMENTAL_REPACK,
 	TASK_GC,
 	TASK_COMMIT_GRAPH,
+	TASK_PACK_REFS,
 
 	/* Leave as final value */
 	TASK__COUNT
@@ -1249,6 +1263,11 @@ static struct maintenance_task tasks[] = {
 		maintenance_task_commit_graph,
 		should_write_commit_graph,
 	},
+	[TASK_PACK_REFS] = {
+		"pack-refs",
+		maintenance_task_pack_refs,
+		NULL,
+	},
 };
 
 static int compare_tasks_by_selection(const void *a_, const void *b_)
@@ -1333,6 +1352,8 @@ static void initialize_maintenance_strategy(void)
 		tasks[TASK_INCREMENTAL_REPACK].schedule = SCHEDULE_DAILY;
 		tasks[TASK_LOOSE_OBJECTS].enabled = 1;
 		tasks[TASK_LOOSE_OBJECTS].schedule = SCHEDULE_DAILY;
+		tasks[TASK_PACK_REFS].enabled = 1;
+		tasks[TASK_PACK_REFS].schedule = SCHEDULE_WEEKLY;
 	}
 }
 
@@ -1440,11 +1461,23 @@ static int maintenance_run(int argc, const char **argv, const char *prefix)
 	return maintenance_run_tasks(&opts);
 }
 
+static char *get_maintpath(void)
+{
+	struct strbuf sb = STRBUF_INIT;
+	const char *p = the_repository->worktree ?
+		the_repository->worktree : the_repository->gitdir;
+
+	strbuf_realpath(&sb, p, 1);
+	return strbuf_detach(&sb, NULL);
+}
+
 static int maintenance_register(void)
 {
+	int rc;
 	char *config_value;
 	struct child_process config_set = CHILD_PROCESS_INIT;
 	struct child_process config_get = CHILD_PROCESS_INIT;
+	char *maintpath = get_maintpath();
 
 	/* Disable foreground maintenance */
 	git_config_set("maintenance.auto", "false");
@@ -1457,74 +1490,408 @@ static int maintenance_register(void)
 
 	config_get.git_cmd = 1;
 	strvec_pushl(&config_get.args, "config", "--global", "--get",
-		     "--fixed-value", "maintenance.repo",
-		     the_repository->worktree ? the_repository->worktree
-					      : the_repository->gitdir,
-			 NULL);
+		     "--fixed-value", "maintenance.repo", maintpath, NULL);
 	config_get.out = -1;
 
-	if (start_command(&config_get))
-		return error(_("failed to run 'git config'"));
+	if (start_command(&config_get)) {
+		rc = error(_("failed to run 'git config'"));
+		goto done;
+	}
 
 	/* We already have this value in our config! */
-	if (!finish_command(&config_get))
-		return 0;
+	if (!finish_command(&config_get)) {
+		rc = 0;
+		goto done;
+	}
 
 	config_set.git_cmd = 1;
 	strvec_pushl(&config_set.args, "config", "--add", "--global", "maintenance.repo",
-		     the_repository->worktree ? the_repository->worktree
-					      : the_repository->gitdir,
-		     NULL);
+		     maintpath, NULL);
 
-	return run_command(&config_set);
+	rc = run_command(&config_set);
+
+done:
+	free(maintpath);
+	return rc;
 }
 
 static int maintenance_unregister(void)
 {
+	int rc;
 	struct child_process config_unset = CHILD_PROCESS_INIT;
+	char *maintpath = get_maintpath();
 
 	config_unset.git_cmd = 1;
 	strvec_pushl(&config_unset.args, "config", "--global", "--unset",
-		     "--fixed-value", "maintenance.repo",
-		     the_repository->worktree ? the_repository->worktree
-					      : the_repository->gitdir,
-		     NULL);
+		     "--fixed-value", "maintenance.repo", maintpath, NULL);
 
-	return run_command(&config_unset);
+	rc = run_command(&config_unset);
+	free(maintpath);
+	return rc;
+}
+
+static const char *get_frequency(enum schedule_priority schedule)
+{
+	switch (schedule) {
+	case SCHEDULE_HOURLY:
+		return "hourly";
+	case SCHEDULE_DAILY:
+		return "daily";
+	case SCHEDULE_WEEKLY:
+		return "weekly";
+	default:
+		BUG("invalid schedule %d", schedule);
+	}
+}
+
+static char *launchctl_service_name(const char *frequency)
+{
+	struct strbuf label = STRBUF_INIT;
+	strbuf_addf(&label, "org.git-scm.git.%s", frequency);
+	return strbuf_detach(&label, NULL);
+}
+
+static char *launchctl_service_filename(const char *name)
+{
+	char *expanded;
+	struct strbuf filename = STRBUF_INIT;
+	strbuf_addf(&filename, "~/Library/LaunchAgents/%s.plist", name);
+
+	expanded = expand_user_path(filename.buf, 1);
+	if (!expanded)
+		die(_("failed to expand path '%s'"), filename.buf);
+
+	strbuf_release(&filename);
+	return expanded;
+}
+
+static char *launchctl_get_uid(void)
+{
+	return xstrfmt("gui/%d", getuid());
+}
+
+static int launchctl_boot_plist(int enable, const char *filename, const char *cmd)
+{
+	int result;
+	struct child_process child = CHILD_PROCESS_INIT;
+	char *uid = launchctl_get_uid();
+
+	strvec_split(&child.args, cmd);
+	if (enable)
+		strvec_push(&child.args, "bootstrap");
+	else
+		strvec_push(&child.args, "bootout");
+	strvec_push(&child.args, uid);
+	strvec_push(&child.args, filename);
+
+	child.no_stderr = 1;
+	child.no_stdout = 1;
+
+	if (start_command(&child))
+		die(_("failed to start launchctl"));
+
+	result = finish_command(&child);
+
+	free(uid);
+	return result;
+}
+
+static int launchctl_remove_plist(enum schedule_priority schedule, const char *cmd)
+{
+	const char *frequency = get_frequency(schedule);
+	char *name = launchctl_service_name(frequency);
+	char *filename = launchctl_service_filename(name);
+	int result = launchctl_boot_plist(0, filename, cmd);
+	unlink(filename);
+	free(filename);
+	free(name);
+	return result;
+}
+
+static int launchctl_remove_plists(const char *cmd)
+{
+	return launchctl_remove_plist(SCHEDULE_HOURLY, cmd) ||
+		launchctl_remove_plist(SCHEDULE_DAILY, cmd) ||
+		launchctl_remove_plist(SCHEDULE_WEEKLY, cmd);
+}
+
+static int launchctl_schedule_plist(const char *exec_path, enum schedule_priority schedule, const char *cmd)
+{
+	FILE *plist;
+	int i;
+	const char *preamble, *repeat;
+	const char *frequency = get_frequency(schedule);
+	char *name = launchctl_service_name(frequency);
+	char *filename = launchctl_service_filename(name);
+
+	if (safe_create_leading_directories(filename))
+		die(_("failed to create directories for '%s'"), filename);
+	plist = xfopen(filename, "w");
+
+	preamble = "<?xml version=\"1.0\"?>\n"
+		   "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
+		   "<plist version=\"1.0\">"
+		   "<dict>\n"
+		   "<key>Label</key><string>%s</string>\n"
+		   "<key>ProgramArguments</key>\n"
+		   "<array>\n"
+		   "<string>%s/git</string>\n"
+		   "<string>--exec-path=%s</string>\n"
+		   "<string>for-each-repo</string>\n"
+		   "<string>--config=maintenance.repo</string>\n"
+		   "<string>maintenance</string>\n"
+		   "<string>run</string>\n"
+		   "<string>--schedule=%s</string>\n"
+		   "</array>\n"
+		   "<key>StartCalendarInterval</key>\n"
+		   "<array>\n";
+	fprintf(plist, preamble, name, exec_path, exec_path, frequency);
+
+	switch (schedule) {
+	case SCHEDULE_HOURLY:
+		repeat = "<dict>\n"
+			 "<key>Hour</key><integer>%d</integer>\n"
+			 "<key>Minute</key><integer>0</integer>\n"
+			 "</dict>\n";
+		for (i = 1; i <= 23; i++)
+			fprintf(plist, repeat, i);
+		break;
+
+	case SCHEDULE_DAILY:
+		repeat = "<dict>\n"
+			 "<key>Day</key><integer>%d</integer>\n"
+			 "<key>Hour</key><integer>0</integer>\n"
+			 "<key>Minute</key><integer>0</integer>\n"
+			 "</dict>\n";
+		for (i = 1; i <= 6; i++)
+			fprintf(plist, repeat, i);
+		break;
+
+	case SCHEDULE_WEEKLY:
+		fprintf(plist,
+			"<dict>\n"
+			"<key>Day</key><integer>0</integer>\n"
+			"<key>Hour</key><integer>0</integer>\n"
+			"<key>Minute</key><integer>0</integer>\n"
+			"</dict>\n");
+		break;
+
+	default:
+		/* unreachable */
+		break;
+	}
+	fprintf(plist, "</array>\n</dict>\n</plist>\n");
+	fclose(plist);
+
+	/* bootout might fail if not already running, so ignore */
+	launchctl_boot_plist(0, filename, cmd);
+	if (launchctl_boot_plist(1, filename, cmd))
+		die(_("failed to bootstrap service %s"), filename);
+
+	free(filename);
+	free(name);
+	return 0;
+}
+
+static int launchctl_add_plists(const char *cmd)
+{
+	const char *exec_path = git_exec_path();
+
+	return launchctl_schedule_plist(exec_path, SCHEDULE_HOURLY, cmd) ||
+		launchctl_schedule_plist(exec_path, SCHEDULE_DAILY, cmd) ||
+		launchctl_schedule_plist(exec_path, SCHEDULE_WEEKLY, cmd);
+}
+
+static int launchctl_update_schedule(int run_maintenance, int fd, const char *cmd)
+{
+	if (run_maintenance)
+		return launchctl_add_plists(cmd);
+	else
+		return launchctl_remove_plists(cmd);
+}
+
+static char *schtasks_task_name(const char *frequency)
+{
+	struct strbuf label = STRBUF_INIT;
+	strbuf_addf(&label, "Git Maintenance (%s)", frequency);
+	return strbuf_detach(&label, NULL);
+}
+
+static int schtasks_remove_task(enum schedule_priority schedule, const char *cmd)
+{
+	int result;
+	struct strvec args = STRVEC_INIT;
+	const char *frequency = get_frequency(schedule);
+	char *name = schtasks_task_name(frequency);
+
+	strvec_split(&args, cmd);
+	strvec_pushl(&args, "/delete", "/tn", name, "/f", NULL);
+
+	result = run_command_v_opt(args.v, 0);
+
+	strvec_clear(&args);
+	free(name);
+	return result;
+}
+
+static int schtasks_remove_tasks(const char *cmd)
+{
+	return schtasks_remove_task(SCHEDULE_HOURLY, cmd) ||
+		schtasks_remove_task(SCHEDULE_DAILY, cmd) ||
+		schtasks_remove_task(SCHEDULE_WEEKLY, cmd);
+}
+
+static int schtasks_schedule_task(const char *exec_path, enum schedule_priority schedule, const char *cmd)
+{
+	int result;
+	struct child_process child = CHILD_PROCESS_INIT;
+	const char *xml;
+	struct tempfile *tfile;
+	const char *frequency = get_frequency(schedule);
+	char *name = schtasks_task_name(frequency);
+	struct strbuf tfilename = STRBUF_INIT;
+
+	strbuf_addf(&tfilename, "%s/schedule_%s_XXXXXX",
+		    get_git_common_dir(), frequency);
+	tfile = xmks_tempfile(tfilename.buf);
+	strbuf_release(&tfilename);
+
+	if (!fdopen_tempfile(tfile, "w"))
+		die(_("failed to create temp xml file"));
+
+	xml = "<?xml version=\"1.0\" ?>\n"
+	      "<Task version=\"1.4\" xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n"
+	      "<Triggers>\n"
+	      "<CalendarTrigger>\n";
+	fputs(xml, tfile->fp);
+
+	switch (schedule) {
+	case SCHEDULE_HOURLY:
+		fprintf(tfile->fp,
+			"<StartBoundary>2020-01-01T01:00:00</StartBoundary>\n"
+			"<Enabled>true</Enabled>\n"
+			"<ScheduleByDay>\n"
+			"<DaysInterval>1</DaysInterval>\n"
+			"</ScheduleByDay>\n"
+			"<Repetition>\n"
+			"<Interval>PT1H</Interval>\n"
+			"<Duration>PT23H</Duration>\n"
+			"<StopAtDurationEnd>false</StopAtDurationEnd>\n"
+			"</Repetition>\n");
+		break;
+
+	case SCHEDULE_DAILY:
+		fprintf(tfile->fp,
+			"<StartBoundary>2020-01-01T00:00:00</StartBoundary>\n"
+			"<Enabled>true</Enabled>\n"
+			"<ScheduleByWeek>\n"
+			"<DaysOfWeek>\n"
+			"<Monday />\n"
+			"<Tuesday />\n"
+			"<Wednesday />\n"
+			"<Thursday />\n"
+			"<Friday />\n"
+			"<Saturday />\n"
+			"</DaysOfWeek>\n"
+			"<WeeksInterval>1</WeeksInterval>\n"
+			"</ScheduleByWeek>\n");
+		break;
+
+	case SCHEDULE_WEEKLY:
+		fprintf(tfile->fp,
+			"<StartBoundary>2020-01-01T00:00:00</StartBoundary>\n"
+			"<Enabled>true</Enabled>\n"
+			"<ScheduleByWeek>\n"
+			"<DaysOfWeek>\n"
+			"<Sunday />\n"
+			"</DaysOfWeek>\n"
+			"<WeeksInterval>1</WeeksInterval>\n"
+			"</ScheduleByWeek>\n");
+		break;
+
+	default:
+		break;
+	}
+
+	xml = "</CalendarTrigger>\n"
+	      "</Triggers>\n"
+	      "<Principals>\n"
+	      "<Principal id=\"Author\">\n"
+	      "<LogonType>InteractiveToken</LogonType>\n"
+	      "<RunLevel>LeastPrivilege</RunLevel>\n"
+	      "</Principal>\n"
+	      "</Principals>\n"
+	      "<Settings>\n"
+	      "<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>\n"
+	      "<Enabled>true</Enabled>\n"
+	      "<Hidden>true</Hidden>\n"
+	      "<UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>\n"
+	      "<WakeToRun>false</WakeToRun>\n"
+	      "<ExecutionTimeLimit>PT72H</ExecutionTimeLimit>\n"
+	      "<Priority>7</Priority>\n"
+	      "</Settings>\n"
+	      "<Actions Context=\"Author\">\n"
+	      "<Exec>\n"
+	      "<Command>\"%s\\git.exe\"</Command>\n"
+	      "<Arguments>--exec-path=\"%s\" for-each-repo --config=maintenance.repo maintenance run --schedule=%s</Arguments>\n"
+	      "</Exec>\n"
+	      "</Actions>\n"
+	      "</Task>\n";
+	fprintf(tfile->fp, xml, exec_path, exec_path, frequency);
+	strvec_split(&child.args, cmd);
+	strvec_pushl(&child.args, "/create", "/tn", name, "/f", "/xml",
+				  get_tempfile_path(tfile), NULL);
+	close_tempfile_gently(tfile);
+
+	child.no_stdout = 1;
+	child.no_stderr = 1;
+
+	if (start_command(&child))
+		die(_("failed to start schtasks"));
+	result = finish_command(&child);
+
+	delete_tempfile(&tfile);
+	free(name);
+	return result;
+}
+
+static int schtasks_schedule_tasks(const char *cmd)
+{
+	const char *exec_path = git_exec_path();
+
+	return schtasks_schedule_task(exec_path, SCHEDULE_HOURLY, cmd) ||
+		schtasks_schedule_task(exec_path, SCHEDULE_DAILY, cmd) ||
+		schtasks_schedule_task(exec_path, SCHEDULE_WEEKLY, cmd);
+}
+
+static int schtasks_update_schedule(int run_maintenance, int fd, const char *cmd)
+{
+	if (run_maintenance)
+		return schtasks_schedule_tasks(cmd);
+	else
+		return schtasks_remove_tasks(cmd);
 }
 
 #define BEGIN_LINE "# BEGIN GIT MAINTENANCE SCHEDULE"
 #define END_LINE "# END GIT MAINTENANCE SCHEDULE"
 
-static int update_background_schedule(int run_maintenance)
+static int crontab_update_schedule(int run_maintenance, int fd, const char *cmd)
 {
 	int result = 0;
 	int in_old_region = 0;
 	struct child_process crontab_list = CHILD_PROCESS_INIT;
 	struct child_process crontab_edit = CHILD_PROCESS_INIT;
 	FILE *cron_list, *cron_in;
-	const char *crontab_name;
 	struct strbuf line = STRBUF_INIT;
-	struct lock_file lk;
-	char *lock_path = xstrfmt("%s/schedule", the_repository->objects->odb->path);
 
-	if (hold_lock_file_for_update(&lk, lock_path, LOCK_NO_DEREF) < 0)
-		return error(_("another process is scheduling background maintenance"));
-
-	crontab_name = getenv("GIT_TEST_CRONTAB");
-	if (!crontab_name)
-		crontab_name = "crontab";
-
-	strvec_split(&crontab_list.args, crontab_name);
+	strvec_split(&crontab_list.args, cmd);
 	strvec_push(&crontab_list.args, "-l");
 	crontab_list.in = -1;
-	crontab_list.out = dup(get_lock_file_fd(&lk));
+	crontab_list.out = dup(fd);
 	crontab_list.git_cmd = 0;
 
-	if (start_command(&crontab_list)) {
-		result = error(_("failed to run 'crontab -l'; your system might not support 'cron'"));
-		goto cleanup;
-	}
+	if (start_command(&crontab_list))
+		return error(_("failed to run 'crontab -l'; your system might not support 'cron'"));
 
 	/* Ignore exit code, as an empty crontab will return error. */
 	finish_command(&crontab_list);
@@ -1533,17 +1900,15 @@ static int update_background_schedule(int run_maintenance)
 	 * Read from the .lock file, filtering out the old
 	 * schedule while appending the new schedule.
 	 */
-	cron_list = fdopen(get_lock_file_fd(&lk), "r");
+	cron_list = fdopen(fd, "r");
 	rewind(cron_list);
 
-	strvec_split(&crontab_edit.args, crontab_name);
+	strvec_split(&crontab_edit.args, cmd);
 	crontab_edit.in = -1;
 	crontab_edit.git_cmd = 0;
 
-	if (start_command(&crontab_edit)) {
-		result = error(_("failed to run 'crontab'; your system might not support 'cron'"));
-		goto cleanup;
-	}
+	if (start_command(&crontab_edit))
+		return error(_("failed to run 'crontab'; your system might not support 'cron'"));
 
 	cron_in = fdopen(crontab_edit.in, "w");
 	if (!cron_in) {
@@ -1587,14 +1952,54 @@ static int update_background_schedule(int run_maintenance)
 	close(crontab_edit.in);
 
 done_editing:
-	if (finish_command(&crontab_edit)) {
+	if (finish_command(&crontab_edit))
 		result = error(_("'crontab' died"));
-		goto cleanup;
-	}
-	fclose(cron_list);
+	else
+		fclose(cron_list);
+	return result;
+}
 
-cleanup:
+#if defined(__APPLE__)
+static const char platform_scheduler[] = "launchctl";
+#elif defined(GIT_WINDOWS_NATIVE)
+static const char platform_scheduler[] = "schtasks";
+#else
+static const char platform_scheduler[] = "crontab";
+#endif
+
+static int update_background_schedule(int enable)
+{
+	int result;
+	const char *scheduler = platform_scheduler;
+	const char *cmd = scheduler;
+	char *testing;
+	struct lock_file lk;
+	char *lock_path = xstrfmt("%s/schedule", the_repository->objects->odb->path);
+
+	testing = xstrdup_or_null(getenv("GIT_TEST_MAINT_SCHEDULER"));
+	if (testing) {
+		char *sep = strchr(testing, ':');
+		if (!sep)
+			die("GIT_TEST_MAINT_SCHEDULER unparseable: %s", testing);
+		*sep = '\0';
+		scheduler = testing;
+		cmd = sep + 1;
+	}
+
+	if (hold_lock_file_for_update(&lk, lock_path, LOCK_NO_DEREF) < 0)
+		return error(_("another process is scheduling background maintenance"));
+
+	if (!strcmp(scheduler, "launchctl"))
+		result = launchctl_update_schedule(enable, get_lock_file_fd(&lk), cmd);
+	else if (!strcmp(scheduler, "schtasks"))
+		result = schtasks_update_schedule(enable, get_lock_file_fd(&lk), cmd);
+	else if (!strcmp(scheduler, "crontab"))
+		result = crontab_update_schedule(enable, get_lock_file_fd(&lk), cmd);
+	else
+		die("unknown background scheduler: %s", scheduler);
+
 	rollback_lock_file(&lk);
+	free(testing);
 	return result;
 }
 
diff --git a/builtin/grep.c b/builtin/grep.c
index ca259af..ccd8d08 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -211,13 +211,11 @@ static void start_threads(struct grep_opt *opt)
 		strbuf_init(&todo[i].out, 0);
 	}
 
-	threads = xcalloc(num_threads, sizeof(*threads));
+	CALLOC_ARRAY(threads, num_threads);
 	for (i = 0; i < num_threads; i++) {
 		int err;
 		struct grep_opt *o = grep_opt_dup(opt);
 		o->output = strbuf_out;
-		if (i)
-			o->debug = 0;
 		compile_grep_patterns(o);
 		err = pthread_create(&threads[i], NULL, run, o);
 
@@ -508,6 +506,10 @@ static int grep_cache(struct grep_opt *opt,
 
 	for (nr = 0; nr < repo->index->cache_nr; nr++) {
 		const struct cache_entry *ce = repo->index->cache[nr];
+
+		if (!cached && ce_skip_worktree(ce))
+			continue;
+
 		strbuf_setlen(&name, name_base_len);
 		strbuf_addstr(&name, ce->name);
 
@@ -520,8 +522,7 @@ static int grep_cache(struct grep_opt *opt,
 			 * cache entry are identical, even if worktree file has
 			 * been modified, so use cache version instead
 			 */
-			if (cached || (ce->ce_flags & CE_VALID) ||
-			    ce_skip_worktree(ce)) {
+			if (cached || (ce->ce_flags & CE_VALID)) {
 				if (ce_stage(ce) || ce_intent_to_add(ce))
 					continue;
 				hit |= grep_oid(opt, &ce->oid, name.buf,
@@ -936,9 +937,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 			   N_("indicate hit with exit status without output")),
 		OPT_BOOL(0, "all-match", &opt.all_match,
 			N_("show only matches from files that match all patterns")),
-		OPT_SET_INT_F(0, "debug", &opt.debug,
-			      N_("show parse tree for grep expression"),
-			      1, PARSE_OPT_HIDDEN),
 		OPT_GROUP(""),
 		{ OPTION_STRING, 'O', "open-files-in-pager", &show_in_pager,
 			N_("pager"), N_("show matching files in the pager"),
@@ -1157,6 +1155,9 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 	if (!use_index && (untracked || cached))
 		die(_("--cached or --untracked cannot be used with --no-index"));
 
+	if (untracked && cached)
+		die(_("--untracked cannot be used with --cached"));
+
 	if (!use_index || untracked) {
 		int use_exclude = (opt_exclude < 0) ? use_index : !!opt_exclude;
 		hit = grep_directory(&opt, &pathspec, use_exclude, use_index);
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 4b8d86e..2189968 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -17,7 +17,7 @@
 #include "promisor-remote.h"
 
 static const char index_pack_usage[] =
-"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
+"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
 
 struct object_entry {
 	struct pack_idx_entry idx;
@@ -185,7 +185,7 @@ static void init_thread(void)
 	if (show_stat)
 		pthread_mutex_init(&deepest_delta_mutex, NULL);
 	pthread_key_create(&key, NULL);
-	thread_data = xcalloc(nr_threads, sizeof(*thread_data));
+	CALLOC_ARRAY(thread_data, nr_threads);
 	for (i = 0; i < nr_threads; i++) {
 		thread_data[i].pack_fd = open(curr_pack, O_RDONLY);
 		if (thread_data[i].pack_fd == -1)
@@ -1436,15 +1436,15 @@ static void fix_unresolved_deltas(struct hashfile *f)
 	free(sorted_by_pos);
 }
 
-static const char *derive_filename(const char *pack_name, const char *suffix,
-				   struct strbuf *buf)
+static const char *derive_filename(const char *pack_name, const char *strip,
+				   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);
+	if (!strip_suffix(pack_name, strip, &len) || !len ||
+	    pack_name[len - 1] != '.')
+		die(_("packfile name '%s' does not end with '.%s'"),
+		    pack_name, strip);
 	strbuf_add(buf, pack_name, len);
-	strbuf_addch(buf, '.');
 	strbuf_addstr(buf, suffix);
 	return buf->buf;
 }
@@ -1459,7 +1459,7 @@ static void write_special_file(const char *suffix, const char *msg,
 	int msg_len = strlen(msg);
 
 	if (pack_name)
-		filename = derive_filename(pack_name, suffix, &name_buf);
+		filename = derive_filename(pack_name, "pack", suffix, &name_buf);
 	else
 		filename = odb_pack_name(&name_buf, hash, suffix);
 
@@ -1484,12 +1484,14 @@ static void write_special_file(const char *suffix, const char *msg,
 
 static void final(const char *final_pack_name, const char *curr_pack_name,
 		  const char *final_index_name, const char *curr_index_name,
+		  const char *final_rev_index_name, const char *curr_rev_index_name,
 		  const char *keep_msg, const char *promisor_msg,
 		  unsigned char *hash)
 {
 	const char *report = "pack";
 	struct strbuf pack_name = STRBUF_INIT;
 	struct strbuf index_name = STRBUF_INIT;
+	struct strbuf rev_index_name = STRBUF_INIT;
 	int err;
 
 	if (!from_stdin) {
@@ -1524,6 +1526,16 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
 	} else
 		chmod(final_index_name, 0444);
 
+	if (curr_rev_index_name) {
+		if (final_rev_index_name != curr_rev_index_name) {
+			if (!final_rev_index_name)
+				final_rev_index_name = odb_pack_name(&rev_index_name, hash, "rev");
+			if (finalize_object_file(curr_rev_index_name, final_rev_index_name))
+				die(_("cannot store reverse index file"));
+		} else
+			chmod(final_rev_index_name, 0444);
+	}
+
 	if (do_fsck_object) {
 		struct packed_git *p;
 		p = add_packed_git(final_index_name, strlen(final_index_name), 0);
@@ -1553,6 +1565,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
 		}
 	}
 
+	strbuf_release(&rev_index_name);
 	strbuf_release(&index_name);
 	strbuf_release(&pack_name);
 }
@@ -1578,6 +1591,12 @@ static int git_index_pack_config(const char *k, const char *v, void *cb)
 		}
 		return 0;
 	}
+	if (!strcmp(k, "pack.writereverseindex")) {
+		if (git_config_bool(k, v))
+			opts->flags |= WRITE_REV;
+		else
+			opts->flags &= ~WRITE_REV;
+	}
 	return git_default_config(k, v, cb);
 }
 
@@ -1641,7 +1660,7 @@ static void read_idx_option(struct pack_idx_option *opts, const char *pack_name)
 	/*
 	 * Get rid of the idx file as we do not need it anymore.
 	 * NEEDSWORK: extract this bit from free_pack_by_name() in
-	 * sha1-file.c, perhaps?  It shouldn't matter very much as we
+	 * object-file.c, perhaps?  It shouldn't matter very much as we
 	 * know we haven't installed this pack (hence we never have
 	 * read anything from it).
 	 */
@@ -1655,7 +1674,7 @@ static void show_pack_info(int stat_only)
 	unsigned long *chain_histogram = NULL;
 
 	if (deepest_delta)
-		chain_histogram = xcalloc(deepest_delta, sizeof(unsigned long));
+		CALLOC_ARRAY(chain_histogram, deepest_delta);
 
 	for (i = 0; i < nr_objects; i++) {
 		struct object_entry *obj = &objects[i];
@@ -1693,14 +1712,32 @@ static void show_pack_info(int stat_only)
 	}
 }
 
+static int print_dangling_gitmodules(struct fsck_options *o,
+				     const struct object_id *oid,
+				     enum object_type object_type,
+				     int msg_type, const char *message)
+{
+	/*
+	 * NEEDSWORK: Plumb the MSG_ID (from fsck.c) here and use it
+	 * instead of relying on this string check.
+	 */
+	if (starts_with(message, "gitmodulesMissing")) {
+		printf("%s\n", oid_to_hex(oid));
+		return 0;
+	}
+	return fsck_error_function(o, oid, object_type, msg_type, message);
+}
+
 int cmd_index_pack(int argc, const char **argv, const char *prefix)
 {
-	int i, fix_thin_pack = 0, verify = 0, stat_only = 0;
+	int i, fix_thin_pack = 0, verify = 0, stat_only = 0, rev_index;
 	const char *curr_index;
-	const char *index_name = NULL, *pack_name = NULL;
+	const char *curr_rev_index = NULL;
+	const char *index_name = NULL, *pack_name = NULL, *rev_index_name = NULL;
 	const char *keep_msg = NULL;
 	const char *promisor_msg = NULL;
 	struct strbuf index_name_buf = STRBUF_INIT;
+	struct strbuf rev_index_name_buf = STRBUF_INIT;
 	struct pack_idx_entry **idx_objects;
 	struct pack_idx_option opts;
 	unsigned char pack_hash[GIT_MAX_RAWSZ];
@@ -1727,6 +1764,11 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
 	if (prefix && chdir(prefix))
 		die(_("Cannot come back to cwd"));
 
+	if (git_env_bool(GIT_TEST_WRITE_REV_INDEX, 0))
+		rev_index = 1;
+	else
+		rev_index = !!(opts.flags & (WRITE_REV_VERIFY | WRITE_REV));
+
 	for (i = 1; i < argc; i++) {
 		const char *arg = argv[i];
 
@@ -1805,6 +1847,10 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
 				if (hash_algo == GIT_HASH_UNKNOWN)
 					die(_("unknown hash algorithm '%s'"), arg);
 				repo_set_hash_algo(the_repository, hash_algo);
+			} else if (!strcmp(arg, "--rev-index")) {
+				rev_index = 1;
+			} else if (!strcmp(arg, "--no-rev-index")) {
+				rev_index = 0;
 			} else
 				usage(index_pack_usage);
 			continue;
@@ -1824,7 +1870,16 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
 	if (from_stdin && hash_algo)
 		die(_("--object-format cannot be used with --stdin"));
 	if (!index_name && pack_name)
-		index_name = derive_filename(pack_name, "idx", &index_name_buf);
+		index_name = derive_filename(pack_name, "pack", "idx", &index_name_buf);
+
+	opts.flags &= ~(WRITE_REV | WRITE_REV_VERIFY);
+	if (rev_index) {
+		opts.flags |= verify ? WRITE_REV_VERIFY : WRITE_REV;
+		if (index_name)
+			rev_index_name = derive_filename(index_name,
+							 "idx", "rev",
+							 &rev_index_name_buf);
+	}
 
 	if (verify) {
 		if (!index_name)
@@ -1857,10 +1912,10 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
 
 	curr_pack = open_pack_file(pack_name);
 	parse_pack_header();
-	objects = xcalloc(st_add(nr_objects, 1), sizeof(struct object_entry));
+	CALLOC_ARRAY(objects, st_add(nr_objects, 1));
 	if (show_stat)
-		obj_stat = xcalloc(st_add(nr_objects, 1), sizeof(struct object_stat));
-	ofs_deltas = xcalloc(nr_objects, sizeof(struct ofs_delta_entry));
+		CALLOC_ARRAY(obj_stat, st_add(nr_objects, 1));
+	CALLOC_ARRAY(ofs_deltas, nr_objects);
 	parse_pack_objects(pack_hash);
 	if (report_end_of_input)
 		write_in_full(2, "\0", 1);
@@ -1878,25 +1933,38 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
 	for (i = 0; i < nr_objects; i++)
 		idx_objects[i] = &objects[i].idx;
 	curr_index = write_idx_file(index_name, idx_objects, nr_objects, &opts, pack_hash);
+	if (rev_index)
+		curr_rev_index = write_rev_file(rev_index_name, idx_objects,
+						nr_objects, pack_hash,
+						opts.flags);
 	free(idx_objects);
 
 	if (!verify)
 		final(pack_name, curr_pack,
 		      index_name, curr_index,
+		      rev_index_name, curr_rev_index,
 		      keep_msg, promisor_msg,
 		      pack_hash);
 	else
 		close(input_fd);
 
-	if (do_fsck_object && fsck_finish(&fsck_options))
-		die(_("fsck error in pack objects"));
+	if (do_fsck_object) {
+		struct fsck_options fo = fsck_options;
+
+		fo.error_func = print_dangling_gitmodules;
+		if (fsck_finish(&fo))
+			die(_("fsck error in pack objects"));
+	}
 
 	free(objects);
 	strbuf_release(&index_name_buf);
+	strbuf_release(&rev_index_name_buf);
 	if (pack_name == NULL)
 		free((void *) curr_pack);
 	if (index_name == NULL)
 		free((void *) curr_index);
+	if (rev_index_name == NULL)
+		free((void *) curr_rev_index);
 
 	/*
 	 * Let the caller know this pack is not self contained
diff --git a/builtin/log.c b/builtin/log.c
index f23ccdb..f67b67d 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -12,6 +12,7 @@
 #include "color.h"
 #include "commit.h"
 #include "diff.h"
+#include "diff-merges.h"
 #include "revision.h"
 #include "log-tree.h"
 #include "builtin.h"
@@ -230,7 +231,7 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
 
 	if (mailmap) {
 		rev->mailmap = xcalloc(1, sizeof(struct string_list));
-		read_mailmap(rev->mailmap, NULL);
+		read_mailmap(rev->mailmap);
 	}
 
 	if (rev->pretty_given && rev->commit_format == CMIT_FMT_RAW) {
@@ -306,10 +307,11 @@ static struct itimerval early_output_timer;
 
 static void log_show_early(struct rev_info *revs, struct commit_list *list)
 {
-	int i = revs->early_output, close_file = revs->diffopt.close_file;
+	int i = revs->early_output;
 	int show_header = 1;
+	int no_free = revs->diffopt.no_free;
 
-	revs->diffopt.close_file = 0;
+	revs->diffopt.no_free = 0;
 	sort_in_topological_order(&list, revs->sort_order);
 	while (list && i) {
 		struct commit *commit = list->item;
@@ -326,8 +328,8 @@ 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);
+			revs->diffopt.no_free = no_free;
+			diff_free(&revs->diffopt);
 			return;
 		}
 		list = list->next;
@@ -335,8 +337,8 @@ static void log_show_early(struct rev_info *revs, struct commit_list *list)
 
 	/* Did we already get enough commits for the early output? */
 	if (!i) {
-		if (close_file)
-			fclose(revs->diffopt.file);
+		revs->diffopt.no_free = 0;
+		diff_free(&revs->diffopt);
 		return;
 	}
 
@@ -400,7 +402,7 @@ static int cmd_log_walk(struct rev_info *rev)
 {
 	struct commit *commit;
 	int saved_nrl = 0;
-	int saved_dcctc = 0, close_file = rev->diffopt.close_file;
+	int saved_dcctc = 0;
 
 	if (rev->early_output)
 		setup_early_output();
@@ -416,7 +418,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;
+	rev->diffopt.no_free = 1;
 	while ((commit = get_revision(rev)) != NULL) {
 		if (!log_tree_commit(rev, commit) && rev->max_count >= 0)
 			/*
@@ -441,8 +443,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);
+	rev->diffopt.no_free = 0;
+	diff_free(&rev->diffopt);
 
 	if (rev->diffopt.output_format & DIFF_FORMAT_CHECKDIFF &&
 	    rev->diffopt.flags.check_failed) {
@@ -607,15 +609,10 @@ static int show_tree_object(const struct object_id *oid,
 static void show_setup_revisions_tweak(struct rev_info *rev,
 				       struct setup_revision_opt *opt)
 {
-	if (rev->ignore_merges < 0) {
-		/* There was no "-m" variant on the command line */
-		rev->ignore_merges = 0;
-		if (!rev->first_parent_only && !rev->combine_merges) {
-			/* No "--first-parent", "-c", or "--cc" */
-			rev->combine_merges = 1;
-			rev->dense_combined_merges = 1;
-		}
-	}
+	if (rev->first_parent_only)
+		diff_merges_default_to_first_parent(rev);
+	else
+		diff_merges_default_to_dense_combined(rev);
 	if (!rev->diffopt.output_format)
 		rev->diffopt.output_format = DIFF_FORMAT_PATCH;
 }
@@ -736,12 +733,8 @@ static void log_setup_revisions_tweak(struct rev_info *rev,
 	    rev->prune_data.nr == 1)
 		rev->diffopt.flags.follow_renames = 1;
 
-	/* Turn --cc/-c into -p --cc/-c when -p was not given */
-	if (!rev->diffopt.output_format && rev->combine_merges)
-		rev->diffopt.output_format = DIFF_FORMAT_PATCH;
-
-	if (rev->first_parent_only && rev->ignore_merges < 0)
-		rev->ignore_merges = 0;
+	if (rev->first_parent_only)
+		diff_merges_default_to_first_parent(rev);
 }
 
 int cmd_log(int argc, const char **argv, const char *prefix)
@@ -1231,14 +1224,20 @@ static void make_cover_letter(struct rev_info *rev, int use_separate_file,
 		 */
 		struct diff_options opts;
 		struct strvec other_arg = STRVEC_INIT;
+		struct range_diff_options range_diff_opts = {
+			.creation_factor = rev->creation_factor,
+			.dual_color = 1,
+			.diffopt = &opts,
+			.other_arg = &other_arg
+		};
+
 		diff_setup(&opts);
 		opts.file = rev->diffopt.file;
 		opts.use_color = rev->diffopt.use_color;
 		diff_setup_done(&opts);
 		fprintf_ln(rev->diffopt.file, "%s", rev->rdiff_title);
 		get_notes_args(&other_arg, rev);
-		show_range_diff(rev->rdiff1, rev->rdiff2,
-				rev->creation_factor, 1, &opts, &other_arg);
+		show_range_diff(rev->rdiff1, rev->rdiff2, &range_diff_opts);
 		strvec_clear(&other_arg);
 	}
 }
@@ -1680,7 +1679,7 @@ static void infer_range_diff_ranges(struct strbuf *r1,
 				    struct commit *head)
 {
 	const char *head_oid = oid_to_hex(&head->object.oid);
-	int prev_is_range = !!strstr(prev, "..");
+	int prev_is_range = is_range_diff_range(prev);
 
 	if (prev_is_range)
 		strbuf_addstr(r1, prev);
@@ -1963,7 +1962,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
 		 * file, but but we must instruct it not to close after each
 		 * diff.
 		 */
-		rev.diffopt.close_file = 0;
+		rev.diffopt.no_free = 1;
 	} else {
 		int saved;
 
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index c8eae89..f6f9e48 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -35,6 +35,7 @@ static int line_terminator = '\n';
 static int debug_mode;
 static int show_eol;
 static int recurse_submodules;
+static int skipping_duplicates;
 
 static const char *prefix;
 static int max_prefix_len;
@@ -312,45 +313,59 @@ static void show_files(struct repository *repo, struct dir_struct *dir)
 		if (show_killed)
 			show_killed_files(repo->index, dir);
 	}
-	if (show_cached || show_stage) {
-		for (i = 0; i < repo->index->cache_nr; i++) {
-			const struct cache_entry *ce = repo->index->cache[i];
 
-			construct_fullname(&fullname, repo, ce);
+	if (!(show_cached || show_stage || show_deleted || show_modified))
+		return;
+	for (i = 0; i < repo->index->cache_nr; i++) {
+		const struct cache_entry *ce = repo->index->cache[i];
+		struct stat st;
+		int stat_err;
 
-			if ((dir->flags & DIR_SHOW_IGNORED) &&
-			    !ce_excluded(dir, repo->index, fullname.buf, ce))
-				continue;
-			if (show_unmerged && !ce_stage(ce))
-				continue;
-			if (ce->ce_flags & CE_UPDATE)
-				continue;
+		construct_fullname(&fullname, repo, ce);
+
+		if ((dir->flags & DIR_SHOW_IGNORED) &&
+			!ce_excluded(dir, repo->index, fullname.buf, ce))
+			continue;
+		if (ce->ce_flags & CE_UPDATE)
+			continue;
+		if ((show_cached || show_stage) &&
+		    (!show_unmerged || ce_stage(ce))) {
 			show_ce(repo, dir, ce, fullname.buf,
 				ce_stage(ce) ? tag_unmerged :
 				(ce_skip_worktree(ce) ? tag_skip_worktree :
 				 tag_cached));
+			if (skipping_duplicates)
+				goto skip_to_next_name;
 		}
-	}
-	if (show_deleted || show_modified) {
-		for (i = 0; i < repo->index->cache_nr; i++) {
-			const struct cache_entry *ce = repo->index->cache[i];
-			struct stat st;
-			int err;
 
-			construct_fullname(&fullname, repo, ce);
+		if (!(show_deleted || show_modified))
+			continue;
+		if (ce_skip_worktree(ce))
+			continue;
+		stat_err = lstat(fullname.buf, &st);
+		if (stat_err && (errno != ENOENT && errno != ENOTDIR))
+			error_errno("cannot lstat '%s'", fullname.buf);
+		if (stat_err && show_deleted) {
+			show_ce(repo, dir, ce, fullname.buf, tag_removed);
+			if (skipping_duplicates)
+				goto skip_to_next_name;
+		}
+		if (show_modified &&
+		    (stat_err || ie_modified(repo->index, ce, &st, 0))) {
+			show_ce(repo, dir, ce, fullname.buf, tag_modified);
+			if (skipping_duplicates)
+				goto skip_to_next_name;
+		}
+		continue;
 
-			if ((dir->flags & DIR_SHOW_IGNORED) &&
-			    !ce_excluded(dir, repo->index, fullname.buf, ce))
-				continue;
-			if (ce->ce_flags & CE_UPDATE)
-				continue;
-			if (ce_skip_worktree(ce))
-				continue;
-			err = lstat(fullname.buf, &st);
-			if (show_deleted && err)
-				show_ce(repo, dir, ce, fullname.buf, tag_removed);
-			if (show_modified && ie_modified(repo->index, ce, &st, 0))
-				show_ce(repo, dir, ce, fullname.buf, tag_modified);
+skip_to_next_name:
+		{
+			int j;
+			struct cache_entry **cache = repo->index->cache;
+			for (j = i + 1; j < repo->index->cache_nr; j++)
+				if (strcmp(ce->name, cache[j]->name))
+					break;
+			i = j - 1; /* compensate for the for loop */
 		}
 	}
 
@@ -578,6 +593,8 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
 			N_("pretend that paths removed since <tree-ish> are still present")),
 		OPT__ABBREV(&abbrev),
 		OPT_BOOL(0, "debug", &debug_mode, N_("show debugging data")),
+		OPT_BOOL(0, "deduplicate", &skipping_duplicates,
+			 N_("suppress duplicate entries")),
 		OPT_END()
 	};
 
@@ -617,6 +634,8 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
 		 * you also show the stage information.
 		 */
 		show_stage = 1;
+	if (show_tag || show_stage)
+		skipping_duplicates = 0;
 	if (dir.exclude_per_dir)
 		exc_given = 1;
 
diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c
index 092917e..abfa984 100644
--- a/builtin/ls-remote.c
+++ b/builtin/ls-remote.c
@@ -45,7 +45,8 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
 	int show_symref_target = 0;
 	const char *uploadpack = NULL;
 	const char **pattern = NULL;
-	struct strvec ref_prefixes = STRVEC_INIT;
+	struct transport_ls_refs_options transport_options =
+		TRANSPORT_LS_REFS_OPTIONS_INIT;
 	int i;
 	struct string_list server_options = STRING_LIST_INIT_DUP;
 
@@ -87,16 +88,16 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
 
 	if (argc > 1) {
 		int i;
-		pattern = xcalloc(argc, sizeof(const char *));
+		CALLOC_ARRAY(pattern, argc);
 		for (i = 1; i < argc; i++) {
 			pattern[i - 1] = xstrfmt("*/%s", argv[i]);
 		}
 	}
 
 	if (flags & REF_TAGS)
-		strvec_push(&ref_prefixes, "refs/tags/");
+		strvec_push(&transport_options.ref_prefixes, "refs/tags/");
 	if (flags & REF_HEADS)
-		strvec_push(&ref_prefixes, "refs/heads/");
+		strvec_push(&transport_options.ref_prefixes, "refs/heads/");
 
 	remote = remote_get(dest);
 	if (!remote) {
@@ -118,7 +119,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
 	if (server_options.nr)
 		transport->server_options = &server_options;
 
-	ref = transport_get_remote_refs(transport, &ref_prefixes);
+	ref = transport_get_remote_refs(transport, &transport_options);
 	if (ref) {
 		int hash_algo = hash_algo_by_ptr(transport_get_hash_algo(transport));
 		repo_set_hash_algo(the_repository, hash_algo);
diff --git a/builtin/merge.c b/builtin/merge.c
index 1cff730..3886195 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -14,6 +14,7 @@
 #include "lockfile.h"
 #include "run-command.h"
 #include "diff.h"
+#include "diff-merges.h"
 #include "refs.h"
 #include "refspec.h"
 #include "commit.h"
@@ -209,7 +210,7 @@ static struct strategy *get_strategy(const char *name)
 		exit(1);
 	}
 
-	ret = xcalloc(1, sizeof(struct strategy));
+	CALLOC_ARRAY(ret, 1);
 	ret->name = xstrdup(name);
 	ret->attr = NO_TRIVIAL;
 	return ret;
@@ -409,7 +410,7 @@ static void squash_message(struct commit *commit, struct commit_list *remotehead
 	printf(_("Squash commit -- not updating HEAD\n"));
 
 	repo_init_revisions(the_repository, &rev, NULL);
-	rev.ignore_merges = 1;
+	diff_merges_suppress(&rev);
 	rev.commit_format = CMIT_FMT_MEDIUM;
 
 	commit->object.flags |= UNINTERESTING;
diff --git a/builtin/mktag.c b/builtin/mktag.c
index 4982d3a..41a399a 100644
--- a/builtin/mktag.c
+++ b/builtin/mktag.c
@@ -1,179 +1,110 @@
 #include "builtin.h"
+#include "parse-options.h"
 #include "tag.h"
 #include "replace-object.h"
 #include "object-store.h"
+#include "fsck.h"
+#include "config.h"
 
-/*
- * A signature file has a very simple fixed format: four lines
- * of "object <sha1>" + "type <typename>" + "tag <tagname>" +
- * "tagger <committer>", followed by a blank line, a free-form tag
- * message and a signature block that git itself doesn't care about,
- * but that can be verified with gpg or similar.
- *
- * The first four lines are guaranteed to be at least 83 bytes:
- * "object <sha1>\n" is 48 bytes, "type tag\n" at 9 bytes is the
- * shortest possible type-line, "tag .\n" at 6 bytes is the shortest
- * single-character-tag line, and "tagger . <> 0 +0000\n" at 20 bytes is
- * the shortest possible tagger-line.
- */
+static char const * const builtin_mktag_usage[] = {
+	N_("git mktag"),
+	NULL
+};
+static int option_strict = 1;
 
-/*
- * We refuse to tag something we can't verify. Just because.
- */
-static int verify_object(const struct object_id *oid, const char *expected_type)
+static struct fsck_options fsck_options = FSCK_OPTIONS_STRICT;
+
+static int mktag_config(const char *var, const char *value, void *cb)
 {
-	int ret = -1;
-	enum object_type type;
-	unsigned long size;
-	void *buffer = read_object_file(oid, &type, &size);
-	const struct object_id *repl = lookup_replace_object(the_repository, oid);
-
-	if (buffer) {
-		if (type == type_from_string(expected_type)) {
-			ret = check_object_signature(the_repository, repl,
-						     buffer, size,
-						     expected_type);
-		}
-		free(buffer);
-	}
-	return ret;
+	return fsck_config_internal(var, value, cb, &fsck_options);
 }
 
-static int verify_tag(char *buffer, unsigned long size)
+static int mktag_fsck_error_func(struct fsck_options *o,
+				 const struct object_id *oid,
+				 enum object_type object_type,
+				 int msg_type, const char *message)
 {
-	int typelen;
-	char type[20];
-	struct object_id oid;
-	const char *object, *type_line, *tag_line, *tagger_line, *lb, *rb, *p;
-	size_t len;
+	switch (msg_type) {
+	case FSCK_WARN:
+		if (!option_strict) {
+			fprintf_ln(stderr, _("warning: tag input does not pass fsck: %s"), message);
+			return 0;
 
-	if (size < 84)
-		return error("wanna fool me ? you obviously got the size wrong !");
-
-	buffer[size] = 0;
-
-	/* Verify object line */
-	object = buffer;
-	if (memcmp(object, "object ", 7))
-		return error("char%d: does not start with \"object \"", 0);
-
-	if (parse_oid_hex(object + 7, &oid, &p))
-		return error("char%d: could not get SHA1 hash", 7);
-
-	/* Verify type line */
-	type_line = p + 1;
-	if (memcmp(type_line - 1, "\ntype ", 6))
-		return error("char%d: could not find \"\\ntype \"", 47);
-
-	/* Verify tag-line */
-	tag_line = strchr(type_line, '\n');
-	if (!tag_line)
-		return error("char%"PRIuMAX": could not find next \"\\n\"",
-				(uintmax_t) (type_line - buffer));
-	tag_line++;
-	if (memcmp(tag_line, "tag ", 4) || tag_line[4] == '\n')
-		return error("char%"PRIuMAX": no \"tag \" found",
-				(uintmax_t) (tag_line - buffer));
-
-	/* Get the actual type */
-	typelen = tag_line - type_line - strlen("type \n");
-	if (typelen >= sizeof(type))
-		return error("char%"PRIuMAX": type too long",
-				(uintmax_t) (type_line+5 - buffer));
-
-	memcpy(type, type_line+5, typelen);
-	type[typelen] = 0;
-
-	/* Verify that the object matches */
-	if (verify_object(&oid, type))
-		return error("char%d: could not verify object %s", 7, oid_to_hex(&oid));
-
-	/* Verify the tag-name: we don't allow control characters or spaces in it */
-	tag_line += 4;
-	for (;;) {
-		unsigned char c = *tag_line++;
-		if (c == '\n')
-			break;
-		if (c > ' ')
-			continue;
-		return error("char%"PRIuMAX": could not verify tag name",
-				(uintmax_t) (tag_line - buffer));
+		}
+		/* fallthrough */
+	case FSCK_ERROR:
+		/*
+		 * We treat both warnings and errors as errors, things
+		 * like missing "tagger" lines are "only" warnings
+		 * under fsck, we've always considered them an error.
+		 */
+		fprintf_ln(stderr, _("error: tag input does not pass fsck: %s"), message);
+		return 1;
+	default:
+		BUG(_("%d (FSCK_IGNORE?) should never trigger this callback"),
+		    msg_type);
 	}
+}
 
-	/* Verify the tagger line */
-	tagger_line = tag_line;
+static int verify_object_in_tag(struct object_id *tagged_oid, int *tagged_type)
+{
+	int ret;
+	enum object_type type;
+	unsigned long size;
+	void *buffer;
+	const struct object_id *repl;
 
-	if (memcmp(tagger_line, "tagger ", 7))
-		return error("char%"PRIuMAX": could not find \"tagger \"",
-			(uintmax_t) (tagger_line - buffer));
+	buffer = read_object_file(tagged_oid, &type, &size);
+	if (!buffer)
+		die(_("could not read tagged object '%s'"),
+		    oid_to_hex(tagged_oid));
+	if (type != *tagged_type)
+		die(_("object '%s' tagged as '%s', but is a '%s' type"),
+		    oid_to_hex(tagged_oid),
+		    type_name(*tagged_type), type_name(type));
 
-	/*
-	 * Check for correct form for name and email
-	 * i.e. " <" followed by "> " on _this_ line
-	 * No angle brackets within the name or email address fields.
-	 * No spaces within the email address field.
-	 */
-	tagger_line += 7;
-	if (!(lb = strstr(tagger_line, " <")) || !(rb = strstr(lb+2, "> ")) ||
-		strpbrk(tagger_line, "<>\n") != lb+1 ||
-		strpbrk(lb+2, "><\n ") != rb)
-		return error("char%"PRIuMAX": malformed tagger field",
-			(uintmax_t) (tagger_line - buffer));
+	repl = lookup_replace_object(the_repository, tagged_oid);
+	ret = check_object_signature(the_repository, repl,
+				     buffer, size, type_name(*tagged_type));
+	free(buffer);
 
-	/* Check for author name, at least one character, space is acceptable */
-	if (lb == tagger_line)
-		return error("char%"PRIuMAX": missing tagger name",
-			(uintmax_t) (tagger_line - buffer));
-
-	/* timestamp, 1 or more digits followed by space */
-	tagger_line = rb + 2;
-	if (!(len = strspn(tagger_line, "0123456789")))
-		return error("char%"PRIuMAX": missing tag timestamp",
-			(uintmax_t) (tagger_line - buffer));
-	tagger_line += len;
-	if (*tagger_line != ' ')
-		return error("char%"PRIuMAX": malformed tag timestamp",
-			(uintmax_t) (tagger_line - buffer));
-	tagger_line++;
-
-	/* timezone, 5 digits [+-]hhmm, max. 1400 */
-	if (!((tagger_line[0] == '+' || tagger_line[0] == '-') &&
-	      strspn(tagger_line+1, "0123456789") == 4 &&
-	      tagger_line[5] == '\n' && atoi(tagger_line+1) <= 1400))
-		return error("char%"PRIuMAX": malformed tag timezone",
-			(uintmax_t) (tagger_line - buffer));
-	tagger_line += 6;
-
-	/* Verify the blank line separating the header from the body */
-	if (*tagger_line != '\n')
-		return error("char%"PRIuMAX": trailing garbage in tag header",
-			(uintmax_t) (tagger_line - buffer));
-
-	/* The actual stuff afterwards we don't care about.. */
-	return 0;
+	return ret;
 }
 
 int cmd_mktag(int argc, const char **argv, const char *prefix)
 {
+	static struct option builtin_mktag_options[] = {
+		OPT_BOOL(0, "strict", &option_strict,
+			 N_("enable more strict checking")),
+		OPT_END(),
+	};
 	struct strbuf buf = STRBUF_INIT;
+	struct object_id tagged_oid;
+	int tagged_type;
 	struct object_id result;
 
-	if (argc != 1)
-		usage("git mktag");
+	argc = parse_options(argc, argv, NULL,
+			     builtin_mktag_options,
+			     builtin_mktag_usage, 0);
 
-	if (strbuf_read(&buf, 0, 4096) < 0) {
-		die_errno("could not read from stdin");
-	}
+	if (strbuf_read(&buf, 0, 0) < 0)
+		die_errno(_("could not read from stdin"));
 
-	/* Verify it for some basic sanity: it needs to start with
-	   "object <sha1>\ntype\ntagger " */
-	if (verify_tag(buf.buf, buf.len) < 0)
-		die("invalid tag signature file");
+	fsck_options.error_func = mktag_fsck_error_func;
+	fsck_set_msg_type(&fsck_options, "extraheaderentry", "warn");
+	/* config might set fsck.extraHeaderEntry=* again */
+	git_config(mktag_config, NULL);
+	if (fsck_tag_standalone(NULL, buf.buf, buf.len, &fsck_options,
+				&tagged_oid, &tagged_type))
+		die(_("tag on stdin did not pass our strict fsck check"));
+
+	if (verify_object_in_tag(&tagged_oid, &tagged_type))
+		die(_("tag on stdin did not refer to a valid object"));
 
 	if (write_object_file(buf.buf, buf.len, tag_type, &result) < 0)
-		die("unable to write tag file");
+		die(_("unable to write tag file"));
 
 	strbuf_release(&buf);
-	printf("%s\n", oid_to_hex(&result));
+	puts(oid_to_hex(&result));
 	return 0;
 }
diff --git a/builtin/mv.c b/builtin/mv.c
index 7dac714..3fccdcb 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -221,7 +221,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 				}
 				argc += last - first;
 			}
-		} else if (!(ce = cache_file_exists(src, length, ignore_case))) {
+		} else if (!(ce = cache_file_exists(src, length, 0))) {
 			bad = _("not under version control");
 		} else if (ce_stage(ce)) {
 			bad = _("conflicted");
diff --git a/builtin/name-rev.c b/builtin/name-rev.c
index 725dd04..b221d30 100644
--- a/builtin/name-rev.c
+++ b/builtin/name-rev.c
@@ -7,7 +7,7 @@
 #include "refs.h"
 #include "parse-options.h"
 #include "prio-queue.h"
-#include "sha1-lookup.h"
+#include "hash-lookup.h"
 #include "commit-slab.h"
 
 /*
@@ -390,10 +390,10 @@ static void name_tips(void)
 	}
 }
 
-static const unsigned char *nth_tip_table_ent(size_t ix, void *table_)
+static const struct object_id *nth_tip_table_ent(size_t ix, const void *table_)
 {
-	struct tip_table_entry *table = table_;
-	return table[ix].oid.hash;
+	const struct tip_table_entry *table = table_;
+	return &table[ix].oid;
 }
 
 static const char *get_exact_ref_match(const struct object *o)
@@ -408,8 +408,8 @@ static const char *get_exact_ref_match(const struct object *o)
 		tip_table.sorted = 1;
 	}
 
-	found = sha1_pos(o->oid.hash, tip_table.table, tip_table.nr,
-			 nth_tip_table_ent);
+	found = oid_pos(&o->oid, tip_table.table, tip_table.nr,
+			nth_tip_table_ent);
 	if (0 <= found)
 		return tip_table.table[found].refname;
 	return NULL;
diff --git a/builtin/notes.c b/builtin/notes.c
index 2987c08..74bba39 100644
--- a/builtin/notes.c
+++ b/builtin/notes.c
@@ -373,7 +373,7 @@ static int list(int argc, const char **argv, const char *prefix)
 				     git_notes_list_usage, 0);
 
 	if (1 < argc) {
-		error(_("too many parameters"));
+		error(_("too many arguments"));
 		usage_with_options(git_notes_list_usage, options);
 	}
 
@@ -428,7 +428,7 @@ static int add(int argc, const char **argv, const char *prefix)
 			     PARSE_OPT_KEEP_ARGV0);
 
 	if (2 < argc) {
-		error(_("too many parameters"));
+		error(_("too many arguments"));
 		usage_with_options(git_notes_add_usage, options);
 	}
 
@@ -506,7 +506,7 @@ static int copy(int argc, const char **argv, const char *prefix)
 
 	if (from_stdin || rewrite_cmd) {
 		if (argc) {
-			error(_("too many parameters"));
+			error(_("too many arguments"));
 			usage_with_options(git_notes_copy_usage, options);
 		} else {
 			return notes_copy_from_stdin(force, rewrite_cmd);
@@ -514,11 +514,11 @@ static int copy(int argc, const char **argv, const char *prefix)
 	}
 
 	if (argc < 1) {
-		error(_("too few parameters"));
+		error(_("too few arguments"));
 		usage_with_options(git_notes_copy_usage, options);
 	}
 	if (2 < argc) {
-		error(_("too many parameters"));
+		error(_("too many arguments"));
 		usage_with_options(git_notes_copy_usage, options);
 	}
 
@@ -595,7 +595,7 @@ static int append_edit(int argc, const char **argv, const char *prefix)
 			     PARSE_OPT_KEEP_ARGV0);
 
 	if (2 < argc) {
-		error(_("too many parameters"));
+		error(_("too many arguments"));
 		usage_with_options(usage, options);
 	}
 
@@ -662,7 +662,7 @@ static int show(int argc, const char **argv, const char *prefix)
 			     0);
 
 	if (1 < argc) {
-		error(_("too many parameters"));
+		error(_("too many arguments"));
 		usage_with_options(git_notes_show_usage, options);
 	}
 
@@ -730,7 +730,7 @@ static int merge_commit(struct notes_merge_options *o)
 	else
 		oidclr(&parent_oid);
 
-	t = xcalloc(1, sizeof(struct notes_tree));
+	CALLOC_ARRAY(t, 1);
 	init_notes(t, "NOTES_MERGE_PARTIAL", combine_notes_overwrite, 0);
 
 	o->local_ref = local_ref_to_free =
@@ -812,7 +812,7 @@ static int merge(int argc, const char **argv, const char *prefix)
 		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 arguments"));
 		usage_with_options(git_notes_merge_usage, options);
 	}
 
@@ -960,7 +960,7 @@ static int prune(int argc, const char **argv, const char *prefix)
 			     0);
 
 	if (argc) {
-		error(_("too many parameters"));
+		error(_("too many arguments"));
 		usage_with_options(git_notes_prune_usage, options);
 	}
 
@@ -982,7 +982,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 arguments"));
 		usage_with_options(git_notes_get_ref_usage, options);
 	}
 
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 5617c01..4bb6026 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -419,7 +419,7 @@ static off_t write_reuse_object(struct hashfile *f, struct object_entry *entry,
 {
 	struct packed_git *p = IN_PACK(entry);
 	struct pack_window *w_curs = NULL;
-	struct revindex_entry *revidx;
+	uint32_t pos;
 	off_t offset;
 	enum object_type type = oe_type(entry);
 	off_t datalen;
@@ -436,10 +436,15 @@ static off_t write_reuse_object(struct hashfile *f, struct object_entry *entry,
 					      type, entry_size);
 
 	offset = entry->in_pack_offset;
-	revidx = find_pack_revindex(p, offset);
-	datalen = revidx[1].offset - offset;
+	if (offset_to_pack_pos(p, offset, &pos) < 0)
+		die(_("write_reuse_object: could not locate %s, expected at "
+		      "offset %"PRIuMAX" in pack %s"),
+		    oid_to_hex(&entry->idx.oid), (uintmax_t)offset,
+		    p->pack_name);
+	datalen = pack_pos_to_offset(p, pos + 1) - offset;
 	if (!pack_to_stdout && p->index_version > 1 &&
-	    check_pack_crc(p, &w_curs, offset, datalen, revidx->nr)) {
+	    check_pack_crc(p, &w_curs, offset, datalen,
+			   pack_pos_to_index(p, pos))) {
 		error(_("bad packed object CRC for %s"),
 		      oid_to_hex(&entry->idx.oid));
 		unuse_pack(&w_curs);
@@ -629,7 +634,7 @@ static int mark_tagged(const char *path, const struct object_id *oid, int flag,
 
 	if (entry)
 		entry->tagged = 1;
-	if (!peel_ref(path, &peeled)) {
+	if (!peel_iterated_oid(oid, &peeled)) {
 		entry = packlist_find(&to_pack, &peeled);
 		if (entry)
 			entry->tagged = 1;
@@ -863,8 +868,8 @@ static void write_reused_pack_one(size_t pos, struct hashfile *out,
 	enum object_type type;
 	unsigned long size;
 
-	offset = reuse_packfile->revindex[pos].offset;
-	next = reuse_packfile->revindex[pos + 1].offset;
+	offset = pack_pos_to_offset(reuse_packfile, pos);
+	next = pack_pos_to_offset(reuse_packfile, pos + 1);
 
 	record_reused_object(offset, offset - hashfile_total(out));
 
@@ -884,11 +889,17 @@ static void write_reused_pack_one(size_t pos, struct hashfile *out,
 
 		/* Convert to REF_DELTA if we must... */
 		if (!allow_ofs_delta) {
-			int base_pos = find_revindex_position(reuse_packfile, base_offset);
+			uint32_t base_pos;
 			struct object_id base_oid;
 
+			if (offset_to_pack_pos(reuse_packfile, base_offset, &base_pos) < 0)
+				die(_("expected object at offset %"PRIuMAX" "
+				      "in pack %s"),
+				    (uintmax_t)base_offset,
+				    reuse_packfile->pack_name);
+
 			nth_packed_object_id(&base_oid, reuse_packfile,
-					     reuse_packfile->revindex[base_pos].nr);
+					     pack_pos_to_index(reuse_packfile, base_pos));
 
 			len = encode_in_pack_object_header(header, sizeof(header),
 							   OBJ_REF_DELTA, size);
@@ -941,7 +952,7 @@ static size_t write_reused_pack_verbatim(struct hashfile *out,
 		off_t to_write;
 
 		written = (pos * BITS_IN_EWORD);
-		to_write = reuse_packfile->revindex[written].offset
+		to_write = pack_pos_to_offset(reuse_packfile, written)
 			- sizeof(struct pack_header);
 
 		/* We're recording one chunk, not one object. */
@@ -1104,7 +1115,6 @@ static void write_pack_file(void)
 				stop_progress(&progress_state);
 
 				bitmap_writer_show_progress(progress);
-				bitmap_writer_reuse_bitmaps(&to_pack);
 				bitmap_writer_select_commits(indexed_commits, indexed_commits_nr, -1);
 				bitmap_writer_build(&to_pack);
 				bitmap_writer_finish(written_list, nr_written,
@@ -1625,7 +1635,7 @@ static void add_preferred_base(struct object_id *oid)
 		}
 	}
 
-	it = xcalloc(1, sizeof(*it));
+	CALLOC_ARRAY(it, 1);
 	it->next = pbase_tree;
 	pbase_tree = it;
 
@@ -1807,11 +1817,11 @@ static void check_object(struct object_entry *entry, uint32_t object_index)
 				goto give_up;
 			}
 			if (reuse_delta && !entry->preferred_base) {
-				struct revindex_entry *revidx;
-				revidx = find_pack_revindex(p, ofs);
-				if (!revidx)
+				uint32_t pos;
+				if (offset_to_pack_pos(p, ofs, &pos) < 0)
 					goto give_up;
-				if (!nth_packed_object_id(&base_ref, p, revidx->nr))
+				if (!nth_packed_object_id(&base_ref, p,
+							  pack_pos_to_index(p, pos)))
 					have_base = 1;
 			}
 			entry->in_pack_header_size = used + used_0;
@@ -2086,7 +2096,7 @@ static void get_object_details(void)
 		progress_state = start_progress(_("Counting objects"),
 						to_pack.nr_objects);
 
-	sorted_by_offset = xcalloc(to_pack.nr_objects, sizeof(struct object_entry *));
+	CALLOC_ARRAY(sorted_by_offset, to_pack.nr_objects);
 	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, pack_offset_sort);
@@ -2418,7 +2428,7 @@ static void find_deltas(struct object_entry **list, unsigned *list_size,
 	struct unpacked *array;
 	unsigned long mem_usage = 0;
 
-	array = xcalloc(window, sizeof(struct unpacked));
+	CALLOC_ARRAY(array, window);
 
 	for (;;) {
 		struct object_entry *entry;
@@ -2655,7 +2665,7 @@ static void ll_find_deltas(struct object_entry **list, unsigned list_size,
 	if (progress > pack_to_stdout)
 		fprintf_ln(stderr, _("Delta compression using up to %d threads"),
 			   delta_search_threads);
-	p = xcalloc(delta_search_threads, sizeof(*p));
+	CALLOC_ARRAY(p, delta_search_threads);
 
 	/* Partition the work amongst work threads. */
 	for (i = 0; i < delta_search_threads; i++) {
@@ -2804,13 +2814,11 @@ static void add_tag_chain(const struct object_id *oid)
 	}
 }
 
-static int add_ref_tag(const char *path, const struct object_id *oid, int flag, void *cb_data)
+static int add_ref_tag(const char *tag, const struct object_id *oid, int flag, void *cb_data)
 {
 	struct object_id peeled;
 
-	if (starts_with(path, "refs/tags/") && /* is a tag? */
-	    !peel_ref(path, &peeled)    && /* peelable? */
-	    obj_is_packed(&peeled)) /* object packed? */
+	if (!peel_iterated_oid(oid, &peeled) && obj_is_packed(&peeled))
 		add_tag_chain(oid);
 	return 0;
 }
@@ -2945,6 +2953,13 @@ static int git_pack_config(const char *k, const char *v, void *cb)
 			    pack_idx_opts.version);
 		return 0;
 	}
+	if (!strcmp(k, "pack.writereverseindex")) {
+		if (git_config_bool(k, v))
+			pack_idx_opts.flags |= WRITE_REV;
+		else
+			pack_idx_opts.flags &= ~WRITE_REV;
+		return 0;
+	}
 	if (!strcmp(k, "uploadpack.blobpackfileuri")) {
 		struct configured_exclusion *ex = xmalloc(sizeof(*ex));
 		const char *oid_end, *pack_end;
@@ -3584,6 +3599,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
 
 	reset_pack_idx_option(&pack_idx_opts);
 	git_config(git_pack_config, NULL);
+	if (git_env_bool(GIT_TEST_WRITE_REV_INDEX, 0))
+		pack_idx_opts.flags |= WRITE_REV;
 
 	progress = isatty(2);
 	argc = parse_options(argc, argv, prefix, pack_objects_options,
@@ -3741,7 +3758,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
 	}
 	cleanup_preferred_base();
 	if (include_tag && nr_result)
-		for_each_ref(add_ref_tag, NULL);
+		for_each_tag_ref(add_ref_tag, NULL);
 	stop_progress(&progress_state);
 	trace2_region_leave("pack-objects", "enumerate-objects",
 			    the_repository);
diff --git a/builtin/pack-redundant.c b/builtin/pack-redundant.c
index 9fcea3e..7102996 100644
--- a/builtin/pack-redundant.c
+++ b/builtin/pack-redundant.c
@@ -373,7 +373,7 @@ static void sort_pack_list(struct pack_list **pl)
 		return;
 
 	/* prepare an array of packed_list for easier sorting */
-	ary = xcalloc(n, sizeof(struct pack_list *));
+	CALLOC_ARRAY(ary, n);
 	for (n = 0, p = *pl; p; p = p->next)
 		ary[n++] = p;
 
@@ -560,6 +560,7 @@ static void load_all(void)
 int cmd_pack_redundant(int argc, const char **argv, const char *prefix)
 {
 	int i;
+	int i_still_use_this = 0;
 	struct pack_list *min = NULL, *red, *pl;
 	struct llist *ignore;
 	struct object_id *oid;
@@ -586,12 +587,24 @@ int cmd_pack_redundant(int argc, const char **argv, const char *prefix)
 			alt_odb = 1;
 			continue;
 		}
+		if (!strcmp(arg, "--i-still-use-this")) {
+			i_still_use_this = 1;
+			continue;
+		}
 		if (*arg == '-')
 			usage(pack_redundant_usage);
 		else
 			break;
 	}
 
+	if (!i_still_use_this) {
+		fputs(_("'git pack-redundant' is nominated for removal.\n"
+			"If you still use this command, please add an extra\n"
+			"option, '--i-still-use-this', on the command line\n"
+			"and let us know you still use it by sending an e-mail\n"
+			"to <git@vger.kernel.org>.  Thanks.\n"), stderr);
+	}
+
 	if (load_all_packs)
 		load_all();
 	else
diff --git a/builtin/pull.c b/builtin/pull.c
index aa56ebc..e8927fc 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -324,7 +324,7 @@ static const char *config_get_ff(void)
  * looks for the value of "pull.rebase". If both configuration keys do not
  * exist, returns REBASE_FALSE.
  */
-static enum rebase_type config_get_rebase(void)
+static enum rebase_type config_get_rebase(int *rebase_unspecified)
 {
 	struct branch *curr_branch = branch_get("HEAD");
 	const char *value;
@@ -344,20 +344,7 @@ static enum rebase_type config_get_rebase(void)
 	if (!git_config_get_value("pull.rebase", &value))
 		return parse_config_rebase("pull.rebase", value, 1);
 
-	if (opt_verbosity >= 0 && !opt_ff) {
-		advise(_("Pulling without specifying how to reconcile divergent branches is\n"
-			 "discouraged. You can squelch this message by running one of the following\n"
-			 "commands sometime before your next pull:\n"
-			 "\n"
-			 "  git config pull.rebase false  # merge (the default strategy)\n"
-			 "  git config pull.rebase true   # rebase\n"
-			 "  git config pull.ff only       # fast-forward only\n"
-			 "\n"
-			 "You can replace \"git config\" with \"git config --global\" to set a default\n"
-			 "preference for all repositories. You can also pass --rebase, --no-rebase,\n"
-			 "or --ff-only on the command line to override the configured default per\n"
-			 "invocation.\n"));
-	}
+	*rebase_unspecified = 1;
 
 	return REBASE_FALSE;
 }
@@ -924,6 +911,36 @@ static int run_rebase(const struct object_id *newbase,
 	return ret;
 }
 
+static int get_can_ff(struct object_id *orig_head, struct object_id *orig_merge_head)
+{
+	int ret;
+	struct commit_list *list = NULL;
+	struct commit *merge_head, *head;
+
+	head = lookup_commit_reference(the_repository, orig_head);
+	commit_list_insert(head, &list);
+	merge_head = lookup_commit_reference(the_repository, orig_merge_head);
+	ret = repo_is_descendant_of(the_repository, merge_head, list);
+	free_commit_list(list);
+	return ret;
+}
+
+static void show_advice_pull_non_ff(void)
+{
+	advise(_("Pulling without specifying how to reconcile divergent branches is\n"
+		 "discouraged. You can squelch this message by running one of the following\n"
+		 "commands sometime before your next pull:\n"
+		 "\n"
+		 "  git config pull.rebase false  # merge (the default strategy)\n"
+		 "  git config pull.rebase true   # rebase\n"
+		 "  git config pull.ff only       # fast-forward only\n"
+		 "\n"
+		 "You can replace \"git config\" with \"git config --global\" to set a default\n"
+		 "preference for all repositories. You can also pass --rebase, --no-rebase,\n"
+		 "or --ff-only on the command line to override the configured default per\n"
+		 "invocation.\n"));
+}
+
 int cmd_pull(int argc, const char **argv, const char *prefix)
 {
 	const char *repo, **refspecs;
@@ -931,6 +948,8 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 	struct object_id orig_head, curr_head;
 	struct object_id rebase_fork_point;
 	int autostash;
+	int rebase_unspecified = 0;
+	int can_ff;
 
 	if (!getenv("GIT_REFLOG_ACTION"))
 		set_reflog_message(argc, argv);
@@ -952,7 +971,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 		opt_ff = xstrdup_or_null(config_get_ff());
 
 	if (opt_rebase < 0)
-		opt_rebase = config_get_rebase();
+		opt_rebase = config_get_rebase(&rebase_unspecified);
 
 	if (read_cache_unmerged())
 		die_resolve_conflict("pull");
@@ -1026,6 +1045,13 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 	if (opt_rebase && merge_heads.nr > 1)
 		die(_("Cannot rebase onto multiple branches."));
 
+	can_ff = get_can_ff(&orig_head, &merge_heads.oid[0]);
+
+	if (rebase_unspecified && !opt_ff && !can_ff) {
+		if (opt_verbosity >= 0)
+			show_advice_pull_non_ff();
+	}
+
 	if (opt_rebase) {
 		int ret = 0;
 		int ran_ff = 0;
@@ -1040,22 +1066,12 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 		    submodule_touches_in_range(the_repository, &upstream, &curr_head))
 			die(_("cannot rebase with locally recorded submodule modifications"));
 		if (!autostash) {
-			struct commit_list *list = NULL;
-			struct commit *merge_head, *head;
-
-			head = lookup_commit_reference(the_repository,
-						       &orig_head);
-			commit_list_insert(head, &list);
-			merge_head = lookup_commit_reference(the_repository,
-							     &merge_heads.oid[0]);
-			if (repo_is_descendant_of(the_repository,
-						  merge_head, list)) {
+			if (can_ff) {
 				/* we can fast-forward this without invoking rebase */
 				opt_ff = "--ff-only";
 				ran_ff = 1;
 				ret = run_merge();
 			}
-			free_commit_list(list);
 		}
 		if (!ran_ff)
 			ret = run_rebase(&newbase, &upstream);
diff --git a/builtin/push.c b/builtin/push.c
index 03adb58..194967e 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -115,7 +115,7 @@ static void set_refspecs(const char **refs, int nr, const char *repo)
 			else
 				refspec_appendf(&rs, "refs/tags/%s", ref);
 		} else if (deleterefs) {
-			if (strchr(ref, ':'))
+			if (strchr(ref, ':') || !*ref)
 				die(_("--delete only accepts plain target ref names"));
 			refspec_appendf(&rs, ":%s", ref);
 		} else if (!strchr(ref, ':')) {
diff --git a/builtin/range-diff.c b/builtin/range-diff.c
index 24c4162..78bc9fa 100644
--- a/builtin/range-diff.c
+++ b/builtin/range-diff.c
@@ -3,6 +3,7 @@
 #include "parse-options.h"
 #include "range-diff.h"
 #include "config.h"
+#include "revision.h"
 
 static const char * const builtin_range_diff_usage[] = {
 N_("git range-diff [<options>] <old-base>..<old-tip> <new-base>..<new-tip>"),
@@ -13,18 +14,27 @@ NULL
 
 int cmd_range_diff(int argc, const char **argv, const char *prefix)
 {
-	int creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT;
 	struct diff_options diffopt = { NULL };
 	struct strvec other_arg = STRVEC_INIT;
-	int simple_color = -1;
+	struct range_diff_options range_diff_opts = {
+		.creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT,
+		.diffopt = &diffopt,
+		.other_arg = &other_arg
+	};
+	int simple_color = -1, left_only = 0, right_only = 0;
 	struct option range_diff_options[] = {
-		OPT_INTEGER(0, "creation-factor", &creation_factor,
+		OPT_INTEGER(0, "creation-factor",
+			    &range_diff_opts.creation_factor,
 			    N_("Percentage by which creation is weighted")),
 		OPT_BOOL(0, "no-dual-color", &simple_color,
 			    N_("use simple diff colors")),
 		OPT_PASSTHRU_ARGV(0, "notes", &other_arg,
 				  N_("notes"), N_("passed to 'git log'"),
 				  PARSE_OPT_OPTARG),
+		OPT_BOOL(0, "left-only", &left_only,
+			 N_("only emit output related to the first range")),
+		OPT_BOOL(0, "right-only", &right_only,
+			 N_("only emit output related to the second range")),
 		OPT_END()
 	};
 	struct option *options;
@@ -46,12 +56,12 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)
 		diffopt.use_color = 1;
 
 	if (argc == 2) {
-		if (!strstr(argv[0], ".."))
-			die(_("no .. in range: '%s'"), argv[0]);
+		if (!is_range_diff_range(argv[0]))
+			die(_("not a commit range: '%s'"), argv[0]);
 		strbuf_addstr(&range1, argv[0]);
 
-		if (!strstr(argv[1], ".."))
-			die(_("no .. in range: '%s'"), argv[1]);
+		if (!is_range_diff_range(argv[1]))
+			die(_("not a commit range: '%s'"), argv[1]);
 		strbuf_addstr(&range2, argv[1]);
 	} else if (argc == 3) {
 		strbuf_addf(&range1, "%s..%s", argv[0], argv[1]);
@@ -81,8 +91,10 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)
 	}
 	FREE_AND_NULL(options);
 
-	res = show_range_diff(range1.buf, range2.buf, creation_factor,
-			      simple_color < 1, &diffopt, &other_arg);
+	range_diff_opts.dual_color = simple_color < 1;
+	range_diff_opts.left_only = left_only;
+	range_diff_opts.right_only = right_only;
+	res = show_range_diff(range1.buf, range2.buf, &range_diff_opts);
 
 	strvec_clear(&other_arg);
 	strbuf_release(&range1);
diff --git a/builtin/rebase.c b/builtin/rebase.c
index 840dbd7..de400f9 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -102,6 +102,7 @@ struct rebase_options {
 	int reschedule_failed_exec;
 	int use_legacy_rebase;
 	int reapply_cherry_picks;
+	int fork_point;
 };
 
 #define REBASE_OPTIONS_INIT {			  	\
@@ -111,7 +112,8 @@ struct rebase_options {
 		.default_backend = "merge",	  	\
 		.flags = REBASE_NO_QUIET, 		\
 		.git_am_opts = STRVEC_INIT,		\
-		.git_format_patch_opt = STRBUF_INIT	\
+		.git_format_patch_opt = STRBUF_INIT,	\
+		.fork_point = -1,			\
 	}
 
 static struct replay_opts get_replay_opts(const struct rebase_options *opts)
@@ -1095,6 +1097,11 @@ static int rebase_config(const char *var, const char *value, void *data)
 		return 0;
 	}
 
+	if (!strcmp(var, "rebase.forkpoint")) {
+		opts->fork_point = git_config_bool(var, value) ? -1 : 0;
+		return 0;
+	}
+
 	if (!strcmp(var, "rebase.usebuiltin")) {
 		opts->use_legacy_rebase = !git_config_bool(var, value);
 		return 0;
@@ -1306,7 +1313,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 	const char *gpg_sign = NULL;
 	struct string_list exec = STRING_LIST_INIT_NODUP;
 	const char *rebase_merges = NULL;
-	int fork_point = -1;
 	struct string_list strategy_options = STRING_LIST_INIT_NODUP;
 	struct object_id squash_onto;
 	char *squash_onto_name = NULL;
@@ -1406,7 +1412,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 			N_("mode"),
 			N_("try to rebase merges instead of skipping them"),
 			PARSE_OPT_OPTARG, NULL, (intptr_t)""},
-		OPT_BOOL(0, "fork-point", &fork_point,
+		OPT_BOOL(0, "fork-point", &options.fork_point,
 			 N_("use 'merge-base --fork-point' to refine upstream")),
 		OPT_STRING('s', "strategy", &options.strategy,
 			   N_("strategy"), N_("use the given merge strategy")),
@@ -1494,7 +1500,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 			die(_("cannot combine '--keep-base' with '--root'"));
 	}
 
-	if (options.root && fork_point > 0)
+	if (options.root && options.fork_point > 0)
 		die(_("cannot combine '--root' with '--fork-point'"));
 
 	if (action != ACTION_NONE && !in_progress)
@@ -1840,8 +1846,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 								    NULL);
 			if (!options.upstream_name)
 				error_on_missing_default_upstream();
-			if (fork_point < 0)
-				fork_point = 1;
+			if (options.fork_point < 0)
+				options.fork_point = 1;
 		} else {
 			options.upstream_name = argv[0];
 			argc--;
@@ -1945,7 +1951,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 	} else
 		BUG("unexpected number of arguments left to parse");
 
-	if (fork_point > 0) {
+	if (options.fork_point > 0) {
 		struct commit *head =
 			lookup_commit_reference(the_repository,
 						&options.orig_head);
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index d49d050..6bc12c8 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -358,7 +358,7 @@ static void proc_receive_ref_append(const char *prefix)
 	char *p;
 	int len;
 
-	ref_pattern = xcalloc(1, sizeof(struct proc_receive_ref));
+	CALLOC_ARRAY(ref_pattern, 1);
 	p = strchr(prefix, ':');
 	if (p) {
 		while (prefix < p) {
@@ -764,7 +764,7 @@ static void prepare_push_cert_sha1(struct child_process *proc)
 
 		memset(&sigcheck, '\0', sizeof(sigcheck));
 
-		bogs = parse_signature(push_cert.buf, push_cert.len);
+		bogs = parse_signed_buffer(push_cert.buf, push_cert.len);
 		check_signature(push_cert.buf, bogs, push_cert.buf + bogs,
 				push_cert.len - bogs, &sigcheck);
 
@@ -1024,7 +1024,7 @@ static int read_proc_receive_report(struct packet_reader *reader,
 			}
 			if (new_report) {
 				if (!hint->report) {
-					hint->report = xcalloc(1, sizeof(struct ref_push_report));
+					CALLOC_ARRAY(hint->report, 1);
 					report = hint->report;
 				} else {
 					report = hint->report;
@@ -2050,7 +2050,7 @@ static void queue_commands_from_cert(struct command **tail,
 		die("malformed push certificate %.*s", 100, push_cert->buf);
 	else
 		boc += 2;
-	eoc = push_cert->buf + parse_signature(push_cert->buf, push_cert->len);
+	eoc = push_cert->buf + parse_signed_buffer(push_cert->buf, push_cert->len);
 
 	while (boc < eoc) {
 		const char *eol = memchr(boc, '\n', eoc - boc);
@@ -2275,7 +2275,7 @@ static const char *unpack(int err_fd, struct shallow_info *si)
 		status = start_command(&child);
 		if (status)
 			return "index-pack fork failed";
-		pack_lockfile = index_pack_lockfile(child.out);
+		pack_lockfile = index_pack_lockfile(child.out, NULL);
 		close(child.out);
 		status = finish_command(&child);
 		if (status)
@@ -2313,11 +2313,9 @@ static void prepare_shallow_update(struct shallow_info *si)
 	ALLOC_ARRAY(si->used_shallow, si->shallow->nr);
 	assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
 
-	si->need_reachability_test =
-		xcalloc(si->shallow->nr, sizeof(*si->need_reachability_test));
-	si->reachable =
-		xcalloc(si->shallow->nr, sizeof(*si->reachable));
-	si->shallow_ref = xcalloc(si->ref->nr, sizeof(*si->shallow_ref));
+	CALLOC_ARRAY(si->need_reachability_test, si->shallow->nr);
+	CALLOC_ARRAY(si->reachable, si->shallow->nr);
+	CALLOC_ARRAY(si->shallow_ref, si->ref->nr);
 
 	for (i = 0; i < si->nr_ours; i++)
 		si->need_reachability_test[si->ours[i]] = 1;
diff --git a/builtin/reflog.c b/builtin/reflog.c
index ca1d807..09541d1 100644
--- a/builtin/reflog.c
+++ b/builtin/reflog.c
@@ -602,6 +602,9 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
 	 */
 	if (cb.cmd.stalefix) {
 		repo_init_revisions(the_repository, &cb.cmd.revs, prefix);
+		cb.cmd.revs.do_not_die_on_missing_tree = 1;
+		cb.cmd.revs.ignore_missing = 1;
+		cb.cmd.revs.ignore_missing_links = 1;
 		if (flags & EXPIRE_REFLOGS_VERBOSE)
 			printf(_("Marking reachable objects..."));
 		mark_reachable_objects(&cb.cmd.revs, 0, 0, NULL);
diff --git a/builtin/repack.c b/builtin/repack.c
index 279be11..01440de 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -14,6 +14,7 @@
 #include "object-store.h"
 #include "promisor-remote.h"
 #include "shallow.h"
+#include "pack.h"
 
 static int delta_base_offset = 1;
 static int pack_kept_objects = -1;
@@ -208,6 +209,7 @@ static struct {
 } exts[] = {
 	{".pack"},
 	{".idx"},
+	{".rev", 1},
 	{".bitmap", 1},
 	{".promisor", 1},
 };
@@ -263,7 +265,7 @@ static void repack_promisor_objects(const struct pack_objects_args *args,
 	while (strbuf_getline_lf(&line, out) != EOF) {
 		struct string_list_item *item;
 		char *promisor_name;
-		int fd;
+
 		if (line.len != the_hash_algo->hexsz)
 			die(_("repack: Expecting full hex object ID lines only from pack-objects."));
 		item = string_list_append(names, line.buf);
@@ -281,10 +283,7 @@ static void repack_promisor_objects(const struct pack_objects_args *args,
 		 */
 		promisor_name = mkpathdup("%s-%s.promisor", packtmp,
 					  line.buf);
-		fd = open(promisor_name, O_CREAT|O_EXCL|O_WRONLY, 0600);
-		if (fd < 0)
-			die_errno(_("unable to create '%s'"), promisor_name);
-		close(fd);
+		write_promisor_file(promisor_name, NULL, 0);
 
 		item->util = (void *)(uintptr_t)populate_pack_exts(item->string);
 
diff --git a/builtin/rev-list.c b/builtin/rev-list.c
index 25c6c3b..b4d8ea0 100644
--- a/builtin/rev-list.c
+++ b/builtin/rev-list.c
@@ -80,6 +80,19 @@ static int arg_show_object_names = 1;
 
 #define DEFAULT_OIDSET_SIZE     (16*1024)
 
+static int show_disk_usage;
+static off_t total_disk_usage;
+
+static off_t get_object_disk_usage(struct object *obj)
+{
+	off_t size;
+	struct object_info oi = OBJECT_INFO_INIT;
+	oi.disk_sizep = &size;
+	if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0)
+		die(_("unable to get disk usage of %s"), oid_to_hex(&obj->oid));
+	return size;
+}
+
 static void finish_commit(struct commit *commit);
 static void show_commit(struct commit *commit, void *data)
 {
@@ -88,6 +101,9 @@ static void show_commit(struct commit *commit, void *data)
 
 	display_progress(progress, ++progress_counter);
 
+	if (show_disk_usage)
+		total_disk_usage += get_object_disk_usage(&commit->object);
+
 	if (info->flags & REV_LIST_QUIET) {
 		finish_commit(commit);
 		return;
@@ -258,6 +274,8 @@ static void show_object(struct object *obj, const char *name, void *cb_data)
 	if (finish_object(obj, name, cb_data))
 		return;
 	display_progress(progress, ++progress_counter);
+	if (show_disk_usage)
+		total_disk_usage += get_object_disk_usage(obj);
 	if (info->flags & REV_LIST_QUIET)
 		return;
 
@@ -452,6 +470,23 @@ static int try_bitmap_traversal(struct rev_info *revs,
 	return 0;
 }
 
+static int try_bitmap_disk_usage(struct rev_info *revs,
+				 struct list_objects_filter_options *filter)
+{
+	struct bitmap_index *bitmap_git;
+
+	if (!show_disk_usage)
+		return -1;
+
+	bitmap_git = prepare_bitmap_walk(revs, filter);
+	if (!bitmap_git)
+		return -1;
+
+	printf("%"PRIuMAX"\n",
+	       (uintmax_t)get_disk_usage_from_bitmap(bitmap_git, revs));
+	return 0;
+}
+
 int cmd_rev_list(int argc, const char **argv, const char *prefix)
 {
 	struct rev_info revs;
@@ -584,6 +619,12 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
 			continue;
 		}
 
+		if (!strcmp(arg, "--disk-usage")) {
+			show_disk_usage = 1;
+			info.flags |= REV_LIST_QUIET;
+			continue;
+		}
+
 		usage(rev_list_usage);
 
 	}
@@ -626,6 +667,8 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
 	if (use_bitmap_index) {
 		if (!try_bitmap_count(&revs, &filter_options))
 			return 0;
+		if (!try_bitmap_disk_usage(&revs, &filter_options))
+			return 0;
 		if (!try_bitmap_traversal(&revs, &filter_options))
 			return 0;
 	}
@@ -690,5 +733,8 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
 			printf("%d\n", revs.count_left + revs.count_right);
 	}
 
+	if (show_disk_usage)
+		printf("%"PRIuMAX"\n", (uintmax_t)total_disk_usage);
+
 	return 0;
 }
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 69ba732..85bad90 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -583,6 +583,75 @@ static void handle_ref_opt(const char *pattern, const char *prefix)
 	clear_ref_exclusion(&ref_excludes);
 }
 
+enum format_type {
+	/* We would like a relative path. */
+	FORMAT_RELATIVE,
+	/* We would like a canonical absolute path. */
+	FORMAT_CANONICAL,
+	/* We would like the default behavior. */
+	FORMAT_DEFAULT,
+};
+
+enum default_type {
+	/* Our default is a relative path. */
+	DEFAULT_RELATIVE,
+	/* Our default is a relative path if there's a shared root. */
+	DEFAULT_RELATIVE_IF_SHARED,
+	/* Our default is a canonical absolute path. */
+	DEFAULT_CANONICAL,
+	/* Our default is not to modify the item. */
+	DEFAULT_UNMODIFIED,
+};
+
+static void print_path(const char *path, const char *prefix, enum format_type format, enum default_type def)
+{
+	char *cwd = NULL;
+	/*
+	 * We don't ever produce a relative path if prefix is NULL, so set the
+	 * prefix to the current directory so that we can produce a relative
+	 * path whenever possible.  If we're using RELATIVE_IF_SHARED mode, then
+	 * we want an absolute path unless the two share a common prefix, so don't
+	 * set it in that case, since doing so causes a relative path to always
+	 * be produced if possible.
+	 */
+	if (!prefix && (format != FORMAT_DEFAULT || def != DEFAULT_RELATIVE_IF_SHARED))
+		prefix = cwd = xgetcwd();
+	if (format == FORMAT_DEFAULT && def == DEFAULT_UNMODIFIED) {
+		puts(path);
+	} else if (format == FORMAT_RELATIVE ||
+		  (format == FORMAT_DEFAULT && def == DEFAULT_RELATIVE)) {
+		/*
+		 * In order for relative_path to work as expected, we need to
+		 * make sure that both paths are absolute paths.  If we don't,
+		 * we can end up with an unexpected absolute path that the user
+		 * didn't want.
+		 */
+		struct strbuf buf = STRBUF_INIT, realbuf = STRBUF_INIT, prefixbuf = STRBUF_INIT;
+		if (!is_absolute_path(path)) {
+			strbuf_realpath_forgiving(&realbuf, path,  1);
+			path = realbuf.buf;
+		}
+		if (!is_absolute_path(prefix)) {
+			strbuf_realpath_forgiving(&prefixbuf, prefix, 1);
+			prefix = prefixbuf.buf;
+		}
+		puts(relative_path(path, prefix, &buf));
+		strbuf_release(&buf);
+		strbuf_release(&realbuf);
+		strbuf_release(&prefixbuf);
+	} else if (format == FORMAT_DEFAULT && def == DEFAULT_RELATIVE_IF_SHARED) {
+		struct strbuf buf = STRBUF_INIT;
+		puts(relative_path(path, prefix, &buf));
+		strbuf_release(&buf);
+	} else {
+		struct strbuf buf = STRBUF_INIT;
+		strbuf_realpath_forgiving(&buf, path, 1);
+		puts(buf.buf);
+		strbuf_release(&buf);
+	}
+	free(cwd);
+}
+
 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;
@@ -596,6 +665,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 	struct strbuf buf = STRBUF_INIT;
 	const int hexsz = the_hash_algo->hexsz;
 	int seen_end_of_options = 0;
+	enum format_type format = FORMAT_DEFAULT;
 
 	if (argc > 1 && !strcmp("--parseopt", argv[1]))
 		return cmd_parseopt(argc - 1, argv + 1, prefix);
@@ -668,8 +738,9 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 				if (!argv[i + 1])
 					die("--git-path requires an argument");
 				strbuf_reset(&buf);
-				puts(relative_path(git_path("%s", argv[i + 1]),
-						   prefix, &buf));
+				print_path(git_path("%s", argv[i + 1]), prefix,
+						format,
+						DEFAULT_RELATIVE_IF_SHARED);
 				i++;
 				continue;
 			}
@@ -687,6 +758,16 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 					show(arg);
 				continue;
 			}
+			if (opt_with_value(arg, "--path-format", &arg)) {
+				if (!strcmp(arg, "absolute")) {
+					format = FORMAT_CANONICAL;
+				} else if (!strcmp(arg, "relative")) {
+					format = FORMAT_RELATIVE;
+				} else {
+					die("unknown argument to --path-format: %s", arg);
+				}
+				continue;
+			}
 			if (!strcmp(arg, "--default")) {
 				def = argv[++i];
 				if (!def)
@@ -807,7 +888,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 			if (!strcmp(arg, "--show-toplevel")) {
 				const char *work_tree = get_git_work_tree();
 				if (work_tree)
-					puts(work_tree);
+					print_path(work_tree, prefix, format, DEFAULT_UNMODIFIED);
 				else
 					die("this operation must be run in a work tree");
 				continue;
@@ -815,7 +896,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 			if (!strcmp(arg, "--show-superproject-working-tree")) {
 				struct strbuf superproject = STRBUF_INIT;
 				if (get_superproject_working_tree(&superproject))
-					puts(superproject.buf);
+					print_path(superproject.buf, prefix, format, DEFAULT_UNMODIFIED);
 				strbuf_release(&superproject);
 				continue;
 			}
@@ -850,16 +931,18 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 				const char *gitdir = getenv(GIT_DIR_ENVIRONMENT);
 				char *cwd;
 				int len;
+				enum format_type wanted = format;
 				if (arg[2] == 'g') {	/* --git-dir */
 					if (gitdir) {
-						puts(gitdir);
+						print_path(gitdir, prefix, format, DEFAULT_UNMODIFIED);
 						continue;
 					}
 					if (!prefix) {
-						puts(".git");
+						print_path(".git", prefix, format, DEFAULT_UNMODIFIED);
 						continue;
 					}
 				} else {		/* --absolute-git-dir */
+					wanted = FORMAT_CANONICAL;
 					if (!gitdir && !prefix)
 						gitdir = ".git";
 					if (gitdir) {
@@ -872,14 +955,14 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 				}
 				cwd = xgetcwd();
 				len = strlen(cwd);
-				printf("%s%s.git\n", cwd, len && cwd[len-1] != '/' ? "/" : "");
+				strbuf_reset(&buf);
+				strbuf_addf(&buf, "%s%s.git", cwd, len && cwd[len-1] != '/' ? "/" : "");
 				free(cwd);
+				print_path(buf.buf, prefix, wanted, DEFAULT_CANONICAL);
 				continue;
 			}
 			if (!strcmp(arg, "--git-common-dir")) {
-				strbuf_reset(&buf);
-				puts(relative_path(get_git_common_dir(),
-						   prefix, &buf));
+				print_path(get_git_common_dir(), prefix, format, DEFAULT_RELATIVE_IF_SHARED);
 				continue;
 			}
 			if (!strcmp(arg, "--is-inside-git-dir")) {
@@ -909,8 +992,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 				if (the_index.split_index) {
 					const struct object_id *oid = &the_index.split_index->base_oid;
 					const char *path = git_path("sharedindex.%s", oid_to_hex(oid));
-					strbuf_reset(&buf);
-					puts(relative_path(path, prefix, &buf));
+					print_path(path, prefix, format, DEFAULT_RELATIVE);
 				}
 				continue;
 			}
diff --git a/builtin/shortlog.c b/builtin/shortlog.c
index 1c0b3a9..3e7ab1c 100644
--- a/builtin/shortlog.c
+++ b/builtin/shortlog.c
@@ -61,8 +61,7 @@ static void insert_one_record(struct shortlog *log,
 	if (log->summary)
 		item->util = (void *)(UTIL_TO_INT(item) + 1);
 	else {
-		const char *dot3 = log->common_repo_prefix;
-		char *buffer, *p;
+		char *buffer;
 		struct strbuf subject = STRBUF_INIT;
 		const char *eol;
 
@@ -82,17 +81,6 @@ static void insert_one_record(struct shortlog *log,
 		format_subject(&subject, oneline, " ");
 		buffer = strbuf_detach(&subject, NULL);
 
-		if (dot3) {
-			int dot3len = strlen(dot3);
-			if (dot3len > 5) {
-				while ((p = strstr(buffer, dot3)) != NULL) {
-					int taillen = strlen(p) - dot3len;
-					memcpy(p, "/.../", 5);
-					memmove(p + 5, p + dot3len, taillen + 1);
-				}
-			}
-		}
-
 		if (item->util == NULL)
 			item->util = xcalloc(1, sizeof(struct string_list));
 		string_list_append(item->util, buffer);
@@ -342,7 +330,7 @@ void shortlog_init(struct shortlog *log)
 {
 	memset(log, 0, sizeof(*log));
 
-	read_mailmap(&log->mailmap, &log->common_repo_prefix);
+	read_mailmap(&log->mailmap);
 
 	log->list.strdup_strings = 1;
 	log->wrap = DEFAULT_WRAPLEN;
diff --git a/builtin/show-ref.c b/builtin/show-ref.c
index ae60b4a..7f8a533 100644
--- a/builtin/show-ref.c
+++ b/builtin/show-ref.c
@@ -40,7 +40,7 @@ static void show_one(const char *refname, const struct object_id *oid)
 	if (!deref_tags)
 		return;
 
-	if (!peel_ref(refname, &peeled)) {
+	if (!peel_iterated_oid(oid, &peeled)) {
 		hex = find_unique_abbrev(&peeled, abbrev);
 		printf("%s %s^{}\n", hex, refname);
 	}
diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c
index e3140db..2306a9a 100644
--- a/builtin/sparse-checkout.c
+++ b/builtin/sparse-checkout.c
@@ -22,11 +22,6 @@ static char const * const builtin_sparse_checkout_usage[] = {
 	NULL
 };
 
-static char *get_sparse_checkout_filename(void)
-{
-	return git_pathdup("info/sparse-checkout");
-}
-
 static void write_patterns_to_file(FILE *fp, struct pattern_list *pl)
 {
 	int i;
diff --git a/builtin/stash.c b/builtin/stash.c
index 9bc85f9..ba774cc 100644
--- a/builtin/stash.c
+++ b/builtin/stash.c
@@ -87,7 +87,7 @@ static const char * const git_stash_save_usage[] = {
 	NULL
 };
 
-static const char *ref_stash = "refs/stash";
+static const char ref_stash[] = "refs/stash";
 static struct strbuf stash_index_path = STRBUF_INIT;
 
 /*
@@ -222,7 +222,7 @@ static int clear_stash(int argc, const char **argv, const char *prefix)
 			     PARSE_OPT_STOP_AT_NON_OPTION);
 
 	if (argc)
-		return error(_("git stash clear with parameters is "
+		return error(_("git stash clear with arguments is "
 			       "unimplemented"));
 
 	return do_clear_stash();
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index c2bd882..9d505a6 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -1257,7 +1257,7 @@ static int compute_summary_module_list(struct object_id *head_oid,
 	git_config(git_diff_basic_config, NULL);
 	init_revisions(&rev, info->prefix);
 	rev.abbrev = 0;
-	precompose_argv(diff_args.nr, diff_args.v);
+	precompose_argv_prefix(diff_args.nr, diff_args.v, NULL);
 	setup_revisions(diff_args.nr, diff_args.v, &rev, NULL);
 	rev.diffopt.output_format = DIFF_FORMAT_NO_OUTPUT | DIFF_FORMAT_CALLBACK;
 	rev.diffopt.format_callback = submodule_summary_callback;
diff --git a/builtin/tag.c b/builtin/tag.c
index 24d35b7..d403417 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -72,10 +72,10 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting,
 }
 
 typedef int (*each_tag_name_fn)(const char *name, const char *ref,
-				const struct object_id *oid, const void *cb_data);
+				const struct object_id *oid, void *cb_data);
 
 static int for_each_tag_name(const char **argv, each_tag_name_fn fn,
-			     const void *cb_data)
+			     void *cb_data)
 {
 	const char **p;
 	struct strbuf ref = STRBUF_INIT;
@@ -97,18 +97,42 @@ static int for_each_tag_name(const char **argv, each_tag_name_fn fn,
 	return had_error;
 }
 
-static int delete_tag(const char *name, const char *ref,
-		      const struct object_id *oid, const void *cb_data)
+static int collect_tags(const char *name, const char *ref,
+			const struct object_id *oid, void *cb_data)
 {
-	if (delete_ref(NULL, ref, oid, 0))
-		return 1;
-	printf(_("Deleted tag '%s' (was %s)\n"), name,
-	       find_unique_abbrev(oid, DEFAULT_ABBREV));
+	struct string_list *ref_list = cb_data;
+
+	string_list_append(ref_list, ref);
+	ref_list->items[ref_list->nr - 1].util = oiddup(oid);
 	return 0;
 }
 
+static int delete_tags(const char **argv)
+{
+	int result;
+	struct string_list refs_to_delete = STRING_LIST_INIT_DUP;
+	struct string_list_item *item;
+
+	result = for_each_tag_name(argv, collect_tags, (void *)&refs_to_delete);
+	if (delete_refs(NULL, &refs_to_delete, REF_NO_DEREF))
+		result = 1;
+
+	for_each_string_list_item(item, &refs_to_delete) {
+		const char *name = item->string;
+		struct object_id *oid = item->util;
+		if (!ref_exists(name))
+			printf(_("Deleted tag '%s' (was %s)\n"),
+				item->string + 10,
+				find_unique_abbrev(oid, DEFAULT_ABBREV));
+
+		free(oid);
+	}
+	string_list_clear(&refs_to_delete, 0);
+	return result;
+}
+
 static int verify_tag(const char *name, const char *ref,
-		      const struct object_id *oid, const void *cb_data)
+		      const struct object_id *oid, void *cb_data)
 {
 	int flags;
 	const struct ref_format *format = cb_data;
@@ -174,11 +198,17 @@ static void write_tag_body(int fd, const struct object_id *oid)
 {
 	unsigned long size;
 	enum object_type type;
-	char *buf, *sp;
+	char *buf, *sp, *orig;
+	struct strbuf payload = STRBUF_INIT;
+	struct strbuf signature = STRBUF_INIT;
 
-	buf = read_object_file(oid, &type, &size);
+	orig = buf = read_object_file(oid, &type, &size);
 	if (!buf)
 		return;
+	if (parse_signature(buf, size, &payload, &signature)) {
+		buf = payload.buf;
+		size = payload.len;
+	}
 	/* skip header */
 	sp = strstr(buf, "\n\n");
 
@@ -187,9 +217,11 @@ static void write_tag_body(int fd, const struct object_id *oid)
 		return;
 	}
 	sp += 2; /* skip the 2 LFs */
-	write_or_die(fd, sp, parse_signature(sp, buf + size - sp));
+	write_or_die(fd, sp, buf + size - sp);
 
-	free(buf);
+	free(orig);
+	strbuf_release(&payload);
+	strbuf_release(&signature);
 }
 
 static int build_tag_object(struct strbuf *buf, int sign, struct object_id *result)
@@ -512,7 +544,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 	if (filter.reachable_from || filter.unreachable_from)
 		die(_("--merged and --no-merged options are only allowed in list mode"));
 	if (cmdmode == 'd')
-		return for_each_tag_name(argv, delete_tag, NULL);
+		return delete_tags(argv);
 	if (cmdmode == 'v') {
 		if (format.format && verify_ref_format(&format))
 			usage_with_options(git_tag_usage, options);
@@ -540,7 +572,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 
 	object_ref = argc == 2 ? argv[1] : "HEAD";
 	if (argc > 2)
-		die(_("too many params"));
+		die(_("too many arguments"));
 
 	if (get_oid(object_ref, &object))
 		die(_("Failed to resolve '%s' as a valid ref."), object_ref);
diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c
index dd4a75e..a4ba2eb 100644
--- a/builtin/unpack-objects.c
+++ b/builtin/unpack-objects.c
@@ -46,7 +46,7 @@ static struct obj_buffer *lookup_object_buffer(struct object *base)
 static void add_object_buffer(struct object *object, char *buffer, unsigned long size)
 {
 	struct obj_buffer *obj;
-	obj = xcalloc(1, sizeof(struct obj_buffer));
+	CALLOC_ARRAY(obj, 1);
 	obj->buffer = buffer;
 	obj->size = size;
 	if (add_decoration(&obj_decorate, object, obj))
@@ -500,7 +500,7 @@ static void unpack_all(void)
 
 	if (!quiet)
 		progress = start_progress(_("Unpacking objects"), nr_objects);
-	obj_list = xcalloc(nr_objects, sizeof(*obj_list));
+	CALLOC_ARRAY(obj_list, nr_objects);
 	for (i = 0; i < nr_objects; i++) {
 		unpack_one(i);
 		display_progress(progress, i + 1);
diff --git a/builtin/worktree.c b/builtin/worktree.c
index 197fd24..1cd5c20 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -12,6 +12,7 @@
 #include "submodule.h"
 #include "utf8.h"
 #include "worktree.h"
+#include "quote.h"
 
 static const char * const worktree_usage[] = {
 	N_("git worktree add [<options>] <path> [<commit-ish>]"),
@@ -67,79 +68,6 @@ static void delete_worktrees_dir_if_empty(void)
 	rmdir(git_path("worktrees")); /* ignore failed removal */
 }
 
-/*
- * Return true if worktree entry should be pruned, along with the reason for
- * pruning. Otherwise, return false and the worktree's path, or NULL if it
- * cannot be determined. Caller is responsible for freeing returned path.
- */
-static int should_prune_worktree(const char *id, struct strbuf *reason, char **wtpath)
-{
-	struct stat st;
-	char *path;
-	int fd;
-	size_t len;
-	ssize_t read_result;
-
-	*wtpath = NULL;
-	if (!is_directory(git_path("worktrees/%s", id))) {
-		strbuf_addstr(reason, _("not a valid directory"));
-		return 1;
-	}
-	if (file_exists(git_path("worktrees/%s/locked", id)))
-		return 0;
-	if (stat(git_path("worktrees/%s/gitdir", id), &st)) {
-		strbuf_addstr(reason, _("gitdir file does not exist"));
-		return 1;
-	}
-	fd = open(git_path("worktrees/%s/gitdir", id), O_RDONLY);
-	if (fd < 0) {
-		strbuf_addf(reason, _("unable to read gitdir file (%s)"),
-			    strerror(errno));
-		return 1;
-	}
-	len = xsize_t(st.st_size);
-	path = xmallocz(len);
-
-	read_result = read_in_full(fd, path, len);
-	if (read_result < 0) {
-		strbuf_addf(reason, _("unable to read gitdir file (%s)"),
-			    strerror(errno));
-		close(fd);
-		free(path);
-		return 1;
-	}
-	close(fd);
-
-	if (read_result != len) {
-		strbuf_addf(reason,
-			    _("short read (expected %"PRIuMAX" bytes, read %"PRIuMAX")"),
-			    (uintmax_t)len, (uintmax_t)read_result);
-		free(path);
-		return 1;
-	}
-	while (len && (path[len - 1] == '\n' || path[len - 1] == '\r'))
-		len--;
-	if (!len) {
-		strbuf_addstr(reason, _("invalid gitdir file"));
-		free(path);
-		return 1;
-	}
-	path[len] = '\0';
-	if (!file_exists(path)) {
-		if (stat(git_path("worktrees/%s/index", id), &st) ||
-		    st.st_mtime <= expire) {
-			strbuf_addstr(reason, _("gitdir file points to non-existent location"));
-			free(path);
-			return 1;
-		} else {
-			*wtpath = path;
-			return 0;
-		}
-	}
-	*wtpath = path;
-	return 0;
-}
-
 static void prune_worktree(const char *id, const char *reason)
 {
 	if (show_only || verbose)
@@ -195,7 +123,7 @@ static void prune_worktrees(void)
 		if (is_dot_or_dotdot(d->d_name))
 			continue;
 		strbuf_reset(&reason);
-		if (should_prune_worktree(d->d_name, &reason, &path))
+		if (should_prune_worktree(d->d_name, &reason, &path, expire))
 			prune_worktree(d->d_name, reason.buf);
 		else if (path)
 			string_list_append(&kept, path)->util = xstrdup(d->d_name);
@@ -642,6 +570,8 @@ static int add(int ac, const char **av, const char *prefix)
 
 static void show_worktree_porcelain(struct worktree *wt)
 {
+	const char *reason;
+
 	printf("worktree %s\n", wt->path);
 	if (wt->is_bare)
 		printf("bare\n");
@@ -652,6 +582,20 @@ static void show_worktree_porcelain(struct worktree *wt)
 		else if (wt->head_ref)
 			printf("branch %s\n", wt->head_ref);
 	}
+
+	reason = worktree_lock_reason(wt);
+	if (reason && *reason) {
+		struct strbuf sb = STRBUF_INIT;
+		quote_c_style(reason, &sb, NULL, 0);
+		printf("locked %s\n", sb.buf);
+		strbuf_release(&sb);
+	} else if (reason)
+		printf("locked\n");
+
+	reason = worktree_prune_reason(wt, expire);
+	if (reason)
+		printf("prunable %s\n", reason);
+
 	printf("\n");
 }
 
@@ -660,6 +604,7 @@ static void show_worktree(struct worktree *wt, int path_maxlen, int abbrev_len)
 	struct strbuf sb = STRBUF_INIT;
 	int cur_path_len = strlen(wt->path);
 	int path_adj = cur_path_len - utf8_strwidth(wt->path);
+	const char *reason;
 
 	strbuf_addf(&sb, "%-*s ", 1 + path_maxlen + path_adj, wt->path);
 	if (wt->is_bare)
@@ -677,9 +622,18 @@ static void show_worktree(struct worktree *wt, int path_maxlen, int abbrev_len)
 			strbuf_addstr(&sb, "(error)");
 	}
 
-	if (!is_main_worktree(wt) && worktree_lock_reason(wt))
+	reason = worktree_lock_reason(wt);
+	if (verbose && reason && *reason)
+		strbuf_addf(&sb, "\n\tlocked: %s", reason);
+	else if (reason)
 		strbuf_addstr(&sb, " locked");
 
+	reason = worktree_prune_reason(wt, expire);
+	if (verbose && reason)
+		strbuf_addf(&sb, "\n\tprunable: %s", reason);
+	else if (reason)
+		strbuf_addstr(&sb, " prunable");
+
 	printf("%s\n", sb.buf);
 	strbuf_release(&sb);
 }
@@ -723,12 +677,18 @@ static int list(int ac, const char **av, const char *prefix)
 
 	struct option options[] = {
 		OPT_BOOL(0, "porcelain", &porcelain, N_("machine-readable output")),
+		OPT__VERBOSE(&verbose, N_("show extended annotations and reasons, if available")),
+		OPT_EXPIRY_DATE(0, "expire", &expire,
+				N_("add 'prunable' annotation to worktrees older than <time>")),
 		OPT_END()
 	};
 
+	expire = TIME_MAX;
 	ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
 	if (ac)
 		usage_with_options(worktree_usage, options);
+	else if (verbose && porcelain)
+		die(_("--verbose and --porcelain are mutually exclusive"));
 	else {
 		struct worktree **worktrees = get_worktrees();
 		int path_maxlen = 0, abbrev = DEFAULT_ABBREV, i;
@@ -1052,10 +1012,10 @@ static int repair(int ac, const char **av, const char *prefix)
 	int rc = 0;
 
 	ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
-	repair_worktrees(report_repair, &rc);
 	p = ac > 0 ? av : self;
 	for (; *p; p++)
 		repair_worktree_at_path(*p, report_repair, &rc);
+	repair_worktrees(report_repair, &rc);
 	return rc;
 }
 
diff --git a/bulk-checkin.c b/bulk-checkin.c
index 583aacb..6f3c97c 100644
--- a/bulk-checkin.c
+++ b/bulk-checkin.c
@@ -211,7 +211,7 @@ static int deflate_to_pack(struct bulk_checkin_state *state,
 
 	/* Note: idx is non-NULL when we are writing */
 	if ((flags & HASH_WRITE_OBJECT) != 0)
-		idx = xcalloc(1, sizeof(*idx));
+		CALLOC_ARRAY(idx, 1);
 
 	already_hashed_to = 0;
 
diff --git a/bundle.c b/bundle.c
index cb0e593..693d619 100644
--- a/bundle.c
+++ b/bundle.c
@@ -338,48 +338,6 @@ static int write_pack_data(int bundle_fd, struct rev_info *revs, struct strvec *
 	return 0;
 }
 
-static int compute_and_write_prerequisites(int bundle_fd,
-					   struct rev_info *revs,
-					   int argc, const char **argv)
-{
-	struct child_process rls = CHILD_PROCESS_INIT;
-	struct strbuf buf = STRBUF_INIT;
-	FILE *rls_fout;
-	int i;
-
-	strvec_pushl(&rls.args,
-		     "rev-list", "--boundary", "--pretty=oneline",
-		     NULL);
-	for (i = 1; i < argc; i++)
-		strvec_push(&rls.args, argv[i]);
-	rls.out = -1;
-	rls.git_cmd = 1;
-	if (start_command(&rls))
-		return -1;
-	rls_fout = xfdopen(rls.out, "r");
-	while (strbuf_getwholeline(&buf, rls_fout, '\n') != EOF) {
-		struct object_id oid;
-		if (buf.len > 0 && buf.buf[0] == '-') {
-			write_or_die(bundle_fd, buf.buf, buf.len);
-			if (!get_oid_hex(buf.buf + 1, &oid)) {
-				struct object *object = parse_object_or_die(&oid,
-									    buf.buf);
-				object->flags |= UNINTERESTING;
-				add_pending_object(revs, object, buf.buf);
-			}
-		} else if (!get_oid_hex(buf.buf, &oid)) {
-			struct object *object = parse_object_or_die(&oid,
-								    buf.buf);
-			object->flags |= SHOWN;
-		}
-	}
-	strbuf_release(&buf);
-	fclose(rls_fout);
-	if (finish_command(&rls))
-		return error(_("rev-list died"));
-	return 0;
-}
-
 /*
  * Write out bundle refs based on the tips already
  * parsed into revs.pending. As a side effect, may
@@ -474,6 +432,38 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
 	return ref_count;
 }
 
+struct bundle_prerequisites_info {
+	struct object_array *pending;
+	int fd;
+};
+
+static void write_bundle_prerequisites(struct commit *commit, void *data)
+{
+	struct bundle_prerequisites_info *bpi = data;
+	struct object *object;
+	struct pretty_print_context ctx = { 0 };
+	struct strbuf buf = STRBUF_INIT;
+
+	if (!(commit->object.flags & BOUNDARY))
+		return;
+	strbuf_addf(&buf, "-%s ", oid_to_hex(&commit->object.oid));
+	write_or_die(bpi->fd, buf.buf, buf.len);
+
+	ctx.fmt = CMIT_FMT_ONELINE;
+	ctx.output_encoding = get_log_output_encoding();
+	strbuf_reset(&buf);
+	pretty_print_commit(&ctx, commit, &buf);
+	strbuf_trim(&buf);
+
+	object = (struct object *)commit;
+	object->flags |= UNINTERESTING;
+	add_object_array_with_path(object, buf.buf, bpi->pending, S_IFINVALID,
+				   NULL);
+	strbuf_addch(&buf, '\n');
+	write_or_die(bpi->fd, buf.buf, buf.len);
+	strbuf_release(&buf);
+}
+
 int create_bundle(struct repository *r, const char *path,
 		  int argc, const char **argv, struct strvec *pack_options, int version)
 {
@@ -481,8 +471,10 @@ int create_bundle(struct repository *r, const char *path,
 	int bundle_fd = -1;
 	int bundle_to_stdout;
 	int ref_count = 0;
-	struct rev_info revs;
+	struct rev_info revs, revs_copy;
 	int min_version = the_hash_algo == &hash_algos[GIT_HASH_SHA1] ? 2 : 3;
+	struct bundle_prerequisites_info bpi;
+	int i;
 
 	bundle_to_stdout = !strcmp(path, "-");
 	if (bundle_to_stdout)
@@ -512,10 +504,6 @@ int create_bundle(struct repository *r, const char *path,
 	save_commit_buffer = 0;
 	repo_init_revisions(r, &revs, NULL);
 
-	/* write prerequisites */
-	if (compute_and_write_prerequisites(bundle_fd, &revs, argc, argv))
-		goto err;
-
 	argc = setup_revisions(argc, argv, &revs, NULL);
 
 	if (argc > 1) {
@@ -523,16 +511,37 @@ int create_bundle(struct repository *r, const char *path,
 		goto err;
 	}
 
-	object_array_remove_duplicates(&revs.pending);
+	/* save revs.pending in revs_copy for later use */
+	memcpy(&revs_copy, &revs, sizeof(revs));
+	revs_copy.pending.nr = 0;
+	revs_copy.pending.alloc = 0;
+	revs_copy.pending.objects = NULL;
+	for (i = 0; i < revs.pending.nr; i++) {
+		struct object_array_entry *e = revs.pending.objects + i;
+		if (e)
+			add_object_array_with_path(e->item, e->name,
+						   &revs_copy.pending,
+						   e->mode, e->path);
+	}
 
-	ref_count = write_bundle_refs(bundle_fd, &revs);
+	/* write prerequisites */
+	revs.boundary = 1;
+	if (prepare_revision_walk(&revs))
+		die("revision walk setup failed");
+	bpi.fd = bundle_fd;
+	bpi.pending = &revs_copy.pending;
+	traverse_commit_list(&revs, write_bundle_prerequisites, NULL, &bpi);
+	object_array_remove_duplicates(&revs_copy.pending);
+
+	/* write bundle refs */
+	ref_count = write_bundle_refs(bundle_fd, &revs_copy);
 	if (!ref_count)
 		die(_("Refusing to create empty bundle."));
 	else if (ref_count < 0)
 		goto err;
 
 	/* write pack */
-	if (write_pack_data(bundle_fd, &revs, pack_options))
+	if (write_pack_data(bundle_fd, &revs_copy, pack_options))
 		goto err;
 
 	if (!bundle_to_stdout) {
diff --git a/cache-tree.c b/cache-tree.c
index a537a80..add1f07 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -45,7 +45,7 @@ static int subtree_name_cmp(const char *one, int onelen,
 	return memcmp(one, two, onelen);
 }
 
-static int subtree_pos(struct cache_tree *it, const char *path, int pathlen)
+int cache_tree_subtree_pos(struct cache_tree *it, const char *path, int pathlen)
 {
 	struct cache_tree_sub **down = it->down;
 	int lo, hi;
@@ -72,7 +72,7 @@ static struct cache_tree_sub *find_subtree(struct cache_tree *it,
 					   int create)
 {
 	struct cache_tree_sub *down;
-	int pos = subtree_pos(it, path, pathlen);
+	int pos = cache_tree_subtree_pos(it, path, pathlen);
 	if (0 <= pos)
 		return it->down[pos];
 	if (!create)
@@ -123,7 +123,7 @@ static int do_invalidate_path(struct cache_tree *it, const char *path)
 	it->entry_count = -1;
 	if (!*slash) {
 		int pos;
-		pos = subtree_pos(it, path, namelen);
+		pos = cache_tree_subtree_pos(it, path, namelen);
 		if (0 <= pos) {
 			cache_tree_free(&it->down[pos]->cache_tree);
 			free(it->down[pos]);
@@ -151,16 +151,15 @@ void cache_tree_invalidate_path(struct index_state *istate, const char *path)
 		istate->cache_changed |= CACHE_TREE_CHANGED;
 }
 
-static int verify_cache(struct cache_entry **cache,
-			int entries, int flags)
+static int verify_cache(struct index_state *istate, int flags)
 {
-	int i, funny;
+	unsigned i, funny;
 	int silent = flags & WRITE_TREE_SILENT;
 
 	/* Verify that the tree is merged */
 	funny = 0;
-	for (i = 0; i < entries; i++) {
-		const struct cache_entry *ce = cache[i];
+	for (i = 0; i < istate->cache_nr; i++) {
+		const struct cache_entry *ce = istate->cache[i];
 		if (ce_stage(ce)) {
 			if (silent)
 				return -1;
@@ -180,17 +179,19 @@ static int verify_cache(struct cache_entry **cache,
 	 * stage 0 entries.
 	 */
 	funny = 0;
-	for (i = 0; i < entries - 1; i++) {
+	for (i = 0; i + 1 < istate->cache_nr; i++) {
 		/* path/file always comes after path because of the way
 		 * the cache is sorted.  Also path can appear only once,
 		 * which means conflicting one would immediately follow.
 		 */
-		const char *this_name = cache[i]->name;
-		const char *next_name = cache[i+1]->name;
-		int this_len = strlen(this_name);
-		if (this_len < strlen(next_name) &&
-		    strncmp(this_name, next_name, this_len) == 0 &&
-		    next_name[this_len] == '/') {
+		const struct cache_entry *this_ce = istate->cache[i];
+		const struct cache_entry *next_ce = istate->cache[i + 1];
+		const char *this_name = this_ce->name;
+		const char *next_name = next_ce->name;
+		int this_len = ce_namelen(this_ce);
+		if (this_len < ce_namelen(next_ce) &&
+		    next_name[this_len] == '/' &&
+		    strncmp(this_name, next_name, this_len) == 0) {
 			if (10 < ++funny) {
 				fprintf(stderr, "...\n");
 				break;
@@ -434,15 +435,21 @@ static int update_one(struct cache_tree *it,
 
 int cache_tree_update(struct index_state *istate, int flags)
 {
-	struct cache_tree *it = istate->cache_tree;
-	struct cache_entry **cache = istate->cache;
-	int entries = istate->cache_nr;
-	int skip, i = verify_cache(cache, entries, flags);
+	int skip, i;
+
+	i = verify_cache(istate, flags);
 
 	if (i)
 		return i;
+
+	if (!istate->cache_tree)
+		istate->cache_tree = cache_tree();
+
 	trace_performance_enter();
-	i = update_one(it, cache, entries, "", 0, &skip, flags);
+	trace2_region_enter("cache_tree", "update", the_repository);
+	i = update_one(istate->cache_tree, istate->cache, istate->cache_nr,
+		       "", 0, &skip, flags);
+	trace2_region_leave("cache_tree", "update", the_repository);
 	trace_performance_leave("cache_tree_update");
 	if (i < 0)
 		return i;
@@ -492,7 +499,9 @@ static void write_one(struct strbuf *buffer, struct cache_tree *it,
 
 void cache_tree_write(struct strbuf *sb, struct cache_tree *root)
 {
+	trace2_region_enter("cache_tree", "write", the_repository);
 	write_one(sb, root, "", 0);
+	trace2_region_leave("cache_tree", "write", the_repository);
 }
 
 static struct cache_tree *read_one(const char **buffer, unsigned long *size_p)
@@ -555,7 +564,7 @@ static struct cache_tree *read_one(const char **buffer, unsigned long *size_p)
 	 * hence +2.
 	 */
 	it->subtree_alloc = subtree_nr + 2;
-	it->down = xcalloc(it->subtree_alloc, sizeof(struct cache_tree_sub *));
+	CALLOC_ARRAY(it->down, it->subtree_alloc);
 	for (i = 0; i < subtree_nr; i++) {
 		/* read each subtree */
 		struct cache_tree *sub;
@@ -581,9 +590,16 @@ static struct cache_tree *read_one(const char **buffer, unsigned long *size_p)
 
 struct cache_tree *cache_tree_read(const char *buffer, unsigned long size)
 {
+	struct cache_tree *result;
+
 	if (buffer[0])
 		return NULL; /* not the whole tree */
-	return read_one(&buffer, &size);
+
+	trace2_region_enter("cache_tree", "read", the_repository);
+	result = read_one(&buffer, &size);
+	trace2_region_leave("cache_tree", "read", the_repository);
+
+	return result;
 }
 
 static struct cache_tree *cache_tree_find(struct cache_tree *it, const char *path)
@@ -622,9 +638,6 @@ static int write_index_as_tree_internal(struct object_id *oid,
 		cache_tree_valid = 0;
 	}
 
-	if (!index_state->cache_tree)
-		index_state->cache_tree = cache_tree();
-
 	if (!cache_tree_valid && cache_tree_update(index_state, flags) < 0)
 		return WRITE_TREE_UNMERGED_INDEX;
 
@@ -733,10 +746,13 @@ void prime_cache_tree(struct repository *r,
 		      struct index_state *istate,
 		      struct tree *tree)
 {
+	trace2_region_enter("cache-tree", "prime_cache_tree", the_repository);
 	cache_tree_free(&istate->cache_tree);
 	istate->cache_tree = cache_tree();
+
 	prime_cache_tree_rec(r, istate->cache_tree, tree);
 	istate->cache_changed |= CACHE_TREE_CHANGED;
+	trace2_region_leave("cache-tree", "prime_cache_tree", the_repository);
 }
 
 /*
diff --git a/cache-tree.h b/cache-tree.h
index 639bfa5..8efecce 100644
--- a/cache-tree.h
+++ b/cache-tree.h
@@ -27,6 +27,8 @@ void cache_tree_free(struct cache_tree **);
 void cache_tree_invalidate_path(struct index_state *, const char *);
 struct cache_tree_sub *cache_tree_sub(struct cache_tree *, const char *);
 
+int cache_tree_subtree_pos(struct cache_tree *it, const char *path, int pathlen);
+
 void cache_tree_write(struct strbuf *, struct cache_tree *root);
 struct cache_tree *cache_tree_read(const char *buffer, unsigned long size);
 
diff --git a/cache.h b/cache.h
index 0a0b32f..6fda809 100644
--- a/cache.h
+++ b/cache.h
@@ -328,6 +328,7 @@ struct index_state {
 	struct ewah_bitmap *fsmonitor_dirty;
 	struct mem_pool *ce_mem_pool;
 	struct progress *progress;
+	struct repository *repo;
 };
 
 /* Name hashing */
@@ -472,6 +473,7 @@ static inline enum object_type object_type(unsigned int mode)
 #define TEMPLATE_DIR_ENVIRONMENT "GIT_TEMPLATE_DIR"
 #define CONFIG_ENVIRONMENT "GIT_CONFIG"
 #define CONFIG_DATA_ENVIRONMENT "GIT_CONFIG_PARAMETERS"
+#define CONFIG_COUNT_ENVIRONMENT "GIT_CONFIG_COUNT"
 #define EXEC_PATH_ENVIRONMENT "GIT_EXEC_PATH"
 #define CEILING_DIRECTORIES_ENVIRONMENT "GIT_CEILING_DIRECTORIES"
 #define NO_REPLACE_OBJECTS_ENVIRONMENT "GIT_NO_REPLACE_OBJECTS"
@@ -1231,6 +1233,8 @@ static inline int is_absolute_path(const char *path)
 int is_directory(const char *);
 char *strbuf_realpath(struct strbuf *resolved, const char *path,
 		      int die_on_error);
+char *strbuf_realpath_forgiving(struct strbuf *resolved, const char *path,
+				int die_on_error);
 char *real_pathdup(const char *path, int die_on_error);
 const char *absolute_path(const char *path);
 char *absolute_pathdup(const char *path);
diff --git a/chunk-format.c b/chunk-format.c
new file mode 100644
index 0000000..da191e5
--- /dev/null
+++ b/chunk-format.c
@@ -0,0 +1,179 @@
+#include "cache.h"
+#include "chunk-format.h"
+#include "csum-file.h"
+
+/*
+ * When writing a chunk-based file format, collect the chunks in
+ * an array of chunk_info structs. The size stores the _expected_
+ * amount of data that will be written by write_fn.
+ */
+struct chunk_info {
+	uint32_t id;
+	uint64_t size;
+	chunk_write_fn write_fn;
+
+	const void *start;
+};
+
+struct chunkfile {
+	struct hashfile *f;
+
+	struct chunk_info *chunks;
+	size_t chunks_nr;
+	size_t chunks_alloc;
+};
+
+struct chunkfile *init_chunkfile(struct hashfile *f)
+{
+	struct chunkfile *cf = xcalloc(1, sizeof(*cf));
+	cf->f = f;
+	return cf;
+}
+
+void free_chunkfile(struct chunkfile *cf)
+{
+	if (!cf)
+		return;
+	free(cf->chunks);
+	free(cf);
+}
+
+int get_num_chunks(struct chunkfile *cf)
+{
+	return cf->chunks_nr;
+}
+
+void add_chunk(struct chunkfile *cf,
+	       uint32_t id,
+	       size_t size,
+	       chunk_write_fn fn)
+{
+	ALLOC_GROW(cf->chunks, cf->chunks_nr + 1, cf->chunks_alloc);
+
+	cf->chunks[cf->chunks_nr].id = id;
+	cf->chunks[cf->chunks_nr].write_fn = fn;
+	cf->chunks[cf->chunks_nr].size = size;
+	cf->chunks_nr++;
+}
+
+int write_chunkfile(struct chunkfile *cf, void *data)
+{
+	int i;
+	uint64_t cur_offset = hashfile_total(cf->f);
+
+	/* Add the table of contents to the current offset */
+	cur_offset += (cf->chunks_nr + 1) * CHUNK_TOC_ENTRY_SIZE;
+
+	for (i = 0; i < cf->chunks_nr; i++) {
+		hashwrite_be32(cf->f, cf->chunks[i].id);
+		hashwrite_be64(cf->f, cur_offset);
+
+		cur_offset += cf->chunks[i].size;
+	}
+
+	/* Trailing entry marks the end of the chunks */
+	hashwrite_be32(cf->f, 0);
+	hashwrite_be64(cf->f, cur_offset);
+
+	for (i = 0; i < cf->chunks_nr; i++) {
+		off_t start_offset = hashfile_total(cf->f);
+		int result = cf->chunks[i].write_fn(cf->f, data);
+
+		if (result)
+			return result;
+
+		if (hashfile_total(cf->f) - start_offset != cf->chunks[i].size)
+			BUG("expected to write %"PRId64" bytes to chunk %"PRIx32", but wrote %"PRId64" instead",
+			    cf->chunks[i].size, cf->chunks[i].id,
+			    hashfile_total(cf->f) - start_offset);
+	}
+
+	return 0;
+}
+
+int read_table_of_contents(struct chunkfile *cf,
+			   const unsigned char *mfile,
+			   size_t mfile_size,
+			   uint64_t toc_offset,
+			   int toc_length)
+{
+	int i;
+	uint32_t chunk_id;
+	const unsigned char *table_of_contents = mfile + toc_offset;
+
+	ALLOC_GROW(cf->chunks, toc_length, cf->chunks_alloc);
+
+	while (toc_length--) {
+		uint64_t chunk_offset, next_chunk_offset;
+
+		chunk_id = get_be32(table_of_contents);
+		chunk_offset = get_be64(table_of_contents + 4);
+
+		if (!chunk_id) {
+			error(_("terminating chunk id appears earlier than expected"));
+			return 1;
+		}
+
+		table_of_contents += CHUNK_TOC_ENTRY_SIZE;
+		next_chunk_offset = get_be64(table_of_contents + 4);
+
+		if (next_chunk_offset < chunk_offset ||
+		    next_chunk_offset > mfile_size - the_hash_algo->rawsz) {
+			error(_("improper chunk offset(s) %"PRIx64" and %"PRIx64""),
+			      chunk_offset, next_chunk_offset);
+			return -1;
+		}
+
+		for (i = 0; i < cf->chunks_nr; i++) {
+			if (cf->chunks[i].id == chunk_id) {
+				error(_("duplicate chunk ID %"PRIx32" found"),
+					chunk_id);
+				return -1;
+			}
+		}
+
+		cf->chunks[cf->chunks_nr].id = chunk_id;
+		cf->chunks[cf->chunks_nr].start = mfile + chunk_offset;
+		cf->chunks[cf->chunks_nr].size = next_chunk_offset - chunk_offset;
+		cf->chunks_nr++;
+	}
+
+	chunk_id = get_be32(table_of_contents);
+	if (chunk_id) {
+		error(_("final chunk has non-zero id %"PRIx32""), chunk_id);
+		return -1;
+	}
+
+	return 0;
+}
+
+static int pair_chunk_fn(const unsigned char *chunk_start,
+			 size_t chunk_size,
+			 void *data)
+{
+	const unsigned char **p = data;
+	*p = chunk_start;
+	return 0;
+}
+
+int pair_chunk(struct chunkfile *cf,
+	       uint32_t chunk_id,
+	       const unsigned char **p)
+{
+	return read_chunk(cf, chunk_id, pair_chunk_fn, p);
+}
+
+int read_chunk(struct chunkfile *cf,
+	       uint32_t chunk_id,
+	       chunk_read_fn fn,
+	       void *data)
+{
+	int i;
+
+	for (i = 0; i < cf->chunks_nr; i++) {
+		if (cf->chunks[i].id == chunk_id)
+			return fn(cf->chunks[i].start, cf->chunks[i].size, data);
+	}
+
+	return CHUNK_NOT_FOUND;
+}
diff --git a/chunk-format.h b/chunk-format.h
new file mode 100644
index 0000000..9ccbe00
--- /dev/null
+++ b/chunk-format.h
@@ -0,0 +1,68 @@
+#ifndef CHUNK_FORMAT_H
+#define CHUNK_FORMAT_H
+
+#include "git-compat-util.h"
+
+struct hashfile;
+struct chunkfile;
+
+#define CHUNK_TOC_ENTRY_SIZE (sizeof(uint32_t) + sizeof(uint64_t))
+
+/*
+ * Initialize a 'struct chunkfile' for writing _or_ reading a file
+ * with the chunk format.
+ *
+ * If writing a file, supply a non-NULL 'struct hashfile *' that will
+ * be used to write.
+ *
+ * If reading a file, use a NULL 'struct hashfile *' and then call
+ * read_table_of_contents(). Supply the memory-mapped data to the
+ * pair_chunk() or read_chunk() methods, as appropriate.
+ *
+ * DO NOT MIX THESE MODES. Use different 'struct chunkfile' instances
+ * for reading and writing.
+ */
+struct chunkfile *init_chunkfile(struct hashfile *f);
+void free_chunkfile(struct chunkfile *cf);
+int get_num_chunks(struct chunkfile *cf);
+typedef int (*chunk_write_fn)(struct hashfile *f, void *data);
+void add_chunk(struct chunkfile *cf,
+	       uint32_t id,
+	       size_t size,
+	       chunk_write_fn fn);
+int write_chunkfile(struct chunkfile *cf, void *data);
+
+int read_table_of_contents(struct chunkfile *cf,
+			   const unsigned char *mfile,
+			   size_t mfile_size,
+			   uint64_t toc_offset,
+			   int toc_length);
+
+#define CHUNK_NOT_FOUND (-2)
+
+/*
+ * Find 'chunk_id' in the given chunkfile and assign the
+ * given pointer to the position in the mmap'd file where
+ * that chunk begins.
+ *
+ * Returns CHUNK_NOT_FOUND if the chunk does not exist.
+ */
+int pair_chunk(struct chunkfile *cf,
+	       uint32_t chunk_id,
+	       const unsigned char **p);
+
+typedef int (*chunk_read_fn)(const unsigned char *chunk_start,
+			     size_t chunk_size, void *data);
+/*
+ * Find 'chunk_id' in the given chunkfile and call the
+ * given chunk_read_fn method with the information for
+ * that chunk.
+ *
+ * Returns CHUNK_NOT_FOUND if the chunk does not exist.
+ */
+int read_chunk(struct chunkfile *cf,
+	       uint32_t chunk_id,
+	       chunk_read_fn fn,
+	       void *data);
+
+#endif
diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh
index 0b1184e..67852d0 100755
--- a/ci/install-dependencies.sh
+++ b/ci/install-dependencies.sh
@@ -72,7 +72,7 @@
 	test -n "$ALREADY_HAVE_ASCIIDOCTOR" ||
 	sudo gem install --version 1.5.8 asciidoctor
 	;;
-linux-gcc-4.8|GETTEXT_POISON)
+linux-gcc-default|linux-gcc-4.8)
 	sudo apt-get -q update
 	sudo apt-get -q -y install $UBUNTU_COMMON_PKGS
 	;;
diff --git a/ci/lib.sh b/ci/lib.sh
index 38c0eac..d848c03 100755
--- a/ci/lib.sh
+++ b/ci/lib.sh
@@ -220,8 +220,7 @@
 	# Travis CI OS X
 	export GIT_SKIP_TESTS="t9810 t9816"
 	;;
-GETTEXT_POISON)
-	export GIT_TEST_GETTEXT_POISON=true
+linux-gcc-default)
 	;;
 Linux32)
 	CC=gcc
diff --git a/ci/run-build-and-tests.sh b/ci/run-build-and-tests.sh
index 6c27b88..a66b5e8 100755
--- a/ci/run-build-and-tests.sh
+++ b/ci/run-build-and-tests.sh
@@ -13,6 +13,7 @@
 make
 case "$jobname" in
 linux-gcc)
+	export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 	make test
 	export GIT_TEST_SPLIT_INDEX=yes
 	export GIT_TEST_FULL_IN_PACK_ARRAY=true
@@ -22,6 +23,8 @@
 	export GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS=1
 	export GIT_TEST_MULTI_PACK_INDEX=1
 	export GIT_TEST_ADD_I_USE_BUILTIN=1
+	export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master
+	export GIT_TEST_WRITE_REV_INDEX=1
 	make test
 	;;
 linux-clang)
diff --git a/combine-diff.c b/combine-diff.c
index 9228aeb..06635f9 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -214,11 +214,11 @@ static struct lline *coalesce_lines(struct lline *base, int *lenbase,
 	 *   - Else if we have NEW, insert newend lline into base and
 	 *   consume newend
 	 */
-	lcs = xcalloc(st_add(origbaselen, 1), sizeof(int*));
-	directions = xcalloc(st_add(origbaselen, 1), sizeof(enum coalesce_direction*));
+	CALLOC_ARRAY(lcs, st_add(origbaselen, 1));
+	CALLOC_ARRAY(directions, st_add(origbaselen, 1));
 	for (i = 0; i < origbaselen + 1; i++) {
-		lcs[i] = xcalloc(st_add(lennew, 1), sizeof(int));
-		directions[i] = xcalloc(st_add(lennew, 1), sizeof(enum coalesce_direction));
+		CALLOC_ARRAY(lcs[i], st_add(lennew, 1));
+		CALLOC_ARRAY(directions[i], st_add(lennew, 1));
 		directions[i][0] = BASE;
 	}
 	for (j = 1; j < lennew + 1; j++)
@@ -398,8 +398,8 @@ static void consume_hunk(void *state_,
 		state->lost_bucket = &state->sline[state->nb-1];
 	}
 	if (!state->sline[state->nb-1].p_lno)
-		state->sline[state->nb-1].p_lno =
-			xcalloc(state->num_parent, sizeof(unsigned long));
+		CALLOC_ARRAY(state->sline[state->nb - 1].p_lno,
+			     state->num_parent);
 	state->sline[state->nb-1].p_lno[state->n] = state->ob;
 }
 
@@ -1159,7 +1159,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
 	if (result_size && result[result_size-1] != '\n')
 		cnt++; /* incomplete line */
 
-	sline = xcalloc(st_add(cnt, 2), sizeof(*sline));
+	CALLOC_ARRAY(sline, st_add(cnt, 2));
 	sline[0].bol = result;
 	for (lno = 0, cp = result; cp < result + result_size; cp++) {
 		if (*cp == '\n') {
@@ -1178,7 +1178,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
 	/* Even p_lno[cnt+1] is valid -- that is for the end line number
 	 * for deletion hunk at the end.
 	 */
-	sline[0].p_lno = xcalloc(st_mult(st_add(cnt, 2), num_parent), sizeof(unsigned long));
+	CALLOC_ARRAY(sline[0].p_lno, st_mult(st_add(cnt, 2), num_parent));
 	for (lno = 0; lno <= cnt; lno++)
 		sline[lno+1].p_lno = sline[lno].p_lno + num_parent;
 
@@ -1319,7 +1319,7 @@ static struct diff_filepair *combined_pair(struct combine_diff_path *p,
 	struct diff_filespec *pool;
 
 	pair = xmalloc(sizeof(*pair));
-	pool = xcalloc(st_add(num_parent, 1), sizeof(struct diff_filespec));
+	CALLOC_ARRAY(pool, st_add(num_parent, 1));
 	pair->one = pool + 1;
 	pair->two = pool;
 
@@ -1348,7 +1348,7 @@ static void handle_combined_callback(struct diff_options *opt,
 	struct diff_queue_struct q;
 	int i;
 
-	q.queue = xcalloc(num_paths, sizeof(struct diff_filepair *));
+	CALLOC_ARRAY(q.queue, num_paths);
 	q.alloc = num_paths;
 	q.nr = num_paths;
 	for (i = 0, p = paths; p; p = p->next)
diff --git a/command-list.txt b/command-list.txt
index 9379b02..a289f09 100644
--- a/command-list.txt
+++ b/command-list.txt
@@ -204,6 +204,7 @@
 gitglossary                             guide
 githooks                                guide
 gitignore                               guide
+gitmailmap                              guide
 gitmodules                              guide
 gitnamespaces                           guide
 gitremote-helpers                       guide
diff --git a/commit-graph.c b/commit-graph.c
index 0316410..e21eeea 100644
--- a/commit-graph.c
+++ b/commit-graph.c
@@ -7,7 +7,7 @@
 #include "object.h"
 #include "refs.h"
 #include "revision.h"
-#include "sha1-lookup.h"
+#include "hash-lookup.h"
 #include "commit-graph.h"
 #include "object-store.h"
 #include "alloc.h"
@@ -19,6 +19,7 @@
 #include "shallow.h"
 #include "json-writer.h"
 #include "trace2.h"
+#include "chunk-format.h"
 
 void git_test_write_commit_graph_or_die(void)
 {
@@ -38,11 +39,12 @@ void git_test_write_commit_graph_or_die(void)
 #define GRAPH_CHUNKID_OIDFANOUT 0x4f494446 /* "OIDF" */
 #define GRAPH_CHUNKID_OIDLOOKUP 0x4f49444c /* "OIDL" */
 #define GRAPH_CHUNKID_DATA 0x43444154 /* "CDAT" */
+#define GRAPH_CHUNKID_GENERATION_DATA 0x47444154 /* "GDAT" */
+#define GRAPH_CHUNKID_GENERATION_DATA_OVERFLOW 0x47444f56 /* "GDOV" */
 #define GRAPH_CHUNKID_EXTRAEDGES 0x45444745 /* "EDGE" */
 #define GRAPH_CHUNKID_BLOOMINDEXES 0x42494458 /* "BIDX" */
 #define GRAPH_CHUNKID_BLOOMDATA 0x42444154 /* "BDAT" */
 #define GRAPH_CHUNKID_BASE 0x42415345 /* "BASE" */
-#define MAX_NUM_CHUNKS 7
 
 #define GRAPH_DATA_WIDTH (the_hash_algo->rawsz + 16)
 
@@ -57,13 +59,16 @@ void git_test_write_commit_graph_or_die(void)
 
 #define GRAPH_HEADER_SIZE 8
 #define GRAPH_FANOUT_SIZE (4 * 256)
-#define GRAPH_CHUNKLOOKUP_WIDTH 12
-#define GRAPH_MIN_SIZE (GRAPH_HEADER_SIZE + 4 * GRAPH_CHUNKLOOKUP_WIDTH \
+#define GRAPH_MIN_SIZE (GRAPH_HEADER_SIZE + 4 * CHUNK_TOC_ENTRY_SIZE \
 			+ GRAPH_FANOUT_SIZE + the_hash_algo->rawsz)
 
+#define CORRECTED_COMMIT_DATE_OFFSET_OVERFLOW (1ULL << 31)
+
 /* Remember to update object flag allocation in object.h */
 #define REACHABLE       (1u<<15)
 
+define_commit_slab(topo_level_slab, uint32_t);
+
 /* Keep track of the order in which commits are added to our list. */
 define_commit_slab(commit_pos, int);
 static struct commit_pos commit_pos = COMMIT_SLAB_INIT(1, commit_pos);
@@ -99,7 +104,7 @@ uint32_t commit_graph_position(const struct commit *c)
 	return data ? data->graph_pos : COMMIT_NOT_FROM_GRAPH;
 }
 
-uint32_t commit_graph_generation(const struct commit *c)
+timestamp_t commit_graph_generation(const struct commit *c)
 {
 	struct commit_graph_data *data =
 		commit_graph_data_slab_peek(&commit_graph_data_slab, c);
@@ -139,13 +144,17 @@ static struct commit_graph_data *commit_graph_data_at(const struct commit *c)
 	return data;
 }
 
+/*
+ * Should be used only while writing commit-graph as it compares
+ * generation value of commits by directly accessing commit-slab.
+ */
 static int commit_gen_cmp(const void *va, const void *vb)
 {
 	const struct commit *a = *(const struct commit **)va;
 	const struct commit *b = *(const struct commit **)vb;
 
-	uint32_t generation_a = commit_graph_generation(a);
-	uint32_t generation_b = commit_graph_generation(b);
+	const timestamp_t generation_a = commit_graph_data_at(a)->generation;
+	const timestamp_t generation_b = commit_graph_data_at(b)->generation;
 	/* lower generation commits first */
 	if (generation_a < generation_b)
 		return -1;
@@ -288,15 +297,43 @@ static int verify_commit_graph_lite(struct commit_graph *g)
 	return 0;
 }
 
+static int graph_read_oid_lookup(const unsigned char *chunk_start,
+				 size_t chunk_size, void *data)
+{
+	struct commit_graph *g = data;
+	g->chunk_oid_lookup = chunk_start;
+	g->num_commits = chunk_size / g->hash_len;
+	return 0;
+}
+
+static int graph_read_bloom_data(const unsigned char *chunk_start,
+				  size_t chunk_size, void *data)
+{
+	struct commit_graph *g = data;
+	uint32_t hash_version;
+	g->chunk_bloom_data = chunk_start;
+	hash_version = get_be32(chunk_start);
+
+	if (hash_version != 1)
+		return 0;
+
+	g->bloom_filter_settings = xmalloc(sizeof(struct bloom_filter_settings));
+	g->bloom_filter_settings->hash_version = hash_version;
+	g->bloom_filter_settings->num_hashes = get_be32(chunk_start + 4);
+	g->bloom_filter_settings->bits_per_entry = get_be32(chunk_start + 8);
+	g->bloom_filter_settings->max_changed_paths = DEFAULT_BLOOM_MAX_CHANGES;
+
+	return 0;
+}
+
 struct commit_graph *parse_commit_graph(struct repository *r,
 					void *graph_map, size_t graph_size)
 {
-	const unsigned char *data, *chunk_lookup;
-	uint32_t i;
+	const unsigned char *data;
 	struct commit_graph *graph;
-	uint64_t next_chunk_offset;
 	uint32_t graph_signature;
 	unsigned char graph_version, hash_version;
+	struct chunkfile *cf = NULL;
 
 	if (!graph_map)
 		return NULL;
@@ -337,7 +374,7 @@ struct commit_graph *parse_commit_graph(struct repository *r,
 	graph->data_len = graph_size;
 
 	if (graph_size < GRAPH_HEADER_SIZE +
-			 (graph->num_chunks + 1) * GRAPH_CHUNKLOOKUP_WIDTH +
+			 (graph->num_chunks + 1) * CHUNK_TOC_ENTRY_SIZE +
 			 GRAPH_FANOUT_SIZE + the_hash_algo->rawsz) {
 		error(_("commit-graph file is too small to hold %u chunks"),
 		      graph->num_chunks);
@@ -345,94 +382,28 @@ struct commit_graph *parse_commit_graph(struct repository *r,
 		return NULL;
 	}
 
-	chunk_lookup = data + 8;
-	next_chunk_offset = get_be64(chunk_lookup + 4);
-	for (i = 0; i < graph->num_chunks; i++) {
-		uint32_t chunk_id;
-		uint64_t chunk_offset = next_chunk_offset;
-		int chunk_repeated = 0;
+	cf = init_chunkfile(NULL);
 
-		chunk_id = get_be32(chunk_lookup + 0);
+	if (read_table_of_contents(cf, graph->data, graph_size,
+				   GRAPH_HEADER_SIZE, graph->num_chunks))
+		goto free_and_return;
 
-		chunk_lookup += GRAPH_CHUNKLOOKUP_WIDTH;
-		next_chunk_offset = get_be64(chunk_lookup + 4);
+	pair_chunk(cf, GRAPH_CHUNKID_OIDFANOUT,
+		   (const unsigned char **)&graph->chunk_oid_fanout);
+	read_chunk(cf, GRAPH_CHUNKID_OIDLOOKUP, graph_read_oid_lookup, graph);
+	pair_chunk(cf, GRAPH_CHUNKID_DATA, &graph->chunk_commit_data);
+	pair_chunk(cf, GRAPH_CHUNKID_EXTRAEDGES, &graph->chunk_extra_edges);
+	pair_chunk(cf, GRAPH_CHUNKID_BASE, &graph->chunk_base_graphs);
+	pair_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA,
+		   &graph->chunk_generation_data);
+	pair_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA_OVERFLOW,
+		   &graph->chunk_generation_data_overflow);
 
-		if (chunk_offset > graph_size - the_hash_algo->rawsz) {
-			error(_("commit-graph improper chunk offset %08x%08x"), (uint32_t)(chunk_offset >> 32),
-			      (uint32_t)chunk_offset);
-			goto free_and_return;
-		}
-
-		switch (chunk_id) {
-		case GRAPH_CHUNKID_OIDFANOUT:
-			if (graph->chunk_oid_fanout)
-				chunk_repeated = 1;
-			else
-				graph->chunk_oid_fanout = (uint32_t*)(data + chunk_offset);
-			break;
-
-		case GRAPH_CHUNKID_OIDLOOKUP:
-			if (graph->chunk_oid_lookup)
-				chunk_repeated = 1;
-			else {
-				graph->chunk_oid_lookup = data + chunk_offset;
-				graph->num_commits = (next_chunk_offset - chunk_offset)
-						     / graph->hash_len;
-			}
-			break;
-
-		case GRAPH_CHUNKID_DATA:
-			if (graph->chunk_commit_data)
-				chunk_repeated = 1;
-			else
-				graph->chunk_commit_data = data + chunk_offset;
-			break;
-
-		case GRAPH_CHUNKID_EXTRAEDGES:
-			if (graph->chunk_extra_edges)
-				chunk_repeated = 1;
-			else
-				graph->chunk_extra_edges = data + chunk_offset;
-			break;
-
-		case GRAPH_CHUNKID_BASE:
-			if (graph->chunk_base_graphs)
-				chunk_repeated = 1;
-			else
-				graph->chunk_base_graphs = data + chunk_offset;
-			break;
-
-		case GRAPH_CHUNKID_BLOOMINDEXES:
-			if (graph->chunk_bloom_indexes)
-				chunk_repeated = 1;
-			else if (r->settings.commit_graph_read_changed_paths)
-				graph->chunk_bloom_indexes = data + chunk_offset;
-			break;
-
-		case GRAPH_CHUNKID_BLOOMDATA:
-			if (graph->chunk_bloom_data)
-				chunk_repeated = 1;
-			else if (r->settings.commit_graph_read_changed_paths) {
-				uint32_t hash_version;
-				graph->chunk_bloom_data = data + chunk_offset;
-				hash_version = get_be32(data + chunk_offset);
-
-				if (hash_version != 1)
-					break;
-
-				graph->bloom_filter_settings = xmalloc(sizeof(struct bloom_filter_settings));
-				graph->bloom_filter_settings->hash_version = hash_version;
-				graph->bloom_filter_settings->num_hashes = get_be32(data + chunk_offset + 4);
-				graph->bloom_filter_settings->bits_per_entry = get_be32(data + chunk_offset + 8);
-				graph->bloom_filter_settings->max_changed_paths = DEFAULT_BLOOM_MAX_CHANGES;
-			}
-			break;
-		}
-
-		if (chunk_repeated) {
-			error(_("commit-graph chunk id %08x appears multiple times"), chunk_id);
-			goto free_and_return;
-		}
+	if (r->settings.commit_graph_read_changed_paths) {
+		pair_chunk(cf, GRAPH_CHUNKID_BLOOMINDEXES,
+			   &graph->chunk_bloom_indexes);
+		read_chunk(cf, GRAPH_CHUNKID_BLOOMDATA,
+			   graph_read_bloom_data, graph);
 	}
 
 	if (graph->chunk_bloom_indexes && graph->chunk_bloom_data) {
@@ -449,9 +420,11 @@ struct commit_graph *parse_commit_graph(struct repository *r,
 	if (verify_commit_graph_lite(graph))
 		goto free_and_return;
 
+	free_chunkfile(cf);
 	return graph;
 
 free_and_return:
+	free_chunkfile(cf);
 	free(graph->bloom_filter_settings);
 	free(graph);
 	return NULL;
@@ -543,7 +516,7 @@ static struct commit_graph *load_commit_graph_chain(struct repository *r,
 		return NULL;
 
 	count = st.st_size / (the_hash_algo->hexsz + 1);
-	oids = xcalloc(count, sizeof(struct object_id));
+	CALLOC_ARRAY(oids, count);
 
 	prepare_alt_odb(r);
 
@@ -590,6 +563,31 @@ static struct commit_graph *load_commit_graph_chain(struct repository *r,
 	return graph_chain;
 }
 
+/*
+ * returns 1 if and only if all graphs in the chain have
+ * corrected commit dates stored in the generation_data chunk.
+ */
+static int validate_mixed_generation_chain(struct commit_graph *g)
+{
+	int read_generation_data = 1;
+	struct commit_graph *p = g;
+
+	while (read_generation_data && p) {
+		read_generation_data = p->read_generation_data;
+		p = p->base_graph;
+	}
+
+	if (read_generation_data)
+		return 1;
+
+	while (g) {
+		g->read_generation_data = 0;
+		g = g->base_graph;
+	}
+
+	return 0;
+}
+
 struct commit_graph *read_commit_graph_one(struct repository *r,
 					   struct object_directory *odb)
 {
@@ -598,6 +596,8 @@ struct commit_graph *read_commit_graph_one(struct repository *r,
 	if (!g)
 		g = load_commit_graph_chain(r, odb);
 
+	validate_mixed_generation_chain(g);
+
 	return g;
 }
 
@@ -673,6 +673,20 @@ int generation_numbers_enabled(struct repository *r)
 	return !!first_generation;
 }
 
+int corrected_commit_dates_enabled(struct repository *r)
+{
+	struct commit_graph *g;
+	if (!prepare_commit_graph(r))
+		return 0;
+
+	g = r->objects->commit_graph;
+
+	if (!g->num_commits)
+		return 0;
+
+	return g->read_generation_data;
+}
+
 struct bloom_filter_settings *get_bloom_filter_settings(struct repository *r)
 {
 	struct commit_graph *g = r->objects->commit_graph;
@@ -748,17 +762,41 @@ static void fill_commit_graph_info(struct commit *item, struct commit_graph *g,
 {
 	const unsigned char *commit_data;
 	struct commit_graph_data *graph_data;
-	uint32_t lex_index;
+	uint32_t lex_index, offset_pos;
+	uint64_t date_high, date_low, offset;
 
 	while (pos < g->num_commits_in_base)
 		g = g->base_graph;
 
+	if (pos >= g->num_commits + g->num_commits_in_base)
+		die(_("invalid commit position. commit-graph is likely corrupt"));
+
 	lex_index = pos - g->num_commits_in_base;
 	commit_data = g->chunk_commit_data + GRAPH_DATA_WIDTH * lex_index;
 
 	graph_data = commit_graph_data_at(item);
 	graph_data->graph_pos = pos;
-	graph_data->generation = get_be32(commit_data + g->hash_len + 8) >> 2;
+
+	date_high = get_be32(commit_data + g->hash_len + 8) & 0x3;
+	date_low = get_be32(commit_data + g->hash_len + 12);
+	item->date = (timestamp_t)((date_high << 32) | date_low);
+
+	if (g->read_generation_data) {
+		offset = (timestamp_t)get_be32(g->chunk_generation_data + sizeof(uint32_t) * lex_index);
+
+		if (offset & CORRECTED_COMMIT_DATE_OFFSET_OVERFLOW) {
+			if (!g->chunk_generation_data_overflow)
+				die(_("commit-graph requires overflow generation data but has none"));
+
+			offset_pos = offset ^ CORRECTED_COMMIT_DATE_OFFSET_OVERFLOW;
+			graph_data->generation = get_be64(g->chunk_generation_data_overflow + 8 * offset_pos);
+		} else
+			graph_data->generation = item->date + offset;
+	} else
+		graph_data->generation = get_be32(commit_data + g->hash_len + 8) >> 2;
+
+	if (g->topo_levels)
+		*topo_level_slab_at(g->topo_levels, item) = get_be32(commit_data + g->hash_len + 8) >> 2;
 }
 
 static inline void set_commit_tree(struct commit *c, struct tree *t)
@@ -772,38 +810,22 @@ static int fill_commit_in_graph(struct repository *r,
 {
 	uint32_t edge_value;
 	uint32_t *parent_data_ptr;
-	uint64_t date_low, date_high;
 	struct commit_list **pptr;
-	struct commit_graph_data *graph_data;
 	const unsigned char *commit_data;
 	uint32_t lex_index;
 
 	while (pos < g->num_commits_in_base)
 		g = g->base_graph;
 
-	if (pos >= g->num_commits + g->num_commits_in_base)
-		die(_("invalid commit position. commit-graph is likely corrupt"));
+	fill_commit_graph_info(item, g, pos);
 
-	/*
-	 * Store the "full" position, but then use the
-	 * "local" position for the rest of the calculation.
-	 */
-	graph_data = commit_graph_data_at(item);
-	graph_data->graph_pos = pos;
 	lex_index = pos - g->num_commits_in_base;
-
 	commit_data = g->chunk_commit_data + (g->hash_len + 16) * lex_index;
 
 	item->object.parsed = 1;
 
 	set_commit_tree(item, NULL);
 
-	date_high = get_be32(commit_data + g->hash_len + 8) & 0x3;
-	date_low = get_be32(commit_data + g->hash_len + 12);
-	item->date = (timestamp_t)((date_high << 32) | date_low);
-
-	graph_data->generation = get_be32(commit_data + g->hash_len + 8) >> 2;
-
 	pptr = &item->parents;
 
 	edge_value = get_be32(commit_data + g->hash_len);
@@ -943,6 +965,7 @@ struct write_commit_graph_context {
 	struct oid_array oids;
 	struct packed_commit_list commits;
 	int num_extra_edges;
+	int num_generation_data_overflows;
 	unsigned long approx_nr_objects;
 	struct progress *progress;
 	int progress_done;
@@ -961,8 +984,11 @@ struct write_commit_graph_context {
 		 report_progress:1,
 		 split:1,
 		 changed_paths:1,
-		 order_by_pack:1;
+		 order_by_pack:1,
+		 write_generation_data:1,
+		 trust_generation_numbers:1;
 
+	struct topo_level_slab *topo_levels;
 	const struct commit_graph_opts *opts;
 	size_t total_bloom_filter_data_size;
 	const struct bloom_filter_settings *bloom_settings;
@@ -974,8 +1000,9 @@ struct write_commit_graph_context {
 };
 
 static int write_graph_chunk_fanout(struct hashfile *f,
-				    struct write_commit_graph_context *ctx)
+				    void *data)
 {
+	struct write_commit_graph_context *ctx = data;
 	int i, count = 0;
 	struct commit **list = ctx->commits.list;
 
@@ -1000,8 +1027,9 @@ static int write_graph_chunk_fanout(struct hashfile *f,
 }
 
 static int write_graph_chunk_oids(struct hashfile *f,
-				  struct write_commit_graph_context *ctx)
+				  void *data)
 {
+	struct write_commit_graph_context *ctx = data;
 	struct commit **list = ctx->commits.list;
 	int count;
 	for (count = 0; count < ctx->commits.nr; count++, list++) {
@@ -1012,15 +1040,16 @@ static int write_graph_chunk_oids(struct hashfile *f,
 	return 0;
 }
 
-static const unsigned char *commit_to_sha1(size_t index, void *table)
+static const struct object_id *commit_to_oid(size_t index, const void *table)
 {
-	struct commit **commits = table;
-	return commits[index]->object.oid.hash;
+	const struct commit * const *commits = table;
+	return &commits[index]->object.oid;
 }
 
 static int write_graph_chunk_data(struct hashfile *f,
-				  struct write_commit_graph_context *ctx)
+				  void *data)
 {
+	struct write_commit_graph_context *ctx = data;
 	struct commit **list = ctx->commits.list;
 	struct commit **last = ctx->commits.list + ctx->commits.nr;
 	uint32_t num_extra_edges = 0;
@@ -1032,7 +1061,7 @@ static int write_graph_chunk_data(struct hashfile *f,
 		uint32_t packedDate[2];
 		display_progress(ctx->progress, ++ctx->progress_cnt);
 
-		if (parse_commit_no_graph(*list))
+		if (repo_parse_commit_no_graph(ctx->r, *list))
 			die(_("unable to parse commit %s"),
 				oid_to_hex(&(*list)->object.oid));
 		tree = get_commit_tree_oid(*list);
@@ -1043,10 +1072,10 @@ static int write_graph_chunk_data(struct hashfile *f,
 		if (!parent)
 			edge_value = GRAPH_PARENT_NONE;
 		else {
-			edge_value = sha1_pos(parent->item->object.oid.hash,
-					      ctx->commits.list,
-					      ctx->commits.nr,
-					      commit_to_sha1);
+			edge_value = oid_pos(&parent->item->object.oid,
+					     ctx->commits.list,
+					     ctx->commits.nr,
+					     commit_to_oid);
 
 			if (edge_value >= 0)
 				edge_value += ctx->new_num_commits_in_base;
@@ -1074,10 +1103,10 @@ static int write_graph_chunk_data(struct hashfile *f,
 		else if (parent->next)
 			edge_value = GRAPH_EXTRA_EDGES_NEEDED | num_extra_edges;
 		else {
-			edge_value = sha1_pos(parent->item->object.oid.hash,
-					      ctx->commits.list,
-					      ctx->commits.nr,
-					      commit_to_sha1);
+			edge_value = oid_pos(&parent->item->object.oid,
+					     ctx->commits.list,
+					     ctx->commits.nr,
+					     commit_to_oid);
 
 			if (edge_value >= 0)
 				edge_value += ctx->new_num_commits_in_base;
@@ -1109,7 +1138,7 @@ static int write_graph_chunk_data(struct hashfile *f,
 		else
 			packedDate[0] = 0;
 
-		packedDate[0] |= htonl(commit_graph_data_at(*list)->generation << 2);
+		packedDate[0] |= htonl(*topo_level_slab_at(ctx->topo_levels, *list) << 2);
 
 		packedDate[1] = htonl((*list)->date);
 		hashwrite(f, packedDate, 8);
@@ -1120,9 +1149,53 @@ static int write_graph_chunk_data(struct hashfile *f,
 	return 0;
 }
 
-static int write_graph_chunk_extra_edges(struct hashfile *f,
-					 struct write_commit_graph_context *ctx)
+static int write_graph_chunk_generation_data(struct hashfile *f,
+					     void *data)
 {
+	struct write_commit_graph_context *ctx = data;
+	int i, num_generation_data_overflows = 0;
+
+	for (i = 0; i < ctx->commits.nr; i++) {
+		struct commit *c = ctx->commits.list[i];
+		timestamp_t offset;
+		repo_parse_commit(ctx->r, c);
+		offset = commit_graph_data_at(c)->generation - c->date;
+		display_progress(ctx->progress, ++ctx->progress_cnt);
+
+		if (offset > GENERATION_NUMBER_V2_OFFSET_MAX) {
+			offset = CORRECTED_COMMIT_DATE_OFFSET_OVERFLOW | num_generation_data_overflows;
+			num_generation_data_overflows++;
+		}
+
+		hashwrite_be32(f, offset);
+	}
+
+	return 0;
+}
+
+static int write_graph_chunk_generation_data_overflow(struct hashfile *f,
+						      void *data)
+{
+	struct write_commit_graph_context *ctx = data;
+	int i;
+	for (i = 0; i < ctx->commits.nr; i++) {
+		struct commit *c = ctx->commits.list[i];
+		timestamp_t offset = commit_graph_data_at(c)->generation - c->date;
+		display_progress(ctx->progress, ++ctx->progress_cnt);
+
+		if (offset > GENERATION_NUMBER_V2_OFFSET_MAX) {
+			hashwrite_be32(f, offset >> 32);
+			hashwrite_be32(f, (uint32_t) offset);
+		}
+	}
+
+	return 0;
+}
+
+static int write_graph_chunk_extra_edges(struct hashfile *f,
+					 void *data)
+{
+	struct write_commit_graph_context *ctx = data;
 	struct commit **list = ctx->commits.list;
 	struct commit **last = ctx->commits.list + ctx->commits.nr;
 	struct commit_list *parent;
@@ -1143,10 +1216,10 @@ static int write_graph_chunk_extra_edges(struct hashfile *f,
 
 		/* Since num_parents > 2, this initializer is safe. */
 		for (parent = (*list)->parents->next; parent; parent = parent->next) {
-			int edge_value = sha1_pos(parent->item->object.oid.hash,
-						  ctx->commits.list,
-						  ctx->commits.nr,
-						  commit_to_sha1);
+			int edge_value = oid_pos(&parent->item->object.oid,
+						 ctx->commits.list,
+						 ctx->commits.nr,
+						 commit_to_oid);
 
 			if (edge_value >= 0)
 				edge_value += ctx->new_num_commits_in_base;
@@ -1175,8 +1248,9 @@ static int write_graph_chunk_extra_edges(struct hashfile *f,
 }
 
 static int write_graph_chunk_bloom_indexes(struct hashfile *f,
-					   struct write_commit_graph_context *ctx)
+					   void *data)
 {
+	struct write_commit_graph_context *ctx = data;
 	struct commit **list = ctx->commits.list;
 	struct commit **last = ctx->commits.list + ctx->commits.nr;
 	uint32_t cur_pos = 0;
@@ -1210,8 +1284,9 @@ static void trace2_bloom_filter_settings(struct write_commit_graph_context *ctx)
 }
 
 static int write_graph_chunk_bloom_data(struct hashfile *f,
-					struct write_commit_graph_context *ctx)
+					void *data)
 {
+	struct write_commit_graph_context *ctx = data;
 	struct commit **list = ctx->commits.list;
 	struct commit **last = ctx->commits.list + ctx->commits.nr;
 
@@ -1306,11 +1381,11 @@ static void close_reachable(struct write_commit_graph_context *ctx)
 		if (!commit)
 			continue;
 		if (ctx->split) {
-			if ((!parse_commit(commit) &&
+			if ((!repo_parse_commit(ctx->r, commit) &&
 			     commit_graph_position(commit) == COMMIT_NOT_FROM_GRAPH) ||
 			    flags == COMMIT_GRAPH_SPLIT_REPLACE)
 				add_missing_parents(ctx, commit);
-		} else if (!parse_commit_no_graph(commit))
+		} else if (!repo_parse_commit_no_graph(ctx->r, commit))
 			add_missing_parents(ctx, commit);
 	}
 	stop_progress(&ctx->progress);
@@ -1329,6 +1404,59 @@ static void close_reachable(struct write_commit_graph_context *ctx)
 	stop_progress(&ctx->progress);
 }
 
+static void compute_topological_levels(struct write_commit_graph_context *ctx)
+{
+	int i;
+	struct commit_list *list = NULL;
+
+	if (ctx->report_progress)
+		ctx->progress = start_delayed_progress(
+					_("Computing commit graph topological levels"),
+					ctx->commits.nr);
+	for (i = 0; i < ctx->commits.nr; i++) {
+		struct commit *c = ctx->commits.list[i];
+		uint32_t level;
+
+		repo_parse_commit(ctx->r, c);
+		level = *topo_level_slab_at(ctx->topo_levels, c);
+
+		display_progress(ctx->progress, i + 1);
+		if (level != GENERATION_NUMBER_ZERO)
+			continue;
+
+		commit_list_insert(c, &list);
+		while (list) {
+			struct commit *current = list->item;
+			struct commit_list *parent;
+			int all_parents_computed = 1;
+			uint32_t max_level = 0;
+
+			for (parent = current->parents; parent; parent = parent->next) {
+				repo_parse_commit(ctx->r, parent->item);
+				level = *topo_level_slab_at(ctx->topo_levels, parent->item);
+
+				if (level == GENERATION_NUMBER_ZERO) {
+					all_parents_computed = 0;
+					commit_list_insert(parent->item, &list);
+					break;
+				}
+
+				if (level > max_level)
+					max_level = level;
+			}
+
+			if (all_parents_computed) {
+				pop_commit(&list);
+
+				if (max_level > GENERATION_NUMBER_V1_MAX - 1)
+					max_level = GENERATION_NUMBER_V1_MAX - 1;
+				*topo_level_slab_at(ctx->topo_levels, current) = max_level + 1;
+			}
+		}
+	}
+	stop_progress(&ctx->progress);
+}
+
 static void compute_generation_numbers(struct write_commit_graph_context *ctx)
 {
 	int i;
@@ -1338,42 +1466,56 @@ static void compute_generation_numbers(struct write_commit_graph_context *ctx)
 		ctx->progress = start_delayed_progress(
 					_("Computing commit graph generation numbers"),
 					ctx->commits.nr);
+
+	if (!ctx->trust_generation_numbers) {
+		for (i = 0; i < ctx->commits.nr; i++) {
+			struct commit *c = ctx->commits.list[i];
+			repo_parse_commit(ctx->r, c);
+			commit_graph_data_at(c)->generation = GENERATION_NUMBER_ZERO;
+		}
+	}
+
 	for (i = 0; i < ctx->commits.nr; i++) {
-		uint32_t generation = commit_graph_data_at(ctx->commits.list[i])->generation;
+		struct commit *c = ctx->commits.list[i];
+		timestamp_t corrected_commit_date;
+
+		repo_parse_commit(ctx->r, c);
+		corrected_commit_date = commit_graph_data_at(c)->generation;
 
 		display_progress(ctx->progress, i + 1);
-		if (generation != GENERATION_NUMBER_INFINITY &&
-		    generation != GENERATION_NUMBER_ZERO)
+		if (corrected_commit_date != GENERATION_NUMBER_ZERO)
 			continue;
 
-		commit_list_insert(ctx->commits.list[i], &list);
+		commit_list_insert(c, &list);
 		while (list) {
 			struct commit *current = list->item;
 			struct commit_list *parent;
 			int all_parents_computed = 1;
-			uint32_t max_generation = 0;
+			timestamp_t max_corrected_commit_date = 0;
 
 			for (parent = current->parents; parent; parent = parent->next) {
-				generation = commit_graph_data_at(parent->item)->generation;
+				repo_parse_commit(ctx->r, parent->item);
+				corrected_commit_date = commit_graph_data_at(parent->item)->generation;
 
-				if (generation == GENERATION_NUMBER_INFINITY ||
-				    generation == GENERATION_NUMBER_ZERO) {
+				if (corrected_commit_date == GENERATION_NUMBER_ZERO) {
 					all_parents_computed = 0;
 					commit_list_insert(parent->item, &list);
 					break;
-				} else if (generation > max_generation) {
-					max_generation = generation;
 				}
+
+				if (corrected_commit_date > max_corrected_commit_date)
+					max_corrected_commit_date = corrected_commit_date;
 			}
 
 			if (all_parents_computed) {
-				struct commit_graph_data *data = commit_graph_data_at(current);
-
-				data->generation = max_generation + 1;
 				pop_commit(&list);
 
-				if (data->generation > GENERATION_NUMBER_MAX)
-					data->generation = GENERATION_NUMBER_MAX;
+				if (current->date && current->date > max_corrected_commit_date)
+					max_corrected_commit_date = current->date - 1;
+				commit_graph_data_at(current)->generation = max_corrected_commit_date + 1;
+
+				if (commit_graph_data_at(current)->generation - current->date > GENERATION_NUMBER_V2_OFFSET_MAX)
+					ctx->num_generation_data_overflows++;
 			}
 		}
 	}
@@ -1458,7 +1600,7 @@ static int add_ref_to_set(const char *refname,
 	struct object_id peeled;
 	struct refs_cb_data *data = (struct refs_cb_data *)cb_data;
 
-	if (!peel_ref(refname, &peeled))
+	if (!peel_iterated_oid(oid, &peeled))
 		oid = &peeled;
 	if (oid_object_info(the_repository, oid, NULL) == OBJ_COMMIT)
 		oidset_insert(data->commits, oid);
@@ -1593,9 +1735,9 @@ static void copy_oids_to_commits(struct write_commit_graph_context *ctx)
 			continue;
 
 		if (ctx->split && flags == COMMIT_GRAPH_SPLIT_REPLACE)
-			parse_commit(ctx->commits.list[ctx->commits.nr]);
+			repo_parse_commit(ctx->r, ctx->commits.list[ctx->commits.nr]);
 		else
-			parse_commit_no_graph(ctx->commits.list[ctx->commits.nr]);
+			repo_parse_commit_no_graph(ctx->r, ctx->commits.list[ctx->commits.nr]);
 
 		num_parents = commit_list_count(ctx->commits.list[ctx->commits.nr]->parents);
 		if (num_parents > 2)
@@ -1620,8 +1762,9 @@ static int write_graph_chunk_base_1(struct hashfile *f,
 }
 
 static int write_graph_chunk_base(struct hashfile *f,
-				  struct write_commit_graph_context *ctx)
+				    void *data)
 {
+	struct write_commit_graph_context *ctx = data;
 	int num = write_graph_chunk_base_1(f, ctx->new_base_graph);
 
 	if (num != ctx->num_commit_graphs_after - 1) {
@@ -1632,27 +1775,16 @@ static int write_graph_chunk_base(struct hashfile *f,
 	return 0;
 }
 
-typedef int (*chunk_write_fn)(struct hashfile *f,
-			      struct write_commit_graph_context *ctx);
-
-struct chunk_info {
-	uint32_t id;
-	uint64_t size;
-	chunk_write_fn write_fn;
-};
-
 static int write_commit_graph_file(struct write_commit_graph_context *ctx)
 {
 	uint32_t i;
 	int fd;
 	struct hashfile *f;
 	struct lock_file lk = LOCK_INIT;
-	struct chunk_info chunks[MAX_NUM_CHUNKS + 1];
 	const unsigned hashsz = the_hash_algo->rawsz;
 	struct strbuf progress_title = STRBUF_INIT;
-	int num_chunks = 3;
-	uint64_t chunk_offset;
 	struct object_id file_hash;
+	struct chunkfile *cf;
 
 	if (ctx->split) {
 		struct strbuf tmp_file = STRBUF_INIT;
@@ -1698,83 +1830,62 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
 		f = hashfd(fd, get_lock_file_path(&lk));
 	}
 
-	chunks[0].id = GRAPH_CHUNKID_OIDFANOUT;
-	chunks[0].size = GRAPH_FANOUT_SIZE;
-	chunks[0].write_fn = write_graph_chunk_fanout;
-	chunks[1].id = GRAPH_CHUNKID_OIDLOOKUP;
-	chunks[1].size = hashsz * ctx->commits.nr;
-	chunks[1].write_fn = write_graph_chunk_oids;
-	chunks[2].id = GRAPH_CHUNKID_DATA;
-	chunks[2].size = (hashsz + 16) * ctx->commits.nr;
-	chunks[2].write_fn = write_graph_chunk_data;
-	if (ctx->num_extra_edges) {
-		chunks[num_chunks].id = GRAPH_CHUNKID_EXTRAEDGES;
-		chunks[num_chunks].size = 4 * ctx->num_extra_edges;
-		chunks[num_chunks].write_fn = write_graph_chunk_extra_edges;
-		num_chunks++;
-	}
-	if (ctx->changed_paths) {
-		chunks[num_chunks].id = GRAPH_CHUNKID_BLOOMINDEXES;
-		chunks[num_chunks].size = sizeof(uint32_t) * ctx->commits.nr;
-		chunks[num_chunks].write_fn = write_graph_chunk_bloom_indexes;
-		num_chunks++;
-		chunks[num_chunks].id = GRAPH_CHUNKID_BLOOMDATA;
-		chunks[num_chunks].size = sizeof(uint32_t) * 3
-					  + ctx->total_bloom_filter_data_size;
-		chunks[num_chunks].write_fn = write_graph_chunk_bloom_data;
-		num_chunks++;
-	}
-	if (ctx->num_commit_graphs_after > 1) {
-		chunks[num_chunks].id = GRAPH_CHUNKID_BASE;
-		chunks[num_chunks].size = hashsz * (ctx->num_commit_graphs_after - 1);
-		chunks[num_chunks].write_fn = write_graph_chunk_base;
-		num_chunks++;
-	}
+	cf = init_chunkfile(f);
 
-	chunks[num_chunks].id = 0;
-	chunks[num_chunks].size = 0;
+	add_chunk(cf, GRAPH_CHUNKID_OIDFANOUT, GRAPH_FANOUT_SIZE,
+		  write_graph_chunk_fanout);
+	add_chunk(cf, GRAPH_CHUNKID_OIDLOOKUP, hashsz * ctx->commits.nr,
+		  write_graph_chunk_oids);
+	add_chunk(cf, GRAPH_CHUNKID_DATA, (hashsz + 16) * ctx->commits.nr,
+		  write_graph_chunk_data);
+
+	if (git_env_bool(GIT_TEST_COMMIT_GRAPH_NO_GDAT, 0))
+		ctx->write_generation_data = 0;
+	if (ctx->write_generation_data)
+		add_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA,
+			  sizeof(uint32_t) * ctx->commits.nr,
+			  write_graph_chunk_generation_data);
+	if (ctx->num_generation_data_overflows)
+		add_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA_OVERFLOW,
+			  sizeof(timestamp_t) * ctx->num_generation_data_overflows,
+			  write_graph_chunk_generation_data_overflow);
+	if (ctx->num_extra_edges)
+		add_chunk(cf, GRAPH_CHUNKID_EXTRAEDGES,
+			  4 * ctx->num_extra_edges,
+			  write_graph_chunk_extra_edges);
+	if (ctx->changed_paths) {
+		add_chunk(cf, GRAPH_CHUNKID_BLOOMINDEXES,
+			  sizeof(uint32_t) * ctx->commits.nr,
+			  write_graph_chunk_bloom_indexes);
+		add_chunk(cf, GRAPH_CHUNKID_BLOOMDATA,
+			  sizeof(uint32_t) * 3
+				+ ctx->total_bloom_filter_data_size,
+			  write_graph_chunk_bloom_data);
+	}
+	if (ctx->num_commit_graphs_after > 1)
+		add_chunk(cf, GRAPH_CHUNKID_BASE,
+			  hashsz * (ctx->num_commit_graphs_after - 1),
+			  write_graph_chunk_base);
 
 	hashwrite_be32(f, GRAPH_SIGNATURE);
 
 	hashwrite_u8(f, GRAPH_VERSION);
 	hashwrite_u8(f, oid_version());
-	hashwrite_u8(f, num_chunks);
+	hashwrite_u8(f, get_num_chunks(cf));
 	hashwrite_u8(f, ctx->num_commit_graphs_after - 1);
 
-	chunk_offset = 8 + (num_chunks + 1) * GRAPH_CHUNKLOOKUP_WIDTH;
-	for (i = 0; i <= num_chunks; i++) {
-		uint32_t chunk_write[3];
-
-		chunk_write[0] = htonl(chunks[i].id);
-		chunk_write[1] = htonl(chunk_offset >> 32);
-		chunk_write[2] = htonl(chunk_offset & 0xffffffff);
-		hashwrite(f, chunk_write, 12);
-
-		chunk_offset += chunks[i].size;
-	}
-
 	if (ctx->report_progress) {
 		strbuf_addf(&progress_title,
 			    Q_("Writing out commit graph in %d pass",
 			       "Writing out commit graph in %d passes",
-			       num_chunks),
-			    num_chunks);
+			       get_num_chunks(cf)),
+			    get_num_chunks(cf));
 		ctx->progress = start_delayed_progress(
 			progress_title.buf,
-			num_chunks * ctx->commits.nr);
+			get_num_chunks(cf) * ctx->commits.nr);
 	}
 
-	for (i = 0; i < num_chunks; i++) {
-		uint64_t start_offset = f->total + f->offset;
-
-		if (chunks[i].write_fn(f, ctx))
-			return -1;
-
-		if (f->total + f->offset != start_offset + chunks[i].size)
-			BUG("expected to write %"PRId64" bytes to chunk %"PRIx32", but wrote %"PRId64" instead",
-			    chunks[i].size, chunks[i].id,
-			    f->total + f->offset - start_offset);
-	}
+	write_chunkfile(cf, ctx);
 
 	stop_progress(&ctx->progress);
 	strbuf_release(&progress_title);
@@ -1791,6 +1902,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
 
 	close_commit_graph(ctx->r->objects);
 	finalize_hashfile(f, file_hash.hash, CSUM_HASH_IN_STREAM | CSUM_FSYNC);
+	free_chunkfile(cf);
 
 	if (ctx->split) {
 		FILE *chainf = fdopen_lock_file(&lk, "w");
@@ -1918,6 +2030,13 @@ static void split_graph_merge_strategy(struct write_commit_graph_context *ctx)
 		if (i < ctx->num_commit_graphs_after)
 			ctx->commit_graph_hash_after[i] = xstrdup(oid_to_hex(&g->oid));
 
+		/*
+		 * If the topmost remaining layer has generation data chunk, the
+		 * resultant layer also has generation data chunk.
+		 */
+		if (i == ctx->num_commit_graphs_after - 2)
+			ctx->write_generation_data = !!g->chunk_generation_data;
+
 		i--;
 		g = g->base_graph;
 	}
@@ -2109,6 +2228,7 @@ int write_commit_graph(struct object_directory *odb,
 	int res = 0;
 	int replace = 0;
 	struct bloom_filter_settings bloom_settings = DEFAULT_BLOOM_FILTER_SETTINGS;
+	struct topo_level_slab topo_levels;
 
 	prepare_repo_settings(the_repository);
 	if (!the_repository->settings.core_commit_graph) {
@@ -2118,7 +2238,7 @@ int write_commit_graph(struct object_directory *odb,
 	if (!commit_graph_compatible(the_repository))
 		return 0;
 
-	ctx = xcalloc(1, sizeof(struct write_commit_graph_context));
+	CALLOC_ARRAY(ctx, 1);
 	ctx->r = the_repository;
 	ctx->odb = odb;
 	ctx->append = flags & COMMIT_GRAPH_WRITE_APPEND ? 1 : 0;
@@ -2126,6 +2246,8 @@ int write_commit_graph(struct object_directory *odb,
 	ctx->split = flags & COMMIT_GRAPH_WRITE_SPLIT ? 1 : 0;
 	ctx->opts = opts;
 	ctx->total_bloom_filter_data_size = 0;
+	ctx->write_generation_data = 1;
+	ctx->num_generation_data_overflows = 0;
 
 	bloom_settings.bits_per_entry = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_BITS_PER_ENTRY",
 						      bloom_settings.bits_per_entry);
@@ -2135,11 +2257,23 @@ int write_commit_graph(struct object_directory *odb,
 							 bloom_settings.max_changed_paths);
 	ctx->bloom_settings = &bloom_settings;
 
+	init_topo_level_slab(&topo_levels);
+	ctx->topo_levels = &topo_levels;
+
+	prepare_commit_graph(ctx->r);
+	if (ctx->r->objects->commit_graph) {
+		struct commit_graph *g = ctx->r->objects->commit_graph;
+
+		while (g) {
+			g->topo_levels = &topo_levels;
+			g = g->base_graph;
+		}
+	}
+
 	if (flags & COMMIT_GRAPH_WRITE_BLOOM_FILTERS)
 		ctx->changed_paths = 1;
 	if (!(flags & COMMIT_GRAPH_NO_WRITE_BLOOM_FILTERS)) {
 		struct commit_graph *g;
-		prepare_commit_graph_one(ctx->r, ctx->odb);
 
 		g = ctx->r->objects->commit_graph;
 
@@ -2151,10 +2285,7 @@ int write_commit_graph(struct object_directory *odb,
 	}
 
 	if (ctx->split) {
-		struct commit_graph *g;
-		prepare_commit_graph(ctx->r);
-
-		g = ctx->r->objects->commit_graph;
+		struct commit_graph *g = ctx->r->objects->commit_graph;
 
 		while (g) {
 			ctx->num_commit_graphs_before++;
@@ -2178,9 +2309,6 @@ int write_commit_graph(struct object_directory *odb,
 
 	ctx->approx_nr_objects = approximate_object_count();
 
-	if (ctx->append)
-		prepare_commit_graph_one(ctx->r, ctx->odb);
-
 	if (ctx->append && ctx->r->objects->commit_graph) {
 		struct commit_graph *g = ctx->r->objects->commit_graph;
 		for (i = 0; i < g->num_commits; i++) {
@@ -2227,7 +2355,11 @@ int write_commit_graph(struct object_directory *odb,
 	} else
 		ctx->num_commit_graphs_after = 1;
 
-	compute_generation_numbers(ctx);
+	ctx->trust_generation_numbers = validate_mixed_generation_chain(ctx->r->objects->commit_graph);
+
+	compute_topological_levels(ctx);
+	if (ctx->write_generation_data)
+		compute_generation_numbers(ctx);
 
 	if (ctx->changed_paths)
 		compute_bloom_filters(ctx);
@@ -2243,6 +2375,7 @@ int write_commit_graph(struct object_directory *odb,
 	free(ctx->graph_name);
 	free(ctx->commits.list);
 	oid_array_clear(&ctx->oids);
+	clear_topo_level_slab(&topo_levels);
 
 	if (ctx->commit_graph_filenames_after) {
 		for (i = 0; i < ctx->num_commit_graphs_after; i++) {
@@ -2355,8 +2488,8 @@ int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
 	for (i = 0; i < g->num_commits; i++) {
 		struct commit *graph_commit, *odb_commit;
 		struct commit_list *graph_parents, *odb_parents;
-		uint32_t max_generation = 0;
-		uint32_t generation;
+		timestamp_t max_generation = 0;
+		timestamp_t generation;
 
 		display_progress(progress, i + 1);
 		hashcpy(cur_oid.hash, g->chunk_oid_lookup + g->hash_len * i);
@@ -2420,16 +2553,17 @@ int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
 			continue;
 
 		/*
-		 * If one of our parents has generation GENERATION_NUMBER_MAX, then
-		 * our generation is also GENERATION_NUMBER_MAX. Decrement to avoid
-		 * extra logic in the following condition.
+		 * If we are using topological level and one of our parents has
+		 * generation GENERATION_NUMBER_V1_MAX, then our generation is
+		 * also GENERATION_NUMBER_V1_MAX. Decrement to avoid extra logic
+		 * in the following condition.
 		 */
-		if (max_generation == GENERATION_NUMBER_MAX)
+		if (!g->read_generation_data && max_generation == GENERATION_NUMBER_V1_MAX)
 			max_generation--;
 
 		generation = commit_graph_generation(graph_commit);
-		if (generation != max_generation + 1)
-			graph_report(_("commit-graph generation for commit %s is %u != %u"),
+		if (generation < max_generation + 1)
+			graph_report(_("commit-graph generation for commit %s is %"PRItime" < %"PRItime),
 				     oid_to_hex(&cur_oid),
 				     generation,
 				     max_generation + 1);
diff --git a/commit-graph.h b/commit-graph.h
index f8e9250..97f3497 100644
--- a/commit-graph.h
+++ b/commit-graph.h
@@ -6,6 +6,7 @@
 #include "oidset.h"
 
 #define GIT_TEST_COMMIT_GRAPH "GIT_TEST_COMMIT_GRAPH"
+#define GIT_TEST_COMMIT_GRAPH_NO_GDAT "GIT_TEST_COMMIT_GRAPH_NO_GDAT"
 #define GIT_TEST_COMMIT_GRAPH_DIE_ON_PARSE "GIT_TEST_COMMIT_GRAPH_DIE_ON_PARSE"
 #define GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS "GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS"
 
@@ -63,16 +64,20 @@ struct commit_graph {
 	struct object_directory *odb;
 
 	uint32_t num_commits_in_base;
+	unsigned int read_generation_data;
 	struct commit_graph *base_graph;
 
 	const uint32_t *chunk_oid_fanout;
 	const unsigned char *chunk_oid_lookup;
 	const unsigned char *chunk_commit_data;
+	const unsigned char *chunk_generation_data;
+	const unsigned char *chunk_generation_data_overflow;
 	const unsigned char *chunk_extra_edges;
 	const unsigned char *chunk_base_graphs;
 	const unsigned char *chunk_bloom_indexes;
 	const unsigned char *chunk_bloom_data;
 
+	struct topo_level_slab *topo_levels;
 	struct bloom_filter_settings *bloom_filter_settings;
 };
 
@@ -90,6 +95,12 @@ struct commit_graph *parse_commit_graph(struct repository *r,
  */
 int generation_numbers_enabled(struct repository *r);
 
+/*
+ * Return 1 if and only if the repository has a commit-graph
+ * file and generation data chunk has been written for the file.
+ */
+int corrected_commit_dates_enabled(struct repository *r);
+
 struct bloom_filter_settings *get_bloom_filter_settings(struct repository *r);
 
 enum commit_graph_write_flags {
@@ -144,12 +155,12 @@ void disable_commit_graph(struct repository *r);
 
 struct commit_graph_data {
 	uint32_t graph_pos;
-	uint32_t generation;
+	timestamp_t generation;
 };
 
 /*
  * Commits should be parsed before accessing generation, graph positions.
  */
-uint32_t commit_graph_generation(const struct commit *);
+timestamp_t commit_graph_generation(const struct commit *);
 uint32_t commit_graph_position(const struct commit *);
 #endif
diff --git a/commit-reach.c b/commit-reach.c
index 50175b1..c226ee3 100644
--- a/commit-reach.c
+++ b/commit-reach.c
@@ -17,6 +17,25 @@
 
 static const unsigned all_flags = (PARENT1 | PARENT2 | STALE | RESULT);
 
+static int compare_commits_by_gen(const void *_a, const void *_b)
+{
+	const struct commit *a = *(const struct commit * const *)_a;
+	const struct commit *b = *(const struct commit * const *)_b;
+
+	timestamp_t generation_a = commit_graph_generation(a);
+	timestamp_t generation_b = commit_graph_generation(b);
+
+	if (generation_a < generation_b)
+		return -1;
+	if (generation_a > generation_b)
+		return 1;
+	if (a->date < b->date)
+		return -1;
+	if (a->date > b->date)
+		return 1;
+	return 0;
+}
+
 static int queue_has_nonstale(struct prio_queue *queue)
 {
 	int i;
@@ -32,14 +51,14 @@ static int queue_has_nonstale(struct prio_queue *queue)
 static struct commit_list *paint_down_to_common(struct repository *r,
 						struct commit *one, int n,
 						struct commit **twos,
-						int min_generation)
+						timestamp_t min_generation)
 {
 	struct prio_queue queue = { compare_commits_by_gen_then_commit_date };
 	struct commit_list *result = NULL;
 	int i;
-	uint32_t last_gen = GENERATION_NUMBER_INFINITY;
+	timestamp_t last_gen = GENERATION_NUMBER_INFINITY;
 
-	if (!min_generation)
+	if (!min_generation && !corrected_commit_dates_enabled(r))
 		queue.compare = compare_commits_by_commit_date;
 
 	one->object.flags |= PARENT1;
@@ -58,10 +77,10 @@ static struct commit_list *paint_down_to_common(struct repository *r,
 		struct commit *commit = prio_queue_get(&queue);
 		struct commit_list *parents;
 		int flags;
-		uint32_t generation = commit_graph_generation(commit);
+		timestamp_t generation = commit_graph_generation(commit);
 
 		if (min_generation && generation > last_gen)
-			BUG("bad generation skip %8x > %8x at %s",
+			BUG("bad generation skip %"PRItime" > %"PRItime" at %s",
 			    generation, last_gen,
 			    oid_to_hex(&commit->object.oid));
 		last_gen = generation;
@@ -156,20 +175,15 @@ struct commit_list *get_octopus_merge_bases(struct commit_list *in)
 	return ret;
 }
 
-static int remove_redundant(struct repository *r, struct commit **array, int cnt)
+static int remove_redundant_no_gen(struct repository *r,
+				   struct commit **array, int cnt)
 {
-	/*
-	 * Some commit in the array may be an ancestor of
-	 * another commit.  Move such commit to the end of
-	 * the array, and return the number of commits that
-	 * are independent from each other.
-	 */
 	struct commit **work;
 	unsigned char *redundant;
 	int *filled_index;
 	int i, j, filled;
 
-	work = xcalloc(cnt, sizeof(*work));
+	CALLOC_ARRAY(work, cnt);
 	redundant = xcalloc(cnt, 1);
 	ALLOC_ARRAY(filled_index, cnt - 1);
 
@@ -177,12 +191,12 @@ static int remove_redundant(struct repository *r, struct commit **array, int cnt
 		repo_parse_commit(r, array[i]);
 	for (i = 0; i < cnt; i++) {
 		struct commit_list *common;
-		uint32_t min_generation = commit_graph_generation(array[i]);
+		timestamp_t min_generation = commit_graph_generation(array[i]);
 
 		if (redundant[i])
 			continue;
 		for (j = filled = 0; j < cnt; j++) {
-			uint32_t curr_generation;
+			timestamp_t curr_generation;
 			if (i == j || redundant[j])
 				continue;
 			filled_index[filled] = j;
@@ -209,15 +223,156 @@ static int remove_redundant(struct repository *r, struct commit **array, int cnt
 	for (i = filled = 0; i < cnt; i++)
 		if (!redundant[i])
 			array[filled++] = work[i];
-	for (j = filled, i = 0; i < cnt; i++)
-		if (redundant[i])
-			array[j++] = work[i];
 	free(work);
 	free(redundant);
 	free(filled_index);
 	return filled;
 }
 
+static int remove_redundant_with_gen(struct repository *r,
+				     struct commit **array, int cnt)
+{
+	int i, count_non_stale = 0, count_still_independent = cnt;
+	timestamp_t min_generation = GENERATION_NUMBER_INFINITY;
+	struct commit **walk_start, **sorted;
+	size_t walk_start_nr = 0, walk_start_alloc = cnt;
+	int min_gen_pos = 0;
+
+	/*
+	 * Sort the input by generation number, ascending. This allows
+	 * us to increase the "min_generation" limit when we discover
+	 * the commit with lowest generation is STALE. The index
+	 * min_gen_pos points to the current position within 'array'
+	 * that is not yet known to be STALE.
+	 */
+	ALLOC_ARRAY(sorted, cnt);
+	COPY_ARRAY(sorted, array, cnt);
+	QSORT(sorted, cnt, compare_commits_by_gen);
+	min_generation = commit_graph_generation(sorted[0]);
+
+	ALLOC_ARRAY(walk_start, walk_start_alloc);
+
+	/* Mark all parents of the input as STALE */
+	for (i = 0; i < cnt; i++) {
+		struct commit_list *parents;
+
+		repo_parse_commit(r, array[i]);
+		array[i]->object.flags |= RESULT;
+		parents = array[i]->parents;
+
+		while (parents) {
+			repo_parse_commit(r, parents->item);
+			if (!(parents->item->object.flags & STALE)) {
+				parents->item->object.flags |= STALE;
+				ALLOC_GROW(walk_start, walk_start_nr + 1, walk_start_alloc);
+				walk_start[walk_start_nr++] = parents->item;
+			}
+			parents = parents->next;
+		}
+	}
+
+	QSORT(walk_start, walk_start_nr, compare_commits_by_gen);
+
+	/* remove STALE bit for now to allow walking through parents */
+	for (i = 0; i < walk_start_nr; i++)
+		walk_start[i]->object.flags &= ~STALE;
+
+	/*
+	 * Start walking from the highest generation. Hopefully, it will
+	 * find all other items during the first-parent walk, and we can
+	 * terminate early. Otherwise, we will do the same amount of work
+	 * as before.
+	 */
+	for (i = walk_start_nr - 1; i >= 0 && count_still_independent > 1; i--) {
+		/* push the STALE bits up to min generation */
+		struct commit_list *stack = NULL;
+
+		commit_list_insert(walk_start[i], &stack);
+		walk_start[i]->object.flags |= STALE;
+
+		while (stack) {
+			struct commit_list *parents;
+			struct commit *c = stack->item;
+
+			repo_parse_commit(r, c);
+
+			if (c->object.flags & RESULT) {
+				c->object.flags &= ~RESULT;
+				if (--count_still_independent <= 1)
+					break;
+				if (oideq(&c->object.oid, &sorted[min_gen_pos]->object.oid)) {
+					while (min_gen_pos < cnt - 1 &&
+					       (sorted[min_gen_pos]->object.flags & STALE))
+						min_gen_pos++;
+					min_generation = commit_graph_generation(sorted[min_gen_pos]);
+				}
+			}
+
+			if (commit_graph_generation(c) < min_generation) {
+				pop_commit(&stack);
+				continue;
+			}
+
+			parents = c->parents;
+			while (parents) {
+				if (!(parents->item->object.flags & STALE)) {
+					parents->item->object.flags |= STALE;
+					commit_list_insert(parents->item, &stack);
+					break;
+				}
+				parents = parents->next;
+			}
+
+			/* pop if all parents have been visited already */
+			if (!parents)
+				pop_commit(&stack);
+		}
+		free_commit_list(stack);
+	}
+	free(sorted);
+
+	/* clear result */
+	for (i = 0; i < cnt; i++)
+		array[i]->object.flags &= ~RESULT;
+
+	/* rearrange array */
+	for (i = count_non_stale = 0; i < cnt; i++) {
+		if (!(array[i]->object.flags & STALE))
+			array[count_non_stale++] = array[i];
+	}
+
+	/* clear marks */
+	clear_commit_marks_many(walk_start_nr, walk_start, STALE);
+	free(walk_start);
+
+	return count_non_stale;
+}
+
+static int remove_redundant(struct repository *r, struct commit **array, int cnt)
+{
+	/*
+	 * Some commit in the array may be an ancestor of
+	 * another commit.  Move the independent commits to the
+	 * beginning of 'array' and return their number. Callers
+	 * should not rely upon the contents of 'array' after
+	 * that number.
+	 */
+	if (generation_numbers_enabled(r)) {
+		int i;
+
+		/*
+		 * If we have a single commit with finite generation
+		 * number, then the _with_gen algorithm is preferred.
+		 */
+		for (i = 0; i < cnt; i++) {
+			if (commit_graph_generation(array[i]) < GENERATION_NUMBER_INFINITY)
+				return remove_redundant_with_gen(r, array, cnt);
+		}
+	}
+
+	return remove_redundant_no_gen(r, array, cnt);
+}
+
 static struct commit_list *get_merge_bases_many_0(struct repository *r,
 						  struct commit *one,
 						  int n,
@@ -244,7 +399,7 @@ static struct commit_list *get_merge_bases_many_0(struct repository *r,
 
 	/* There are more than one */
 	cnt = commit_list_count(result);
-	rslt = xcalloc(cnt, sizeof(*rslt));
+	CALLOC_ARRAY(rslt, cnt);
 	for (list = result, i = 0; list; list = list->next)
 		rslt[i++] = list->item;
 	free_commit_list(result);
@@ -321,7 +476,7 @@ int repo_in_merge_bases_many(struct repository *r, struct commit *commit,
 {
 	struct commit_list *bases;
 	int ret = 0, i;
-	uint32_t generation, max_generation = GENERATION_NUMBER_ZERO;
+	timestamp_t generation, max_generation = GENERATION_NUMBER_ZERO;
 
 	if (repo_parse_commit(r, commit))
 		return ret;
@@ -386,7 +541,7 @@ struct commit_list *reduce_heads(struct commit_list *heads)
 		p->item->object.flags |= STALE;
 		num_head++;
 	}
-	array = xcalloc(num_head, sizeof(*array));
+	CALLOC_ARRAY(array, num_head);
 	for (p = heads, i = 0; p; p = p->next) {
 		if (p->item->object.flags & STALE) {
 			array[i++] = p->item;
@@ -470,7 +625,7 @@ static int in_commit_list(const struct commit_list *want, struct commit *c)
 static enum contains_result contains_test(struct commit *candidate,
 					  const struct commit_list *want,
 					  struct contains_cache *cache,
-					  uint32_t cutoff)
+					  timestamp_t cutoff)
 {
 	enum contains_result *cached = contains_cache_at(cache, candidate);
 
@@ -506,11 +661,11 @@ static enum contains_result contains_tag_algo(struct commit *candidate,
 {
 	struct contains_stack contains_stack = { 0, 0, NULL };
 	enum contains_result result;
-	uint32_t cutoff = GENERATION_NUMBER_INFINITY;
+	timestamp_t cutoff = GENERATION_NUMBER_INFINITY;
 	const struct commit_list *p;
 
 	for (p = want; p; p = p->next) {
-		uint32_t generation;
+		timestamp_t generation;
 		struct commit *c = p->item;
 		load_commit_graph_info(the_repository, c);
 		generation = commit_graph_generation(c);
@@ -561,26 +716,11 @@ int commit_contains(struct ref_filter *filter, struct commit *commit,
 	return repo_is_descendant_of(the_repository, commit, list);
 }
 
-static int compare_commits_by_gen(const void *_a, const void *_b)
-{
-	const struct commit *a = *(const struct commit * const *)_a;
-	const struct commit *b = *(const struct commit * const *)_b;
-
-	uint32_t generation_a = commit_graph_generation(a);
-	uint32_t generation_b = commit_graph_generation(b);
-
-	if (generation_a < generation_b)
-		return -1;
-	if (generation_a > generation_b)
-		return 1;
-	return 0;
-}
-
 int can_all_from_reach_with_flag(struct object_array *from,
 				 unsigned int with_flag,
 				 unsigned int assign_flag,
 				 time_t min_commit_date,
-				 uint32_t min_generation)
+				 timestamp_t min_generation)
 {
 	struct commit **list = NULL;
 	int i;
@@ -681,13 +821,13 @@ int can_all_from_reach(struct commit_list *from, struct commit_list *to,
 	time_t min_commit_date = cutoff_by_min_date ? from->item->date : 0;
 	struct commit_list *from_iter = from, *to_iter = to;
 	int result;
-	uint32_t min_generation = GENERATION_NUMBER_INFINITY;
+	timestamp_t min_generation = GENERATION_NUMBER_INFINITY;
 
 	while (from_iter) {
 		add_object_array(&from_iter->item->object, NULL, &from_objs);
 
 		if (!parse_commit(from_iter->item)) {
-			uint32_t generation;
+			timestamp_t generation;
 			if (from_iter->item->date < min_commit_date)
 				min_commit_date = from_iter->item->date;
 
@@ -701,7 +841,7 @@ int can_all_from_reach(struct commit_list *from, struct commit_list *to,
 
 	while (to_iter) {
 		if (!parse_commit(to_iter->item)) {
-			uint32_t generation;
+			timestamp_t generation;
 			if (to_iter->item->date < min_commit_date)
 				min_commit_date = to_iter->item->date;
 
@@ -741,13 +881,13 @@ struct commit_list *get_reachable_subset(struct commit **from, int nr_from,
 	struct commit_list *found_commits = NULL;
 	struct commit **to_last = to + nr_to;
 	struct commit **from_last = from + nr_from;
-	uint32_t min_generation = GENERATION_NUMBER_INFINITY;
+	timestamp_t min_generation = GENERATION_NUMBER_INFINITY;
 	int num_to_find = 0;
 
 	struct prio_queue queue = { compare_commits_by_gen_then_commit_date };
 
 	for (item = to; item < to_last; item++) {
-		uint32_t generation;
+		timestamp_t generation;
 		struct commit *c = *item;
 
 		parse_commit(c);
diff --git a/commit-reach.h b/commit-reach.h
index b49ad71..148b56f 100644
--- a/commit-reach.h
+++ b/commit-reach.h
@@ -87,7 +87,7 @@ int can_all_from_reach_with_flag(struct object_array *from,
 				 unsigned int with_flag,
 				 unsigned int assign_flag,
 				 time_t min_commit_date,
-				 uint32_t min_generation);
+				 timestamp_t min_generation);
 int can_all_from_reach(struct commit_list *from, struct commit_list *to,
 		       int commit_date_cutoff);
 
diff --git a/commit.c b/commit.c
index fe1fa3d..42f8117 100644
--- a/commit.c
+++ b/commit.c
@@ -14,7 +14,7 @@
 #include "mergesort.h"
 #include "commit-slab.h"
 #include "prio-queue.h"
-#include "sha1-lookup.h"
+#include "hash-lookup.h"
 #include "wt-status.h"
 #include "advice.h"
 #include "refs.h"
@@ -105,23 +105,23 @@ static timestamp_t parse_commit_date(const char *buf, const char *tail)
 	return parse_timestamp(dateptr, NULL, 10);
 }
 
-static const unsigned char *commit_graft_sha1_access(size_t index, void *table)
+static const struct object_id *commit_graft_oid_access(size_t index, const void *table)
 {
-	struct commit_graft **commit_graft_table = table;
-	return commit_graft_table[index]->oid.hash;
+	const struct commit_graft * const *commit_graft_table = table;
+	return &commit_graft_table[index]->oid;
 }
 
-int commit_graft_pos(struct repository *r, const unsigned char *sha1)
+int commit_graft_pos(struct repository *r, const struct object_id *oid)
 {
-	return sha1_pos(sha1, r->parsed_objects->grafts,
-			r->parsed_objects->grafts_nr,
-			commit_graft_sha1_access);
+	return oid_pos(oid, r->parsed_objects->grafts,
+		       r->parsed_objects->grafts_nr,
+		       commit_graft_oid_access);
 }
 
 int register_commit_graft(struct repository *r, struct commit_graft *graft,
 			  int ignore_dups)
 {
-	int pos = commit_graft_pos(r, graft->oid.hash);
+	int pos = commit_graft_pos(r, &graft->oid);
 
 	if (0 <= pos) {
 		if (ignore_dups)
@@ -232,7 +232,7 @@ struct commit_graft *lookup_commit_graft(struct repository *r, const struct obje
 {
 	int pos;
 	prepare_commit_graft(r);
-	pos = commit_graft_pos(r, oid->hash);
+	pos = commit_graft_pos(r, oid);
 	if (pos < 0)
 		return NULL;
 	return r->parsed_objects->grafts[pos];
@@ -544,6 +544,17 @@ struct commit_list *commit_list_insert(struct commit *item, struct commit_list *
 	return new_list;
 }
 
+int commit_list_contains(struct commit *item, struct commit_list *list)
+{
+	while (list) {
+		if (list->item == item)
+			return 1;
+		list = list->next;
+	}
+
+	return 0;
+}
+
 unsigned commit_list_count(const struct commit_list *l)
 {
 	unsigned c = 0;
@@ -563,6 +574,17 @@ struct commit_list *copy_commit_list(struct commit_list *list)
 	return head;
 }
 
+struct commit_list *reverse_commit_list(struct commit_list *list)
+{
+	struct commit_list *next = NULL, *current, *backup;
+	for (current = list; current; current = backup) {
+		backup = current->next;
+		current->next = next;
+		next = current;
+	}
+	return next;
+}
+
 void free_commit_list(struct commit_list *list)
 {
 	while (list)
@@ -731,8 +753,8 @@ int compare_commits_by_author_date(const void *a_, const void *b_,
 int compare_commits_by_gen_then_commit_date(const void *a_, const void *b_, void *unused)
 {
 	const struct commit *a = a_, *b = b_;
-	const uint32_t generation_a = commit_graph_generation(a),
-		       generation_b = commit_graph_generation(b);
+	const timestamp_t generation_a = commit_graph_generation(a),
+			  generation_b = commit_graph_generation(b);
 
 	/* newer commits first */
 	if (generation_a < generation_b)
@@ -973,7 +995,7 @@ static const char *gpg_sig_headers[] = {
 	"gpgsig-sha256",
 };
 
-static int do_sign_commit(struct strbuf *buf, const char *keyid)
+int sign_with_header(struct strbuf *buf, const char *keyid)
 {
 	struct strbuf sig = STRBUF_INIT;
 	int inspos, copypos;
@@ -1013,21 +1035,32 @@ static int do_sign_commit(struct strbuf *buf, const char *keyid)
 	return 0;
 }
 
-int parse_signed_commit(const struct commit *commit,
-			struct strbuf *payload, struct strbuf *signature)
-{
 
+
+int parse_signed_commit(const struct commit *commit,
+			struct strbuf *payload, struct strbuf *signature,
+			const struct git_hash_algo *algop)
+{
 	unsigned long size;
 	const char *buffer = get_commit_buffer(commit, &size);
-	int in_signature, saw_signature = -1;
-	const char *line, *tail;
-	const char *gpg_sig_header = gpg_sig_headers[hash_algo_by_ptr(the_hash_algo)];
-	int gpg_sig_header_len = strlen(gpg_sig_header);
+	int ret = parse_buffer_signed_by_header(buffer, size, payload, signature, algop);
+
+	unuse_commit_buffer(commit, buffer);
+	return ret;
+}
+
+int parse_buffer_signed_by_header(const char *buffer,
+				  unsigned long size,
+				  struct strbuf *payload,
+				  struct strbuf *signature,
+				  const struct git_hash_algo *algop)
+{
+	int in_signature = 0, saw_signature = 0, other_signature = 0;
+	const char *line, *tail, *p;
+	const char *gpg_sig_header = gpg_sig_headers[hash_algo_by_ptr(algop)];
 
 	line = buffer;
 	tail = buffer + size;
-	in_signature = 0;
-	saw_signature = 0;
 	while (line < tail) {
 		const char *sig = NULL;
 		const char *next = memchr(line, '\n', tail - line);
@@ -1035,9 +1068,15 @@ int parse_signed_commit(const struct commit *commit,
 		next = next ? next + 1 : tail;
 		if (in_signature && line[0] == ' ')
 			sig = line + 1;
-		else if (starts_with(line, gpg_sig_header) &&
-			 line[gpg_sig_header_len] == ' ')
-			sig = line + gpg_sig_header_len + 1;
+		else if (skip_prefix(line, gpg_sig_header, &p) &&
+			 *p == ' ') {
+			sig = line + strlen(gpg_sig_header) + 1;
+			other_signature = 0;
+		}
+		else if (starts_with(line, "gpgsig"))
+			other_signature = 1;
+		else if (other_signature && line[0] != ' ')
+			other_signature = 0;
 		if (sig) {
 			strbuf_add(signature, sig, next - sig);
 			saw_signature = 1;
@@ -1046,12 +1085,12 @@ int parse_signed_commit(const struct commit *commit,
 			if (*line == '\n')
 				/* dump the whole remainder of the buffer */
 				next = tail;
-			strbuf_add(payload, line, next - line);
+			if (!other_signature)
+				strbuf_add(payload, line, next - line);
 			in_signature = 0;
 		}
 		line = next;
 	}
-	unuse_commit_buffer(commit, buffer);
 	return saw_signature;
 }
 
@@ -1060,23 +1099,29 @@ int remove_signature(struct strbuf *buf)
 	const char *line = buf->buf;
 	const char *tail = buf->buf + buf->len;
 	int in_signature = 0;
-	const char *sig_start = NULL;
-	const char *sig_end = NULL;
+	struct sigbuf {
+		const char *start;
+		const char *end;
+	} sigs[2], *sigp = &sigs[0];
+	int i;
+	const char *orig_buf = buf->buf;
+
+	memset(sigs, 0, sizeof(sigs));
 
 	while (line < tail) {
 		const char *next = memchr(line, '\n', tail - line);
 		next = next ? next + 1 : tail;
 
 		if (in_signature && line[0] == ' ')
-			sig_end = next;
+			sigp->end = next;
 		else if (starts_with(line, "gpgsig")) {
 			int i;
 			for (i = 1; i < GIT_HASH_NALGOS; i++) {
 				const char *p;
 				if (skip_prefix(line, gpg_sig_headers[i], &p) &&
 				    *p == ' ') {
-					sig_start = line;
-					sig_end = next;
+					sigp->start = line;
+					sigp->end = next;
 					in_signature = 1;
 				}
 			}
@@ -1084,15 +1129,18 @@ int remove_signature(struct strbuf *buf)
 			if (*line == '\n')
 				/* dump the whole remainder of the buffer */
 				next = tail;
+			if (in_signature && sigp - sigs != ARRAY_SIZE(sigs))
+				sigp++;
 			in_signature = 0;
 		}
 		line = next;
 	}
 
-	if (sig_start)
-		strbuf_remove(buf, sig_start - buf->buf, sig_end - sig_start);
+	for (i = ARRAY_SIZE(sigs) - 1; i >= 0; i--)
+		if (sigs[i].start)
+			strbuf_remove(buf, sigs[i].start - orig_buf, sigs[i].end - sigs[i].start);
 
-	return sig_start != NULL;
+	return sigs[0].start != NULL;
 }
 
 static void handle_signed_tag(struct commit *parent, struct commit_extra_header ***tail)
@@ -1100,8 +1148,10 @@ static void handle_signed_tag(struct commit *parent, struct commit_extra_header
 	struct merge_remote_desc *desc;
 	struct commit_extra_header *mergetag;
 	char *buf;
-	unsigned long size, len;
+	unsigned long size;
 	enum object_type type;
+	struct strbuf payload = STRBUF_INIT;
+	struct strbuf signature = STRBUF_INIT;
 
 	desc = merge_remote_util(parent);
 	if (!desc || !desc->obj)
@@ -1109,8 +1159,7 @@ static void handle_signed_tag(struct commit *parent, struct commit_extra_header
 	buf = read_object_file(&desc->obj->oid, &type, &size);
 	if (!buf || type != OBJ_TAG)
 		goto free_return;
-	len = parse_signature(buf, size);
-	if (size == len)
+	if (!parse_signature(buf, size, &payload, &signature))
 		goto free_return;
 	/*
 	 * We could verify this signature and either omit the tag when
@@ -1122,13 +1171,15 @@ static void handle_signed_tag(struct commit *parent, struct commit_extra_header
 	 * if (verify_signed_buffer(buf, len, buf + len, size - len, ...))
 	 *	warn("warning: signed tag unverified.");
 	 */
-	mergetag = xcalloc(1, sizeof(*mergetag));
+	CALLOC_ARRAY(mergetag, 1);
 	mergetag->key = xstrdup("mergetag");
 	mergetag->value = buf;
 	mergetag->len = size;
 
 	**tail = mergetag;
 	*tail = &mergetag->next;
+	strbuf_release(&payload);
+	strbuf_release(&signature);
 	return;
 
 free_return:
@@ -1143,7 +1194,7 @@ int check_commit_signature(const struct commit *commit, struct signature_check *
 
 	sigc->result = 'N';
 
-	if (parse_signed_commit(commit, &payload, &signature) <= 0)
+	if (parse_signed_commit(commit, &payload, &signature, the_hash_algo) <= 0)
 		goto out;
 	ret = check_signature(payload.buf, payload.len, signature.buf,
 		signature.len, sigc);
@@ -1285,7 +1336,7 @@ static struct commit_extra_header *read_commit_extra_header_lines(
 			 excluded_header_field(line, eof - line, exclude))
 			continue;
 
-		it = xcalloc(1, sizeof(*it));
+		CALLOC_ARRAY(it, 1);
 		it->key = xmemdupz(line, eof-line);
 		*tail = it;
 		tail = &it->next;
@@ -1493,7 +1544,7 @@ int commit_tree_extended(const char *msg, size_t msg_len,
 	if (encoding_is_utf8 && !verify_utf8(&buffer))
 		fprintf(stderr, _(commit_utf8_warn));
 
-	if (sign_commit && do_sign_commit(&buffer, sign_commit)) {
+	if (sign_commit && sign_with_header(&buffer, sign_commit)) {
 		result = -1;
 		goto out;
 	}
diff --git a/commit.h b/commit.h
index 5467786..49c0f50 100644
--- a/commit.h
+++ b/commit.h
@@ -11,9 +11,10 @@
 #include "commit-slab.h"
 
 #define COMMIT_NOT_FROM_GRAPH 0xFFFFFFFF
-#define GENERATION_NUMBER_INFINITY 0xFFFFFFFF
-#define GENERATION_NUMBER_MAX 0x3FFFFFFF
+#define GENERATION_NUMBER_INFINITY ((1ULL << 63) - 1)
+#define GENERATION_NUMBER_V1_MAX 0x3FFFFFFF
 #define GENERATION_NUMBER_ZERO 0
+#define GENERATION_NUMBER_V2_OFFSET_MAX ((1ULL << 31) - 1)
 
 struct commit_list {
 	struct commit *item;
@@ -88,9 +89,10 @@ static inline int repo_parse_commit(struct repository *r, struct commit *item)
 	return repo_parse_commit_gently(r, item, 0);
 }
 
-static inline int parse_commit_no_graph(struct commit *commit)
+static inline int repo_parse_commit_no_graph(struct repository *r,
+					     struct commit *commit)
 {
-	return repo_parse_commit_internal(the_repository, commit, 0, 0);
+	return repo_parse_commit_internal(r, commit, 0, 0);
 }
 
 #ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS
@@ -167,6 +169,8 @@ int find_commit_subject(const char *commit_buffer, const char **subject);
 
 struct commit_list *commit_list_insert(struct commit *item,
 					struct commit_list **list);
+int commit_list_contains(struct commit *item,
+			 struct commit_list *list);
 struct commit_list **commit_list_append(struct commit *commit,
 					struct commit_list **next);
 unsigned commit_list_count(const struct commit_list *l);
@@ -177,6 +181,9 @@ void commit_list_sort_by_date(struct commit_list **list);
 /* Shallow copy of the input list */
 struct commit_list *copy_commit_list(struct commit_list *list);
 
+/* Modify list in-place to reverse it, returning new head; list will be tail */
+struct commit_list *reverse_commit_list(struct commit_list *list);
+
 void free_commit_list(struct commit_list *list);
 
 struct rev_info; /* in revision.h, it circularly uses enum cmit_fmt */
@@ -234,7 +241,7 @@ typedef int (*each_commit_graft_fn)(const struct commit_graft *, void *);
 
 struct commit_graft *read_graft_line(struct strbuf *line);
 /* commit_graft_pos returns an index into r->parsed_objects->grafts. */
-int commit_graft_pos(struct repository *r, const unsigned char *sha1);
+int commit_graft_pos(struct repository *r, const struct object_id *oid);
 int register_commit_graft(struct repository *r, struct commit_graft *, int);
 void prepare_commit_graft(struct repository *r);
 struct commit_graft *lookup_commit_graft(struct repository *r, const struct object_id *oid);
@@ -312,7 +319,8 @@ void set_merge_remote_desc(struct commit *commit,
 struct commit *get_merge_parent(const char *name);
 
 int parse_signed_commit(const struct commit *commit,
-			struct strbuf *message, struct strbuf *signature);
+			struct strbuf *message, struct strbuf *signature,
+			const struct git_hash_algo *algop);
 int remove_signature(struct strbuf *buf);
 
 /*
@@ -354,4 +362,13 @@ int compare_commits_by_gen_then_commit_date(const void *a_, const void *b_, void
 LAST_ARG_MUST_BE_NULL
 int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...);
 
+/* Sign a commit or tag buffer, storing the result in a header. */
+int sign_with_header(struct strbuf *buf, const char *keyid);
+/* Parse the signature out of a header. */
+int parse_buffer_signed_by_header(const char *buffer,
+				  unsigned long size,
+				  struct strbuf *payload,
+				  struct strbuf *signature,
+				  const struct git_hash_algo *algop);
+
 #endif /* COMMIT_H */
diff --git a/compat/mingw.h b/compat/mingw.h
index f6bab54..ffa53a4 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -227,6 +227,7 @@ int mingw_rmdir(const char *path);
 
 int mingw_open (const char *filename, int oflags, ...);
 #define open mingw_open
+#undef OPEN_RETURNS_EINTR
 
 int mingw_fgetc(FILE *stream);
 #define fgetc mingw_fgetc
diff --git a/compat/open.c b/compat/open.c
new file mode 100644
index 0000000..eb3754a
--- /dev/null
+++ b/compat/open.c
@@ -0,0 +1,25 @@
+#include "git-compat-util.h"
+
+#undef open
+int git_open_with_retry(const char *path, int flags, ...)
+{
+	mode_t mode = 0;
+	int ret;
+
+	/*
+	 * Also O_TMPFILE would take a mode, but it isn't defined everywhere.
+	 * And anyway, we don't use it in our code base.
+	 */
+	if (flags & O_CREAT) {
+		va_list ap;
+		va_start(ap, flags);
+		mode = va_arg(ap, int);
+		va_end(ap);
+	}
+
+	do {
+		ret = open(path, flags, mode);
+	} while (ret < 0 && errno == EINTR);
+
+	return ret;
+}
diff --git a/compat/precompose_utf8.c b/compat/precompose_utf8.c
index 136250f..ec56056 100644
--- a/compat/precompose_utf8.c
+++ b/compat/precompose_utf8.c
@@ -60,32 +60,46 @@ void probe_utf8_pathname_composition(void)
 	strbuf_release(&path);
 }
 
+static inline const char *precompose_string_if_needed(const char *in)
+{
+	size_t inlen;
+	size_t outlen;
+	if (has_non_ascii(in, (size_t)-1, &inlen)) {
+		iconv_t ic_prec;
+		char *out;
+		if (precomposed_unicode < 0)
+			git_config_get_bool("core.precomposeunicode", &precomposed_unicode);
+		if (precomposed_unicode != 1)
+			return in;
+		ic_prec = iconv_open(repo_encoding, path_encoding);
+		if (ic_prec == (iconv_t) -1)
+			return in;
 
-void precompose_argv(int argc, const char **argv)
+		out = reencode_string_iconv(in, inlen, ic_prec, 0, &outlen);
+		if (out) {
+			if (outlen == inlen && !memcmp(in, out, outlen))
+				free(out); /* no need to return indentical */
+			else
+				in = out;
+		}
+		iconv_close(ic_prec);
+
+	}
+	return in;
+}
+
+const char *precompose_argv_prefix(int argc, const char **argv, const char *prefix)
 {
 	int i = 0;
-	const char *oldarg;
-	char *newarg;
-	iconv_t ic_precompose;
-
-	if (precomposed_unicode != 1)
-		return;
-
-	ic_precompose = iconv_open(repo_encoding, path_encoding);
-	if (ic_precompose == (iconv_t) -1)
-		return;
 
 	while (i < argc) {
-		size_t namelen;
-		oldarg = argv[i];
-		if (has_non_ascii(oldarg, (size_t)-1, &namelen)) {
-			newarg = reencode_string_iconv(oldarg, namelen, ic_precompose, 0, NULL);
-			if (newarg)
-				argv[i] = newarg;
-		}
+		argv[i] = precompose_string_if_needed(argv[i]);
 		i++;
 	}
-	iconv_close(ic_precompose);
+	if (prefix) {
+		prefix = precompose_string_if_needed(prefix);
+	}
+	return prefix;
 }
 
 
diff --git a/compat/precompose_utf8.h b/compat/precompose_utf8.h
index 6f843d3..d70b846 100644
--- a/compat/precompose_utf8.h
+++ b/compat/precompose_utf8.h
@@ -28,7 +28,7 @@ typedef struct {
 	struct dirent_prec_psx *dirent_nfc;
 } PREC_DIR;
 
-void precompose_argv(int argc, const char **argv);
+const char *precompose_argv_prefix(int argc, const char **argv, const char *prefix);
 void probe_utf8_pathname_composition(void);
 
 PREC_DIR *precompose_utf8_opendir(const char *dirname);
diff --git a/config.c b/config.c
index 1137bd7..6428393 100644
--- a/config.c
+++ b/config.c
@@ -8,6 +8,7 @@
 #include "cache.h"
 #include "branch.h"
 #include "config.h"
+#include "environment.h"
 #include "repository.h"
 #include "lockfile.h"
 #include "exec-cmd.h"
@@ -332,7 +333,7 @@ int git_config_include(const char *var, const char *value, void *data)
 	return ret;
 }
 
-void git_config_push_parameter(const char *text)
+static void git_config_push_split_parameter(const char *key, const char *value)
 {
 	struct strbuf env = STRBUF_INIT;
 	const char *old = getenv(CONFIG_DATA_ENVIRONMENT);
@@ -340,11 +341,74 @@ void git_config_push_parameter(const char *text)
 		strbuf_addstr(&env, old);
 		strbuf_addch(&env, ' ');
 	}
-	sq_quote_buf(&env, text);
+	sq_quote_buf(&env, key);
+	strbuf_addch(&env, '=');
+	if (value)
+		sq_quote_buf(&env, value);
 	setenv(CONFIG_DATA_ENVIRONMENT, env.buf, 1);
 	strbuf_release(&env);
 }
 
+void git_config_push_parameter(const char *text)
+{
+	const char *value;
+
+	/*
+	 * When we see:
+	 *
+	 *   section.subsection=with=equals.key=value
+	 *
+	 * we cannot tell if it means:
+	 *
+	 *   [section "subsection=with=equals"]
+	 *   key = value
+	 *
+	 * or:
+	 *
+	 *   [section]
+	 *   subsection = with=equals.key=value
+	 *
+	 * We parse left-to-right for the first "=", meaning we'll prefer to
+	 * keep the value intact over the subsection. This is historical, but
+	 * also sensible since values are more likely to contain odd or
+	 * untrusted input than a section name.
+	 *
+	 * A missing equals is explicitly allowed (as a bool-only entry).
+	 */
+	value = strchr(text, '=');
+	if (value) {
+		char *key = xmemdupz(text, value - text);
+		git_config_push_split_parameter(key, value + 1);
+		free(key);
+	} else {
+		git_config_push_split_parameter(text, NULL);
+	}
+}
+
+void git_config_push_env(const char *spec)
+{
+	char *key;
+	const char *env_name;
+	const char *env_value;
+
+	env_name = strrchr(spec, '=');
+	if (!env_name)
+		die(_("invalid config format: %s"), spec);
+	key = xmemdupz(spec, env_name - spec);
+	env_name++;
+	if (!*env_name)
+		die(_("missing environment variable name for configuration '%.*s'"),
+		    (int)(env_name - spec - 1), spec);
+
+	env_value = getenv(env_name);
+	if (!env_value)
+		die(_("missing environment variable '%s' for configuration '%.*s'"),
+		    env_name, (int)(env_name - spec - 1), spec);
+
+	git_config_push_split_parameter(key, env_value);
+	free(key);
+}
+
 static inline int iskeychar(int c)
 {
 	return isalnum(c) || c == '-';
@@ -437,11 +501,26 @@ int git_config_key_is_valid(const char *key)
 	return !git_config_parse_key_1(key, NULL, NULL, 1);
 }
 
+static int config_parse_pair(const char *key, const char *value,
+			  config_fn_t fn, void *data)
+{
+	char *canonical_name;
+	int ret;
+
+	if (!strlen(key))
+		return error(_("empty config key"));
+	if (git_config_parse_key(key, &canonical_name, NULL))
+		return -1;
+
+	ret = (fn(canonical_name, value, data) < 0) ? -1 : 0;
+	free(canonical_name);
+	return ret;
+}
+
 int git_config_parse_parameter(const char *text,
 			       config_fn_t fn, void *data)
 {
 	const char *value;
-	char *canonical_name;
 	struct strbuf **pair;
 	int ret;
 
@@ -462,51 +541,131 @@ int git_config_parse_parameter(const char *text,
 		return error(_("bogus config parameter: %s"), text);
 	}
 
-	if (git_config_parse_key(pair[0]->buf, &canonical_name, NULL)) {
-		ret = -1;
-	} else {
-		ret = (fn(canonical_name, value, data) < 0) ? -1 : 0;
-		free(canonical_name);
-	}
+	ret = config_parse_pair(pair[0]->buf, value, fn, data);
 	strbuf_list_free(pair);
 	return ret;
 }
 
+static int parse_config_env_list(char *env, config_fn_t fn, void *data)
+{
+	char *cur = env;
+	while (cur && *cur) {
+		const char *key = sq_dequote_step(cur, &cur);
+		if (!key)
+			return error(_("bogus format in %s"),
+				     CONFIG_DATA_ENVIRONMENT);
+
+		if (!cur || isspace(*cur)) {
+			/* old-style 'key=value' */
+			if (git_config_parse_parameter(key, fn, data) < 0)
+				return -1;
+		}
+		else if (*cur == '=') {
+			/* new-style 'key'='value' */
+			const char *value;
+
+			cur++;
+			if (*cur == '\'') {
+				/* quoted value */
+				value = sq_dequote_step(cur, &cur);
+				if (!value || (cur && !isspace(*cur))) {
+					return error(_("bogus format in %s"),
+						     CONFIG_DATA_ENVIRONMENT);
+				}
+			} else if (!*cur || isspace(*cur)) {
+				/* implicit bool: 'key'= */
+				value = NULL;
+			} else {
+				return error(_("bogus format in %s"),
+					     CONFIG_DATA_ENVIRONMENT);
+			}
+
+			if (config_parse_pair(key, value, fn, data) < 0)
+				return -1;
+		}
+		else {
+			/* unknown format */
+			return error(_("bogus format in %s"),
+				     CONFIG_DATA_ENVIRONMENT);
+		}
+
+		if (cur) {
+			while (isspace(*cur))
+				cur++;
+		}
+	}
+	return 0;
+}
+
 int git_config_from_parameters(config_fn_t fn, void *data)
 {
-	const char *env = getenv(CONFIG_DATA_ENVIRONMENT);
+	const char *env;
+	struct strbuf envvar = STRBUF_INIT;
+	struct strvec to_free = STRVEC_INIT;
 	int ret = 0;
-	char *envw;
-	const char **argv = NULL;
-	int nr = 0, alloc = 0;
-	int i;
+	char *envw = NULL;
 	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);
+	env = getenv(CONFIG_COUNT_ENVIRONMENT);
+	if (env) {
+		unsigned long count;
+		char *endp;
+		int i;
 
-	if (sq_dequote_to_argv(envw, &argv, &nr, &alloc) < 0) {
-		ret = error(_("bogus format in %s"), CONFIG_DATA_ENVIRONMENT);
-		goto out;
+		count = strtoul(env, &endp, 10);
+		if (*endp) {
+			ret = error(_("bogus count in %s"), CONFIG_COUNT_ENVIRONMENT);
+			goto out;
+		}
+		if (count > INT_MAX) {
+			ret = error(_("too many entries in %s"), CONFIG_COUNT_ENVIRONMENT);
+			goto out;
+		}
+
+		for (i = 0; i < count; i++) {
+			const char *key, *value;
+
+			strbuf_addf(&envvar, "GIT_CONFIG_KEY_%d", i);
+			key = getenv_safe(&to_free, envvar.buf);
+			if (!key) {
+				ret = error(_("missing config key %s"), envvar.buf);
+				goto out;
+			}
+			strbuf_reset(&envvar);
+
+			strbuf_addf(&envvar, "GIT_CONFIG_VALUE_%d", i);
+			value = getenv_safe(&to_free, envvar.buf);
+			if (!value) {
+				ret = error(_("missing config value %s"), envvar.buf);
+				goto out;
+			}
+			strbuf_reset(&envvar);
+
+			if (config_parse_pair(key, value, fn, data) < 0) {
+				ret = -1;
+				goto out;
+			}
+		}
 	}
 
-	for (i = 0; i < nr; i++) {
-		if (git_config_parse_parameter(argv[i], fn, data) < 0) {
+	env = getenv(CONFIG_DATA_ENVIRONMENT);
+	if (env) {
+		/* sq_dequote will write over it */
+		envw = xstrdup(env);
+		if (parse_config_env_list(envw, fn, data) < 0) {
 			ret = -1;
 			goto out;
 		}
 	}
 
 out:
-	free(argv);
+	strbuf_release(&envvar);
+	strvec_clear(&to_free);
 	free(envw);
 	cf = source.prev;
 	return ret;
@@ -996,15 +1155,6 @@ static void die_bad_number(const char *name, const char *value)
 	if (!value)
 		value = "";
 
-	if (!strcmp(name, "GIT_TEST_GETTEXT_POISON"))
-		/*
-		 * We explicitly *don't* use _() here since it would
-		 * cause an infinite loop with _() needing to call
-		 * use_gettext_poison(). This is why marked up
-		 * translations with N_() above.
-		 */
-		die(bad_numeric, value, name, error_type);
-
 	if (!(cf && cf->name))
 		die(_(bad_numeric), value, name, _(error_type));
 
@@ -1030,6 +1180,20 @@ static void die_bad_number(const char *name, const char *value)
 	}
 }
 
+NORETURN
+static void die_bad_bool(const char *name, const char *value)
+{
+	if (!strcmp(name, "GIT_TEST_GETTEXT_POISON"))
+		/*
+		 * We explicitly *don't* use _() here since it would
+		 * cause an infinite loop with _() needing to call
+		 * use_gettext_poison().
+		 */
+		die("bad boolean config value '%s' for '%s'", value, name);
+	else
+		die(_("bad boolean config value '%s' for '%s'"), value, name);
+}
+
 int git_config_int(const char *name, const char *value)
 {
 	int ret;
@@ -1102,8 +1266,10 @@ int git_config_bool_or_int(const char *name, const char *value, int *is_bool)
 
 int git_config_bool(const char *name, const char *value)
 {
-	int discard;
-	return !!git_config_bool_or_int(name, value, &discard);
+	int v = git_parse_maybe_bool(value);
+	if (v < 0)
+		die_bad_bool(name, value);
+	return v;
 }
 
 int git_config_string(const char **dest, const char *var, const char *value)
@@ -1217,6 +1383,8 @@ static int git_default_core_config(const char *var, const char *value, void *cb)
 			return config_error_nonbool(var);
 		if (!strcasecmp(value, "auto"))
 			default_abbrev = -1;
+		else if (!git_parse_maybe_bool_text(value))
+			default_abbrev = the_hash_algo->hexsz;
 		else {
 			int abbrev = git_config_int(var, value);
 			if (abbrev < minimum_abbrev || abbrev > the_hash_algo->hexsz)
@@ -2101,7 +2269,7 @@ static void repo_read_config(struct repository *repo)
 	opts.git_dir = repo->gitdir;
 
 	if (!repo->config)
-		repo->config = xcalloc(1, sizeof(struct config_set));
+		CALLOC_ARRAY(repo->config, 1);
 	else
 		git_configset_clear(repo->config);
 
diff --git a/config.h b/config.h
index c1449bb..19a9adb 100644
--- a/config.h
+++ b/config.h
@@ -138,6 +138,7 @@ int git_config_from_mem(config_fn_t fn,
 int git_config_from_blob_oid(config_fn_t fn, const char *name,
 			     const struct object_id *oid, void *data);
 void git_config_push_parameter(const char *text);
+void git_config_push_env(const char *spec);
 int git_config_from_parameters(config_fn_t fn, void *data);
 void read_early_config(config_fn_t cb, void *data);
 void read_very_early_config(config_fn_t cb, void *data);
diff --git a/config.mak.uname b/config.mak.uname
index 198ab1e..d204c20 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -124,6 +124,9 @@
 	ifeq ($(shell test "`expr "$(uname_R)" : '\([0-9][0-9]*\)\.'`" -ge 11 && echo 1),1)
 		HAVE_GETDELIM = YesPlease
 	endif
+	ifeq ($(shell test "`expr "$(uname_R)" : '\([0-9][0-9]*\)\.'`" -ge 20 && echo 1),1)
+		OPEN_RETURNS_EINTR = UnfortunatelyYes
+	endif
 	NO_MEMMEM = YesPlease
 	USE_ST_TIMESPEC = YesPlease
 	HAVE_DEV_TTY = YesPlease
@@ -664,7 +667,6 @@
 		NO_GETTEXT =
 		USE_GETTEXT_SCHEME = fallthrough
 		USE_LIBPCRE= YesPlease
-		NO_LIBPCRE1_JIT = UnfortunatelyYes
 		NO_CURL =
 		USE_NED_ALLOCATOR = YesPlease
 	else
diff --git a/configure.ac b/configure.ac
index 66aedb9..031e8d3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -252,16 +252,17 @@
 # Define USE_LIBPCRE if you have and want to use libpcre. Various
 # commands such as log and grep offer runtime options to use
 # Perl-compatible regular expressions instead of standard or extended
-# POSIX regular expressions.
-#
-# USE_LIBPCRE is a synonym for USE_LIBPCRE2, define USE_LIBPCRE1
-# instead if you'd like to use the legacy version 1 of the PCRE
-# library. Support for version 1 will likely be removed in some future
-# release of Git, as upstream has all but abandoned it.
+# POSIX regular expressions. Only libpcre version 2 is supported.
 #
 # Define LIBPCREDIR=/foo/bar if your PCRE header and library files are in
 # /foo/bar/include and /foo/bar/lib directories.
 #
+
+AC_ARG_WITH(libpcre1,
+AS_HELP_STRING([--with-libpcre1],[DEPRECATED]),
+    AC_MSG_ERROR([support for --with-libpcre1 has been removed. Use --with-libpcre2!])
+    )
+
 AC_ARG_WITH(libpcre,
 AS_HELP_STRING([--with-libpcre],[synonym for --with-libpcre2]),
     if test "$withval" = "no"; then
@@ -277,22 +278,6 @@
 	GIT_CONF_SUBST([LIBPCREDIR])
     fi)
 
-AC_ARG_WITH(libpcre1,
-AS_HELP_STRING([--with-libpcre1],[support Perl-compatible regexes via libpcre1 (default is NO)])
-AS_HELP_STRING([],           [ARG can be also prefix for libpcre library and headers]),
-    if test "$withval" = "no"; then
-	USE_LIBPCRE1=
-    elif test "$withval" = "yes"; then
-	USE_LIBPCRE1=YesPlease
-    else
-	USE_LIBPCRE1=YesPlease
-	LIBPCREDIR=$withval
-	AC_MSG_NOTICE([Setting LIBPCREDIR to $LIBPCREDIR])
-        dnl USE_LIBPCRE1 can still be modified below, so don't substitute
-        dnl it yet.
-	GIT_CONF_SUBST([LIBPCREDIR])
-    fi)
-
 AC_ARG_WITH(libpcre2,
 AS_HELP_STRING([--with-libpcre2],[support Perl-compatible regexes via libpcre2 (default is NO)])
 AS_HELP_STRING([],           [ARG can be also prefix for libpcre library and headers]),
@@ -300,10 +285,6 @@
         AC_MSG_ERROR([Only supply one of --with-libpcre or its synonym --with-libpcre2!])
     fi
 
-    if test -n "$USE_LIBPCRE1"; then
-        AC_MSG_ERROR([Only supply one of --with-libpcre1 or --with-libpcre2!])
-    fi
-
     if test "$withval" = "no"; then
 	USE_LIBPCRE2=
     elif test "$withval" = "yes"; then
@@ -554,25 +535,9 @@
 GIT_CONF_SUBST([NO_OPENSSL])
 
 #
-# Handle the USE_LIBPCRE1 and USE_LIBPCRE2 options potentially set
-# above.
+# Handle the USE_LIBPCRE options potentially set above.
 #
 
-if test -n "$USE_LIBPCRE1"; then
-
-GIT_STASH_FLAGS($LIBPCREDIR)
-
-AC_CHECK_LIB([pcre], [pcre_version],
-[USE_LIBPCRE1=YesPlease],
-[USE_LIBPCRE1=])
-
-GIT_UNSTASH_FLAGS($LIBPCREDIR)
-
-GIT_CONF_SUBST([USE_LIBPCRE1])
-
-fi
-
-
 if test -n "$USE_LIBPCRE2"; then
 
 GIT_STASH_FLAGS($LIBPCREDIR)
diff --git a/connect.c b/connect.c
index 9c97fee..40b5c15 100644
--- a/connect.c
+++ b/connect.c
@@ -376,7 +376,8 @@ struct ref **get_remote_heads(struct packet_reader *reader,
 }
 
 /* Returns 1 when a valid ref has been added to `list`, 0 otherwise */
-static int process_ref_v2(struct packet_reader *reader, struct ref ***list)
+static int process_ref_v2(struct packet_reader *reader, struct ref ***list,
+			  char **unborn_head_target)
 {
 	int ret = 1;
 	int i = 0;
@@ -397,6 +398,25 @@ static int process_ref_v2(struct packet_reader *reader, struct ref ***list)
 		goto out;
 	}
 
+	if (!strcmp("unborn", line_sections.items[i].string)) {
+		i++;
+		if (unborn_head_target &&
+		    !strcmp("HEAD", line_sections.items[i++].string)) {
+			/*
+			 * Look for the symref target (if any). If found,
+			 * return it to the caller.
+			 */
+			for (; i < line_sections.nr; i++) {
+				const char *arg = line_sections.items[i].string;
+
+				if (skip_prefix(arg, "symref-target:", &arg)) {
+					*unborn_head_target = xstrdup(arg);
+					break;
+				}
+			}
+		}
+		goto out;
+	}
 	if (parse_oid_hex_algop(line_sections.items[i++].string, &old_oid, &end, reader->hash_algo) ||
 	    *end) {
 		ret = 0;
@@ -453,12 +473,16 @@ void check_stateless_delimiter(int stateless_rpc,
 
 struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
 			     struct ref **list, int for_push,
-			     const struct strvec *ref_prefixes,
+			     struct transport_ls_refs_options *transport_options,
 			     const struct string_list *server_options,
 			     int stateless_rpc)
 {
 	int i;
 	const char *hash_name;
+	struct strvec *ref_prefixes = transport_options ?
+		&transport_options->ref_prefixes : NULL;
+	char **unborn_head_target = transport_options ?
+		&transport_options->unborn_head_target : NULL;
 	*list = NULL;
 
 	if (server_supports_v2("ls-refs", 1))
@@ -488,6 +512,8 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
 	if (!for_push)
 		packet_write_fmt(fd_out, "peel\n");
 	packet_write_fmt(fd_out, "symrefs\n");
+	if (server_supports_feature("ls-refs", "unborn", 0))
+		packet_write_fmt(fd_out, "unborn\n");
 	for (i = 0; ref_prefixes && i < ref_prefixes->nr; i++) {
 		packet_write_fmt(fd_out, "ref-prefix %s\n",
 				 ref_prefixes->v[i]);
@@ -496,7 +522,7 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
 
 	/* Process response from server */
 	while (packet_reader_read(reader) == PACKET_READ_NORMAL) {
-		if (!process_ref_v2(reader, &list))
+		if (!process_ref_v2(reader, &list, unborn_head_target))
 			die(_("invalid ls-refs response: %s"), reader->line);
 	}
 
diff --git a/contrib/buildsystems/CMakeLists.txt b/contrib/buildsystems/CMakeLists.txt
index c151dd7..ac3dbc0 100644
--- a/contrib/buildsystems/CMakeLists.txt
+++ b/contrib/buildsystems/CMakeLists.txt
@@ -910,9 +910,7 @@
 set(TAR tar)
 set(NO_CURL )
 set(NO_EXPAT )
-set(USE_LIBPCRE1 )
 set(USE_LIBPCRE2 )
-set(NO_LIBPCRE1_JIT )
 set(NO_PERL )
 set(NO_PTHREADS )
 set(NO_PYTHON )
@@ -949,8 +947,6 @@
 file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "TAR='${TAR}'\n")
 file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_CURL='${NO_CURL}'\n")
 file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_EXPAT='${NO_EXPAT}'\n")
-file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "USE_LIBPCRE1='${USE_LIBPCRE1}'\n")
-file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_LIBPCRE1_JIT='${NO_LIBPCRE1_JIT}'\n")
 file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_PERL='${NO_PERL}'\n")
 file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_PTHREADS='${NO_PTHREADS}'\n")
 file(APPEND ${CMAKE_BINARY_DIR}/GIT-BUILD-OPTIONS "NO_UNIX_SOCKETS='${NO_UNIX_SOCKETS}'\n")
diff --git a/contrib/coccinelle/array.cocci b/contrib/coccinelle/array.cocci
index 46b8d2e..9a4f00c 100644
--- a/contrib/coccinelle/array.cocci
+++ b/contrib/coccinelle/array.cocci
@@ -88,3 +88,11 @@
 @@
 - ptr = xmalloc((n) * sizeof(T));
 + ALLOC_ARRAY(ptr, n);
+
+@@
+type T;
+T *ptr;
+expression n != 1;
+@@
+- ptr = xcalloc(n, \( sizeof(*ptr) \| sizeof(T) \) )
++ CALLOC_ARRAY(ptr, n)
diff --git a/contrib/coccinelle/xcalloc.cocci b/contrib/coccinelle/xcalloc.cocci
new file mode 100644
index 0000000..c291011
--- /dev/null
+++ b/contrib/coccinelle/xcalloc.cocci
@@ -0,0 +1,10 @@
+@@
+type T;
+T *ptr;
+expression n;
+@@
+  xcalloc(
++ n,
+  \( sizeof(T) \| sizeof(*ptr) \)
+- , n
+  )
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 463a312..7dc6cd8 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -29,6 +29,15 @@
 # tell the completion to use commit completion.  This also works with aliases
 # of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".
 #
+# If you have a command that is not part of git, but you would still
+# like completion, you can use __git_complete:
+#
+#   __git_complete gl git_log
+#
+# Or if it's a main command (i.e. git or gitk):
+#
+#   __git_complete gk gitk
+#
 # Compatible with bash 3.2.57.
 #
 # You can set the following environment variables to influence the behavior of
@@ -1438,8 +1447,10 @@
 	while [ $c -lt $cword ]; do
 		i="${words[c]}"
 		case "$i" in
-		-d|--delete|-m|--move)	only_local_ref="y" ;;
-		-r|--remotes)		has_r="y" ;;
+		-d|-D|--delete|-m|-M|--move|-c|-C|--copy)
+			only_local_ref="y" ;;
+		-r|--remotes)
+			has_r="y" ;;
 		esac
 		((c++))
 	done
@@ -3358,15 +3369,19 @@
 	esac
 }
 
+__git_have_func () {
+	declare -f -- "$1" >/dev/null 2>&1
+}
+
 __git_complete_command () {
 	local command="$1"
 	local completion_func="_git_${command//-/_}"
-	if ! declare -f $completion_func >/dev/null 2>/dev/null &&
-		declare -f _completion_loader >/dev/null 2>/dev/null
+	if ! __git_have_func $completion_func &&
+		__git_have_func _completion_loader
 	then
 		_completion_loader "git-$command"
 	fi
-	if declare -f $completion_func >/dev/null 2>/dev/null
+	if __git_have_func $completion_func
 	then
 		$completion_func
 		return 0
@@ -3493,10 +3508,7 @@
 	$1
 }
 
-# Setup completion for certain functions defined above by setting common
-# variables and workarounds.
-# This is NOT a public function; use at your own risk.
-__git_complete ()
+___git_complete ()
 {
 	local wrapper="__git_wrap${2}"
 	eval "$wrapper () { __git_func_wrap $2 ; }"
@@ -3504,13 +3516,33 @@
 		|| complete -o default -o nospace -F $wrapper $1
 }
 
-__git_complete git __git_main
-__git_complete gitk __gitk_main
+# Setup the completion for git commands
+# 1: command or alias
+# 2: function to call (e.g. `git`, `gitk`, `git_fetch`)
+__git_complete ()
+{
+	local func
+
+	if __git_have_func $2; then
+		func=$2
+	elif __git_have_func __$2_main; then
+		func=__$2_main
+	elif __git_have_func _$2; then
+		func=_$2
+	else
+		echo "ERROR: could not find function '$2'" 1>&2
+		return 1
+	fi
+	___git_complete $1 $func
+}
+
+___git_complete git __git_main
+___git_complete gitk __gitk_main
 
 # The following are necessary only for Cygwin, and only are needed
 # when the user has tab-completed the executable name and consequently
 # included the '.exe' suffix.
 #
 if [ "$OSTYPE" = cygwin ]; then
-	__git_complete git.exe __git_main
+	___git_complete git.exe __git_main
 fi
diff --git a/convert.c b/convert.c
index ee360c2..9ecc1c6 100644
--- a/convert.c
+++ b/convert.c
@@ -1028,7 +1028,7 @@ static int read_convert_config(const char *var, const char *value, void *cb)
 		if (!strncmp(drv->name, name, namelen) && !drv->name[namelen])
 			break;
 	if (!drv) {
-		drv = xcalloc(1, sizeof(struct convert_driver));
+		CALLOC_ARRAY(drv, 1);
 		drv->name = xmemdupz(name, namelen);
 		*user_convert_tail = drv;
 		user_convert_tail = &(drv->next);
diff --git a/daemon.c b/daemon.c
index 2ab7ea8..3435319 100644
--- a/daemon.c
+++ b/daemon.c
@@ -840,7 +840,7 @@ static void add_child(struct child_process *cld, struct sockaddr *addr, socklen_
 {
 	struct child *newborn, **cradle;
 
-	newborn = xcalloc(1, sizeof(*newborn));
+	CALLOC_ARRAY(newborn, 1);
 	live_children++;
 	memcpy(&newborn->cld, cld, sizeof(*cld));
 	memcpy(&newborn->address, addr, addrlen);
@@ -1148,7 +1148,7 @@ static int service_loop(struct socketlist *socklist)
 	struct pollfd *pfd;
 	int i;
 
-	pfd = xcalloc(socklist->nr, sizeof(struct pollfd));
+	CALLOC_ARRAY(pfd, socklist->nr);
 
 	for (i = 0; i < socklist->nr; i++) {
 		pfd[i].fd = socklist->list[i];
diff --git a/decorate.c b/decorate.c
index a605b1b..2036d15 100644
--- a/decorate.c
+++ b/decorate.c
@@ -39,7 +39,7 @@ static void grow_decoration(struct decoration *n)
 	struct decoration_entry *old_entries = n->entries;
 
 	n->size = (old_size + 1000) * 3 / 2;
-	n->entries = xcalloc(n->size, sizeof(struct decoration_entry));
+	CALLOC_ARRAY(n->entries, n->size);
 	n->nr = 0;
 
 	for (i = 0; i < old_size; i++) {
diff --git a/diff-merges.c b/diff-merges.c
new file mode 100644
index 0000000..146bb50
--- /dev/null
+++ b/diff-merges.c
@@ -0,0 +1,146 @@
+#include "diff-merges.h"
+
+#include "revision.h"
+
+static void suppress(struct rev_info *revs)
+{
+	revs->separate_merges = 0;
+	revs->first_parent_merges = 0;
+	revs->combine_merges = 0;
+	revs->dense_combined_merges = 0;
+	revs->combined_all_paths = 0;
+	revs->combined_imply_patch = 0;
+	revs->merges_need_diff = 0;
+}
+
+static void set_separate(struct rev_info *revs)
+{
+	suppress(revs);
+	revs->separate_merges = 1;
+}
+
+static void set_first_parent(struct rev_info *revs)
+{
+	set_separate(revs);
+	revs->first_parent_merges = 1;
+}
+
+static void set_m(struct rev_info *revs)
+{
+	/*
+	 * To "diff-index", "-m" means "match missing", and to the "log"
+	 * family of commands, it means "show full diff for merges". Set
+	 * both fields appropriately.
+	 */
+	set_separate(revs);
+	revs->match_missing = 1;
+}
+
+static void set_combined(struct rev_info *revs)
+{
+	suppress(revs);
+	revs->combine_merges = 1;
+	revs->dense_combined_merges = 0;
+}
+
+static void set_dense_combined(struct rev_info *revs)
+{
+	suppress(revs);
+	revs->combine_merges = 1;
+	revs->dense_combined_merges = 1;
+}
+
+static void set_diff_merges(struct rev_info *revs, const char *optarg)
+{
+	if (!strcmp(optarg, "off") || !strcmp(optarg, "none")) {
+		suppress(revs);
+		/* Return early to leave revs->merges_need_diff unset */
+		return;
+	}
+
+	if (!strcmp(optarg, "1") || !strcmp(optarg, "first-parent"))
+		set_first_parent(revs);
+	else if (!strcmp(optarg, "m") || !strcmp(optarg, "separate"))
+		set_separate(revs);
+	else if (!strcmp(optarg, "c") || !strcmp(optarg, "combined"))
+		set_combined(revs);
+	else if (!strcmp(optarg, "cc") || !strcmp(optarg, "dense-combined"))
+		set_dense_combined(revs);
+	else
+		die(_("unknown value for --diff-merges: %s"), optarg);
+
+	/* The flag is cleared by set_xxx() functions, so don't move this up */
+	revs->merges_need_diff = 1;
+}
+
+/*
+ * Public functions. They are in the order they are called.
+ */
+
+int diff_merges_parse_opts(struct rev_info *revs, const char **argv)
+{
+	int argcount = 1;
+	const char *optarg;
+	const char *arg = argv[0];
+
+	if (!strcmp(arg, "-m")) {
+		set_m(revs);
+	} else if (!strcmp(arg, "-c")) {
+		set_combined(revs);
+		revs->combined_imply_patch = 1;
+	} else if (!strcmp(arg, "--cc")) {
+		set_dense_combined(revs);
+		revs->combined_imply_patch = 1;
+	} else if (!strcmp(arg, "--no-diff-merges")) {
+		suppress(revs);
+	} else if (!strcmp(arg, "--combined-all-paths")) {
+		revs->combined_all_paths = 1;
+	} else if ((argcount = parse_long_opt("diff-merges", argv, &optarg))) {
+		set_diff_merges(revs, optarg);
+	} else
+		return 0;
+
+	revs->explicit_diff_merges = 1;
+	return argcount;
+}
+
+void diff_merges_suppress(struct rev_info *revs)
+{
+	suppress(revs);
+}
+
+void diff_merges_default_to_first_parent(struct rev_info *revs)
+{
+	if (!revs->explicit_diff_merges)
+		revs->separate_merges = 1;
+	if (revs->separate_merges)
+		revs->first_parent_merges = 1;
+}
+
+void diff_merges_default_to_dense_combined(struct rev_info *revs)
+{
+	if (!revs->explicit_diff_merges)
+		set_dense_combined(revs);
+}
+
+void diff_merges_set_dense_combined_if_unset(struct rev_info *revs)
+{
+	if (!revs->combine_merges)
+		set_dense_combined(revs);
+}
+
+void diff_merges_setup_revs(struct rev_info *revs)
+{
+	if (revs->combine_merges == 0)
+		revs->dense_combined_merges = 0;
+	if (revs->separate_merges == 0)
+		revs->first_parent_merges = 0;
+	if (revs->combined_all_paths && !revs->combine_merges)
+		die("--combined-all-paths makes no sense without -c or --cc");
+	if (revs->combined_imply_patch)
+		revs->diff = 1;
+	if (revs->combined_imply_patch || revs->merges_need_diff) {
+		if (!revs->diffopt.output_format)
+			revs->diffopt.output_format = DIFF_FORMAT_PATCH;
+	}
+}
diff --git a/diff-merges.h b/diff-merges.h
new file mode 100644
index 0000000..659467c
--- /dev/null
+++ b/diff-merges.h
@@ -0,0 +1,24 @@
+#ifndef DIFF_MERGES_H
+#define DIFF_MERGES_H
+
+/*
+ * diff-merges - utility module to handle command-line options for
+ * selection of particular diff format of merge commits
+ * representation.
+ */
+
+struct rev_info;
+
+int diff_merges_parse_opts(struct rev_info *revs, const char **argv);
+
+void diff_merges_suppress(struct rev_info *revs);
+
+void diff_merges_default_to_first_parent(struct rev_info *revs);
+
+void diff_merges_default_to_dense_combined(struct rev_info *revs);
+
+void diff_merges_set_dense_combined_if_unset(struct rev_info *revs);
+
+void diff_merges_setup_revs(struct rev_info *revs);
+
+#endif
diff --git a/diff.c b/diff.c
index 2253ec8..4acccd9 100644
--- a/diff.c
+++ b/diff.c
@@ -2233,14 +2233,12 @@ static void init_diff_words_data(struct emit_callback *ecbdata,
 	struct diff_options *o = xmalloc(sizeof(struct diff_options));
 	memcpy(o, orig_opts, sizeof(struct diff_options));
 
-	ecbdata->diff_words =
-		xcalloc(1, sizeof(struct diff_words_data));
+	CALLOC_ARRAY(ecbdata->diff_words, 1);
 	ecbdata->diff_words->type = o->word_diff;
 	ecbdata->diff_words->opt = o;
 
 	if (orig_opts->emitted_symbols)
-		o->emitted_symbols =
-			xcalloc(1, sizeof(struct emitted_diff_symbols));
+		CALLOC_ARRAY(o->emitted_symbols, 1);
 
 	if (!o->word_regex)
 		o->word_regex = userdiff_word_regex(one, o->repo->index);
@@ -2509,7 +2507,7 @@ static struct diffstat_file *diffstat_add(struct diffstat_t *diffstat,
 					  const char *name_b)
 {
 	struct diffstat_file *x;
-	x = xcalloc(1, sizeof(*x));
+	CALLOC_ARRAY(x, 1);
 	ALLOC_GROW(diffstat->files, diffstat->nr + 1, diffstat->alloc);
 	diffstat->files[diffstat->nr++] = x;
 	if (name_b) {
@@ -4593,6 +4591,9 @@ void repo_diff_setup(struct repository *r, struct diff_options *options)
 
 	options->orderfile = diff_order_file_cfg;
 
+	if (!options->flags.ignore_submodule_set)
+		options->flags.ignore_untracked_in_submodules = 1;
+
 	if (diff_no_prefix) {
 		options->a_prefix = options->b_prefix = "";
 	} else if (!diff_mnemonic_prefix) {
@@ -4915,7 +4916,7 @@ static int diff_opt_find_object(const struct option *option,
 		return error(_("unable to resolve '%s'"), arg);
 
 	if (!opt->objfind)
-		opt->objfind = xcalloc(1, sizeof(*opt->objfind));
+		CALLOC_ARRAY(opt->objfind, 1);
 
 	opt->pickaxe_opts |= DIFF_PICKAXE_KIND_OBJFIND;
 	opt->flags.recursive = 1;
@@ -5345,6 +5346,19 @@ static int diff_opt_word_diff_regex(const struct option *opt,
 	return 0;
 }
 
+static int diff_opt_rotate_to(const struct option *opt, const char *arg, int unset)
+{
+	struct diff_options *options = opt->value;
+
+	BUG_ON_OPT_NEG(unset);
+	if (!strcmp(opt->long_name, "skip-to"))
+		options->skip_instead_of_rotate = 1;
+	else
+		options->skip_instead_of_rotate = 0;
+	options->rotate_to = arg;
+	return 0;
+}
+
 static void prep_parse_options(struct diff_options *options)
 {
 	struct option parseopts[] = {
@@ -5596,6 +5610,12 @@ static void prep_parse_options(struct diff_options *options)
 			  DIFF_PICKAXE_REGEX, PARSE_OPT_NONEG),
 		OPT_FILENAME('O', NULL, &options->orderfile,
 			     N_("control the order in which files appear in the output")),
+		OPT_CALLBACK_F(0, "rotate-to", options, N_("<path>"),
+			       N_("show the change in the specified path first"),
+			       PARSE_OPT_NONEG, diff_opt_rotate_to),
+		OPT_CALLBACK_F(0, "skip-to", options, N_("<path>"),
+			       N_("skip the output to the specified path"),
+			       PARSE_OPT_NONEG, diff_opt_rotate_to),
 		OPT_CALLBACK_F(0, "find-object", options, N_("<object-id>"),
 			       N_("look for differences that change the number of occurrences of the specified object"),
 			       PARSE_OPT_NONEG, diff_opt_find_object),
@@ -6333,6 +6353,32 @@ static void diff_flush_patch_all_file_pairs(struct diff_options *o)
 	}
 }
 
+static void diff_free_file(struct diff_options *options)
+{
+	if (options->close_file)
+		fclose(options->file);
+}
+
+static void diff_free_ignore_regex(struct diff_options *options)
+{
+	int i;
+
+	for (i = 0; i < options->ignore_regex_nr; i++) {
+		regfree(options->ignore_regex[i]);
+		free(options->ignore_regex[i]);
+	}
+	free(options->ignore_regex);
+}
+
+void diff_free(struct diff_options *options)
+{
+	if (options->no_free)
+		return;
+
+	diff_free_file(options);
+	diff_free_ignore_regex(options);
+}
+
 void diff_flush(struct diff_options *options)
 {
 	struct diff_queue_struct *q = &diff_queued_diff;
@@ -6396,8 +6442,7 @@ void diff_flush(struct diff_options *options)
 		 * options->file to /dev/null should be safe, because we
 		 * aren't supposed to produce any output anyway.
 		 */
-		if (options->close_file)
-			fclose(options->file);
+		diff_free_file(options);
 		options->file = xfopen("/dev/null", "w");
 		options->close_file = 1;
 		options->color_moved = 0;
@@ -6430,8 +6475,7 @@ void diff_flush(struct diff_options *options)
 free_queue:
 	free(q->queue);
 	DIFF_QUEUE_CLEAR(q);
-	if (options->close_file)
-		fclose(options->file);
+	diff_free(options);
 
 	/*
 	 * Report the content-level differences with HAS_CHANGES;
@@ -6666,6 +6710,8 @@ void diffcore_std(struct diff_options *options)
 		diffcore_pickaxe(options);
 	if (options->orderfile)
 		diffcore_order(options->orderfile);
+	if (options->rotate_to)
+		diffcore_rotate(options);
 	if (!options->found_follow)
 		/* See try_to_follow_renames() in tree-diff.c */
 		diff_resolve_rename_copy();
diff --git a/diff.h b/diff.h
index 9665e22..c8f3fae 100644
--- a/diff.h
+++ b/diff.h
@@ -49,7 +49,17 @@
  * - Once you finish feeding the pairs of files, call `diffcore_std()`.
  * This will tell the diffcore library to go ahead and do its work.
  *
- * - Calling `diff_flush()` will produce the output.
+ * - Calling `diff_flush()` will produce the output, it will call
+ *   `diff_free()` to free any resources, e.g. those allocated in
+ *   `diff_opt_parse()`.
+ *
+ * - Set `.no_free = 1` before calling `diff_flush()` to defer the
+ *   freeing of allocated memory in diff_options. This is useful when
+ *   `diff_flush()` is being called in a loop, rather than as a
+ *   one-off. When setting `.no_free = 1` you must ensure that
+ *   `diff_free()` is called at the end, either by flipping the flag
+ *   before the last `diff_flush()` call, or by flipping it before
+ *   calling `diff_free()` yourself.
  */
 
 struct combine_diff_path;
@@ -178,6 +188,7 @@ struct diff_flags {
 	unsigned diff_from_contents;
 	unsigned dirty_submodules;
 	unsigned ignore_untracked_in_submodules;
+	unsigned ignore_submodule_set;
 	unsigned ignore_dirty_submodules;
 	unsigned override_submodule_config;
 	unsigned dirstat_by_line;
@@ -226,6 +237,27 @@ enum diff_submodule_format {
 struct diff_options {
 	const char *orderfile;
 
+	/*
+	 * "--rotate-to=<file>" would start showing at <file> and when
+	 * the output reaches the end, wrap around by default.
+	 * Setting skip_instead_of_rotate to true stops the output at the
+	 * end, effectively discarding the earlier part of the output
+	 * before <file>'s diff (this is used to implement the
+	 * "--skip-to=<file>" option).
+	 *
+	 * When rotate_to_strict is set, it is an error if there is no
+	 * <file> in the diff.  Otherwise, the output starts at the
+	 * path that is the same as, or first path that sorts after,
+	 * <file>.  Because it is unreasonable to require the exact
+	 * match for "git log -p --rotate-to=<file>" (i.e. not all
+	 * commit would touch that single <file>), "git log" sets it
+	 * to false.  "git diff" sets it to true to detect an error
+	 * in the command line option.
+	 */
+	const char *rotate_to;
+	int skip_instead_of_rotate;
+	int rotate_to_strict;
+
 	/**
 	 * A constant string (can and typically does contain newlines to look for
 	 * a block of text, not just a single line) to filter out the filepairs
@@ -364,6 +396,8 @@ struct diff_options {
 
 	struct repository *repo;
 	struct option *parseopts;
+
+	int no_free;
 };
 
 unsigned diff_filter_bit(char status);
@@ -558,6 +592,7 @@ void diffcore_fix_diff_index(void);
 
 int diff_queue_is_empty(void);
 void diff_flush(struct diff_options*);
+void diff_free(struct diff_options*);
 void diff_warn_rename_limit(const char *varname, int needed, int degraded_cc);
 
 /* diff-raw status letters */
diff --git a/diffcore-rename.c b/diffcore-rename.c
index d367a6d..9c1478c 100644
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -9,63 +9,36 @@
 #include "hashmap.h"
 #include "progress.h"
 #include "promisor-remote.h"
+#include "strmap.h"
 
 /* Table of rename/copy destinations */
 
 static struct diff_rename_dst {
-	struct diff_filespec *two;
-	struct diff_filepair *pair;
+	struct diff_filepair *p;
+	struct diff_filespec *filespec_to_free;
+	int is_rename; /* false -> just a create; true -> rename or copy */
 } *rename_dst;
 static int rename_dst_nr, rename_dst_alloc;
+/* Mapping from break source pathname to break destination index */
+static struct strintmap *break_idx = NULL;
 
-static int find_rename_dst(struct diff_filespec *two)
+static struct diff_rename_dst *locate_rename_dst(struct diff_filepair *p)
 {
-	int first, last;
-
-	first = 0;
-	last = rename_dst_nr;
-	while (last > first) {
-		int next = first + ((last - first) >> 1);
-		struct diff_rename_dst *dst = &(rename_dst[next]);
-		int cmp = strcmp(two->path, dst->two->path);
-		if (!cmp)
-			return next;
-		if (cmp < 0) {
-			last = next;
-			continue;
-		}
-		first = next+1;
-	}
-	return -first - 1;
-}
-
-static struct diff_rename_dst *locate_rename_dst(struct diff_filespec *two)
-{
-	int ofs = find_rename_dst(two);
-	return ofs < 0 ? NULL : &rename_dst[ofs];
+	/* Lookup by p->ONE->path */
+	int idx = break_idx ? strintmap_get(break_idx, p->one->path) : -1;
+	return (idx == -1) ? NULL : &rename_dst[idx];
 }
 
 /*
  * Returns 0 on success, -1 if we found a duplicate.
  */
-static int add_rename_dst(struct diff_filespec *two)
+static int add_rename_dst(struct diff_filepair *p)
 {
-	int first = find_rename_dst(two);
-
-	if (first >= 0)
-		return -1;
-	first = -first - 1;
-
-	/* insert to make it at "first" */
 	ALLOC_GROW(rename_dst, rename_dst_nr + 1, rename_dst_alloc);
+	rename_dst[rename_dst_nr].p = p;
+	rename_dst[rename_dst_nr].filespec_to_free = NULL;
+	rename_dst[rename_dst_nr].is_rename = 0;
 	rename_dst_nr++;
-	if (first < rename_dst_nr)
-		MOVE_ARRAY(rename_dst + first + 1, rename_dst + first,
-			   rename_dst_nr - first - 1);
-	rename_dst[first].two = alloc_filespec(two->path);
-	fill_filespec(rename_dst[first].two, &two->oid, two->oid_valid,
-		      two->mode);
-	rename_dst[first].pair = NULL;
 	return 0;
 }
 
@@ -76,36 +49,20 @@ static struct diff_rename_src {
 } *rename_src;
 static int rename_src_nr, rename_src_alloc;
 
-static struct diff_rename_src *register_rename_src(struct diff_filepair *p)
+static void register_rename_src(struct diff_filepair *p)
 {
-	int first, last;
-	struct diff_filespec *one = p->one;
-	unsigned short score = p->score;
-
-	first = 0;
-	last = rename_src_nr;
-	while (last > first) {
-		int next = first + ((last - first) >> 1);
-		struct diff_rename_src *src = &(rename_src[next]);
-		int cmp = strcmp(one->path, src->p->one->path);
-		if (!cmp)
-			return src;
-		if (cmp < 0) {
-			last = next;
-			continue;
+	if (p->broken_pair) {
+		if (!break_idx) {
+			break_idx = xmalloc(sizeof(*break_idx));
+			strintmap_init(break_idx, -1);
 		}
-		first = next+1;
+		strintmap_set(break_idx, p->one->path, rename_dst_nr);
 	}
 
-	/* insert to make it at "first" */
 	ALLOC_GROW(rename_src, rename_src_nr + 1, rename_src_alloc);
+	rename_src[rename_src_nr].p = p;
+	rename_src[rename_src_nr].score = p->score;
 	rename_src_nr++;
-	if (first < rename_src_nr)
-		MOVE_ARRAY(rename_src + first + 1, rename_src + first,
-			   rename_src_nr - first - 1);
-	rename_src[first].p = p;
-	rename_src[first].score = score;
-	return &(rename_src[first]);
 }
 
 static int basename_same(struct diff_filespec *src, struct diff_filespec *dst)
@@ -141,14 +98,14 @@ static void prefetch(void *prefetch_options)
 	struct oid_array to_fetch = OID_ARRAY_INIT;
 
 	for (i = 0; i < rename_dst_nr; i++) {
-		if (rename_dst[i].pair)
+		if (rename_dst[i].p->renamed_pair)
 			/*
 			 * The loop in diffcore_rename() will not need these
 			 * blobs, so skip prefetching.
 			 */
 			continue; /* already found exact match */
 		diff_add_if_missing(options->repo, &to_fetch,
-				    rename_dst[i].two);
+				    rename_dst[i].p->two);
 	}
 	for (i = 0; i < rename_src_nr; i++) {
 		if (options->skip_unmodified &&
@@ -258,26 +215,24 @@ static int estimate_similarity(struct repository *r,
 
 static void record_rename_pair(int dst_index, int src_index, int score)
 {
-	struct diff_filespec *src, *dst;
-	struct diff_filepair *dp;
+	struct diff_filepair *src = rename_src[src_index].p;
+	struct diff_filepair *dst = rename_dst[dst_index].p;
 
-	if (rename_dst[dst_index].pair)
+	if (dst->renamed_pair)
 		die("internal error: dst already matched.");
 
-	src = rename_src[src_index].p->one;
-	src->rename_used++;
-	src->count++;
+	src->one->rename_used++;
+	src->one->count++;
 
-	dst = rename_dst[dst_index].two;
-	dst->count++;
+	rename_dst[dst_index].filespec_to_free = dst->one;
+	rename_dst[dst_index].is_rename = 1;
 
-	dp = diff_queue(NULL, src, dst);
-	dp->renamed_pair = 1;
-	if (!strcmp(src->path, dst->path))
-		dp->score = rename_src[src_index].score;
+	dst->one = src->one;
+	dst->renamed_pair = 1;
+	if (!strcmp(dst->one->path, dst->two->path))
+		dst->score = rename_src[src_index].score;
 	else
-		dp->score = score;
-	rename_dst[dst_index].pair = dp;
+		dst->score = score;
 }
 
 /*
@@ -323,7 +278,7 @@ static int find_identical_files(struct hashmap *srcs,
 				struct diff_options *options)
 {
 	int renames = 0;
-	struct diff_filespec *target = rename_dst[dst_index].two;
+	struct diff_filespec *target = rename_dst[dst_index].p->two;
 	struct file_similarity *p, *best = NULL;
 	int i = 100, best_score = -1;
 	unsigned int hash = hash_filespec(options->repo, target);
@@ -412,6 +367,144 @@ static int find_exact_renames(struct diff_options *options)
 	return renames;
 }
 
+static const char *get_basename(const char *filename)
+{
+	/*
+	 * gitbasename() has to worry about special drives, multiple
+	 * directory separator characters, trailing slashes, NULL or
+	 * empty strings, etc.  We only work on filenames as stored in
+	 * git, and thus get to ignore all those complications.
+	 */
+	const char *base = strrchr(filename, '/');
+	return base ? base + 1 : filename;
+}
+
+static int find_basename_matches(struct diff_options *options,
+				 int minimum_score)
+{
+	/*
+	 * When I checked in early 2020, over 76% of file renames in linux
+	 * just moved files to a different directory but kept the same
+	 * basename.  gcc did that with over 64% of renames, gecko did it
+	 * with over 79%, and WebKit did it with over 89%.
+	 *
+	 * Therefore we can bypass the normal exhaustive NxM matrix
+	 * comparison of similarities between all potential rename sources
+	 * and destinations by instead using file basename as a hint (i.e.
+	 * the portion of the filename after the last '/'), checking for
+	 * similarity between files with the same basename, and if we find
+	 * a pair that are sufficiently similar, record the rename pair and
+	 * exclude those two from the NxM matrix.
+	 *
+	 * This *might* cause us to find a less than optimal pairing (if
+	 * there is another file that we are even more similar to but has a
+	 * different basename).  Given the huge performance advantage
+	 * basename matching provides, and given the frequency with which
+	 * people use the same basename in real world projects, that's a
+	 * trade-off we are willing to accept when doing just rename
+	 * detection.
+	 *
+	 * If someone wants copy detection that implies they are willing to
+	 * spend more cycles to find similarities between files, so it may
+	 * be less likely that this heuristic is wanted.  If someone is
+	 * doing break detection, that means they do not want filename
+	 * similarity to imply any form of content similiarity, and thus
+	 * this heuristic would definitely be incompatible.
+	 */
+
+	int i, renames = 0;
+	struct strintmap sources;
+	struct strintmap dests;
+	struct hashmap_iter iter;
+	struct strmap_entry *entry;
+
+	/*
+	 * The prefeteching stuff wants to know if it can skip prefetching
+	 * blobs that are unmodified...and will then do a little extra work
+	 * to verify that the oids are indeed different before prefetching.
+	 * Unmodified blobs are only relevant when doing copy detection;
+	 * when limiting to rename detection, diffcore_rename[_extended]()
+	 * will never be called with unmodified source paths fed to us, so
+	 * the extra work necessary to check if rename_src entries are
+	 * unmodified would be a small waste.
+	 */
+	int skip_unmodified = 0;
+
+	/*
+	 * Create maps of basename -> fullname(s) for remaining sources and
+	 * dests.
+	 */
+	strintmap_init_with_options(&sources, -1, NULL, 0);
+	strintmap_init_with_options(&dests, -1, NULL, 0);
+	for (i = 0; i < rename_src_nr; ++i) {
+		char *filename = rename_src[i].p->one->path;
+		const char *base;
+
+		/* exact renames removed in remove_unneeded_paths_from_src() */
+		assert(!rename_src[i].p->one->rename_used);
+
+		/* Record index within rename_src (i) if basename is unique */
+		base = get_basename(filename);
+		if (strintmap_contains(&sources, base))
+			strintmap_set(&sources, base, -1);
+		else
+			strintmap_set(&sources, base, i);
+	}
+	for (i = 0; i < rename_dst_nr; ++i) {
+		char *filename = rename_dst[i].p->two->path;
+		const char *base;
+
+		if (rename_dst[i].is_rename)
+			continue; /* involved in exact match already. */
+
+		/* Record index within rename_dst (i) if basename is unique */
+		base = get_basename(filename);
+		if (strintmap_contains(&dests, base))
+			strintmap_set(&dests, base, -1);
+		else
+			strintmap_set(&dests, base, i);
+	}
+
+	/* Now look for basename matchups and do similarity estimation */
+	strintmap_for_each_entry(&sources, &iter, entry) {
+		const char *base = entry->key;
+		intptr_t src_index = (intptr_t)entry->value;
+		intptr_t dst_index;
+		if (src_index == -1)
+			continue;
+
+		if (0 <= (dst_index = strintmap_get(&dests, base))) {
+			struct diff_filespec *one, *two;
+			int score;
+
+			/* Estimate the similarity */
+			one = rename_src[src_index].p->one;
+			two = rename_dst[dst_index].p->two;
+			score = estimate_similarity(options->repo, one, two,
+						    minimum_score, skip_unmodified);
+
+			/* If sufficiently similar, record as rename pair */
+			if (score < minimum_score)
+				continue;
+			record_rename_pair(dst_index, src_index, score);
+			renames++;
+
+			/*
+			 * Found a rename so don't need text anymore; if we
+			 * didn't find a rename, the filespec_blob would get
+			 * re-used when doing the matrix of comparisons.
+			 */
+			diff_free_filespec_blob(one);
+			diff_free_filespec_blob(two);
+		}
+	}
+
+	strintmap_clear(&sources);
+	strintmap_clear(&dests);
+
+	return renames;
+}
+
 #define NUM_CANDIDATE_PER_DST 4
 static void record_if_better(struct diff_score m[], struct diff_score *o)
 {
@@ -434,12 +527,11 @@ static void record_if_better(struct diff_score m[], struct diff_score *o)
  * 1 if we need to disable inexact rename detection;
  * 2 if we would be under the limit if we were given -C instead of -C -C.
  */
-static int too_many_rename_candidates(int num_create,
+static int too_many_rename_candidates(int num_destinations, int num_sources,
 				      struct diff_options *options)
 {
 	int rename_limit = options->rename_limit;
-	int num_src = rename_src_nr;
-	int i;
+	int i, limited_sources;
 
 	options->needed_rename_limit = 0;
 
@@ -447,31 +539,34 @@ static int too_many_rename_candidates(int num_create,
 	 * This basically does a test for the rename matrix not
 	 * growing larger than a "rename_limit" square matrix, ie:
 	 *
-	 *    num_create * num_src > rename_limit * rename_limit
+	 *    num_destinations * num_sources > rename_limit * rename_limit
+	 *
+	 * We use st_mult() to check overflow conditions; in the
+	 * exceptional circumstance that size_t isn't large enough to hold
+	 * the multiplication, the system won't be able to allocate enough
+	 * memory for the matrix anyway.
 	 */
 	if (rename_limit <= 0)
 		rename_limit = 32767;
-	if ((num_create <= rename_limit || num_src <= rename_limit) &&
-	    ((uint64_t)num_create * (uint64_t)num_src
-	     <= (uint64_t)rename_limit * (uint64_t)rename_limit))
+	if (st_mult(num_destinations, num_sources)
+	    <= st_mult(rename_limit, rename_limit))
 		return 0;
 
 	options->needed_rename_limit =
-		num_src > num_create ? num_src : num_create;
+		num_sources > num_destinations ? num_sources : num_destinations;
 
 	/* Are we running under -C -C? */
 	if (!options->flags.find_copies_harder)
 		return 1;
 
 	/* Would we bust the limit if we were running under -C? */
-	for (num_src = i = 0; i < rename_src_nr; i++) {
+	for (limited_sources = i = 0; i < num_sources; i++) {
 		if (diff_unmodified_pair(rename_src[i].p))
 			continue;
-		num_src++;
+		limited_sources++;
 	}
-	if ((num_create <= rename_limit || num_src <= rename_limit) &&
-	    ((uint64_t)num_create * (uint64_t)num_src
-	     <= (uint64_t)rename_limit * (uint64_t)rename_limit))
+	if (st_mult(num_destinations, limited_sources)
+	    <= st_mult(rename_limit, rename_limit))
 		return 2;
 	return 1;
 }
@@ -487,7 +582,7 @@ static int find_renames(struct diff_score *mx, int dst_cnt, int minimum_score, i
 		    (mx[i].score < minimum_score))
 			break; /* there is no more usable pair. */
 		dst = &rename_dst[mx[i].dst];
-		if (dst->pair)
+		if (dst->is_rename)
 			continue; /* already done, either exact or fuzzy. */
 		if (!copies && rename_src[mx[i].src].p->one->rename_used)
 			continue;
@@ -497,6 +592,54 @@ static int find_renames(struct diff_score *mx, int dst_cnt, int minimum_score, i
 	return count;
 }
 
+static void remove_unneeded_paths_from_src(int detecting_copies)
+{
+	int i, new_num_src;
+
+	if (detecting_copies)
+		return; /* nothing to remove */
+	if (break_idx)
+		return; /* culling incompatible with break detection */
+
+	/*
+	 * Note on reasons why we cull unneeded sources but not destinations:
+	 *   1) Pairings are stored in rename_dst (not rename_src), which we
+	 *      need to keep around.  So, we just can't cull rename_dst even
+	 *      if we wanted to.  But doing so wouldn't help because...
+	 *
+	 *   2) There is a matrix pairwise comparison that follows the
+	 *      "Performing inexact rename detection" progress message.
+	 *      Iterating over the destinations is done in the outer loop,
+	 *      hence we only iterate over each of those once and we can
+	 *      easily skip the outer loop early if the destination isn't
+	 *      relevant.  That's only one check per destination path to
+	 *      skip.
+	 *
+	 *      By contrast, the sources are iterated in the inner loop; if
+	 *      we check whether a source can be skipped, then we'll be
+	 *      checking it N separate times, once for each destination.
+	 *      We don't want to have to iterate over known-not-needed
+	 *      sources N times each, so avoid that by removing the sources
+	 *      from rename_src here.
+	 */
+	for (i = 0, new_num_src = 0; i < rename_src_nr; i++) {
+		/*
+		 * renames are stored in rename_dst, so if a rename has
+		 * already been detected using this source, we can just
+		 * remove the source knowing rename_dst has its info.
+		 */
+		if (rename_src[i].p->one->rename_used)
+			continue;
+
+		if (new_num_src < i)
+			memcpy(&rename_src[new_num_src], &rename_src[i],
+			       sizeof(struct diff_rename_src));
+		new_num_src++;
+	}
+
+	rename_src_nr = new_num_src;
+}
+
 void diffcore_rename(struct diff_options *options)
 {
 	int detect_rename = options->detect_rename;
@@ -505,9 +648,12 @@ void diffcore_rename(struct diff_options *options)
 	struct diff_queue_struct outq;
 	struct diff_score *mx;
 	int i, j, rename_count, skip_unmodified = 0;
-	int num_create, dst_cnt;
+	int num_destinations, dst_cnt;
+	int num_sources, want_copies;
 	struct progress *progress = NULL;
 
+	trace2_region_enter("diff", "setup", options->repo);
+	want_copies = (detect_rename == DIFF_DETECT_COPY);
 	if (!minimum_score)
 		minimum_score = DEFAULT_RENAME_SCORE;
 
@@ -522,7 +668,7 @@ void diffcore_rename(struct diff_options *options)
 			else if (!options->flags.rename_empty &&
 				 is_empty_blob_oid(&p->two->oid))
 				continue;
-			else if (add_rename_dst(p->two) < 0) {
+			else if (add_rename_dst(p) < 0) {
 				warning("skipping rename detection, detected"
 					" duplicate destination '%s'",
 					p->two->path);
@@ -544,7 +690,7 @@ void diffcore_rename(struct diff_options *options)
 				p->one->rename_used++;
 			register_rename_src(p);
 		}
-		else if (detect_rename == DIFF_DETECT_COPY) {
+		else if (want_copies) {
 			/*
 			 * Increment the "rename_used" score by
 			 * one, to indicate ourselves as a user.
@@ -553,30 +699,77 @@ void diffcore_rename(struct diff_options *options)
 			register_rename_src(p);
 		}
 	}
+	trace2_region_leave("diff", "setup", options->repo);
 	if (rename_dst_nr == 0 || rename_src_nr == 0)
 		goto cleanup; /* nothing to do */
 
+	trace2_region_enter("diff", "exact renames", options->repo);
 	/*
 	 * We really want to cull the candidates list early
 	 * with cheap tests in order to avoid doing deltas.
 	 */
 	rename_count = find_exact_renames(options);
+	trace2_region_leave("diff", "exact renames", options->repo);
 
 	/* Did we only want exact renames? */
 	if (minimum_score == MAX_SCORE)
 		goto cleanup;
 
-	/*
-	 * Calculate how many renames are left (but all the source
-	 * files still remain as options for rename/copies!)
-	 */
-	num_create = (rename_dst_nr - rename_count);
+	num_sources = rename_src_nr;
+
+	if (want_copies || break_idx) {
+		/*
+		 * Cull sources:
+		 *   - remove ones corresponding to exact renames
+		 */
+		trace2_region_enter("diff", "cull after exact", options->repo);
+		remove_unneeded_paths_from_src(want_copies);
+		trace2_region_leave("diff", "cull after exact", options->repo);
+	} else {
+		/* Determine minimum score to match basenames */
+		double factor = 0.5;
+		char *basename_factor = getenv("GIT_BASENAME_FACTOR");
+		int min_basename_score;
+
+		if (basename_factor)
+			factor = strtol(basename_factor, NULL, 10)/100.0;
+		assert(factor >= 0.0 && factor <= 1.0);
+		min_basename_score = minimum_score +
+			(int)(factor * (MAX_SCORE - minimum_score));
+
+		/*
+		 * Cull sources:
+		 *   - remove ones involved in renames (found via exact match)
+		 */
+		trace2_region_enter("diff", "cull after exact", options->repo);
+		remove_unneeded_paths_from_src(want_copies);
+		trace2_region_leave("diff", "cull after exact", options->repo);
+
+		/* Utilize file basenames to quickly find renames. */
+		trace2_region_enter("diff", "basename matches", options->repo);
+		rename_count += find_basename_matches(options,
+						      min_basename_score);
+		trace2_region_leave("diff", "basename matches", options->repo);
+
+		/*
+		 * Cull sources, again:
+		 *   - remove ones involved in renames (found via basenames)
+		 */
+		trace2_region_enter("diff", "cull basename", options->repo);
+		remove_unneeded_paths_from_src(want_copies);
+		trace2_region_leave("diff", "cull basename", options->repo);
+	}
+
+	/* Calculate how many rename destinations are left */
+	num_destinations = (rename_dst_nr - rename_count);
+	num_sources = rename_src_nr; /* rename_src_nr reflects lower number */
 
 	/* All done? */
-	if (!num_create)
+	if (!num_destinations || !num_sources)
 		goto cleanup;
 
-	switch (too_many_rename_candidates(num_create, options)) {
+	switch (too_many_rename_candidates(num_destinations, num_sources,
+					   options)) {
 	case 1:
 		goto cleanup;
 	case 2:
@@ -587,19 +780,20 @@ void diffcore_rename(struct diff_options *options)
 		break;
 	}
 
+	trace2_region_enter("diff", "inexact renames", options->repo);
 	if (options->show_rename_progress) {
 		progress = start_delayed_progress(
 				_("Performing inexact rename detection"),
-				(uint64_t)rename_dst_nr * (uint64_t)rename_src_nr);
+				(uint64_t)num_destinations * (uint64_t)num_sources);
 	}
 
-	mx = xcalloc(st_mult(NUM_CANDIDATE_PER_DST, num_create), sizeof(*mx));
+	CALLOC_ARRAY(mx, st_mult(NUM_CANDIDATE_PER_DST, num_destinations));
 	for (dst_cnt = i = 0; i < rename_dst_nr; i++) {
-		struct diff_filespec *two = rename_dst[i].two;
+		struct diff_filespec *two = rename_dst[i].p->two;
 		struct diff_score *m;
 
-		if (rename_dst[i].pair)
-			continue; /* dealt with exact match already. */
+		if (rename_dst[i].is_rename)
+			continue; /* exact or basename match already handled */
 
 		m = &mx[dst_cnt * NUM_CANDIDATE_PER_DST];
 		for (j = 0; j < NUM_CANDIDATE_PER_DST; j++)
@@ -609,6 +803,8 @@ void diffcore_rename(struct diff_options *options)
 			struct diff_filespec *one = rename_src[j].p->one;
 			struct diff_score this_src;
 
+			assert(!one->rename_used || want_copies || break_idx);
+
 			if (skip_unmodified &&
 			    diff_unmodified_pair(rename_src[j].p))
 				continue;
@@ -629,7 +825,8 @@ void diffcore_rename(struct diff_options *options)
 			diff_free_filespec_blob(two);
 		}
 		dst_cnt++;
-		display_progress(progress, (uint64_t)(i+1)*(uint64_t)rename_src_nr);
+		display_progress(progress,
+				 (uint64_t)dst_cnt * (uint64_t)num_sources);
 	}
 	stop_progress(&progress);
 
@@ -637,14 +834,16 @@ void diffcore_rename(struct diff_options *options)
 	STABLE_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)
+	if (want_copies)
 		rename_count += find_renames(mx, dst_cnt, minimum_score, 1);
 	free(mx);
+	trace2_region_leave("diff", "inexact renames", options->repo);
 
  cleanup:
 	/* At this point, we have found some renames and copies and they
 	 * are recorded in rename_dst.  The original list is still in *q.
 	 */
+	trace2_region_enter("diff", "write back to queue", options->repo);
 	DIFF_QUEUE_CLEAR(&outq);
 	for (i = 0; i < q->nr; i++) {
 		struct diff_filepair *p = q->queue[i];
@@ -654,22 +853,8 @@ void diffcore_rename(struct diff_options *options)
 			diff_q(&outq, p);
 		}
 		else if (!DIFF_FILE_VALID(p->one) && DIFF_FILE_VALID(p->two)) {
-			/*
-			 * Creation
-			 *
-			 * We would output this create record if it has
-			 * not been turned into a rename/copy already.
-			 */
-			struct diff_rename_dst *dst = locate_rename_dst(p->two);
-			if (dst && dst->pair) {
-				diff_q(&outq, dst->pair);
-				pair_to_free = p;
-			}
-			else
-				/* no matching rename/copy source, so
-				 * record this as a creation.
-				 */
-				diff_q(&outq, p);
+			/* Creation */
+			diff_q(&outq, p);
 		}
 		else if (DIFF_FILE_VALID(p->one) && !DIFF_FILE_VALID(p->two)) {
 			/*
@@ -690,8 +875,10 @@ void diffcore_rename(struct diff_options *options)
 			 */
 			if (DIFF_PAIR_BROKEN(p)) {
 				/* broken delete */
-				struct diff_rename_dst *dst = locate_rename_dst(p->one);
-				if (dst && dst->pair)
+				struct diff_rename_dst *dst = locate_rename_dst(p);
+				if (!dst)
+					BUG("tracking failed somehow; failed to find associated dst for broken pair");
+				if (dst->is_rename)
 					/* counterpart is now rename/copy */
 					pair_to_free = p;
 			}
@@ -701,16 +888,14 @@ void diffcore_rename(struct diff_options *options)
 					pair_to_free = p;
 			}
 
-			if (pair_to_free)
-				;
-			else
+			if (!pair_to_free)
 				diff_q(&outq, p);
 		}
 		else if (!diff_unmodified_pair(p))
 			/* all the usual ones need to be kept */
 			diff_q(&outq, p);
 		else
-			/* no need to keep unmodified pairs */
+			/* no need to keep unmodified pairs; FIXME: remove earlier? */
 			pair_to_free = p;
 
 		if (pair_to_free)
@@ -723,11 +908,17 @@ void diffcore_rename(struct diff_options *options)
 	diff_debug_queue("done collapsing", q);
 
 	for (i = 0; i < rename_dst_nr; i++)
-		free_filespec(rename_dst[i].two);
+		if (rename_dst[i].filespec_to_free)
+			free_filespec(rename_dst[i].filespec_to_free);
 
 	FREE_AND_NULL(rename_dst);
 	rename_dst_nr = rename_dst_alloc = 0;
 	FREE_AND_NULL(rename_src);
 	rename_src_nr = rename_src_alloc = 0;
+	if (break_idx) {
+		strintmap_clear(break_idx);
+		FREE_AND_NULL(break_idx);
+	}
+	trace2_region_leave("diff", "write back to queue", options->repo);
 	return;
 }
diff --git a/diffcore-rotate.c b/diffcore-rotate.c
new file mode 100644
index 0000000..445f060
--- /dev/null
+++ b/diffcore-rotate.c
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2021, Google LLC.
+ * Based on diffcore-order.c, which is Copyright (C) 2005, Junio C Hamano
+ */
+#include "cache.h"
+#include "diff.h"
+#include "diffcore.h"
+
+void diffcore_rotate(struct diff_options *opt)
+{
+	struct diff_queue_struct *q = &diff_queued_diff;
+	struct diff_queue_struct outq;
+	int rotate_to, i;
+
+	if (!q->nr)
+		return;
+
+	for (i = 0; i < q->nr; i++) {
+		int cmp = strcmp(opt->rotate_to, q->queue[i]->two->path);
+		if (!cmp)
+			break; /* exact match */
+		if (!opt->rotate_to_strict && cmp < 0)
+			break; /* q->queue[i] is now past the target pathname */
+	}
+
+	if (q->nr <= i) {
+		/* we did not find the specified path */
+		if (opt->rotate_to_strict)
+			die(_("No such path '%s' in the diff"), opt->rotate_to);
+		return;
+	}
+
+	DIFF_QUEUE_CLEAR(&outq);
+	rotate_to = i;
+
+	for (i = rotate_to; i < q->nr; i++)
+		diff_q(&outq, q->queue[i]);
+	for (i = 0; i < rotate_to; i++) {
+		if (opt->skip_instead_of_rotate)
+			diff_free_filepair(q->queue[i]);
+		else
+			diff_q(&outq, q->queue[i]);
+	}
+	free(q->queue);
+	*q = outq;
+}
diff --git a/diffcore.h b/diffcore.h
index d2a63c5..c1592bc 100644
--- a/diffcore.h
+++ b/diffcore.h
@@ -164,6 +164,7 @@ void diffcore_rename(struct diff_options *);
 void diffcore_merge_broken(void);
 void diffcore_pickaxe(struct diff_options *);
 void diffcore_order(const char *orderfile);
+void diffcore_rotate(struct diff_options *);
 
 /* low-level interface to diffcore_order */
 struct obj_order {
diff --git a/dir.c b/dir.c
index d637461..19c2fa2 100644
--- a/dir.c
+++ b/dir.c
@@ -1488,7 +1488,7 @@ static void prep_exclude(struct dir_struct *dir,
 		const char *cp;
 		struct oid_stat oid_stat;
 
-		stk = xcalloc(1, sizeof(*stk));
+		CALLOC_ARRAY(stk, 1);
 		if (current < 0) {
 			cp = base;
 			current = 0;
@@ -2730,11 +2730,8 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d
 		return NULL;
 	}
 
-	if (!dir->untracked->root) {
-		const int len = sizeof(*dir->untracked->root);
-		dir->untracked->root = xmalloc(len);
-		memset(dir->untracked->root, 0, len);
-	}
+	if (!dir->untracked->root)
+		FLEX_ALLOC_STR(dir->untracked->root, name, "");
 
 	/* Validate $GIT_DIR/info/exclude and core.excludesfile */
 	root = dir->untracked->root;
@@ -2998,6 +2995,23 @@ void setup_standard_excludes(struct dir_struct *dir)
 	}
 }
 
+char *get_sparse_checkout_filename(void)
+{
+	return git_pathdup("info/sparse-checkout");
+}
+
+int get_sparse_checkout_patterns(struct pattern_list *pl)
+{
+	int res;
+	char *sparse_filename = get_sparse_checkout_filename();
+
+	pl->use_cone_patterns = core_sparse_checkout_cone;
+	res = add_patterns_from_file_to_list(sparse_filename, "", 0, pl, NULL);
+
+	free(sparse_filename);
+	return res;
+}
+
 int remove_path(const char *name)
 {
 	char *slash;
@@ -3148,7 +3162,7 @@ void write_untracked_extension(struct strbuf *out, struct untracked_cache *untra
 	int varint_len;
 	const unsigned hashsz = the_hash_algo->rawsz;
 
-	ouc = xcalloc(1, sizeof(*ouc));
+	CALLOC_ARRAY(ouc, 1);
 	stat_data_to_disk(&ouc->info_exclude_stat, &untracked->ss_info_exclude.stat);
 	stat_data_to_disk(&ouc->excludes_file_stat, &untracked->ss_excludes_file.stat);
 	ouc->dir_flags = htonl(untracked->dir_flags);
@@ -3359,7 +3373,7 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
 	if (next + exclude_per_dir_offset + 1 > end)
 		return NULL;
 
-	uc = xcalloc(1, sizeof(*uc));
+	CALLOC_ARRAY(uc, 1);
 	strbuf_init(&uc->ident, ident_len);
 	strbuf_add(&uc->ident, ident, ident_len);
 	load_oid_stat(&uc->ss_info_exclude,
diff --git a/dir.h b/dir.h
index a3c40de..facfae4 100644
--- a/dir.h
+++ b/dir.h
@@ -448,6 +448,8 @@ int is_empty_dir(const char *dir);
 
 void setup_standard_excludes(struct dir_struct *dir);
 
+char *get_sparse_checkout_filename(void);
+int get_sparse_checkout_patterns(struct pattern_list *pl);
 
 /* Constants for remove_dir_recursively: */
 
diff --git a/entry.c b/entry.c
index a0532f1..7b9f437 100644
--- a/entry.c
+++ b/entry.c
@@ -282,7 +282,7 @@ static int write_entry(struct cache_entry *ce,
 		new_blob = read_blob_entry(ce, &size);
 		if (!new_blob)
 			return error("unable to read sha1 file of %s (%s)",
-				     path, oid_to_hex(&ce->oid));
+				     ce->name, oid_to_hex(&ce->oid));
 
 		/*
 		 * We can't make a real symlink; write out a regular file entry
@@ -309,7 +309,7 @@ static int write_entry(struct cache_entry *ce,
 			new_blob = read_blob_entry(ce, &size);
 			if (!new_blob)
 				return error("unable to read sha1 file of %s (%s)",
-					     path, oid_to_hex(&ce->oid));
+					     ce->name, oid_to_hex(&ce->oid));
 		}
 
 		/*
@@ -354,7 +354,7 @@ static int write_entry(struct cache_entry *ce,
 
 	case S_IFGITLINK:
 		if (to_tempfile)
-			return error("cannot create temporary submodule %s", path);
+			return error("cannot create temporary submodule %s", ce->name);
 		if (mkdir(path, 0777) < 0)
 			return error("cannot create submodule directory %s", path);
 		sub = submodule_from_ce(ce);
@@ -365,7 +365,7 @@ static int write_entry(struct cache_entry *ce,
 		break;
 
 	default:
-		return error("unknown file mode for %s in index", path);
+		return error("unknown file mode for %s in index", ce->name);
 	}
 
 finish:
diff --git a/environment.c b/environment.c
index bb518c6..2f27008 100644
--- a/environment.c
+++ b/environment.c
@@ -9,6 +9,7 @@
  */
 #include "cache.h"
 #include "branch.h"
+#include "environment.h"
 #include "repository.h"
 #include "config.h"
 #include "refs.h"
@@ -116,6 +117,7 @@ const char * const local_repo_env[] = {
 	ALTERNATE_DB_ENVIRONMENT,
 	CONFIG_ENVIRONMENT,
 	CONFIG_DATA_ENVIRONMENT,
+	CONFIG_COUNT_ENVIRONMENT,
 	DB_ENVIRONMENT,
 	GIT_DIR_ENVIRONMENT,
 	GIT_WORK_TREE_ENVIRONMENT,
@@ -152,11 +154,7 @@ static char *expand_namespace(const char *raw_namespace)
 	return strbuf_detach(&buf, NULL);
 }
 
-/*
- * Wrapper of getenv() that returns a strdup value. This value is kept
- * in argv to be freed later.
- */
-static const char *getenv_safe(struct strvec *argv, const char *name)
+const char *getenv_safe(struct strvec *argv, const char *name)
 {
 	const char *value = getenv(name);
 
diff --git a/environment.h b/environment.h
new file mode 100644
index 0000000..d438b5c
--- /dev/null
+++ b/environment.h
@@ -0,0 +1,12 @@
+#ifndef ENVIRONMENT_H
+#define ENVIRONMENT_H
+
+#include "strvec.h"
+
+/*
+ * Wrapper of getenv() that returns a strdup value. This value is kept
+ * in argv to be freed later.
+ */
+const char *getenv_safe(struct strvec *argv, const char *name);
+
+#endif
diff --git a/ewah/bitmap.c b/ewah/bitmap.c
index d8cec58..38a47c4 100644
--- a/ewah/bitmap.c
+++ b/ewah/bitmap.c
@@ -25,7 +25,7 @@
 struct bitmap *bitmap_word_alloc(size_t word_alloc)
 {
 	struct bitmap *bitmap = xmalloc(sizeof(struct bitmap));
-	bitmap->words = xcalloc(word_alloc, sizeof(eword_t));
+	CALLOC_ARRAY(bitmap->words, word_alloc);
 	bitmap->word_alloc = word_alloc;
 	return bitmap;
 }
@@ -35,18 +35,26 @@ struct bitmap *bitmap_new(void)
 	return bitmap_word_alloc(32);
 }
 
+struct bitmap *bitmap_dup(const struct bitmap *src)
+{
+	struct bitmap *dst = bitmap_word_alloc(src->word_alloc);
+	COPY_ARRAY(dst->words, src->words, src->word_alloc);
+	return dst;
+}
+
+static void bitmap_grow(struct bitmap *self, size_t word_alloc)
+{
+	size_t old_size = self->word_alloc;
+	ALLOC_GROW(self->words, word_alloc, self->word_alloc);
+	memset(self->words + old_size, 0x0,
+	       (self->word_alloc - old_size) * sizeof(eword_t));
+}
+
 void bitmap_set(struct bitmap *self, size_t pos)
 {
 	size_t block = EWAH_BLOCK(pos);
 
-	if (block >= self->word_alloc) {
-		size_t old_size = self->word_alloc;
-		self->word_alloc = block ? block * 2 : 1;
-		REALLOC_ARRAY(self->words, self->word_alloc);
-		memset(self->words + old_size, 0x0,
-			(self->word_alloc - old_size) * sizeof(eword_t));
-	}
-
+	bitmap_grow(self, block + 1);
 	self->words[block] |= EWAH_MASK(pos);
 }
 
@@ -121,6 +129,15 @@ void bitmap_and_not(struct bitmap *self, struct bitmap *other)
 		self->words[i] &= ~other->words[i];
 }
 
+void bitmap_or(struct bitmap *self, const struct bitmap *other)
+{
+	size_t i;
+
+	bitmap_grow(self, other->word_alloc);
+	for (i = 0; i < other->word_alloc; i++)
+		self->words[i] |= other->words[i];
+}
+
 void bitmap_or_ewah(struct bitmap *self, struct ewah_bitmap *other)
 {
 	size_t original_size = self->word_alloc;
@@ -178,6 +195,27 @@ int bitmap_equals(struct bitmap *self, struct bitmap *other)
 	return 1;
 }
 
+int bitmap_is_subset(struct bitmap *self, struct bitmap *other)
+{
+	size_t common_size, i;
+
+	if (self->word_alloc < other->word_alloc)
+		common_size = self->word_alloc;
+	else {
+		common_size = other->word_alloc;
+		for (i = common_size; i < self->word_alloc; i++) {
+			if (self->words[i])
+				return 1;
+		}
+	}
+
+	for (i = 0; i < common_size; i++) {
+		if (self->words[i] & ~other->words[i])
+			return 1;
+	}
+	return 0;
+}
+
 void bitmap_reset(struct bitmap *bitmap)
 {
 	memset(bitmap->words, 0x0, bitmap->word_alloc * sizeof(eword_t));
diff --git a/ewah/ewah_bitmap.c b/ewah/ewah_bitmap.c
index d59b1af..2a8c7c5 100644
--- a/ewah/ewah_bitmap.c
+++ b/ewah/ewah_bitmap.c
@@ -19,6 +19,7 @@
 #include "git-compat-util.h"
 #include "ewok.h"
 #include "ewok_rlw.h"
+#include "cache.h"
 
 static inline size_t min_size(size_t a, size_t b)
 {
@@ -33,20 +34,13 @@ static inline size_t max_size(size_t a, size_t b)
 static inline void buffer_grow(struct ewah_bitmap *self, size_t new_size)
 {
 	size_t rlw_offset = (uint8_t *)self->rlw - (uint8_t *)self->buffer;
-
-	if (self->alloc_size >= new_size)
-		return;
-
-	self->alloc_size = new_size;
-	REALLOC_ARRAY(self->buffer, self->alloc_size);
+	ALLOC_GROW(self->buffer, new_size, self->alloc_size);
 	self->rlw = self->buffer + (rlw_offset / sizeof(eword_t));
 }
 
 static inline void buffer_push(struct ewah_bitmap *self, eword_t value)
 {
-	if (self->buffer_size + 1 >= self->alloc_size)
-		buffer_grow(self, self->buffer_size * 3 / 2);
-
+	buffer_grow(self, self->buffer_size + 1);
 	self->buffer[self->buffer_size++] = value;
 }
 
@@ -137,8 +131,7 @@ void ewah_add_dirty_words(
 
 		rlw_set_literal_words(self->rlw, literals + can_add);
 
-		if (self->buffer_size + can_add >= self->alloc_size)
-			buffer_grow(self, (self->buffer_size + can_add) * 3 / 2);
+		buffer_grow(self, self->buffer_size + can_add);
 
 		if (negate) {
 			size_t i;
diff --git a/ewah/ewok.h b/ewah/ewok.h
index 011852b..6692096 100644
--- a/ewah/ewok.h
+++ b/ewah/ewok.h
@@ -173,13 +173,14 @@ struct bitmap {
 
 struct bitmap *bitmap_new(void);
 struct bitmap *bitmap_word_alloc(size_t word_alloc);
+struct bitmap *bitmap_dup(const struct bitmap *src);
 void bitmap_set(struct bitmap *self, size_t pos);
 void bitmap_unset(struct bitmap *self, size_t pos);
 int bitmap_get(struct bitmap *self, size_t pos);
 void bitmap_reset(struct bitmap *self);
 void bitmap_free(struct bitmap *self);
 int bitmap_equals(struct bitmap *self, struct bitmap *other);
-int bitmap_is_subset(struct bitmap *self, struct bitmap *super);
+int bitmap_is_subset(struct bitmap *self, struct bitmap *other);
 
 struct ewah_bitmap * bitmap_to_ewah(struct bitmap *bitmap);
 struct bitmap *ewah_to_bitmap(struct ewah_bitmap *ewah);
diff --git a/fetch-pack.c b/fetch-pack.c
index 876f90c..fb04a76 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -772,13 +772,11 @@ static int sideband_demux(int in, int out, void *data)
 	return ret;
 }
 
-static void write_promisor_file(const char *keep_name,
-				struct ref **sought, int nr_sought)
+static void create_promisor_file(const char *keep_name,
+				 struct ref **sought, int nr_sought)
 {
 	struct strbuf promisor_name = STRBUF_INIT;
 	int suffix_stripped;
-	FILE *output;
-	int i;
 
 	strbuf_addstr(&promisor_name, keep_name);
 	suffix_stripped = strbuf_strip_suffix(&promisor_name, ".keep");
@@ -787,23 +785,41 @@ static void write_promisor_file(const char *keep_name,
 		    keep_name);
 	strbuf_addstr(&promisor_name, ".promisor");
 
-	output = xfopen(promisor_name.buf, "w");
-	for (i = 0; i < nr_sought; i++)
-		fprintf(output, "%s %s\n", oid_to_hex(&sought[i]->old_oid),
-			sought[i]->name);
-	fclose(output);
+	write_promisor_file(promisor_name.buf, sought, nr_sought);
 
 	strbuf_release(&promisor_name);
 }
 
+static void parse_gitmodules_oids(int fd, struct oidset *gitmodules_oids)
+{
+	int len = the_hash_algo->hexsz + 1; /* hash + NL */
+
+	do {
+		char hex_hash[GIT_MAX_HEXSZ + 1];
+		int read_len = read_in_full(fd, hex_hash, len);
+		struct object_id oid;
+		const char *end;
+
+		if (!read_len)
+			return;
+		if (read_len != len)
+			die("invalid length read %d", read_len);
+		if (parse_oid_hex(hex_hash, &oid, &end) || *end != '\n')
+			die("invalid hash");
+		oidset_insert(gitmodules_oids, &oid);
+	} while (1);
+}
+
 /*
- * Pass 1 as "only_packfile" if the pack received is the only pack in this
- * fetch request (that is, if there were no packfile URIs provided).
+ * If packfile URIs were provided, pass a non-NULL pointer to index_pack_args.
+ * The strings to pass as the --index-pack-arg arguments to http-fetch will be
+ * stored there. (It must be freed by the caller.)
  */
 static int get_pack(struct fetch_pack_args *args,
 		    int xd[2], struct string_list *pack_lockfiles,
-		    int only_packfile,
-		    struct ref **sought, int nr_sought)
+		    struct strvec *index_pack_args,
+		    struct ref **sought, int nr_sought,
+		    struct oidset *gitmodules_oids)
 {
 	struct async demux;
 	int do_keep = args->keep_pack;
@@ -811,6 +827,7 @@ static int get_pack(struct fetch_pack_args *args,
 	struct pack_header header;
 	int pass_header = 0;
 	struct child_process cmd = CHILD_PROCESS_INIT;
+	int fsck_objects = 0;
 	int ret;
 
 	memset(&demux, 0, sizeof(demux));
@@ -829,7 +846,7 @@ static int get_pack(struct fetch_pack_args *args,
 	else
 		demux.out = xd[0];
 
-	if (!args->keep_pack && unpack_limit) {
+	if (!args->keep_pack && unpack_limit && !index_pack_args) {
 
 		if (read_pack_header(demux.out, &header))
 			die(_("protocol error: bad pack header"));
@@ -845,8 +862,15 @@ static int get_pack(struct fetch_pack_args *args,
 		strvec_push(&cmd.args, alternate_shallow_file);
 	}
 
-	if (do_keep || args->from_promisor) {
-		if (pack_lockfiles)
+	if (fetch_fsck_objects >= 0
+	    ? fetch_fsck_objects
+	    : transfer_fsck_objects >= 0
+	    ? transfer_fsck_objects
+	    : 0)
+		fsck_objects = 1;
+
+	if (do_keep || args->from_promisor || index_pack_args || fsck_objects) {
+		if (pack_lockfiles || fsck_objects)
 			cmd.out = -1;
 		cmd_name = "index-pack";
 		strvec_push(&cmd.args, cmd_name);
@@ -855,7 +879,7 @@ static int get_pack(struct fetch_pack_args *args,
 			strvec_push(&cmd.args, "-v");
 		if (args->use_thin_pack)
 			strvec_push(&cmd.args, "--fix-thin");
-		if (do_keep && (args->lock_pack || unpack_limit)) {
+		if ((do_keep || index_pack_args) && (args->lock_pack || unpack_limit)) {
 			char hostname[HOST_NAME_MAX + 1];
 			if (xgethostname(hostname, sizeof(hostname)))
 				xsnprintf(hostname, sizeof(hostname), "localhost");
@@ -863,7 +887,7 @@ static int get_pack(struct fetch_pack_args *args,
 				     "--keep=fetch-pack %"PRIuMAX " on %s",
 				     (uintmax_t)getpid(), hostname);
 		}
-		if (only_packfile && args->check_self_contained_and_connected)
+		if (!index_pack_args && args->check_self_contained_and_connected)
 			strvec_push(&cmd.args, "--check-self-contained-and-connected");
 		else
 			/*
@@ -875,7 +899,7 @@ static int get_pack(struct fetch_pack_args *args,
 
 		if (args->from_promisor)
 			/*
-			 * write_promisor_file() may be called afterwards but
+			 * create_promisor_file() may be called afterwards but
 			 * we still need index-pack to know that this is a
 			 * promisor pack. For example, if transfer.fsckobjects
 			 * is true, index-pack needs to know that .gitmodules
@@ -896,12 +920,8 @@ static int get_pack(struct fetch_pack_args *args,
 		strvec_pushf(&cmd.args, "--pack_header=%"PRIu32",%"PRIu32,
 			     ntohl(header.hdr_version),
 				 ntohl(header.hdr_entries));
-	if (fetch_fsck_objects >= 0
-	    ? fetch_fsck_objects
-	    : transfer_fsck_objects >= 0
-	    ? transfer_fsck_objects
-	    : 0) {
-		if (args->from_promisor || !only_packfile)
+	if (fsck_objects) {
+		if (args->from_promisor || index_pack_args)
 			/*
 			 * We cannot use --strict in index-pack because it
 			 * checks both broken objects and links, but we only
@@ -913,14 +933,26 @@ static int get_pack(struct fetch_pack_args *args,
 				     fsck_msg_types.buf);
 	}
 
+	if (index_pack_args) {
+		int i;
+
+		for (i = 0; i < cmd.args.nr; i++)
+			strvec_push(index_pack_args, cmd.args.v[i]);
+	}
+
 	cmd.in = demux.out;
 	cmd.git_cmd = 1;
 	if (start_command(&cmd))
 		die(_("fetch-pack: unable to fork off %s"), cmd_name);
-	if (do_keep && pack_lockfiles) {
-		char *pack_lockfile = index_pack_lockfile(cmd.out);
+	if (do_keep && (pack_lockfiles || fsck_objects)) {
+		int is_well_formed;
+		char *pack_lockfile = index_pack_lockfile(cmd.out, &is_well_formed);
+
+		if (!is_well_formed)
+			die(_("fetch-pack: invalid index-pack output"));
 		if (pack_lockfile)
 			string_list_append_nodup(pack_lockfiles, pack_lockfile);
+		parse_gitmodules_oids(cmd.out, gitmodules_oids);
 		close(cmd.out);
 	}
 
@@ -943,7 +975,7 @@ static int get_pack(struct fetch_pack_args *args,
 	 * obtained .keep filename if necessary
 	 */
 	if (do_keep && pack_lockfiles && pack_lockfiles->nr && args->from_promisor)
-		write_promisor_file(pack_lockfiles->items[0].string, sought, nr_sought);
+		create_promisor_file(pack_lockfiles->items[0].string, sought, nr_sought);
 
 	return 0;
 }
@@ -955,6 +987,22 @@ static int cmp_ref_by_name(const void *a_, const void *b_)
 	return strcmp(a->name, b->name);
 }
 
+static void fsck_gitmodules_oids(struct oidset *gitmodules_oids)
+{
+	struct oidset_iter iter;
+	const struct object_id *oid;
+	struct fsck_options fo = FSCK_OPTIONS_STRICT;
+
+	if (!oidset_size(gitmodules_oids))
+		return;
+
+	oidset_iter_init(gitmodules_oids, &iter);
+	while ((oid = oidset_iter_next(&iter)))
+		register_found_gitmodules(oid);
+	if (fsck_finish(&fo))
+		die("fsck failed");
+}
+
 static struct ref *do_fetch_pack(struct fetch_pack_args *args,
 				 int fd[2],
 				 const struct ref *orig_ref,
@@ -969,6 +1017,7 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
 	int agent_len;
 	struct fetch_negotiator negotiator_alloc;
 	struct fetch_negotiator *negotiator;
+	struct oidset gitmodules_oids = OIDSET_INIT;
 
 	negotiator = &negotiator_alloc;
 	fetch_negotiator_init(r, negotiator);
@@ -1084,8 +1133,10 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
 		alternate_shallow_file = setup_temporary_shallow(si->shallow);
 	else
 		alternate_shallow_file = NULL;
-	if (get_pack(args, fd, pack_lockfiles, 1, sought, nr_sought))
+	if (get_pack(args, fd, pack_lockfiles, NULL, sought, nr_sought,
+		     &gitmodules_oids))
 		die(_("git fetch-pack: fetch failed."));
+	fsck_gitmodules_oids(&gitmodules_oids);
 
  all_done:
 	if (negotiator)
@@ -1535,6 +1586,8 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
 	int seen_ack = 0;
 	struct string_list packfile_uris = STRING_LIST_INIT_DUP;
 	int i;
+	struct strvec index_pack_args = STRVEC_INIT;
+	struct oidset gitmodules_oids = OIDSET_INIT;
 
 	negotiator = &negotiator_alloc;
 	fetch_negotiator_init(r, negotiator);
@@ -1624,7 +1677,8 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
 				receive_packfile_uris(&reader, &packfile_uris);
 			process_section_header(&reader, "packfile", 0);
 			if (get_pack(args, fd, pack_lockfiles,
-				     !packfile_uris.nr, sought, nr_sought))
+				     packfile_uris.nr ? &index_pack_args : NULL,
+				     sought, nr_sought, &gitmodules_oids))
 				die(_("git fetch-pack: fetch failed."));
 			do_check_stateless_delimiter(args, &reader);
 
@@ -1636,6 +1690,7 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
 	}
 
 	for (i = 0; i < packfile_uris.nr; i++) {
+		int j;
 		struct child_process cmd = CHILD_PROCESS_INIT;
 		char packname[GIT_MAX_HEXSZ + 1];
 		const char *uri = packfile_uris.items[i].string +
@@ -1645,6 +1700,9 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
 		strvec_pushf(&cmd.args, "--packfile=%.*s",
 			     (int) the_hash_algo->hexsz,
 			     packfile_uris.items[i].string);
+		for (j = 0; j < index_pack_args.nr; j++)
+			strvec_pushf(&cmd.args, "--index-pack-arg=%s",
+				     index_pack_args.v[j]);
 		strvec_push(&cmd.args, uri);
 		cmd.git_cmd = 1;
 		cmd.no_stdin = 1;
@@ -1663,6 +1721,8 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
 
 		packname[the_hash_algo->hexsz] = '\0';
 
+		parse_gitmodules_oids(cmd.out, &gitmodules_oids);
+
 		close(cmd.out);
 
 		if (finish_command(&cmd))
@@ -1680,6 +1740,9 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
 						 packname));
 	}
 	string_list_clear(&packfile_uris, 0);
+	strvec_clear(&index_pack_args);
+
+	fsck_gitmodules_oids(&gitmodules_oids);
 
 	if (negotiator)
 		negotiator->release(negotiator);
@@ -1853,7 +1916,7 @@ static void update_shallow(struct fetch_pack_args *args,
 	 * remote is also shallow, check what ref is safe to update
 	 * without updating .git/shallow
 	 */
-	status = xcalloc(nr_sought, sizeof(*status));
+	CALLOC_ARRAY(status, nr_sought);
 	assign_shallow_commits_to_refs(si, NULL, status);
 	if (si->nr_ours || si->nr_theirs) {
 		for (i = 0; i < nr_sought; i++)
diff --git a/fmt-merge-msg.c b/fmt-merge-msg.c
index 9a664a4..0f66818 100644
--- a/fmt-merge-msg.c
+++ b/fmt-merge-msg.c
@@ -2,6 +2,7 @@
 #include "refs.h"
 #include "object-store.h"
 #include "diff.h"
+#include "diff-merges.h"
 #include "revision.h"
 #include "tag.h"
 #include "string-list.h"
@@ -129,7 +130,7 @@ static int handle_line(char *line, struct merge_parents *merge_parents)
 	if (!find_merge_parent(merge_parents, &oid, NULL))
 		return 0; /* subsumed by other parents */
 
-	origin_data = xcalloc(1, sizeof(struct origin_data));
+	CALLOC_ARRAY(origin_data, 1);
 	oidcpy(&origin_data->oid, &oid);
 
 	if (line[len - 1] == '\n')
@@ -509,22 +510,28 @@ static void fmt_merge_msg_sigs(struct strbuf *out)
 	for (i = 0; i < origins.nr; i++) {
 		struct object_id *oid = origins.items[i].util;
 		enum object_type type;
-		unsigned long size, len;
+		unsigned long size;
 		char *buf = read_object_file(oid, &type, &size);
+		char *origbuf = buf;
+		unsigned long len = size;
 		struct signature_check sigc = { NULL };
-		struct strbuf sig = STRBUF_INIT;
+		struct strbuf payload = STRBUF_INIT, sig = STRBUF_INIT;
 
 		if (!buf || type != OBJ_TAG)
 			goto next;
-		len = parse_signature(buf, size);
 
-		if (size == len)
-			; /* merely annotated */
-		else if (check_signature(buf, len, buf + len, size - len, &sigc) &&
-			!sigc.gpg_output)
-			strbuf_addstr(&sig, "gpg verification failed.\n");
-		else
-			strbuf_addstr(&sig, sigc.gpg_output);
+		if (!parse_signature(buf, size, &payload, &sig))
+			;/* merely annotated */
+		else {
+			buf = payload.buf;
+			len = payload.len;
+			if (check_signature(payload.buf, payload.len, sig.buf,
+					 sig.len, &sigc) &&
+				!sigc.gpg_output)
+				strbuf_addstr(&sig, "gpg verification failed.\n");
+			else
+				strbuf_addstr(&sig, sigc.gpg_output);
+		}
 		signature_check_clear(&sigc);
 
 		if (!tag_number++) {
@@ -547,9 +554,10 @@ static void fmt_merge_msg_sigs(struct strbuf *out)
 					strlen(origins.items[i].string));
 			fmt_tag_signature(&tagbuf, &sig, buf, len);
 		}
+		strbuf_release(&payload);
 		strbuf_release(&sig);
 	next:
-		free(buf);
+		free(origbuf);
 	}
 	if (tagbuf.len) {
 		strbuf_addch(out, '\n');
@@ -670,7 +678,7 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
 		head = lookup_commit_or_die(&head_oid, "HEAD");
 		repo_init_revisions(the_repository, &rev, NULL);
 		rev.commit_format = CMIT_FMT_ONELINE;
-		rev.ignore_merges = 1;
+		diff_merges_suppress(&rev);
 		rev.limited = 1;
 
 		strbuf_complete_line(out);
diff --git a/fsck.c b/fsck.c
index 5e282b3..e3030f3 100644
--- a/fsck.c
+++ b/fsck.c
@@ -80,7 +80,9 @@ static struct oidset gitmodules_done = OIDSET_INIT;
 	/* infos (reported as warnings, but ignored by default) */ \
 	FUNC(GITMODULES_PARSE, INFO) \
 	FUNC(BAD_TAG_NAME, INFO) \
-	FUNC(MISSING_TAGGER_ENTRY, INFO)
+	FUNC(MISSING_TAGGER_ENTRY, INFO) \
+	/* ignored (elevated when requested) */ \
+	FUNC(EXTRA_HEADER_ENTRY, IGNORE)
 
 #define MSG_ID(id, msg_type) FSCK_MSG_##id,
 enum fsck_msg_id {
@@ -461,6 +463,11 @@ static int fsck_walk_commit(struct commit *commit, void *data, struct fsck_optio
 				generation += power * (name[--len] - '0');
 			if (power > 1 && len && name[len - 1] == '~')
 				name_prefix_len = len - 1;
+			else {
+				/* Maybe a non-first parent, e.g. HEAD^2 */
+				generation = 0;
+				name_prefix_len = len;
+			}
 		}
 	}
 
@@ -911,6 +918,16 @@ static int fsck_tag(const struct object_id *oid, const char *buffer,
 		    unsigned long size, struct fsck_options *options)
 {
 	struct object_id tagged_oid;
+	int tagged_type;
+	return fsck_tag_standalone(oid, buffer, size, options, &tagged_oid,
+				   &tagged_type);
+}
+
+int fsck_tag_standalone(const struct object_id *oid, const char *buffer,
+			unsigned long size, struct fsck_options *options,
+			struct object_id *tagged_oid,
+			int *tagged_type)
+{
 	int ret = 0;
 	char *eol;
 	struct strbuf sb = STRBUF_INIT;
@@ -924,7 +941,7 @@ static int fsck_tag(const struct object_id *oid, const char *buffer,
 		ret = report(options, oid, OBJ_TAG, FSCK_MSG_MISSING_OBJECT, "invalid format - expected 'object' line");
 		goto done;
 	}
-	if (parse_oid_hex(buffer, &tagged_oid, &p) || *p != '\n') {
+	if (parse_oid_hex(buffer, tagged_oid, &p) || *p != '\n') {
 		ret = report(options, oid, OBJ_TAG, FSCK_MSG_BAD_OBJECT_SHA1, "invalid 'object' line format - bad sha1");
 		if (ret)
 			goto done;
@@ -940,7 +957,8 @@ static int fsck_tag(const struct object_id *oid, const char *buffer,
 		ret = report(options, oid, OBJ_TAG, FSCK_MSG_MISSING_TYPE, "invalid format - unexpected end after 'type' line");
 		goto done;
 	}
-	if (type_from_string_gently(buffer, eol - buffer, 1) < 0)
+	*tagged_type = type_from_string_gently(buffer, eol - buffer, 1);
+	if (*tagged_type < 0)
 		ret = report(options, oid, OBJ_TAG, FSCK_MSG_BAD_TYPE, "invalid 'type' value");
 	if (ret)
 		goto done;
@@ -974,6 +992,21 @@ static int fsck_tag(const struct object_id *oid, const char *buffer,
 	}
 	else
 		ret = fsck_ident(&buffer, oid, OBJ_TAG, options);
+	if (!*buffer)
+		goto done;
+
+	if (!starts_with(buffer, "\n")) {
+		/*
+		 * The verify_headers() check will allow
+		 * e.g. "[...]tagger <tagger>\nsome
+		 * garbage\n\nmessage" to pass, thinking "some
+		 * garbage" could be a custom header. E.g. "mktag"
+		 * doesn't want any unknown headers.
+		 */
+		ret = report(options, oid, OBJ_TAG, FSCK_MSG_EXTRA_HEADER_ENTRY, "invalid format - extra header(s) after 'tagger'");
+		if (ret)
+			goto done;
+	}
 
 done:
 	strbuf_release(&sb);
@@ -1243,6 +1276,11 @@ int fsck_error_function(struct fsck_options *o,
 	return 1;
 }
 
+void register_found_gitmodules(const struct object_id *oid)
+{
+	oidset_insert(&gitmodules_found, oid);
+}
+
 int fsck_finish(struct fsck_options *options)
 {
 	int ret = 0;
@@ -1284,3 +1322,27 @@ int fsck_finish(struct fsck_options *options)
 	oidset_clear(&gitmodules_done);
 	return ret;
 }
+
+int fsck_config_internal(const char *var, const char *value, void *cb,
+			 struct fsck_options *options)
+{
+	if (strcmp(var, "fsck.skiplist") == 0) {
+		const char *path;
+		struct strbuf sb = STRBUF_INIT;
+
+		if (git_config_pathname(&path, var, value))
+			return 1;
+		strbuf_addf(&sb, "skiplist=%s", path);
+		free((char *)path);
+		fsck_set_msg_types(options, sb.buf);
+		strbuf_release(&sb);
+		return 0;
+	}
+
+	if (skip_prefix(var, "fsck.", &var)) {
+		fsck_set_msg_type(options, var, value);
+		return 0;
+	}
+
+	return git_default_config(var, value, cb);
+}
diff --git a/fsck.h b/fsck.h
index 69cf715..733378f 100644
--- a/fsck.h
+++ b/fsck.h
@@ -62,6 +62,17 @@ int fsck_walk(struct object *obj, void *data, struct fsck_options *options);
 int fsck_object(struct object *obj, void *data, unsigned long size,
 	struct fsck_options *options);
 
+void register_found_gitmodules(const struct object_id *oid);
+
+/*
+ * fsck a tag, and pass info about it back to the caller. This is
+ * exposed fsck_object() internals for git-mktag(1).
+ */
+int fsck_tag_standalone(const struct object_id *oid, const char *buffer,
+			unsigned long size, struct fsck_options *options,
+			struct object_id *tagged_oid,
+			int *tag_type);
+
 /*
  * Some fsck checks are context-dependent, and may end up queued; run this
  * after completing all fsck_object() calls in order to resolve any remaining
@@ -94,4 +105,11 @@ void fsck_put_object_name(struct fsck_options *options,
 const char *fsck_describe_object(struct fsck_options *options,
 				 const struct object_id *oid);
 
+/*
+ * git_config() callback for use by fsck-y tools that want to support
+ * fsck.<msg> fsck.skipList etc.
+ */
+int fsck_config_internal(const char *var, const char *value, void *cb,
+			 struct fsck_options *options);
+
 #endif
diff --git a/fsmonitor.c b/fsmonitor.c
index ca031c3..ab9bfc6 100644
--- a/fsmonitor.c
+++ b/fsmonitor.c
@@ -13,14 +13,19 @@
 
 struct trace_key trace_fsmonitor = TRACE_KEY_INIT(FSMONITOR);
 
+static void assert_index_minimum(struct index_state *istate, size_t pos)
+{
+	if (pos > istate->cache_nr)
+		BUG("fsmonitor_dirty has more entries than the index (%"PRIuMAX" > %u)",
+		    (uintmax_t)pos, istate->cache_nr);
+}
+
 static void fsmonitor_ewah_callback(size_t pos, void *is)
 {
 	struct index_state *istate = (struct index_state *)is;
 	struct cache_entry *ce;
 
-	if (pos >= istate->cache_nr)
-		BUG("fsmonitor_dirty has more entries than the index (%"PRIuMAX" >= %u)",
-		    (uintmax_t)pos, istate->cache_nr);
+	assert_index_minimum(istate, pos + 1);
 
 	ce = istate->cache[pos];
 	ce->ce_flags &= ~CE_FSMONITOR_VALID;
@@ -82,12 +87,14 @@ int read_fsmonitor_extension(struct index_state *istate, const void *data,
 	}
 	istate->fsmonitor_dirty = fsmonitor_dirty;
 
-	if (!istate->split_index &&
-	    istate->fsmonitor_dirty->bit_size > istate->cache_nr)
-		BUG("fsmonitor_dirty has more entries than the index (%"PRIuMAX" > %u)",
-		    (uintmax_t)istate->fsmonitor_dirty->bit_size, istate->cache_nr);
+	if (!istate->split_index)
+		assert_index_minimum(istate, istate->fsmonitor_dirty->bit_size);
 
-	trace_printf_key(&trace_fsmonitor, "read fsmonitor extension successful");
+	trace2_data_string("index", NULL, "extension/fsmn/read/token",
+			   istate->fsmonitor_last_update);
+	trace_printf_key(&trace_fsmonitor,
+			 "read fsmonitor extension successful '%s'",
+			 istate->fsmonitor_last_update);
 	return 0;
 }
 
@@ -110,10 +117,8 @@ void write_fsmonitor_extension(struct strbuf *sb, struct index_state *istate)
 	uint32_t ewah_size = 0;
 	int fixup = 0;
 
-	if (!istate->split_index &&
-	    istate->fsmonitor_dirty->bit_size > istate->cache_nr)
-		BUG("fsmonitor_dirty has more entries than the index (%"PRIuMAX" > %u)",
-		    (uintmax_t)istate->fsmonitor_dirty->bit_size, istate->cache_nr);
+	if (!istate->split_index)
+		assert_index_minimum(istate, istate->fsmonitor_dirty->bit_size);
 
 	put_be32(&hdr_version, INDEX_EXTENSION_VERSION2);
 	strbuf_add(sb, &hdr_version, sizeof(uint32_t));
@@ -133,7 +138,11 @@ void write_fsmonitor_extension(struct strbuf *sb, struct index_state *istate)
 	put_be32(&ewah_size, sb->len - ewah_start);
 	memcpy(sb->buf + fixup, &ewah_size, sizeof(uint32_t));
 
-	trace_printf_key(&trace_fsmonitor, "write fsmonitor extension successful");
+	trace2_data_string("index", NULL, "extension/fsmn/write/token",
+			   istate->fsmonitor_last_update);
+	trace_printf_key(&trace_fsmonitor,
+			 "write fsmonitor extension successful '%s'",
+			 istate->fsmonitor_last_update);
 }
 
 /*
@@ -142,6 +151,7 @@ void write_fsmonitor_extension(struct strbuf *sb, struct index_state *istate)
 static int query_fsmonitor(int version, const char *last_update, struct strbuf *query_result)
 {
 	struct child_process cp = CHILD_PROCESS_INIT;
+	int result;
 
 	if (!core_fsmonitor)
 		return -1;
@@ -152,16 +162,63 @@ static int query_fsmonitor(int version, const char *last_update, struct strbuf *
 	cp.use_shell = 1;
 	cp.dir = get_git_work_tree();
 
-	return capture_command(&cp, query_result, 1024);
+	trace2_region_enter("fsm_hook", "query", NULL);
+
+	result = capture_command(&cp, query_result, 1024);
+
+	if (result)
+		trace2_data_intmax("fsm_hook", NULL, "query/failed", result);
+	else {
+		trace2_data_intmax("fsm_hook", NULL, "query/response-length",
+				   query_result->len);
+
+		if (fsmonitor_is_trivial_response(query_result))
+			trace2_data_intmax("fsm_hook", NULL,
+					   "query/trivial-response", 1);
+	}
+
+	trace2_region_leave("fsm_hook", "query", NULL);
+
+	return result;
 }
 
-static void fsmonitor_refresh_callback(struct index_state *istate, const char *name)
+int fsmonitor_is_trivial_response(const struct strbuf *query_result)
 {
-	int pos = index_name_pos(istate, name, strlen(name));
+	static char trivial_response[3] = { '\0', '/', '\0' };
 
-	if (pos >= 0) {
-		struct cache_entry *ce = istate->cache[pos];
-		ce->ce_flags &= ~CE_FSMONITOR_VALID;
+	return query_result->len >= 3 &&
+		!memcmp(trivial_response,
+			&query_result->buf[query_result->len - 3], 3);
+}
+
+static void fsmonitor_refresh_callback(struct index_state *istate, char *name)
+{
+	int i, len = strlen(name);
+	if (name[len - 1] == '/') {
+
+		/*
+		 * TODO We should binary search to find the first path with
+		 * TODO this directory prefix.  Then linearly update entries
+		 * TODO while the prefix matches.  Taking care to search without
+		 * TODO the trailing slash -- because '/' sorts after a few
+		 * TODO interesting special chars, like '.' and ' '.
+		 */
+
+		/* Mark all entries for the folder invalid */
+		for (i = 0; i < istate->cache_nr; i++) {
+			if (istate->cache[i]->ce_flags & CE_FSMONITOR_VALID &&
+			    starts_with(istate->cache[i]->name, name))
+				istate->cache[i]->ce_flags &= ~CE_FSMONITOR_VALID;
+		}
+		/* Need to remove the / from the path for the untracked cache */
+		name[len - 1] = '\0';
+	} else {
+		int pos = index_name_pos(istate, name, strlen(name));
+
+		if (pos >= 0) {
+			struct cache_entry *ce = istate->cache[pos];
+			ce->ce_flags &= ~CE_FSMONITOR_VALID;
+		}
 	}
 
 	/*
@@ -287,16 +344,45 @@ void refresh_fsmonitor(struct index_state *istate)
 	istate->fsmonitor_last_update = strbuf_detach(&last_update_token, NULL);
 }
 
+/*
+ * The caller wants to turn on FSMonitor.  And when the caller writes
+ * the index to disk, a FSMonitor extension should be included.  This
+ * requires that `istate->fsmonitor_last_update` not be NULL.  But we
+ * have not actually talked to a FSMonitor process yet, so we don't
+ * have an initial value for this field.
+ *
+ * For a protocol V1 FSMonitor process, this field is a formatted
+ * "nanoseconds since epoch" field.  However, for a protocol V2
+ * FSMonitor process, this field is an opaque token.
+ *
+ * Historically, `add_fsmonitor()` has initialized this field to the
+ * current time for protocol V1 processes.  There are lots of race
+ * conditions here, but that code has shipped...
+ *
+ * The only true solution is to use a V2 FSMonitor and get a current
+ * or default token value (that it understands), but we cannot do that
+ * until we have actually talked to an instance of the FSMonitor process
+ * (but the protocol requires that we send a token first...).
+ *
+ * For simplicity, just initialize like we have a V1 process and require
+ * that V2 processes adapt.
+ */
+static void initialize_fsmonitor_last_update(struct index_state *istate)
+{
+	struct strbuf last_update = STRBUF_INIT;
+
+	strbuf_addf(&last_update, "%"PRIu64"", getnanotime());
+	istate->fsmonitor_last_update = strbuf_detach(&last_update, NULL);
+}
+
 void add_fsmonitor(struct index_state *istate)
 {
 	unsigned int i;
-	struct strbuf last_update = STRBUF_INIT;
 
 	if (!istate->fsmonitor_last_update) {
 		trace_printf_key(&trace_fsmonitor, "add fsmonitor");
 		istate->cache_changed |= FSMONITOR_CHANGED;
-		strbuf_addf(&last_update, "%"PRIu64"", getnanotime());
-		istate->fsmonitor_last_update = strbuf_detach(&last_update, NULL);
+		initialize_fsmonitor_last_update(istate);
 
 		/* reset the fsmonitor state */
 		for (i = 0; i < istate->cache_nr; i++)
@@ -335,9 +421,7 @@ void tweak_fsmonitor(struct index_state *istate)
 			}
 
 			/* Mark all previously saved entries as dirty */
-			if (istate->fsmonitor_dirty->bit_size > istate->cache_nr)
-				BUG("fsmonitor_dirty has more entries than the index (%"PRIuMAX" > %u)",
-				    (uintmax_t)istate->fsmonitor_dirty->bit_size, istate->cache_nr);
+			assert_index_minimum(istate, istate->fsmonitor_dirty->bit_size);
 			ewah_each_bit(istate->fsmonitor_dirty, fsmonitor_ewah_callback, istate);
 
 			refresh_fsmonitor(istate);
diff --git a/fsmonitor.h b/fsmonitor.h
index 739318a..7f1794b 100644
--- a/fsmonitor.h
+++ b/fsmonitor.h
@@ -45,6 +45,11 @@ void tweak_fsmonitor(struct index_state *istate);
 void refresh_fsmonitor(struct index_state *istate);
 
 /*
+ * Does the received result contain the "trivial" response?
+ */
+int fsmonitor_is_trivial_response(const struct strbuf *query_result);
+
+/*
  * Set the given cache entries CE_FSMONITOR_VALID bit. This should be
  * called any time the cache entry has been updated to reflect the
  * current state of the file on disk.
diff --git a/gettext.c b/gettext.c
index 1b56421..af2413b 100644
--- a/gettext.c
+++ b/gettext.c
@@ -65,14 +65,6 @@ const char *get_preferred_languages(void)
 	return NULL;
 }
 
-int use_gettext_poison(void)
-{
-	static int poison_requested = -1;
-	if (poison_requested == -1)
-		poison_requested = git_env_bool("GIT_TEST_GETTEXT_POISON", 0);
-	return poison_requested;
-}
-
 #ifndef NO_GETTEXT
 static int test_vsnprintf(const char *fmt, ...)
 {
@@ -117,8 +109,6 @@ void git_setup_gettext(void)
 	if (!podir)
 		podir = p = system_path(GIT_LOCALE_PATH);
 
-	use_gettext_poison(); /* getenv() reentrancy paranoia */
-
 	if (!is_directory(podir)) {
 		free(p);
 		return;
diff --git a/gettext.h b/gettext.h
index bee52eb..c8b34fd 100644
--- a/gettext.h
+++ b/gettext.h
@@ -28,15 +28,12 @@
 
 #define FORMAT_PRESERVING(n) __attribute__((format_arg(n)))
 
-int use_gettext_poison(void);
-
 #ifndef NO_GETTEXT
 void git_setup_gettext(void);
 int gettext_width(const char *s);
 #else
 static inline void git_setup_gettext(void)
 {
-	use_gettext_poison(); /* getenv() reentrancy paranoia */
 }
 static inline int gettext_width(const char *s)
 {
@@ -48,14 +45,12 @@ static inline FORMAT_PRESERVING(1) const char *_(const char *msgid)
 {
 	if (!*msgid)
 		return "";
-	return use_gettext_poison() ? "# GETTEXT POISON #" : gettext(msgid);
+	return gettext(msgid);
 }
 
 static inline FORMAT_PRESERVING(1) FORMAT_PRESERVING(2)
 const char *Q_(const char *msgid, const char *plu, unsigned long n)
 {
-	if (use_gettext_poison())
-		return "# GETTEXT POISON #";
 	return ngettext(msgid, plu, n);
 }
 
diff --git a/git-bisect.sh b/git-bisect.sh
index 1f3f6e9..6a7afae 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -39,21 +39,6 @@
 TERM_BAD=bad
 TERM_GOOD=good
 
-bisect_skip() {
-	all=''
-	for arg in "$@"
-	do
-		case "$arg" in
-		*..*)
-			revs=$(git rev-list "$arg") || die "$(eval_gettext "Bad rev input: \$arg")" ;;
-		*)
-			revs=$(git rev-parse --sq-quote "$arg") ;;
-		esac
-		all="$all $revs"
-	done
-	eval git bisect--helper --bisect-state 'skip' $all
-}
-
 bisect_visualize() {
 	git bisect--helper --bisect-next-check $TERM_GOOD $TERM_BAD fail || exit
 
@@ -77,38 +62,6 @@
 	eval '"$@"' --bisect -- $(cat "$GIT_DIR/BISECT_NAMES")
 }
 
-bisect_replay () {
-	file="$1"
-	test "$#" -eq 1 || die "$(gettext "No logfile given")"
-	test -r "$file" || die "$(eval_gettext "cannot read \$file for replaying")"
-	git bisect--helper --bisect-reset || exit
-	oIFS="$IFS" IFS="$IFS$(printf '\015')"
-	while read git bisect command rev tail
-	do
-		test "$git $bisect" = "git bisect" || test "$git" = "git-bisect" || continue
-		if test "$git" = "git-bisect"
-		then
-			rev="$command"
-			command="$bisect"
-		fi
-		get_terms
-		git bisect--helper --check-and-set-terms "$command" "$TERM_GOOD" "$TERM_BAD" || exit
-		get_terms
-		case "$command" in
-		start)
-			eval "git bisect--helper --bisect-start $rev $tail" ;;
-		"$TERM_GOOD"|"$TERM_BAD"|skip)
-			git bisect--helper --bisect-write "$command" "$rev" "$TERM_GOOD" "$TERM_BAD" || exit;;
-		terms)
-			git bisect--helper --bisect-terms $rev || exit;;
-		*)
-			die "$(gettext "?? what are you talking about?")" ;;
-		esac
-	done <"$file"
-	IFS="$oIFS"
-	git bisect--helper --bisect-auto-next || exit
-}
-
 bisect_run () {
 	git bisect--helper --bisect-next-check $TERM_GOOD $TERM_BAD fail || exit
 
@@ -169,11 +122,6 @@
 	done
 }
 
-bisect_log () {
-	test -s "$GIT_DIR/BISECT_LOG" || die "$(gettext "We are not bisecting.")"
-	cat "$GIT_DIR/BISECT_LOG"
-}
-
 get_terms () {
 	if test -s "$GIT_DIR/BISECT_TERMS"
 	then
@@ -199,7 +147,7 @@
 	bad|good|new|old|"$TERM_BAD"|"$TERM_GOOD")
 		git bisect--helper --bisect-state "$cmd" "$@" ;;
 	skip)
-		bisect_skip "$@" ;;
+		git bisect--helper --bisect-skip "$@" || exit;;
 	next)
 		# Not sure we want "next" at the UI level anymore.
 		git bisect--helper --bisect-next "$@" || exit ;;
@@ -208,9 +156,9 @@
 	reset)
 		git bisect--helper --bisect-reset "$@" ;;
 	replay)
-		bisect_replay "$@" ;;
+		git bisect--helper --bisect-replay "$@" || exit;;
 	log)
-		bisect_log ;;
+		git bisect--helper --bisect-log || exit ;;
 	run)
 		bisect_run "$@" ;;
 	terms)
diff --git a/git-compat-util.h b/git-compat-util.h
index f505f81..5ed0f00 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -254,9 +254,9 @@ typedef unsigned long uintptr_t;
 #ifdef PRECOMPOSE_UNICODE
 #include "compat/precompose_utf8.h"
 #else
-static inline void precompose_argv(int argc, const char **argv)
+static inline const char *precompose_argv_prefix(int argc, const char **argv, const char *prefix)
 {
-	; /* nothing */
+	return prefix;
 }
 #define probe_utf8_pathname_composition()
 #endif
@@ -863,6 +863,12 @@ int git_vsnprintf(char *str, size_t maxsize,
 		  const char *format, va_list ap);
 #endif
 
+#ifdef OPEN_RETURNS_EINTR
+#undef open
+#define open git_open_with_retry
+int git_open_with_retry(const char *path, int flag, ...);
+#endif
+
 #ifdef __GLIBC_PREREQ
 #if __GLIBC_PREREQ(2, 1)
 #define HAVE_STRCHRNUL
@@ -962,7 +968,7 @@ int xstrncmpz(const char *s, const char *t, size_t len);
 #define FREE_AND_NULL(p) do { free(p); (p) = NULL; } while (0)
 
 #define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc)))
-#define CALLOC_ARRAY(x, alloc) (x) = xcalloc((alloc), sizeof(*(x)));
+#define CALLOC_ARRAY(x, alloc) (x) = xcalloc((alloc), sizeof(*(x)))
 #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)) + \
@@ -1251,9 +1257,12 @@ static inline int regexec_buf(const regex_t *preg, const char *buf, size_t size,
 #endif
 #endif
 
-#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__C99_MACRO_WITH_VA_ARGS)
+/*
+ * This is always defined as a first step towards making the use of variadic
+ * macros unconditional. If it causes compilation problems on your platform,
+ * please report it to the Git mailing list at git@vger.kernel.org.
+ */
 #define HAVE_VARIADIC_MACROS 1
-#endif
 
 /* usage.c: only to be used for testing BUG() implementation (see test-tool) */
 extern int BUG_exit_code;
diff --git a/git-difftool--helper.sh b/git-difftool--helper.sh
index 46af3e6..992124c 100755
--- a/git-difftool--helper.sh
+++ b/git-difftool--helper.sh
@@ -61,6 +61,9 @@
 		export BASE
 		eval $GIT_DIFFTOOL_EXTCMD '"$LOCAL"' '"$REMOTE"'
 	else
+		initialize_merge_tool "$merge_tool"
+		# ignore the error from the above --- run_merge_tool
+		# will diagnose unusable tool by itself
 		run_merge_tool "$merge_tool"
 	fi
 }
@@ -79,6 +82,9 @@
 then
 	LOCAL="$1"
 	REMOTE="$2"
+	initialize_merge_tool "$merge_tool"
+	# ignore the error from the above --- run_merge_tool
+	# will diagnose unusable tool by itself
 	run_merge_tool "$merge_tool" false
 else
 	# Launch the merge tool on each path provided by 'git diff'
diff --git a/git-gui/po/ru.po b/git-gui/po/ru.po
index 161ee1a..7aebaf8 100644
--- a/git-gui/po/ru.po
+++ b/git-gui/po/ru.po
@@ -331,7 +331,7 @@
 
 #: git-gui.sh:2936
 msgid "Unstage From Commit"
-msgstr "Убрать из издекса"
+msgstr "Убрать из индекса"
 
 #: git-gui.sh:2942 lib/index.tcl:521
 msgid "Revert Changes"
diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh
index 78f3647..542a6a7 100644
--- a/git-mergetool--lib.sh
+++ b/git-mergetool--lib.sh
@@ -166,6 +166,10 @@
 		return 1
 	}
 
+	hide_resolved_enabled () {
+		return 0
+	}
+
 	translate_merge_tool_path () {
 		echo "$1"
 	}
@@ -250,6 +254,10 @@
 	fi
 }
 
+initialize_merge_tool () {
+	# Bring tool-specific functions into scope
+	setup_tool "$1" || return 1
+}
 
 # Entry point for running tools
 run_merge_tool () {
@@ -261,9 +269,6 @@
 	merge_tool_path=$(get_merge_tool_path "$1") || exit
 	base_present="$2"
 
-	# Bring tool-specific functions into scope
-	setup_tool "$1" || return 1
-
 	if merge_mode
 	then
 		run_merge_cmd "$1"
diff --git a/git-mergetool.sh b/git-mergetool.sh
index e3f6d54..f751d9c 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -239,6 +239,13 @@
 	fi
 }
 
+hide_resolved () {
+	git merge-file --ours -q -p "$LOCAL" "$BASE" "$REMOTE" >"$LCONFL"
+	git merge-file --theirs -q -p "$LOCAL" "$BASE" "$REMOTE" >"$RCONFL"
+	mv -- "$LCONFL" "$LOCAL"
+	mv -- "$RCONFL" "$REMOTE"
+}
+
 merge_file () {
 	MERGED="$1"
 
@@ -265,6 +272,8 @@
 		ext=
 	esac
 
+	initialize_merge_tool "$merge_tool" || return
+
 	mergetool_tmpdir_init
 
 	if test "$MERGETOOL_TMPDIR" != "."
@@ -276,7 +285,9 @@
 
 	BACKUP="$MERGETOOL_TMPDIR/${BASE}_BACKUP_$$$ext"
 	LOCAL="$MERGETOOL_TMPDIR/${BASE}_LOCAL_$$$ext"
+	LCONFL="$MERGETOOL_TMPDIR/${BASE}_LOCAL_LCONFL_$$$ext"
 	REMOTE="$MERGETOOL_TMPDIR/${BASE}_REMOTE_$$$ext"
+	RCONFL="$MERGETOOL_TMPDIR/${BASE}_REMOTE_RCONFL_$$$ext"
 	BASE="$MERGETOOL_TMPDIR/${BASE}_BASE_$$$ext"
 
 	base_mode= local_mode= remote_mode=
@@ -322,6 +333,40 @@
 	checkout_staged_file 2 "$MERGED" "$LOCAL"
 	checkout_staged_file 3 "$MERGED" "$REMOTE"
 
+	# hideResolved preferences hierarchy.
+	global_config="mergetool.hideResolved"
+	tool_config="mergetool.${merge_tool}.hideResolved"
+
+	if enabled=$(git config --type=bool "$tool_config")
+	then
+		# The user has a specific preference for a specific tool and no
+		# other preferences should override that.
+		: ;
+	elif enabled=$(git config --type=bool "$global_config")
+	then
+		# The user has a general preference for all tools.
+		#
+		# 'true' means the user likes the feature so we should use it
+		# where possible but tool authors can still override.
+		#
+		# 'false' means the user doesn't like the feature so we should
+		# not use it anywhere.
+		if test "$enabled" = true && hide_resolved_enabled
+		then
+		    enabled=true
+		else
+		    enabled=false
+		fi
+	else
+		# The user does not have a preference. Default to disabled.
+		enabled=false
+	fi
+
+	if test "$enabled" = true
+	then
+		hide_resolved
+	fi
+
 	if test -z "$local_mode" || test -z "$remote_mode"
 	then
 		echo "Deleted merge conflict for '$MERGED':"
diff --git a/git-sh-i18n.sh b/git-sh-i18n.sh
index 8eef60b..e3d9f48 100644
--- a/git-sh-i18n.sh
+++ b/git-sh-i18n.sh
@@ -17,12 +17,7 @@
 
 # First decide what scheme to use...
 GIT_INTERNAL_GETTEXT_SH_SCHEME=fallthrough
-if test -n "$GIT_TEST_GETTEXT_POISON" &&
-	    git env--helper --type=bool --default=0 --exit-code \
-		GIT_TEST_GETTEXT_POISON
-then
-	GIT_INTERNAL_GETTEXT_SH_SCHEME=poison
-elif test -n "@@USE_GETTEXT_SCHEME@@"
+if test -n "@@USE_GETTEXT_SCHEME@@"
 then
 	GIT_INTERNAL_GETTEXT_SH_SCHEME="@@USE_GETTEXT_SCHEME@@"
 elif test -n "$GIT_INTERNAL_GETTEXT_TEST_FALLBACKS"
@@ -63,21 +58,6 @@
 		)
 	}
 	;;
-poison)
-	# Emit garbage so that tests that incorrectly rely on translatable
-	# strings will fail.
-	gettext () {
-		printf "%s" "# GETTEXT POISON #"
-	}
-
-	eval_gettext () {
-		printf "%s" "# GETTEXT POISON #"
-	}
-
-	eval_ngettext () {
-		printf "%s" "# GETTEXT POISON #"
-	}
-	;;
 *)
 	gettext () {
 		printf "%s" "$1"
diff --git a/git.c b/git.c
index a00a0a4..9bc077a 100644
--- a/git.c
+++ b/git.c
@@ -29,6 +29,7 @@ const char git_usage_string[] =
 	   "           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]\n"
 	   "           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]\n"
 	   "           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]\n"
+	   "           [--super-prefix=<path>] [--config-env=<name>=<envvar>]\n"
 	   "           <command> [<args>]");
 
 const char git_more_info_string[] =
@@ -254,6 +255,8 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
 			git_config_push_parameter((*argv)[1]);
 			(*argv)++;
 			(*argc)--;
+		} else if (skip_prefix(cmd, "--config-env=", &cmd)) {
+			git_config_push_env(cmd);
 		} else if (!strcmp(cmd, "--literal-pathspecs")) {
 			setenv(GIT_LITERAL_PATHSPECS_ENVIRONMENT, "1", 1);
 			if (envchanged)
@@ -420,7 +423,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
 			int nongit_ok;
 			prefix = setup_git_directory_gently(&nongit_ok);
 		}
-
+		prefix = precompose_argv_prefix(argc, argv, prefix);
 		if (use_pager == -1 && p->option & (RUN_SETUP | RUN_SETUP_GENTLY) &&
 		    !(p->option & DELAY_PAGER_CONFIG))
 			use_pager = check_pager_config(p->cmd);
diff --git a/gpg-interface.c b/gpg-interface.c
index b499270..127aecf 100644
--- a/gpg-interface.c
+++ b/gpg-interface.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "commit.h"
 #include "config.h"
 #include "run-command.h"
 #include "strbuf.h"
@@ -345,7 +346,7 @@ void print_signature_buffer(const struct signature_check *sigc, unsigned flags)
 		fputs(output, stderr);
 }
 
-size_t parse_signature(const char *buf, size_t size)
+size_t parse_signed_buffer(const char *buf, size_t size)
 {
 	size_t len = 0;
 	size_t match = size;
@@ -361,6 +362,18 @@ size_t parse_signature(const char *buf, size_t size)
 	return match;
 }
 
+int parse_signature(const char *buf, size_t size, struct strbuf *payload, struct strbuf *signature)
+{
+	size_t match = parse_signed_buffer(buf, size);
+	if (match != size) {
+		strbuf_add(payload, buf, match);
+		remove_signature(payload);
+		strbuf_add(signature, buf + match, size - match);
+		return 1;
+	}
+	return 0;
+}
+
 void set_signing_key(const char *key)
 {
 	free(configured_signing_key);
diff --git a/gpg-interface.h b/gpg-interface.h
index f4e9b4f..80567e4 100644
--- a/gpg-interface.h
+++ b/gpg-interface.h
@@ -38,12 +38,19 @@ struct signature_check {
 void signature_check_clear(struct signature_check *sigc);
 
 /*
+ * Look at a GPG signed tag object.  If such a signature exists, store it in
+ * signature and the signed content in payload.  Return 1 if a signature was
+ * found, and 0 otherwise.
+ */
+int parse_signature(const char *buf, size_t size, struct strbuf *payload, struct strbuf *signature);
+
+/*
  * Look at GPG signed content (e.g. a signed tag object), whose
  * payload is followed by a detached signature on it.  Return the
  * offset where the embedded detached signature begins, or the end of
  * the data when there is no such signature.
  */
-size_t parse_signature(const char *buf, size_t size);
+size_t parse_signed_buffer(const char *buf, size_t size);
 
 /*
  * Create a detached signature for the contents of "buffer" and append
diff --git a/grep.c b/grep.c
index efeb6dc..2230353 100644
--- a/grep.c
+++ b/grep.c
@@ -166,11 +166,6 @@ void grep_init(struct grep_opt *opt, struct repository *repo, const char *prefix
 					pcre2_malloc, pcre2_free, NULL);
 #endif
 
-#ifdef USE_LIBPCRE1
-	pcre_malloc = malloc;
-	pcre_free = free;
-#endif
-
 	*opt = grep_defaults;
 
 	opt->repo = repo;
@@ -223,17 +218,7 @@ static void grep_set_pattern_type_option(enum grep_pattern_type pattern_type, st
 		break;
 
 	case GREP_PATTERN_TYPE_PCRE:
-#ifdef USE_LIBPCRE2
 		opt->pcre2 = 1;
-#else
-		/*
-		 * It's important that pcre1 always be assigned to
-		 * even when there's no USE_LIBPCRE* defined. We still
-		 * call the PCRE stub function, it just dies with
-		 * "cannot use Perl-compatible regexes[...]".
-		 */
-		opt->pcre1 = 1;
-#endif
 		break;
 	}
 }
@@ -377,92 +362,6 @@ static int is_fixed(const char *s, size_t len)
 	return 1;
 }
 
-#ifdef USE_LIBPCRE1
-static void compile_pcre1_regexp(struct grep_pat *p, const struct grep_opt *opt)
-{
-	const char *error;
-	int erroffset;
-	int options = PCRE_MULTILINE;
-	int study_options = 0;
-
-	if (opt->ignore_case) {
-		if (!opt->ignore_locale && has_non_ascii(p->pattern))
-			p->pcre1_tables = pcre_maketables();
-		options |= PCRE_CASELESS;
-	}
-	if (!opt->ignore_locale && is_utf8_locale() && has_non_ascii(p->pattern))
-		options |= PCRE_UTF8;
-
-	p->pcre1_regexp = pcre_compile(p->pattern, options, &error, &erroffset,
-				      p->pcre1_tables);
-	if (!p->pcre1_regexp)
-		compile_regexp_failed(p, error);
-
-#if defined(PCRE_CONFIG_JIT) && !defined(NO_LIBPCRE1_JIT)
-	pcre_config(PCRE_CONFIG_JIT, &p->pcre1_jit_on);
-	if (opt->debug)
-		fprintf(stderr, "pcre1_jit_on=%d\n", p->pcre1_jit_on);
-
-	if (p->pcre1_jit_on)
-		study_options = PCRE_STUDY_JIT_COMPILE;
-#endif
-
-	p->pcre1_extra_info = pcre_study(p->pcre1_regexp, study_options, &error);
-	if (!p->pcre1_extra_info && error)
-		die("%s", error);
-}
-
-static int pcre1match(struct grep_pat *p, const char *line, const char *eol,
-		regmatch_t *match, int eflags)
-{
-	int ovector[30], ret, flags = PCRE_NO_UTF8_CHECK;
-
-	if (eflags & REG_NOTBOL)
-		flags |= PCRE_NOTBOL;
-
-	ret = pcre_exec(p->pcre1_regexp, p->pcre1_extra_info, line,
-			eol - line, 0, flags, ovector,
-			ARRAY_SIZE(ovector));
-
-	if (ret < 0 && ret != PCRE_ERROR_NOMATCH)
-		die("pcre_exec failed with error code %d", ret);
-	if (ret > 0) {
-		ret = 0;
-		match->rm_so = ovector[0];
-		match->rm_eo = ovector[1];
-	}
-
-	return ret;
-}
-
-static void free_pcre1_regexp(struct grep_pat *p)
-{
-	pcre_free(p->pcre1_regexp);
-#ifdef PCRE_CONFIG_JIT
-	if (p->pcre1_jit_on)
-		pcre_free_study(p->pcre1_extra_info);
-	else
-#endif
-		pcre_free(p->pcre1_extra_info);
-	pcre_free((void *)p->pcre1_tables);
-}
-#else /* !USE_LIBPCRE1 */
-static void compile_pcre1_regexp(struct grep_pat *p, const struct grep_opt *opt)
-{
-	die("cannot use Perl-compatible regexes when not compiled with USE_LIBPCRE");
-}
-
-static int pcre1match(struct grep_pat *p, const char *line, const char *eol,
-		regmatch_t *match, int eflags)
-{
-	return 1;
-}
-
-static void free_pcre1_regexp(struct grep_pat *p)
-{
-}
-#endif /* !USE_LIBPCRE1 */
-
 #ifdef USE_LIBPCRE2
 static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt)
 {
@@ -492,7 +391,23 @@ static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt
 	}
 	if (!opt->ignore_locale && is_utf8_locale() && has_non_ascii(p->pattern) &&
 	    !(!opt->ignore_case && (p->fixed || p->is_fixed)))
-		options |= PCRE2_UTF;
+		options |= (PCRE2_UTF | PCRE2_MATCH_INVALID_UTF);
+
+	/* Work around https://bugs.exim.org/show_bug.cgi?id=2642 fixed in 10.36 */
+	if (PCRE2_MATCH_INVALID_UTF && options & (PCRE2_UTF | PCRE2_CASELESS)) {
+		struct strbuf buf;
+		int len;
+		int err;
+
+		if ((len = pcre2_config(PCRE2_CONFIG_VERSION, NULL)) < 0)
+			BUG("pcre2_config(..., NULL) failed: %d", len);
+		strbuf_init(&buf, len + 1);
+		if ((err = pcre2_config(PCRE2_CONFIG_VERSION, buf.buf)) < 0)
+			BUG("pcre2_config(..., buf.buf) failed: %d", err);
+		if (versioncmp(buf.buf, "10.36") < 0)
+			options |= PCRE2_NO_START_OPTIMIZE;
+		strbuf_release(&buf);
+	}
 
 	p->pcre2_pattern = pcre2_compile((PCRE2_SPTR)p->pattern,
 					 p->patternlen, options, &error, &erroffset,
@@ -508,8 +423,6 @@ static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt
 	}
 
 	pcre2_config(PCRE2_CONFIG_JIT, &p->pcre2_jit_on);
-	if (opt->debug)
-		fprintf(stderr, "pcre2_jit_on=%d\n", p->pcre2_jit_on);
 	if (p->pcre2_jit_on) {
 		jitret = pcre2_jit_compile(p->pcre2_pattern, PCRE2_JIT_COMPLETE);
 		if (jitret)
@@ -535,9 +448,6 @@ static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt
 			BUG("pcre2_pattern_info() failed: %d", patinforet);
 		if (jitsizearg == 0) {
 			p->pcre2_jit_on = 0;
-			if (opt->debug)
-				fprintf(stderr, "pcre2_jit_on=%d: (*NO_JIT) in regex\n",
-					p->pcre2_jit_on);
 			return;
 		}
 	}
@@ -588,11 +498,6 @@ static void free_pcre2_pattern(struct grep_pat *p)
 #else /* !USE_LIBPCRE2 */
 static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt)
 {
-	/*
-	 * Unreachable until USE_LIBPCRE2 becomes synonymous with
-	 * USE_LIBPCRE. See the sibling comment in
-	 * grep_set_pattern_type_option().
-	 */
 	die("cannot use Perl-compatible regexes when not compiled with USE_LIBPCRE");
 }
 
@@ -616,8 +521,6 @@ static void compile_fixed_regexp(struct grep_pat *p, struct grep_opt *opt)
 	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];
@@ -693,11 +596,6 @@ static void compile_regexp(struct grep_pat *p, struct grep_opt *opt)
 		return;
 	}
 
-	if (opt->pcre1) {
-		compile_pcre1_regexp(p, opt);
-		return;
-	}
-
 	if (p->ignore_case)
 		regflags |= REG_ICASE;
 	if (opt->extended_regexp_option)
@@ -723,7 +621,7 @@ static struct grep_expr *compile_pattern_atom(struct grep_pat **list)
 	case GREP_PATTERN: /* atom */
 	case GREP_PATTERN_HEAD:
 	case GREP_PATTERN_BODY:
-		x = xcalloc(1, sizeof (struct grep_expr));
+		CALLOC_ARRAY(x, 1);
 		x->node = GREP_NODE_ATOM;
 		x->u.atom = p;
 		*list = p->next;
@@ -753,7 +651,7 @@ static struct grep_expr *compile_pattern_not(struct grep_pat **list)
 		if (!p->next)
 			die("--not not followed by pattern expression");
 		*list = p->next;
-		x = xcalloc(1, sizeof (struct grep_expr));
+		CALLOC_ARRAY(x, 1);
 		x->node = GREP_NODE_NOT;
 		x->u.unary = compile_pattern_not(list);
 		if (!x->u.unary)
@@ -778,7 +676,7 @@ static struct grep_expr *compile_pattern_and(struct grep_pat **list)
 		y = compile_pattern_and(list);
 		if (!y)
 			die("--and not followed by pattern expression");
-		z = xcalloc(1, sizeof (struct grep_expr));
+		CALLOC_ARRAY(z, 1);
 		z->node = GREP_NODE_AND;
 		z->u.binary.left = x;
 		z->u.binary.right = y;
@@ -798,7 +696,7 @@ static struct grep_expr *compile_pattern_or(struct grep_pat **list)
 		y = compile_pattern_or(list);
 		if (!y)
 			die("not a pattern expression %s", p->pattern);
-		z = xcalloc(1, sizeof (struct grep_expr));
+		CALLOC_ARRAY(z, 1);
 		z->node = GREP_NODE_OR;
 		z->u.binary.left = x;
 		z->u.binary.right = y;
@@ -812,87 +710,6 @@ static struct grep_expr *compile_pattern_expr(struct grep_pat **list)
 	return compile_pattern_or(list);
 }
 
-static void indent(int in)
-{
-	while (in-- > 0)
-		fputc(' ', stderr);
-}
-
-static void dump_grep_pat(struct grep_pat *p)
-{
-	switch (p->token) {
-	case GREP_AND: fprintf(stderr, "*and*"); break;
-	case GREP_OPEN_PAREN: fprintf(stderr, "*(*"); break;
-	case GREP_CLOSE_PAREN: fprintf(stderr, "*)*"); break;
-	case GREP_NOT: fprintf(stderr, "*not*"); break;
-	case GREP_OR: fprintf(stderr, "*or*"); break;
-
-	case GREP_PATTERN: fprintf(stderr, "pattern"); break;
-	case GREP_PATTERN_HEAD: fprintf(stderr, "pattern_head"); break;
-	case GREP_PATTERN_BODY: fprintf(stderr, "pattern_body"); break;
-	}
-
-	switch (p->token) {
-	default: break;
-	case GREP_PATTERN_HEAD:
-		fprintf(stderr, "<head %d>", p->field); break;
-	case GREP_PATTERN_BODY:
-		fprintf(stderr, "<body>"); break;
-	}
-	switch (p->token) {
-	default: break;
-	case GREP_PATTERN_HEAD:
-	case GREP_PATTERN_BODY:
-	case GREP_PATTERN:
-		fprintf(stderr, "%.*s", (int)p->patternlen, p->pattern);
-		break;
-	}
-	fputc('\n', stderr);
-}
-
-static void dump_grep_expression_1(struct grep_expr *x, int in)
-{
-	indent(in);
-	switch (x->node) {
-	case GREP_NODE_TRUE:
-		fprintf(stderr, "true\n");
-		break;
-	case GREP_NODE_ATOM:
-		dump_grep_pat(x->u.atom);
-		break;
-	case GREP_NODE_NOT:
-		fprintf(stderr, "(not\n");
-		dump_grep_expression_1(x->u.unary, in+1);
-		indent(in);
-		fprintf(stderr, ")\n");
-		break;
-	case GREP_NODE_AND:
-		fprintf(stderr, "(and\n");
-		dump_grep_expression_1(x->u.binary.left, in+1);
-		dump_grep_expression_1(x->u.binary.right, in+1);
-		indent(in);
-		fprintf(stderr, ")\n");
-		break;
-	case GREP_NODE_OR:
-		fprintf(stderr, "(or\n");
-		dump_grep_expression_1(x->u.binary.left, in+1);
-		dump_grep_expression_1(x->u.binary.right, in+1);
-		indent(in);
-		fprintf(stderr, ")\n");
-		break;
-	}
-}
-
-static void dump_grep_expression(struct grep_opt *opt)
-{
-	struct grep_expr *x = opt->pattern_expression;
-
-	if (opt->all_match)
-		fprintf(stderr, "[all-match]\n");
-	dump_grep_expression_1(x, 0);
-	fflush(NULL);
-}
-
 static struct grep_expr *grep_true_expr(void)
 {
 	struct grep_expr *z = xcalloc(1, sizeof(*z));
@@ -973,7 +790,7 @@ static struct grep_expr *grep_splice_or(struct grep_expr *x, struct grep_expr *y
 	return z;
 }
 
-static void compile_grep_patterns_real(struct grep_opt *opt)
+void compile_grep_patterns(struct grep_opt *opt)
 {
 	struct grep_pat *p;
 	struct grep_expr *header_expr = prep_header_patterns(opt);
@@ -993,7 +810,7 @@ static void compile_grep_patterns_real(struct grep_opt *opt)
 
 	if (opt->all_match || header_expr)
 		opt->extended = 1;
-	else if (!opt->extended && !opt->debug)
+	else if (!opt->extended)
 		return;
 
 	p = opt->pattern_list;
@@ -1016,13 +833,6 @@ static void compile_grep_patterns_real(struct grep_opt *opt)
 	opt->all_match = 1;
 }
 
-void compile_grep_patterns(struct grep_opt *opt)
-{
-	compile_grep_patterns_real(opt);
-	if (opt->debug)
-		dump_grep_expression(opt);
-}
-
 static void free_pattern_expr(struct grep_expr *x)
 {
 	switch (x->node) {
@@ -1051,9 +861,7 @@ void free_grep_patterns(struct grep_opt *opt)
 		case GREP_PATTERN: /* atom */
 		case GREP_PATTERN_HEAD:
 		case GREP_PATTERN_BODY:
-			if (p->pcre1_regexp)
-				free_pcre1_regexp(p);
-			else if (p->pcre2_pattern)
+			if (p->pcre2_pattern)
 				free_pcre2_pattern(p);
 			else
 				regfree(&p->regexp);
@@ -1116,9 +924,7 @@ static int patmatch(struct grep_pat *p, char *line, char *eol,
 {
 	int hit;
 
-	if (p->pcre1_regexp)
-		hit = !pcre1match(p, line, eol, match, eflags);
-	else if (p->pcre2_pattern)
+	if (p->pcre2_pattern)
 		hit = !pcre2match(p, line, eol, match, eflags);
 	else
 		hit = !regexec_buf(&p->regexp, line, eol - line, 1, match,
diff --git a/grep.h b/grep.h
index b5c4e22..ae89d62 100644
--- a/grep.h
+++ b/grep.h
@@ -1,15 +1,6 @@
 #ifndef GREP_H
 #define GREP_H
 #include "color.h"
-#ifdef USE_LIBPCRE1
-#include <pcre.h>
-#ifndef PCRE_NO_UTF8_CHECK
-#define PCRE_NO_UTF8_CHECK 0
-#endif
-#else
-typedef int pcre;
-typedef int pcre_extra;
-#endif
 #ifdef USE_LIBPCRE2
 #define PCRE2_CODE_UNIT_WIDTH 8
 #include <pcre2.h>
@@ -18,6 +9,10 @@ typedef int pcre2_code;
 typedef int pcre2_match_data;
 typedef int pcre2_compile_context;
 #endif
+#ifndef PCRE2_MATCH_INVALID_UTF
+/* PCRE2_MATCH_* dummy also with !USE_LIBPCRE2, for test-pcre2-config.c */
+#define PCRE2_MATCH_INVALID_UTF 0
+#endif
 #include "thread-utils.h"
 #include "userdiff.h"
 
@@ -71,10 +66,6 @@ struct grep_pat {
 	size_t patternlen;
 	enum grep_header_field field;
 	regex_t regexp;
-	pcre *pcre1_regexp;
-	pcre_extra *pcre1_extra_info;
-	const unsigned char *pcre1_tables;
-	int pcre1_jit_on;
 	pcre2_code *pcre2_pattern;
 	pcre2_match_data *pcre2_match_data;
 	pcre2_compile_context *pcre2_compile_context;
@@ -136,7 +127,6 @@ struct grep_opt {
 	int word_regexp;
 	int fixed;
 	int all_match;
-	int debug;
 #define GREP_BINARY_DEFAULT	0
 #define GREP_BINARY_NOMATCH	1
 #define GREP_BINARY_TEXT	2
@@ -144,7 +134,6 @@ struct grep_opt {
 	int allow_textconv;
 	int extended;
 	int use_reflog_filter;
-	int pcre1;
 	int pcre2;
 	int relative;
 	int pathname;
diff --git a/sha1-lookup.c b/hash-lookup.c
similarity index 79%
rename from sha1-lookup.c
rename to hash-lookup.c
index 2918584..b98ed5e 100644
--- a/sha1-lookup.c
+++ b/hash-lookup.c
@@ -1,9 +1,9 @@
 #include "cache.h"
-#include "sha1-lookup.h"
+#include "hash-lookup.h"
 
-static uint32_t take2(const unsigned char *sha1)
+static uint32_t take2(const struct object_id *oid, size_t ofs)
 {
-	return ((sha1[0] << 8) | sha1[1]);
+	return ((oid->hash[ofs] << 8) | oid->hash[ofs + 1]);
 }
 
 /*
@@ -47,11 +47,11 @@ static uint32_t take2(const unsigned char *sha1)
  */
 /*
  * The table should contain "nr" elements.
- * The sha1 of element i (between 0 and nr - 1) should be returned
+ * The oid of element i (between 0 and nr - 1) should be returned
  * by "fn(i, table)".
  */
-int sha1_pos(const unsigned char *hash, void *table, size_t nr,
-	     sha1_access_fn fn)
+int oid_pos(const struct object_id *oid, const void *table, size_t nr,
+	    oid_access_fn fn)
 {
 	size_t hi = nr;
 	size_t lo = 0;
@@ -64,9 +64,9 @@ int sha1_pos(const unsigned char *hash, void *table, size_t nr,
 		size_t lov, hiv, miv, ofs;
 
 		for (ofs = 0; ofs < the_hash_algo->rawsz - 2; ofs += 2) {
-			lov = take2(fn(0, table) + ofs);
-			hiv = take2(fn(nr - 1, table) + ofs);
-			miv = take2(hash + ofs);
+			lov = take2(fn(0, table), ofs);
+			hiv = take2(fn(nr - 1, table), ofs);
+			miv = take2(oid, ofs);
 			if (miv < lov)
 				return -1;
 			if (hiv < miv)
@@ -74,7 +74,7 @@ int sha1_pos(const unsigned char *hash, void *table, size_t nr,
 			if (lov != hiv) {
 				/*
 				 * At this point miv could be equal
-				 * to hiv (but sha1 could still be higher);
+				 * to hiv (but hash could still be higher);
 				 * the invariant of (mi < hi) should be
 				 * kept.
 				 */
@@ -88,7 +88,7 @@ int sha1_pos(const unsigned char *hash, void *table, size_t nr,
 
 	do {
 		int cmp;
-		cmp = hashcmp(fn(mi, table), hash);
+		cmp = oidcmp(fn(mi, table), oid);
 		if (!cmp)
 			return mi;
 		if (cmp > 0)
@@ -100,17 +100,17 @@ int sha1_pos(const unsigned char *hash, void *table, size_t nr,
 	return index_pos_to_insert_pos(lo);
 }
 
-int bsearch_hash(const unsigned char *sha1, const uint32_t *fanout_nbo,
+int bsearch_hash(const unsigned char *hash, const uint32_t *fanout_nbo,
 		 const unsigned char *table, size_t stride, uint32_t *result)
 {
 	uint32_t hi, lo;
 
-	hi = ntohl(fanout_nbo[*sha1]);
-	lo = ((*sha1 == 0x0) ? 0 : ntohl(fanout_nbo[*sha1 - 1]));
+	hi = ntohl(fanout_nbo[*hash]);
+	lo = ((*hash == 0x0) ? 0 : ntohl(fanout_nbo[*hash - 1]));
 
 	while (lo < hi) {
 		unsigned mi = lo + (hi - lo) / 2;
-		int cmp = hashcmp(table + mi * stride, sha1);
+		int cmp = hashcmp(table + mi * stride, hash);
 
 		if (!cmp) {
 			if (result)
diff --git a/sha1-lookup.h b/hash-lookup.h
similarity index 64%
rename from sha1-lookup.h
rename to hash-lookup.h
index 5afcd01..dbd71eb 100644
--- a/sha1-lookup.h
+++ b/hash-lookup.h
@@ -1,20 +1,20 @@
-#ifndef SHA1_LOOKUP_H
-#define SHA1_LOOKUP_H
+#ifndef HASH_LOOKUP_H
+#define HASH_LOOKUP_H
 
-typedef const unsigned char *sha1_access_fn(size_t index, void *table);
+typedef const struct object_id *oid_access_fn(size_t index, const void *table);
 
-int sha1_pos(const unsigned char *sha1,
-	     void *table,
-	     size_t nr,
-	     sha1_access_fn fn);
+int oid_pos(const struct object_id *oid,
+	    const void *table,
+	    size_t nr,
+	    oid_access_fn fn);
 
 /*
- * Searches for sha1 in table, using the given fanout table to determine the
+ * Searches for hash in table, using the given fanout table to determine the
  * interval to search, then using binary search. Returns 1 if found, 0 if not.
  *
  * Takes the following parameters:
  *
- *  - sha1: the hash to search for
+ *  - hash: the hash to search for
  *  - fanout_nbo: a 256-element array of NETWORK-order 32-bit integers; the
  *    integer at position i represents the number of elements in table whose
  *    first byte is less than or equal to i
@@ -23,10 +23,10 @@ int sha1_pos(const unsigned char *sha1,
  *    GIT_MAX_RAWSZ or greater)
  *  - result: if not NULL, this function stores the element index of the
  *    position found (if the search is successful) or the index of the least
- *    element that is greater than sha1 (if the search is not successful)
+ *    element that is greater than hash (if the search is not successful)
  *
  * This function does not verify the validity of the fanout table.
  */
-int bsearch_hash(const unsigned char *sha1, const uint32_t *fanout_nbo,
+int bsearch_hash(const unsigned char *hash, const uint32_t *fanout_nbo,
 		 const unsigned char *table, size_t stride, uint32_t *result);
 #endif
diff --git a/hashmap.c b/hashmap.c
index 5009471..134d2ee 100644
--- a/hashmap.c
+++ b/hashmap.c
@@ -76,7 +76,7 @@ unsigned int memihash_cont(unsigned int hash_seed, const void *buf, size_t len)
 static void alloc_table(struct hashmap *map, unsigned int size)
 {
 	map->tablesize = size;
-	map->table = xcalloc(size, sizeof(struct hashmap_entry *));
+	CALLOC_ARRAY(map->table, size);
 
 	/* calculate resize thresholds for new size */
 	map->grow_at = (unsigned int) ((uint64_t) size * HASHMAP_LOAD_FACTOR / 100);
diff --git a/http-backend.c b/http-backend.c
index a03b4ba..b329bf6 100644
--- a/http-backend.c
+++ b/http-backend.c
@@ -39,7 +39,7 @@ static struct string_list *get_parameters(void)
 	if (!query_params) {
 		const char *query = getenv("QUERY_STRING");
 
-		query_params = xcalloc(1, sizeof(*query_params));
+		CALLOC_ARRAY(query_params, 1);
 		while (query && *query) {
 			char *name = url_decode_parameter_name(&query);
 			char *value = url_decode_parameter_value(&query);
diff --git a/http-fetch.c b/http-fetch.c
index c4ccc5f..fa64246 100644
--- a/http-fetch.c
+++ b/http-fetch.c
@@ -3,6 +3,7 @@
 #include "exec-cmd.h"
 #include "http.h"
 #include "walker.h"
+#include "strvec.h"
 
 static const char http_fetch_usage[] = "git http-fetch "
 "[-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin | --packfile=hash | commit-id] url";
@@ -44,7 +45,8 @@ static int fetch_using_walker(const char *raw_url, int get_verbosely,
 }
 
 static void fetch_single_packfile(struct object_id *packfile_hash,
-				  const char *url) {
+				  const char *url,
+				  const char **index_pack_args) {
 	struct http_pack_request *preq;
 	struct slot_results results;
 	int ret;
@@ -55,7 +57,8 @@ static void fetch_single_packfile(struct object_id *packfile_hash,
 	if (preq == NULL)
 		die("couldn't create http pack request");
 	preq->slot->results = &results;
-	preq->generate_keep = 1;
+	preq->index_pack_args = index_pack_args;
+	preq->preserve_index_pack_stdout = 1;
 
 	if (start_active_slot(preq->slot)) {
 		run_active_slot(preq->slot);
@@ -86,6 +89,7 @@ int cmd_main(int argc, const char **argv)
 	int packfile = 0;
 	int nongit;
 	struct object_id packfile_hash;
+	struct strvec index_pack_args = STRVEC_INIT;
 
 	setup_git_directory_gently(&nongit);
 
@@ -112,6 +116,8 @@ int cmd_main(int argc, const char **argv)
 			packfile = 1;
 			if (parse_oid_hex(p, &packfile_hash, &end) || *end)
 				die(_("argument to --packfile must be a valid hash (got '%s')"), p);
+		} else if (skip_prefix(argv[arg], "--index-pack-arg=", &p)) {
+			strvec_push(&index_pack_args, p);
 		}
 		arg++;
 	}
@@ -124,10 +130,18 @@ int cmd_main(int argc, const char **argv)
 	git_config(git_default_config, NULL);
 
 	if (packfile) {
-		fetch_single_packfile(&packfile_hash, argv[arg]);
+		if (!index_pack_args.nr)
+			die(_("--packfile requires --index-pack-args"));
+
+		fetch_single_packfile(&packfile_hash, argv[arg],
+				      index_pack_args.v);
+
 		return 0;
 	}
 
+	if (index_pack_args.nr)
+		die(_("--index-pack-args can only be used with --packfile"));
+
 	if (commits_on_stdin) {
 		commits = walker_targets_stdin(&commit_id, &write_ref);
 	} else {
diff --git a/http-push.c b/http-push.c
index 6a4a43e..b60d5fc 100644
--- a/http-push.c
+++ b/http-push.c
@@ -896,7 +896,7 @@ static struct remote_lock *lock_remote(const char *path, long timeout)
 	curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, dav_headers);
 	curl_easy_setopt(slot->curl, CURLOPT_FILE, &in_buffer);
 
-	lock = xcalloc(1, sizeof(*lock));
+	CALLOC_ARRAY(lock, 1);
 	lock->timeout = -1;
 
 	if (start_active_slot(slot)) {
@@ -1713,7 +1713,7 @@ int cmd_main(int argc, const char **argv)
 	int new_refs;
 	struct ref *ref, *local_refs;
 
-	repo = xcalloc(1, sizeof(*repo));
+	CALLOC_ARRAY(repo, 1);
 
 	argv++;
 	for (i = 1; i < argc; i++, argv++) {
diff --git a/http.c b/http.c
index 8b23a54..0e31fc2 100644
--- a/http.c
+++ b/http.c
@@ -2259,6 +2259,9 @@ void release_http_pack_request(struct http_pack_request *preq)
 	free(preq);
 }
 
+static const char *default_index_pack_args[] =
+	{"index-pack", "--stdin", NULL};
+
 int finish_http_pack_request(struct http_pack_request *preq)
 {
 	struct child_process ip = CHILD_PROCESS_INIT;
@@ -2270,17 +2273,15 @@ int finish_http_pack_request(struct http_pack_request *preq)
 
 	tmpfile_fd = xopen(preq->tmpfile.buf, O_RDONLY);
 
-	strvec_push(&ip.args, "index-pack");
-	strvec_push(&ip.args, "--stdin");
 	ip.git_cmd = 1;
 	ip.in = tmpfile_fd;
-	if (preq->generate_keep) {
-		strvec_pushf(&ip.args, "--keep=git %"PRIuMAX,
-			     (uintmax_t)getpid());
+	ip.argv = preq->index_pack_args ? preq->index_pack_args
+					: default_index_pack_args;
+
+	if (preq->preserve_index_pack_stdout)
 		ip.out = 0;
-	} else {
+	else
 		ip.no_stdout = 1;
-	}
 
 	if (run_command(&ip)) {
 		ret = -1;
@@ -2323,7 +2324,7 @@ struct http_pack_request *new_direct_http_pack_request(
 	off_t prev_posn = 0;
 	struct http_pack_request *preq;
 
-	preq = xcalloc(1, sizeof(*preq));
+	CALLOC_ARRAY(preq, 1);
 	strbuf_init(&preq->tmpfile, 0);
 
 	preq->url = url;
@@ -2418,7 +2419,7 @@ struct http_object_request *new_http_object_request(const char *base_url,
 	off_t prev_posn = 0;
 	struct http_object_request *freq;
 
-	freq = xcalloc(1, sizeof(*freq));
+	CALLOC_ARRAY(freq, 1);
 	strbuf_init(&freq->tmpfile, 0);
 	oidcpy(&freq->oid, oid);
 	freq->localfile = -1;
diff --git a/http.h b/http.h
index 5de792e..bf3d127 100644
--- a/http.h
+++ b/http.h
@@ -218,12 +218,12 @@ struct http_pack_request {
 	char *url;
 
 	/*
-	 * If this is true, finish_http_pack_request() will pass "--keep" to
-	 * index-pack, resulting in the creation of a keep file, and will not
-	 * suppress its stdout (that is, the "keep\t<hash>\n" line will be
-	 * printed to stdout).
+	 * index-pack command to run. Must be terminated by NULL.
+	 *
+	 * If NULL, defaults to	{"index-pack", "--stdin", NULL}.
 	 */
-	unsigned generate_keep : 1;
+	const char **index_pack_args;
+	unsigned preserve_index_pack_stdout : 1;
 
 	FILE *packfile;
 	struct strbuf tmpfile;
diff --git a/imap-send.c b/imap-send.c
index d0b94f9..bb085d6 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -963,9 +963,9 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc, const c
 	char *arg, *rsp;
 	int s = -1, preauth;
 
-	ctx = xcalloc(1, sizeof(*ctx));
+	CALLOC_ARRAY(ctx, 1);
 
-	ctx->imap = imap = xcalloc(1, sizeof(*imap));
+	ctx->imap = CALLOC_ARRAY(imap, 1);
 	imap->buf.sock.fd[0] = imap->buf.sock.fd[1] = -1;
 	imap->in_progress_append = &imap->in_progress;
 
diff --git a/line-log.c b/line-log.c
index 75c8b1a..51d9331 100644
--- a/line-log.c
+++ b/line-log.c
@@ -296,7 +296,7 @@ static void line_log_data_insert(struct line_log_data **list,
 		return;
 	}
 
-	p = xcalloc(1, sizeof(struct line_log_data));
+	CALLOC_ARRAY(p, 1);
 	p->path = path;
 	range_set_append(&p->ranges, begin, end);
 	if (ip) {
diff --git a/line-range.c b/line-range.c
index 9b50583..955a8a9 100644
--- a/line-range.c
+++ b/line-range.c
@@ -202,7 +202,7 @@ static const char *parse_range_funcname(
 	drv = userdiff_find_by_path(istate, path);
 	if (drv && drv->funcname.pattern) {
 		const struct userdiff_funcname *pe = &drv->funcname;
-		xecfg = xcalloc(1, sizeof(*xecfg));
+		CALLOC_ARRAY(xecfg, 1);
 		xdiff_set_find_func(xecfg, pe->pattern, pe->cflags);
 	}
 
diff --git a/list-objects-filter.c b/list-objects-filter.c
index 0a3ef3c..39e2f15 100644
--- a/list-objects-filter.c
+++ b/list-objects-filter.c
@@ -21,7 +21,7 @@
  * in the traversal (until we mark it SEEN).  This is a way to
  * let us silently de-dup calls to show() in the caller.  This
  * is subtly different from the "revision.h:SHOWN" and the
- * "sha1-name.c:ONELINE_SEEN" bits.  And also different from
+ * "object-name.c:ONELINE_SEEN" bits.  And also different from
  * the non-de-dup usage in pack-bitmap.c
  */
 #define FILTER_SHOWN_BUT_REVISIT (1<<21)
@@ -186,7 +186,7 @@ static enum list_objects_filter_result filter_trees_depth(
 		seen_info = oidmap_get(
 			&filter_data->seen_at_depth, &obj->oid);
 		if (!seen_info) {
-			seen_info = xcalloc(1, sizeof(*seen_info));
+			CALLOC_ARRAY(seen_info, 1);
 			oidcpy(&seen_info->base.oid, &obj->oid);
 			seen_info->depth = filter_data->current_depth;
 			oidmap_put(&filter_data->seen_at_depth, seen_info);
@@ -626,7 +626,7 @@ static void filter_combine__init(
 	size_t sub;
 
 	d->nr = filter_options->sub_nr;
-	d->sub = xcalloc(d->nr, sizeof(*d->sub));
+	CALLOC_ARRAY(d->sub, d->nr);
 	for (sub = 0; sub < d->nr; sub++)
 		d->sub[sub].filter = list_objects_filter__init(
 			filter->omits ? &d->sub[sub].omits : NULL,
@@ -674,7 +674,7 @@ struct filter *list_objects_filter__init(
 	if (!init_fn)
 		return NULL;
 
-	filter = xcalloc(1, sizeof(*filter));
+	CALLOC_ARRAY(filter, 1);
 	filter->omits = omitted;
 	init_fn(filter_options, filter);
 	return filter;
diff --git a/ll-merge.c b/ll-merge.c
index 1ec0b95..9a8a2c3 100644
--- a/ll-merge.c
+++ b/ll-merge.c
@@ -268,7 +268,7 @@ static int read_merge_config(const char *var, const char *value, void *cb)
 		if (!strncmp(fn->name, name, namelen) && !fn->name[namelen])
 			break;
 	if (!fn) {
-		fn = xcalloc(1, sizeof(struct ll_merge_driver));
+		CALLOC_ARRAY(fn, 1);
 		fn->name = xmemdupz(name, namelen);
 		fn->fn = ll_ext_merge;
 		*ll_user_merge_tail = fn;
diff --git a/log-tree.c b/log-tree.c
index fd0dde9..4531ceb 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -502,7 +502,7 @@ static void show_signature(struct rev_info *opt, struct commit *commit)
 	struct signature_check sigc = { 0 };
 	int status;
 
-	if (parse_signed_commit(commit, &payload, &signature) <= 0)
+	if (parse_signed_commit(commit, &payload, &signature, the_hash_algo) <= 0)
 		goto out;
 
 	status = check_signature(payload.buf, payload.len, signature.buf,
@@ -548,7 +548,8 @@ static int show_one_mergetag(struct commit *commit,
 	struct strbuf verify_message;
 	struct signature_check sigc = { 0 };
 	int status, nth;
-	size_t payload_size;
+	struct strbuf payload = STRBUF_INIT;
+	struct strbuf signature = STRBUF_INIT;
 
 	hash_object_file(the_hash_algo, extra->value, extra->len,
 			 type_name(OBJ_TAG), &oid);
@@ -571,13 +572,11 @@ static int show_one_mergetag(struct commit *commit,
 		strbuf_addf(&verify_message,
 			    "parent #%d, tagged '%s'\n", nth + 1, tag->tag);
 
-	payload_size = parse_signature(extra->value, extra->len);
 	status = -1;
-	if (extra->len > payload_size) {
+	if (parse_signature(extra->value, extra->len, &payload, &signature)) {
 		/* could have a good signature */
-		status = check_signature(extra->value, payload_size,
-					 extra->value + payload_size,
-					 extra->len - payload_size, &sigc);
+		status = check_signature(payload.buf, payload.len,
+					 signature.buf, signature.len, &sigc);
 		if (sigc.gpg_output)
 			strbuf_addstr(&verify_message, sigc.gpg_output);
 		else
@@ -588,6 +587,8 @@ static int show_one_mergetag(struct commit *commit,
 
 	show_sig_lines(opt, status, verify_message.buf);
 	strbuf_release(&verify_message);
+	strbuf_release(&payload);
+	strbuf_release(&signature);
 	return 0;
 }
 
@@ -808,6 +809,11 @@ void show_log(struct rev_info *opt)
 	if (cmit_fmt_is_mail(ctx.fmt) && opt->rdiff1) {
 		struct diff_queue_struct dq;
 		struct diff_options opts;
+		struct range_diff_options range_diff_opts = {
+			.creation_factor = opt->creation_factor,
+			.dual_color = 1,
+			.diffopt = &opts
+		};
 
 		memcpy(&dq, &diff_queued_diff, sizeof(diff_queued_diff));
 		DIFF_QUEUE_CLEAR(&diff_queued_diff);
@@ -822,8 +828,7 @@ void show_log(struct rev_info *opt)
 		opts.file = opt->diffopt.file;
 		opts.use_color = opt->diffopt.use_color;
 		diff_setup_done(&opts);
-		show_range_diff(opt->rdiff1, opt->rdiff2,
-				opt->creation_factor, 1, &opts, NULL);
+		show_range_diff(opt->rdiff1, opt->rdiff2, &range_diff_opts);
 
 		memcpy(&diff_queued_diff, &dq, sizeof(diff_queued_diff));
 	}
@@ -899,15 +904,21 @@ static int log_tree_diff(struct rev_info *opt, struct commit *commit, struct log
 	int showed_log;
 	struct commit_list *parents;
 	struct object_id *oid;
+	int is_merge;
+	int all_need_diff = opt->diff || opt->diffopt.flags.exit_with_status;
 
-	if (!opt->diff && !opt->diffopt.flags.exit_with_status)
+	if (!all_need_diff && !opt->merges_need_diff)
 		return 0;
 
 	parse_commit_or_die(commit);
 	oid = get_commit_tree_oid(commit);
 
-	/* Root commit? */
 	parents = get_saved_parents(opt, commit);
+	is_merge = parents && parents->next;
+	if (!is_merge && !all_need_diff)
+		return 0;
+
+	/* Root commit? */
 	if (!parents) {
 		if (opt->show_root_diff) {
 			diff_root_tree_oid(oid, "", &opt->diffopt);
@@ -916,16 +927,16 @@ static int log_tree_diff(struct rev_info *opt, struct commit *commit, struct log
 		return !opt->loginfo;
 	}
 
-	/* More than one parent? */
-	if (parents->next) {
-		if (opt->ignore_merges)
-			return 0;
-		else if (opt->combine_merges)
+	if (is_merge) {
+		if (opt->combine_merges)
 			return do_diff_combined(opt, commit);
-		else if (!opt->first_parent_only) {
-			/* If we show multiple diffs, show the parent info */
-			log->parent = parents->item;
-		}
+		if (opt->separate_merges) {
+			if (!opt->first_parent_merges) {
+				/* Show parent info for multiple diffs */
+				log->parent = parents->item;
+			}
+		} else
+			return 0;
 	}
 
 	showed_log = 0;
@@ -941,7 +952,7 @@ static int log_tree_diff(struct rev_info *opt, struct commit *commit, struct log
 
 		/* Set up the log info for the next parent, if any.. */
 		parents = parents->next;
-		if (!parents || opt->first_parent_only)
+		if (!parents || opt->first_parent_merges)
 			break;
 		log->parent = parents->item;
 		opt->loginfo = log;
@@ -952,12 +963,14 @@ 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, close_file = opt->diffopt.close_file;
+	int shown;
+	/* maybe called by e.g. cmd_log_walk(), maybe stand-alone */
+	int no_free = opt->diffopt.no_free;
 
 	log.commit = commit;
 	log.parent = NULL;
 	opt->loginfo = &log;
-	opt->diffopt.close_file = 0;
+	opt->diffopt.no_free = 1;
 
 	if (opt->line_level_traverse)
 		return line_log_print(opt, commit);
@@ -974,7 +987,7 @@ int log_tree_commit(struct rev_info *opt, struct commit *commit)
 		fprintf(opt->diffopt.file, "\n%s\n", opt->break_bar);
 	opt->loginfo = NULL;
 	maybe_flush_or_die(opt->diffopt.file, "stdout");
-	if (close_file)
-		fclose(opt->diffopt.file);
+	opt->diffopt.no_free = no_free;
+	diff_free(&opt->diffopt);
 	return shown;
 }
diff --git a/ls-refs.c b/ls-refs.c
index a1e0b47..88f6c3f 100644
--- a/ls-refs.c
+++ b/ls-refs.c
@@ -7,6 +7,39 @@
 #include "pkt-line.h"
 #include "config.h"
 
+static int config_read;
+static int advertise_unborn;
+static int allow_unborn;
+
+static void ensure_config_read(void)
+{
+	const char *str = NULL;
+
+	if (config_read)
+		return;
+
+	if (repo_config_get_string_tmp(the_repository, "lsrefs.unborn", &str)) {
+		/*
+		 * If there is no such config, advertise and allow it by
+		 * default.
+		 */
+		advertise_unborn = 1;
+		allow_unborn = 1;
+	} else {
+		if (!strcmp(str, "advertise")) {
+			advertise_unborn = 1;
+			allow_unborn = 1;
+		} else if (!strcmp(str, "allow")) {
+			allow_unborn = 1;
+		} else if (!strcmp(str, "ignore")) {
+			/* do nothing */
+		} else {
+			die(_("invalid value '%s' for lsrefs.unborn"), str);
+		}
+	}
+	config_read = 1;
+}
+
 /*
  * Check if one of the prefixes is a prefix of the ref.
  * If no prefixes were provided, all refs match.
@@ -32,6 +65,7 @@ struct ls_refs_data {
 	unsigned peel;
 	unsigned symrefs;
 	struct strvec prefixes;
+	unsigned unborn : 1;
 };
 
 static int send_ref(const char *refname, const struct object_id *oid,
@@ -47,7 +81,10 @@ static int send_ref(const char *refname, const struct object_id *oid,
 	if (!ref_match(&data->prefixes, refname_nons))
 		return 0;
 
-	strbuf_addf(&refline, "%s %s", oid_to_hex(oid), refname_nons);
+	if (oid)
+		strbuf_addf(&refline, "%s %s", oid_to_hex(oid), refname_nons);
+	else
+		strbuf_addf(&refline, "unborn %s", refname_nons);
 	if (data->symrefs && flag & REF_ISSYMREF) {
 		struct object_id unused;
 		const char *symref_target = resolve_ref_unsafe(refname, 0,
@@ -61,9 +98,9 @@ static int send_ref(const char *refname, const struct object_id *oid,
 			    strip_namespace(symref_target));
 	}
 
-	if (data->peel) {
+	if (data->peel && oid) {
 		struct object_id peeled;
-		if (!peel_ref(refname, &peeled))
+		if (!peel_iterated_oid(oid, &peeled))
 			strbuf_addf(&refline, " peeled:%s", oid_to_hex(&peeled));
 	}
 
@@ -74,6 +111,23 @@ static int send_ref(const char *refname, const struct object_id *oid,
 	return 0;
 }
 
+static void send_possibly_unborn_head(struct ls_refs_data *data)
+{
+	struct strbuf namespaced = STRBUF_INIT;
+	struct object_id oid;
+	int flag;
+	int oid_is_null;
+
+	strbuf_addf(&namespaced, "%sHEAD", get_git_namespace());
+	if (!resolve_ref_unsafe(namespaced.buf, 0, &oid, &flag))
+		return; /* bad ref */
+	oid_is_null = is_null_oid(&oid);
+	if (!oid_is_null ||
+	    (data->unborn && data->symrefs && (flag & REF_ISSYMREF)))
+		send_ref(namespaced.buf, oid_is_null ? NULL : &oid, flag, data);
+	strbuf_release(&namespaced);
+}
+
 static int ls_refs_config(const char *var, const char *value, void *data)
 {
 	/*
@@ -90,7 +144,9 @@ int ls_refs(struct repository *r, struct strvec *keys,
 	struct ls_refs_data data;
 
 	memset(&data, 0, sizeof(data));
+	strvec_init(&data.prefixes);
 
+	ensure_config_read();
 	git_config(ls_refs_config, NULL);
 
 	while (packet_reader_read(request) == PACKET_READ_NORMAL) {
@@ -103,14 +159,30 @@ int ls_refs(struct repository *r, struct strvec *keys,
 			data.symrefs = 1;
 		else if (skip_prefix(arg, "ref-prefix ", &out))
 			strvec_push(&data.prefixes, out);
+		else if (!strcmp("unborn", arg))
+			data.unborn = allow_unborn;
 	}
 
 	if (request->status != PACKET_READ_FLUSH)
 		die(_("expected flush after ls-refs arguments"));
 
-	head_ref_namespaced(send_ref, &data);
-	for_each_namespaced_ref(send_ref, &data);
+	send_possibly_unborn_head(&data);
+	if (!data.prefixes.nr)
+		strvec_push(&data.prefixes, "");
+	for_each_fullref_in_prefixes(get_git_namespace(), data.prefixes.v,
+				     send_ref, &data, 0);
 	packet_flush(1);
 	strvec_clear(&data.prefixes);
 	return 0;
 }
+
+int ls_refs_advertise(struct repository *r, struct strbuf *value)
+{
+	if (value) {
+		ensure_config_read();
+		if (advertise_unborn)
+			strbuf_addstr(value, "unborn");
+	}
+
+	return 1;
+}
diff --git a/ls-refs.h b/ls-refs.h
index 7b33a7c..a99e4be 100644
--- a/ls-refs.h
+++ b/ls-refs.h
@@ -6,5 +6,6 @@ struct strvec;
 struct packet_reader;
 int ls_refs(struct repository *r, struct strvec *keys,
 	    struct packet_reader *request);
+int ls_refs_advertise(struct repository *r, struct strbuf *value);
 
 #endif /* LS_REFS_H */
diff --git a/mailmap.c b/mailmap.c
index 962fd86..183a2f6 100644
--- a/mailmap.c
+++ b/mailmap.c
@@ -83,7 +83,7 @@ static void add_mapping(struct string_list *map,
 	if (item->util) {
 		me = (struct mailmap_entry *)item->util;
 	} else {
-		me = xcalloc(1, sizeof(struct mailmap_entry));
+		CALLOC_ARRAY(me, 1);
 		me->namemap.strdup_strings = 1;
 		me->namemap.cmp = namemap_cmp;
 		item->util = me;
@@ -143,31 +143,13 @@ static char *parse_name_and_email(char *buffer, char **name,
 	return (*right == '\0' ? NULL : right);
 }
 
-static void read_mailmap_line(struct string_list *map, char *buffer,
-			      char **repo_abbrev)
+static void read_mailmap_line(struct string_list *map, char *buffer)
 {
 	char *name1 = NULL, *email1 = NULL, *name2 = NULL, *email2 = NULL;
-	if (buffer[0] == '#') {
-		static const char abbrev[] = "# repo-abbrev:";
-		int abblen = sizeof(abbrev) - 1;
-		int len = strlen(buffer);
 
-		if (!repo_abbrev)
-			return;
-
-		if (len && buffer[len - 1] == '\n')
-			buffer[--len] = 0;
-		if (!strncmp(buffer, abbrev, abblen)) {
-			char *cp;
-
-			free(*repo_abbrev);
-
-			for (cp = buffer + abblen; isspace(*cp); cp++)
-				; /* nothing */
-			*repo_abbrev = xstrdup(cp);
-		}
+	if (buffer[0] == '#')
 		return;
-	}
+
 	if ((name2 = parse_name_and_email(buffer, &name1, &email1, 0)) != NULL)
 		parse_name_and_email(name2, &name2, &email2, 1);
 
@@ -175,8 +157,7 @@ static void read_mailmap_line(struct string_list *map, char *buffer,
 		add_mapping(map, name1, email1, name2, email2);
 }
 
-static int read_mailmap_file(struct string_list *map, const char *filename,
-			     char **repo_abbrev)
+static int read_mailmap_file(struct string_list *map, const char *filename)
 {
 	char buffer[1024];
 	FILE *f;
@@ -192,13 +173,12 @@ static int read_mailmap_file(struct string_list *map, const char *filename,
 	}
 
 	while (fgets(buffer, sizeof(buffer), f) != NULL)
-		read_mailmap_line(map, buffer, repo_abbrev);
+		read_mailmap_line(map, buffer);
 	fclose(f);
 	return 0;
 }
 
-static void read_mailmap_string(struct string_list *map, char *buf,
-				char **repo_abbrev)
+static void read_mailmap_string(struct string_list *map, char *buf)
 {
 	while (*buf) {
 		char *end = strchrnul(buf, '\n');
@@ -206,14 +186,12 @@ static void read_mailmap_string(struct string_list *map, char *buf,
 		if (*end)
 			*end++ = '\0';
 
-		read_mailmap_line(map, buf, repo_abbrev);
+		read_mailmap_line(map, buf);
 		buf = end;
 	}
 }
 
-static int read_mailmap_blob(struct string_list *map,
-			     const char *name,
-			     char **repo_abbrev)
+static int read_mailmap_blob(struct string_list *map, const char *name)
 {
 	struct object_id oid;
 	char *buf;
@@ -231,13 +209,13 @@ static int read_mailmap_blob(struct string_list *map,
 	if (type != OBJ_BLOB)
 		return error("mailmap is not a blob: %s", name);
 
-	read_mailmap_string(map, buf, repo_abbrev);
+	read_mailmap_string(map, buf);
 
 	free(buf);
 	return 0;
 }
 
-int read_mailmap(struct string_list *map, char **repo_abbrev)
+int read_mailmap(struct string_list *map)
 {
 	int err = 0;
 
@@ -247,10 +225,11 @@ int read_mailmap(struct string_list *map, char **repo_abbrev)
 	if (!git_mailmap_blob && is_bare_repository())
 		git_mailmap_blob = "HEAD:.mailmap";
 
-	err |= read_mailmap_file(map, ".mailmap", repo_abbrev);
+	if (!startup_info->have_repository || !is_bare_repository())
+		err |= read_mailmap_file(map, ".mailmap");
 	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);
+		err |= read_mailmap_blob(map, git_mailmap_blob);
+	err |= read_mailmap_file(map, git_mailmap_file);
 	return err;
 }
 
diff --git a/mailmap.h b/mailmap.h
index d0e6564..7e99fcc 100644
--- a/mailmap.h
+++ b/mailmap.h
@@ -3,7 +3,7 @@
 
 struct string_list;
 
-int read_mailmap(struct string_list *map, char **repo_abbrev);
+int read_mailmap(struct string_list *map);
 void clear_mailmap(struct string_list *map);
 
 int map_user(struct string_list *map,
diff --git a/mem-pool.c b/mem-pool.c
index 8401761..ccdcad2 100644
--- a/mem-pool.c
+++ b/mem-pool.c
@@ -5,7 +5,7 @@
 #include "cache.h"
 #include "mem-pool.h"
 
-#define BLOCK_GROWTH_SIZE 1024*1024 - sizeof(struct mp_block);
+#define BLOCK_GROWTH_SIZE (1024 * 1024 - sizeof(struct mp_block))
 
 /*
  * Allocate a new mp_block and insert it after the block specified in
diff --git a/merge-ort.c b/merge-ort.c
index b487901..92dea35 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -17,20 +17,3500 @@
 #include "cache.h"
 #include "merge-ort.h"
 
+#include "alloc.h"
+#include "blob.h"
+#include "cache-tree.h"
+#include "commit.h"
+#include "commit-reach.h"
+#include "diff.h"
+#include "diffcore.h"
+#include "dir.h"
+#include "ll-merge.h"
+#include "object-store.h"
+#include "revision.h"
+#include "strmap.h"
+#include "submodule.h"
+#include "tree.h"
+#include "unpack-trees.h"
+#include "xdiff-interface.h"
+
+/*
+ * We have many arrays of size 3.  Whenever we have such an array, the
+ * indices refer to one of the sides of the three-way merge.  This is so
+ * pervasive that the constants 0, 1, and 2 are used in many places in the
+ * code (especially in arithmetic operations to find the other side's index
+ * or to compute a relevant mask), but sometimes these enum names are used
+ * to aid code clarity.
+ *
+ * See also 'filemask' and 'dirmask' in struct conflict_info; the "ith side"
+ * referred to there is one of these three sides.
+ */
+enum merge_side {
+	MERGE_BASE = 0,
+	MERGE_SIDE1 = 1,
+	MERGE_SIDE2 = 2
+};
+
+struct rename_info {
+	/*
+	 * All variables that are arrays of size 3 correspond to data tracked
+	 * for the sides in enum merge_side.  Index 0 is almost always unused
+	 * because we often only need to track information for MERGE_SIDE1 and
+	 * MERGE_SIDE2 (MERGE_BASE can't have rename information since renames
+	 * are determined relative to what changed since the MERGE_BASE).
+	 */
+
+	/*
+	 * pairs: pairing of filenames from diffcore_rename()
+	 */
+	struct diff_queue_struct pairs[3];
+
+	/*
+	 * dirs_removed: directories removed on a given side of history.
+	 */
+	struct strset dirs_removed[3];
+
+	/*
+	 * dir_rename_count: tracking where parts of a directory were renamed to
+	 *
+	 * When files in a directory are renamed, they may not all go to the
+	 * same location.  Each strmap here tracks:
+	 *      old_dir => {new_dir => int}
+	 * That is, dir_rename_count[side] is a strmap to a strintmap.
+	 */
+	struct strmap dir_rename_count[3];
+
+	/*
+	 * dir_renames: computed directory renames
+	 *
+	 * This is a map of old_dir => new_dir and is derived in part from
+	 * dir_rename_count.
+	 */
+	struct strmap dir_renames[3];
+
+	/*
+	 * needed_limit: value needed for inexact rename detection to run
+	 *
+	 * If the current rename limit wasn't high enough for inexact
+	 * rename detection to run, this records the limit needed.  Otherwise,
+	 * this value remains 0.
+	 */
+	int needed_limit;
+};
+
+struct merge_options_internal {
+	/*
+	 * paths: primary data structure in all of merge ort.
+	 *
+	 * The keys of paths:
+	 *   * are full relative paths from the toplevel of the repository
+	 *     (e.g. "drivers/firmware/raspberrypi.c").
+	 *   * store all relevant paths in the repo, both directories and
+	 *     files (e.g. drivers, drivers/firmware would also be included)
+	 *   * these keys serve to intern all the path strings, which allows
+	 *     us to do pointer comparison on directory names instead of
+	 *     strcmp; we just have to be careful to use the interned strings.
+	 *     (Technically paths_to_free may track some strings that were
+	 *      removed from froms paths.)
+	 *
+	 * The values of paths:
+	 *   * either a pointer to a merged_info, or a conflict_info struct
+	 *   * merged_info contains all relevant information for a
+	 *     non-conflicted entry.
+	 *   * conflict_info contains a merged_info, plus any additional
+	 *     information about a conflict such as the higher orders stages
+	 *     involved and the names of the paths those came from (handy
+	 *     once renames get involved).
+	 *   * a path may start "conflicted" (i.e. point to a conflict_info)
+	 *     and then a later step (e.g. three-way content merge) determines
+	 *     it can be cleanly merged, at which point it'll be marked clean
+	 *     and the algorithm will ignore any data outside the contained
+	 *     merged_info for that entry
+	 *   * If an entry remains conflicted, the merged_info portion of a
+	 *     conflict_info will later be filled with whatever version of
+	 *     the file should be placed in the working directory (e.g. an
+	 *     as-merged-as-possible variation that contains conflict markers).
+	 */
+	struct strmap paths;
+
+	/*
+	 * conflicted: a subset of keys->values from "paths"
+	 *
+	 * conflicted is basically an optimization between process_entries()
+	 * and record_conflicted_index_entries(); the latter could loop over
+	 * ALL the entries in paths AGAIN and look for the ones that are
+	 * still conflicted, but since process_entries() has to loop over
+	 * all of them, it saves the ones it couldn't resolve in this strmap
+	 * so that record_conflicted_index_entries() can iterate just the
+	 * relevant entries.
+	 */
+	struct strmap conflicted;
+
+	/*
+	 * paths_to_free: additional list of strings to free
+	 *
+	 * If keys are removed from "paths", they are added to paths_to_free
+	 * to ensure they are later freed.  We avoid free'ing immediately since
+	 * other places (e.g. conflict_info.pathnames[]) may still be
+	 * referencing these paths.
+	 */
+	struct string_list paths_to_free;
+
+	/*
+	 * output: special messages and conflict notices for various paths
+	 *
+	 * This is a map of pathnames (a subset of the keys in "paths" above)
+	 * to strbufs.  It gathers various warning/conflict/notice messages
+	 * for later processing.
+	 */
+	struct strmap output;
+
+	/*
+	 * renames: various data relating to rename detection
+	 */
+	struct rename_info renames;
+
+	/*
+	 * current_dir_name, toplevel_dir: temporary vars
+	 *
+	 * These are used in collect_merge_info_callback(), and will set the
+	 * various merged_info.directory_name for the various paths we get;
+	 * see documentation for that variable and the requirements placed on
+	 * that field.
+	 */
+	const char *current_dir_name;
+	const char *toplevel_dir;
+
+	/* call_depth: recursion level counter for merging merge bases */
+	int call_depth;
+};
+
+struct version_info {
+	struct object_id oid;
+	unsigned short mode;
+};
+
+struct merged_info {
+	/* if is_null, ignore result.  otherwise result has oid & mode */
+	struct version_info result;
+	unsigned is_null:1;
+
+	/*
+	 * clean: whether the path in question is cleanly merged.
+	 *
+	 * see conflict_info.merged for more details.
+	 */
+	unsigned clean:1;
+
+	/*
+	 * basename_offset: offset of basename of path.
+	 *
+	 * perf optimization to avoid recomputing offset of final '/'
+	 * character in pathname (0 if no '/' in pathname).
+	 */
+	size_t basename_offset;
+
+	 /*
+	  * directory_name: containing directory name.
+	  *
+	  * Note that we assume directory_name is constructed such that
+	  *    strcmp(dir1_name, dir2_name) == 0 iff dir1_name == dir2_name,
+	  * i.e. string equality is equivalent to pointer equality.  For this
+	  * to hold, we have to be careful setting directory_name.
+	  */
+	const char *directory_name;
+};
+
+struct conflict_info {
+	/*
+	 * merged: the version of the path that will be written to working tree
+	 *
+	 * WARNING: It is critical to check merged.clean and ensure it is 0
+	 * before reading any conflict_info fields outside of merged.
+	 * Allocated merge_info structs will always have clean set to 1.
+	 * Allocated conflict_info structs will have merged.clean set to 0
+	 * initially.  The merged.clean field is how we know if it is safe
+	 * to access other parts of conflict_info besides merged; if a
+	 * conflict_info's merged.clean is changed to 1, the rest of the
+	 * algorithm is not allowed to look at anything outside of the
+	 * merged member anymore.
+	 */
+	struct merged_info merged;
+
+	/* oids & modes from each of the three trees for this path */
+	struct version_info stages[3];
+
+	/* pathnames for each stage; may differ due to rename detection */
+	const char *pathnames[3];
+
+	/* Whether this path is/was involved in a directory/file conflict */
+	unsigned df_conflict:1;
+
+	/*
+	 * Whether this path is/was involved in a non-content conflict other
+	 * than a directory/file conflict (e.g. rename/rename, rename/delete,
+	 * file location based on possible directory rename).
+	 */
+	unsigned path_conflict:1;
+
+	/*
+	 * For filemask and dirmask, the ith bit corresponds to whether the
+	 * ith entry is a file (filemask) or a directory (dirmask).  Thus,
+	 * filemask & dirmask is always zero, and filemask | dirmask is at
+	 * most 7 but can be less when a path does not appear as either a
+	 * file or a directory on at least one side of history.
+	 *
+	 * Note that these masks are related to enum merge_side, as the ith
+	 * entry corresponds to side i.
+	 *
+	 * These values come from a traverse_trees() call; more info may be
+	 * found looking at tree-walk.h's struct traverse_info,
+	 * particularly the documentation above the "fn" member (note that
+	 * filemask = mask & ~dirmask from that documentation).
+	 */
+	unsigned filemask:3;
+	unsigned dirmask:3;
+
+	/*
+	 * Optimization to track which stages match, to avoid the need to
+	 * recompute it in multiple steps. Either 0 or at least 2 bits are
+	 * set; if at least 2 bits are set, their corresponding stages match.
+	 */
+	unsigned match_mask:3;
+};
+
+/*** Function Grouping: various utility functions ***/
+
+/*
+ * For the next three macros, see warning for conflict_info.merged.
+ *
+ * In each of the below, mi is a struct merged_info*, and ci was defined
+ * as a struct conflict_info* (but we need to verify ci isn't actually
+ * pointed at a struct merged_info*).
+ *
+ * INITIALIZE_CI: Assign ci to mi but only if it's safe; set to NULL otherwise.
+ * VERIFY_CI: Ensure that something we assigned to a conflict_info* is one.
+ * ASSIGN_AND_VERIFY_CI: Similar to VERIFY_CI but do assignment first.
+ */
+#define INITIALIZE_CI(ci, mi) do {                                           \
+	(ci) = (!(mi) || (mi)->clean) ? NULL : (struct conflict_info *)(mi); \
+} while (0)
+#define VERIFY_CI(ci) assert(ci && !ci->merged.clean);
+#define ASSIGN_AND_VERIFY_CI(ci, mi) do {    \
+	(ci) = (struct conflict_info *)(mi);  \
+	assert((ci) && !(mi)->clean);        \
+} while (0)
+
+static void free_strmap_strings(struct strmap *map)
+{
+	struct hashmap_iter iter;
+	struct strmap_entry *entry;
+
+	strmap_for_each_entry(map, &iter, entry) {
+		free((char*)entry->key);
+	}
+}
+
+static void clear_or_reinit_internal_opts(struct merge_options_internal *opti,
+					  int reinitialize)
+{
+	struct rename_info *renames = &opti->renames;
+	int i;
+	void (*strmap_func)(struct strmap *, int) =
+		reinitialize ? strmap_partial_clear : strmap_clear;
+	void (*strset_func)(struct strset *) =
+		reinitialize ? strset_partial_clear : strset_clear;
+
+	/*
+	 * We marked opti->paths with strdup_strings = 0, so that we
+	 * wouldn't have to make another copy of the fullpath created by
+	 * make_traverse_path from setup_path_info().  But, now that we've
+	 * used it and have no other references to these strings, it is time
+	 * to deallocate them.
+	 */
+	free_strmap_strings(&opti->paths);
+	strmap_func(&opti->paths, 1);
+
+	/*
+	 * All keys and values in opti->conflicted are a subset of those in
+	 * opti->paths.  We don't want to deallocate anything twice, so we
+	 * don't free the keys and we pass 0 for free_values.
+	 */
+	strmap_func(&opti->conflicted, 0);
+
+	/*
+	 * opti->paths_to_free is similar to opti->paths; we created it with
+	 * strdup_strings = 0 to avoid making _another_ copy of the fullpath
+	 * but now that we've used it and have no other references to these
+	 * strings, it is time to deallocate them.  We do so by temporarily
+	 * setting strdup_strings to 1.
+	 */
+	opti->paths_to_free.strdup_strings = 1;
+	string_list_clear(&opti->paths_to_free, 0);
+	opti->paths_to_free.strdup_strings = 0;
+
+	/* Free memory used by various renames maps */
+	for (i = MERGE_SIDE1; i <= MERGE_SIDE2; ++i) {
+		struct hashmap_iter iter;
+		struct strmap_entry *entry;
+
+		strset_func(&renames->dirs_removed[i]);
+
+		strmap_for_each_entry(&renames->dir_rename_count[i],
+				      &iter, entry) {
+			struct strintmap *counts = entry->value;
+			strintmap_clear(counts);
+		}
+		strmap_func(&renames->dir_rename_count[i], 1);
+
+		strmap_func(&renames->dir_renames[i], 0);
+	}
+
+	if (!reinitialize) {
+		struct hashmap_iter iter;
+		struct strmap_entry *e;
+
+		/* Release and free each strbuf found in output */
+		strmap_for_each_entry(&opti->output, &iter, e) {
+			struct strbuf *sb = e->value;
+			strbuf_release(sb);
+			/*
+			 * While strictly speaking we don't need to free(sb)
+			 * here because we could pass free_values=1 when
+			 * calling strmap_clear() on opti->output, that would
+			 * require strmap_clear to do another
+			 * strmap_for_each_entry() loop, so we just free it
+			 * while we're iterating anyway.
+			 */
+			free(sb);
+		}
+		strmap_clear(&opti->output, 0);
+	}
+}
+
+static int err(struct merge_options *opt, const char *err, ...)
+{
+	va_list params;
+	struct strbuf sb = STRBUF_INIT;
+
+	strbuf_addstr(&sb, "error: ");
+	va_start(params, err);
+	strbuf_vaddf(&sb, err, params);
+	va_end(params);
+
+	error("%s", sb.buf);
+	strbuf_release(&sb);
+
+	return -1;
+}
+
+static void format_commit(struct strbuf *sb,
+			  int indent,
+			  struct commit *commit)
+{
+	struct merge_remote_desc *desc;
+	struct pretty_print_context ctx = {0};
+	ctx.abbrev = DEFAULT_ABBREV;
+
+	strbuf_addchars(sb, ' ', indent);
+	desc = merge_remote_util(commit);
+	if (desc) {
+		strbuf_addf(sb, "virtual %s\n", desc->name);
+		return;
+	}
+
+	format_commit_message(commit, "%h %s", sb, &ctx);
+	strbuf_addch(sb, '\n');
+}
+
+__attribute__((format (printf, 4, 5)))
+static void path_msg(struct merge_options *opt,
+		     const char *path,
+		     int omittable_hint, /* skippable under --remerge-diff */
+		     const char *fmt, ...)
+{
+	va_list ap;
+	struct strbuf *sb = strmap_get(&opt->priv->output, path);
+	if (!sb) {
+		sb = xmalloc(sizeof(*sb));
+		strbuf_init(sb, 0);
+		strmap_put(&opt->priv->output, path, sb);
+	}
+
+	va_start(ap, fmt);
+	strbuf_vaddf(sb, fmt, ap);
+	va_end(ap);
+
+	strbuf_addch(sb, '\n');
+}
+
+/* add a string to a strbuf, but converting "/" to "_" */
+static void add_flattened_path(struct strbuf *out, const char *s)
+{
+	size_t i = out->len;
+	strbuf_addstr(out, s);
+	for (; i < out->len; i++)
+		if (out->buf[i] == '/')
+			out->buf[i] = '_';
+}
+
+static char *unique_path(struct strmap *existing_paths,
+			 const char *path,
+			 const char *branch)
+{
+	struct strbuf newpath = STRBUF_INIT;
+	int suffix = 0;
+	size_t base_len;
+
+	strbuf_addf(&newpath, "%s~", path);
+	add_flattened_path(&newpath, branch);
+
+	base_len = newpath.len;
+	while (strmap_contains(existing_paths, newpath.buf)) {
+		strbuf_setlen(&newpath, base_len);
+		strbuf_addf(&newpath, "_%d", suffix++);
+	}
+
+	return strbuf_detach(&newpath, NULL);
+}
+
+/*** Function Grouping: functions related to collect_merge_info() ***/
+
+static void setup_path_info(struct merge_options *opt,
+			    struct string_list_item *result,
+			    const char *current_dir_name,
+			    int current_dir_name_len,
+			    char *fullpath, /* we'll take over ownership */
+			    struct name_entry *names,
+			    struct name_entry *merged_version,
+			    unsigned is_null,     /* boolean */
+			    unsigned df_conflict, /* boolean */
+			    unsigned filemask,
+			    unsigned dirmask,
+			    int resolved          /* boolean */)
+{
+	/* result->util is void*, so mi is a convenience typed variable */
+	struct merged_info *mi;
+
+	assert(!is_null || resolved);
+	assert(!df_conflict || !resolved); /* df_conflict implies !resolved */
+	assert(resolved == (merged_version != NULL));
+
+	mi = xcalloc(1, resolved ? sizeof(struct merged_info) :
+				   sizeof(struct conflict_info));
+	mi->directory_name = current_dir_name;
+	mi->basename_offset = current_dir_name_len;
+	mi->clean = !!resolved;
+	if (resolved) {
+		mi->result.mode = merged_version->mode;
+		oidcpy(&mi->result.oid, &merged_version->oid);
+		mi->is_null = !!is_null;
+	} else {
+		int i;
+		struct conflict_info *ci;
+
+		ASSIGN_AND_VERIFY_CI(ci, mi);
+		for (i = MERGE_BASE; i <= MERGE_SIDE2; i++) {
+			ci->pathnames[i] = fullpath;
+			ci->stages[i].mode = names[i].mode;
+			oidcpy(&ci->stages[i].oid, &names[i].oid);
+		}
+		ci->filemask = filemask;
+		ci->dirmask = dirmask;
+		ci->df_conflict = !!df_conflict;
+		if (dirmask)
+			/*
+			 * Assume is_null for now, but if we have entries
+			 * under the directory then when it is complete in
+			 * write_completed_directory() it'll update this.
+			 * Also, for D/F conflicts, we have to handle the
+			 * directory first, then clear this bit and process
+			 * the file to see how it is handled -- that occurs
+			 * near the top of process_entry().
+			 */
+			mi->is_null = 1;
+	}
+	strmap_put(&opt->priv->paths, fullpath, mi);
+	result->string = fullpath;
+	result->util = mi;
+}
+
+static void add_pair(struct merge_options *opt,
+		     struct name_entry *names,
+		     const char *pathname,
+		     unsigned side,
+		     unsigned is_add /* if false, is_delete */)
+{
+	struct diff_filespec *one, *two;
+	struct rename_info *renames = &opt->priv->renames;
+	int names_idx = is_add ? side : 0;
+
+	one = alloc_filespec(pathname);
+	two = alloc_filespec(pathname);
+	fill_filespec(is_add ? two : one,
+		      &names[names_idx].oid, 1, names[names_idx].mode);
+	diff_queue(&renames->pairs[side], one, two);
+}
+
+static void collect_rename_info(struct merge_options *opt,
+				struct name_entry *names,
+				const char *dirname,
+				const char *fullname,
+				unsigned filemask,
+				unsigned dirmask,
+				unsigned match_mask)
+{
+	struct rename_info *renames = &opt->priv->renames;
+	unsigned side;
+
+	/* Update dirs_removed, as needed */
+	if (dirmask == 1 || dirmask == 3 || dirmask == 5) {
+		/* absent_mask = 0x07 - dirmask; sides = absent_mask/2 */
+		unsigned sides = (0x07 - dirmask)/2;
+		if (sides & 1)
+			strset_add(&renames->dirs_removed[1], fullname);
+		if (sides & 2)
+			strset_add(&renames->dirs_removed[2], fullname);
+	}
+
+	if (filemask == 0 || filemask == 7)
+		return;
+
+	for (side = MERGE_SIDE1; side <= MERGE_SIDE2; ++side) {
+		unsigned side_mask = (1 << side);
+
+		/* Check for deletion on side */
+		if ((filemask & 1) && !(filemask & side_mask))
+			add_pair(opt, names, fullname, side, 0 /* delete */);
+
+		/* Check for addition on side */
+		if (!(filemask & 1) && (filemask & side_mask))
+			add_pair(opt, names, fullname, side, 1 /* add */);
+	}
+}
+
+static int collect_merge_info_callback(int n,
+				       unsigned long mask,
+				       unsigned long dirmask,
+				       struct name_entry *names,
+				       struct traverse_info *info)
+{
+	/*
+	 * n is 3.  Always.
+	 * common ancestor (mbase) has mask 1, and stored in index 0 of names
+	 * head of side 1  (side1) has mask 2, and stored in index 1 of names
+	 * head of side 2  (side2) has mask 4, and stored in index 2 of names
+	 */
+	struct merge_options *opt = info->data;
+	struct merge_options_internal *opti = opt->priv;
+	struct string_list_item pi;  /* Path Info */
+	struct conflict_info *ci; /* typed alias to pi.util (which is void*) */
+	struct name_entry *p;
+	size_t len;
+	char *fullpath;
+	const char *dirname = opti->current_dir_name;
+	unsigned filemask = mask & ~dirmask;
+	unsigned match_mask = 0; /* will be updated below */
+	unsigned mbase_null = !(mask & 1);
+	unsigned side1_null = !(mask & 2);
+	unsigned side2_null = !(mask & 4);
+	unsigned side1_matches_mbase = (!side1_null && !mbase_null &&
+					names[0].mode == names[1].mode &&
+					oideq(&names[0].oid, &names[1].oid));
+	unsigned side2_matches_mbase = (!side2_null && !mbase_null &&
+					names[0].mode == names[2].mode &&
+					oideq(&names[0].oid, &names[2].oid));
+	unsigned sides_match = (!side1_null && !side2_null &&
+				names[1].mode == names[2].mode &&
+				oideq(&names[1].oid, &names[2].oid));
+
+	/*
+	 * Note: When a path is a file on one side of history and a directory
+	 * in another, we have a directory/file conflict.  In such cases, if
+	 * the conflict doesn't resolve from renames and deletions, then we
+	 * always leave directories where they are and move files out of the
+	 * way.  Thus, while struct conflict_info has a df_conflict field to
+	 * track such conflicts, we ignore that field for any directories at
+	 * a path and only pay attention to it for files at the given path.
+	 * The fact that we leave directories were they are also means that
+	 * we do not need to worry about getting additional df_conflict
+	 * information propagated from parent directories down to children
+	 * (unlike, say traverse_trees_recursive() in unpack-trees.c, which
+	 * sets a newinfo.df_conflicts field specifically to propagate it).
+	 */
+	unsigned df_conflict = (filemask != 0) && (dirmask != 0);
+
+	/* n = 3 is a fundamental assumption. */
+	if (n != 3)
+		BUG("Called collect_merge_info_callback wrong");
+
+	/*
+	 * A bunch of sanity checks verifying that traverse_trees() calls
+	 * us the way I expect.  Could just remove these at some point,
+	 * though maybe they are helpful to future code readers.
+	 */
+	assert(mbase_null == is_null_oid(&names[0].oid));
+	assert(side1_null == is_null_oid(&names[1].oid));
+	assert(side2_null == is_null_oid(&names[2].oid));
+	assert(!mbase_null || !side1_null || !side2_null);
+	assert(mask > 0 && mask < 8);
+
+	/* Determine match_mask */
+	if (side1_matches_mbase)
+		match_mask = (side2_matches_mbase ? 7 : 3);
+	else if (side2_matches_mbase)
+		match_mask = 5;
+	else if (sides_match)
+		match_mask = 6;
+
+	/*
+	 * Get the name of the relevant filepath, which we'll pass to
+	 * setup_path_info() for tracking.
+	 */
+	p = names;
+	while (!p->mode)
+		p++;
+	len = traverse_path_len(info, p->pathlen);
+
+	/* +1 in both of the following lines to include the NUL byte */
+	fullpath = xmalloc(len + 1);
+	make_traverse_path(fullpath, len + 1, info, p->path, p->pathlen);
+
+	/*
+	 * If mbase, side1, and side2 all match, we can resolve early.  Even
+	 * if these are trees, there will be no renames or anything
+	 * underneath.
+	 */
+	if (side1_matches_mbase && side2_matches_mbase) {
+		/* mbase, side1, & side2 all match; use mbase as resolution */
+		setup_path_info(opt, &pi, dirname, info->pathlen, fullpath,
+				names, names+0, mbase_null, 0,
+				filemask, dirmask, 1);
+		return mask;
+	}
+
+	/*
+	 * Gather additional information used in rename detection.
+	 */
+	collect_rename_info(opt, names, dirname, fullpath,
+			    filemask, dirmask, match_mask);
+
+	/*
+	 * Record information about the path so we can resolve later in
+	 * process_entries.
+	 */
+	setup_path_info(opt, &pi, dirname, info->pathlen, fullpath,
+			names, NULL, 0, df_conflict, filemask, dirmask, 0);
+
+	ci = pi.util;
+	VERIFY_CI(ci);
+	ci->match_mask = match_mask;
+
+	/* If dirmask, recurse into subdirectories */
+	if (dirmask) {
+		struct traverse_info newinfo;
+		struct tree_desc t[3];
+		void *buf[3] = {NULL, NULL, NULL};
+		const char *original_dir_name;
+		int i, ret;
+
+		ci->match_mask &= filemask;
+		newinfo = *info;
+		newinfo.prev = info;
+		newinfo.name = p->path;
+		newinfo.namelen = p->pathlen;
+		newinfo.pathlen = st_add3(newinfo.pathlen, p->pathlen, 1);
+		/*
+		 * If this directory we are about to recurse into cared about
+		 * its parent directory (the current directory) having a D/F
+		 * conflict, then we'd propagate the masks in this way:
+		 *    newinfo.df_conflicts |= (mask & ~dirmask);
+		 * But we don't worry about propagating D/F conflicts.  (See
+		 * comment near setting of local df_conflict variable near
+		 * the beginning of this function).
+		 */
+
+		for (i = MERGE_BASE; i <= MERGE_SIDE2; i++) {
+			if (i == 1 && side1_matches_mbase)
+				t[1] = t[0];
+			else if (i == 2 && side2_matches_mbase)
+				t[2] = t[0];
+			else if (i == 2 && sides_match)
+				t[2] = t[1];
+			else {
+				const struct object_id *oid = NULL;
+				if (dirmask & 1)
+					oid = &names[i].oid;
+				buf[i] = fill_tree_descriptor(opt->repo,
+							      t + i, oid);
+			}
+			dirmask >>= 1;
+		}
+
+		original_dir_name = opti->current_dir_name;
+		opti->current_dir_name = pi.string;
+		ret = traverse_trees(NULL, 3, t, &newinfo);
+		opti->current_dir_name = original_dir_name;
+
+		for (i = MERGE_BASE; i <= MERGE_SIDE2; i++)
+			free(buf[i]);
+
+		if (ret < 0)
+			return -1;
+	}
+
+	return mask;
+}
+
+static int collect_merge_info(struct merge_options *opt,
+			      struct tree *merge_base,
+			      struct tree *side1,
+			      struct tree *side2)
+{
+	int ret;
+	struct tree_desc t[3];
+	struct traverse_info info;
+
+	opt->priv->toplevel_dir = "";
+	opt->priv->current_dir_name = opt->priv->toplevel_dir;
+	setup_traverse_info(&info, opt->priv->toplevel_dir);
+	info.fn = collect_merge_info_callback;
+	info.data = opt;
+	info.show_all_errors = 1;
+
+	parse_tree(merge_base);
+	parse_tree(side1);
+	parse_tree(side2);
+	init_tree_desc(t + 0, merge_base->buffer, merge_base->size);
+	init_tree_desc(t + 1, side1->buffer, side1->size);
+	init_tree_desc(t + 2, side2->buffer, side2->size);
+
+	trace2_region_enter("merge", "traverse_trees", opt->repo);
+	ret = traverse_trees(NULL, 3, t, &info);
+	trace2_region_leave("merge", "traverse_trees", opt->repo);
+
+	return ret;
+}
+
+/*** Function Grouping: functions related to threeway content merges ***/
+
+static int find_first_merges(struct repository *repo,
+			     const char *path,
+			     struct commit *a,
+			     struct commit *b,
+			     struct object_array *result)
+{
+	int i, j;
+	struct object_array merges = OBJECT_ARRAY_INIT;
+	struct commit *commit;
+	int contains_another;
+
+	char merged_revision[GIT_MAX_HEXSZ + 2];
+	const char *rev_args[] = { "rev-list", "--merges", "--ancestry-path",
+				   "--all", merged_revision, NULL };
+	struct rev_info revs;
+	struct setup_revision_opt rev_opts;
+
+	memset(result, 0, sizeof(struct object_array));
+	memset(&rev_opts, 0, sizeof(rev_opts));
+
+	/* get all revisions that merge commit a */
+	xsnprintf(merged_revision, sizeof(merged_revision), "^%s",
+		  oid_to_hex(&a->object.oid));
+	repo_init_revisions(repo, &revs, NULL);
+	rev_opts.submodule = path;
+	/* FIXME: can't handle linked worktrees in submodules yet */
+	revs.single_worktree = path != NULL;
+	setup_revisions(ARRAY_SIZE(rev_args)-1, rev_args, &revs, &rev_opts);
+
+	/* save all revisions from the above list that contain b */
+	if (prepare_revision_walk(&revs))
+		die("revision walk setup failed");
+	while ((commit = get_revision(&revs)) != NULL) {
+		struct object *o = &(commit->object);
+		if (in_merge_bases(b, commit))
+			add_object_array(o, NULL, &merges);
+	}
+	reset_revision_walk();
+
+	/* Now we've got all merges that contain a and b. Prune all
+	 * merges that contain another found merge and save them in
+	 * result.
+	 */
+	for (i = 0; i < merges.nr; i++) {
+		struct commit *m1 = (struct commit *) merges.objects[i].item;
+
+		contains_another = 0;
+		for (j = 0; j < merges.nr; j++) {
+			struct commit *m2 = (struct commit *) merges.objects[j].item;
+			if (i != j && in_merge_bases(m2, m1)) {
+				contains_another = 1;
+				break;
+			}
+		}
+
+		if (!contains_another)
+			add_object_array(merges.objects[i].item, NULL, result);
+	}
+
+	object_array_clear(&merges);
+	return result->nr;
+}
+
+static int merge_submodule(struct merge_options *opt,
+			   const char *path,
+			   const struct object_id *o,
+			   const struct object_id *a,
+			   const struct object_id *b,
+			   struct object_id *result)
+{
+	struct commit *commit_o, *commit_a, *commit_b;
+	int parent_count;
+	struct object_array merges;
+	struct strbuf sb = STRBUF_INIT;
+
+	int i;
+	int search = !opt->priv->call_depth;
+
+	/* store fallback answer in result in case we fail */
+	oidcpy(result, opt->priv->call_depth ? o : a);
+
+	/* we can not handle deletion conflicts */
+	if (is_null_oid(o))
+		return 0;
+	if (is_null_oid(a))
+		return 0;
+	if (is_null_oid(b))
+		return 0;
+
+	if (add_submodule_odb(path)) {
+		path_msg(opt, path, 0,
+			 _("Failed to merge submodule %s (not checked out)"),
+			 path);
+		return 0;
+	}
+
+	if (!(commit_o = lookup_commit_reference(opt->repo, o)) ||
+	    !(commit_a = lookup_commit_reference(opt->repo, a)) ||
+	    !(commit_b = lookup_commit_reference(opt->repo, b))) {
+		path_msg(opt, path, 0,
+			 _("Failed to merge submodule %s (commits not present)"),
+			 path);
+		return 0;
+	}
+
+	/* check whether both changes are forward */
+	if (!in_merge_bases(commit_o, commit_a) ||
+	    !in_merge_bases(commit_o, commit_b)) {
+		path_msg(opt, path, 0,
+			 _("Failed to merge submodule %s "
+			   "(commits don't follow merge-base)"),
+			 path);
+		return 0;
+	}
+
+	/* Case #1: a is contained in b or vice versa */
+	if (in_merge_bases(commit_a, commit_b)) {
+		oidcpy(result, b);
+		path_msg(opt, path, 1,
+			 _("Note: Fast-forwarding submodule %s to %s"),
+			 path, oid_to_hex(b));
+		return 1;
+	}
+	if (in_merge_bases(commit_b, commit_a)) {
+		oidcpy(result, a);
+		path_msg(opt, path, 1,
+			 _("Note: Fast-forwarding submodule %s to %s"),
+			 path, oid_to_hex(a));
+		return 1;
+	}
+
+	/*
+	 * Case #2: There are one or more merges that contain a and b in
+	 * the submodule. If there is only one, then present it as a
+	 * suggestion to the user, but leave it marked unmerged so the
+	 * user needs to confirm the resolution.
+	 */
+
+	/* Skip the search if makes no sense to the calling context.  */
+	if (!search)
+		return 0;
+
+	/* find commit which merges them */
+	parent_count = find_first_merges(opt->repo, path, commit_a, commit_b,
+					 &merges);
+	switch (parent_count) {
+	case 0:
+		path_msg(opt, path, 0, _("Failed to merge submodule %s"), path);
+		break;
+
+	case 1:
+		format_commit(&sb, 4,
+			      (struct commit *)merges.objects[0].item);
+		path_msg(opt, path, 0,
+			 _("Failed to merge submodule %s, but a possible merge "
+			   "resolution exists:\n%s\n"),
+			 path, sb.buf);
+		path_msg(opt, path, 1,
+			 _("If this is correct simply add it to the index "
+			   "for example\n"
+			   "by using:\n\n"
+			   "  git update-index --cacheinfo 160000 %s \"%s\"\n\n"
+			   "which will accept this suggestion.\n"),
+			 oid_to_hex(&merges.objects[0].item->oid), path);
+		strbuf_release(&sb);
+		break;
+	default:
+		for (i = 0; i < merges.nr; i++)
+			format_commit(&sb, 4,
+				      (struct commit *)merges.objects[i].item);
+		path_msg(opt, path, 0,
+			 _("Failed to merge submodule %s, but multiple "
+			   "possible merges exist:\n%s"), path, sb.buf);
+		strbuf_release(&sb);
+	}
+
+	object_array_clear(&merges);
+	return 0;
+}
+
+static int merge_3way(struct merge_options *opt,
+		      const char *path,
+		      const struct object_id *o,
+		      const struct object_id *a,
+		      const struct object_id *b,
+		      const char *pathnames[3],
+		      const int extra_marker_size,
+		      mmbuffer_t *result_buf)
+{
+	mmfile_t orig, src1, src2;
+	struct ll_merge_options ll_opts = {0};
+	char *base, *name1, *name2;
+	int merge_status;
+
+	ll_opts.renormalize = opt->renormalize;
+	ll_opts.extra_marker_size = extra_marker_size;
+	ll_opts.xdl_opts = opt->xdl_opts;
+
+	if (opt->priv->call_depth) {
+		ll_opts.virtual_ancestor = 1;
+		ll_opts.variant = 0;
+	} else {
+		switch (opt->recursive_variant) {
+		case MERGE_VARIANT_OURS:
+			ll_opts.variant = XDL_MERGE_FAVOR_OURS;
+			break;
+		case MERGE_VARIANT_THEIRS:
+			ll_opts.variant = XDL_MERGE_FAVOR_THEIRS;
+			break;
+		default:
+			ll_opts.variant = 0;
+			break;
+		}
+	}
+
+	assert(pathnames[0] && pathnames[1] && pathnames[2] && opt->ancestor);
+	if (pathnames[0] == pathnames[1] && pathnames[1] == pathnames[2]) {
+		base  = mkpathdup("%s", opt->ancestor);
+		name1 = mkpathdup("%s", opt->branch1);
+		name2 = mkpathdup("%s", opt->branch2);
+	} else {
+		base  = mkpathdup("%s:%s", opt->ancestor, pathnames[0]);
+		name1 = mkpathdup("%s:%s", opt->branch1,  pathnames[1]);
+		name2 = mkpathdup("%s:%s", opt->branch2,  pathnames[2]);
+	}
+
+	read_mmblob(&orig, o);
+	read_mmblob(&src1, a);
+	read_mmblob(&src2, b);
+
+	merge_status = ll_merge(result_buf, path, &orig, base,
+				&src1, name1, &src2, name2,
+				opt->repo->index, &ll_opts);
+
+	free(base);
+	free(name1);
+	free(name2);
+	free(orig.ptr);
+	free(src1.ptr);
+	free(src2.ptr);
+	return merge_status;
+}
+
+static int handle_content_merge(struct merge_options *opt,
+				const char *path,
+				const struct version_info *o,
+				const struct version_info *a,
+				const struct version_info *b,
+				const char *pathnames[3],
+				const int extra_marker_size,
+				struct version_info *result)
+{
+	/*
+	 * path is the target location where we want to put the file, and
+	 * is used to determine any normalization rules in ll_merge.
+	 *
+	 * The normal case is that path and all entries in pathnames are
+	 * identical, though renames can affect which path we got one of
+	 * the three blobs to merge on various sides of history.
+	 *
+	 * extra_marker_size is the amount to extend conflict markers in
+	 * ll_merge; this is neeed if we have content merges of content
+	 * merges, which happens for example with rename/rename(2to1) and
+	 * rename/add conflicts.
+	 */
+	unsigned clean = 1;
+
+	/*
+	 * handle_content_merge() needs both files to be of the same type, i.e.
+	 * both files OR both submodules OR both symlinks.  Conflicting types
+	 * needs to be handled elsewhere.
+	 */
+	assert((S_IFMT & a->mode) == (S_IFMT & b->mode));
+
+	/* Merge modes */
+	if (a->mode == b->mode || a->mode == o->mode)
+		result->mode = b->mode;
+	else {
+		/* must be the 100644/100755 case */
+		assert(S_ISREG(a->mode));
+		result->mode = a->mode;
+		clean = (b->mode == o->mode);
+		/*
+		 * FIXME: If opt->priv->call_depth && !clean, then we really
+		 * should not make result->mode match either a->mode or
+		 * b->mode; that causes t6036 "check conflicting mode for
+		 * regular file" to fail.  It would be best to use some other
+		 * mode, but we'll confuse all kinds of stuff if we use one
+		 * where S_ISREG(result->mode) isn't true, and if we use
+		 * something like 0100666, then tree-walk.c's calls to
+		 * canon_mode() will just normalize that to 100644 for us and
+		 * thus not solve anything.
+		 *
+		 * Figure out if there's some kind of way we can work around
+		 * this...
+		 */
+	}
+
+	/*
+	 * Trivial oid merge.
+	 *
+	 * Note: While one might assume that the next four lines would
+	 * be unnecessary due to the fact that match_mask is often
+	 * setup and already handled, renames don't always take care
+	 * of that.
+	 */
+	if (oideq(&a->oid, &b->oid) || oideq(&a->oid, &o->oid))
+		oidcpy(&result->oid, &b->oid);
+	else if (oideq(&b->oid, &o->oid))
+		oidcpy(&result->oid, &a->oid);
+
+	/* Remaining rules depend on file vs. submodule vs. symlink. */
+	else if (S_ISREG(a->mode)) {
+		mmbuffer_t result_buf;
+		int ret = 0, merge_status;
+		int two_way;
+
+		/*
+		 * If 'o' is different type, treat it as null so we do a
+		 * two-way merge.
+		 */
+		two_way = ((S_IFMT & o->mode) != (S_IFMT & a->mode));
+
+		merge_status = merge_3way(opt, path,
+					  two_way ? &null_oid : &o->oid,
+					  &a->oid, &b->oid,
+					  pathnames, extra_marker_size,
+					  &result_buf);
+
+		if ((merge_status < 0) || !result_buf.ptr)
+			ret = err(opt, _("Failed to execute internal merge"));
+
+		if (!ret &&
+		    write_object_file(result_buf.ptr, result_buf.size,
+				      blob_type, &result->oid))
+			ret = err(opt, _("Unable to add %s to database"),
+				  path);
+
+		free(result_buf.ptr);
+		if (ret)
+			return -1;
+		clean &= (merge_status == 0);
+		path_msg(opt, path, 1, _("Auto-merging %s"), path);
+	} else if (S_ISGITLINK(a->mode)) {
+		int two_way = ((S_IFMT & o->mode) != (S_IFMT & a->mode));
+		clean = merge_submodule(opt, pathnames[0],
+					two_way ? &null_oid : &o->oid,
+					&a->oid, &b->oid, &result->oid);
+		if (opt->priv->call_depth && two_way && !clean) {
+			result->mode = o->mode;
+			oidcpy(&result->oid, &o->oid);
+		}
+	} else if (S_ISLNK(a->mode)) {
+		if (opt->priv->call_depth) {
+			clean = 0;
+			result->mode = o->mode;
+			oidcpy(&result->oid, &o->oid);
+		} else {
+			switch (opt->recursive_variant) {
+			case MERGE_VARIANT_NORMAL:
+				clean = 0;
+				oidcpy(&result->oid, &a->oid);
+				break;
+			case MERGE_VARIANT_OURS:
+				oidcpy(&result->oid, &a->oid);
+				break;
+			case MERGE_VARIANT_THEIRS:
+				oidcpy(&result->oid, &b->oid);
+				break;
+			}
+		}
+	} else
+		BUG("unsupported object type in the tree: %06o for %s",
+		    a->mode, path);
+
+	return clean;
+}
+
+/*** Function Grouping: functions related to detect_and_process_renames(), ***
+ *** which are split into directory and regular rename detection sections. ***/
+
+/*** Function Grouping: functions related to directory rename detection ***/
+
+struct collision_info {
+	struct string_list source_files;
+	unsigned reported_already:1;
+};
+
+/*
+ * Return a new string that replaces the beginning portion (which matches
+ * rename_info->key), with rename_info->util.new_dir.  In perl-speak:
+ *   new_path_name = (old_path =~ s/rename_info->key/rename_info->value/);
+ * NOTE:
+ *   Caller must ensure that old_path starts with rename_info->key + '/'.
+ */
+static char *apply_dir_rename(struct strmap_entry *rename_info,
+			      const char *old_path)
+{
+	struct strbuf new_path = STRBUF_INIT;
+	const char *old_dir = rename_info->key;
+	const char *new_dir = rename_info->value;
+	int oldlen, newlen, new_dir_len;
+
+	oldlen = strlen(old_dir);
+	if (*new_dir == '\0')
+		/*
+		 * If someone renamed/merged a subdirectory into the root
+		 * directory (e.g. 'some/subdir' -> ''), then we want to
+		 * avoid returning
+		 *     '' + '/filename'
+		 * as the rename; we need to make old_path + oldlen advance
+		 * past the '/' character.
+		 */
+		oldlen++;
+	new_dir_len = strlen(new_dir);
+	newlen = new_dir_len + (strlen(old_path) - oldlen) + 1;
+	strbuf_grow(&new_path, newlen);
+	strbuf_add(&new_path, new_dir, new_dir_len);
+	strbuf_addstr(&new_path, &old_path[oldlen]);
+
+	return strbuf_detach(&new_path, NULL);
+}
+
+static int path_in_way(struct strmap *paths, const char *path, unsigned side_mask)
+{
+	struct merged_info *mi = strmap_get(paths, path);
+	struct conflict_info *ci;
+	if (!mi)
+		return 0;
+	INITIALIZE_CI(ci, mi);
+	return mi->clean || (side_mask & (ci->filemask | ci->dirmask));
+}
+
+/*
+ * See if there is a directory rename for path, and if there are any file
+ * level conflicts on the given side for the renamed location.  If there is
+ * a rename and there are no conflicts, return the new name.  Otherwise,
+ * return NULL.
+ */
+static char *handle_path_level_conflicts(struct merge_options *opt,
+					 const char *path,
+					 unsigned side_index,
+					 struct strmap_entry *rename_info,
+					 struct strmap *collisions)
+{
+	char *new_path = NULL;
+	struct collision_info *c_info;
+	int clean = 1;
+	struct strbuf collision_paths = STRBUF_INIT;
+
+	/*
+	 * entry has the mapping of old directory name to new directory name
+	 * that we want to apply to path.
+	 */
+	new_path = apply_dir_rename(rename_info, path);
+	if (!new_path)
+		BUG("Failed to apply directory rename!");
+
+	/*
+	 * The caller needs to have ensured that it has pre-populated
+	 * collisions with all paths that map to new_path.  Do a quick check
+	 * to ensure that's the case.
+	 */
+	c_info = strmap_get(collisions, new_path);
+	if (c_info == NULL)
+		BUG("c_info is NULL");
+
+	/*
+	 * Check for one-sided add/add/.../add conflicts, i.e.
+	 * where implicit renames from the other side doing
+	 * directory rename(s) can affect this side of history
+	 * to put multiple paths into the same location.  Warn
+	 * and bail on directory renames for such paths.
+	 */
+	if (c_info->reported_already) {
+		clean = 0;
+	} else if (path_in_way(&opt->priv->paths, new_path, 1 << side_index)) {
+		c_info->reported_already = 1;
+		strbuf_add_separated_string_list(&collision_paths, ", ",
+						 &c_info->source_files);
+		path_msg(opt, new_path, 0,
+			 _("CONFLICT (implicit dir rename): Existing file/dir "
+			   "at %s in the way of implicit directory rename(s) "
+			   "putting the following path(s) there: %s."),
+		       new_path, collision_paths.buf);
+		clean = 0;
+	} else if (c_info->source_files.nr > 1) {
+		c_info->reported_already = 1;
+		strbuf_add_separated_string_list(&collision_paths, ", ",
+						 &c_info->source_files);
+		path_msg(opt, new_path, 0,
+			 _("CONFLICT (implicit dir rename): Cannot map more "
+			   "than one path to %s; implicit directory renames "
+			   "tried to put these paths there: %s"),
+		       new_path, collision_paths.buf);
+		clean = 0;
+	}
+
+	/* Free memory we no longer need */
+	strbuf_release(&collision_paths);
+	if (!clean && new_path) {
+		free(new_path);
+		return NULL;
+	}
+
+	return new_path;
+}
+
+static void dirname_munge(char *filename)
+{
+	char *slash = strrchr(filename, '/');
+	if (!slash)
+		slash = filename;
+	*slash = '\0';
+}
+
+static void increment_count(struct strmap *dir_rename_count,
+			    char *old_dir,
+			    char *new_dir)
+{
+	struct strintmap *counts;
+	struct strmap_entry *e;
+
+	/* Get the {new_dirs -> counts} mapping using old_dir */
+	e = strmap_get_entry(dir_rename_count, old_dir);
+	if (e) {
+		counts = e->value;
+	} else {
+		counts = xmalloc(sizeof(*counts));
+		strintmap_init_with_options(counts, 0, NULL, 1);
+		strmap_put(dir_rename_count, old_dir, counts);
+	}
+
+	/* Increment the count for new_dir */
+	strintmap_incr(counts, new_dir, 1);
+}
+
+static void update_dir_rename_counts(struct strmap *dir_rename_count,
+				     struct strset *dirs_removed,
+				     const char *oldname,
+				     const char *newname)
+{
+	char *old_dir = xstrdup(oldname);
+	char *new_dir = xstrdup(newname);
+	char new_dir_first_char = new_dir[0];
+	int first_time_in_loop = 1;
+
+	while (1) {
+		dirname_munge(old_dir);
+		dirname_munge(new_dir);
+
+		/*
+		 * When renaming
+		 *   "a/b/c/d/e/foo.c" -> "a/b/some/thing/else/e/foo.c"
+		 * then this suggests that both
+		 *   a/b/c/d/e/ => a/b/some/thing/else/e/
+		 *   a/b/c/d/   => a/b/some/thing/else/
+		 * so we want to increment counters for both.  We do NOT,
+		 * however, also want to suggest that there was the following
+		 * rename:
+		 *   a/b/c/ => a/b/some/thing/
+		 * so we need to quit at that point.
+		 *
+		 * Note the when first_time_in_loop, we only strip off the
+		 * basename, and we don't care if that's different.
+		 */
+		if (!first_time_in_loop) {
+			char *old_sub_dir = strchr(old_dir, '\0')+1;
+			char *new_sub_dir = strchr(new_dir, '\0')+1;
+			if (!*new_dir) {
+				/*
+				 * Special case when renaming to root directory,
+				 * i.e. when new_dir == "".  In this case, we had
+				 * something like
+				 *    a/b/subdir => subdir
+				 * and so dirname_munge() sets things up so that
+				 *    old_dir = "a/b\0subdir\0"
+				 *    new_dir = "\0ubdir\0"
+				 * We didn't have a '/' to overwrite a '\0' onto
+				 * in new_dir, so we have to compare differently.
+				 */
+				if (new_dir_first_char != old_sub_dir[0] ||
+				    strcmp(old_sub_dir+1, new_sub_dir))
+					break;
+			} else {
+				if (strcmp(old_sub_dir, new_sub_dir))
+					break;
+			}
+		}
+
+		if (strset_contains(dirs_removed, old_dir))
+			increment_count(dir_rename_count, old_dir, new_dir);
+		else
+			break;
+
+		/* If we hit toplevel directory ("") for old or new dir, quit */
+		if (!*old_dir || !*new_dir)
+			break;
+
+		first_time_in_loop = 0;
+	}
+
+	/* Free resources we don't need anymore */
+	free(old_dir);
+	free(new_dir);
+}
+
+static void compute_rename_counts(struct diff_queue_struct *pairs,
+				  struct strmap *dir_rename_count,
+				  struct strset *dirs_removed)
+{
+	int i;
+
+	for (i = 0; i < pairs->nr; ++i) {
+		struct diff_filepair *pair = pairs->queue[i];
+
+		/* File not part of directory rename if it wasn't renamed */
+		if (pair->status != 'R')
+			continue;
+
+		/*
+		 * Make dir_rename_count contain a map of a map:
+		 *   old_directory -> {new_directory -> count}
+		 * In other words, for every pair look at the directories for
+		 * the old filename and the new filename and count how many
+		 * times that pairing occurs.
+		 */
+		update_dir_rename_counts(dir_rename_count, dirs_removed,
+					 pair->one->path,
+					 pair->two->path);
+	}
+}
+
+static void get_provisional_directory_renames(struct merge_options *opt,
+					      unsigned side,
+					      int *clean)
+{
+	struct hashmap_iter iter;
+	struct strmap_entry *entry;
+	struct rename_info *renames = &opt->priv->renames;
+
+	compute_rename_counts(&renames->pairs[side],
+			      &renames->dir_rename_count[side],
+			      &renames->dirs_removed[side]);
+	/*
+	 * Collapse
+	 *    dir_rename_count: old_directory -> {new_directory -> count}
+	 * down to
+	 *    dir_renames: old_directory -> best_new_directory
+	 * where best_new_directory is the one with the unique highest count.
+	 */
+	strmap_for_each_entry(&renames->dir_rename_count[side], &iter, entry) {
+		const char *source_dir = entry->key;
+		struct strintmap *counts = entry->value;
+		struct hashmap_iter count_iter;
+		struct strmap_entry *count_entry;
+		int max = 0;
+		int bad_max = 0;
+		const char *best = NULL;
+
+		strintmap_for_each_entry(counts, &count_iter, count_entry) {
+			const char *target_dir = count_entry->key;
+			intptr_t count = (intptr_t)count_entry->value;
+
+			if (count == max)
+				bad_max = max;
+			else if (count > max) {
+				max = count;
+				best = target_dir;
+			}
+		}
+
+		if (bad_max == max) {
+			path_msg(opt, source_dir, 0,
+			       _("CONFLICT (directory rename split): "
+				 "Unclear where to rename %s to; it was "
+				 "renamed to multiple other directories, with "
+				 "no destination getting a majority of the "
+				 "files."),
+			       source_dir);
+			/*
+			 * We should mark this as unclean IF something attempts
+			 * to use this rename.  We do not yet have the logic
+			 * in place to detect if this directory rename is being
+			 * used, and optimizations that reduce the number of
+			 * renames cause this to falsely trigger.  For now,
+			 * just disable it, causing t6423 testcase 2a to break.
+			 * We'll later fix the detection, and when we do we
+			 * will re-enable setting *clean to 0 (and thereby fix
+			 * t6423 testcase 2a).
+			 */
+			/*   *clean = 0;   */
+		} else {
+			strmap_put(&renames->dir_renames[side],
+				   source_dir, (void*)best);
+		}
+	}
+}
+
+static void handle_directory_level_conflicts(struct merge_options *opt)
+{
+	struct hashmap_iter iter;
+	struct strmap_entry *entry;
+	struct string_list duplicated = STRING_LIST_INIT_NODUP;
+	struct rename_info *renames = &opt->priv->renames;
+	struct strmap *side1_dir_renames = &renames->dir_renames[MERGE_SIDE1];
+	struct strmap *side2_dir_renames = &renames->dir_renames[MERGE_SIDE2];
+	int i;
+
+	strmap_for_each_entry(side1_dir_renames, &iter, entry) {
+		if (strmap_contains(side2_dir_renames, entry->key))
+			string_list_append(&duplicated, entry->key);
+	}
+
+	for (i = 0; i < duplicated.nr; i++) {
+		strmap_remove(side1_dir_renames, duplicated.items[i].string, 0);
+		strmap_remove(side2_dir_renames, duplicated.items[i].string, 0);
+	}
+	string_list_clear(&duplicated, 0);
+}
+
+static struct strmap_entry *check_dir_renamed(const char *path,
+					      struct strmap *dir_renames)
+{
+	char *temp = xstrdup(path);
+	char *end;
+	struct strmap_entry *e = NULL;
+
+	while ((end = strrchr(temp, '/'))) {
+		*end = '\0';
+		e = strmap_get_entry(dir_renames, temp);
+		if (e)
+			break;
+	}
+	free(temp);
+	return e;
+}
+
+static void compute_collisions(struct strmap *collisions,
+			       struct strmap *dir_renames,
+			       struct diff_queue_struct *pairs)
+{
+	int i;
+
+	strmap_init_with_options(collisions, NULL, 0);
+	if (strmap_empty(dir_renames))
+		return;
+
+	/*
+	 * Multiple files can be mapped to the same path due to directory
+	 * renames done by the other side of history.  Since that other
+	 * side of history could have merged multiple directories into one,
+	 * if our side of history added the same file basename to each of
+	 * those directories, then all N of them would get implicitly
+	 * renamed by the directory rename detection into the same path,
+	 * and we'd get an add/add/.../add conflict, and all those adds
+	 * from *this* side of history.  This is not representable in the
+	 * index, and users aren't going to easily be able to make sense of
+	 * it.  So we need to provide a good warning about what's
+	 * happening, and fall back to no-directory-rename detection
+	 * behavior for those paths.
+	 *
+	 * See testcases 9e and all of section 5 from t6043 for examples.
+	 */
+	for (i = 0; i < pairs->nr; ++i) {
+		struct strmap_entry *rename_info;
+		struct collision_info *collision_info;
+		char *new_path;
+		struct diff_filepair *pair = pairs->queue[i];
+
+		if (pair->status != 'A' && pair->status != 'R')
+			continue;
+		rename_info = check_dir_renamed(pair->two->path, dir_renames);
+		if (!rename_info)
+			continue;
+
+		new_path = apply_dir_rename(rename_info, pair->two->path);
+		assert(new_path);
+		collision_info = strmap_get(collisions, new_path);
+		if (collision_info) {
+			free(new_path);
+		} else {
+			CALLOC_ARRAY(collision_info, 1);
+			string_list_init(&collision_info->source_files, 0);
+			strmap_put(collisions, new_path, collision_info);
+		}
+		string_list_insert(&collision_info->source_files,
+				   pair->two->path);
+	}
+}
+
+static char *check_for_directory_rename(struct merge_options *opt,
+					const char *path,
+					unsigned side_index,
+					struct strmap *dir_renames,
+					struct strmap *dir_rename_exclusions,
+					struct strmap *collisions,
+					int *clean_merge)
+{
+	char *new_path = NULL;
+	struct strmap_entry *rename_info;
+	struct strmap_entry *otherinfo = NULL;
+	const char *new_dir;
+
+	if (strmap_empty(dir_renames))
+		return new_path;
+	rename_info = check_dir_renamed(path, dir_renames);
+	if (!rename_info)
+		return new_path;
+	/* old_dir = rename_info->key; */
+	new_dir = rename_info->value;
+
+	/*
+	 * This next part is a little weird.  We do not want to do an
+	 * implicit rename into a directory we renamed on our side, because
+	 * that will result in a spurious rename/rename(1to2) conflict.  An
+	 * example:
+	 *   Base commit: dumbdir/afile, otherdir/bfile
+	 *   Side 1:      smrtdir/afile, otherdir/bfile
+	 *   Side 2:      dumbdir/afile, dumbdir/bfile
+	 * Here, while working on Side 1, we could notice that otherdir was
+	 * renamed/merged to dumbdir, and change the diff_filepair for
+	 * otherdir/bfile into a rename into dumbdir/bfile.  However, Side
+	 * 2 will notice the rename from dumbdir to smrtdir, and do the
+	 * transitive rename to move it from dumbdir/bfile to
+	 * smrtdir/bfile.  That gives us bfile in dumbdir vs being in
+	 * smrtdir, a rename/rename(1to2) conflict.  We really just want
+	 * the file to end up in smrtdir.  And the way to achieve that is
+	 * to not let Side1 do the rename to dumbdir, since we know that is
+	 * the source of one of our directory renames.
+	 *
+	 * That's why otherinfo and dir_rename_exclusions is here.
+	 *
+	 * As it turns out, this also prevents N-way transient rename
+	 * confusion; See testcases 9c and 9d of t6043.
+	 */
+	otherinfo = strmap_get_entry(dir_rename_exclusions, new_dir);
+	if (otherinfo) {
+		path_msg(opt, rename_info->key, 1,
+			 _("WARNING: Avoiding applying %s -> %s rename "
+			   "to %s, because %s itself was renamed."),
+			 rename_info->key, new_dir, path, new_dir);
+		return NULL;
+	}
+
+	new_path = handle_path_level_conflicts(opt, path, side_index,
+					       rename_info, collisions);
+	*clean_merge &= (new_path != NULL);
+
+	return new_path;
+}
+
+static void apply_directory_rename_modifications(struct merge_options *opt,
+						 struct diff_filepair *pair,
+						 char *new_path)
+{
+	/*
+	 * The basic idea is to get the conflict_info from opt->priv->paths
+	 * at old path, and insert it into new_path; basically just this:
+	 *     ci = strmap_get(&opt->priv->paths, old_path);
+	 *     strmap_remove(&opt->priv->paths, old_path, 0);
+	 *     strmap_put(&opt->priv->paths, new_path, ci);
+	 * However, there are some factors complicating this:
+	 *     - opt->priv->paths may already have an entry at new_path
+	 *     - Each ci tracks its containing directory, so we need to
+	 *       update that
+	 *     - If another ci has the same containing directory, then
+	 *       the two char*'s MUST point to the same location.  See the
+	 *       comment in struct merged_info.  strcmp equality is not
+	 *       enough; we need pointer equality.
+	 *     - opt->priv->paths must hold the parent directories of any
+	 *       entries that are added.  So, if this directory rename
+	 *       causes entirely new directories, we must recursively add
+	 *       parent directories.
+	 *     - For each parent directory added to opt->priv->paths, we
+	 *       also need to get its parent directory stored in its
+	 *       conflict_info->merged.directory_name with all the same
+	 *       requirements about pointer equality.
+	 */
+	struct string_list dirs_to_insert = STRING_LIST_INIT_NODUP;
+	struct conflict_info *ci, *new_ci;
+	struct strmap_entry *entry;
+	const char *branch_with_new_path, *branch_with_dir_rename;
+	const char *old_path = pair->two->path;
+	const char *parent_name;
+	const char *cur_path;
+	int i, len;
+
+	entry = strmap_get_entry(&opt->priv->paths, old_path);
+	old_path = entry->key;
+	ci = entry->value;
+	VERIFY_CI(ci);
+
+	/* Find parent directories missing from opt->priv->paths */
+	cur_path = new_path;
+	while (1) {
+		/* Find the parent directory of cur_path */
+		char *last_slash = strrchr(cur_path, '/');
+		if (last_slash) {
+			parent_name = xstrndup(cur_path, last_slash - cur_path);
+		} else {
+			parent_name = opt->priv->toplevel_dir;
+			break;
+		}
+
+		/* Look it up in opt->priv->paths */
+		entry = strmap_get_entry(&opt->priv->paths, parent_name);
+		if (entry) {
+			free((char*)parent_name);
+			parent_name = entry->key; /* reuse known pointer */
+			break;
+		}
+
+		/* Record this is one of the directories we need to insert */
+		string_list_append(&dirs_to_insert, parent_name);
+		cur_path = parent_name;
+	}
+
+	/* Traverse dirs_to_insert and insert them into opt->priv->paths */
+	for (i = dirs_to_insert.nr-1; i >= 0; --i) {
+		struct conflict_info *dir_ci;
+		char *cur_dir = dirs_to_insert.items[i].string;
+
+		CALLOC_ARRAY(dir_ci, 1);
+
+		dir_ci->merged.directory_name = parent_name;
+		len = strlen(parent_name);
+		/* len+1 because of trailing '/' character */
+		dir_ci->merged.basename_offset = (len > 0 ? len+1 : len);
+		dir_ci->dirmask = ci->filemask;
+		strmap_put(&opt->priv->paths, cur_dir, dir_ci);
+
+		parent_name = cur_dir;
+	}
+
+	/*
+	 * We are removing old_path from opt->priv->paths.  old_path also will
+	 * eventually need to be freed, but it may still be used by e.g.
+	 * ci->pathnames.  So, store it in another string-list for now.
+	 */
+	string_list_append(&opt->priv->paths_to_free, old_path);
+
+	assert(ci->filemask == 2 || ci->filemask == 4);
+	assert(ci->dirmask == 0);
+	strmap_remove(&opt->priv->paths, old_path, 0);
+
+	branch_with_new_path   = (ci->filemask == 2) ? opt->branch1 : opt->branch2;
+	branch_with_dir_rename = (ci->filemask == 2) ? opt->branch2 : opt->branch1;
+
+	/* Now, finally update ci and stick it into opt->priv->paths */
+	ci->merged.directory_name = parent_name;
+	len = strlen(parent_name);
+	ci->merged.basename_offset = (len > 0 ? len+1 : len);
+	new_ci = strmap_get(&opt->priv->paths, new_path);
+	if (!new_ci) {
+		/* Place ci back into opt->priv->paths, but at new_path */
+		strmap_put(&opt->priv->paths, new_path, ci);
+	} else {
+		int index;
+
+		/* A few sanity checks */
+		VERIFY_CI(new_ci);
+		assert(ci->filemask == 2 || ci->filemask == 4);
+		assert((new_ci->filemask & ci->filemask) == 0);
+		assert(!new_ci->merged.clean);
+
+		/* Copy stuff from ci into new_ci */
+		new_ci->filemask |= ci->filemask;
+		if (new_ci->dirmask)
+			new_ci->df_conflict = 1;
+		index = (ci->filemask >> 1);
+		new_ci->pathnames[index] = ci->pathnames[index];
+		new_ci->stages[index].mode = ci->stages[index].mode;
+		oidcpy(&new_ci->stages[index].oid, &ci->stages[index].oid);
+
+		free(ci);
+		ci = new_ci;
+	}
+
+	if (opt->detect_directory_renames == MERGE_DIRECTORY_RENAMES_TRUE) {
+		/* Notify user of updated path */
+		if (pair->status == 'A')
+			path_msg(opt, new_path, 1,
+				 _("Path updated: %s added in %s inside a "
+				   "directory that was renamed in %s; moving "
+				   "it to %s."),
+				 old_path, branch_with_new_path,
+				 branch_with_dir_rename, new_path);
+		else
+			path_msg(opt, new_path, 1,
+				 _("Path updated: %s renamed to %s in %s, "
+				   "inside a directory that was renamed in %s; "
+				   "moving it to %s."),
+				 pair->one->path, old_path, branch_with_new_path,
+				 branch_with_dir_rename, new_path);
+	} else {
+		/*
+		 * opt->detect_directory_renames has the value
+		 * MERGE_DIRECTORY_RENAMES_CONFLICT, so mark these as conflicts.
+		 */
+		ci->path_conflict = 1;
+		if (pair->status == 'A')
+			path_msg(opt, new_path, 0,
+				 _("CONFLICT (file location): %s added in %s "
+				   "inside a directory that was renamed in %s, "
+				   "suggesting it should perhaps be moved to "
+				   "%s."),
+				 old_path, branch_with_new_path,
+				 branch_with_dir_rename, new_path);
+		else
+			path_msg(opt, new_path, 0,
+				 _("CONFLICT (file location): %s renamed to %s "
+				   "in %s, inside a directory that was renamed "
+				   "in %s, suggesting it should perhaps be "
+				   "moved to %s."),
+				 pair->one->path, old_path, branch_with_new_path,
+				 branch_with_dir_rename, new_path);
+	}
+
+	/*
+	 * Finally, record the new location.
+	 */
+	pair->two->path = new_path;
+}
+
+/*** Function Grouping: functions related to regular rename detection ***/
+
+static int process_renames(struct merge_options *opt,
+			   struct diff_queue_struct *renames)
+{
+	int clean_merge = 1, i;
+
+	for (i = 0; i < renames->nr; ++i) {
+		const char *oldpath = NULL, *newpath;
+		struct diff_filepair *pair = renames->queue[i];
+		struct conflict_info *oldinfo = NULL, *newinfo = NULL;
+		struct strmap_entry *old_ent, *new_ent;
+		unsigned int old_sidemask;
+		int target_index, other_source_index;
+		int source_deleted, collision, type_changed;
+		const char *rename_branch = NULL, *delete_branch = NULL;
+
+		old_ent = strmap_get_entry(&opt->priv->paths, pair->one->path);
+		new_ent = strmap_get_entry(&opt->priv->paths, pair->two->path);
+		if (old_ent) {
+			oldpath = old_ent->key;
+			oldinfo = old_ent->value;
+		}
+		newpath = pair->two->path;
+		if (new_ent) {
+			newpath = new_ent->key;
+			newinfo = new_ent->value;
+		}
+
+		/*
+		 * If pair->one->path isn't in opt->priv->paths, that means
+		 * that either directory rename detection removed that
+		 * path, or a parent directory of oldpath was resolved and
+		 * we don't even need the rename; in either case, we can
+		 * skip it.  If oldinfo->merged.clean, then the other side
+		 * of history had no changes to oldpath and we don't need
+		 * the rename and can skip it.
+		 */
+		if (!oldinfo || oldinfo->merged.clean)
+			continue;
+
+		/*
+		 * diff_filepairs have copies of pathnames, thus we have to
+		 * use standard 'strcmp()' (negated) instead of '=='.
+		 */
+		if (i + 1 < renames->nr &&
+		    !strcmp(oldpath, renames->queue[i+1]->one->path)) {
+			/* Handle rename/rename(1to2) or rename/rename(1to1) */
+			const char *pathnames[3];
+			struct version_info merged;
+			struct conflict_info *base, *side1, *side2;
+			unsigned was_binary_blob = 0;
+
+			pathnames[0] = oldpath;
+			pathnames[1] = newpath;
+			pathnames[2] = renames->queue[i+1]->two->path;
+
+			base = strmap_get(&opt->priv->paths, pathnames[0]);
+			side1 = strmap_get(&opt->priv->paths, pathnames[1]);
+			side2 = strmap_get(&opt->priv->paths, pathnames[2]);
+
+			VERIFY_CI(base);
+			VERIFY_CI(side1);
+			VERIFY_CI(side2);
+
+			if (!strcmp(pathnames[1], pathnames[2])) {
+				/* Both sides renamed the same way */
+				assert(side1 == side2);
+				memcpy(&side1->stages[0], &base->stages[0],
+				       sizeof(merged));
+				side1->filemask |= (1 << MERGE_BASE);
+				/* Mark base as resolved by removal */
+				base->merged.is_null = 1;
+				base->merged.clean = 1;
+
+				/* We handled both renames, i.e. i+1 handled */
+				i++;
+				/* Move to next rename */
+				continue;
+			}
+
+			/* This is a rename/rename(1to2) */
+			clean_merge = handle_content_merge(opt,
+							   pair->one->path,
+							   &base->stages[0],
+							   &side1->stages[1],
+							   &side2->stages[2],
+							   pathnames,
+							   1 + 2 * opt->priv->call_depth,
+							   &merged);
+			if (!clean_merge &&
+			    merged.mode == side1->stages[1].mode &&
+			    oideq(&merged.oid, &side1->stages[1].oid))
+				was_binary_blob = 1;
+			memcpy(&side1->stages[1], &merged, sizeof(merged));
+			if (was_binary_blob) {
+				/*
+				 * Getting here means we were attempting to
+				 * merge a binary blob.
+				 *
+				 * Since we can't merge binaries,
+				 * handle_content_merge() just takes one
+				 * side.  But we don't want to copy the
+				 * contents of one side to both paths.  We
+				 * used the contents of side1 above for
+				 * side1->stages, let's use the contents of
+				 * side2 for side2->stages below.
+				 */
+				oidcpy(&merged.oid, &side2->stages[2].oid);
+				merged.mode = side2->stages[2].mode;
+			}
+			memcpy(&side2->stages[2], &merged, sizeof(merged));
+
+			side1->path_conflict = 1;
+			side2->path_conflict = 1;
+			/*
+			 * TODO: For renames we normally remove the path at the
+			 * old name.  It would thus seem consistent to do the
+			 * same for rename/rename(1to2) cases, but we haven't
+			 * done so traditionally and a number of the regression
+			 * tests now encode an expectation that the file is
+			 * left there at stage 1.  If we ever decide to change
+			 * this, add the following two lines here:
+			 *    base->merged.is_null = 1;
+			 *    base->merged.clean = 1;
+			 * and remove the setting of base->path_conflict to 1.
+			 */
+			base->path_conflict = 1;
+			path_msg(opt, oldpath, 0,
+				 _("CONFLICT (rename/rename): %s renamed to "
+				   "%s in %s and to %s in %s."),
+				 pathnames[0],
+				 pathnames[1], opt->branch1,
+				 pathnames[2], opt->branch2);
+
+			i++; /* We handled both renames, i.e. i+1 handled */
+			continue;
+		}
+
+		VERIFY_CI(oldinfo);
+		VERIFY_CI(newinfo);
+		target_index = pair->score; /* from collect_renames() */
+		assert(target_index == 1 || target_index == 2);
+		other_source_index = 3 - target_index;
+		old_sidemask = (1 << other_source_index); /* 2 or 4 */
+		source_deleted = (oldinfo->filemask == 1);
+		collision = ((newinfo->filemask & old_sidemask) != 0);
+		type_changed = !source_deleted &&
+			(S_ISREG(oldinfo->stages[other_source_index].mode) !=
+			 S_ISREG(newinfo->stages[target_index].mode));
+		if (type_changed && collision) {
+			/*
+			 * special handling so later blocks can handle this...
+			 *
+			 * if type_changed && collision are both true, then this
+			 * was really a double rename, but one side wasn't
+			 * detected due to lack of break detection.  I.e.
+			 * something like
+			 *    orig: has normal file 'foo'
+			 *    side1: renames 'foo' to 'bar', adds 'foo' symlink
+			 *    side2: renames 'foo' to 'bar'
+			 * In this case, the foo->bar rename on side1 won't be
+			 * detected because the new symlink named 'foo' is
+			 * there and we don't do break detection.  But we detect
+			 * this here because we don't want to merge the content
+			 * of the foo symlink with the foo->bar file, so we
+			 * have some logic to handle this special case.  The
+			 * easiest way to do that is make 'bar' on side1 not
+			 * be considered a colliding file but the other part
+			 * of a normal rename.  If the file is very different,
+			 * well we're going to get content merge conflicts
+			 * anyway so it doesn't hurt.  And if the colliding
+			 * file also has a different type, that'll be handled
+			 * by the content merge logic in process_entry() too.
+			 *
+			 * See also t6430, 'rename vs. rename/symlink'
+			 */
+			collision = 0;
+		}
+		if (source_deleted) {
+			if (target_index == 1) {
+				rename_branch = opt->branch1;
+				delete_branch = opt->branch2;
+			} else {
+				rename_branch = opt->branch2;
+				delete_branch = opt->branch1;
+			}
+		}
+
+		assert(source_deleted || oldinfo->filemask & old_sidemask);
+
+		/* Need to check for special types of rename conflicts... */
+		if (collision && !source_deleted) {
+			/* collision: rename/add or rename/rename(2to1) */
+			const char *pathnames[3];
+			struct version_info merged;
+
+			struct conflict_info *base, *side1, *side2;
+			unsigned clean;
+
+			pathnames[0] = oldpath;
+			pathnames[other_source_index] = oldpath;
+			pathnames[target_index] = newpath;
+
+			base = strmap_get(&opt->priv->paths, pathnames[0]);
+			side1 = strmap_get(&opt->priv->paths, pathnames[1]);
+			side2 = strmap_get(&opt->priv->paths, pathnames[2]);
+
+			VERIFY_CI(base);
+			VERIFY_CI(side1);
+			VERIFY_CI(side2);
+
+			clean = handle_content_merge(opt, pair->one->path,
+						     &base->stages[0],
+						     &side1->stages[1],
+						     &side2->stages[2],
+						     pathnames,
+						     1 + 2 * opt->priv->call_depth,
+						     &merged);
+
+			memcpy(&newinfo->stages[target_index], &merged,
+			       sizeof(merged));
+			if (!clean) {
+				path_msg(opt, newpath, 0,
+					 _("CONFLICT (rename involved in "
+					   "collision): rename of %s -> %s has "
+					   "content conflicts AND collides "
+					   "with another path; this may result "
+					   "in nested conflict markers."),
+					 oldpath, newpath);
+			}
+		} else if (collision && source_deleted) {
+			/*
+			 * rename/add/delete or rename/rename(2to1)/delete:
+			 * since oldpath was deleted on the side that didn't
+			 * do the rename, there's not much of a content merge
+			 * we can do for the rename.  oldinfo->merged.is_null
+			 * was already set, so we just leave things as-is so
+			 * they look like an add/add conflict.
+			 */
+
+			newinfo->path_conflict = 1;
+			path_msg(opt, newpath, 0,
+				 _("CONFLICT (rename/delete): %s renamed "
+				   "to %s in %s, but deleted in %s."),
+				 oldpath, newpath, rename_branch, delete_branch);
+		} else {
+			/*
+			 * a few different cases...start by copying the
+			 * existing stage(s) from oldinfo over the newinfo
+			 * and update the pathname(s).
+			 */
+			memcpy(&newinfo->stages[0], &oldinfo->stages[0],
+			       sizeof(newinfo->stages[0]));
+			newinfo->filemask |= (1 << MERGE_BASE);
+			newinfo->pathnames[0] = oldpath;
+			if (type_changed) {
+				/* rename vs. typechange */
+				/* Mark the original as resolved by removal */
+				memcpy(&oldinfo->stages[0].oid, &null_oid,
+				       sizeof(oldinfo->stages[0].oid));
+				oldinfo->stages[0].mode = 0;
+				oldinfo->filemask &= 0x06;
+			} else if (source_deleted) {
+				/* rename/delete */
+				newinfo->path_conflict = 1;
+				path_msg(opt, newpath, 0,
+					 _("CONFLICT (rename/delete): %s renamed"
+					   " to %s in %s, but deleted in %s."),
+					 oldpath, newpath,
+					 rename_branch, delete_branch);
+			} else {
+				/* normal rename */
+				memcpy(&newinfo->stages[other_source_index],
+				       &oldinfo->stages[other_source_index],
+				       sizeof(newinfo->stages[0]));
+				newinfo->filemask |= (1 << other_source_index);
+				newinfo->pathnames[other_source_index] = oldpath;
+			}
+		}
+
+		if (!type_changed) {
+			/* Mark the original as resolved by removal */
+			oldinfo->merged.is_null = 1;
+			oldinfo->merged.clean = 1;
+		}
+
+	}
+
+	return clean_merge;
+}
+
+static void resolve_diffpair_statuses(struct diff_queue_struct *q)
+{
+	/*
+	 * A simplified version of diff_resolve_rename_copy(); would probably
+	 * just use that function but it's static...
+	 */
+	int i;
+	struct diff_filepair *p;
+
+	for (i = 0; i < q->nr; ++i) {
+		p = q->queue[i];
+		p->status = 0; /* undecided */
+		if (!DIFF_FILE_VALID(p->one))
+			p->status = DIFF_STATUS_ADDED;
+		else if (!DIFF_FILE_VALID(p->two))
+			p->status = DIFF_STATUS_DELETED;
+		else if (DIFF_PAIR_RENAME(p))
+			p->status = DIFF_STATUS_RENAMED;
+	}
+}
+
+static int compare_pairs(const void *a_, const void *b_)
+{
+	const struct diff_filepair *a = *((const struct diff_filepair **)a_);
+	const struct diff_filepair *b = *((const struct diff_filepair **)b_);
+
+	return strcmp(a->one->path, b->one->path);
+}
+
+/* Call diffcore_rename() to compute which files have changed on given side */
+static void detect_regular_renames(struct merge_options *opt,
+				   unsigned side_index)
+{
+	struct diff_options diff_opts;
+	struct rename_info *renames = &opt->priv->renames;
+
+	repo_diff_setup(opt->repo, &diff_opts);
+	diff_opts.flags.recursive = 1;
+	diff_opts.flags.rename_empty = 0;
+	diff_opts.detect_rename = DIFF_DETECT_RENAME;
+	diff_opts.rename_limit = opt->rename_limit;
+	if (opt->rename_limit <= 0)
+		diff_opts.rename_limit = 1000;
+	diff_opts.rename_score = opt->rename_score;
+	diff_opts.show_rename_progress = opt->show_rename_progress;
+	diff_opts.output_format = DIFF_FORMAT_NO_OUTPUT;
+	diff_setup_done(&diff_opts);
+
+	diff_queued_diff = renames->pairs[side_index];
+	trace2_region_enter("diff", "diffcore_rename", opt->repo);
+	diffcore_rename(&diff_opts);
+	trace2_region_leave("diff", "diffcore_rename", opt->repo);
+	resolve_diffpair_statuses(&diff_queued_diff);
+
+	if (diff_opts.needed_rename_limit > renames->needed_limit)
+		renames->needed_limit = diff_opts.needed_rename_limit;
+
+	renames->pairs[side_index] = diff_queued_diff;
+
+	diff_opts.output_format = DIFF_FORMAT_NO_OUTPUT;
+	diff_queued_diff.nr = 0;
+	diff_queued_diff.queue = NULL;
+	diff_flush(&diff_opts);
+}
+
+/*
+ * Get information of all renames which occurred in 'side_pairs', discarding
+ * non-renames.
+ */
+static int collect_renames(struct merge_options *opt,
+			   struct diff_queue_struct *result,
+			   unsigned side_index,
+			   struct strmap *dir_renames_for_side,
+			   struct strmap *rename_exclusions)
+{
+	int i, clean = 1;
+	struct strmap collisions;
+	struct diff_queue_struct *side_pairs;
+	struct hashmap_iter iter;
+	struct strmap_entry *entry;
+	struct rename_info *renames = &opt->priv->renames;
+
+	side_pairs = &renames->pairs[side_index];
+	compute_collisions(&collisions, dir_renames_for_side, side_pairs);
+
+	for (i = 0; i < side_pairs->nr; ++i) {
+		struct diff_filepair *p = side_pairs->queue[i];
+		char *new_path; /* non-NULL only with directory renames */
+
+		if (p->status != 'A' && p->status != 'R') {
+			diff_free_filepair(p);
+			continue;
+		}
+
+		new_path = check_for_directory_rename(opt, p->two->path,
+						      side_index,
+						      dir_renames_for_side,
+						      rename_exclusions,
+						      &collisions,
+						      &clean);
+
+		if (p->status != 'R' && !new_path) {
+			diff_free_filepair(p);
+			continue;
+		}
+
+		if (new_path)
+			apply_directory_rename_modifications(opt, p, new_path);
+
+		/*
+		 * p->score comes back from diffcore_rename_extended() with
+		 * the similarity of the renamed file.  The similarity is
+		 * was used to determine that the two files were related
+		 * and are a rename, which we have already used, but beyond
+		 * that we have no use for the similarity.  So p->score is
+		 * now irrelevant.  However, process_renames() will need to
+		 * know which side of the merge this rename was associated
+		 * with, so overwrite p->score with that value.
+		 */
+		p->score = side_index;
+		result->queue[result->nr++] = p;
+	}
+
+	/* Free each value in the collisions map */
+	strmap_for_each_entry(&collisions, &iter, entry) {
+		struct collision_info *info = entry->value;
+		string_list_clear(&info->source_files, 0);
+	}
+	/*
+	 * In compute_collisions(), we set collisions.strdup_strings to 0
+	 * so that we wouldn't have to make another copy of the new_path
+	 * allocated by apply_dir_rename().  But now that we've used them
+	 * and have no other references to these strings, it is time to
+	 * deallocate them.
+	 */
+	free_strmap_strings(&collisions);
+	strmap_clear(&collisions, 1);
+	return clean;
+}
+
+static int detect_and_process_renames(struct merge_options *opt,
+				      struct tree *merge_base,
+				      struct tree *side1,
+				      struct tree *side2)
+{
+	struct diff_queue_struct combined;
+	struct rename_info *renames = &opt->priv->renames;
+	int need_dir_renames, s, clean = 1;
+
+	memset(&combined, 0, sizeof(combined));
+
+	trace2_region_enter("merge", "regular renames", opt->repo);
+	detect_regular_renames(opt, MERGE_SIDE1);
+	detect_regular_renames(opt, MERGE_SIDE2);
+	trace2_region_leave("merge", "regular renames", opt->repo);
+
+	trace2_region_enter("merge", "directory renames", opt->repo);
+	need_dir_renames =
+	  !opt->priv->call_depth &&
+	  (opt->detect_directory_renames == MERGE_DIRECTORY_RENAMES_TRUE ||
+	   opt->detect_directory_renames == MERGE_DIRECTORY_RENAMES_CONFLICT);
+
+	if (need_dir_renames) {
+		get_provisional_directory_renames(opt, MERGE_SIDE1, &clean);
+		get_provisional_directory_renames(opt, MERGE_SIDE2, &clean);
+		handle_directory_level_conflicts(opt);
+	}
+
+	ALLOC_GROW(combined.queue,
+		   renames->pairs[1].nr + renames->pairs[2].nr,
+		   combined.alloc);
+	clean &= collect_renames(opt, &combined, MERGE_SIDE1,
+				 &renames->dir_renames[2],
+				 &renames->dir_renames[1]);
+	clean &= collect_renames(opt, &combined, MERGE_SIDE2,
+				 &renames->dir_renames[1],
+				 &renames->dir_renames[2]);
+	QSORT(combined.queue, combined.nr, compare_pairs);
+	trace2_region_leave("merge", "directory renames", opt->repo);
+
+	trace2_region_enter("merge", "process renames", opt->repo);
+	clean &= process_renames(opt, &combined);
+	trace2_region_leave("merge", "process renames", opt->repo);
+
+	/* Free memory for renames->pairs[] and combined */
+	for (s = MERGE_SIDE1; s <= MERGE_SIDE2; s++) {
+		free(renames->pairs[s].queue);
+		DIFF_QUEUE_CLEAR(&renames->pairs[s]);
+	}
+	if (combined.nr) {
+		int i;
+		for (i = 0; i < combined.nr; i++)
+			diff_free_filepair(combined.queue[i]);
+		free(combined.queue);
+	}
+
+	return clean;
+}
+
+/*** Function Grouping: functions related to process_entries() ***/
+
+static int string_list_df_name_compare(const char *one, const char *two)
+{
+	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
+	 * appearing before files below the corresponding directory.
+	 * The order of the rest of the list is irrelevant for us.
+	 *
+	 * To achieve this, we sort with df_name_compare and provide
+	 * the mode S_IFDIR so that D/F conflicts will sort correctly.
+	 * We use the mode S_IFDIR for everything else for simplicity,
+	 * since in other cases any changes in their order due to
+	 * sorting cause no problems for us.
+	 */
+	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'.
+	 */
+	if (cmp)
+		return cmp;
+	return onelen - twolen;
+}
+
+struct directory_versions {
+	/*
+	 * versions: list of (basename -> version_info)
+	 *
+	 * The basenames are in reverse lexicographic order of full pathnames,
+	 * as processed in process_entries().  This puts all entries within
+	 * a directory together, and covers the directory itself after
+	 * everything within it, allowing us to write subtrees before needing
+	 * to record information for the tree itself.
+	 */
+	struct string_list versions;
+
+	/*
+	 * offsets: list of (full relative path directories -> integer offsets)
+	 *
+	 * Since versions contains basenames from files in multiple different
+	 * directories, we need to know which entries in versions correspond
+	 * to which directories.  Values of e.g.
+	 *     ""             0
+	 *     src            2
+	 *     src/moduleA    5
+	 * Would mean that entries 0-1 of versions are files in the toplevel
+	 * directory, entries 2-4 are files under src/, and the remaining
+	 * entries starting at index 5 are files under src/moduleA/.
+	 */
+	struct string_list offsets;
+
+	/*
+	 * last_directory: directory that previously processed file found in
+	 *
+	 * last_directory starts NULL, but records the directory in which the
+	 * previous file was found within.  As soon as
+	 *    directory(current_file) != last_directory
+	 * then we need to start updating accounting in versions & offsets.
+	 * Note that last_directory is always the last path in "offsets" (or
+	 * NULL if "offsets" is empty) so this exists just for quick access.
+	 */
+	const char *last_directory;
+
+	/* last_directory_len: cached computation of strlen(last_directory) */
+	unsigned last_directory_len;
+};
+
+static int tree_entry_order(const void *a_, const void *b_)
+{
+	const struct string_list_item *a = a_;
+	const struct string_list_item *b = b_;
+
+	const struct merged_info *ami = a->util;
+	const struct merged_info *bmi = b->util;
+	return base_name_compare(a->string, strlen(a->string), ami->result.mode,
+				 b->string, strlen(b->string), bmi->result.mode);
+}
+
+static void write_tree(struct object_id *result_oid,
+		       struct string_list *versions,
+		       unsigned int offset,
+		       size_t hash_size)
+{
+	size_t maxlen = 0, extra;
+	unsigned int nr = versions->nr - offset;
+	struct strbuf buf = STRBUF_INIT;
+	struct string_list relevant_entries = STRING_LIST_INIT_NODUP;
+	int i;
+
+	/*
+	 * We want to sort the last (versions->nr-offset) entries in versions.
+	 * Do so by abusing the string_list API a bit: make another string_list
+	 * that contains just those entries and then sort them.
+	 *
+	 * We won't use relevant_entries again and will let it just pop off the
+	 * stack, so there won't be allocation worries or anything.
+	 */
+	relevant_entries.items = versions->items + offset;
+	relevant_entries.nr = versions->nr - offset;
+	QSORT(relevant_entries.items, relevant_entries.nr, tree_entry_order);
+
+	/* Pre-allocate some space in buf */
+	extra = hash_size + 8; /* 8: 6 for mode, 1 for space, 1 for NUL char */
+	for (i = 0; i < nr; i++) {
+		maxlen += strlen(versions->items[offset+i].string) + extra;
+	}
+	strbuf_grow(&buf, maxlen);
+
+	/* Write each entry out to buf */
+	for (i = 0; i < nr; i++) {
+		struct merged_info *mi = versions->items[offset+i].util;
+		struct version_info *ri = &mi->result;
+		strbuf_addf(&buf, "%o %s%c",
+			    ri->mode,
+			    versions->items[offset+i].string, '\0');
+		strbuf_add(&buf, ri->oid.hash, hash_size);
+	}
+
+	/* Write this object file out, and record in result_oid */
+	write_object_file(buf.buf, buf.len, tree_type, result_oid);
+	strbuf_release(&buf);
+}
+
+static void record_entry_for_tree(struct directory_versions *dir_metadata,
+				  const char *path,
+				  struct merged_info *mi)
+{
+	const char *basename;
+
+	if (mi->is_null)
+		/* nothing to record */
+		return;
+
+	basename = path + mi->basename_offset;
+	assert(strchr(basename, '/') == NULL);
+	string_list_append(&dir_metadata->versions,
+			   basename)->util = &mi->result;
+}
+
+static void write_completed_directory(struct merge_options *opt,
+				      const char *new_directory_name,
+				      struct directory_versions *info)
+{
+	const char *prev_dir;
+	struct merged_info *dir_info = NULL;
+	unsigned int offset;
+
+	/*
+	 * Some explanation of info->versions and info->offsets...
+	 *
+	 * process_entries() iterates over all relevant files AND
+	 * directories in reverse lexicographic order, and calls this
+	 * function.  Thus, an example of the paths that process_entries()
+	 * could operate on (along with the directories for those paths
+	 * being shown) is:
+	 *
+	 *     xtract.c             ""
+	 *     tokens.txt           ""
+	 *     src/moduleB/umm.c    src/moduleB
+	 *     src/moduleB/stuff.h  src/moduleB
+	 *     src/moduleB/baz.c    src/moduleB
+	 *     src/moduleB          src
+	 *     src/moduleA/foo.c    src/moduleA
+	 *     src/moduleA/bar.c    src/moduleA
+	 *     src/moduleA          src
+	 *     src                  ""
+	 *     Makefile             ""
+	 *
+	 * info->versions:
+	 *
+	 *     always contains the unprocessed entries and their
+	 *     version_info information.  For example, after the first five
+	 *     entries above, info->versions would be:
+	 *
+	 *     	   xtract.c     <xtract.c's version_info>
+	 *     	   token.txt    <token.txt's version_info>
+	 *     	   umm.c        <src/moduleB/umm.c's version_info>
+	 *     	   stuff.h      <src/moduleB/stuff.h's version_info>
+	 *     	   baz.c        <src/moduleB/baz.c's version_info>
+	 *
+	 *     Once a subdirectory is completed we remove the entries in
+	 *     that subdirectory from info->versions, writing it as a tree
+	 *     (write_tree()).  Thus, as soon as we get to src/moduleB,
+	 *     info->versions would be updated to
+	 *
+	 *     	   xtract.c     <xtract.c's version_info>
+	 *     	   token.txt    <token.txt's version_info>
+	 *     	   moduleB      <src/moduleB's version_info>
+	 *
+	 * info->offsets:
+	 *
+	 *     helps us track which entries in info->versions correspond to
+	 *     which directories.  When we are N directories deep (e.g. 4
+	 *     for src/modA/submod/subdir/), we have up to N+1 unprocessed
+	 *     directories (+1 because of toplevel dir).  Corresponding to
+	 *     the info->versions example above, after processing five entries
+	 *     info->offsets will be:
+	 *
+	 *     	   ""           0
+	 *     	   src/moduleB  2
+	 *
+	 *     which is used to know that xtract.c & token.txt are from the
+	 *     toplevel dirctory, while umm.c & stuff.h & baz.c are from the
+	 *     src/moduleB directory.  Again, following the example above,
+	 *     once we need to process src/moduleB, then info->offsets is
+	 *     updated to
+	 *
+	 *     	   ""           0
+	 *     	   src          2
+	 *
+	 *     which says that moduleB (and only moduleB so far) is in the
+	 *     src directory.
+	 *
+	 *     One unique thing to note about info->offsets here is that
+	 *     "src" was not added to info->offsets until there was a path
+	 *     (a file OR directory) immediately below src/ that got
+	 *     processed.
+	 *
+	 * Since process_entry() just appends new entries to info->versions,
+	 * write_completed_directory() only needs to do work if the next path
+	 * is in a directory that is different than the last directory found
+	 * in info->offsets.
+	 */
+
+	/*
+	 * If we are working with the same directory as the last entry, there
+	 * is no work to do.  (See comments above the directory_name member of
+	 * struct merged_info for why we can use pointer comparison instead of
+	 * strcmp here.)
+	 */
+	if (new_directory_name == info->last_directory)
+		return;
+
+	/*
+	 * If we are just starting (last_directory is NULL), or last_directory
+	 * is a prefix of the current directory, then we can just update
+	 * info->offsets to record the offset where we started this directory
+	 * and update last_directory to have quick access to it.
+	 */
+	if (info->last_directory == NULL ||
+	    !strncmp(new_directory_name, info->last_directory,
+		     info->last_directory_len)) {
+		uintptr_t offset = info->versions.nr;
+
+		info->last_directory = new_directory_name;
+		info->last_directory_len = strlen(info->last_directory);
+		/*
+		 * Record the offset into info->versions where we will
+		 * start recording basenames of paths found within
+		 * new_directory_name.
+		 */
+		string_list_append(&info->offsets,
+				   info->last_directory)->util = (void*)offset;
+		return;
+	}
+
+	/*
+	 * The next entry that will be processed will be within
+	 * new_directory_name.  Since at this point we know that
+	 * new_directory_name is within a different directory than
+	 * info->last_directory, we have all entries for info->last_directory
+	 * in info->versions and we need to create a tree object for them.
+	 */
+	dir_info = strmap_get(&opt->priv->paths, info->last_directory);
+	assert(dir_info);
+	offset = (uintptr_t)info->offsets.items[info->offsets.nr-1].util;
+	if (offset == info->versions.nr) {
+		/*
+		 * Actually, we don't need to create a tree object in this
+		 * case.  Whenever all files within a directory disappear
+		 * during the merge (e.g. unmodified on one side and
+		 * deleted on the other, or files were renamed elsewhere),
+		 * then we get here and the directory itself needs to be
+		 * omitted from its parent tree as well.
+		 */
+		dir_info->is_null = 1;
+	} else {
+		/*
+		 * Write out the tree to the git object directory, and also
+		 * record the mode and oid in dir_info->result.
+		 */
+		dir_info->is_null = 0;
+		dir_info->result.mode = S_IFDIR;
+		write_tree(&dir_info->result.oid, &info->versions, offset,
+			   opt->repo->hash_algo->rawsz);
+	}
+
+	/*
+	 * We've now used several entries from info->versions and one entry
+	 * from info->offsets, so we get rid of those values.
+	 */
+	info->offsets.nr--;
+	info->versions.nr = offset;
+
+	/*
+	 * Now we've taken care of the completed directory, but we need to
+	 * prepare things since future entries will be in
+	 * new_directory_name.  (In particular, process_entry() will be
+	 * appending new entries to info->versions.)  So, we need to make
+	 * sure new_directory_name is the last entry in info->offsets.
+	 */
+	prev_dir = info->offsets.nr == 0 ? NULL :
+		   info->offsets.items[info->offsets.nr-1].string;
+	if (new_directory_name != prev_dir) {
+		uintptr_t c = info->versions.nr;
+		string_list_append(&info->offsets,
+				   new_directory_name)->util = (void*)c;
+	}
+
+	/* And, of course, we need to update last_directory to match. */
+	info->last_directory = new_directory_name;
+	info->last_directory_len = strlen(info->last_directory);
+}
+
+/* Per entry merge function */
+static void process_entry(struct merge_options *opt,
+			  const char *path,
+			  struct conflict_info *ci,
+			  struct directory_versions *dir_metadata)
+{
+	int df_file_index = 0;
+
+	VERIFY_CI(ci);
+	assert(ci->filemask >= 0 && ci->filemask <= 7);
+	/* ci->match_mask == 7 was handled in collect_merge_info_callback() */
+	assert(ci->match_mask == 0 || ci->match_mask == 3 ||
+	       ci->match_mask == 5 || ci->match_mask == 6);
+
+	if (ci->dirmask) {
+		record_entry_for_tree(dir_metadata, path, &ci->merged);
+		if (ci->filemask == 0)
+			/* nothing else to handle */
+			return;
+		assert(ci->df_conflict);
+	}
+
+	if (ci->df_conflict && ci->merged.result.mode == 0) {
+		int i;
+
+		/*
+		 * directory no longer in the way, but we do have a file we
+		 * need to place here so we need to clean away the "directory
+		 * merges to nothing" result.
+		 */
+		ci->df_conflict = 0;
+		assert(ci->filemask != 0);
+		ci->merged.clean = 0;
+		ci->merged.is_null = 0;
+		/* and we want to zero out any directory-related entries */
+		ci->match_mask = (ci->match_mask & ~ci->dirmask);
+		ci->dirmask = 0;
+		for (i = MERGE_BASE; i <= MERGE_SIDE2; i++) {
+			if (ci->filemask & (1 << i))
+				continue;
+			ci->stages[i].mode = 0;
+			oidcpy(&ci->stages[i].oid, &null_oid);
+		}
+	} else if (ci->df_conflict && ci->merged.result.mode != 0) {
+		/*
+		 * This started out as a D/F conflict, and the entries in
+		 * the competing directory were not removed by the merge as
+		 * evidenced by write_completed_directory() writing a value
+		 * to ci->merged.result.mode.
+		 */
+		struct conflict_info *new_ci;
+		const char *branch;
+		const char *old_path = path;
+		int i;
+
+		assert(ci->merged.result.mode == S_IFDIR);
+
+		/*
+		 * If filemask is 1, we can just ignore the file as having
+		 * been deleted on both sides.  We do not want to overwrite
+		 * ci->merged.result, since it stores the tree for all the
+		 * files under it.
+		 */
+		if (ci->filemask == 1) {
+			ci->filemask = 0;
+			return;
+		}
+
+		/*
+		 * This file still exists on at least one side, and we want
+		 * the directory to remain here, so we need to move this
+		 * path to some new location.
+		 */
+		CALLOC_ARRAY(new_ci, 1);
+		/* We don't really want new_ci->merged.result copied, but it'll
+		 * be overwritten below so it doesn't matter.  We also don't
+		 * want any directory mode/oid values copied, but we'll zero
+		 * those out immediately.  We do want the rest of ci copied.
+		 */
+		memcpy(new_ci, ci, sizeof(*ci));
+		new_ci->match_mask = (new_ci->match_mask & ~new_ci->dirmask);
+		new_ci->dirmask = 0;
+		for (i = MERGE_BASE; i <= MERGE_SIDE2; i++) {
+			if (new_ci->filemask & (1 << i))
+				continue;
+			/* zero out any entries related to directories */
+			new_ci->stages[i].mode = 0;
+			oidcpy(&new_ci->stages[i].oid, &null_oid);
+		}
+
+		/*
+		 * Find out which side this file came from; note that we
+		 * cannot just use ci->filemask, because renames could cause
+		 * the filemask to go back to 7.  So we use dirmask, then
+		 * pick the opposite side's index.
+		 */
+		df_file_index = (ci->dirmask & (1 << 1)) ? 2 : 1;
+		branch = (df_file_index == 1) ? opt->branch1 : opt->branch2;
+		path = unique_path(&opt->priv->paths, path, branch);
+		strmap_put(&opt->priv->paths, path, new_ci);
+
+		path_msg(opt, path, 0,
+			 _("CONFLICT (file/directory): directory in the way "
+			   "of %s from %s; moving it to %s instead."),
+			 old_path, branch, path);
+
+		/*
+		 * Zero out the filemask for the old ci.  At this point, ci
+		 * was just an entry for a directory, so we don't need to
+		 * do anything more with it.
+		 */
+		ci->filemask = 0;
+
+		/*
+		 * Now note that we're working on the new entry (path was
+		 * updated above.
+		 */
+		ci = new_ci;
+	}
+
+	/*
+	 * NOTE: Below there is a long switch-like if-elseif-elseif... block
+	 *       which the code goes through even for the df_conflict cases
+	 *       above.
+	 */
+	if (ci->match_mask) {
+		ci->merged.clean = 1;
+		if (ci->match_mask == 6) {
+			/* stages[1] == stages[2] */
+			ci->merged.result.mode = ci->stages[1].mode;
+			oidcpy(&ci->merged.result.oid, &ci->stages[1].oid);
+		} else {
+			/* determine the mask of the side that didn't match */
+			unsigned int othermask = 7 & ~ci->match_mask;
+			int side = (othermask == 4) ? 2 : 1;
+
+			ci->merged.result.mode = ci->stages[side].mode;
+			ci->merged.is_null = !ci->merged.result.mode;
+			oidcpy(&ci->merged.result.oid, &ci->stages[side].oid);
+
+			assert(othermask == 2 || othermask == 4);
+			assert(ci->merged.is_null ==
+			       (ci->filemask == ci->match_mask));
+		}
+	} else if (ci->filemask >= 6 &&
+		   (S_IFMT & ci->stages[1].mode) !=
+		   (S_IFMT & ci->stages[2].mode)) {
+		/* Two different items from (file/submodule/symlink) */
+		if (opt->priv->call_depth) {
+			/* Just use the version from the merge base */
+			ci->merged.clean = 0;
+			oidcpy(&ci->merged.result.oid, &ci->stages[0].oid);
+			ci->merged.result.mode = ci->stages[0].mode;
+			ci->merged.is_null = (ci->merged.result.mode == 0);
+		} else {
+			/* Handle by renaming one or both to separate paths. */
+			unsigned o_mode = ci->stages[0].mode;
+			unsigned a_mode = ci->stages[1].mode;
+			unsigned b_mode = ci->stages[2].mode;
+			struct conflict_info *new_ci;
+			const char *a_path = NULL, *b_path = NULL;
+			int rename_a = 0, rename_b = 0;
+
+			new_ci = xmalloc(sizeof(*new_ci));
+
+			if (S_ISREG(a_mode))
+				rename_a = 1;
+			else if (S_ISREG(b_mode))
+				rename_b = 1;
+			else {
+				rename_a = 1;
+				rename_b = 1;
+			}
+
+			path_msg(opt, path, 0,
+				 _("CONFLICT (distinct types): %s had different "
+				   "types on each side; renamed %s of them so "
+				   "each can be recorded somewhere."),
+				 path,
+				 (rename_a && rename_b) ? _("both") : _("one"));
+
+			ci->merged.clean = 0;
+			memcpy(new_ci, ci, sizeof(*new_ci));
+
+			/* Put b into new_ci, removing a from stages */
+			new_ci->merged.result.mode = ci->stages[2].mode;
+			oidcpy(&new_ci->merged.result.oid, &ci->stages[2].oid);
+			new_ci->stages[1].mode = 0;
+			oidcpy(&new_ci->stages[1].oid, &null_oid);
+			new_ci->filemask = 5;
+			if ((S_IFMT & b_mode) != (S_IFMT & o_mode)) {
+				new_ci->stages[0].mode = 0;
+				oidcpy(&new_ci->stages[0].oid, &null_oid);
+				new_ci->filemask = 4;
+			}
+
+			/* Leave only a in ci, fixing stages. */
+			ci->merged.result.mode = ci->stages[1].mode;
+			oidcpy(&ci->merged.result.oid, &ci->stages[1].oid);
+			ci->stages[2].mode = 0;
+			oidcpy(&ci->stages[2].oid, &null_oid);
+			ci->filemask = 3;
+			if ((S_IFMT & a_mode) != (S_IFMT & o_mode)) {
+				ci->stages[0].mode = 0;
+				oidcpy(&ci->stages[0].oid, &null_oid);
+				ci->filemask = 2;
+			}
+
+			/* Insert entries into opt->priv_paths */
+			assert(rename_a || rename_b);
+			if (rename_a) {
+				a_path = unique_path(&opt->priv->paths,
+						     path, opt->branch1);
+				strmap_put(&opt->priv->paths, a_path, ci);
+			}
+
+			if (rename_b)
+				b_path = unique_path(&opt->priv->paths,
+						     path, opt->branch2);
+			else
+				b_path = path;
+			strmap_put(&opt->priv->paths, b_path, new_ci);
+
+			if (rename_a && rename_b) {
+				strmap_remove(&opt->priv->paths, path, 0);
+				/*
+				 * We removed path from opt->priv->paths.  path
+				 * will also eventually need to be freed, but
+				 * it may still be used by e.g.  ci->pathnames.
+				 * So, store it in another string-list for now.
+				 */
+				string_list_append(&opt->priv->paths_to_free,
+						   path);
+			}
+
+			/*
+			 * Do special handling for b_path since process_entry()
+			 * won't be called on it specially.
+			 */
+			strmap_put(&opt->priv->conflicted, b_path, new_ci);
+			record_entry_for_tree(dir_metadata, b_path,
+					      &new_ci->merged);
+
+			/*
+			 * Remaining code for processing this entry should
+			 * think in terms of processing a_path.
+			 */
+			if (a_path)
+				path = a_path;
+		}
+	} else if (ci->filemask >= 6) {
+		/* Need a two-way or three-way content merge */
+		struct version_info merged_file;
+		unsigned clean_merge;
+		struct version_info *o = &ci->stages[0];
+		struct version_info *a = &ci->stages[1];
+		struct version_info *b = &ci->stages[2];
+
+		clean_merge = handle_content_merge(opt, path, o, a, b,
+						   ci->pathnames,
+						   opt->priv->call_depth * 2,
+						   &merged_file);
+		ci->merged.clean = clean_merge &&
+				   !ci->df_conflict && !ci->path_conflict;
+		ci->merged.result.mode = merged_file.mode;
+		ci->merged.is_null = (merged_file.mode == 0);
+		oidcpy(&ci->merged.result.oid, &merged_file.oid);
+		if (clean_merge && ci->df_conflict) {
+			assert(df_file_index == 1 || df_file_index == 2);
+			ci->filemask = 1 << df_file_index;
+			ci->stages[df_file_index].mode = merged_file.mode;
+			oidcpy(&ci->stages[df_file_index].oid, &merged_file.oid);
+		}
+		if (!clean_merge) {
+			const char *reason = _("content");
+			if (ci->filemask == 6)
+				reason = _("add/add");
+			if (S_ISGITLINK(merged_file.mode))
+				reason = _("submodule");
+			path_msg(opt, path, 0,
+				 _("CONFLICT (%s): Merge conflict in %s"),
+				 reason, path);
+		}
+	} else if (ci->filemask == 3 || ci->filemask == 5) {
+		/* Modify/delete */
+		const char *modify_branch, *delete_branch;
+		int side = (ci->filemask == 5) ? 2 : 1;
+		int index = opt->priv->call_depth ? 0 : side;
+
+		ci->merged.result.mode = ci->stages[index].mode;
+		oidcpy(&ci->merged.result.oid, &ci->stages[index].oid);
+		ci->merged.clean = 0;
+
+		modify_branch = (side == 1) ? opt->branch1 : opt->branch2;
+		delete_branch = (side == 1) ? opt->branch2 : opt->branch1;
+
+		if (ci->path_conflict &&
+		    oideq(&ci->stages[0].oid, &ci->stages[side].oid)) {
+			/*
+			 * This came from a rename/delete; no action to take,
+			 * but avoid printing "modify/delete" conflict notice
+			 * since the contents were not modified.
+			 */
+		} else {
+			path_msg(opt, path, 0,
+				 _("CONFLICT (modify/delete): %s deleted in %s "
+				   "and modified in %s.  Version %s of %s left "
+				   "in tree."),
+				 path, delete_branch, modify_branch,
+				 modify_branch, path);
+		}
+	} else if (ci->filemask == 2 || ci->filemask == 4) {
+		/* Added on one side */
+		int side = (ci->filemask == 4) ? 2 : 1;
+		ci->merged.result.mode = ci->stages[side].mode;
+		oidcpy(&ci->merged.result.oid, &ci->stages[side].oid);
+		ci->merged.clean = !ci->df_conflict && !ci->path_conflict;
+	} else if (ci->filemask == 1) {
+		/* Deleted on both sides */
+		ci->merged.is_null = 1;
+		ci->merged.result.mode = 0;
+		oidcpy(&ci->merged.result.oid, &null_oid);
+		ci->merged.clean = !ci->path_conflict;
+	}
+
+	/*
+	 * If still conflicted, record it separately.  This allows us to later
+	 * iterate over just conflicted entries when updating the index instead
+	 * of iterating over all entries.
+	 */
+	if (!ci->merged.clean)
+		strmap_put(&opt->priv->conflicted, path, ci);
+	record_entry_for_tree(dir_metadata, path, &ci->merged);
+}
+
+static void process_entries(struct merge_options *opt,
+			    struct object_id *result_oid)
+{
+	struct hashmap_iter iter;
+	struct strmap_entry *e;
+	struct string_list plist = STRING_LIST_INIT_NODUP;
+	struct string_list_item *entry;
+	struct directory_versions dir_metadata = { STRING_LIST_INIT_NODUP,
+						   STRING_LIST_INIT_NODUP,
+						   NULL, 0 };
+
+	trace2_region_enter("merge", "process_entries setup", opt->repo);
+	if (strmap_empty(&opt->priv->paths)) {
+		oidcpy(result_oid, opt->repo->hash_algo->empty_tree);
+		return;
+	}
+
+	/* Hack to pre-allocate plist to the desired size */
+	trace2_region_enter("merge", "plist grow", opt->repo);
+	ALLOC_GROW(plist.items, strmap_get_size(&opt->priv->paths), plist.alloc);
+	trace2_region_leave("merge", "plist grow", opt->repo);
+
+	/* Put every entry from paths into plist, then sort */
+	trace2_region_enter("merge", "plist copy", opt->repo);
+	strmap_for_each_entry(&opt->priv->paths, &iter, e) {
+		string_list_append(&plist, e->key)->util = e->value;
+	}
+	trace2_region_leave("merge", "plist copy", opt->repo);
+
+	trace2_region_enter("merge", "plist special sort", opt->repo);
+	plist.cmp = string_list_df_name_compare;
+	string_list_sort(&plist);
+	trace2_region_leave("merge", "plist special sort", opt->repo);
+
+	trace2_region_leave("merge", "process_entries setup", opt->repo);
+
+	/*
+	 * Iterate over the items in reverse order, so we can handle paths
+	 * below a directory before needing to handle the directory itself.
+	 *
+	 * This allows us to write subtrees before we need to write trees,
+	 * and it also enables sane handling of directory/file conflicts
+	 * (because it allows us to know whether the directory is still in
+	 * the way when it is time to process the file at the same path).
+	 */
+	trace2_region_enter("merge", "processing", opt->repo);
+	for (entry = &plist.items[plist.nr-1]; entry >= plist.items; --entry) {
+		char *path = entry->string;
+		/*
+		 * NOTE: mi may actually be a pointer to a conflict_info, but
+		 * we have to check mi->clean first to see if it's safe to
+		 * reassign to such a pointer type.
+		 */
+		struct merged_info *mi = entry->util;
+
+		write_completed_directory(opt, mi->directory_name,
+					  &dir_metadata);
+		if (mi->clean)
+			record_entry_for_tree(&dir_metadata, path, mi);
+		else {
+			struct conflict_info *ci = (struct conflict_info *)mi;
+			process_entry(opt, path, ci, &dir_metadata);
+		}
+	}
+	trace2_region_leave("merge", "processing", opt->repo);
+
+	trace2_region_enter("merge", "process_entries cleanup", opt->repo);
+	if (dir_metadata.offsets.nr != 1 ||
+	    (uintptr_t)dir_metadata.offsets.items[0].util != 0) {
+		printf("dir_metadata.offsets.nr = %d (should be 1)\n",
+		       dir_metadata.offsets.nr);
+		printf("dir_metadata.offsets.items[0].util = %u (should be 0)\n",
+		       (unsigned)(uintptr_t)dir_metadata.offsets.items[0].util);
+		fflush(stdout);
+		BUG("dir_metadata accounting completely off; shouldn't happen");
+	}
+	write_tree(result_oid, &dir_metadata.versions, 0,
+		   opt->repo->hash_algo->rawsz);
+	string_list_clear(&plist, 0);
+	string_list_clear(&dir_metadata.versions, 0);
+	string_list_clear(&dir_metadata.offsets, 0);
+	trace2_region_leave("merge", "process_entries cleanup", opt->repo);
+}
+
+/*** Function Grouping: functions related to merge_switch_to_result() ***/
+
+static int checkout(struct merge_options *opt,
+		    struct tree *prev,
+		    struct tree *next)
+{
+	/* Switch the index/working copy from old to new */
+	int ret;
+	struct tree_desc trees[2];
+	struct unpack_trees_options unpack_opts;
+
+	memset(&unpack_opts, 0, sizeof(unpack_opts));
+	unpack_opts.head_idx = -1;
+	unpack_opts.src_index = opt->repo->index;
+	unpack_opts.dst_index = opt->repo->index;
+
+	setup_unpack_trees_porcelain(&unpack_opts, "merge");
+
+	/*
+	 * NOTE: if this were just "git checkout" code, we would probably
+	 * read or refresh the cache and check for a conflicted index, but
+	 * builtin/merge.c or sequencer.c really needs to read the index
+	 * and check for conflicted entries before starting merging for a
+	 * good user experience (no sense waiting for merges/rebases before
+	 * erroring out), so there's no reason to duplicate that work here.
+	 */
+
+	/* 2-way merge to the new branch */
+	unpack_opts.update = 1;
+	unpack_opts.merge = 1;
+	unpack_opts.quiet = 0; /* FIXME: sequencer might want quiet? */
+	unpack_opts.verbose_update = (opt->verbosity > 2);
+	unpack_opts.fn = twoway_merge;
+	if (1/* FIXME: opts->overwrite_ignore*/) {
+		CALLOC_ARRAY(unpack_opts.dir, 1);
+		unpack_opts.dir->flags |= DIR_SHOW_IGNORED;
+		setup_standard_excludes(unpack_opts.dir);
+	}
+	parse_tree(prev);
+	init_tree_desc(&trees[0], prev->buffer, prev->size);
+	parse_tree(next);
+	init_tree_desc(&trees[1], next->buffer, next->size);
+
+	ret = unpack_trees(2, trees, &unpack_opts);
+	clear_unpack_trees_porcelain(&unpack_opts);
+	dir_clear(unpack_opts.dir);
+	FREE_AND_NULL(unpack_opts.dir);
+	return ret;
+}
+
+static int record_conflicted_index_entries(struct merge_options *opt,
+					   struct index_state *index,
+					   struct strmap *paths,
+					   struct strmap *conflicted)
+{
+	struct hashmap_iter iter;
+	struct strmap_entry *e;
+	int errs = 0;
+	int original_cache_nr;
+
+	if (strmap_empty(conflicted))
+		return 0;
+
+	original_cache_nr = index->cache_nr;
+
+	/* Put every entry from paths into plist, then sort */
+	strmap_for_each_entry(conflicted, &iter, e) {
+		const char *path = e->key;
+		struct conflict_info *ci = e->value;
+		int pos;
+		struct cache_entry *ce;
+		int i;
+
+		VERIFY_CI(ci);
+
+		/*
+		 * The index will already have a stage=0 entry for this path,
+		 * because we created an as-merged-as-possible version of the
+		 * file and checkout() moved the working copy and index over
+		 * to that version.
+		 *
+		 * However, previous iterations through this loop will have
+		 * added unstaged entries to the end of the cache which
+		 * ignore the standard alphabetical ordering of cache
+		 * entries and break invariants needed for index_name_pos()
+		 * to work.  However, we know the entry we want is before
+		 * those appended cache entries, so do a temporary swap on
+		 * cache_nr to only look through entries of interest.
+		 */
+		SWAP(index->cache_nr, original_cache_nr);
+		pos = index_name_pos(index, path, strlen(path));
+		SWAP(index->cache_nr, original_cache_nr);
+		if (pos < 0) {
+			if (ci->filemask != 1)
+				BUG("Conflicted %s but nothing in basic working tree or index; this shouldn't happen", path);
+			cache_tree_invalidate_path(index, path);
+		} else {
+			ce = index->cache[pos];
+
+			/*
+			 * Clean paths with CE_SKIP_WORKTREE set will not be
+			 * written to the working tree by the unpack_trees()
+			 * call in checkout().  Our conflicted entries would
+			 * have appeared clean to that code since we ignored
+			 * the higher order stages.  Thus, we need override
+			 * the CE_SKIP_WORKTREE bit and manually write those
+			 * files to the working disk here.
+			 *
+			 * TODO: Implement this CE_SKIP_WORKTREE fixup.
+			 */
+
+			/*
+			 * Mark this cache entry for removal and instead add
+			 * new stage>0 entries corresponding to the
+			 * conflicts.  If there are many conflicted entries, we
+			 * want to avoid memmove'ing O(NM) entries by
+			 * inserting the new entries one at a time.  So,
+			 * instead, we just add the new cache entries to the
+			 * end (ignoring normal index requirements on sort
+			 * order) and sort the index once we're all done.
+			 */
+			ce->ce_flags |= CE_REMOVE;
+		}
+
+		for (i = MERGE_BASE; i <= MERGE_SIDE2; i++) {
+			struct version_info *vi;
+			if (!(ci->filemask & (1ul << i)))
+				continue;
+			vi = &ci->stages[i];
+			ce = make_cache_entry(index, vi->mode, &vi->oid,
+					      path, i+1, 0);
+			add_index_entry(index, ce, ADD_CACHE_JUST_APPEND);
+		}
+	}
+
+	/*
+	 * Remove the unused cache entries (and invalidate the relevant
+	 * cache-trees), then sort the index entries to get the conflicted
+	 * entries we added to the end into their right locations.
+	 */
+	remove_marked_cache_entries(index, 1);
+	QSORT(index->cache, index->cache_nr, cmp_cache_name_compare);
+
+	return errs;
+}
+
 void merge_switch_to_result(struct merge_options *opt,
 			    struct tree *head,
 			    struct merge_result *result,
 			    int update_worktree_and_index,
 			    int display_update_msgs)
 {
-	die("Not yet implemented");
+	assert(opt->priv == NULL);
+	if (result->clean >= 0 && update_worktree_and_index) {
+		struct merge_options_internal *opti = result->priv;
+
+		trace2_region_enter("merge", "checkout", opt->repo);
+		if (checkout(opt, head, result->tree)) {
+			/* failure to function */
+			result->clean = -1;
+			return;
+		}
+		trace2_region_leave("merge", "checkout", opt->repo);
+
+		trace2_region_enter("merge", "record_conflicted", opt->repo);
+		if (record_conflicted_index_entries(opt, opt->repo->index,
+						    &opti->paths,
+						    &opti->conflicted)) {
+			/* failure to function */
+			result->clean = -1;
+			return;
+		}
+		trace2_region_leave("merge", "record_conflicted", opt->repo);
+	}
+
+	if (display_update_msgs) {
+		struct merge_options_internal *opti = result->priv;
+		struct hashmap_iter iter;
+		struct strmap_entry *e;
+		struct string_list olist = STRING_LIST_INIT_NODUP;
+		int i;
+
+		trace2_region_enter("merge", "display messages", opt->repo);
+
+		/* Hack to pre-allocate olist to the desired size */
+		ALLOC_GROW(olist.items, strmap_get_size(&opti->output),
+			   olist.alloc);
+
+		/* Put every entry from output into olist, then sort */
+		strmap_for_each_entry(&opti->output, &iter, e) {
+			string_list_append(&olist, e->key)->util = e->value;
+		}
+		string_list_sort(&olist);
+
+		/* Iterate over the items, printing them */
+		for (i = 0; i < olist.nr; ++i) {
+			struct strbuf *sb = olist.items[i].util;
+
+			printf("%s", sb->buf);
+		}
+		string_list_clear(&olist, 0);
+
+		/* Also include needed rename limit adjustment now */
+		diff_warn_rename_limit("merge.renamelimit",
+				       opti->renames.needed_limit, 0);
+
+		trace2_region_leave("merge", "display messages", opt->repo);
+	}
+
 	merge_finalize(opt, result);
 }
 
 void merge_finalize(struct merge_options *opt,
 		    struct merge_result *result)
 {
-	die("Not yet implemented");
+	struct merge_options_internal *opti = result->priv;
+
+	assert(opt->priv == NULL);
+
+	clear_or_reinit_internal_opts(opti, 0);
+	FREE_AND_NULL(opti);
+}
+
+/*** Function Grouping: helper functions for merge_incore_*() ***/
+
+static inline void set_commit_tree(struct commit *c, struct tree *t)
+{
+	c->maybe_tree = t;
+}
+
+static struct commit *make_virtual_commit(struct repository *repo,
+					  struct tree *tree,
+					  const char *comment)
+{
+	struct commit *commit = alloc_commit_node(repo);
+
+	set_merge_remote_desc(commit, comment, (struct object *)commit);
+	set_commit_tree(commit, tree);
+	commit->object.parsed = 1;
+	return commit;
+}
+
+static void merge_start(struct merge_options *opt, struct merge_result *result)
+{
+	struct rename_info *renames;
+	int i;
+
+	/* Sanity checks on opt */
+	trace2_region_enter("merge", "sanity checks", opt->repo);
+	assert(opt->repo);
+
+	assert(opt->branch1 && opt->branch2);
+
+	assert(opt->detect_directory_renames >= MERGE_DIRECTORY_RENAMES_NONE &&
+	       opt->detect_directory_renames <= MERGE_DIRECTORY_RENAMES_TRUE);
+	assert(opt->rename_limit >= -1);
+	assert(opt->rename_score >= 0 && opt->rename_score <= MAX_SCORE);
+	assert(opt->show_rename_progress >= 0 && opt->show_rename_progress <= 1);
+
+	assert(opt->xdl_opts >= 0);
+	assert(opt->recursive_variant >= MERGE_VARIANT_NORMAL &&
+	       opt->recursive_variant <= MERGE_VARIANT_THEIRS);
+
+	/*
+	 * detect_renames, verbosity, buffer_output, and obuf are ignored
+	 * fields that were used by "recursive" rather than "ort" -- but
+	 * sanity check them anyway.
+	 */
+	assert(opt->detect_renames >= -1 &&
+	       opt->detect_renames <= DIFF_DETECT_COPY);
+	assert(opt->verbosity >= 0 && opt->verbosity <= 5);
+	assert(opt->buffer_output <= 2);
+	assert(opt->obuf.len == 0);
+
+	assert(opt->priv == NULL);
+	if (result->priv) {
+		opt->priv = result->priv;
+		result->priv = NULL;
+		/*
+		 * opt->priv non-NULL means we had results from a previous
+		 * run; do a few sanity checks that user didn't mess with
+		 * it in an obvious fashion.
+		 */
+		assert(opt->priv->call_depth == 0);
+		assert(!opt->priv->toplevel_dir ||
+		       0 == strlen(opt->priv->toplevel_dir));
+	}
+	trace2_region_leave("merge", "sanity checks", opt->repo);
+
+	/* Default to histogram diff.  Actually, just hardcode it...for now. */
+	opt->xdl_opts = DIFF_WITH_ALG(opt, HISTOGRAM_DIFF);
+
+	/* Initialization of opt->priv, our internal merge data */
+	trace2_region_enter("merge", "allocate/init", opt->repo);
+	if (opt->priv) {
+		clear_or_reinit_internal_opts(opt->priv, 1);
+		trace2_region_leave("merge", "allocate/init", opt->repo);
+		return;
+	}
+	opt->priv = xcalloc(1, sizeof(*opt->priv));
+
+	/* Initialization of various renames fields */
+	renames = &opt->priv->renames;
+	for (i = MERGE_SIDE1; i <= MERGE_SIDE2; i++) {
+		strset_init_with_options(&renames->dirs_removed[i],
+					 NULL, 0);
+		strmap_init_with_options(&renames->dir_rename_count[i],
+					 NULL, 1);
+		strmap_init_with_options(&renames->dir_renames[i],
+					 NULL, 0);
+	}
+
+	/*
+	 * Although we initialize opt->priv->paths with strdup_strings=0,
+	 * that's just to avoid making yet another copy of an allocated
+	 * string.  Putting the entry into paths means we are taking
+	 * ownership, so we will later free it.  paths_to_free is similar.
+	 *
+	 * In contrast, conflicted just has a subset of keys from paths, so
+	 * we don't want to free those (it'd be a duplicate free).
+	 */
+	strmap_init_with_options(&opt->priv->paths, NULL, 0);
+	strmap_init_with_options(&opt->priv->conflicted, NULL, 0);
+	string_list_init(&opt->priv->paths_to_free, 0);
+
+	/*
+	 * keys & strbufs in output will sometimes need to outlive "paths",
+	 * so it will have a copy of relevant keys.  It's probably a small
+	 * subset of the overall paths that have special output.
+	 */
+	strmap_init(&opt->priv->output);
+
+	trace2_region_leave("merge", "allocate/init", opt->repo);
+}
+
+/*** Function Grouping: merge_incore_*() and their internal variants ***/
+
+/*
+ * Originally from merge_trees_internal(); heavily adapted, though.
+ */
+static void merge_ort_nonrecursive_internal(struct merge_options *opt,
+					    struct tree *merge_base,
+					    struct tree *side1,
+					    struct tree *side2,
+					    struct merge_result *result)
+{
+	struct object_id working_tree_oid;
+
+	trace2_region_enter("merge", "collect_merge_info", opt->repo);
+	if (collect_merge_info(opt, merge_base, side1, side2) != 0) {
+		/*
+		 * TRANSLATORS: The %s arguments are: 1) tree hash of a merge
+		 * base, and 2-3) the trees for the two trees we're merging.
+		 */
+		err(opt, _("collecting merge info failed for trees %s, %s, %s"),
+		    oid_to_hex(&merge_base->object.oid),
+		    oid_to_hex(&side1->object.oid),
+		    oid_to_hex(&side2->object.oid));
+		result->clean = -1;
+		return;
+	}
+	trace2_region_leave("merge", "collect_merge_info", opt->repo);
+
+	trace2_region_enter("merge", "renames", opt->repo);
+	result->clean = detect_and_process_renames(opt, merge_base,
+						   side1, side2);
+	trace2_region_leave("merge", "renames", opt->repo);
+
+	trace2_region_enter("merge", "process_entries", opt->repo);
+	process_entries(opt, &working_tree_oid);
+	trace2_region_leave("merge", "process_entries", opt->repo);
+
+	/* Set return values */
+	result->tree = parse_tree_indirect(&working_tree_oid);
+	/* existence of conflicted entries implies unclean */
+	result->clean &= strmap_empty(&opt->priv->conflicted);
+	if (!opt->priv->call_depth) {
+		result->priv = opt->priv;
+		opt->priv = NULL;
+	}
+}
+
+/*
+ * Originally from merge_recursive_internal(); somewhat adapted, though.
+ */
+static void merge_ort_internal(struct merge_options *opt,
+			       struct commit_list *merge_bases,
+			       struct commit *h1,
+			       struct commit *h2,
+			       struct merge_result *result)
+{
+	struct commit_list *iter;
+	struct commit *merged_merge_bases;
+	const char *ancestor_name;
+	struct strbuf merge_base_abbrev = STRBUF_INIT;
+
+	if (!merge_bases) {
+		merge_bases = get_merge_bases(h1, h2);
+		/* See merge-ort.h:merge_incore_recursive() declaration NOTE */
+		merge_bases = reverse_commit_list(merge_bases);
+	}
+
+	merged_merge_bases = pop_commit(&merge_bases);
+	if (merged_merge_bases == NULL) {
+		/* if there is no common ancestor, use an empty tree */
+		struct tree *tree;
+
+		tree = lookup_tree(opt->repo, opt->repo->hash_algo->empty_tree);
+		merged_merge_bases = make_virtual_commit(opt->repo, tree,
+							 "ancestor");
+		ancestor_name = "empty tree";
+	} else if (merge_bases) {
+		ancestor_name = "merged common ancestors";
+	} else {
+		strbuf_add_unique_abbrev(&merge_base_abbrev,
+					 &merged_merge_bases->object.oid,
+					 DEFAULT_ABBREV);
+		ancestor_name = merge_base_abbrev.buf;
+	}
+
+	for (iter = merge_bases; iter; iter = iter->next) {
+		const char *saved_b1, *saved_b2;
+		struct commit *prev = merged_merge_bases;
+
+		opt->priv->call_depth++;
+		/*
+		 * When the merge fails, the result contains files
+		 * with conflict markers. The cleanness flag is
+		 * 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.
+		 */
+		saved_b1 = opt->branch1;
+		saved_b2 = opt->branch2;
+		opt->branch1 = "Temporary merge branch 1";
+		opt->branch2 = "Temporary merge branch 2";
+		merge_ort_internal(opt, NULL, prev, iter->item, result);
+		if (result->clean < 0)
+			return;
+		opt->branch1 = saved_b1;
+		opt->branch2 = saved_b2;
+		opt->priv->call_depth--;
+
+		merged_merge_bases = make_virtual_commit(opt->repo,
+							 result->tree,
+							 "merged tree");
+		commit_list_insert(prev, &merged_merge_bases->parents);
+		commit_list_insert(iter->item,
+				   &merged_merge_bases->parents->next);
+
+		clear_or_reinit_internal_opts(opt->priv, 1);
+	}
+
+	opt->ancestor = ancestor_name;
+	merge_ort_nonrecursive_internal(opt,
+					repo_get_commit_tree(opt->repo,
+							     merged_merge_bases),
+					repo_get_commit_tree(opt->repo, h1),
+					repo_get_commit_tree(opt->repo, h2),
+					result);
+	strbuf_release(&merge_base_abbrev);
+	opt->ancestor = NULL;  /* avoid accidental re-use of opt->ancestor */
 }
 
 void merge_incore_nonrecursive(struct merge_options *opt,
@@ -39,7 +3519,15 @@ void merge_incore_nonrecursive(struct merge_options *opt,
 			       struct tree *side2,
 			       struct merge_result *result)
 {
-	die("Not yet implemented");
+	trace2_region_enter("merge", "incore_nonrecursive", opt->repo);
+
+	trace2_region_enter("merge", "merge_start", opt->repo);
+	assert(opt->ancestor != NULL);
+	merge_start(opt, result);
+	trace2_region_leave("merge", "merge_start", opt->repo);
+
+	merge_ort_nonrecursive_internal(opt, merge_base, side1, side2, result);
+	trace2_region_leave("merge", "incore_nonrecursive", opt->repo);
 }
 
 void merge_incore_recursive(struct merge_options *opt,
@@ -48,5 +3536,15 @@ void merge_incore_recursive(struct merge_options *opt,
 			    struct commit *side2,
 			    struct merge_result *result)
 {
-	die("Not yet implemented");
+	trace2_region_enter("merge", "incore_recursive", opt->repo);
+
+	/* We set the ancestor label based on the merge_bases */
+	assert(opt->ancestor == NULL);
+
+	trace2_region_enter("merge", "merge_start", opt->repo);
+	merge_start(opt, result);
+	trace2_region_leave("merge", "merge_start", opt->repo);
+
+	merge_ort_internal(opt, merge_bases, side1, side2, result);
+	trace2_region_leave("merge", "incore_recursive", opt->repo);
 }
diff --git a/merge-ort.h b/merge-ort.h
index 74adcca..d53a0a3 100644
--- a/merge-ort.h
+++ b/merge-ort.h
@@ -7,7 +7,14 @@ struct commit;
 struct tree;
 
 struct merge_result {
-	/* Whether the merge is clean */
+	/*
+	 * Whether the merge is clean; possible values:
+	 *    1: clean
+	 *    0: not clean (merge conflicts)
+	 *   <0: operation aborted prematurely.  (object database
+	 *       unreadable, disk full, etc.)  Worktree may be left in an
+	 *       inconsistent state if operation failed near the end.
+	 */
 	int clean;
 
 	/*
@@ -27,6 +34,16 @@ struct merge_result {
 /*
  * rename-detecting three-way merge with recursive ancestor consolidation.
  * working tree and index are untouched.
+ *
+ * merge_bases will be consumed (emptied) so make a copy if you need it.
+ *
+ * NOTE: empirically, the recursive algorithm will perform better if you
+ *       pass the merge_bases in the order of oldest commit to the
+ *       newest[1][2].
+ *
+ *       [1] https://lore.kernel.org/git/nycvar.QRO.7.76.6.1907252055500.21907@tvgsbejvaqbjf.bet/
+ *       [2] commit 8918b0c9c2 ("merge-recur: try to merge older merge bases
+ *           first", 2006-08-09)
  */
 void merge_incore_recursive(struct merge_options *opt,
 			    struct commit_list *merge_bases,
diff --git a/merge-recursive.c b/merge-recursive.c
index f736a0f..b69e694 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -303,7 +303,7 @@ static inline void setup_rename_conflict_info(enum rename_type rename_type,
 		return;
 	}
 
-	ci = xcalloc(1, sizeof(struct rename_conflict_info));
+	CALLOC_ARRAY(ci, 1);
 	ci->rename_type = rename_type;
 	ci->ren1 = ren1;
 	ci->ren2 = ren2;
@@ -2389,8 +2389,7 @@ static void compute_collisions(struct hashmap *collisions,
 			continue;
 		collision_ent = collision_find_entry(collisions, new_path);
 		if (!collision_ent) {
-			collision_ent = xcalloc(1,
-						sizeof(struct collision_entry));
+			CALLOC_ARRAY(collision_ent, 1);
 			hashmap_entry_init(&collision_ent->ent,
 						strhash(new_path));
 			hashmap_put(collisions, &collision_ent->ent);
@@ -2594,7 +2593,7 @@ static struct string_list *get_renames(struct merge_options *opt,
 	struct string_list *renames;
 
 	compute_collisions(&collisions, dir_renames, pairs);
-	renames = xcalloc(1, sizeof(struct string_list));
+	CALLOC_ARRAY(renames, 1);
 
 	for (i = 0; i < pairs->nr; ++i) {
 		struct string_list_item *item;
@@ -3517,17 +3516,6 @@ static int merge_trees_internal(struct merge_options *opt,
 	return clean;
 }
 
-static struct commit_list *reverse_commit_list(struct commit_list *list)
-{
-	struct commit_list *next = NULL, *current, *backup;
-	for (current = list; current; current = backup) {
-		backup = current->next;
-		current->next = next;
-		next = current;
-	}
-	return next;
-}
-
 /*
  * Merge the commits h1 and h2, returning a flag (int) indicating the
  * cleanness of the merge.  Also, if opt->priv->call_depth, create a
@@ -3675,7 +3663,7 @@ static int merge_start(struct merge_options *opt, struct tree *head)
 		return -1;
 	}
 
-	opt->priv = xcalloc(1, sizeof(*opt->priv));
+	CALLOC_ARRAY(opt->priv, 1);
 	string_list_init(&opt->priv->df_conflict_file_set, 1);
 	return 0;
 }
diff --git a/mergetools/vimdiff b/mergetools/vimdiff
index abc8ce4..96f6209 100644
--- a/mergetools/vimdiff
+++ b/mergetools/vimdiff
@@ -15,6 +15,17 @@
 				"$LOCAL" "$MERGED" "$REMOTE"
 		fi
 		;;
+	*vimdiff1)
+		"$merge_tool_path" -f -d \
+			-c 'echon "Resolve conflicts leftward then save. Use :cq to abort."' \
+			"$LOCAL" "$REMOTE"
+		ret="$?"
+		if test "$ret" -eq 0
+		then
+			cp -- "$LOCAL" "$MERGED"
+		fi
+		return "$ret"
+		;;
 	*vimdiff2)
 		"$merge_tool_path" -f -d -c 'wincmd l' \
 			"$LOCAL" "$MERGED" "$REMOTE"
@@ -52,7 +63,7 @@
 
 list_tool_variants () {
 	for prefix in '' g n; do
-		for suffix in '' 2 3; do
+		for suffix in '' 1 2 3; do
 			echo "${prefix}vimdiff${suffix}"
 		done
 	done
diff --git a/midx.c b/midx.c
index 9d41b9c..becfafe 100644
--- a/midx.c
+++ b/midx.c
@@ -5,12 +5,13 @@
 #include "lockfile.h"
 #include "packfile.h"
 #include "object-store.h"
-#include "sha1-lookup.h"
+#include "hash-lookup.h"
 #include "midx.h"
 #include "progress.h"
 #include "trace2.h"
 #include "run-command.h"
 #include "repository.h"
+#include "chunk-format.h"
 
 #define MIDX_SIGNATURE 0x4d494458 /* "MIDX" */
 #define MIDX_VERSION 1
@@ -21,14 +22,12 @@
 #define MIDX_HEADER_SIZE 12
 #define MIDX_MIN_SIZE (MIDX_HEADER_SIZE + the_hash_algo->rawsz)
 
-#define MIDX_MAX_CHUNKS 5
 #define MIDX_CHUNK_ALIGNMENT 4
 #define MIDX_CHUNKID_PACKNAMES 0x504e414d /* "PNAM" */
 #define MIDX_CHUNKID_OIDFANOUT 0x4f494446 /* "OIDF" */
 #define MIDX_CHUNKID_OIDLOOKUP 0x4f49444c /* "OIDL" */
 #define MIDX_CHUNKID_OBJECTOFFSETS 0x4f4f4646 /* "OOFF" */
 #define MIDX_CHUNKID_LARGEOFFSETS 0x4c4f4646 /* "LOFF" */
-#define MIDX_CHUNKLOOKUP_WIDTH (sizeof(uint32_t) + sizeof(uint64_t))
 #define MIDX_CHUNK_FANOUT_SIZE (sizeof(uint32_t) * 256)
 #define MIDX_CHUNK_OFFSET_WIDTH (2 * sizeof(uint32_t))
 #define MIDX_CHUNK_LARGE_OFFSET_WIDTH (sizeof(uint64_t))
@@ -53,6 +52,19 @@ static char *get_midx_filename(const char *object_dir)
 	return xstrfmt("%s/pack/multi-pack-index", object_dir);
 }
 
+static int midx_read_oid_fanout(const unsigned char *chunk_start,
+				size_t chunk_size, void *data)
+{
+	struct multi_pack_index *m = data;
+	m->chunk_oid_fanout = (uint32_t *)chunk_start;
+
+	if (chunk_size != 4 * 256) {
+		error(_("multi-pack-index OID fanout is of the wrong size"));
+		return 1;
+	}
+	return 0;
+}
+
 struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local)
 {
 	struct multi_pack_index *m = NULL;
@@ -64,6 +76,7 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local
 	char *midx_name = get_midx_filename(object_dir);
 	uint32_t i;
 	const char *cur_pack_name;
+	struct chunkfile *cf = NULL;
 
 	fd = git_open(midx_name);
 
@@ -113,62 +126,27 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local
 
 	m->num_packs = get_be32(m->data + MIDX_BYTE_NUM_PACKS);
 
-	for (i = 0; i < m->num_chunks; i++) {
-		uint32_t chunk_id = get_be32(m->data + MIDX_HEADER_SIZE +
-					     MIDX_CHUNKLOOKUP_WIDTH * i);
-		uint64_t chunk_offset = get_be64(m->data + MIDX_HEADER_SIZE + 4 +
-						 MIDX_CHUNKLOOKUP_WIDTH * i);
+	cf = init_chunkfile(NULL);
 
-		if (chunk_offset >= m->data_len)
-			die(_("invalid chunk offset (too large)"));
+	if (read_table_of_contents(cf, m->data, midx_size,
+				   MIDX_HEADER_SIZE, m->num_chunks))
+		goto cleanup_fail;
 
-		switch (chunk_id) {
-			case MIDX_CHUNKID_PACKNAMES:
-				m->chunk_pack_names = m->data + chunk_offset;
-				break;
-
-			case MIDX_CHUNKID_OIDFANOUT:
-				m->chunk_oid_fanout = (uint32_t *)(m->data + chunk_offset);
-				break;
-
-			case MIDX_CHUNKID_OIDLOOKUP:
-				m->chunk_oid_lookup = m->data + chunk_offset;
-				break;
-
-			case MIDX_CHUNKID_OBJECTOFFSETS:
-				m->chunk_object_offsets = m->data + chunk_offset;
-				break;
-
-			case MIDX_CHUNKID_LARGEOFFSETS:
-				m->chunk_large_offsets = m->data + chunk_offset;
-				break;
-
-			case 0:
-				die(_("terminating multi-pack-index chunk id appears earlier than expected"));
-				break;
-
-			default:
-				/*
-				 * Do nothing on unrecognized chunks, allowing future
-				 * extensions to add optional chunks.
-				 */
-				break;
-		}
-	}
-
-	if (!m->chunk_pack_names)
+	if (pair_chunk(cf, MIDX_CHUNKID_PACKNAMES, &m->chunk_pack_names) == CHUNK_NOT_FOUND)
 		die(_("multi-pack-index missing required pack-name chunk"));
-	if (!m->chunk_oid_fanout)
+	if (read_chunk(cf, MIDX_CHUNKID_OIDFANOUT, midx_read_oid_fanout, m) == CHUNK_NOT_FOUND)
 		die(_("multi-pack-index missing required OID fanout chunk"));
-	if (!m->chunk_oid_lookup)
+	if (pair_chunk(cf, MIDX_CHUNKID_OIDLOOKUP, &m->chunk_oid_lookup) == CHUNK_NOT_FOUND)
 		die(_("multi-pack-index missing required OID lookup chunk"));
-	if (!m->chunk_object_offsets)
+	if (pair_chunk(cf, MIDX_CHUNKID_OBJECTOFFSETS, &m->chunk_object_offsets) == CHUNK_NOT_FOUND)
 		die(_("multi-pack-index missing required object offsets chunk"));
 
+	pair_chunk(cf, MIDX_CHUNKID_LARGEOFFSETS, &m->chunk_large_offsets);
+
 	m->num_objects = ntohl(m->chunk_oid_fanout[255]);
 
-	m->pack_names = xcalloc(m->num_packs, sizeof(*m->pack_names));
-	m->packs = xcalloc(m->num_packs, sizeof(*m->packs));
+	CALLOC_ARRAY(m->pack_names, m->num_packs);
+	CALLOC_ARRAY(m->packs, m->num_packs);
 
 	cur_pack_name = (const char *)m->chunk_pack_names;
 	for (i = 0; i < m->num_packs; i++) {
@@ -190,6 +168,7 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local
 cleanup_fail:
 	free(m);
 	free(midx_name);
+	free(cf);
 	if (midx_map)
 		munmap(midx_map, midx_size);
 	if (0 <= fd)
@@ -265,7 +244,7 @@ static off_t nth_midxed_offset(struct multi_pack_index *m, uint32_t pos)
 	const unsigned char *offset_data;
 	uint32_t offset32;
 
-	offset_data = m->chunk_object_offsets + pos * MIDX_CHUNK_OFFSET_WIDTH;
+	offset_data = m->chunk_object_offsets + (off_t)pos * MIDX_CHUNK_OFFSET_WIDTH;
 	offset32 = get_be32(offset_data + sizeof(uint32_t));
 
 	if (m->chunk_large_offsets && offset32 & MIDX_LARGE_OFFSET_NEEDED) {
@@ -281,7 +260,8 @@ static off_t nth_midxed_offset(struct multi_pack_index *m, uint32_t pos)
 
 static uint32_t nth_midxed_pack_int_id(struct multi_pack_index *m, uint32_t pos)
 {
-	return get_be32(m->chunk_object_offsets + pos * MIDX_CHUNK_OFFSET_WIDTH);
+	return get_be32(m->chunk_object_offsets +
+			(off_t)pos * MIDX_CHUNK_OFFSET_WIDTH);
 }
 
 static int nth_midxed_pack_entry(struct repository *r,
@@ -451,49 +431,56 @@ static int pack_info_compare(const void *_a, const void *_b)
 	return strcmp(a->pack_name, b->pack_name);
 }
 
-struct pack_list {
+struct write_midx_context {
 	struct pack_info *info;
 	uint32_t nr;
 	uint32_t alloc;
 	struct multi_pack_index *m;
 	struct progress *progress;
 	unsigned pack_paths_checked;
+
+	struct pack_midx_entry *entries;
+	uint32_t entries_nr;
+
+	uint32_t *pack_perm;
+	unsigned large_offsets_needed:1;
+	uint32_t num_large_offsets;
 };
 
 static void add_pack_to_midx(const char *full_path, size_t full_path_len,
 			     const char *file_name, void *data)
 {
-	struct pack_list *packs = (struct pack_list *)data;
+	struct write_midx_context *ctx = data;
 
 	if (ends_with(file_name, ".idx")) {
-		display_progress(packs->progress, ++packs->pack_paths_checked);
-		if (packs->m && midx_contains_pack(packs->m, file_name))
+		display_progress(ctx->progress, ++ctx->pack_paths_checked);
+		if (ctx->m && midx_contains_pack(ctx->m, file_name))
 			return;
 
-		ALLOC_GROW(packs->info, packs->nr + 1, packs->alloc);
+		ALLOC_GROW(ctx->info, ctx->nr + 1, ctx->alloc);
 
-		packs->info[packs->nr].p = add_packed_git(full_path,
-							  full_path_len,
-							  0);
+		ctx->info[ctx->nr].p = add_packed_git(full_path,
+						      full_path_len,
+						      0);
 
-		if (!packs->info[packs->nr].p) {
+		if (!ctx->info[ctx->nr].p) {
 			warning(_("failed to add packfile '%s'"),
 				full_path);
 			return;
 		}
 
-		if (open_pack_index(packs->info[packs->nr].p)) {
+		if (open_pack_index(ctx->info[ctx->nr].p)) {
 			warning(_("failed to open pack-index '%s'"),
 				full_path);
-			close_pack(packs->info[packs->nr].p);
-			FREE_AND_NULL(packs->info[packs->nr].p);
+			close_pack(ctx->info[ctx->nr].p);
+			FREE_AND_NULL(ctx->info[ctx->nr].p);
 			return;
 		}
 
-		packs->info[packs->nr].pack_name = xstrdup(file_name);
-		packs->info[packs->nr].orig_pack_int_id = packs->nr;
-		packs->info[packs->nr].expired = 0;
-		packs->nr++;
+		ctx->info[ctx->nr].pack_name = xstrdup(file_name);
+		ctx->info[ctx->nr].orig_pack_int_id = ctx->nr;
+		ctx->info[ctx->nr].expired = 0;
+		ctx->nr++;
 	}
 }
 
@@ -643,27 +630,26 @@ static struct pack_midx_entry *get_sorted_entries(struct multi_pack_index *m,
 	return deduplicated_entries;
 }
 
-static size_t write_midx_pack_names(struct hashfile *f,
-				    struct pack_info *info,
-				    uint32_t num_packs)
+static int write_midx_pack_names(struct hashfile *f, void *data)
 {
+	struct write_midx_context *ctx = data;
 	uint32_t i;
 	unsigned char padding[MIDX_CHUNK_ALIGNMENT];
 	size_t written = 0;
 
-	for (i = 0; i < num_packs; i++) {
+	for (i = 0; i < ctx->nr; i++) {
 		size_t writelen;
 
-		if (info[i].expired)
+		if (ctx->info[i].expired)
 			continue;
 
-		if (i && strcmp(info[i].pack_name, info[i - 1].pack_name) <= 0)
+		if (i && strcmp(ctx->info[i].pack_name, ctx->info[i - 1].pack_name) <= 0)
 			BUG("incorrect pack-file order: %s before %s",
-			    info[i - 1].pack_name,
-			    info[i].pack_name);
+			    ctx->info[i - 1].pack_name,
+			    ctx->info[i].pack_name);
 
-		writelen = strlen(info[i].pack_name) + 1;
-		hashwrite(f, info[i].pack_name, writelen);
+		writelen = strlen(ctx->info[i].pack_name) + 1;
+		hashwrite(f, ctx->info[i].pack_name, writelen);
 		written += writelen;
 	}
 
@@ -672,18 +658,17 @@ static size_t write_midx_pack_names(struct hashfile *f,
 	if (i < MIDX_CHUNK_ALIGNMENT) {
 		memset(padding, 0, sizeof(padding));
 		hashwrite(f, padding, i);
-		written += i;
 	}
 
-	return written;
+	return 0;
 }
 
-static size_t write_midx_oid_fanout(struct hashfile *f,
-				    struct pack_midx_entry *objects,
-				    uint32_t nr_objects)
+static int write_midx_oid_fanout(struct hashfile *f,
+				 void *data)
 {
-	struct pack_midx_entry *list = objects;
-	struct pack_midx_entry *last = objects + nr_objects;
+	struct write_midx_context *ctx = data;
+	struct pack_midx_entry *list = ctx->entries;
+	struct pack_midx_entry *last = ctx->entries + ctx->entries_nr;
 	uint32_t count = 0;
 	uint32_t i;
 
@@ -704,21 +689,21 @@ static size_t write_midx_oid_fanout(struct hashfile *f,
 		list = next;
 	}
 
-	return MIDX_CHUNK_FANOUT_SIZE;
+	return 0;
 }
 
-static size_t write_midx_oid_lookup(struct hashfile *f, unsigned char hash_len,
-				    struct pack_midx_entry *objects,
-				    uint32_t nr_objects)
+static int write_midx_oid_lookup(struct hashfile *f,
+				 void *data)
 {
-	struct pack_midx_entry *list = objects;
+	struct write_midx_context *ctx = data;
+	unsigned char hash_len = the_hash_algo->rawsz;
+	struct pack_midx_entry *list = ctx->entries;
 	uint32_t i;
-	size_t written = 0;
 
-	for (i = 0; i < nr_objects; i++) {
+	for (i = 0; i < ctx->entries_nr; i++) {
 		struct pack_midx_entry *obj = list++;
 
-		if (i < nr_objects - 1) {
+		if (i < ctx->entries_nr - 1) {
 			struct pack_midx_entry *next = list;
 			if (oidcmp(&obj->oid, &next->oid) >= 0)
 				BUG("OIDs not in order: %s >= %s",
@@ -727,50 +712,48 @@ static size_t write_midx_oid_lookup(struct hashfile *f, unsigned char hash_len,
 		}
 
 		hashwrite(f, obj->oid.hash, (int)hash_len);
-		written += hash_len;
 	}
 
-	return written;
+	return 0;
 }
 
-static size_t write_midx_object_offsets(struct hashfile *f, int large_offset_needed,
-					uint32_t *perm,
-					struct pack_midx_entry *objects, uint32_t nr_objects)
+static int write_midx_object_offsets(struct hashfile *f,
+				     void *data)
 {
-	struct pack_midx_entry *list = objects;
+	struct write_midx_context *ctx = data;
+	struct pack_midx_entry *list = ctx->entries;
 	uint32_t i, nr_large_offset = 0;
-	size_t written = 0;
 
-	for (i = 0; i < nr_objects; i++) {
+	for (i = 0; i < ctx->entries_nr; i++) {
 		struct pack_midx_entry *obj = list++;
 
-		if (perm[obj->pack_int_id] == PACK_EXPIRED)
+		if (ctx->pack_perm[obj->pack_int_id] == PACK_EXPIRED)
 			BUG("object %s is in an expired pack with int-id %d",
 			    oid_to_hex(&obj->oid),
 			    obj->pack_int_id);
 
-		hashwrite_be32(f, perm[obj->pack_int_id]);
+		hashwrite_be32(f, ctx->pack_perm[obj->pack_int_id]);
 
-		if (large_offset_needed && obj->offset >> 31)
+		if (ctx->large_offsets_needed && obj->offset >> 31)
 			hashwrite_be32(f, MIDX_LARGE_OFFSET_NEEDED | nr_large_offset++);
-		else if (!large_offset_needed && obj->offset >> 32)
+		else if (!ctx->large_offsets_needed && obj->offset >> 32)
 			BUG("object %s requires a large offset (%"PRIx64") but the MIDX is not writing large offsets!",
 			    oid_to_hex(&obj->oid),
 			    obj->offset);
 		else
 			hashwrite_be32(f, (uint32_t)obj->offset);
-
-		written += MIDX_CHUNK_OFFSET_WIDTH;
 	}
 
-	return written;
+	return 0;
 }
 
-static size_t write_midx_large_offsets(struct hashfile *f, uint32_t nr_large_offset,
-				       struct pack_midx_entry *objects, uint32_t nr_objects)
+static int write_midx_large_offsets(struct hashfile *f,
+				    void *data)
 {
-	struct pack_midx_entry *list = objects, *end = objects + nr_objects;
-	size_t written = 0;
+	struct write_midx_context *ctx = data;
+	struct pack_midx_entry *list = ctx->entries;
+	struct pack_midx_entry *end = ctx->entries + ctx->entries_nr;
+	uint32_t nr_large_offset = ctx->num_large_offsets;
 
 	while (nr_large_offset) {
 		struct pack_midx_entry *obj;
@@ -785,34 +768,26 @@ static size_t write_midx_large_offsets(struct hashfile *f, uint32_t nr_large_off
 		if (!(offset >> 31))
 			continue;
 
-		written += hashwrite_be64(f, offset);
+		hashwrite_be64(f, offset);
 
 		nr_large_offset--;
 	}
 
-	return written;
+	return 0;
 }
 
 static int write_midx_internal(const char *object_dir, struct multi_pack_index *m,
 			       struct string_list *packs_to_drop, unsigned flags)
 {
-	unsigned char cur_chunk, num_chunks = 0;
 	char *midx_name;
 	uint32_t i;
 	struct hashfile *f = NULL;
 	struct lock_file lk;
-	struct pack_list packs;
-	uint32_t *pack_perm = NULL;
-	uint64_t written = 0;
-	uint32_t chunk_ids[MIDX_MAX_CHUNKS + 1];
-	uint64_t chunk_offsets[MIDX_MAX_CHUNKS + 1];
-	uint32_t nr_entries, num_large_offsets = 0;
-	struct pack_midx_entry *entries = NULL;
-	struct progress *progress = NULL;
-	int large_offsets_needed = 0;
+	struct write_midx_context ctx = { 0 };
 	int pack_name_concat_len = 0;
 	int dropped_packs = 0;
 	int result = 0;
+	struct chunkfile *cf;
 
 	midx_name = get_midx_filename(object_dir);
 	if (safe_create_leading_directories(midx_name))
@@ -820,61 +795,62 @@ static int write_midx_internal(const char *object_dir, struct multi_pack_index *
 			  midx_name);
 
 	if (m)
-		packs.m = m;
+		ctx.m = m;
 	else
-		packs.m = load_multi_pack_index(object_dir, 1);
+		ctx.m = load_multi_pack_index(object_dir, 1);
 
-	packs.nr = 0;
-	packs.alloc = packs.m ? packs.m->num_packs : 16;
-	packs.info = NULL;
-	ALLOC_ARRAY(packs.info, packs.alloc);
+	ctx.nr = 0;
+	ctx.alloc = ctx.m ? ctx.m->num_packs : 16;
+	ctx.info = NULL;
+	ALLOC_ARRAY(ctx.info, ctx.alloc);
 
-	if (packs.m) {
-		for (i = 0; i < packs.m->num_packs; i++) {
-			ALLOC_GROW(packs.info, packs.nr + 1, packs.alloc);
+	if (ctx.m) {
+		for (i = 0; i < ctx.m->num_packs; i++) {
+			ALLOC_GROW(ctx.info, ctx.nr + 1, ctx.alloc);
 
-			packs.info[packs.nr].orig_pack_int_id = i;
-			packs.info[packs.nr].pack_name = xstrdup(packs.m->pack_names[i]);
-			packs.info[packs.nr].p = NULL;
-			packs.info[packs.nr].expired = 0;
-			packs.nr++;
+			ctx.info[ctx.nr].orig_pack_int_id = i;
+			ctx.info[ctx.nr].pack_name = xstrdup(ctx.m->pack_names[i]);
+			ctx.info[ctx.nr].p = NULL;
+			ctx.info[ctx.nr].expired = 0;
+			ctx.nr++;
 		}
 	}
 
-	packs.pack_paths_checked = 0;
+	ctx.pack_paths_checked = 0;
 	if (flags & MIDX_PROGRESS)
-		packs.progress = start_delayed_progress(_("Adding packfiles to multi-pack-index"), 0);
+		ctx.progress = start_delayed_progress(_("Adding packfiles to multi-pack-index"), 0);
 	else
-		packs.progress = NULL;
+		ctx.progress = NULL;
 
-	for_each_file_in_pack_dir(object_dir, add_pack_to_midx, &packs);
-	stop_progress(&packs.progress);
+	for_each_file_in_pack_dir(object_dir, add_pack_to_midx, &ctx);
+	stop_progress(&ctx.progress);
 
-	if (packs.m && packs.nr == packs.m->num_packs && !packs_to_drop)
+	if (ctx.m && ctx.nr == ctx.m->num_packs && !packs_to_drop)
 		goto cleanup;
 
-	entries = get_sorted_entries(packs.m, packs.info, packs.nr, &nr_entries);
+	ctx.entries = get_sorted_entries(ctx.m, ctx.info, ctx.nr, &ctx.entries_nr);
 
-	for (i = 0; i < nr_entries; i++) {
-		if (entries[i].offset > 0x7fffffff)
-			num_large_offsets++;
-		if (entries[i].offset > 0xffffffff)
-			large_offsets_needed = 1;
+	ctx.large_offsets_needed = 0;
+	for (i = 0; i < ctx.entries_nr; i++) {
+		if (ctx.entries[i].offset > 0x7fffffff)
+			ctx.num_large_offsets++;
+		if (ctx.entries[i].offset > 0xffffffff)
+			ctx.large_offsets_needed = 1;
 	}
 
-	QSORT(packs.info, packs.nr, pack_info_compare);
+	QSORT(ctx.info, ctx.nr, pack_info_compare);
 
 	if (packs_to_drop && packs_to_drop->nr) {
 		int drop_index = 0;
 		int missing_drops = 0;
 
-		for (i = 0; i < packs.nr && drop_index < packs_to_drop->nr; i++) {
-			int cmp = strcmp(packs.info[i].pack_name,
+		for (i = 0; i < ctx.nr && drop_index < packs_to_drop->nr; i++) {
+			int cmp = strcmp(ctx.info[i].pack_name,
 					 packs_to_drop->items[drop_index].string);
 
 			if (!cmp) {
 				drop_index++;
-				packs.info[i].expired = 1;
+				ctx.info[i].expired = 1;
 			} else if (cmp > 0) {
 				error(_("did not see pack-file %s to drop"),
 				      packs_to_drop->items[drop_index].string);
@@ -882,7 +858,7 @@ static int write_midx_internal(const char *object_dir, struct multi_pack_index *
 				missing_drops++;
 				i--;
 			} else {
-				packs.info[i].expired = 0;
+				ctx.info[i].expired = 0;
 			}
 		}
 
@@ -898,19 +874,19 @@ static int write_midx_internal(const char *object_dir, struct multi_pack_index *
 	 *
 	 * pack_perm[old_id] = new_id
 	 */
-	ALLOC_ARRAY(pack_perm, packs.nr);
-	for (i = 0; i < packs.nr; i++) {
-		if (packs.info[i].expired) {
+	ALLOC_ARRAY(ctx.pack_perm, ctx.nr);
+	for (i = 0; i < ctx.nr; i++) {
+		if (ctx.info[i].expired) {
 			dropped_packs++;
-			pack_perm[packs.info[i].orig_pack_int_id] = PACK_EXPIRED;
+			ctx.pack_perm[ctx.info[i].orig_pack_int_id] = PACK_EXPIRED;
 		} else {
-			pack_perm[packs.info[i].orig_pack_int_id] = i - dropped_packs;
+			ctx.pack_perm[ctx.info[i].orig_pack_int_id] = i - dropped_packs;
 		}
 	}
 
-	for (i = 0; i < packs.nr; i++) {
-		if (!packs.info[i].expired)
-			pack_name_concat_len += strlen(packs.info[i].pack_name) + 1;
+	for (i = 0; i < ctx.nr; i++) {
+		if (!ctx.info[i].expired)
+			pack_name_concat_len += strlen(ctx.info[i].pack_name) + 1;
 	}
 
 	if (pack_name_concat_len % MIDX_CHUNK_ALIGNMENT)
@@ -921,123 +897,52 @@ static int write_midx_internal(const char *object_dir, struct multi_pack_index *
 	f = hashfd(get_lock_file_fd(&lk), get_lock_file_path(&lk));
 	FREE_AND_NULL(midx_name);
 
-	if (packs.m)
-		close_midx(packs.m);
+	if (ctx.m)
+		close_midx(ctx.m);
 
-	cur_chunk = 0;
-	num_chunks = large_offsets_needed ? 5 : 4;
-
-	if (packs.nr - dropped_packs == 0) {
+	if (ctx.nr - dropped_packs == 0) {
 		error(_("no pack files to index."));
 		result = 1;
 		goto cleanup;
 	}
 
-	written = write_midx_header(f, num_chunks, packs.nr - dropped_packs);
+	cf = init_chunkfile(f);
 
-	chunk_ids[cur_chunk] = MIDX_CHUNKID_PACKNAMES;
-	chunk_offsets[cur_chunk] = written + (num_chunks + 1) * MIDX_CHUNKLOOKUP_WIDTH;
+	add_chunk(cf, MIDX_CHUNKID_PACKNAMES, pack_name_concat_len,
+		  write_midx_pack_names);
+	add_chunk(cf, MIDX_CHUNKID_OIDFANOUT, MIDX_CHUNK_FANOUT_SIZE,
+		  write_midx_oid_fanout);
+	add_chunk(cf, MIDX_CHUNKID_OIDLOOKUP,
+		  (size_t)ctx.entries_nr * the_hash_algo->rawsz,
+		  write_midx_oid_lookup);
+	add_chunk(cf, MIDX_CHUNKID_OBJECTOFFSETS,
+		  (size_t)ctx.entries_nr * MIDX_CHUNK_OFFSET_WIDTH,
+		  write_midx_object_offsets);
 
-	cur_chunk++;
-	chunk_ids[cur_chunk] = MIDX_CHUNKID_OIDFANOUT;
-	chunk_offsets[cur_chunk] = chunk_offsets[cur_chunk - 1] + pack_name_concat_len;
+	if (ctx.large_offsets_needed)
+		add_chunk(cf, MIDX_CHUNKID_LARGEOFFSETS,
+			(size_t)ctx.num_large_offsets * MIDX_CHUNK_LARGE_OFFSET_WIDTH,
+			write_midx_large_offsets);
 
-	cur_chunk++;
-	chunk_ids[cur_chunk] = MIDX_CHUNKID_OIDLOOKUP;
-	chunk_offsets[cur_chunk] = chunk_offsets[cur_chunk - 1] + MIDX_CHUNK_FANOUT_SIZE;
-
-	cur_chunk++;
-	chunk_ids[cur_chunk] = MIDX_CHUNKID_OBJECTOFFSETS;
-	chunk_offsets[cur_chunk] = chunk_offsets[cur_chunk - 1] + nr_entries * the_hash_algo->rawsz;
-
-	cur_chunk++;
-	chunk_offsets[cur_chunk] = chunk_offsets[cur_chunk - 1] + nr_entries * MIDX_CHUNK_OFFSET_WIDTH;
-	if (large_offsets_needed) {
-		chunk_ids[cur_chunk] = MIDX_CHUNKID_LARGEOFFSETS;
-
-		cur_chunk++;
-		chunk_offsets[cur_chunk] = chunk_offsets[cur_chunk - 1] +
-					   num_large_offsets * MIDX_CHUNK_LARGE_OFFSET_WIDTH;
-	}
-
-	chunk_ids[cur_chunk] = 0;
-
-	for (i = 0; i <= num_chunks; i++) {
-		if (i && chunk_offsets[i] < chunk_offsets[i - 1])
-			BUG("incorrect chunk offsets: %"PRIu64" before %"PRIu64,
-			    chunk_offsets[i - 1],
-			    chunk_offsets[i]);
-
-		if (chunk_offsets[i] % MIDX_CHUNK_ALIGNMENT)
-			BUG("chunk offset %"PRIu64" is not properly aligned",
-			    chunk_offsets[i]);
-
-		hashwrite_be32(f, chunk_ids[i]);
-		hashwrite_be64(f, chunk_offsets[i]);
-
-		written += MIDX_CHUNKLOOKUP_WIDTH;
-	}
-
-	if (flags & MIDX_PROGRESS)
-		progress = start_delayed_progress(_("Writing chunks to multi-pack-index"),
-					  num_chunks);
-	for (i = 0; i < num_chunks; i++) {
-		if (written != chunk_offsets[i])
-			BUG("incorrect chunk offset (%"PRIu64" != %"PRIu64") for chunk id %"PRIx32,
-			    chunk_offsets[i],
-			    written,
-			    chunk_ids[i]);
-
-		switch (chunk_ids[i]) {
-			case MIDX_CHUNKID_PACKNAMES:
-				written += write_midx_pack_names(f, packs.info, packs.nr);
-				break;
-
-			case MIDX_CHUNKID_OIDFANOUT:
-				written += write_midx_oid_fanout(f, entries, nr_entries);
-				break;
-
-			case MIDX_CHUNKID_OIDLOOKUP:
-				written += write_midx_oid_lookup(f, the_hash_algo->rawsz, entries, nr_entries);
-				break;
-
-			case MIDX_CHUNKID_OBJECTOFFSETS:
-				written += write_midx_object_offsets(f, large_offsets_needed, pack_perm, entries, nr_entries);
-				break;
-
-			case MIDX_CHUNKID_LARGEOFFSETS:
-				written += write_midx_large_offsets(f, num_large_offsets, entries, nr_entries);
-				break;
-
-			default:
-				BUG("trying to write unknown chunk id %"PRIx32,
-				    chunk_ids[i]);
-		}
-
-		display_progress(progress, i + 1);
-	}
-	stop_progress(&progress);
-
-	if (written != chunk_offsets[num_chunks])
-		BUG("incorrect final offset %"PRIu64" != %"PRIu64,
-		    written,
-		    chunk_offsets[num_chunks]);
+	write_midx_header(f, get_num_chunks(cf), ctx.nr - dropped_packs);
+	write_chunkfile(cf, &ctx);
 
 	finalize_hashfile(f, NULL, CSUM_FSYNC | CSUM_HASH_IN_STREAM);
+	free_chunkfile(cf);
 	commit_lock_file(&lk);
 
 cleanup:
-	for (i = 0; i < packs.nr; i++) {
-		if (packs.info[i].p) {
-			close_pack(packs.info[i].p);
-			free(packs.info[i].p);
+	for (i = 0; i < ctx.nr; i++) {
+		if (ctx.info[i].p) {
+			close_pack(ctx.info[i].p);
+			free(ctx.info[i].p);
 		}
-		free(packs.info[i].pack_name);
+		free(ctx.info[i].pack_name);
 	}
 
-	free(packs.info);
-	free(entries);
-	free(pack_perm);
+	free(ctx.info);
+	free(ctx.entries);
+	free(ctx.pack_perm);
 	free(midx_name);
 	return result;
 }
@@ -1239,7 +1144,7 @@ int expire_midx_packs(struct repository *r, const char *object_dir, unsigned fla
 	if (!m)
 		return 0;
 
-	count = xcalloc(m->num_packs, sizeof(uint32_t));
+	CALLOC_ARRAY(count, m->num_packs);
 
 	if (flags & MIDX_PROGRESS)
 		progress = start_delayed_progress(_("Counting referenced objects"),
@@ -1410,7 +1315,7 @@ int midx_repack(struct repository *r, const char *object_dir, size_t batch_size,
 	if (!m)
 		return 0;
 
-	include_pack = xcalloc(m->num_packs, sizeof(unsigned char));
+	CALLOC_ARRAY(include_pack, m->num_packs);
 
 	if (batch_size) {
 		if (fill_included_packs_batch(r, m, include_pack, batch_size))
diff --git a/name-hash.c b/name-hash.c
index 5d3c7b1..ce28f3f 100644
--- a/name-hash.c
+++ b/name-hash.c
@@ -7,6 +7,7 @@
  */
 #include "cache.h"
 #include "thread-utils.h"
+#include "trace2.h"
 
 struct dir_entry {
 	struct hashmap_entry ent;
@@ -224,7 +225,7 @@ static void init_dir_mutex(void)
 {
 	int j;
 
-	lazy_dir_mutex_array = xcalloc(LAZY_MAX_MUTEX, sizeof(pthread_mutex_t));
+	CALLOC_ARRAY(lazy_dir_mutex_array, LAZY_MAX_MUTEX);
 
 	for (j = 0; j < LAZY_MAX_MUTEX; j++)
 		init_recursive_mutex(&lazy_dir_mutex_array[j]);
@@ -513,9 +514,9 @@ static void threaded_lazy_init_name_hash(
 	k_start = 0;
 	nr_each = DIV_ROUND_UP(istate->cache_nr, lazy_nr_dir_threads);
 
-	lazy_entries = xcalloc(istate->cache_nr, sizeof(struct lazy_entry));
-	td_dir = xcalloc(lazy_nr_dir_threads, sizeof(struct lazy_dir_thread_data));
-	td_name = xcalloc(1, sizeof(struct lazy_name_thread_data));
+	CALLOC_ARRAY(lazy_entries, istate->cache_nr);
+	CALLOC_ARRAY(td_dir, lazy_nr_dir_threads);
+	CALLOC_ARRAY(td_name, 1);
 
 	init_dir_mutex();
 
@@ -577,6 +578,7 @@ static void lazy_init_name_hash(struct index_state *istate)
 	if (istate->name_hash_initialized)
 		return;
 	trace_performance_enter();
+	trace2_region_enter("index", "name-hash-init", istate->repo);
 	hashmap_init(&istate->name_hash, cache_entry_cmp, NULL, istate->cache_nr);
 	hashmap_init(&istate->dir_hash, dir_entry_cmp, NULL, istate->cache_nr);
 
@@ -597,6 +599,7 @@ static void lazy_init_name_hash(struct index_state *istate)
 	}
 
 	istate->name_hash_initialized = 1;
+	trace2_region_leave("index", "name-hash-init", istate->repo);
 	trace_performance_leave("initialize name hash");
 }
 
diff --git a/negotiator/default.c b/negotiator/default.c
index 4b78f6b..434189a 100644
--- a/negotiator/default.c
+++ b/negotiator/default.c
@@ -167,7 +167,7 @@ void default_negotiator_init(struct fetch_negotiator *negotiator)
 	negotiator->next = next;
 	negotiator->ack = ack;
 	negotiator->release = release;
-	negotiator->data = ns = xcalloc(1, sizeof(*ns));
+	negotiator->data = CALLOC_ARRAY(ns, 1);
 	ns->rev_list.compare = compare_commits_by_commit_date;
 
 	if (marked)
diff --git a/negotiator/skipping.c b/negotiator/skipping.c
index dffbc76..1236e79 100644
--- a/negotiator/skipping.c
+++ b/negotiator/skipping.c
@@ -62,7 +62,7 @@ static struct entry *rev_list_push(struct data *data, struct commit *commit, int
 	struct entry *entry;
 	commit->object.flags |= mark | SEEN;
 
-	entry = xcalloc(1, sizeof(*entry));
+	CALLOC_ARRAY(entry, 1);
 	entry->commit = commit;
 	prio_queue_put(&data->rev_list, entry);
 
@@ -241,7 +241,7 @@ void skipping_negotiator_init(struct fetch_negotiator *negotiator)
 	negotiator->next = next;
 	negotiator->ack = ack;
 	negotiator->release = release;
-	negotiator->data = data = xcalloc(1, sizeof(*data));
+	negotiator->data = CALLOC_ARRAY(data, 1);
 	data->rev_list.compare = compare;
 
 	if (marked)
diff --git a/notes-merge.c b/notes-merge.c
index 2fe724f..d2771fa 100644
--- a/notes-merge.c
+++ b/notes-merge.c
@@ -136,7 +136,7 @@ static struct notes_merge_pair *diff_tree_remote(struct notes_merge_options *o,
 	diff_tree_oid(base, remote, "", &opt);
 	diffcore_std(&opt);
 
-	changes = xcalloc(diff_queued_diff.nr, sizeof(struct notes_merge_pair));
+	CALLOC_ARRAY(changes, diff_queued_diff.nr);
 
 	for (i = 0; i < diff_queued_diff.nr; i++) {
 		struct diff_filepair *p = diff_queued_diff.queue[i];
diff --git a/notes-utils.c b/notes-utils.c
index 4bf4888..d7d18e3 100644
--- a/notes-utils.c
+++ b/notes-utils.c
@@ -129,7 +129,7 @@ struct notes_rewrite_cfg *init_copy_notes_for_rewrite(const char *cmd)
 	c->cmd = cmd;
 	c->enabled = 1;
 	c->combine = combine_notes_concatenate;
-	c->refs = xcalloc(1, sizeof(struct string_list));
+	CALLOC_ARRAY(c->refs, 1);
 	c->refs->strdup_strings = 1;
 	c->refs_from_env = 0;
 	c->mode_from_env = 0;
diff --git a/notes.c b/notes.c
index d5ac081..a19e4ad 100644
--- a/notes.c
+++ b/notes.c
@@ -452,7 +452,7 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
 			goto handle_non_note;
 		}
 
-		l = xcalloc(1, sizeof(*l));
+		CALLOC_ARRAY(l, 1);
 		oidcpy(&l->key_oid, &object_oid);
 		oidcpy(&l->val_oid, &entry.oid);
 		if (note_tree_insert(t, node, n, l, type,
diff --git a/sha1-file.c b/object-file.c
similarity index 99%
rename from sha1-file.c
rename to object-file.c
index c3c49d2..624af40 100644
--- a/sha1-file.c
+++ b/object-file.c
@@ -3,7 +3,7 @@
  *
  * Copyright (C) Linus Torvalds, 2005
  *
- * This handles basic git sha1 object files - packing, unpacking,
+ * This handles basic git object files - packing, unpacking,
  * creation etc.
  */
 #include "cache.h"
@@ -20,7 +20,7 @@
 #include "tree-walk.h"
 #include "refs.h"
 #include "pack-revindex.h"
-#include "sha1-lookup.h"
+#include "hash-lookup.h"
 #include "bulk-checkin.h"
 #include "repository.h"
 #include "replace-object.h"
@@ -508,9 +508,9 @@ static int alt_odb_usable(struct raw_object_store *o,
  * LF separated.  Its base points at a statically allocated buffer that
  * contains "/the/directory/corresponding/to/.git/objects/...", while
  * its name points just after the slash at the end of ".git/objects/"
- * in the example above, and has enough space to hold 40-byte hex
- * SHA1, an extra slash for the first level indirection, and the
- * terminating NUL.
+ * in the example above, and has enough space to hold all hex characters
+ * of the object ID, an extra slash for the first level indirection, and
+ * the terminating NUL.
  */
 static void read_info_alternates(struct repository *r,
 				 const char *relative_base,
@@ -546,7 +546,7 @@ static int link_alt_odb_entry(struct repository *r, const char *entry,
 		return -1;
 	}
 
-	ent = xcalloc(1, sizeof(*ent));
+	CALLOC_ARRAY(ent, 1);
 	ent->path = xstrdup(pathbuf.buf);
 
 	/* add the alternate entry */
diff --git a/sha1-name.c b/object-name.c
similarity index 98%
rename from sha1-name.c
rename to object-name.c
index 0b23b86..64202de 100644
--- a/sha1-name.c
+++ b/object-name.c
@@ -85,7 +85,7 @@ static void update_candidates(struct disambiguate_state *ds, const struct object
 	/* otherwise, current can be discarded and candidate is still good */
 }
 
-static int match_sha(unsigned, const unsigned char *, const unsigned char *);
+static int match_hash(unsigned, const unsigned char *, const unsigned char *);
 
 static void find_short_object_filename(struct disambiguate_state *ds)
 {
@@ -102,7 +102,7 @@ static void find_short_object_filename(struct disambiguate_state *ds)
 		while (!ds->ambiguous && pos < loose_objects->nr) {
 			const struct object_id *oid;
 			oid = loose_objects->oid + pos;
-			if (!match_sha(ds->len, ds->bin_pfx.hash, oid->hash))
+			if (!match_hash(ds->len, ds->bin_pfx.hash, oid->hash))
 				break;
 			update_candidates(ds, oid);
 			pos++;
@@ -110,7 +110,7 @@ static void find_short_object_filename(struct disambiguate_state *ds)
 	}
 }
 
-static int match_sha(unsigned len, const unsigned char *a, const unsigned char *b)
+static int match_hash(unsigned len, const unsigned char *a, const unsigned char *b)
 {
 	do {
 		if (*a != *b)
@@ -145,7 +145,7 @@ static void unique_in_midx(struct multi_pack_index *m,
 	for (i = first; i < num && !ds->ambiguous; i++) {
 		struct object_id oid;
 		current = nth_midxed_object_oid(&oid, m, i);
-		if (!match_sha(ds->len, ds->bin_pfx.hash, current->hash))
+		if (!match_hash(ds->len, ds->bin_pfx.hash, current->hash))
 			break;
 		update_candidates(ds, current);
 	}
@@ -173,7 +173,7 @@ static void unique_in_pack(struct packed_git *p,
 	for (i = first; i < num && !ds->ambiguous; i++) {
 		struct object_id oid;
 		nth_packed_object_id(&oid, p, i);
-		if (!match_sha(ds->len, ds->bin_pfx.hash, oid.hash))
+		if (!match_hash(ds->len, ds->bin_pfx.hash, oid.hash))
 			break;
 		update_candidates(ds, &oid);
 	}
@@ -483,7 +483,7 @@ static enum get_oid_result get_short_oid(struct repository *r,
 	if (!quietly && (status == SHORT_NAME_AMBIGUOUS)) {
 		struct oid_array collect = OID_ARRAY_INIT;
 
-		error(_("short SHA1 %s is ambiguous"), ds.hex_pfx);
+		error(_("short object ID %s is ambiguous"), ds.hex_pfx);
 
 		/*
 		 * We may still have ambiguity if we simply saw a series of
@@ -1811,7 +1811,7 @@ static enum get_oid_result get_oid_with_context_1(struct repository *repo,
 	if (!ret)
 		return ret;
 	/*
-	 * sha1:path --> object name of path in ent sha1
+	 * tree:path --> object name of path in tree
 	 * :path -> object name of absolute path in index
 	 * :./path -> object name of path relative to cwd in index
 	 * :[0-3]:path -> object name of path in index at stage
@@ -1949,6 +1949,6 @@ enum get_oid_result get_oid_with_context(struct repository *repo,
 					 struct object_context *oc)
 {
 	if (flags & GET_OID_FOLLOW_SYMLINKS && flags & GET_OID_ONLY_TO_DIE)
-		BUG("incompatible flags for get_sha1_with_context");
+		BUG("incompatible flags for get_oid_with_context");
 	return get_oid_with_context_1(repo, str, flags, NULL, oid, oc);
 }
diff --git a/object-store.h b/object-store.h
index c4fc9dd..541dab0 100644
--- a/object-store.h
+++ b/object-store.h
@@ -85,6 +85,9 @@ struct packed_git {
 		 multi_pack_index:1;
 	unsigned char hash[GIT_MAX_RAWSZ];
 	struct revindex_entry *revindex;
+	const uint32_t *revindex_data;
+	const uint32_t *revindex_map;
+	size_t revindex_size;
 	/* something like ".git/objects/pack/xxxxx.pack" */
 	char pack_name[FLEX_ARRAY]; /* more */
 };
diff --git a/object.c b/object.c
index 68f80b0..7834378 100644
--- a/object.c
+++ b/object.c
@@ -127,7 +127,7 @@ static void grow_object_hash(struct repository *r)
 	int new_hash_size = r->parsed_objects->obj_hash_size < 32 ? 32 : 2 * r->parsed_objects->obj_hash_size;
 	struct object **new_hash;
 
-	new_hash = xcalloc(new_hash_size, sizeof(struct object *));
+	CALLOC_ARRAY(new_hash, new_hash_size);
 	for (i = 0; i < r->parsed_objects->obj_hash_size; i++) {
 		struct object *obj = r->parsed_objects->obj_hash[i];
 
@@ -412,15 +412,16 @@ void object_array_clear(struct object_array *array)
 }
 
 /*
- * Return true iff array already contains an entry with name.
+ * Return true if array already contains an entry.
  */
-static int contains_name(struct object_array *array, const char *name)
+static int contains_object(struct object_array *array,
+			   const struct object *item, const char *name)
 {
 	unsigned nr = array->nr, i;
 	struct object_array_entry *object = array->objects;
 
 	for (i = 0; i < nr; i++, object++)
-		if (!strcmp(object->name, name))
+		if (item == object->item && !strcmp(object->name, name))
 			return 1;
 	return 0;
 }
@@ -432,7 +433,8 @@ void object_array_remove_duplicates(struct object_array *array)
 
 	array->nr = 0;
 	for (src = 0; src < nr; src++) {
-		if (!contains_name(array, objects[src].name)) {
+		if (!contains_object(array, objects[src].item,
+				     objects[src].name)) {
 			if (src != array->nr)
 				objects[array->nr] = objects[src];
 			array->nr++;
@@ -476,7 +478,7 @@ struct parsed_object_pool *parsed_object_pool_new(void)
 	o->object_state = allocate_alloc_state();
 
 	o->is_shallow = -1;
-	o->shallow_stat = xcalloc(1, sizeof(*o->shallow_stat));
+	CALLOC_ARRAY(o->shallow_stat, 1);
 
 	o->buffer_slab = allocate_commit_buffer_slab();
 
diff --git a/oid-array.c b/oid-array.c
index 8e1bced..73ba76e 100644
--- a/oid-array.c
+++ b/oid-array.c
@@ -1,6 +1,6 @@
 #include "cache.h"
 #include "oid-array.h"
-#include "sha1-lookup.h"
+#include "hash-lookup.h"
 
 void oid_array_append(struct oid_array *array, const struct object_id *oid)
 {
@@ -22,16 +22,16 @@ void oid_array_sort(struct oid_array *array)
 	array->sorted = 1;
 }
 
-static const unsigned char *sha1_access(size_t index, void *table)
+static const struct object_id *oid_access(size_t index, const void *table)
 {
-	struct object_id *array = table;
-	return array[index].hash;
+	const struct object_id *array = table;
+	return &array[index];
 }
 
 int oid_array_lookup(struct oid_array *array, const struct object_id *oid)
 {
 	oid_array_sort(array);
-	return sha1_pos(oid->hash, array->oid, array->nr, sha1_access);
+	return oid_pos(oid, array->oid, array->nr, oid_access);
 }
 
 void oid_array_clear(struct oid_array *array)
diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c
index 5e998bd..88d9e69 100644
--- a/pack-bitmap-write.c
+++ b/pack-bitmap-write.c
@@ -9,9 +9,10 @@
 #include "pack-revindex.h"
 #include "pack.h"
 #include "pack-bitmap.h"
-#include "sha1-lookup.h"
+#include "hash-lookup.h"
 #include "pack-objects.h"
 #include "commit-reach.h"
+#include "prio-queue.h"
 
 struct bitmapped_commit {
 	struct commit *commit;
@@ -29,7 +30,6 @@ struct bitmap_writer {
 	struct ewah_bitmap *tags;
 
 	kh_oid_map_t *bitmaps;
-	kh_oid_map_t *reused;
 	struct packing_data *to_pack;
 
 	struct bitmapped_commit *selected;
@@ -110,10 +110,8 @@ void bitmap_writer_build_type_index(struct packing_data *to_pack,
 /**
  * Compute the actual bitmaps
  */
-static struct object **seen_objects;
-static unsigned int seen_objects_nr, seen_objects_alloc;
 
-static inline void push_bitmapped_commit(struct commit *commit, struct ewah_bitmap *reused)
+static inline void push_bitmapped_commit(struct commit *commit)
 {
 	if (writer.selected_nr >= writer.selected_alloc) {
 		writer.selected_alloc = (writer.selected_alloc + 32) * 2;
@@ -121,27 +119,12 @@ static inline void push_bitmapped_commit(struct commit *commit, struct ewah_bitm
 	}
 
 	writer.selected[writer.selected_nr].commit = commit;
-	writer.selected[writer.selected_nr].bitmap = reused;
+	writer.selected[writer.selected_nr].bitmap = NULL;
 	writer.selected[writer.selected_nr].flags = 0;
 
 	writer.selected_nr++;
 }
 
-static inline void mark_as_seen(struct object *object)
-{
-	ALLOC_GROW(seen_objects, seen_objects_nr + 1, seen_objects_alloc);
-	seen_objects[seen_objects_nr++] = object;
-}
-
-static inline void reset_all_seen(void)
-{
-	unsigned int i;
-	for (i = 0; i < seen_objects_nr; ++i) {
-		seen_objects[i]->flags &= ~(SEEN | ADDED | SHOWN);
-	}
-	seen_objects_nr = 0;
-}
-
 static uint32_t find_object_pos(const struct object_id *oid)
 {
 	struct object_entry *entry = packlist_find(writer.to_pack, oid);
@@ -154,60 +137,6 @@ static uint32_t find_object_pos(const struct object_id *oid)
 	return oe_in_pack_pos(writer.to_pack, entry);
 }
 
-static void show_object(struct object *object, const char *name, void *data)
-{
-	struct bitmap *base = data;
-	bitmap_set(base, find_object_pos(&object->oid));
-	mark_as_seen(object);
-}
-
-static void show_commit(struct commit *commit, void *data)
-{
-	mark_as_seen((struct object *)commit);
-}
-
-static int
-add_to_include_set(struct bitmap *base, struct commit *commit)
-{
-	khiter_t hash_pos;
-	uint32_t bitmap_pos = find_object_pos(&commit->object.oid);
-
-	if (bitmap_get(base, bitmap_pos))
-		return 0;
-
-	hash_pos = kh_get_oid_map(writer.bitmaps, commit->object.oid);
-	if (hash_pos < kh_end(writer.bitmaps)) {
-		struct bitmapped_commit *bc = kh_value(writer.bitmaps, hash_pos);
-		bitmap_or_ewah(base, bc->bitmap);
-		return 0;
-	}
-
-	bitmap_set(base, bitmap_pos);
-	return 1;
-}
-
-static int
-should_include(struct commit *commit, void *_data)
-{
-	struct bitmap *base = _data;
-
-	if (!add_to_include_set(base, commit)) {
-		struct commit_list *parent = commit->parents;
-
-		mark_as_seen((struct object *)commit);
-
-		while (parent) {
-			parent->item->object.flags |= SEEN;
-			mark_as_seen((struct object *)parent->item);
-			parent = parent->next;
-		}
-
-		return 0;
-	}
-
-	return 1;
-}
-
 static void compute_xor_offsets(void)
 {
 	static const int MAX_XOR_OFFSET_SEARCH = 10;
@@ -248,79 +177,326 @@ static void compute_xor_offsets(void)
 	}
 }
 
+struct bb_commit {
+	struct commit_list *reverse_edges;
+	struct bitmap *commit_mask;
+	struct bitmap *bitmap;
+	unsigned selected:1,
+		 maximal:1;
+	unsigned idx; /* within selected array */
+};
+
+define_commit_slab(bb_data, struct bb_commit);
+
+struct bitmap_builder {
+	struct bb_data data;
+	struct commit **commits;
+	size_t commits_nr, commits_alloc;
+};
+
+static void bitmap_builder_init(struct bitmap_builder *bb,
+				struct bitmap_writer *writer,
+				struct bitmap_index *old_bitmap)
+{
+	struct rev_info revs;
+	struct commit *commit;
+	struct commit_list *reusable = NULL;
+	struct commit_list *r;
+	unsigned int i, num_maximal = 0;
+
+	memset(bb, 0, sizeof(*bb));
+	init_bb_data(&bb->data);
+
+	reset_revision_walk();
+	repo_init_revisions(writer->to_pack->repo, &revs, NULL);
+	revs.topo_order = 1;
+	revs.first_parent_only = 1;
+
+	for (i = 0; i < writer->selected_nr; i++) {
+		struct commit *c = writer->selected[i].commit;
+		struct bb_commit *ent = bb_data_at(&bb->data, c);
+
+		ent->selected = 1;
+		ent->maximal = 1;
+		ent->idx = i;
+
+		ent->commit_mask = bitmap_new();
+		bitmap_set(ent->commit_mask, i);
+
+		add_pending_object(&revs, &c->object, "");
+	}
+
+	if (prepare_revision_walk(&revs))
+		die("revision walk setup failed");
+
+	while ((commit = get_revision(&revs))) {
+		struct commit_list *p = commit->parents;
+		struct bb_commit *c_ent;
+
+		parse_commit_or_die(commit);
+
+		c_ent = bb_data_at(&bb->data, commit);
+
+		/*
+		 * If there is no commit_mask, there is no reason to iterate
+		 * over this commit; it is not selected (if it were, it would
+		 * not have a blank commit mask) and all its children have
+		 * existing bitmaps (see the comment starting with "This commit
+		 * has an existing bitmap" below), so it does not contribute
+		 * anything to the final bitmap file or its descendants.
+		 */
+		if (!c_ent->commit_mask)
+			continue;
+
+		if (old_bitmap && bitmap_for_commit(old_bitmap, commit)) {
+			/*
+			 * This commit has an existing bitmap, so we can
+			 * get its bits immediately without an object
+			 * walk. That is, it is reusable as-is and there is no
+			 * need to continue walking beyond it.
+			 *
+			 * Mark it as such and add it to bb->commits separately
+			 * to avoid allocating a position in the commit mask.
+			 */
+			commit_list_insert(commit, &reusable);
+			goto next;
+		}
+
+		if (c_ent->maximal) {
+			num_maximal++;
+			ALLOC_GROW(bb->commits, bb->commits_nr + 1, bb->commits_alloc);
+			bb->commits[bb->commits_nr++] = commit;
+		}
+
+		if (p) {
+			struct bb_commit *p_ent = bb_data_at(&bb->data, p->item);
+			int c_not_p, p_not_c;
+
+			if (!p_ent->commit_mask) {
+				p_ent->commit_mask = bitmap_new();
+				c_not_p = 1;
+				p_not_c = 0;
+			} else {
+				c_not_p = bitmap_is_subset(c_ent->commit_mask, p_ent->commit_mask);
+				p_not_c = bitmap_is_subset(p_ent->commit_mask, c_ent->commit_mask);
+			}
+
+			if (!c_not_p)
+				continue;
+
+			bitmap_or(p_ent->commit_mask, c_ent->commit_mask);
+
+			if (p_not_c)
+				p_ent->maximal = 1;
+			else {
+				p_ent->maximal = 0;
+				free_commit_list(p_ent->reverse_edges);
+				p_ent->reverse_edges = NULL;
+			}
+
+			if (c_ent->maximal) {
+				commit_list_insert(commit, &p_ent->reverse_edges);
+			} else {
+				struct commit_list *cc = c_ent->reverse_edges;
+
+				for (; cc; cc = cc->next) {
+					if (!commit_list_contains(cc->item, p_ent->reverse_edges))
+						commit_list_insert(cc->item, &p_ent->reverse_edges);
+				}
+			}
+		}
+
+next:
+		bitmap_free(c_ent->commit_mask);
+		c_ent->commit_mask = NULL;
+	}
+
+	for (r = reusable; r; r = r->next) {
+		ALLOC_GROW(bb->commits, bb->commits_nr + 1, bb->commits_alloc);
+		bb->commits[bb->commits_nr++] = r->item;
+	}
+
+	trace2_data_intmax("pack-bitmap-write", the_repository,
+			   "num_selected_commits", writer->selected_nr);
+	trace2_data_intmax("pack-bitmap-write", the_repository,
+			   "num_maximal_commits", num_maximal);
+
+	free_commit_list(reusable);
+}
+
+static void bitmap_builder_clear(struct bitmap_builder *bb)
+{
+	clear_bb_data(&bb->data);
+	free(bb->commits);
+	bb->commits_nr = bb->commits_alloc = 0;
+}
+
+static void fill_bitmap_tree(struct bitmap *bitmap,
+			     struct tree *tree)
+{
+	uint32_t pos;
+	struct tree_desc desc;
+	struct name_entry entry;
+
+	/*
+	 * If our bit is already set, then there is nothing to do. Both this
+	 * tree and all of its children will be set.
+	 */
+	pos = find_object_pos(&tree->object.oid);
+	if (bitmap_get(bitmap, pos))
+		return;
+	bitmap_set(bitmap, pos);
+
+	if (parse_tree(tree) < 0)
+		die("unable to load tree object %s",
+		    oid_to_hex(&tree->object.oid));
+	init_tree_desc(&desc, tree->buffer, tree->size);
+
+	while (tree_entry(&desc, &entry)) {
+		switch (object_type(entry.mode)) {
+		case OBJ_TREE:
+			fill_bitmap_tree(bitmap,
+					 lookup_tree(the_repository, &entry.oid));
+			break;
+		case OBJ_BLOB:
+			bitmap_set(bitmap, find_object_pos(&entry.oid));
+			break;
+		default:
+			/* Gitlink, etc; not reachable */
+			break;
+		}
+	}
+
+	free_tree_buffer(tree);
+}
+
+static void fill_bitmap_commit(struct bb_commit *ent,
+			       struct commit *commit,
+			       struct prio_queue *queue,
+			       struct prio_queue *tree_queue,
+			       struct bitmap_index *old_bitmap,
+			       const uint32_t *mapping)
+{
+	if (!ent->bitmap)
+		ent->bitmap = bitmap_new();
+
+	prio_queue_put(queue, commit);
+
+	while (queue->nr) {
+		struct commit_list *p;
+		struct commit *c = prio_queue_get(queue);
+
+		if (old_bitmap && mapping) {
+			struct ewah_bitmap *old = bitmap_for_commit(old_bitmap, c);
+			/*
+			 * If this commit has an old bitmap, then translate that
+			 * bitmap and add its bits to this one. No need to walk
+			 * parents or the tree for this commit.
+			 */
+			if (old && !rebuild_bitmap(mapping, old, ent->bitmap))
+				continue;
+		}
+
+		/*
+		 * Mark ourselves and queue our tree. The commit
+		 * walk ensures we cover all parents.
+		 */
+		bitmap_set(ent->bitmap, find_object_pos(&c->object.oid));
+		prio_queue_put(tree_queue, get_commit_tree(c));
+
+		for (p = c->parents; p; p = p->next) {
+			int pos = find_object_pos(&p->item->object.oid);
+			if (!bitmap_get(ent->bitmap, pos)) {
+				bitmap_set(ent->bitmap, pos);
+				prio_queue_put(queue, p->item);
+			}
+		}
+	}
+
+	while (tree_queue->nr)
+		fill_bitmap_tree(ent->bitmap, prio_queue_get(tree_queue));
+}
+
+static void store_selected(struct bb_commit *ent, struct commit *commit)
+{
+	struct bitmapped_commit *stored = &writer.selected[ent->idx];
+	khiter_t hash_pos;
+	int hash_ret;
+
+	stored->bitmap = bitmap_to_ewah(ent->bitmap);
+
+	hash_pos = kh_put_oid_map(writer.bitmaps, commit->object.oid, &hash_ret);
+	if (hash_ret == 0)
+		die("Duplicate entry when writing index: %s",
+		    oid_to_hex(&commit->object.oid));
+	kh_value(writer.bitmaps, hash_pos) = stored;
+}
+
 void bitmap_writer_build(struct packing_data *to_pack)
 {
-	static const double REUSE_BITMAP_THRESHOLD = 0.2;
-
-	int i, reuse_after, need_reset;
-	struct bitmap *base = bitmap_new();
-	struct rev_info revs;
+	struct bitmap_builder bb;
+	size_t i;
+	int nr_stored = 0; /* for progress */
+	struct prio_queue queue = { compare_commits_by_gen_then_commit_date };
+	struct prio_queue tree_queue = { NULL };
+	struct bitmap_index *old_bitmap;
+	uint32_t *mapping;
 
 	writer.bitmaps = kh_init_oid_map();
 	writer.to_pack = to_pack;
 
 	if (writer.show_progress)
 		writer.progress = start_progress("Building bitmaps", writer.selected_nr);
+	trace2_region_enter("pack-bitmap-write", "building_bitmaps_total",
+			    the_repository);
 
-	repo_init_revisions(to_pack->repo, &revs, NULL);
-	revs.tag_objects = 1;
-	revs.tree_objects = 1;
-	revs.blob_objects = 1;
-	revs.no_walk = 0;
+	old_bitmap = prepare_bitmap_git(to_pack->repo);
+	if (old_bitmap)
+		mapping = create_bitmap_mapping(old_bitmap, to_pack);
+	else
+		mapping = NULL;
 
-	revs.include_check = should_include;
-	reset_revision_walk();
+	bitmap_builder_init(&bb, &writer, old_bitmap);
+	for (i = bb.commits_nr; i > 0; i--) {
+		struct commit *commit = bb.commits[i-1];
+		struct bb_commit *ent = bb_data_at(&bb.data, commit);
+		struct commit *child;
+		int reused = 0;
 
-	reuse_after = writer.selected_nr * REUSE_BITMAP_THRESHOLD;
-	need_reset = 0;
+		fill_bitmap_commit(ent, commit, &queue, &tree_queue,
+				   old_bitmap, mapping);
 
-	for (i = writer.selected_nr - 1; i >= 0; --i) {
-		struct bitmapped_commit *stored;
-		struct object *object;
+		if (ent->selected) {
+			store_selected(ent, commit);
+			nr_stored++;
+			display_progress(writer.progress, nr_stored);
+		}
 
-		khiter_t hash_pos;
-		int hash_ret;
+		while ((child = pop_commit(&ent->reverse_edges))) {
+			struct bb_commit *child_ent =
+				bb_data_at(&bb.data, child);
 
-		stored = &writer.selected[i];
-		object = (struct object *)stored->commit;
-
-		if (stored->bitmap == NULL) {
-			if (i < writer.selected_nr - 1 &&
-			    (need_reset ||
-			     !in_merge_bases(writer.selected[i + 1].commit,
-					     stored->commit))) {
-			    bitmap_reset(base);
-			    reset_all_seen();
+			if (child_ent->bitmap)
+				bitmap_or(child_ent->bitmap, ent->bitmap);
+			else if (reused)
+				child_ent->bitmap = bitmap_dup(ent->bitmap);
+			else {
+				child_ent->bitmap = ent->bitmap;
+				reused = 1;
 			}
-
-			add_pending_object(&revs, object, "");
-			revs.include_check_data = base;
-
-			if (prepare_revision_walk(&revs))
-				die("revision walk setup failed");
-
-			traverse_commit_list(&revs, show_commit, show_object, base);
-
-			object_array_clear(&revs.pending);
-
-			stored->bitmap = bitmap_to_ewah(base);
-			need_reset = 0;
-		} else
-			need_reset = 1;
-
-		if (i >= reuse_after)
-			stored->flags |= BITMAP_FLAG_REUSE;
-
-		hash_pos = kh_put_oid_map(writer.bitmaps, object->oid, &hash_ret);
-		if (hash_ret == 0)
-			die("Duplicate entry when writing index: %s",
-			    oid_to_hex(&object->oid));
-
-		kh_value(writer.bitmaps, hash_pos) = stored;
-		display_progress(writer.progress, writer.selected_nr - i);
+		}
+		if (!reused)
+			bitmap_free(ent->bitmap);
+		ent->bitmap = NULL;
 	}
+	clear_prio_queue(&queue);
+	clear_prio_queue(&tree_queue);
+	bitmap_builder_clear(&bb);
+	free(mapping);
 
-	bitmap_free(base);
+	trace2_region_leave("pack-bitmap-write", "building_bitmaps_total",
+			    the_repository);
+
 	stop_progress(&writer.progress);
 
 	compute_xor_offsets();
@@ -360,35 +536,6 @@ static int date_compare(const void *_a, const void *_b)
 	return (long)b->date - (long)a->date;
 }
 
-void bitmap_writer_reuse_bitmaps(struct packing_data *to_pack)
-{
-	struct bitmap_index *bitmap_git;
-	if (!(bitmap_git = prepare_bitmap_git(to_pack->repo)))
-		return;
-
-	writer.reused = kh_init_oid_map();
-	rebuild_existing_bitmaps(bitmap_git, to_pack, writer.reused,
-				 writer.show_progress);
-	/*
-	 * NEEDSWORK: rebuild_existing_bitmaps() makes writer.reused reference
-	 * some bitmaps in bitmap_git, so we can't free the latter.
-	 */
-}
-
-static struct ewah_bitmap *find_reused_bitmap(const struct object_id *oid)
-{
-	khiter_t hash_pos;
-
-	if (!writer.reused)
-		return NULL;
-
-	hash_pos = kh_get_oid_map(writer.reused, *oid);
-	if (hash_pos >= kh_end(writer.reused))
-		return NULL;
-
-	return kh_value(writer.reused, hash_pos);
-}
-
 void bitmap_writer_select_commits(struct commit **indexed_commits,
 				  unsigned int indexed_commits_nr,
 				  int max_bitmaps)
@@ -402,12 +549,11 @@ void bitmap_writer_select_commits(struct commit **indexed_commits,
 
 	if (indexed_commits_nr < 100) {
 		for (i = 0; i < indexed_commits_nr; ++i)
-			push_bitmapped_commit(indexed_commits[i], NULL);
+			push_bitmapped_commit(indexed_commits[i]);
 		return;
 	}
 
 	for (;;) {
-		struct ewah_bitmap *reused_bitmap = NULL;
 		struct commit *chosen = NULL;
 
 		next = next_commit_index(i);
@@ -422,15 +568,13 @@ void bitmap_writer_select_commits(struct commit **indexed_commits,
 
 		if (next == 0) {
 			chosen = indexed_commits[i];
-			reused_bitmap = find_reused_bitmap(&chosen->object.oid);
 		} else {
 			chosen = indexed_commits[i + next];
 
 			for (j = 0; j <= next; ++j) {
 				struct commit *cm = indexed_commits[i + j];
 
-				reused_bitmap = find_reused_bitmap(&cm->object.oid);
-				if (reused_bitmap || (cm->object.flags & NEEDS_BITMAP) != 0) {
+				if ((cm->object.flags & NEEDS_BITMAP) != 0) {
 					chosen = cm;
 					break;
 				}
@@ -440,7 +584,7 @@ void bitmap_writer_select_commits(struct commit **indexed_commits,
 			}
 		}
 
-		push_bitmapped_commit(chosen, reused_bitmap);
+		push_bitmapped_commit(chosen);
 
 		i += next + 1;
 		display_progress(writer.progress, i);
@@ -466,10 +610,10 @@ static inline void dump_bitmap(struct hashfile *f, struct ewah_bitmap *bitmap)
 		die("Failed to write bitmap index");
 }
 
-static const unsigned char *sha1_access(size_t pos, void *table)
+static const struct object_id *oid_access(size_t pos, const void *table)
 {
-	struct pack_idx_entry **index = table;
-	return index[pos]->oid.hash;
+	const struct pack_idx_entry * const *index = table;
+	return &index[pos]->oid;
 }
 
 static void write_selected_commits_v1(struct hashfile *f,
@@ -482,7 +626,7 @@ static void write_selected_commits_v1(struct hashfile *f,
 		struct bitmapped_commit *stored = &writer.selected[i];
 
 		int commit_pos =
-			sha1_pos(stored->commit->object.oid.hash, index, index_nr, sha1_access);
+			oid_pos(&stored->commit->object.oid, index, index_nr, oid_access);
 
 		if (commit_pos < 0)
 			BUG("trying to write commit not in index");
diff --git a/pack-bitmap.c b/pack-bitmap.c
index 4077e73..1ebe0c8 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -138,9 +138,10 @@ static struct ewah_bitmap *read_bitmap_1(struct bitmap_index *index)
 static int load_bitmap_header(struct bitmap_index *index)
 {
 	struct bitmap_disk_header *header = (void *)index->map;
+	size_t header_size = sizeof(*header) - GIT_MAX_RAWSZ + the_hash_algo->rawsz;
 
-	if (index->map_size < sizeof(*header) + the_hash_algo->rawsz)
-		return error("Corrupted bitmap index (missing header data)");
+	if (index->map_size < header_size + the_hash_algo->rawsz)
+		return error("Corrupted bitmap index (too small)");
 
 	if (memcmp(header->magic, BITMAP_IDX_SIGNATURE, sizeof(BITMAP_IDX_SIGNATURE)) != 0)
 		return error("Corrupted bitmap index file (wrong header)");
@@ -152,19 +153,23 @@ static int load_bitmap_header(struct bitmap_index *index)
 	/* Parse known bitmap format options */
 	{
 		uint32_t flags = ntohs(header->options);
+		size_t cache_size = st_mult(index->pack->num_objects, sizeof(uint32_t));
+		unsigned char *index_end = index->map + index->map_size - the_hash_algo->rawsz;
 
 		if ((flags & BITMAP_OPT_FULL_DAG) == 0)
 			return error("Unsupported options for bitmap index file "
 				"(Git requires BITMAP_OPT_FULL_DAG)");
 
 		if (flags & BITMAP_OPT_HASH_CACHE) {
-			unsigned char *end = index->map + index->map_size - the_hash_algo->rawsz;
-			index->hashes = ((uint32_t *)end) - index->pack->num_objects;
+			if (cache_size > index_end - index->map - header_size)
+				return error("corrupted bitmap index file (too short to fit hash cache)");
+			index->hashes = (void *)(index_end - cache_size);
+			index_end -= cache_size;
 		}
 	}
 
 	index->entry_count = ntohl(header->entry_count);
-	index->map_pos += sizeof(*header) - GIT_MAX_RAWSZ + the_hash_algo->rawsz;
+	index->map_pos += header_size;
 	return 0;
 }
 
@@ -224,11 +229,16 @@ static int load_bitmap_entries_v1(struct bitmap_index *index)
 		uint32_t commit_idx_pos;
 		struct object_id oid;
 
+		if (index->map_size - index->map_pos < 6)
+			return error("corrupt ewah bitmap: truncated header for entry %d", i);
+
 		commit_idx_pos = read_be32(index->map, &index->map_pos);
 		xor_offset = read_u8(index->map, &index->map_pos);
 		flags = read_u8(index->map, &index->map_pos);
 
-		nth_packed_object_id(&oid, index->pack, commit_idx_pos);
+		if (nth_packed_object_id(&oid, index->pack, commit_idx_pos) < 0)
+			return error("corrupt ewah bitmap: commit index %u out of range",
+				     (unsigned)commit_idx_pos);
 
 		bitmap = read_bitmap_1(index);
 		if (!bitmap)
@@ -370,6 +380,16 @@ struct include_data {
 	struct bitmap *seen;
 };
 
+struct ewah_bitmap *bitmap_for_commit(struct bitmap_index *bitmap_git,
+				      struct commit *commit)
+{
+	khiter_t hash_pos = kh_get_oid_map(bitmap_git->bitmaps,
+					   commit->object.oid);
+	if (hash_pos >= kh_end(bitmap_git->bitmaps))
+		return NULL;
+	return lookup_stored_bitmap(kh_value(bitmap_git->bitmaps, hash_pos));
+}
+
 static inline int bitmap_position_extended(struct bitmap_index *bitmap_git,
 					   const struct object_id *oid)
 {
@@ -387,11 +407,14 @@ static inline int bitmap_position_extended(struct bitmap_index *bitmap_git,
 static inline int bitmap_position_packfile(struct bitmap_index *bitmap_git,
 					   const struct object_id *oid)
 {
+	uint32_t pos;
 	off_t offset = find_pack_entry_one(oid->hash, bitmap_git->pack);
 	if (!offset)
 		return -1;
 
-	return find_revindex_position(bitmap_git->pack, offset);
+	if (offset_to_pack_pos(bitmap_git->pack, offset, &pos) < 0)
+		return -1;
+	return pos;
 }
 
 static int bitmap_position(struct bitmap_index *bitmap_git,
@@ -455,10 +478,10 @@ static void show_commit(struct commit *commit, void *data)
 
 static int add_to_include_set(struct bitmap_index *bitmap_git,
 			      struct include_data *data,
-			      const struct object_id *oid,
+			      struct commit *commit,
 			      int bitmap_pos)
 {
-	khiter_t hash_pos;
+	struct ewah_bitmap *partial;
 
 	if (data->seen && bitmap_get(data->seen, bitmap_pos))
 		return 0;
@@ -466,10 +489,9 @@ static int add_to_include_set(struct bitmap_index *bitmap_git,
 	if (bitmap_get(data->base, bitmap_pos))
 		return 0;
 
-	hash_pos = kh_get_oid_map(bitmap_git->bitmaps, *oid);
-	if (hash_pos < kh_end(bitmap_git->bitmaps)) {
-		struct stored_bitmap *st = kh_value(bitmap_git->bitmaps, hash_pos);
-		bitmap_or_ewah(data->base, lookup_stored_bitmap(st));
+	partial = bitmap_for_commit(bitmap_git, commit);
+	if (partial) {
+		bitmap_or_ewah(data->base, partial);
 		return 0;
 	}
 
@@ -488,8 +510,7 @@ static int should_include(struct commit *commit, void *_data)
 						  (struct object *)commit,
 						  NULL);
 
-	if (!add_to_include_set(data->bitmap_git, data, &commit->object.oid,
-				bitmap_pos)) {
+	if (!add_to_include_set(data->bitmap_git, data, commit, bitmap_pos)) {
 		struct commit_list *parent = commit->parents;
 
 		while (parent) {
@@ -503,6 +524,23 @@ static int should_include(struct commit *commit, void *_data)
 	return 1;
 }
 
+static int add_commit_to_bitmap(struct bitmap_index *bitmap_git,
+				struct bitmap **base,
+				struct commit *commit)
+{
+	struct ewah_bitmap *or_with = bitmap_for_commit(bitmap_git, commit);
+
+	if (!or_with)
+		return 0;
+
+	if (*base == NULL)
+		*base = ewah_to_bitmap(or_with);
+	else
+		bitmap_or_ewah(*base, or_with);
+
+	return 1;
+}
+
 static struct bitmap *find_objects(struct bitmap_index *bitmap_git,
 				   struct rev_info *revs,
 				   struct object_list *roots,
@@ -526,21 +564,10 @@ static struct bitmap *find_objects(struct bitmap_index *bitmap_git,
 		struct object *object = roots->item;
 		roots = roots->next;
 
-		if (object->type == OBJ_COMMIT) {
-			khiter_t pos = kh_get_oid_map(bitmap_git->bitmaps, object->oid);
-
-			if (pos < kh_end(bitmap_git->bitmaps)) {
-				struct stored_bitmap *st = kh_value(bitmap_git->bitmaps, pos);
-				struct ewah_bitmap *or_with = lookup_stored_bitmap(st);
-
-				if (base == NULL)
-					base = ewah_to_bitmap(or_with);
-				else
-					bitmap_or_ewah(base, or_with);
-
-				object->flags |= SEEN;
-				continue;
-			}
+		if (object->type == OBJ_COMMIT &&
+		    add_commit_to_bitmap(bitmap_git, &base, (struct commit *)object)) {
+			object->flags |= SEEN;
+			continue;
 		}
 
 		object_list_insert(object, &not_mapped);
@@ -684,21 +711,22 @@ static void show_objects_for_type(
 
 		for (offset = 0; offset < BITS_IN_EWORD; ++offset) {
 			struct object_id oid;
-			struct revindex_entry *entry;
-			uint32_t hash = 0;
+			uint32_t hash = 0, index_pos;
+			off_t ofs;
 
 			if ((word >> offset) == 0)
 				break;
 
 			offset += ewah_bit_ctz64(word >> offset);
 
-			entry = &bitmap_git->pack->revindex[pos + offset];
-			nth_packed_object_id(&oid, bitmap_git->pack, entry->nr);
+			index_pos = pack_pos_to_index(bitmap_git->pack, pos + offset);
+			ofs = pack_pos_to_offset(bitmap_git->pack, pos + offset);
+			nth_packed_object_id(&oid, bitmap_git->pack, index_pos);
 
 			if (bitmap_git->hashes)
-				hash = get_be32(bitmap_git->hashes + entry->nr);
+				hash = get_be32(bitmap_git->hashes + index_pos);
 
-			show_reach(&oid, object_type, 0, hash, bitmap_git->pack, entry->offset);
+			show_reach(&oid, object_type, 0, hash, bitmap_git->pack, ofs);
 		}
 	}
 }
@@ -807,11 +835,11 @@ static unsigned long get_size_by_pos(struct bitmap_index *bitmap_git,
 	oi.sizep = &size;
 
 	if (pos < pack->num_objects) {
-		struct revindex_entry *entry = &pack->revindex[pos];
-		if (packed_object_info(the_repository, pack,
-				       entry->offset, &oi) < 0) {
+		off_t ofs = pack_pos_to_offset(pack, pos);
+		if (packed_object_info(the_repository, pack, ofs, &oi) < 0) {
 			struct object_id oid;
-			nth_packed_object_id(&oid, pack, entry->nr);
+			nth_packed_object_id(&oid, pack,
+					     pack_pos_to_index(pack, pos));
 			die(_("unable to get size of %s"), oid_to_hex(&oid));
 		}
 	} else {
@@ -950,7 +978,7 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
 
 	/* try to open a bitmapped pack, but don't parse it yet
 	 * because we may not need to use it */
-	bitmap_git = xcalloc(1, sizeof(*bitmap_git));
+	CALLOC_ARRAY(bitmap_git, 1);
 	if (open_pack_bitmap(revs->repo, bitmap_git) < 0)
 		goto cleanup;
 
@@ -1041,23 +1069,21 @@ static void try_partial_reuse(struct bitmap_index *bitmap_git,
 			      struct bitmap *reuse,
 			      struct pack_window **w_curs)
 {
-	struct revindex_entry *revidx;
-	off_t offset;
+	off_t offset, header;
 	enum object_type type;
 	unsigned long size;
 
 	if (pos >= bitmap_git->pack->num_objects)
 		return; /* not actually in the pack */
 
-	revidx = &bitmap_git->pack->revindex[pos];
-	offset = revidx->offset;
+	offset = header = pack_pos_to_offset(bitmap_git->pack, pos);
 	type = unpack_object_header(bitmap_git->pack, w_curs, &offset, &size);
 	if (type < 0)
 		return; /* broken packfile, punt */
 
 	if (type == OBJ_REF_DELTA || type == OBJ_OFS_DELTA) {
 		off_t base_offset;
-		int base_pos;
+		uint32_t base_pos;
 
 		/*
 		 * Find the position of the base object so we can look it up
@@ -1068,11 +1094,10 @@ static void try_partial_reuse(struct bitmap_index *bitmap_git,
 		 * more detail.
 		 */
 		base_offset = get_delta_base(bitmap_git->pack, w_curs,
-					     &offset, type, revidx->offset);
+					     &offset, type, header);
 		if (!base_offset)
 			return;
-		base_pos = find_revindex_position(bitmap_git->pack, base_offset);
-		if (base_pos < 0)
+		if (offset_to_pack_pos(bitmap_git->pack, base_offset, &base_pos) < 0)
 			return;
 
 		/*
@@ -1272,10 +1297,10 @@ void test_bitmap_walk(struct rev_info *revs)
 {
 	struct object *root;
 	struct bitmap *result = NULL;
-	khiter_t pos;
 	size_t result_popcnt;
 	struct bitmap_test_data tdata;
 	struct bitmap_index *bitmap_git;
+	struct ewah_bitmap *bm;
 
 	if (!(bitmap_git = prepare_bitmap_git(revs->repo)))
 		die("failed to load bitmap indexes");
@@ -1287,12 +1312,9 @@ void test_bitmap_walk(struct rev_info *revs)
 		bitmap_git->version, bitmap_git->entry_count);
 
 	root = revs->pending.objects[0].item;
-	pos = kh_get_oid_map(bitmap_git->bitmaps, root->oid);
+	bm = bitmap_for_commit(bitmap_git, (struct commit *)root);
 
-	if (pos < kh_end(bitmap_git->bitmaps)) {
-		struct stored_bitmap *st = kh_value(bitmap_git->bitmaps, pos);
-		struct ewah_bitmap *bm = lookup_stored_bitmap(st);
-
+	if (bm) {
 		fprintf(stderr, "Found bitmap for %s. %d bits / %08x checksum\n",
 			oid_to_hex(&root->oid), (int)bm->bit_size, ewah_checksum(bm));
 
@@ -1323,14 +1345,14 @@ void test_bitmap_walk(struct rev_info *revs)
 	if (bitmap_equals(result, tdata.base))
 		fprintf(stderr, "OK!\n");
 	else
-		fprintf(stderr, "Mismatch!\n");
+		die("mismatch in bitmap results");
 
 	free_bitmap_index(bitmap_git);
 }
 
-static int rebuild_bitmap(uint32_t *reposition,
-			  struct ewah_bitmap *source,
-			  struct bitmap *dest)
+int rebuild_bitmap(const uint32_t *reposition,
+		   struct ewah_bitmap *source,
+		   struct bitmap *dest)
 {
 	uint32_t pos = 0;
 	struct ewah_iterator it;
@@ -1359,63 +1381,28 @@ static int rebuild_bitmap(uint32_t *reposition,
 	return 0;
 }
 
-int rebuild_existing_bitmaps(struct bitmap_index *bitmap_git,
-			     struct packing_data *mapping,
-			     kh_oid_map_t *reused_bitmaps,
-			     int show_progress)
+uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
+				struct packing_data *mapping)
 {
 	uint32_t i, num_objects;
 	uint32_t *reposition;
-	struct bitmap *rebuild;
-	struct stored_bitmap *stored;
-	struct progress *progress = NULL;
-
-	khiter_t hash_pos;
-	int hash_ret;
 
 	num_objects = bitmap_git->pack->num_objects;
-	reposition = xcalloc(num_objects, sizeof(uint32_t));
+	CALLOC_ARRAY(reposition, num_objects);
 
 	for (i = 0; i < num_objects; ++i) {
 		struct object_id oid;
-		struct revindex_entry *entry;
 		struct object_entry *oe;
 
-		entry = &bitmap_git->pack->revindex[i];
-		nth_packed_object_id(&oid, bitmap_git->pack, entry->nr);
+		nth_packed_object_id(&oid, bitmap_git->pack,
+				     pack_pos_to_index(bitmap_git->pack, i));
 		oe = packlist_find(mapping, &oid);
 
 		if (oe)
 			reposition[i] = oe_in_pack_pos(mapping, oe) + 1;
 	}
 
-	rebuild = bitmap_new();
-	i = 0;
-
-	if (show_progress)
-		progress = start_progress("Reusing bitmaps", 0);
-
-	kh_foreach_value(bitmap_git->bitmaps, stored, {
-		if (stored->flags & BITMAP_FLAG_REUSE) {
-			if (!rebuild_bitmap(reposition,
-					    lookup_stored_bitmap(stored),
-					    rebuild)) {
-				hash_pos = kh_put_oid_map(reused_bitmaps,
-							  stored->oid,
-							  &hash_ret);
-				kh_value(reused_bitmaps, hash_pos) =
-					bitmap_to_ewah(rebuild);
-			}
-			bitmap_reset(rebuild);
-			display_progress(progress, ++i);
-		}
-	});
-
-	stop_progress(&progress);
-
-	free(reposition);
-	bitmap_free(rebuild);
-	return 0;
+	return reposition;
 }
 
 void free_bitmap_index(struct bitmap_index *b)
@@ -1443,3 +1430,84 @@ int bitmap_has_oid_in_uninteresting(struct bitmap_index *bitmap_git,
 	return bitmap_git &&
 		bitmap_walk_contains(bitmap_git, bitmap_git->haves, oid);
 }
+
+static off_t get_disk_usage_for_type(struct bitmap_index *bitmap_git,
+				     enum object_type object_type)
+{
+	struct bitmap *result = bitmap_git->result;
+	struct packed_git *pack = bitmap_git->pack;
+	off_t total = 0;
+	struct ewah_iterator it;
+	eword_t filter;
+	size_t i;
+
+	init_type_iterator(&it, bitmap_git, object_type);
+	for (i = 0; i < result->word_alloc &&
+			ewah_iterator_next(&filter, &it); i++) {
+		eword_t word = result->words[i] & filter;
+		size_t base = (i * BITS_IN_EWORD);
+		unsigned offset;
+
+		if (!word)
+			continue;
+
+		for (offset = 0; offset < BITS_IN_EWORD; offset++) {
+			size_t pos;
+
+			if ((word >> offset) == 0)
+				break;
+
+			offset += ewah_bit_ctz64(word >> offset);
+			pos = base + offset;
+			total += pack_pos_to_offset(pack, pos + 1) -
+				 pack_pos_to_offset(pack, pos);
+		}
+	}
+
+	return total;
+}
+
+static off_t get_disk_usage_for_extended(struct bitmap_index *bitmap_git)
+{
+	struct bitmap *result = bitmap_git->result;
+	struct packed_git *pack = bitmap_git->pack;
+	struct eindex *eindex = &bitmap_git->ext_index;
+	off_t total = 0;
+	struct object_info oi = OBJECT_INFO_INIT;
+	off_t object_size;
+	size_t i;
+
+	oi.disk_sizep = &object_size;
+
+	for (i = 0; i < eindex->count; i++) {
+		struct object *obj = eindex->objects[i];
+
+		if (!bitmap_get(result, pack->num_objects + i))
+			continue;
+
+		if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0)
+			die(_("unable to get disk usage of %s"),
+			    oid_to_hex(&obj->oid));
+
+		total += object_size;
+	}
+	return total;
+}
+
+off_t get_disk_usage_from_bitmap(struct bitmap_index *bitmap_git,
+				 struct rev_info *revs)
+{
+	off_t total = 0;
+
+	total += get_disk_usage_for_type(bitmap_git, OBJ_COMMIT);
+	if (revs->tree_objects)
+		total += get_disk_usage_for_type(bitmap_git, OBJ_TREE);
+	if (revs->blob_objects)
+		total += get_disk_usage_for_type(bitmap_git, OBJ_BLOB);
+	if (revs->tag_objects)
+		total += get_disk_usage_for_type(bitmap_git, OBJ_TAG);
+
+	total += get_disk_usage_for_extended(bitmap_git);
+
+	return total;
+}
diff --git a/pack-bitmap.h b/pack-bitmap.h
index 1203120..36d9993 100644
--- a/pack-bitmap.h
+++ b/pack-bitmap.h
@@ -68,12 +68,20 @@ int bitmap_walk_contains(struct bitmap_index *,
  */
 int bitmap_has_oid_in_uninteresting(struct bitmap_index *, const struct object_id *oid);
 
+off_t get_disk_usage_from_bitmap(struct bitmap_index *, struct rev_info *);
+
 void bitmap_writer_show_progress(int show);
 void bitmap_writer_set_checksum(unsigned char *sha1);
 void bitmap_writer_build_type_index(struct packing_data *to_pack,
 				    struct pack_idx_entry **index,
 				    uint32_t index_nr);
-void bitmap_writer_reuse_bitmaps(struct packing_data *to_pack);
+uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
+				struct packing_data *mapping);
+int rebuild_bitmap(const uint32_t *reposition,
+		   struct ewah_bitmap *source,
+		   struct bitmap *dest);
+struct ewah_bitmap *bitmap_for_commit(struct bitmap_index *bitmap_git,
+				      struct commit *commit);
 void bitmap_writer_select_commits(struct commit **indexed_commits,
 		unsigned int indexed_commits_nr, int max_bitmaps);
 void bitmap_writer_build(struct packing_data *to_pack);
diff --git a/pack-objects.c b/pack-objects.c
index f2a4338..fe2a4ea 100644
--- a/pack-objects.c
+++ b/pack-objects.c
@@ -49,7 +49,7 @@ static void rehash_objects(struct packing_data *pdata)
 		pdata->index_size = 1024;
 
 	free(pdata->index);
-	pdata->index = xcalloc(pdata->index_size, sizeof(*pdata->index));
+	CALLOC_ARRAY(pdata->index, pdata->index_size);
 
 	entry = pdata->objects;
 
diff --git a/pack-revindex.c b/pack-revindex.c
index ecdde39..4262530 100644
--- a/pack-revindex.c
+++ b/pack-revindex.c
@@ -2,6 +2,12 @@
 #include "pack-revindex.h"
 #include "object-store.h"
 #include "packfile.h"
+#include "config.h"
+
+struct revindex_entry {
+	off_t offset;
+	unsigned int nr;
+};
 
 /*
  * Pack index for existing packs give us easy access to the offsets into
@@ -159,27 +165,152 @@ static void create_pack_revindex(struct packed_git *p)
 	sort_revindex(p->revindex, num_ent, p->pack_size);
 }
 
-int load_pack_revindex(struct packed_git *p)
+static int create_pack_revindex_in_memory(struct packed_git *p)
 {
-	if (!p->revindex) {
-		if (open_pack_index(p))
-			return -1;
-		create_pack_revindex(p);
-	}
+	if (git_env_bool(GIT_TEST_REV_INDEX_DIE_IN_MEMORY, 0))
+		die("dying as requested by '%s'",
+		    GIT_TEST_REV_INDEX_DIE_IN_MEMORY);
+	if (open_pack_index(p))
+		return -1;
+	create_pack_revindex(p);
 	return 0;
 }
 
-int find_revindex_position(struct packed_git *p, off_t ofs)
+static char *pack_revindex_filename(struct packed_git *p)
 {
-	int lo = 0;
-	int hi = p->num_objects + 1;
-	const struct revindex_entry *revindex = p->revindex;
+	size_t len;
+	if (!strip_suffix(p->pack_name, ".pack", &len))
+		BUG("pack_name does not end in .pack");
+	return xstrfmt("%.*s.rev", (int)len, p->pack_name);
+}
+
+#define RIDX_HEADER_SIZE (12)
+#define RIDX_MIN_SIZE (RIDX_HEADER_SIZE + (2 * the_hash_algo->rawsz))
+
+struct revindex_header {
+	uint32_t signature;
+	uint32_t version;
+	uint32_t hash_id;
+};
+
+static int load_revindex_from_disk(char *revindex_name,
+				   uint32_t num_objects,
+				   const uint32_t **data_p, size_t *len_p)
+{
+	int fd, ret = 0;
+	struct stat st;
+	void *data = NULL;
+	size_t revindex_size;
+	struct revindex_header *hdr;
+
+	fd = git_open(revindex_name);
+
+	if (fd < 0) {
+		ret = -1;
+		goto cleanup;
+	}
+	if (fstat(fd, &st)) {
+		ret = error_errno(_("failed to read %s"), revindex_name);
+		goto cleanup;
+	}
+
+	revindex_size = xsize_t(st.st_size);
+
+	if (revindex_size < RIDX_MIN_SIZE) {
+		ret = error(_("reverse-index file %s is too small"), revindex_name);
+		goto cleanup;
+	}
+
+	if (revindex_size - RIDX_MIN_SIZE != st_mult(sizeof(uint32_t), num_objects)) {
+		ret = error(_("reverse-index file %s is corrupt"), revindex_name);
+		goto cleanup;
+	}
+
+	data = xmmap(NULL, revindex_size, PROT_READ, MAP_PRIVATE, fd, 0);
+	hdr = data;
+
+	if (ntohl(hdr->signature) != RIDX_SIGNATURE) {
+		ret = error(_("reverse-index file %s has unknown signature"), revindex_name);
+		goto cleanup;
+	}
+	if (ntohl(hdr->version) != 1) {
+		ret = error(_("reverse-index file %s has unsupported version %"PRIu32),
+			    revindex_name, ntohl(hdr->version));
+		goto cleanup;
+	}
+	if (!(ntohl(hdr->hash_id) == 1 || ntohl(hdr->hash_id) == 2)) {
+		ret = error(_("reverse-index file %s has unsupported hash id %"PRIu32),
+			    revindex_name, ntohl(hdr->hash_id));
+		goto cleanup;
+	}
+
+cleanup:
+	if (ret) {
+		if (data)
+			munmap(data, revindex_size);
+	} else {
+		*len_p = revindex_size;
+		*data_p = (const uint32_t *)data;
+	}
+
+	if (fd >= 0)
+		close(fd);
+	return ret;
+}
+
+static int load_pack_revindex_from_disk(struct packed_git *p)
+{
+	char *revindex_name;
+	int ret;
+	if (open_pack_index(p))
+		return -1;
+
+	revindex_name = pack_revindex_filename(p);
+
+	ret = load_revindex_from_disk(revindex_name,
+				      p->num_objects,
+				      &p->revindex_map,
+				      &p->revindex_size);
+	if (ret)
+		goto cleanup;
+
+	p->revindex_data = (const uint32_t *)((const char *)p->revindex_map + RIDX_HEADER_SIZE);
+
+cleanup:
+	free(revindex_name);
+	return ret;
+}
+
+int load_pack_revindex(struct packed_git *p)
+{
+	if (p->revindex || p->revindex_data)
+		return 0;
+
+	if (!load_pack_revindex_from_disk(p))
+		return 0;
+	else if (!create_pack_revindex_in_memory(p))
+		return 0;
+	return -1;
+}
+
+int offset_to_pack_pos(struct packed_git *p, off_t ofs, uint32_t *pos)
+{
+	unsigned lo, hi;
+
+	if (load_pack_revindex(p) < 0)
+		return -1;
+
+	lo = 0;
+	hi = p->num_objects + 1;
 
 	do {
 		const unsigned mi = lo + (hi - lo) / 2;
-		if (revindex[mi].offset == ofs) {
-			return mi;
-		} else if (ofs < revindex[mi].offset)
+		off_t got = pack_pos_to_offset(p, mi);
+
+		if (got == ofs) {
+			*pos = mi;
+			return 0;
+		} else if (ofs < got)
 			hi = mi;
 		else
 			lo = mi + 1;
@@ -189,17 +320,30 @@ int find_revindex_position(struct packed_git *p, off_t ofs)
 	return -1;
 }
 
-struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs)
+uint32_t pack_pos_to_index(struct packed_git *p, uint32_t pos)
 {
-	int pos;
+	if (!(p->revindex || p->revindex_data))
+		BUG("pack_pos_to_index: reverse index not yet loaded");
+	if (p->num_objects <= pos)
+		BUG("pack_pos_to_index: out-of-bounds object at %"PRIu32, pos);
 
-	if (load_pack_revindex(p))
-		return NULL;
+	if (p->revindex)
+		return p->revindex[pos].nr;
+	else
+		return get_be32(p->revindex_data + pos);
+}
 
-	pos = find_revindex_position(p, ofs);
+off_t pack_pos_to_offset(struct packed_git *p, uint32_t pos)
+{
+	if (!(p->revindex || p->revindex_data))
+		BUG("pack_pos_to_index: reverse index not yet loaded");
+	if (p->num_objects < pos)
+		BUG("pack_pos_to_offset: out-of-bounds object at %"PRIu32, pos);
 
-	if (pos < 0)
-		return NULL;
-
-	return p->revindex + pos;
+	if (p->revindex)
+		return p->revindex[pos].offset;
+	else if (pos == p->num_objects)
+		return p->pack_size - the_hash_algo->rawsz;
+	else
+		return nth_packed_object_offset(p, pack_pos_to_index(p, pos));
 }
diff --git a/pack-revindex.h b/pack-revindex.h
index 848331d..ba7c82c 100644
--- a/pack-revindex.h
+++ b/pack-revindex.h
@@ -1,16 +1,74 @@
 #ifndef PACK_REVINDEX_H
 #define PACK_REVINDEX_H
 
+/**
+ * A revindex allows converting efficiently between three properties
+ * of an object within a pack:
+ *
+ * - index position: the numeric position within the list of sorted object ids
+ *   found in the .idx file
+ *
+ * - pack position: the numeric position within the list of objects in their
+ *   order within the actual .pack file (i.e., 0 is the first object in the
+ *   .pack, 1 is the second, and so on)
+ *
+ * - offset: the byte offset within the .pack file at which the object contents
+ *   can be found
+ */
+
+
+#define RIDX_SIGNATURE 0x52494458 /* "RIDX" */
+#define RIDX_VERSION 1
+
+#define GIT_TEST_WRITE_REV_INDEX "GIT_TEST_WRITE_REV_INDEX"
+#define GIT_TEST_REV_INDEX_DIE_IN_MEMORY "GIT_TEST_REV_INDEX_DIE_IN_MEMORY"
+
 struct packed_git;
 
-struct revindex_entry {
-	off_t offset;
-	unsigned int nr;
-};
-
+/*
+ * load_pack_revindex populates the revindex's internal data-structures for the
+ * given pack, returning zero on success and a negative value otherwise.
+ *
+ * If a '.rev' file is present it is mmap'd, and pointers are assigned into it
+ * (instead of using the in-memory variant).
+ */
 int load_pack_revindex(struct packed_git *p);
-int find_revindex_position(struct packed_git *p, off_t ofs);
 
-struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs);
+/*
+ * offset_to_pack_pos converts an object offset to a pack position. This
+ * function returns zero on success, and a negative number otherwise. The
+ * parameter 'pos' is usable only on success.
+ *
+ * If the reverse index has not yet been loaded, this function loads it lazily,
+ * and returns an negative number if an error was encountered.
+ *
+ * This function runs in time O(log N) with the number of objects in the pack.
+ */
+int offset_to_pack_pos(struct packed_git *p, off_t ofs, uint32_t *pos);
+
+/*
+ * pack_pos_to_index converts the given pack-relative position 'pos' by
+ * returning an index-relative position.
+ *
+ * If the reverse index has not yet been loaded, or the position is out of
+ * bounds, this function aborts.
+ *
+ * This function runs in constant time.
+ */
+uint32_t pack_pos_to_index(struct packed_git *p, uint32_t pos);
+
+/*
+ * pack_pos_to_offset converts the given pack-relative position 'pos' into a
+ * pack offset. For a pack with 'N' objects, asking for position 'N' will return
+ * the total size (in bytes) of the pack.
+ *
+ * If the reverse index has not yet been loaded, or the position is out of
+ * bounds, this function aborts.
+ *
+ * This function runs in constant time under both in-memory and on-disk reverse
+ * indexes, but an additional step is taken to consult the corresponding .idx
+ * file when using the on-disk format.
+ */
+off_t pack_pos_to_offset(struct packed_git *p, uint32_t pos);
 
 #endif
diff --git a/pack-write.c b/pack-write.c
index 3513665..2ca85a9 100644
--- a/pack-write.c
+++ b/pack-write.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "pack.h"
 #include "csum-file.h"
+#include "remote.h"
 
 void reset_pack_idx_option(struct pack_idx_option *opts)
 {
@@ -166,6 +167,113 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec
 	return index_name;
 }
 
+static int pack_order_cmp(const void *va, const void *vb, void *ctx)
+{
+	struct pack_idx_entry **objects = ctx;
+
+	off_t oa = objects[*(uint32_t*)va]->offset;
+	off_t ob = objects[*(uint32_t*)vb]->offset;
+
+	if (oa < ob)
+		return -1;
+	if (oa > ob)
+		return 1;
+	return 0;
+}
+
+static void write_rev_header(struct hashfile *f)
+{
+	uint32_t oid_version;
+	switch (hash_algo_by_ptr(the_hash_algo)) {
+	case GIT_HASH_SHA1:
+		oid_version = 1;
+		break;
+	case GIT_HASH_SHA256:
+		oid_version = 2;
+		break;
+	default:
+		die("write_rev_header: unknown hash version");
+	}
+
+	hashwrite_be32(f, RIDX_SIGNATURE);
+	hashwrite_be32(f, RIDX_VERSION);
+	hashwrite_be32(f, oid_version);
+}
+
+static void write_rev_index_positions(struct hashfile *f,
+				      struct pack_idx_entry **objects,
+				      uint32_t nr_objects)
+{
+	uint32_t *pack_order;
+	uint32_t i;
+
+	ALLOC_ARRAY(pack_order, nr_objects);
+	for (i = 0; i < nr_objects; i++)
+		pack_order[i] = i;
+	QSORT_S(pack_order, nr_objects, pack_order_cmp, objects);
+
+	for (i = 0; i < nr_objects; i++)
+		hashwrite_be32(f, pack_order[i]);
+
+	free(pack_order);
+}
+
+static void write_rev_trailer(struct hashfile *f, const unsigned char *hash)
+{
+	hashwrite(f, hash, the_hash_algo->rawsz);
+}
+
+const char *write_rev_file(const char *rev_name,
+			   struct pack_idx_entry **objects,
+			   uint32_t nr_objects,
+			   const unsigned char *hash,
+			   unsigned flags)
+{
+	struct hashfile *f;
+	int fd;
+
+	if ((flags & WRITE_REV) && (flags & WRITE_REV_VERIFY))
+		die(_("cannot both write and verify reverse index"));
+
+	if (flags & WRITE_REV) {
+		if (!rev_name) {
+			struct strbuf tmp_file = STRBUF_INIT;
+			fd = odb_mkstemp(&tmp_file, "pack/tmp_rev_XXXXXX");
+			rev_name = strbuf_detach(&tmp_file, NULL);
+		} else {
+			unlink(rev_name);
+			fd = open(rev_name, O_CREAT|O_EXCL|O_WRONLY, 0600);
+			if (fd < 0)
+				die_errno("unable to create '%s'", rev_name);
+		}
+		f = hashfd(fd, rev_name);
+	} else if (flags & WRITE_REV_VERIFY) {
+		struct stat statbuf;
+		if (stat(rev_name, &statbuf)) {
+			if (errno == ENOENT) {
+				/* .rev files are optional */
+				return NULL;
+			} else
+				die_errno(_("could not stat: %s"), rev_name);
+		}
+		f = hashfd_check(rev_name);
+	} else
+		return NULL;
+
+	write_rev_header(f);
+
+	write_rev_index_positions(f, objects, nr_objects);
+	write_rev_trailer(f, hash);
+
+	if (rev_name && adjust_shared_perm(rev_name) < 0)
+		die(_("failed to make %s readable"), rev_name);
+
+	finalize_hashfile(f, NULL, CSUM_HASH_IN_STREAM | CSUM_CLOSE |
+				    ((flags & WRITE_IDX_VERIFY) ? 0 : CSUM_FSYNC));
+
+	return rev_name;
+}
+
 off_t write_pack_header(struct hashfile *f, uint32_t nr_entries)
 {
 	struct pack_header hdr;
@@ -272,7 +380,7 @@ void fixup_pack_header_footer(int pack_fd,
 	fsync_or_die(pack_fd, pack_name);
 }
 
-char *index_pack_lockfile(int ip_out)
+char *index_pack_lockfile(int ip_out, int *is_well_formed)
 {
 	char packname[GIT_MAX_HEXSZ + 6];
 	const int len = the_hash_algo->hexsz + 6;
@@ -286,11 +394,17 @@ char *index_pack_lockfile(int ip_out)
 	 */
 	if (read_in_full(ip_out, packname, len) == len && packname[len-1] == '\n') {
 		const char *name;
+
+		if (is_well_formed)
+			*is_well_formed = 1;
 		packname[len-1] = 0;
 		if (skip_prefix(packname, "keep\t", &name))
 			return xstrfmt("%s/pack/pack-%s.keep",
 				       get_object_directory(), name);
+		return NULL;
 	}
+	if (is_well_formed)
+		*is_well_formed = 0;
 	return NULL;
 }
 
@@ -341,7 +455,7 @@ void finish_tmp_packfile(struct strbuf *name_buffer,
 			 struct pack_idx_option *pack_idx_opts,
 			 unsigned char hash[])
 {
-	const char *idx_tmp_name;
+	const char *idx_tmp_name, *rev_tmp_name = NULL;
 	int basename_len = name_buffer->len;
 
 	if (adjust_shared_perm(pack_tmp_name))
@@ -352,6 +466,9 @@ void finish_tmp_packfile(struct strbuf *name_buffer,
 	if (adjust_shared_perm(idx_tmp_name))
 		die_errno("unable to make temporary index file readable");
 
+	rev_tmp_name = write_rev_file(NULL, written_list, nr_written, hash,
+				      pack_idx_opts->flags);
+
 	strbuf_addf(name_buffer, "%s.pack", hash_to_hex(hash));
 
 	if (rename(pack_tmp_name, name_buffer->buf))
@@ -365,5 +482,28 @@ void finish_tmp_packfile(struct strbuf *name_buffer,
 
 	strbuf_setlen(name_buffer, basename_len);
 
+	if (rev_tmp_name) {
+		strbuf_addf(name_buffer, "%s.rev", hash_to_hex(hash));
+		if (rename(rev_tmp_name, name_buffer->buf))
+			die_errno("unable to rename temporary reverse-index file");
+	}
+
+	strbuf_setlen(name_buffer, basename_len);
+
 	free((void *)idx_tmp_name);
 }
+
+void write_promisor_file(const char *promisor_name, struct ref **sought, int nr_sought)
+{
+	int i, err;
+	FILE *output = xfopen(promisor_name, "w");
+
+	for (i = 0; i < nr_sought; i++)
+		fprintf(output, "%s %s\n", oid_to_hex(&sought[i]->old_oid),
+			sought[i]->name);
+
+	err = ferror(output);
+	err |= fclose(output);
+	if (err)
+		die(_("could not write '%s' promisor file"), promisor_name);
+}
diff --git a/pack.h b/pack.h
index 9fc0945..857cbd5 100644
--- a/pack.h
+++ b/pack.h
@@ -42,6 +42,8 @@ struct pack_idx_option {
 	/* flag bits */
 #define WRITE_IDX_VERIFY 01 /* verify only, do not write the idx file */
 #define WRITE_IDX_STRICT 02
+#define WRITE_REV 04
+#define WRITE_REV_VERIFY 010
 
 	uint32_t version;
 	uint32_t off32_limit;
@@ -85,7 +87,13 @@ int verify_pack_index(struct packed_git *);
 int verify_pack(struct repository *, struct packed_git *, verify_fn fn, struct progress *, uint32_t);
 off_t write_pack_header(struct hashfile *f, uint32_t);
 void fixup_pack_header_footer(int, unsigned char *, const char *, uint32_t, unsigned char *, off_t);
-char *index_pack_lockfile(int fd);
+char *index_pack_lockfile(int fd, int *is_well_formed);
+
+struct ref;
+
+void write_promisor_file(const char *promisor_name, struct ref **sought, int nr_sought);
+
+const char *write_rev_file(const char *rev_name, struct pack_idx_entry **objects, uint32_t nr_objects, const unsigned char *hash, unsigned flags);
 
 /*
  * The "hdr" output buffer should be at least this big, which will handle sizes
diff --git a/packfile.c b/packfile.c
index 86f5c8d..ea29f4b 100644
--- a/packfile.c
+++ b/packfile.c
@@ -7,7 +7,7 @@
 #include "packfile.h"
 #include "delta.h"
 #include "streaming.h"
-#include "sha1-lookup.h"
+#include "hash-lookup.h"
 #include "commit.h"
 #include "object.h"
 #include "tag.h"
@@ -324,11 +324,21 @@ void close_pack_index(struct packed_git *p)
 	}
 }
 
+void close_pack_revindex(struct packed_git *p) {
+	if (!p->revindex_map)
+		return;
+
+	munmap((void *)p->revindex_map, p->revindex_size);
+	p->revindex_map = NULL;
+	p->revindex_data = NULL;
+}
+
 void close_pack(struct packed_git *p)
 {
 	close_pack_windows(p);
 	close_pack_fd(p);
 	close_pack_index(p);
+	close_pack_revindex(p);
 }
 
 void close_object_store(struct raw_object_store *o)
@@ -351,7 +361,7 @@ void close_object_store(struct raw_object_store *o)
 
 void unlink_pack_path(const char *pack_name, int force_delete)
 {
-	static const char *exts[] = {".pack", ".idx", ".keep", ".bitmap", ".promisor"};
+	static const char *exts[] = {".pack", ".idx", ".rev", ".keep", ".bitmap", ".promisor"};
 	int i;
 	struct strbuf buf = STRBUF_INIT;
 	size_t plen;
@@ -628,7 +638,7 @@ unsigned char *use_pack(struct packed_git *p,
 			if (p->pack_fd == -1 && open_packed_git(p))
 				die("packfile %s cannot be accessed", p->pack_name);
 
-			win = xcalloc(1, sizeof(*win));
+			CALLOC_ARRAY(win, 1);
 			win->offset = (offset / window_align) * window_align;
 			len = p->pack_size - win->offset;
 			if (len > packed_git_window_size)
@@ -853,6 +863,7 @@ static void prepare_pack(const char *full_name, size_t full_name_len,
 	if (!strcmp(file_name, "multi-pack-index"))
 		return;
 	if (ends_with(file_name, ".idx") ||
+	    ends_with(file_name, ".rev") ||
 	    ends_with(file_name, ".pack") ||
 	    ends_with(file_name, ".bitmap") ||
 	    ends_with(file_name, ".keep") ||
@@ -1235,18 +1246,18 @@ static int get_delta_base_oid(struct packed_git *p,
 		oidread(oid, base);
 		return 0;
 	} else if (type == OBJ_OFS_DELTA) {
-		struct revindex_entry *revidx;
+		uint32_t base_pos;
 		off_t base_offset = get_delta_base(p, w_curs, &curpos,
 						   type, delta_obj_offset);
 
 		if (!base_offset)
 			return -1;
 
-		revidx = find_pack_revindex(p, base_offset);
-		if (!revidx)
+		if (offset_to_pack_pos(p, base_offset, &base_pos) < 0)
 			return -1;
 
-		return nth_packed_object_id(oid, p, revidx->nr);
+		return nth_packed_object_id(oid, p,
+					    pack_pos_to_index(p, base_pos));
 	} else
 		return -1;
 }
@@ -1256,12 +1267,11 @@ static int retry_bad_packed_offset(struct repository *r,
 				   off_t obj_offset)
 {
 	int type;
-	struct revindex_entry *revidx;
+	uint32_t pos;
 	struct object_id oid;
-	revidx = find_pack_revindex(p, obj_offset);
-	if (!revidx)
+	if (offset_to_pack_pos(p, obj_offset, &pos) < 0)
 		return OBJ_BAD;
-	nth_packed_object_id(&oid, p, revidx->nr);
+	nth_packed_object_id(&oid, p, pack_pos_to_index(p, pos));
 	mark_bad_packed_object(p, oid.hash);
 	type = oid_object_info(r, &oid, NULL);
 	if (type <= OBJ_NONE)
@@ -1538,8 +1548,15 @@ int packed_object_info(struct repository *r, struct packed_git *p,
 	}
 
 	if (oi->disk_sizep) {
-		struct revindex_entry *revidx = find_pack_revindex(p, obj_offset);
-		*oi->disk_sizep = revidx[1].offset - obj_offset;
+		uint32_t pos;
+		if (offset_to_pack_pos(p, obj_offset, &pos) < 0) {
+			error("could not find object at offset %"PRIuMAX" "
+			      "in pack %s", (uintmax_t)obj_offset, p->pack_name);
+			type = OBJ_BAD;
+			goto out;
+		}
+
+		*oi->disk_sizep = pack_pos_to_offset(p, pos + 1) - obj_offset;
 	}
 
 	if (oi->typep || oi->type_name) {
@@ -1688,11 +1705,21 @@ void *unpack_entry(struct repository *r, struct packed_git *p, off_t obj_offset,
 		}
 
 		if (do_check_packed_object_crc && p->index_version > 1) {
-			struct revindex_entry *revidx = find_pack_revindex(p, obj_offset);
-			off_t len = revidx[1].offset - obj_offset;
-			if (check_pack_crc(p, &w_curs, obj_offset, len, revidx->nr)) {
+			uint32_t pack_pos, index_pos;
+			off_t len;
+
+			if (offset_to_pack_pos(p, obj_offset, &pack_pos) < 0) {
+				error("could not find object at offset %"PRIuMAX" in pack %s",
+				      (uintmax_t)obj_offset, p->pack_name);
+				data = NULL;
+				goto out;
+			}
+
+			len = pack_pos_to_offset(p, pack_pos + 1) - obj_offset;
+			index_pos = pack_pos_to_index(p, pack_pos);
+			if (check_pack_crc(p, &w_curs, obj_offset, len, index_pos)) {
 				struct object_id oid;
-				nth_packed_object_id(&oid, p, revidx->nr);
+				nth_packed_object_id(&oid, p, index_pos);
 				error("bad packed object CRC for %s",
 				      oid_to_hex(&oid));
 				mark_bad_packed_object(p, oid.hash);
@@ -1775,11 +1802,11 @@ void *unpack_entry(struct repository *r, struct packed_git *p, off_t obj_offset,
 			 * This is costly but should happen only in the presence
 			 * of a corrupted pack, and is better than failing outright.
 			 */
-			struct revindex_entry *revidx;
+			uint32_t pos;
 			struct object_id base_oid;
-			revidx = find_pack_revindex(p, obj_offset);
-			if (revidx) {
-				nth_packed_object_id(&base_oid, p, revidx->nr);
+			if (!(offset_to_pack_pos(p, obj_offset, &pos))) {
+				nth_packed_object_id(&base_oid, p,
+						     pack_pos_to_index(p, pos));
 				error("failed to read delta base object %s"
 				      " at offset %"PRIuMAX" from %s",
 				      oid_to_hex(&base_oid), (uintmax_t)obj_offset,
@@ -2066,19 +2093,31 @@ int for_each_object_in_pack(struct packed_git *p,
 	}
 
 	for (i = 0; i < p->num_objects; i++) {
-		uint32_t pos;
+		uint32_t index_pos;
 		struct object_id oid;
 
+		/*
+		 * We are iterating "i" from 0 up to num_objects, but its
+		 * meaning may be different, depending on the requested output
+		 * order:
+		 *
+		 *   - in object-name order, it is the same as the index order
+		 *     used by nth_packed_object_id(), so we can pass it
+		 *     directly
+		 *
+		 *   - in pack-order, it is pack position, which we must
+		 *     convert to an index position in order to get the oid.
+		 */
 		if (flags & FOR_EACH_OBJECT_PACK_ORDER)
-			pos = p->revindex[i].nr;
+			index_pos = pack_pos_to_index(p, i);
 		else
-			pos = i;
+			index_pos = i;
 
-		if (nth_packed_object_id(&oid, p, pos) < 0)
+		if (nth_packed_object_id(&oid, p, index_pos) < 0)
 			return error("unable to get sha1 of object %u in %s",
-				     pos, p->pack_name);
+				     index_pos, p->pack_name);
 
-		r = cb(&oid, p, pos, data);
+		r = cb(&oid, p, index_pos, data);
 		if (r)
 			break;
 	}
diff --git a/packfile.h b/packfile.h
index a58fc73..4cfec9e 100644
--- a/packfile.h
+++ b/packfile.h
@@ -90,6 +90,7 @@ uint32_t get_pack_fanout(struct packed_git *p, uint32_t value);
 
 unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t, unsigned long *);
 void close_pack_windows(struct packed_git *);
+void close_pack_revindex(struct packed_git *);
 void close_pack(struct packed_git *);
 void close_object_store(struct raw_object_store *o);
 void unuse_pack(struct pack_window **);
diff --git a/pager.c b/pager.c
index ee435de..3d37dd7 100644
--- a/pager.c
+++ b/pager.c
@@ -11,29 +11,25 @@
 static struct child_process pager_process = CHILD_PROCESS_INIT;
 static const char *pager_program;
 
-static void wait_for_pager(int in_signal)
+static void close_pager_fds(void)
 {
-	if (!in_signal) {
-		fflush(stdout);
-		fflush(stderr);
-	}
 	/* signal EOF to pager */
 	close(1);
 	close(2);
-	if (in_signal)
-		finish_command_in_signal(&pager_process);
-	else
-		finish_command(&pager_process);
 }
 
 static void wait_for_pager_atexit(void)
 {
-	wait_for_pager(0);
+	fflush(stdout);
+	fflush(stderr);
+	close_pager_fds();
+	finish_command(&pager_process);
 }
 
 static void wait_for_pager_signal(int signo)
 {
-	wait_for_pager(1);
+	close_pager_fds();
+	finish_command_in_signal(&pager_process);
 	sigchain_pop(signo);
 	raise(signo);
 }
diff --git a/parse-options.c b/parse-options.c
index f050743..fbea16e 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -869,7 +869,7 @@ int parse_options(int argc, const char **argv, const char *prefix,
 		usage_with_options(usagestr, options);
 	}
 
-	precompose_argv(argc, argv);
+	precompose_argv_prefix(argc, argv, NULL);
 	free(real_options);
 	free(ctx.alias_groups);
 	return parse_options_end(&ctx);
diff --git a/patch-ids.c b/patch-ids.c
index f51021a..8bf4255 100644
--- a/patch-ids.c
+++ b/patch-ids.c
@@ -1,7 +1,7 @@
 #include "cache.h"
 #include "diff.h"
 #include "commit.h"
-#include "sha1-lookup.h"
+#include "hash-lookup.h"
 #include "patch-ids.h"
 
 static int patch_id_defined(struct commit *commit)
@@ -124,7 +124,7 @@ struct patch_id *add_commit_patch_id(struct commit *commit,
 	if (!patch_id_defined(commit))
 		return NULL;
 
-	key = xcalloc(1, sizeof(*key));
+	CALLOC_ARRAY(key, 1);
 	if (init_patch_id_entry(key, commit, ids)) {
 		free(key);
 		return NULL;
diff --git a/pathspec.c b/pathspec.c
index 7a229d8..18b3be3 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -154,7 +154,7 @@ static void parse_pathspec_attr_match(struct pathspec_item *item, const char *va
 	string_list_remove_empty_items(&list, 0);
 
 	item->attr_check = attr_check_alloc();
-	item->attr_match = xcalloc(list.nr, sizeof(struct attr_match));
+	CALLOC_ARRAY(item->attr_match, list.nr);
 
 	for_each_string_list_item(si, &list) {
 		size_t attr_len;
@@ -561,7 +561,7 @@ void parse_pathspec(struct pathspec *pathspec,
 		if (!(flags & PATHSPEC_PREFER_CWD))
 			BUG("PATHSPEC_PREFER_CWD requires arguments");
 
-		pathspec->items = item = xcalloc(1, sizeof(*item));
+		pathspec->items = CALLOC_ARRAY(item, 1);
 		item->match = xstrdup(prefix);
 		item->original = xstrdup(prefix);
 		item->nowildcard_len = item->len = strlen(prefix);
diff --git a/po/README b/po/README
index 07595d3..efd5baa 100644
--- a/po/README
+++ b/po/README
@@ -284,23 +284,5 @@
 Testing marked strings
 ----------------------
 
-Even if you've correctly marked porcelain strings for translation
-something in the test suite might still depend on the US English
-version of the strings, e.g. to grep some error message or other
-output.
-
-To smoke out issues like these, Git tested with a translation mode that
-emits gibberish on every call to gettext. To use it run the test suite
-with it, e.g.:
-
-    cd t && GIT_TEST_GETTEXT_POISON=true prove -j 9 ./t[0-9]*.sh
-
-If tests break with it you should inspect them manually and see if
-what you're translating is sane, i.e. that you're not translating
-plumbing output.
-
-If not you should replace calls to grep with test_i18ngrep, or
-test_cmp calls with test_i18ncmp. If that's not enough you can skip
-the whole test by making it depend on the C_LOCALE_OUTPUT
-prerequisite. See existing test files with this prerequisite for
-examples.
+Git's tests are run under LANG=C LC_ALL=C. So the tests do not need be
+changed to account for translations as they're added.
diff --git a/po/TEAMS b/po/TEAMS
index 677cece..a32beb6 100644
--- a/po/TEAMS
+++ b/po/TEAMS
@@ -29,6 +29,10 @@
 Leader:		Jean-Noël Avila <jn.avila@free.fr>
 Members:	Sébastien Helleu <flashcode@flashtux.org>
 
+Language:	id (Indonesian)
+Repository:	https://github.com/bagasme/git-po
+Leader:		Bagas Sanjaya <bagasdotme@gmail.com>
+
 Language:	is (Icelandic)
 Leader:		Ævar Arnfjörð Bjarmason <avarab@gmail.com>
 
diff --git a/po/bg.po b/po/bg.po
index d73e84c..529ea97 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -1,7 +1,7 @@
 # Bulgarian translation of git po-file.
-# Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019, 2020 Alexander Shopov <ash@kambanaria.org>.
+# Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Alexander Shopov <ash@kambanaria.org>.
 # This file is distributed under the same license as the git package.
-# Alexander Shopov <ash@kambanaria.org>, 2014, 2015, 2016, 2017, 2018, 2019, 2020.
+# Alexander Shopov <ash@kambanaria.org>, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021.
 #
 # ========================
 # DICTIONARY TO MERGE IN GIT GUI
@@ -38,6 +38,7 @@
 # graft присадка
 # grafted repository хранилище с присаждане
 # replace refs заместващи указатели
+# replace objects заместващи обекти
 # embedded repository вградено/вътрешно хранилище (добавянето му е грешка)
 # thin pack съкратен пакет
 # pack file пакетен файл
@@ -149,6 +150,8 @@
 # identity самоличност, информация за
 # boundary commit гранично подаване
 # integrate (changes) внасяне (на промени)
+# overflow data данни за отместването
+# reverse index обратен индекс (а не обърнат, за да не се бърка с reverse key index)
 # ------------------------
 # „$var“ - може да не сработва за shell има gettext и eval_gettext - проверка - намират се лесно по „$
 # ------------------------
@@ -165,10 +168,10 @@
 # for i in `sort -u FILES`; do cnt=`grep $i FILES | wc -l`; echo $cnt $i ;done | sort -n
 msgid ""
 msgstr ""
-"Project-Id-Version: git 2.30\n"
+"Project-Id-Version: git 2.31\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2020-12-21 07:10+0800\n"
-"PO-Revision-Date: 2020-12-22 17:48+0100\n"
+"POT-Creation-Date: 2021-03-04 22:41+0800\n"
+"PO-Revision-Date: 2021-03-05 12:11+0100\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
 "Language: bg\n"
@@ -182,9 +185,9 @@
 msgid "Huh (%s)?"
 msgstr "Неуспешен анализ — „%s“."
 
-#: add-interactive.c:529 add-interactive.c:830 reset.c:65 sequencer.c:3284
-#: sequencer.c:3735 sequencer.c:3890 builtin/rebase.c:1532
-#: builtin/rebase.c:1955
+#: add-interactive.c:529 add-interactive.c:830 reset.c:65 sequencer.c:3292
+#: sequencer.c:3743 sequencer.c:3898 builtin/rebase.c:1538
+#: builtin/rebase.c:1963
 msgid "could not read index"
 msgstr "индексът не може да бъде прочетен"
 
@@ -212,7 +215,7 @@
 msgid "could not stage '%s'"
 msgstr "неуспешно добавяне в индекса на „%s“"
 
-#: add-interactive.c:703 add-interactive.c:892 reset.c:89 sequencer.c:3478
+#: add-interactive.c:703 add-interactive.c:892 reset.c:89 sequencer.c:3486
 msgid "could not write index"
 msgstr "индексът не може да бъде записан"
 
@@ -370,7 +373,7 @@
 
 #: add-interactive.c:1144 apply.c:4987 apply.c:4990 builtin/am.c:2257
 #: builtin/am.c:2260 builtin/bugreport.c:134 builtin/clone.c:124
-#: builtin/fetch.c:147 builtin/merge.c:284 builtin/pull.c:190
+#: builtin/fetch.c:150 builtin/merge.c:285 builtin/pull.c:190
 #: builtin/submodule--helper.c:409 builtin/submodule--helper.c:1818
 #: builtin/submodule--helper.c:1821 builtin/submodule--helper.c:2326
 #: builtin/submodule--helper.c:2329 builtin/submodule--helper.c:2572
@@ -969,7 +972,7 @@
 msgid "Exiting because of an unresolved conflict."
 msgstr "Изход от програмата заради некоригиран конфликт."
 
-#: advice.c:281 builtin/merge.c:1369
+#: advice.c:281 builtin/merge.c:1370
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Не сте завършили сливане.  (Указателят „MERGE_HEAD“ съществува)."
 
@@ -1285,7 +1288,8 @@
 msgid "cannot checkout %s"
 msgstr "„%s“ не може да се изтегли"
 
-#: apply.c:3405 apply.c:3416 apply.c:3462 midx.c:73 setup.c:308
+#: apply.c:3405 apply.c:3416 apply.c:3462 midx.c:86 pack-revindex.c:213
+#: setup.c:308
 #, c-format
 msgid "failed to read %s"
 msgstr "файлът „%s“ не може да бъде прочетен"
@@ -1450,7 +1454,7 @@
 msgid "unable to add cache entry for %s"
 msgstr "не може да се добави запис в кеша за „%s“"
 
-#: apply.c:4374 builtin/bisect--helper.c:524
+#: apply.c:4374 builtin/bisect--helper.c:523
 #, c-format
 msgid "failed to write to '%s'"
 msgstr "в „%s“ не може да се пише"
@@ -1486,7 +1490,7 @@
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "съкращаване на името на файла с отхвърлените парчета на „ %.*s.rej“"
 
-#: apply.c:4576 builtin/fetch.c:927 builtin/fetch.c:1228
+#: apply.c:4576 builtin/fetch.c:933 builtin/fetch.c:1334
 #, c-format
 msgid "cannot open %s"
 msgstr "„%s“ не може да бъде отворен"
@@ -1542,7 +1546,7 @@
 msgstr[1] ""
 "Добавени са %d реда след корекцията на грешките в знаците за интервали."
 
-#: apply.c:4960 builtin/add.c:618 builtin/mv.c:304 builtin/rm.c:406
+#: apply.c:4960 builtin/add.c:626 builtin/mv.c:304 builtin/rm.c:406
 msgid "Unable to write new index file"
 msgstr "Новият индекс не може да бъде записан"
 
@@ -1613,7 +1617,7 @@
 msgstr ""
 "създаване на временен индекс на база на включената информация за индекса"
 
-#: apply.c:5025 builtin/checkout-index.c:182 builtin/ls-files.c:525
+#: apply.c:5025 builtin/checkout-index.c:195 builtin/ls-files.c:540
 msgid "paths are separated with NUL character"
 msgstr "разделяне на пътищата с нулевия знак „NUL“"
 
@@ -1623,7 +1627,7 @@
 
 #: apply.c:5028 builtin/am.c:2245 builtin/interpret-trailers.c:98
 #: builtin/interpret-trailers.c:100 builtin/interpret-trailers.c:102
-#: builtin/pack-objects.c:3562 builtin/rebase.c:1346
+#: builtin/pack-objects.c:3577 builtin/rebase.c:1352
 msgid "action"
 msgstr "действие"
 
@@ -1652,9 +1656,9 @@
 msgid "allow overlapping hunks"
 msgstr "позволяване на застъпващи се парчета"
 
-#: apply.c:5045 builtin/add.c:329 builtin/check-ignore.c:22
-#: builtin/commit.c:1364 builtin/count-objects.c:98 builtin/fsck.c:775
-#: builtin/log.c:2287 builtin/mv.c:123 builtin/read-tree.c:128
+#: apply.c:5045 builtin/add.c:337 builtin/check-ignore.c:22
+#: builtin/commit.c:1364 builtin/count-objects.c:98 builtin/fsck.c:757
+#: builtin/log.c:2286 builtin/mv.c:123 builtin/read-tree.c:128
 msgid "be verbose"
 msgstr "повече подробности"
 
@@ -1742,14 +1746,14 @@
 msgid "cannot read %s"
 msgstr "обектът „%s“ не може да бъде прочетен"
 
-#: archive.c:345 sequencer.c:459 sequencer.c:1736 sequencer.c:2886
-#: sequencer.c:3327 sequencer.c:3436 builtin/am.c:249 builtin/commit.c:786
-#: builtin/merge.c:1138
+#: archive.c:345 sequencer.c:459 sequencer.c:1744 sequencer.c:2894
+#: sequencer.c:3335 sequencer.c:3444 builtin/am.c:249 builtin/commit.c:786
+#: builtin/merge.c:1139
 #, c-format
 msgid "could not read '%s'"
 msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: archive.c:430 builtin/add.c:181 builtin/add.c:594 builtin/rm.c:315
+#: archive.c:430 builtin/add.c:189 builtin/add.c:602 builtin/rm.c:315
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "пътят „%s“ не съвпада с никой файл"
@@ -1791,7 +1795,7 @@
 msgid "archive format"
 msgstr "ФОРМАТ на архива"
 
-#: archive.c:556 builtin/log.c:1765
+#: archive.c:556 builtin/log.c:1764
 msgid "prefix"
 msgstr "ПРЕФИКС"
 
@@ -1799,11 +1803,11 @@
 msgid "prepend prefix to each pathname in the archive"
 msgstr "добавяне на този ПРЕФИКС към всеки път в архива"
 
-#: archive.c:558 archive.c:561 builtin/blame.c:886 builtin/blame.c:890
-#: builtin/blame.c:891 builtin/commit-tree.c:117 builtin/config.c:135
+#: archive.c:558 archive.c:561 builtin/blame.c:884 builtin/blame.c:888
+#: builtin/blame.c:889 builtin/commit-tree.c:117 builtin/config.c:135
 #: builtin/fast-export.c:1207 builtin/fast-export.c:1209
-#: builtin/fast-export.c:1213 builtin/grep.c:919 builtin/hash-object.c:105
-#: builtin/ls-files.c:561 builtin/ls-files.c:564 builtin/notes.c:412
+#: builtin/fast-export.c:1213 builtin/grep.c:920 builtin/hash-object.c:105
+#: builtin/ls-files.c:576 builtin/ls-files.c:579 builtin/notes.c:412
 #: builtin/notes.c:578 builtin/read-tree.c:123 parse-options.h:190
 msgid "file"
 msgstr "ФАЙЛ"
@@ -1968,12 +1972,12 @@
 msgid "a %s revision is needed"
 msgstr "необходима е версия „%s“"
 
-#: bisect.c:941 builtin/notes.c:177 builtin/tag.c:255
+#: bisect.c:941 builtin/notes.c:177 builtin/tag.c:287
 #, c-format
 msgid "could not create file '%s'"
 msgstr "файлът „%s“ не може да бъде създаден"
 
-#: bisect.c:987 builtin/merge.c:152
+#: bisect.c:987 builtin/merge.c:153
 #, c-format
 msgid "could not read file '%s'"
 msgstr "файлът „%s“ не може да бъде прочетен"
@@ -1991,7 +1995,7 @@
 #, c-format
 msgid ""
 "No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
+"Maybe you started with bad path arguments?\n"
 msgstr ""
 "Липсва подходящо за тестване подаване.\n"
 "Проверете параметрите за пътищата.\n"
@@ -2027,11 +2031,11 @@
 "Едновременното задаване на опциите „--reverse“ и „--first-parent“ изисква "
 "указването на крайно подаване"
 
-#: blame.c:2821 bundle.c:213 ref-filter.c:2272 remote.c:2031 sequencer.c:2138
-#: sequencer.c:4633 submodule.c:855 builtin/commit.c:1045 builtin/log.c:409
-#: builtin/log.c:1023 builtin/log.c:1625 builtin/log.c:2046 builtin/log.c:2336
-#: builtin/merge.c:423 builtin/pack-objects.c:3380 builtin/pack-objects.c:3395
-#: builtin/shortlog.c:267
+#: blame.c:2821 bundle.c:213 ref-filter.c:2206 remote.c:2041 sequencer.c:2146
+#: sequencer.c:4641 submodule.c:856 builtin/commit.c:1045 builtin/log.c:411
+#: builtin/log.c:1016 builtin/log.c:1624 builtin/log.c:2045 builtin/log.c:2335
+#: builtin/merge.c:424 builtin/pack-objects.c:3395 builtin/pack-objects.c:3410
+#: builtin/shortlog.c:255
 msgid "revision walk setup failed"
 msgstr "неуспешно настройване на обхождането на версиите"
 
@@ -2210,7 +2214,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr "непозната заглавна част: %s%s (%d)"
 
-#: bundle.c:136 rerere.c:480 rerere.c:690 sequencer.c:2390 sequencer.c:3176
+#: bundle.c:136 rerere.c:464 rerere.c:674 sequencer.c:2398 sequencer.c:3184
 #: builtin/commit.c:814
 #, c-format
 msgid "could not open '%s'"
@@ -2254,286 +2258,301 @@
 msgid "pack-objects died"
 msgstr "Командата „git pack-objects“ не завърши успешно"
 
-#: bundle.c:379
-msgid "rev-list died"
-msgstr "Командата „git rev-list“ не завърши успешно"
-
-#: bundle.c:428
+#: bundle.c:386
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr ""
 "указателят „%s“ не е бил включен поради опциите зададени на „git rev-list“"
 
-#: bundle.c:498
+#: bundle.c:490
 #, c-format
 msgid "unsupported bundle version %d"
 msgstr "неподдържана версия на индекса %d"
 
-#: bundle.c:500
+#: bundle.c:492
 #, c-format
 msgid "cannot write bundle version %d with algorithm %s"
 msgstr "пратка %d не може да се запише с алгоритъм %s"
 
-#: bundle.c:522 builtin/log.c:209 builtin/log.c:1927 builtin/shortlog.c:408
+#: bundle.c:510 builtin/log.c:210 builtin/log.c:1926 builtin/shortlog.c:396
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "непознат аргумент: %s"
 
-#: bundle.c:530
+#: bundle.c:539
 msgid "Refusing to create empty bundle."
 msgstr "Създаването на празна пратка е невъзможно."
 
-#: bundle.c:540
+#: bundle.c:549
 #, c-format
 msgid "cannot create '%s'"
-msgstr "Файлът „%s“ не може да бъде създаден"
+msgstr "файлът „%s“ не може да бъде създаден"
 
-#: bundle.c:565
+#: bundle.c:574
 msgid "index-pack died"
-msgstr "Командата „git index-pack“ не завърши успешно"
+msgstr "командата „git index-pack“ не завърши успешно"
+
+#: chunk-format.c:113
+msgid "terminating chunk id appears earlier than expected"
+msgstr "идентификаторът за краен откъс се явява по-рано от очакваното"
+
+#: chunk-format.c:122
+#, c-format
+msgid "improper chunk offset(s) %<PRIx64> and %<PRIx64>"
+msgstr "неправилно отместване на откъс/и %<PRIx64> и %<PRIx64>"
+
+#: chunk-format.c:129
+#, c-format
+msgid "duplicate chunk ID %<PRIx32> found"
+msgstr "повтарящ се идентификатор на откъс %<PRIx32>"
+
+#: chunk-format.c:143
+#, c-format
+msgid "final chunk has non-zero id %<PRIx32>"
+msgstr "ненулев идентификатор за краен откъс %<PRIx32>"
 
 #: color.c:329
 #, c-format
 msgid "invalid color value: %.*s"
 msgstr "неправилна стойност за цвят: %.*s"
 
-#: commit-graph.c:188 midx.c:47
+#: commit-graph.c:197 midx.c:46
 msgid "invalid hash version"
 msgstr "неправилна версия на контролна сума"
 
-#: commit-graph.c:246
+#: commit-graph.c:255
 msgid "commit-graph file is too small"
-msgstr "файлът с гра̀фа на подаванията е твърде малък"
+msgstr "файлът за гра̀фа с подаванията е твърде малък"
 
-#: commit-graph.c:311
+#: commit-graph.c:348
 #, c-format
 msgid "commit-graph signature %X does not match signature %X"
 msgstr "отпечатъкът на гра̀фа с подаванията %X не съвпада с %X"
 
-#: commit-graph.c:318
+#: commit-graph.c:355
 #, c-format
 msgid "commit-graph version %X does not match version %X"
 msgstr "версията на гра̀фа с подаванията %X не съвпада с %X"
 
-#: commit-graph.c:325
+#: commit-graph.c:362
 #, c-format
 msgid "commit-graph hash version %X does not match version %X"
 msgstr "версията на контролната сума на гра̀фа с подаванията %X не съвпада с %X"
 
-#: commit-graph.c:342
+#: commit-graph.c:379
 #, c-format
 msgid "commit-graph file is too small to hold %u chunks"
 msgstr "файлът с гра̀фа на подаванията е твърде малък, за да съдържа %u откъси"
 
-#: commit-graph.c:361
-#, c-format
-msgid "commit-graph improper chunk offset %08x%08x"
-msgstr "неправилно отместване на откъс: %08x%08x"
-
-#: commit-graph.c:433
-#, c-format
-msgid "commit-graph chunk id %08x appears multiple times"
-msgstr "откъсът %08x се явява многократно"
-
-#: commit-graph.c:499
+#: commit-graph.c:472
 msgid "commit-graph has no base graphs chunk"
 msgstr "базовият откъс липсва в гра̀фа с подаванията"
 
-#: commit-graph.c:509
+#: commit-graph.c:482
 msgid "commit-graph chain does not match"
 msgstr "веригата на гра̀фа с подаванията не съвпада"
 
-#: commit-graph.c:557
+#: commit-graph.c:530
 #, c-format
 msgid "invalid commit-graph chain: line '%s' not a hash"
 msgstr ""
 "грешка във веригата на гра̀фа с подаванията: ред „%s“ не е контролна сума"
 
-#: commit-graph.c:581
+#: commit-graph.c:554
 msgid "unable to find all commit-graph files"
 msgstr "някои файлове на гра̀фа с подаванията не могат да бъдат открити"
 
-#: commit-graph.c:721 commit-graph.c:785
+#: commit-graph.c:735 commit-graph.c:772
 msgid "invalid commit position. commit-graph is likely corrupt"
 msgstr ""
 "неправилна позиция на подаването.  Вероятно графът с подаванията е повреден"
 
-#: commit-graph.c:742
+#: commit-graph.c:756
 #, c-format
 msgid "could not find commit %s"
 msgstr "подаването „%s“ не може да бъде открито"
 
-#: commit-graph.c:1036 builtin/am.c:1292
+#: commit-graph.c:789
+msgid "commit-graph requires overflow generation data but has none"
+msgstr ""
+"графът с подаванията изисква генериране на данни за отместването, но такива "
+"липсват"
+
+#: commit-graph.c:1065 builtin/am.c:1292
 #, c-format
 msgid "unable to parse commit %s"
 msgstr "подаването не може да бъде анализирано: %s"
 
-#: commit-graph.c:1252 builtin/pack-objects.c:2864
+#: commit-graph.c:1327 builtin/pack-objects.c:2872
 #, c-format
 msgid "unable to get type of object %s"
 msgstr "видът на обекта „%s“ не може да бъде определен"
 
-#: commit-graph.c:1283
+#: commit-graph.c:1358
 msgid "Loading known commits in commit graph"
 msgstr "Зареждане на познатите подавания в гра̀фа с подаванията"
 
-#: commit-graph.c:1300
+#: commit-graph.c:1375
 msgid "Expanding reachable commits in commit graph"
 msgstr "Разширяване на достижимите подавания в гра̀фа"
 
-#: commit-graph.c:1320
+#: commit-graph.c:1395
 msgid "Clearing commit marks in commit graph"
 msgstr "Изчистване на отбелязванията на подаванията в гра̀фа с подаванията"
 
-#: commit-graph.c:1339
+#: commit-graph.c:1414
+msgid "Computing commit graph topological levels"
+msgstr "Изчисляване на топологичните нива в гра̀фа с подаванията"
+
+#: commit-graph.c:1467
 msgid "Computing commit graph generation numbers"
 msgstr "Изчисляване на номерата на поколенията в гра̀фа с подаванията"
 
-#: commit-graph.c:1406
+#: commit-graph.c:1548
 msgid "Computing commit changed paths Bloom filters"
 msgstr "Изчисляване на филтрите на Блум на пътищата с промяна при подаването"
 
-#: commit-graph.c:1483
+#: commit-graph.c:1625
 msgid "Collecting referenced commits"
 msgstr "Събиране на свързаните подавания"
 
-#: commit-graph.c:1508
+#: commit-graph.c:1650
 #, c-format
 msgid "Finding commits for commit graph in %d pack"
 msgid_plural "Finding commits for commit graph in %d packs"
 msgstr[0] "Откриване на подаванията в гра̀фа в %d пакетен файл"
 msgstr[1] "Откриване на подаванията в гра̀фа в %d пакетни файла"
 
-#: commit-graph.c:1521
+#: commit-graph.c:1663
 #, c-format
 msgid "error adding pack %s"
 msgstr "грешка при добавяне на пакетен файл „%s“"
 
-#: commit-graph.c:1525
+#: commit-graph.c:1667
 #, c-format
 msgid "error opening index for %s"
 msgstr "грешка при отваряне на индекса на „%s“"
 
-#: commit-graph.c:1562
+#: commit-graph.c:1704
 msgid "Finding commits for commit graph among packed objects"
 msgstr "Откриване на подаванията в гра̀фа измежду пакетираните обекти"
 
-#: commit-graph.c:1580
+#: commit-graph.c:1722
 msgid "Finding extra edges in commit graph"
 msgstr "Откриване на още върхове в гра̀фа с подаванията"
 
-#: commit-graph.c:1628
+#: commit-graph.c:1771
 msgid "failed to write correct number of base graph ids"
 msgstr "правилният брой на базовите идентификатори не може да се запише"
 
-#: commit-graph.c:1670 midx.c:819
+#: commit-graph.c:1802 midx.c:794
 #, c-format
 msgid "unable to create leading directories of %s"
 msgstr "родителските директории на „%s“ не могат да бъдат създадени"
 
-#: commit-graph.c:1683
+#: commit-graph.c:1815
 msgid "unable to create temporary graph layer"
 msgstr "не може да бъде създаден временен слой за гра̀фа с подаванията"
 
-#: commit-graph.c:1688
+#: commit-graph.c:1820
 #, c-format
 msgid "unable to adjust shared permissions for '%s'"
 msgstr "правата за споделен достъп до „%s“ не могат да бъдат зададени"
 
-#: commit-graph.c:1758
+#: commit-graph.c:1879
 #, c-format
 msgid "Writing out commit graph in %d pass"
 msgid_plural "Writing out commit graph in %d passes"
 msgstr[0] "Запазване на гра̀фа с подаванията в %d пас"
 msgstr[1] "Запазване на гра̀фа с подаванията в %d паса"
 
-#: commit-graph.c:1803
+#: commit-graph.c:1915
 msgid "unable to open commit-graph chain file"
 msgstr "файлът с веригата на гра̀фа с подаванията не може да се отвори"
 
-#: commit-graph.c:1819
+#: commit-graph.c:1931
 msgid "failed to rename base commit-graph file"
 msgstr "основният файл на гра̀фа с подаванията не може да бъде преименуван"
 
-#: commit-graph.c:1839
+#: commit-graph.c:1951
 msgid "failed to rename temporary commit-graph file"
 msgstr "временният файл на гра̀фа с подаванията не може да бъде преименуван"
 
-#: commit-graph.c:1965
+#: commit-graph.c:2084
 msgid "Scanning merged commits"
 msgstr "Търсене на подаванията със сливания"
 
-#: commit-graph.c:2009
+#: commit-graph.c:2128
 msgid "Merging commit-graph"
 msgstr "Сливане на гра̀фа с подаванията"
 
-#: commit-graph.c:2115
+#: commit-graph.c:2235
 msgid "attempting to write a commit-graph, but 'core.commitGraph' is disabled"
 msgstr ""
 "опит за запис на гра̀фа с подаванията, но настройката „core.commitGraph“ е "
 "изключена"
 
-#: commit-graph.c:2214
+#: commit-graph.c:2342
 msgid "too many commits to write graph"
 msgstr "прекалено много подавания за записване на гра̀фа"
 
-#: commit-graph.c:2307
+#: commit-graph.c:2440
 msgid "the commit-graph file has incorrect checksum and is likely corrupt"
 msgstr "графът с подаванията е с грешна сума за проверка — вероятно е повреден"
 
-#: commit-graph.c:2317
+#: commit-graph.c:2450
 #, c-format
 msgid "commit-graph has incorrect OID order: %s then %s"
 msgstr ""
 "неправилна подредба на обектите по идентификатор в гра̀фа с подаванията: „%s“ "
 "е преди „%s“, а не трябва"
 
-#: commit-graph.c:2327 commit-graph.c:2342
+#: commit-graph.c:2460 commit-graph.c:2475
 #, c-format
 msgid "commit-graph has incorrect fanout value: fanout[%d] = %u != %u"
 msgstr ""
 "неправилна стойност за откъс в гра̀фа с подаванията: fanout[%d] = %u, а "
 "трябва да е %u"
 
-#: commit-graph.c:2334
+#: commit-graph.c:2467
 #, c-format
 msgid "failed to parse commit %s from commit-graph"
 msgstr "подаване „%s“ в гра̀фа с подаванията не може да се анализира"
 
-#: commit-graph.c:2352
+#: commit-graph.c:2485
 msgid "Verifying commits in commit graph"
 msgstr "Проверка на подаванията в гра̀фа"
 
-#: commit-graph.c:2367
+#: commit-graph.c:2500
 #, c-format
 msgid "failed to parse commit %s from object database for commit-graph"
 msgstr ""
 "подаване „%s“ в базата от данни към гра̀фа с подаванията не може да се "
 "анализира"
 
-#: commit-graph.c:2374
+#: commit-graph.c:2507
 #, c-format
 msgid "root tree OID for commit %s in commit-graph is %s != %s"
 msgstr ""
 "идентификаторът на обект за кореновото дърво за подаване „%s“ в гра̀фа с "
 "подаванията е „%s“, а трябва да е „%s“"
 
-#: commit-graph.c:2384
+#: commit-graph.c:2517
 #, c-format
 msgid "commit-graph parent list for commit %s is too long"
 msgstr "списъкът с родители на „%s“ в гра̀фа с подаванията е прекалено дълъг"
 
-#: commit-graph.c:2393
+#: commit-graph.c:2526
 #, c-format
 msgid "commit-graph parent for %s is %s != %s"
 msgstr "родителят на „%s“ в гра̀фа с подаванията е „%s“, а трябва да е „%s“"
 
-#: commit-graph.c:2407
+#: commit-graph.c:2540
 #, c-format
 msgid "commit-graph parent list for commit %s terminates early"
 msgstr "списъкът с родители на „%s“ в гра̀фа с подаванията е прекалено къс"
 
-#: commit-graph.c:2412
+#: commit-graph.c:2545
 #, c-format
 msgid ""
 "commit-graph has generation number zero for commit %s, but non-zero elsewhere"
@@ -2541,7 +2560,7 @@
 "номерът на поколението на подаване „%s“ в гра̀фа с подаванията е 0, а другаде "
 "не е"
 
-#: commit-graph.c:2416
+#: commit-graph.c:2549
 #, c-format
 msgid ""
 "commit-graph has non-zero generation number for commit %s, but zero elsewhere"
@@ -2549,21 +2568,21 @@
 "номерът на поколението на подаване „%s“ в гра̀фа с подаванията не е 0, а "
 "другаде е"
 
-#: commit-graph.c:2432
+#: commit-graph.c:2566
 #, c-format
-msgid "commit-graph generation for commit %s is %u != %u"
+msgid "commit-graph generation for commit %s is %<PRIuMAX> < %<PRIuMAX>"
 msgstr ""
-"номерът на поколението на подаване „%s“ в гра̀фа с подаванията е %u, а "
-"другаде е %u"
+"номерът на поколението на подаване „%s“ в гра̀фа с подаванията е %<PRIuMAX> < "
+"%<PRIuMAX>"
 
-#: commit-graph.c:2438
+#: commit-graph.c:2572
 #, c-format
 msgid "commit date for commit %s in commit-graph is %<PRIuMAX> != %<PRIuMAX>"
 msgstr ""
 "датата на подаване на „%s“ в гра̀фа с подаванията е %<PRIuMAX>, а трябва да е "
 "%<PRIuMAX>"
 
-#: commit.c:52 sequencer.c:2879 builtin/am.c:359 builtin/am.c:403
+#: commit.c:52 sequencer.c:2887 builtin/am.c:359 builtin/am.c:403
 #: builtin/am.c:1371 builtin/am.c:2018 builtin/replace.c:457
 #, c-format
 msgid "could not parse %s"
@@ -2597,29 +2616,29 @@
 "\n"
 "    git config advice.graftFileDeprecated false"
 
-#: commit.c:1172
+#: commit.c:1223
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 "Подаването „%s“ е с недоверен подпис от GPG, който твърди, че е на „%s“."
 
-#: commit.c:1176
+#: commit.c:1227
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
 "Подаването „%s“ е с неправилен подпис от GPG, който твърди, че е на „%s“."
 
-#: commit.c:1179
+#: commit.c:1230
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Подаването „%s“ е без подпис от GPG."
 
-#: commit.c:1182
+#: commit.c:1233
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Подаването „%s“ е с коректен подпис от GPG на „%s“.\n"
 
-#: commit.c:1436
+#: commit.c:1487
 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"
@@ -2633,7 +2652,7 @@
 msgid "memory exhausted"
 msgstr "паметта свърши"
 
-#: config.c:125
+#: config.c:126
 #, c-format
 msgid ""
 "exceeded maximum include depth (%d) while including\n"
@@ -2648,162 +2667,206 @@
 "    %s\n"
 "Това може да се дължи на зацикляне при вмъкването."
 
-#: config.c:141
+#: config.c:142
 #, c-format
 msgid "could not expand include path '%s'"
 msgstr "пътят за вмъкване „%s“не може да бъде разширен"
 
-#: config.c:152
+#: config.c:153
 msgid "relative config includes must come from files"
 msgstr "относителните вмъквания на конфигурации трябва да идват от файлове"
 
-#: config.c:198
+#: config.c:199
 msgid "relative config include conditionals must come from files"
 msgstr "относителните условни изрази за вмъкване трябва да идват от файлове"
 
-#: config.c:378
+#: config.c:396
+#, c-format
+msgid "invalid config format: %s"
+msgstr "неправилен формат на настройка: %s"
+
+#: config.c:400
+#, c-format
+msgid "missing environment variable name for configuration '%.*s'"
+msgstr "липсва име на променлива на средата за настройката „%.*s“"
+
+#: config.c:405
+#, c-format
+msgid "missing environment variable '%s' for configuration '%.*s'"
+msgstr "липсва променлива на средата „%s“ за настройката „%.*s“"
+
+#: config.c:442
 #, c-format
 msgid "key does not contain a section: %s"
 msgstr "ключът не съдържа раздел: „%s“"
 
-#: config.c:384
+#: config.c:448
 #, c-format
 msgid "key does not contain variable name: %s"
 msgstr "ключът не съдържа име на променлива: „%s“"
 
-#: config.c:408 sequencer.c:2580
+#: config.c:472 sequencer.c:2588
 #, c-format
 msgid "invalid key: %s"
 msgstr "неправилен ключ: „%s“"
 
-#: config.c:414
+#: config.c:478
 #, c-format
 msgid "invalid key (newline): %s"
 msgstr "неправилен ключ (нов ред): „%s“"
 
-#: config.c:450 config.c:462
+#: config.c:511
+msgid "empty config key"
+msgstr "празен ключ за настройка"
+
+#: config.c:529 config.c:541
 #, c-format
 msgid "bogus config parameter: %s"
 msgstr "неправилен конфигурационен параметър: „%s“"
 
-#: config.c:497
+#: config.c:555 config.c:572 config.c:579 config.c:588
 #, c-format
 msgid "bogus format in %s"
 msgstr "неправилен формат в „%s“"
 
-#: config.c:836
+#: config.c:622
+#, c-format
+msgid "bogus count in %s"
+msgstr "неправилен брой в „%s“"
+
+#: config.c:626
+#, c-format
+msgid "too many entries in %s"
+msgstr "прекалено много записи в „%s“"
+
+#: config.c:636
+#, c-format
+msgid "missing config key %s"
+msgstr "ключът за настройка „%s“ липсва"
+
+#: config.c:644
+#, c-format
+msgid "missing config value %s"
+msgstr "стойността за настройка „%s“ липсва"
+
+#: config.c:995
 #, c-format
 msgid "bad config line %d in blob %s"
 msgstr "неправилен ред за настройки %d в BLOB „%s“"
 
-#: config.c:840
+#: config.c:999
 #, c-format
 msgid "bad config line %d in file %s"
 msgstr "неправилен ред за настройки %d във файла „%s“"
 
-#: config.c:844
+#: config.c:1003
 #, c-format
 msgid "bad config line %d in standard input"
 msgstr "неправилен ред за настройки %d на стандартния вход"
 
-#: config.c:848
+#: config.c:1007
 #, c-format
 msgid "bad config line %d in submodule-blob %s"
 msgstr "неправилен ред за настройки %d в BLOB за подмодул „%s“"
 
-#: config.c:852
+#: config.c:1011
 #, c-format
 msgid "bad config line %d in command line %s"
 msgstr "неправилен ред за настройки %d на командния ред „%s“"
 
-#: config.c:856
+#: config.c:1015
 #, c-format
 msgid "bad config line %d in %s"
 msgstr "неправилен ред за настройки %d в „%s“"
 
-#: config.c:993
+#: config.c:1152
 msgid "out of range"
 msgstr "извън диапазона"
 
-#: config.c:993
+#: config.c:1152
 msgid "invalid unit"
 msgstr "неправилна мерна единица"
 
-#: config.c:994
+#: config.c:1153
 #, c-format
 msgid "bad numeric config value '%s' for '%s': %s"
 msgstr "неправилна числова стойност „%s“ за „%s“: %s"
 
-#: config.c:1013
+#: config.c:1163
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
 msgstr "неправилна числова стойност „%s“ за „%s“ в BLOB „%s“: %s"
 
-#: config.c:1016
+#: config.c:1166
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in file %s: %s"
 msgstr "неправилна числова стойност „%s“ за „%s“ във файла „%s“: %s"
 
-#: config.c:1019
+#: config.c:1169
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in standard input: %s"
 msgstr "неправилна числова стойност „%s“ за „%s“ на стандартния вход: %s"
 
-#: config.c:1022
+#: config.c:1172
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
 msgstr "неправилна числова стойност „%s“ за „%s“ в BLOB от подмодул „%s“: %s"
 
-#: config.c:1025
+#: config.c:1175
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
 msgstr "неправилна числова стойност „%s“ за „%s“ на командния ред „%s“: %s"
 
-#: config.c:1028
+#: config.c:1178
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in %s: %s"
 msgstr "неправилна числова стойност „%s“ за „%s“ в %s: %s"
 
-#: config.c:1123
+#: config.c:1194
+#, c-format
+msgid "bad boolean config value '%s' for '%s'"
+msgstr "неправилна булева стойност „%s“ за „%s“"
+
+#: config.c:1289
 #, c-format
 msgid "failed to expand user dir in: '%s'"
 msgstr "домашната папка на потребителя не може да бъде открита: „%s“"
 
-#: config.c:1132
+#: config.c:1298
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
 msgstr "„%s“ не е правилна стойност за време за „%s“"
 
-#: config.c:1223
+#: config.c:1391
 #, c-format
 msgid "abbrev length out of range: %d"
 msgstr "дължината на съкращаване е извън интервала ([4; 40]): %d"
 
-#: config.c:1237 config.c:1248
+#: config.c:1405 config.c:1416
 #, c-format
 msgid "bad zlib compression level %d"
 msgstr "неправилно ниво на компресиране: %d"
 
-#: config.c:1340
+#: config.c:1508
 msgid "core.commentChar should only be one character"
 msgstr "настройката „core.commentChar“ трябва да е само един знак"
 
-#: config.c:1373
+#: config.c:1541
 #, c-format
 msgid "invalid mode for object creation: %s"
 msgstr "неправилен режим за създаването на обекти: %s"
 
-#: config.c:1445
+#: config.c:1613
 #, c-format
 msgid "malformed value for %s"
 msgstr "неправилна стойност за „%s“"
 
-#: config.c:1471
+#: config.c:1639
 #, c-format
 msgid "malformed value for %s: %s"
 msgstr "неправилна стойност за „%s“: „%s“"
 
-#: config.c:1472
+#: config.c:1640
 msgid "must be one of nothing, matching, simple, upstream or current"
 msgstr ""
 "трябва да е една от следните стойности: „nothing“ (без изтласкване при липса "
@@ -2811,132 +2874,132 @@
 "„simple“ (клонът със същото име, от който се издърпва), „upstream“ (клонът, "
 "от който се издърпва) или „current“ (клонът със същото име)"
 
-#: config.c:1533 builtin/pack-objects.c:3649
+#: config.c:1701 builtin/pack-objects.c:3666
 #, c-format
 msgid "bad pack compression level %d"
 msgstr "неправилно ниво на компресиране при пакетиране: %d"
 
-#: config.c:1655
+#: config.c:1823
 #, c-format
 msgid "unable to load config blob object '%s'"
 msgstr "обектът-BLOB „%s“ с конфигурации не може да се зареди"
 
-#: config.c:1658
+#: config.c:1826
 #, c-format
 msgid "reference '%s' does not point to a blob"
 msgstr "указателят „%s“ не сочи към обект-BLOB"
 
-#: config.c:1675
+#: config.c:1843
 #, c-format
 msgid "unable to resolve config blob '%s'"
 msgstr "обектът-BLOB „%s“ с конфигурации не може да бъде открит"
 
-#: config.c:1705
+#: config.c:1873
 #, c-format
 msgid "failed to parse %s"
 msgstr "„%s“ не може да бъде анализиран"
 
-#: config.c:1759
+#: config.c:1927
 msgid "unable to parse command-line config"
 msgstr "неправилни настройки от командния ред"
 
-#: config.c:2122
+#: config.c:2290
 msgid "unknown error occurred while reading the configuration files"
 msgstr "неочаквана грешка при изчитането на конфигурационните файлове"
 
-#: config.c:2296
+#: config.c:2464
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "Неправилен %s: „%s“"
 
-#: config.c:2341
+#: config.c:2509
 #, c-format
 msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
 msgstr ""
 "стойността на „splitIndex.maxPercentChange“ трябва да е между 1 и 100, а не "
 "%d"
 
-#: config.c:2387
+#: config.c:2555
 #, c-format
 msgid "unable to parse '%s' from command-line config"
 msgstr "неразпозната стойност „%s“ от командния ред"
 
-#: config.c:2389
+#: config.c:2557
 #, c-format
 msgid "bad config variable '%s' in file '%s' at line %d"
 msgstr "неправилна настройка „%s“ във файла „%s“ на ред №%d"
 
-#: config.c:2473
+#: config.c:2641
 #, c-format
 msgid "invalid section name '%s'"
 msgstr "неправилно име на раздел: „%s“"
 
-#: config.c:2505
+#: config.c:2673
 #, c-format
 msgid "%s has multiple values"
 msgstr "зададени са няколко стойности за „%s“"
 
-#: config.c:2534
+#: config.c:2702
 #, c-format
 msgid "failed to write new configuration file %s"
 msgstr "новият конфигурационен файл „%s“ не може да бъде запазен"
 
-#: config.c:2786 config.c:3112
+#: config.c:2954 config.c:3280
 #, c-format
 msgid "could not lock config file %s"
 msgstr "конфигурационният файл „%s“ не може да бъде заключен"
 
-#: config.c:2797
+#: config.c:2965
 #, c-format
 msgid "opening %s"
 msgstr "отваряне на „%s“"
 
-#: config.c:2834 builtin/config.c:361
+#: config.c:3002 builtin/config.c:361
 #, c-format
 msgid "invalid pattern: %s"
 msgstr "неправилен шаблон: %s"
 
-#: config.c:2859
+#: config.c:3027
 #, c-format
 msgid "invalid config file %s"
 msgstr "неправилен конфигурационен файл: „%s“"
 
-#: config.c:2872 config.c:3125
+#: config.c:3040 config.c:3293
 #, c-format
 msgid "fstat on %s failed"
 msgstr "неуспешно изпълнение на „fstat“ върху „%s“"
 
-#: config.c:2883
+#: config.c:3051
 #, c-format
 msgid "unable to mmap '%s'"
 msgstr "неуспешно изпълнение на „mmap“ върху „%s“"
 
-#: config.c:2892 config.c:3130
+#: config.c:3060 config.c:3298
 #, c-format
 msgid "chmod on %s failed"
 msgstr "неуспешна смяна на права с „chmod“ върху „%s“"
 
-#: config.c:2977 config.c:3227
+#: config.c:3145 config.c:3395
 #, c-format
 msgid "could not write config file %s"
 msgstr "конфигурационният файл „%s“ не може да бъде записан"
 
-#: config.c:3011
+#: config.c:3179
 #, c-format
 msgid "could not set '%s' to '%s'"
 msgstr "„%s“ не може да се зададе да е „%s“"
 
-#: config.c:3013 builtin/remote.c:657 builtin/remote.c:855 builtin/remote.c:863
+#: config.c:3181 builtin/remote.c:657 builtin/remote.c:855 builtin/remote.c:863
 #, c-format
 msgid "could not unset '%s'"
 msgstr "„%s“ не може да се премахне"
 
-#: config.c:3103
+#: config.c:3271
 #, c-format
 msgid "invalid section name: %s"
 msgstr "неправилно име на раздел: %s"
 
-#: config.c:3270
+#: config.c:3438
 #, c-format
 msgid "missing value for '%s'"
 msgstr "липсва стойност за „%s“"
@@ -2999,45 +3062,45 @@
 msgid "protocol error: unexpected '%s'"
 msgstr "протоколна грешка: неочаквано „%s“"
 
-#: connect.c:473
+#: connect.c:497
 #, c-format
 msgid "unknown object format '%s' specified by server"
 msgstr "сървърът указа непознат формат на обект: „%s“"
 
-#: connect.c:500
+#: connect.c:526
 #, c-format
 msgid "invalid ls-refs response: %s"
 msgstr "неправилен отговор на „ls-refs“: „%s“"
 
-#: connect.c:504
+#: connect.c:530
 msgid "expected flush after ref listing"
 msgstr "след изброяването на указателите се очаква изчистване на буферите"
 
-#: connect.c:507
+#: connect.c:533
 msgid "expected response end packet after ref listing"
 msgstr "след изброяването на указателите се очаква пакет за край"
 
-#: connect.c:640
+#: connect.c:666
 #, c-format
 msgid "protocol '%s' is not supported"
 msgstr "протокол „%s“ не се поддържа"
 
-#: connect.c:691
+#: connect.c:717
 msgid "unable to set SO_KEEPALIVE on socket"
 msgstr "неуспешно задаване на „SO_KEEPALIVE“ на гнездо"
 
-#: connect.c:731 connect.c:794
+#: connect.c:757 connect.c:820
 #, c-format
 msgid "Looking up %s ... "
 msgstr "Търсене на „%s“… "
 
-#: connect.c:735
+#: connect.c:761
 #, c-format
 msgid "unable to look up %s (port %s) (%s)"
 msgstr "„%s“ (порт %s) не може да се открие („%s“)"
 
 #. TRANSLATORS: this is the end of "Looking up %s ... "
-#: connect.c:739 connect.c:810
+#: connect.c:765 connect.c:836
 #, c-format
 msgid ""
 "done.\n"
@@ -3046,7 +3109,7 @@
 "готово.\n"
 "Свързване към „%s“ (порт %s)…"
 
-#: connect.c:761 connect.c:838
+#: connect.c:787 connect.c:864
 #, c-format
 msgid ""
 "unable to connect to %s:\n"
@@ -3056,65 +3119,71 @@
 "%s"
 
 #. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
-#: connect.c:767 connect.c:844
+#: connect.c:793 connect.c:870
 msgid "done."
 msgstr "действието завърши."
 
-#: connect.c:798
+#: connect.c:824
 #, c-format
 msgid "unable to look up %s (%s)"
 msgstr "„%s“ не може да се открие (%s)"
 
-#: connect.c:804
+#: connect.c:830
 #, c-format
 msgid "unknown port %s"
 msgstr "непознат порт „%s“"
 
-#: connect.c:941 connect.c:1271
+#: connect.c:967 connect.c:1299
 #, c-format
 msgid "strange hostname '%s' blocked"
 msgstr "необичайното име на хост „%s“ е блокирано"
 
-#: connect.c:943
+#: connect.c:969
 #, c-format
 msgid "strange port '%s' blocked"
 msgstr "необичайният порт „%s“ е блокиран"
 
-#: connect.c:953
+#: connect.c:979
 #, c-format
 msgid "cannot start proxy %s"
 msgstr "посредникът „%s“ не може да се стартира"
 
-#: connect.c:1024
+#: connect.c:1050
 msgid "no path specified; see 'git help pull' for valid url syntax"
 msgstr ""
 "не е указан път. Проверете синтаксиса с командата:\n"
 "\n"
 "    git help pull"
 
-#: connect.c:1219
+#: connect.c:1190
+msgid "newline is forbidden in git:// hosts and repo paths"
+msgstr ""
+"знакът за нов ред не е позволен в адресите и в пътищата до хранилищата "
+"„git://“"
+
+#: connect.c:1247
 msgid "ssh variant 'simple' does not support -4"
 msgstr "вариантът за „ssh“ — „simple“ (опростен), не поддържа опцията „-4“"
 
-#: connect.c:1231
+#: connect.c:1259
 msgid "ssh variant 'simple' does not support -6"
 msgstr "вариантът за „ssh“ — „simple“ (опростен), не поддържа опцията „-6“"
 
-#: connect.c:1248
+#: connect.c:1276
 msgid "ssh variant 'simple' does not support setting port"
 msgstr ""
 "вариантът за „ssh“ — „simple“ (опростен), не поддържа задаването на порт"
 
-#: connect.c:1360
+#: connect.c:1388
 #, c-format
 msgid "strange pathname '%s' blocked"
 msgstr "необичайният път „%s“ е блокиран"
 
-#: connect.c:1408
+#: connect.c:1436
 msgid "unable to fork"
 msgstr "неуспешно създаване на процес"
 
-#: connected.c:108 builtin/fsck.c:209 builtin/prune.c:45
+#: connected.c:108 builtin/fsck.c:191 builtin/prune.c:45
 msgid "Checking connectivity"
 msgstr "Проверка на свързаността"
 
@@ -3389,6 +3458,11 @@
 msgid "Marked %d islands, done.\n"
 msgstr "Отбелязани са %d групи, работата приключи.\n"
 
+#: diff-merges.c:70
+#, c-format
+msgid "unknown value for --diff-merges: %s"
+msgstr "непозната стойност за опцията „--diff-merges“: „%s“"
+
 #: diff-lib.c:534
 msgid "--merge-base does not work with ranges"
 msgstr "опцията „--merge-base“ не работи с диапазони"
@@ -3483,32 +3557,32 @@
 msgstr ""
 "външната програма за разлики завърши неуспешно.  Спиране на работата при „%s“"
 
-#: diff.c:4625
+#: diff.c:4628
 msgid "--name-only, --name-status, --check and -s are mutually exclusive"
 msgstr ""
 "Опциите „--name-only“, „--name-status“, „--check“ и „-s“ са несъвместими "
 "една с друга"
 
-#: diff.c:4628
+#: diff.c:4631
 msgid "-G, -S and --find-object are mutually exclusive"
 msgstr "Опциите „-G“, „-S“ и „--find-object“ са несъвместими една с друга"
 
-#: diff.c:4707
+#: diff.c:4710
 msgid "--follow requires exactly one pathspec"
 msgstr "Опцията „--follow“ изисква точно един път"
 
-#: diff.c:4755
+#: diff.c:4758
 #, c-format
 msgid "invalid --stat value: %s"
 msgstr "неправилна стойност за „--stat“: %s"
 
-#: diff.c:4760 diff.c:4765 diff.c:4770 diff.c:4775 diff.c:5303
+#: diff.c:4763 diff.c:4768 diff.c:4773 diff.c:4778 diff.c:5306
 #: parse-options.c:197 parse-options.c:201 builtin/commit-graph.c:180
 #, c-format
 msgid "%s expects a numerical value"
 msgstr "опцията „%s“ очаква число за аргумент"
 
-#: diff.c:4792
+#: diff.c:4795
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -3517,44 +3591,44 @@
 "Неразпознат параметър към опцията „--dirstat/-X“:\n"
 "%s"
 
-#: diff.c:4877
+#: diff.c:4880
 #, c-format
 msgid "unknown change class '%c' in --diff-filter=%s"
 msgstr "непознат вид промяна: „%c“ в „--diff-filter=%s“"
 
-#: diff.c:4901
+#: diff.c:4904
 #, c-format
 msgid "unknown value after ws-error-highlight=%.*s"
 msgstr "непозната стойност след „ws-error-highlight=%.*s“"
 
-#: diff.c:4915
+#: diff.c:4918
 #, c-format
 msgid "unable to resolve '%s'"
 msgstr "„%s“ не може да се открие"
 
-#: diff.c:4965 diff.c:4971
+#: diff.c:4968 diff.c:4974
 #, c-format
 msgid "%s expects <n>/<m> form"
 msgstr ""
 "опцията „%s“ изисква стойности за МИНИМАЛЕН_%%_ПРОМЯНА_ЗА_ИЗТОЧНИК_/"
 "МАКСИМАЛЕН_%%_ПРОМЯНА_ЗА_ЗАМЯНА от"
 
-#: diff.c:4983
+#: diff.c:4986
 #, c-format
 msgid "%s expects a character, got '%s'"
 msgstr "опцията „%s“ изисква знак, а не: „%s“"
 
-#: diff.c:5004
+#: diff.c:5007
 #, c-format
 msgid "bad --color-moved argument: %s"
 msgstr "неправилен аргумент за „--color-moved“: „%s“"
 
-#: diff.c:5023
+#: diff.c:5026
 #, c-format
 msgid "invalid mode '%s' in --color-moved-ws"
 msgstr "неправилен режим „%s“ за „ --color-moved-ws“"
 
-#: diff.c:5063
+#: diff.c:5066
 msgid ""
 "option diff-algorithm accepts \"myers\", \"minimal\", \"patience\" and "
 "\"histogram\""
@@ -3563,158 +3637,158 @@
 "Майерс), „minimal“ (минимизиране на разликите), „patience“ (пасианс) и "
 "„histogram“ (хистограмен)"
 
-#: diff.c:5099 diff.c:5119
+#: diff.c:5102 diff.c:5122
 #, c-format
 msgid "invalid argument to %s"
 msgstr "неправилен аргумент към „%s“"
 
-#: diff.c:5223
+#: diff.c:5226
 #, c-format
 msgid "invalid regex given to -I: '%s'"
 msgstr "неправилен регулярен израз подаден към „-I“: „%s“"
 
-#: diff.c:5272
+#: diff.c:5275
 #, c-format
 msgid "failed to parse --submodule option parameter: '%s'"
 msgstr "неразпознат параметър към опцията „--submodule“: „%s“"
 
-#: diff.c:5328
+#: diff.c:5331
 #, c-format
 msgid "bad --word-diff argument: %s"
 msgstr "неправилен аргумент към „--word-diff“: „%s“"
 
-#: diff.c:5351
+#: diff.c:5367
 msgid "Diff output format options"
 msgstr "Формат на изхода за разликите"
 
-#: diff.c:5353 diff.c:5359
+#: diff.c:5369 diff.c:5375
 msgid "generate patch"
 msgstr "създаване на кръпки"
 
-#: diff.c:5356 builtin/log.c:178
+#: diff.c:5372 builtin/log.c:179
 msgid "suppress diff output"
 msgstr "без извеждане на разликите"
 
-#: diff.c:5361 diff.c:5475 diff.c:5482
+#: diff.c:5377 diff.c:5491 diff.c:5498
 msgid "<n>"
 msgstr "БРОЙ"
 
-#: diff.c:5362 diff.c:5365
+#: diff.c:5378 diff.c:5381
 msgid "generate diffs with <n> lines context"
 msgstr "файловете с разлики да са с контекст с такъв БРОЙ редове"
 
-#: diff.c:5367
+#: diff.c:5383
 msgid "generate the diff in raw format"
 msgstr "файловете с разлики да са в суров формат"
 
-#: diff.c:5370
+#: diff.c:5386
 msgid "synonym for '-p --raw'"
 msgstr "псевдоним на „-p --stat“"
 
-#: diff.c:5374
+#: diff.c:5390
 msgid "synonym for '-p --stat'"
 msgstr "псевдоним на „-p --stat“"
 
-#: diff.c:5378
+#: diff.c:5394
 msgid "machine friendly --stat"
 msgstr "„--stat“ във формат за четене от програма"
 
-#: diff.c:5381
+#: diff.c:5397
 msgid "output only the last line of --stat"
 msgstr "извеждане само на последния ред на „--stat“"
 
-#: diff.c:5383 diff.c:5391
+#: diff.c:5399 diff.c:5407
 msgid "<param1,param2>..."
 msgstr "ПАРАМЕТЪР_1, ПАРАМЕТЪР_2, …"
 
-#: diff.c:5384
+#: diff.c:5400
 msgid ""
 "output the distribution of relative amount of changes for each sub-directory"
 msgstr "извеждане на разпределението на промените за всяка поддиректория"
 
-#: diff.c:5388
+#: diff.c:5404
 msgid "synonym for --dirstat=cumulative"
 msgstr "псевдоним на „--dirstat=cumulative“"
 
-#: diff.c:5392
+#: diff.c:5408
 msgid "synonym for --dirstat=files,param1,param2..."
 msgstr "псевдоним на „--dirstat=ФАЙЛОВЕ,ПАРАМЕТЪР_1,ПАРАМЕТЪР_2,…“"
 
-#: diff.c:5396
+#: diff.c:5412
 msgid "warn if changes introduce conflict markers or whitespace errors"
 msgstr ""
 "предупреждаване, ако промените водят до маркери за конфликт или грешки в "
 "празните знаци"
 
-#: diff.c:5399
+#: diff.c:5415
 msgid "condensed summary such as creations, renames and mode changes"
 msgstr ""
 "съкратено резюме на създадените, преименуваните и файловете с промяна на "
 "режима на достъп"
 
-#: diff.c:5402
+#: diff.c:5418
 msgid "show only names of changed files"
 msgstr "извеждане само на имената на променените файлове"
 
-#: diff.c:5405
+#: diff.c:5421
 msgid "show only names and status of changed files"
 msgstr "извеждане само на имената и статистиката за променените файлове"
 
-#: diff.c:5407
+#: diff.c:5423
 msgid "<width>[,<name-width>[,<count>]]"
 msgstr "ШИРОЧИНА[,ИМЕ-ШИРОЧИНА[,БРОЙ]]"
 
-#: diff.c:5408
+#: diff.c:5424
 msgid "generate diffstat"
 msgstr "извеждане на статистика за промените"
 
-#: diff.c:5410 diff.c:5413 diff.c:5416
+#: diff.c:5426 diff.c:5429 diff.c:5432
 msgid "<width>"
 msgstr "ШИРОЧИНА"
 
-#: diff.c:5411
+#: diff.c:5427
 msgid "generate diffstat with a given width"
 msgstr "статистика с такава ШИРОЧИНА за промените"
 
-#: diff.c:5414
+#: diff.c:5430
 msgid "generate diffstat with a given name width"
 msgstr "статистика за промените с такава ШИРОЧИНА на имената"
 
-#: diff.c:5417
+#: diff.c:5433
 msgid "generate diffstat with a given graph width"
 msgstr "статистика за промените с такава ШИРОЧИНА на гра̀фа"
 
-#: diff.c:5419
+#: diff.c:5435
 msgid "<count>"
 msgstr "БРОЙ"
 
-#: diff.c:5420
+#: diff.c:5436
 msgid "generate diffstat with limited lines"
 msgstr "ограничаване на БРОя на редовете в статистиката за промените"
 
-#: diff.c:5423
+#: diff.c:5439
 msgid "generate compact summary in diffstat"
 msgstr "кратко резюме в статистиката за промените"
 
-#: diff.c:5426
+#: diff.c:5442
 msgid "output a binary diff that can be applied"
 msgstr "извеждане на двоична разлика във вид за прилагане"
 
-#: diff.c:5429
+#: diff.c:5445
 msgid "show full pre- and post-image object names on the \"index\" lines"
 msgstr ""
 "показване на пълните имена на обекти в редовете за индекса при вариантите "
 "преди и след промяната"
 
-#: diff.c:5431
+#: diff.c:5447
 msgid "show colored diff"
 msgstr "разлики в цвят"
 
-#: diff.c:5432
+#: diff.c:5448
 msgid "<kind>"
 msgstr "ВИД"
 
-#: diff.c:5433
+#: diff.c:5449
 msgid ""
 "highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
 "diff"
@@ -3722,7 +3796,7 @@
 "грешките в празните знаци да се указват в редовете за контекста, вариантите "
 "преди и след разликата,"
 
-#: diff.c:5436
+#: diff.c:5452
 msgid ""
 "do not munge pathnames and use NULs as output field terminators in --raw or "
 "--numstat"
@@ -3730,261 +3804,261 @@
 "без преименуване на пътищата.  Да се използват нулеви байтове за разделители "
 "на полета в изхода при ползване на опцията „--raw“ или „--numstat“"
 
-#: diff.c:5439 diff.c:5442 diff.c:5445 diff.c:5554
+#: diff.c:5455 diff.c:5458 diff.c:5461 diff.c:5570
 msgid "<prefix>"
 msgstr "ПРЕФИКС"
 
-#: diff.c:5440
+#: diff.c:5456
 msgid "show the given source prefix instead of \"a/\""
 msgstr "префикс вместо „a/“ за източник"
 
-#: diff.c:5443
+#: diff.c:5459
 msgid "show the given destination prefix instead of \"b/\""
 msgstr "префикс вместо „b/“ за цел"
 
-#: diff.c:5446
+#: diff.c:5462
 msgid "prepend an additional prefix to every line of output"
 msgstr "добавяне на допълнителен префикс за всеки ред на изхода"
 
-#: diff.c:5449
+#: diff.c:5465
 msgid "do not show any source or destination prefix"
 msgstr "без префикс за източника и целта"
 
-#: diff.c:5452
+#: diff.c:5468
 msgid "show context between diff hunks up to the specified number of lines"
 msgstr ""
 "извеждане на контекст между последователните парчета с разлики от указания "
 "БРОЙ редове"
 
-#: diff.c:5456 diff.c:5461 diff.c:5466
+#: diff.c:5472 diff.c:5477 diff.c:5482
 msgid "<char>"
 msgstr "ЗНАК"
 
-#: diff.c:5457
+#: diff.c:5473
 msgid "specify the character to indicate a new line instead of '+'"
 msgstr "знак вместо „+“ за нов вариант на ред"
 
-#: diff.c:5462
+#: diff.c:5478
 msgid "specify the character to indicate an old line instead of '-'"
 msgstr "знак вместо „-“ за стар вариант на ред"
 
-#: diff.c:5467
+#: diff.c:5483
 msgid "specify the character to indicate a context instead of ' '"
 msgstr "знак вместо „ “ за контекст"
 
-#: diff.c:5470
+#: diff.c:5486
 msgid "Diff rename options"
 msgstr "Настройки за разлики с преименуване"
 
-#: diff.c:5471
+#: diff.c:5487
 msgid "<n>[/<m>]"
 msgstr "МИНИМАЛЕН_%_ПРОМЯНА_ЗА_ИЗТОЧНИК[/МАКСИМАЛEН_%_ПРОМЯНА_ЗА_ЗАМЯНА]"
 
-#: diff.c:5472
+#: diff.c:5488
 msgid "break complete rewrite changes into pairs of delete and create"
 msgstr ""
 "заместване на пълните промени с последователност от изтриване и създаване"
 
-#: diff.c:5476
+#: diff.c:5492
 msgid "detect renames"
 msgstr "засичане на преименуванията"
 
-#: diff.c:5480
+#: diff.c:5496
 msgid "omit the preimage for deletes"
 msgstr "без предварителен вариант при изтриване"
 
-#: diff.c:5483
+#: diff.c:5499
 msgid "detect copies"
 msgstr "засичане на копиранията"
 
-#: diff.c:5487
+#: diff.c:5503
 msgid "use unmodified files as source to find copies"
 msgstr "търсене на копирано и от непроменените файлове"
 
-#: diff.c:5489
+#: diff.c:5505
 msgid "disable rename detection"
 msgstr "без търсене на преименувания"
 
-#: diff.c:5492
+#: diff.c:5508
 msgid "use empty blobs as rename source"
 msgstr "празни обекти като източник при преименувания"
 
-#: diff.c:5494
+#: diff.c:5510
 msgid "continue listing the history of a file beyond renames"
 msgstr ""
 "продължаване на извеждането на историята — без отрязването при преименувания "
 "на файл"
 
-#: diff.c:5497
+#: diff.c:5513
 msgid ""
 "prevent rename/copy detection if the number of rename/copy targets exceeds "
 "given limit"
 msgstr ""
 "без засичане на преименувания/копирания, ако броят им надвишава тази стойност"
 
-#: diff.c:5499
+#: diff.c:5515
 msgid "Diff algorithm options"
 msgstr "Опции към алгоритъма за разлики"
 
-#: diff.c:5501
+#: diff.c:5517
 msgid "produce the smallest possible diff"
 msgstr "търсене на възможно най-малка разлика"
 
-#: diff.c:5504
+#: diff.c:5520
 msgid "ignore whitespace when comparing lines"
 msgstr "без промени в празните знаци при сравняване на редове"
 
-#: diff.c:5507
+#: diff.c:5523
 msgid "ignore changes in amount of whitespace"
 msgstr "без промени в празните знаци"
 
-#: diff.c:5510
+#: diff.c:5526
 msgid "ignore changes in whitespace at EOL"
 msgstr "без промени в празните знаци в края на редовете"
 
-#: diff.c:5513
+#: diff.c:5529
 msgid "ignore carrier-return at the end of line"
 msgstr "без промени в знаците за край на ред"
 
-#: diff.c:5516
+#: diff.c:5532
 msgid "ignore changes whose lines are all blank"
 msgstr "без промени в редовете, които са изцяло от празни знаци"
 
-#: diff.c:5518 diff.c:5540 diff.c:5543 diff.c:5588
+#: diff.c:5534 diff.c:5556 diff.c:5559 diff.c:5604
 msgid "<regex>"
 msgstr "РЕГУЛЯРЕН_ИЗРАЗ"
 
-#: diff.c:5519
+#: diff.c:5535
 msgid "ignore changes whose all lines match <regex>"
 msgstr "без промени в редовете, които напасват РЕГУЛЯРНия_ИЗРАЗ"
 
-#: diff.c:5522
+#: diff.c:5538
 msgid "heuristic to shift diff hunk boundaries for easy reading"
 msgstr ""
 "евристика за преместване на границите на парчетата за улесняване на четенето"
 
-#: diff.c:5525
+#: diff.c:5541
 msgid "generate diff using the \"patience diff\" algorithm"
 msgstr "разлика чрез алгоритъм за подредба като пасианс"
 
-#: diff.c:5529
+#: diff.c:5545
 msgid "generate diff using the \"histogram diff\" algorithm"
 msgstr "разлика по хистограмния алгоритъм"
 
-#: diff.c:5531
+#: diff.c:5547
 msgid "<algorithm>"
 msgstr "АЛГОРИТЪМ"
 
-#: diff.c:5532
+#: diff.c:5548
 msgid "choose a diff algorithm"
 msgstr "избор на АЛГОРИТЪМа за разлики"
 
-#: diff.c:5534
+#: diff.c:5550
 msgid "<text>"
 msgstr "ТЕКСТ"
 
-#: diff.c:5535
+#: diff.c:5551
 msgid "generate diff using the \"anchored diff\" algorithm"
 msgstr "разлика чрез алгоритъма със закотвяне"
 
-#: diff.c:5537 diff.c:5546 diff.c:5549
+#: diff.c:5553 diff.c:5562 diff.c:5565
 msgid "<mode>"
 msgstr "РЕЖИМ"
 
-#: diff.c:5538
+#: diff.c:5554
 msgid "show word diff, using <mode> to delimit changed words"
 msgstr ""
 "разлика по думи, като се ползва този РЕЖИМ за отделянето на променените думи"
 
-#: diff.c:5541
+#: diff.c:5557
 msgid "use <regex> to decide what a word is"
 msgstr "РЕГУЛЯРЕН_ИЗРАЗ за разделяне по думи"
 
-#: diff.c:5544
+#: diff.c:5560
 msgid "equivalent to --word-diff=color --word-diff-regex=<regex>"
 msgstr "псевдоним на „--word-diff=color --word-diff-regex=РЕГУЛЯРЕН_ИЗРАЗ“"
 
-#: diff.c:5547
+#: diff.c:5563
 msgid "moved lines of code are colored differently"
 msgstr "различен цвят за извеждане на преместените редове"
 
-#: diff.c:5550
+#: diff.c:5566
 msgid "how white spaces are ignored in --color-moved"
 msgstr ""
 "режим за прескачането на празните знаци при задаването на „--color-moved“"
 
-#: diff.c:5553
+#: diff.c:5569
 msgid "Other diff options"
 msgstr "Други опции за разлики"
 
-#: diff.c:5555
+#: diff.c:5571
 msgid "when run from subdir, exclude changes outside and show relative paths"
 msgstr ""
 "при изпълнение от поддиректория да се пренебрегват разликите извън нея и да "
 "се ползват относителни пътища"
 
-#: diff.c:5559
+#: diff.c:5575
 msgid "treat all files as text"
 msgstr "обработка на всички файлове като текстови"
 
-#: diff.c:5561
+#: diff.c:5577
 msgid "swap two inputs, reverse the diff"
 msgstr "размяна на двата входа — обръщане на разликата"
 
-#: diff.c:5563
+#: diff.c:5579
 msgid "exit with 1 if there were differences, 0 otherwise"
 msgstr ""
 "завършване с код за състояние 1 при наличието на разлики, а в противен "
 "случай — с 0"
 
-#: diff.c:5565
+#: diff.c:5581
 msgid "disable all output of the program"
 msgstr "без всякакъв изход от програмата"
 
-#: diff.c:5567
+#: diff.c:5583
 msgid "allow an external diff helper to be executed"
 msgstr "позволяване на изпълнение на външна помощна програма за разлики"
 
-#: diff.c:5569
+#: diff.c:5585
 msgid "run external text conversion filters when comparing binary files"
 msgstr ""
 "изпълнение на външни програми-филтри при сравнението на двоични файлове"
 
-#: diff.c:5571
+#: diff.c:5587
 msgid "<when>"
 msgstr "КОГА"
 
-#: diff.c:5572
+#: diff.c:5588
 msgid "ignore changes to submodules in the diff generation"
 msgstr "игнориране на промените в подмодулите при извеждането на разликите"
 
-#: diff.c:5575
+#: diff.c:5591
 msgid "<format>"
 msgstr "ФОРМАТ"
 
-#: diff.c:5576
+#: diff.c:5592
 msgid "specify how differences in submodules are shown"
 msgstr "начин за извеждане на промените в подмодулите"
 
-#: diff.c:5580
+#: diff.c:5596
 msgid "hide 'git add -N' entries from the index"
 msgstr "без включване в индекса на записите, добавени с „git add -N“"
 
-#: diff.c:5583
+#: diff.c:5599
 msgid "treat 'git add -N' entries as real in the index"
 msgstr "включване в индекса на записите, добавени с „git add -N“"
 
-#: diff.c:5585
+#: diff.c:5601
 msgid "<string>"
 msgstr "НИЗ"
 
-#: diff.c:5586
+#: diff.c:5602
 msgid ""
 "look for differences that change the number of occurrences of the specified "
 "string"
 msgstr "търсене на разлики, които променят броя на поява на указаните низове"
 
-#: diff.c:5589
+#: diff.c:5605
 msgid ""
 "look for differences that change the number of occurrences of the specified "
 "regex"
@@ -3992,57 +4066,69 @@
 "търсене на разлики, които променят броя на поява на низовете, които напасват "
 "на регулярния израз"
 
-#: diff.c:5592
+#: diff.c:5608
 msgid "show all changes in the changeset with -S or -G"
 msgstr "извеждане на всички промени с „-G“/„-S“"
 
-#: diff.c:5595
+#: diff.c:5611
 msgid "treat <string> in -S as extended POSIX regular expression"
 msgstr "НИЗът към „-S“ да се тълкува като разширен регулярен израз по POSIX"
 
-#: diff.c:5598
+#: diff.c:5614
 msgid "control the order in which files appear in the output"
 msgstr "управление на подредбата на файловете в изхода"
 
-#: diff.c:5599
+#: diff.c:5615 diff.c:5618
+msgid "<path>"
+msgstr "ПЪТ"
+
+#: diff.c:5616
+msgid "show the change in the specified path first"
+msgstr "първо извеждане на промяната в указания път"
+
+#: diff.c:5619
+msgid "skip the output to the specified path"
+msgstr "прескачане на изхода към указания път"
+
+#: diff.c:5621
 msgid "<object-id>"
 msgstr "ИДЕНТИФИКАТОР_НА_ОБЕКТ"
 
-#: diff.c:5600
+#: diff.c:5622
 msgid ""
 "look for differences that change the number of occurrences of the specified "
 "object"
 msgstr "търсене на разлики, които променят броя на поява на указания обект"
 
-#: diff.c:5602
+#: diff.c:5624
 msgid "[(A|C|D|M|R|T|U|X|B)...[*]]"
 msgstr "[(A|C|D|M|R|T|U|X|B)…[*]]"
 
-#: diff.c:5603
+#: diff.c:5625
 msgid "select files by diff type"
 msgstr "избор на файловете по вид разлика"
 
-#: diff.c:5605
+#: diff.c:5627
 msgid "<file>"
 msgstr "ФАЙЛ"
 
-#: diff.c:5606
+#: diff.c:5628
 msgid "Output to a specific file"
 msgstr "Изход към указания файл"
 
-#: diff.c:6263
+#: diff.c:6285
 msgid "inexact rename detection was skipped due to too many files."
 msgstr ""
 "търсенето на преименувания на обекти съчетани с промени се прескача поради "
 "многото файлове."
 
-#: diff.c:6266
+#: diff.c:6288
 msgid "only found copies from modified paths due to too many files."
 msgstr ""
 "установени са само точните копия на променените пътища поради многото "
 "файлове."
 
-#: diff.c:6269
+#: diff.c:6291
 #, c-format
 msgid ""
 "you may want to set your %s variable to at least %d and retry the command."
@@ -4053,10 +4139,15 @@
 msgid "failed to read orderfile '%s'"
 msgstr "файлът с подредбата на съответствията „%s“ не може да бъде прочетен"
 
-#: diffcore-rename.c:592
+#: diffcore-rename.c:786
 msgid "Performing inexact rename detection"
 msgstr "Търсене на преименувания на обекти съчетани с промени"
 
+#: diffcore-rotate.c:29
+#, c-format
+msgid "No such path '%s' in the diff"
+msgstr "Няма път на име „%s“ в разликата"
+
 #: dir.c:578
 #, c-format
 msgid "pathspec '%s' did not match any file(s) known to git"
@@ -4102,17 +4193,17 @@
 msgstr ""
 "кешът за неследените файлове е изключен на тази система или местоположение"
 
-#: dir.c:3520
+#: dir.c:3534
 #, c-format
 msgid "index file corrupt in repo %s"
 msgstr "файлът с индекса е повреден в хранилището „%s“"
 
-#: dir.c:3565 dir.c:3570
+#: dir.c:3579 dir.c:3584
 #, c-format
 msgid "could not create directories for %s"
 msgstr "директориите за „%s“ не може да бъдат създадени"
 
-#: dir.c:3599
+#: dir.c:3613
 #, c-format
 msgid "could not migrate git directory from '%s' to '%s'"
 msgstr "директорията на git не може да се мигрира от „%s“ до „%s“"
@@ -4131,12 +4222,12 @@
 msgid "could not stat file '%s'"
 msgstr "неуспешно изпълнение на „stat“ върху файла „%s“"
 
-#: environment.c:150
+#: environment.c:152
 #, c-format
 msgid "bad git namespace path \"%s\""
 msgstr "неправилен път към пространства от имена „%s“"
 
-#: environment.c:337
+#: environment.c:335
 #, c-format
 msgid "could not set GIT_DIR to '%s'"
 msgstr "GIT_DIR не може да се зададе да е „%s“"
@@ -4172,32 +4263,32 @@
 msgid "--stateless-rpc requires multi_ack_detailed"
 msgstr "опцията „--stateless-rpc“ изисква  „multi_ack_detailed“"
 
-#: fetch-pack.c:378 fetch-pack.c:1406
+#: fetch-pack.c:378 fetch-pack.c:1457
 #, c-format
 msgid "invalid shallow line: %s"
 msgstr "неправилен плитък ред: „%s“"
 
-#: fetch-pack.c:384 fetch-pack.c:1412
+#: fetch-pack.c:384 fetch-pack.c:1463
 #, c-format
 msgid "invalid unshallow line: %s"
 msgstr "неправилен неплитък ред: „%s“"
 
-#: fetch-pack.c:386 fetch-pack.c:1414
+#: fetch-pack.c:386 fetch-pack.c:1465
 #, c-format
 msgid "object not found: %s"
 msgstr "обектът „%s“ липсва"
 
-#: fetch-pack.c:389 fetch-pack.c:1417
+#: fetch-pack.c:389 fetch-pack.c:1468
 #, c-format
 msgid "error in object: %s"
 msgstr "грешка в обекта: „%s“"
 
-#: fetch-pack.c:391 fetch-pack.c:1419
+#: fetch-pack.c:391 fetch-pack.c:1470
 #, c-format
 msgid "no shallow found: %s"
 msgstr "не е открит плитък обект: %s"
 
-#: fetch-pack.c:394 fetch-pack.c:1423
+#: fetch-pack.c:394 fetch-pack.c:1474
 #, c-format
 msgid "expected shallow/unshallow, got %s"
 msgstr "очаква се плитък или не обект, а бе получено: „%s“"
@@ -4235,174 +4326,178 @@
 msgid "already have %s (%s)"
 msgstr "вече има „%s“ (%s)"
 
-#: fetch-pack.c:827
+#: fetch-pack.c:844
 msgid "fetch-pack: unable to fork off sideband demultiplexer"
 msgstr "fetch-pack: не може да се създаде процес за демултиплексора"
 
-#: fetch-pack.c:835
+#: fetch-pack.c:852
 msgid "protocol error: bad pack header"
 msgstr "протоколна грешка: неправилна заглавна част на пакет"
 
-#: fetch-pack.c:919
+#: fetch-pack.c:946
 #, c-format
 msgid "fetch-pack: unable to fork off %s"
 msgstr "fetch-pack: не може да се създаде процес за „%s“"
 
-#: fetch-pack.c:937
+#: fetch-pack.c:952
+msgid "fetch-pack: invalid index-pack output"
+msgstr "fetch-pack: неправилен изход от командата „index-pack“"
+
+#: fetch-pack.c:969
 #, c-format
 msgid "%s failed"
 msgstr "неуспешно изпълнение на „%s“"
 
-#: fetch-pack.c:939
+#: fetch-pack.c:971
 msgid "error in sideband demultiplexer"
 msgstr "грешка в демултиплексора"
 
-#: fetch-pack.c:982
+#: fetch-pack.c:1031
 #, c-format
 msgid "Server version is %.*s"
 msgstr "Версията на сървъра е: %.*s"
 
-#: fetch-pack.c:990 fetch-pack.c:996 fetch-pack.c:999 fetch-pack.c:1005
-#: fetch-pack.c:1009 fetch-pack.c:1013 fetch-pack.c:1017 fetch-pack.c:1021
-#: fetch-pack.c:1025 fetch-pack.c:1029 fetch-pack.c:1033 fetch-pack.c:1037
-#: fetch-pack.c:1043 fetch-pack.c:1049 fetch-pack.c:1054 fetch-pack.c:1059
+#: fetch-pack.c:1039 fetch-pack.c:1045 fetch-pack.c:1048 fetch-pack.c:1054
+#: fetch-pack.c:1058 fetch-pack.c:1062 fetch-pack.c:1066 fetch-pack.c:1070
+#: fetch-pack.c:1074 fetch-pack.c:1078 fetch-pack.c:1082 fetch-pack.c:1086
+#: fetch-pack.c:1092 fetch-pack.c:1098 fetch-pack.c:1103 fetch-pack.c:1108
 #, c-format
 msgid "Server supports %s"
 msgstr "Сървърът поддържа „%s“"
 
-#: fetch-pack.c:992
+#: fetch-pack.c:1041
 msgid "Server does not support shallow clients"
 msgstr "Сървърът не поддържа плитки клиенти"
 
-#: fetch-pack.c:1052
+#: fetch-pack.c:1101
 msgid "Server does not support --shallow-since"
 msgstr "Сървърът не поддържа опцията „--shallow-since“"
 
-#: fetch-pack.c:1057
+#: fetch-pack.c:1106
 msgid "Server does not support --shallow-exclude"
 msgstr "Сървърът не поддържа опцията „--shallow-exclude“"
 
-#: fetch-pack.c:1061
+#: fetch-pack.c:1110
 msgid "Server does not support --deepen"
 msgstr "Сървърът не поддържа опцията „--deepen“"
 
-#: fetch-pack.c:1063
+#: fetch-pack.c:1112
 msgid "Server does not support this repository's object format"
 msgstr "Сървърът не поддържа форма̀та на обектите на това хранилище"
 
-#: fetch-pack.c:1076
+#: fetch-pack.c:1125
 msgid "no common commits"
 msgstr "няма общи подавания"
 
-#: fetch-pack.c:1088 fetch-pack.c:1628
+#: fetch-pack.c:1138 fetch-pack.c:1682
 msgid "git fetch-pack: fetch failed."
 msgstr "git fetch-pack: неуспешно доставяне."
 
-#: fetch-pack.c:1214
+#: fetch-pack.c:1265
 #, c-format
 msgid "mismatched algorithms: client %s; server %s"
 msgstr "различни алгоритми — на клиента: „%s“, на сървъра: „%s“"
 
-#: fetch-pack.c:1218
+#: fetch-pack.c:1269
 #, c-format
 msgid "the server does not support algorithm '%s'"
 msgstr "сървърът не поддържа алгоритъм „%s“"
 
-#: fetch-pack.c:1238
+#: fetch-pack.c:1289
 msgid "Server does not support shallow requests"
 msgstr "Сървърът не поддържа плитки заявки"
 
-#: fetch-pack.c:1245
+#: fetch-pack.c:1296
 msgid "Server supports filter"
 msgstr "Сървърът поддържа филтри"
 
-#: fetch-pack.c:1284
+#: fetch-pack.c:1335
 msgid "unable to write request to remote"
 msgstr "невъзможно писане към отдалечено хранилище"
 
-#: fetch-pack.c:1302
+#: fetch-pack.c:1353
 #, c-format
 msgid "error reading section header '%s'"
 msgstr "грешка при прочитане на заглавната част на раздел „%s“"
 
-#: fetch-pack.c:1308
+#: fetch-pack.c:1359
 #, c-format
 msgid "expected '%s', received '%s'"
 msgstr "очаква се „%s“, а бе получено „%s“"
 
-#: fetch-pack.c:1369
+#: fetch-pack.c:1420
 #, c-format
 msgid "unexpected acknowledgment line: '%s'"
 msgstr "неочакван ред за потвърждение: „%s“"
 
-#: fetch-pack.c:1374
+#: fetch-pack.c:1425
 #, c-format
 msgid "error processing acks: %d"
 msgstr "грешка при обработка на потвържденията: %d"
 
-#: fetch-pack.c:1384
+#: fetch-pack.c:1435
 msgid "expected packfile to be sent after 'ready'"
 msgstr ""
 "очакваше се пакетният файл да бъде изпратен след отговор за готовност (ready)"
 
-#: fetch-pack.c:1386
+#: fetch-pack.c:1437
 msgid "expected no other sections to be sent after no 'ready'"
 msgstr ""
 "очакваше се след липса на отговор за готовност (ready) да не се се пращат "
 "други раздели"
 
-#: fetch-pack.c:1428
+#: fetch-pack.c:1479
 #, c-format
 msgid "error processing shallow info: %d"
 msgstr "грешка при обработка на информация за дълбочината/плиткостта: %d"
 
-#: fetch-pack.c:1475
+#: fetch-pack.c:1526
 #, c-format
 msgid "expected wanted-ref, got '%s'"
 msgstr "очаква се искан указател, а бе получено: „%s“"
 
-#: fetch-pack.c:1480
+#: fetch-pack.c:1531
 #, c-format
 msgid "unexpected wanted-ref: '%s'"
 msgstr "неочакван искан указател: „%s“"
 
-#: fetch-pack.c:1485
+#: fetch-pack.c:1536
 #, c-format
 msgid "error processing wanted refs: %d"
 msgstr "грешка при обработката на исканите указатели: %d"
 
-#: fetch-pack.c:1515
+#: fetch-pack.c:1566
 msgid "git fetch-pack: expected response end packet"
 msgstr "git fetch-pack: очаква се пакет за край на отговора"
 
-#: fetch-pack.c:1897
+#: fetch-pack.c:1960
 msgid "no matching remote head"
 msgstr "не може да бъде открит подходящ връх от отдалеченото хранилище"
 
-#: fetch-pack.c:1920 builtin/clone.c:693
+#: fetch-pack.c:1983 builtin/clone.c:693
 msgid "remote did not send all necessary objects"
 msgstr "отдалеченото хранилище не изпрати всички необходими обекти."
 
-#: fetch-pack.c:1947
+#: fetch-pack.c:2010
 #, c-format
 msgid "no such remote ref %s"
 msgstr "такъв отдалечен указател няма: %s"
 
-#: fetch-pack.c:1950
+#: fetch-pack.c:2013
 #, c-format
 msgid "Server does not allow request for unadvertised object %s"
 msgstr "Сървърът не позволява заявка за необявен обект „%s“"
 
-#: gpg-interface.c:272
+#: gpg-interface.c:273
 msgid "could not create temporary file"
 msgstr "не може да се създаде временен файл"
 
-#: gpg-interface.c:275
+#: gpg-interface.c:276
 #, c-format
 msgid "failed writing detached signature to '%s'"
 msgstr "Програмата не успя да запише самостоятелния подпис в „%s“"
 
-#: gpg-interface.c:457
+#: gpg-interface.c:470
 msgid "gpg failed to sign the data"
 msgstr "Програмата „gpg“ не подписа данните."
 
@@ -4411,7 +4506,7 @@
 msgid "ignore invalid color '%.*s' in log.graphColors"
 msgstr "прескачане на неправилния цвят „%.*s“ в „log.graphColors“"
 
-#: grep.c:640
+#: grep.c:543
 msgid ""
 "given pattern contains NULL byte (via -f <file>). This is only supported "
 "with -P under PCRE v2"
@@ -4419,18 +4514,18 @@
 "зададеният шаблон съдържа нулев знак (идва от -f „ФАЙЛ“).  Това се поддържа "
 "в комбинация с „-P“ само при ползването на „PCRE v2“"
 
-#: grep.c:2100
+#: grep.c:1906
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "„%s“: файлът сочен от „%s“ не може да бъде прочетен"
 
-#: grep.c:2117 setup.c:176 builtin/clone.c:412 builtin/diff.c:89
+#: grep.c:1923 setup.c:176 builtin/clone.c:412 builtin/diff.c:90
 #: builtin/rm.c:135
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
 
-#: grep.c:2128
+#: grep.c:1934
 #, c-format
 msgid "'%s': short read"
 msgstr "„%s“: изчитането върна по-малко байтове от очакваното"
@@ -4500,7 +4595,7 @@
 msgid "These are common Git commands used in various situations:"
 msgstr "Това са най-често използваните команди на Git:"
 
-#: help.c:365 git.c:99
+#: help.c:365 git.c:100
 #, c-format
 msgid "unsupported command listing type '%s'"
 msgstr "неподдържан списък от команди „%s“"
@@ -4748,11 +4843,252 @@
 msgid "Unable to create '%s.lock': %s"
 msgstr "Файлът-ключалка „%s.lock“ не може да бъде създаден: %s"
 
-#: ls-refs.c:109
+#: ls-refs.c:37
+#, c-format
+msgid "invalid value '%s' for lsrefs.unborn"
+msgstr "неправилна стойност „%s“ за „lsrefs.unborn“"
+
+#: ls-refs.c:167
 msgid "expected flush after ls-refs arguments"
 msgstr "след аргументите към „ls-refs“ се очаква изчистване на буферите"
 
-#: merge-ort-wrappers.c:13 merge-recursive.c:3672
+#: merge-ort.c:888 merge-recursive.c:1191
+#, c-format
+msgid "Failed to merge submodule %s (not checked out)"
+msgstr "Неуспешно сливане на подмодула „%s“ (не е изтеглен)"
+
+#: merge-ort.c:897 merge-recursive.c:1198
+#, c-format
+msgid "Failed to merge submodule %s (commits not present)"
+msgstr "Неуспешно сливане на подмодула „%s“ (няма подавания)"
+
+#: merge-ort.c:906 merge-recursive.c:1205
+#, c-format
+msgid "Failed to merge submodule %s (commits don't follow merge-base)"
+msgstr ""
+"Подмодулът „%s“ не може да бъде слят (базата за сливане не предшества "
+"подаванията)"
+
+#: merge-ort.c:916 merge-ort.c:923
+#, c-format
+msgid "Note: Fast-forwarding submodule %s to %s"
+msgstr "Бележка: Превъртане на подмодула „%s“ към „%s“"
+
+#: merge-ort.c:944
+#, c-format
+msgid "Failed to merge submodule %s"
+msgstr "Неуспешно сливане на подмодула „%s“"
+
+#: merge-ort.c:951
+#, c-format
+msgid ""
+"Failed to merge submodule %s, but a possible merge resolution exists:\n"
+"%s\n"
+msgstr ""
+"Неуспешно сливане на подмодула „%s“, но е открито възможно решение:\n"
+"%s\n"
+
+#: merge-ort.c:955 merge-recursive.c:1259
+#, c-format
+msgid ""
+"If this is correct simply add it to the index for example\n"
+"by using:\n"
+"\n"
+"  git update-index --cacheinfo 160000 %s \"%s\"\n"
+"\n"
+"which will accept this suggestion.\n"
+msgstr ""
+"Ако това е така, добавете го към индекса с команда като следната:\n"
+"\n"
+"    git update-index --cacheinfo 160000 %s \"%s\"\n"
+"\n"
+"Това приема предложеното.\n"
+
+#: merge-ort.c:968
+#, c-format
+msgid ""
+"Failed to merge submodule %s, but multiple possible merges exist:\n"
+"%s"
+msgstr ""
+"Неуспешно сливане на подмодула „%s“, но са открити множество решения:\n"
+"%s"
+
+#: merge-ort.c:1127 merge-recursive.c:1341
+msgid "Failed to execute internal merge"
+msgstr "Неуспешно вътрешно сливане"
+
+#: merge-ort.c:1132 merge-recursive.c:1346
+#, c-format
+msgid "Unable to add %s to database"
+msgstr "„%s“ не може да се добави в базата с данни"
+
+#: merge-ort.c:1139 merge-recursive.c:1378
+#, c-format
+msgid "Auto-merging %s"
+msgstr "Автоматично сливане на „%s“"
+
+#: merge-ort.c:1278 merge-recursive.c:2100
+#, c-format
+msgid ""
+"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
+"implicit directory rename(s) putting the following path(s) there: %s."
+msgstr ""
+"КОНФЛИКТ (косвено преименуване на директория): следният файл или директория "
+"„%s“ не позволяват косвеното преименуване на следния път/ища: %s."
+
+#: merge-ort.c:1288 merge-recursive.c:2110
+#, c-format
+msgid ""
+"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
+"implicit directory renames tried to put these paths there: %s"
+msgstr ""
+"КОНФЛИКТ (косвено преименуване на директория): повече от един път "
+"съответства на „%s“.  Косвено преименуване на директория води до поставянето "
+"на тези пътища там: %s."
+
+#: merge-ort.c:1471
+#, c-format
+msgid ""
+"CONFLICT (directory rename split): Unclear where to rename %s to; it was "
+"renamed to multiple other directories, with no destination getting a "
+"majority of the files."
+msgstr ""
+"КОНФЛИКТ (раздвояване при преименуване на директория): Не е ясно как и къде "
+"да се преименува „%s“, защото е преместен в няколко нови директории, без "
+"никоя от тях да е по-честа цел."
+
+#: merge-ort.c:1637 merge-recursive.c:2447
+#, c-format
+msgid ""
+"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
+"renamed."
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: прескачане на преименуването на „%s“ на „%s“ в „%s“, защото "
+"„%s“ също е с променено име."
+
+#: merge-ort.c:1781 merge-recursive.c:3215
+#, c-format
+msgid ""
+"Path updated: %s added in %s inside a directory that was renamed in %s; "
+"moving it to %s."
+msgstr ""
+"Обновен път: „%s“ е добавен в „%s“ в директория, която е преименувана в "
+"„%s“.  Обектът се мести в „%s“."
+
+#: merge-ort.c:1788 merge-recursive.c:3222
+#, c-format
+msgid ""
+"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
+"%s; moving it to %s."
+msgstr ""
+"Обновен път: „%s“ е преименуван на „%s“ в „%s“ в директория, която е "
+"преименувана в „%s“.  Обектът се мести в „%s“."
+
+#: merge-ort.c:1801 merge-recursive.c:3218
+#, c-format
+msgid ""
+"CONFLICT (file location): %s added in %s inside a directory that was renamed "
+"in %s, suggesting it should perhaps be moved to %s."
+msgstr ""
+"КОНФЛИКТ (места на файлове): „%s“ е добавен в „%s“ в директория, която е "
+"преименувана в „%s“.  Предложението е да преместите обекта в „%s“."
+
+#: merge-ort.c:1809 merge-recursive.c:3225
+#, c-format
+msgid ""
+"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
+"was renamed in %s, suggesting it should perhaps be moved to %s."
+msgstr ""
+"КОНФЛИКТ (места на файлове): „%s“ е преименуван на „%s“ в „%s“ в директория, "
+"която е преименувана в „%s“.  Предложението е да преместите обекта в „%s“."
+
+#: merge-ort.c:1952
+#, c-format
+msgid "CONFLICT (rename/rename): %s renamed to %s in %s and to %s in %s."
+msgstr ""
+"КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон „%s“ "
+"и на „%s“ в „%s“."
+
+#: merge-ort.c:2047
+#, c-format
+msgid ""
+"CONFLICT (rename involved in collision): rename of %s -> %s has content "
+"conflicts AND collides with another path; this may result in nested conflict "
+"markers."
+msgstr ""
+"КОНФЛИКТ (има и преименуване в промените): „%s“ е преименуван на „%s“, но "
+"има и промени в съдържанието, а и има съвпадение на пътя.  Може да се "
+"получат вложени маркери за конфликт."
+
+#: merge-ort.c:2066 merge-ort.c:2090
+#, c-format
+msgid "CONFLICT (rename/delete): %s renamed to %s in %s, but deleted in %s."
+msgstr ""
+"КОНФЛИКТ (преименуване/добавяне): „%s“ е преименуван на „%s“ в клон „%s“, а "
+"е изтрит в „%s“."
+
+#: merge-ort.c:2735
+#, c-format
+msgid ""
+"CONFLICT (file/directory): directory in the way of %s from %s; moving it to "
+"%s instead."
+msgstr ""
+"КОНФЛИКТ (файл/директория): директория на мястото на „%s“ от „%s“, вместо "
+"това се извършва преместване в „%s“."
+
+#: merge-ort.c:2808
+#, c-format
+msgid ""
+"CONFLICT (distinct types): %s had different types on each side; renamed %s "
+"of them so each can be recorded somewhere."
+msgstr ""
+"КОНФЛИКТ (различни обекти): „%s“ е различен вид обект в двата варианта, "
+"затова се извършва преименуване на %s, за да може и двата варианта да са "
+"отразени."
+
+#: merge-ort.c:2812
+msgid "both"
+msgstr "двата"
+
+#: merge-ort.c:2812
+msgid "one"
+msgstr "единия"
+
+#: merge-ort.c:2907 merge-recursive.c:3052
+msgid "content"
+msgstr "съдържание"
+
+#: merge-ort.c:2909 merge-recursive.c:3056
+msgid "add/add"
+msgstr "добавяне/добавяне"
+
+#: merge-ort.c:2911 merge-recursive.c:3101
+msgid "submodule"
+msgstr "ПОДМОДУЛ"
+
+#: merge-ort.c:2913 merge-recursive.c:3102
+#, c-format
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "КОНФЛИКТ (%s): Конфликт при сливане на „%s“"
+
+#: merge-ort.c:2938
+#, c-format
+msgid ""
+"CONFLICT (modify/delete): %s deleted in %s and modified in %s.  Version %s "
+"of %s left in tree."
+msgstr ""
+"КОНФЛИКТ (промяна/изтриване): „%s“ е изтрит в %s, а е променен в %s.  Версия "
+"%s на „%s“ е оставена в дървото."
+
+#. TRANSLATORS: The %s arguments are: 1) tree hash of a merge
+#. base, and 2-3) the trees for the two trees we're merging.
+#.
+#: merge-ort.c:3406
+#, c-format
+msgid "collecting merge info failed for trees %s, %s, %s"
+msgstr "неуспешно събиране на информацията за сливането на „%s“, „%s“ и „%s“"
+
+#: merge-ort-wrappers.c:13 merge-recursive.c:3661
 #, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by merge:\n"
@@ -4830,23 +5166,6 @@
 msgstr ""
 "не е ясно какво да се прави с обекта „%2$s“ (%3$s) с права за достъп „%1$06o“"
 
-#: merge-recursive.c:1191
-#, c-format
-msgid "Failed to merge submodule %s (not checked out)"
-msgstr "Неуспешно сливане на подмодула „%s“ (не е изтеглен)"
-
-#: merge-recursive.c:1198
-#, c-format
-msgid "Failed to merge submodule %s (commits not present)"
-msgstr "Неуспешно сливане на подмодула „%s“ (няма подавания)"
-
-#: merge-recursive.c:1205
-#, c-format
-msgid "Failed to merge submodule %s (commits don't follow merge-base)"
-msgstr ""
-"Подмодулът „%s“ не може да бъде слят (базата за сливане не предшества "
-"подаванията)"
-
 #: merge-recursive.c:1213 merge-recursive.c:1225
 #, c-format
 msgid "Fast-forwarding submodule %s to the following commit:"
@@ -4875,41 +5194,11 @@
 "Открито е сливане, което може да решава проблема със сливането на "
 "подмодула:\n"
 
-#: merge-recursive.c:1259
-#, c-format
-msgid ""
-"If this is correct simply add it to the index for example\n"
-"by using:\n"
-"\n"
-"  git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"which will accept this suggestion.\n"
-msgstr ""
-"Ако това е така, добавете го към индекса с команда като следната:\n"
-"\n"
-"    git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"Това приема предложеното.\n"
-
 #: merge-recursive.c:1268
 #, c-format
 msgid "Failed to merge submodule %s (multiple merges found)"
 msgstr "Неуспешно сливане на подмодула „%s“ (открити са множество сливания)"
 
-#: merge-recursive.c:1341
-msgid "Failed to execute internal merge"
-msgstr "Неуспешно вътрешно сливане"
-
-#: merge-recursive.c:1346
-#, c-format
-msgid "Unable to add %s to database"
-msgstr "„%s“ не може да се добави в базата с данни"
-
-#: merge-recursive.c:1378
-#, c-format
-msgid "Auto-merging %s"
-msgstr "Автоматично сливане на „%s“"
-
 #: merge-recursive.c:1402
 #, c-format
 msgid "Error: Refusing to lose untracked file at %s; writing to %s instead."
@@ -5020,25 +5309,6 @@
 "постави „%s“, защото няколко нови директории поделят съдържанието на "
 "директория „%s“, като никоя не съдържа мнозинство от файловете ѝ."
 
-#: merge-recursive.c:2100
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
-"implicit directory rename(s) putting the following path(s) there: %s."
-msgstr ""
-"КОНФЛИКТ (косвено преименуване на директория): следният файл или директория "
-"„%s“ не позволяват косвеното преименуване на следния път/ища: %s."
-
-#: merge-recursive.c:2110
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
-"implicit directory renames tried to put these paths there: %s"
-msgstr ""
-"КОНФЛИКТ (косвено преименуване на директория): повече от един път "
-"съответства на „%s“.  Косвено преименуване на директория води до поставянето "
-"на тези пътища там: %s."
-
 #: merge-recursive.c:2202
 #, c-format
 msgid ""
@@ -5048,15 +5318,6 @@
 "КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
 "„%s“, а „%s“ е преименуван на „%s“ в „%s“"
 
-#: merge-recursive.c:2447
-#, c-format
-msgid ""
-"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
-"renamed."
-msgstr ""
-"ПРЕДУПРЕЖДЕНИЕ: прескачане на преименуването на „%s“ на „%s“ в „%s“, защото "
-"„%s“ също е с променено име."
-
 #: merge-recursive.c:2973
 #, c-format
 msgid "cannot read object %s"
@@ -5075,69 +5336,16 @@
 msgid "modified"
 msgstr "променен"
 
-#: merge-recursive.c:3052
-msgid "content"
-msgstr "съдържание"
-
-#: merge-recursive.c:3056
-msgid "add/add"
-msgstr "добавяне/добавяне"
-
 #: merge-recursive.c:3079
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Прескачане на „%s“ (слетият резултат е идентичен със сегашния)"
 
-#: merge-recursive.c:3101
-msgid "submodule"
-msgstr "ПОДМОДУЛ"
-
-#: merge-recursive.c:3102
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "КОНФЛИКТ (%s): Конфликт при сливане на „%s“"
-
 #: merge-recursive.c:3132
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Добавяне като „%s“"
 
-#: merge-recursive.c:3215
-#, c-format
-msgid ""
-"Path updated: %s added in %s inside a directory that was renamed in %s; "
-"moving it to %s."
-msgstr ""
-"Обновен път: „%s“ е добавен в „%s“ в директория, която е преименувана в "
-"„%s“.  Обектът се мести в „%s“."
-
-#: merge-recursive.c:3218
-#, c-format
-msgid ""
-"CONFLICT (file location): %s added in %s inside a directory that was renamed "
-"in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-"КОНФЛИКТ (места на файлове): „%s“ е добавен в „%s“ в директория, която е "
-"преименувана в „%s“.  Предложението е да преместите обекта в „%s“."
-
-#: merge-recursive.c:3222
-#, c-format
-msgid ""
-"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
-"%s; moving it to %s."
-msgstr ""
-"Обновен път: „%s“ е преименуван на „%s“ в „%s“ в директория, която е "
-"преименувана в „%s“.  Обектът се мести в „%s“."
-
-#: merge-recursive.c:3225
-#, c-format
-msgid ""
-"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
-"was renamed in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-"КОНФЛИКТ (места на файлове): „%s“ е преименуван на „%s“ в „%s“ в директория, "
-"която е преименувана в „%s“.  Предложението е да преместите обекта в „%s“."
-
 #: merge-recursive.c:3339
 #, c-format
 msgid "Removing %s"
@@ -5173,27 +5381,28 @@
 msgid "merging of trees %s and %s failed"
 msgstr "неуспешно сливане на дърветата „%s“ и „%s“"
 
-#: merge-recursive.c:3550
+#: merge-recursive.c:3539
 msgid "Merging:"
 msgstr "Сливане:"
 
-#: merge-recursive.c:3563
+#: merge-recursive.c:3552
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "открит е %u общ предшественик:"
 msgstr[1] "открити са %u общи предшественици:"
 
-#: merge-recursive.c:3613
+#: merge-recursive.c:3602
 msgid "merge returned no commit"
 msgstr "сливането не върна подаване"
 
-#: merge-recursive.c:3769
+#: merge-recursive.c:3758
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Неуспешен анализ на обекта „%s“"
 
-#: merge-recursive.c:3787 builtin/merge.c:711 builtin/merge.c:895
+#: merge-recursive.c:3776 builtin/merge.c:712 builtin/merge.c:896
+#: builtin/stash.c:471
 msgid "Unable to write index."
 msgstr "Индексът не може да бъде прочетен"
 
@@ -5201,125 +5410,115 @@
 msgid "failed to read the cache"
 msgstr "кешът не може да бъде прочетен"
 
-#: merge.c:109 rerere.c:720 builtin/am.c:1883 builtin/am.c:1917
-#: builtin/checkout.c:573 builtin/checkout.c:829 builtin/clone.c:817
+#: merge.c:109 rerere.c:704 builtin/am.c:1883 builtin/am.c:1917
+#: builtin/checkout.c:575 builtin/checkout.c:828 builtin/clone.c:817
 #: builtin/stash.c:265
 msgid "unable to write new index file"
 msgstr "неуспешно записване на новия индекс"
 
-#: midx.c:80
+#: midx.c:62
+msgid "multi-pack-index OID fanout is of the wrong size"
+msgstr "неправилен размер на откъс (OID fanout) на индекса за множество пакети"
+
+#: midx.c:93
 #, c-format
 msgid "multi-pack-index file %s is too small"
 msgstr "файлът с индекса за множество пакети „%s“ е твърде малък"
 
-#: midx.c:96
+#: midx.c:109
 #, c-format
 msgid "multi-pack-index signature 0x%08x does not match signature 0x%08x"
 msgstr "отпечатъкът на индекса за множество пакети 0x%08x не съвпада с 0x%08x"
 
-#: midx.c:101
+#: midx.c:114
 #, c-format
 msgid "multi-pack-index version %d not recognized"
 msgstr "непозната версия на индекс за множество пакети — %d"
 
-#: midx.c:106
+#: midx.c:119
 #, c-format
 msgid "multi-pack-index hash version %u does not match version %u"
 msgstr ""
 "версията на контролната сума на индекса за множество пакети %u не съвпада с "
 "%u"
 
-#: midx.c:123
-msgid "invalid chunk offset (too large)"
-msgstr "неправилно (прекалено голямо) отместване на откъс"
-
-#: midx.c:147
-msgid "terminating multi-pack-index chunk id appears earlier than expected"
-msgstr ""
-"идентификаторът за краен откъс на индекс за множество пакети се явява по-"
-"рано от очакваното"
-
-#: midx.c:160
+#: midx.c:136
 msgid "multi-pack-index missing required pack-name chunk"
 msgstr "липсва откъс (pack-name) от индекс за множество пакети"
 
-#: midx.c:162
+#: midx.c:138
 msgid "multi-pack-index missing required OID fanout chunk"
 msgstr "липсва откъс (OID fanout) от индекс за множество пакети"
 
-#: midx.c:164
+#: midx.c:140
 msgid "multi-pack-index missing required OID lookup chunk"
 msgstr "липсва откъс (OID lookup) от индекс за множество пакети"
 
-#: midx.c:166
+#: midx.c:142
 msgid "multi-pack-index missing required object offsets chunk"
 msgstr "липсва откъс за отместванията на обекти от индекс за множество пакети"
 
-#: midx.c:180
+#: midx.c:158
 #, c-format
 msgid "multi-pack-index pack names out of order: '%s' before '%s'"
 msgstr ""
 "неправилна подредба на имената в индекс за множество пакети: „%s“ се появи "
 "преди „%s“"
 
-#: midx.c:223
+#: midx.c:202
 #, c-format
 msgid "bad pack-int-id: %u (%u total packs)"
 msgstr ""
 "неправилен идентификатор на пакет (pack-int-id): %u (от общо %u пакети)"
 
-#: midx.c:273
+#: midx.c:252
 msgid "multi-pack-index stores a 64-bit offset, but off_t is too small"
 msgstr ""
 "индексът за множество пакети съдържа 64-битови отмествания, но размерът на "
 "„off_t“ е недостатъчен"
 
-#: midx.c:480
+#: midx.c:467
 #, c-format
 msgid "failed to add packfile '%s'"
 msgstr "пакетният файл „%s“ не може да бъде добавен"
 
-#: midx.c:486
+#: midx.c:473
 #, c-format
 msgid "failed to open pack-index '%s'"
 msgstr "индексът за пакети „%s“ не може да бъде отворен"
 
-#: midx.c:546
+#: midx.c:533
 #, c-format
 msgid "failed to locate object %d in packfile"
 msgstr "обект %d в пакетния файл липсва"
 
-#: midx.c:846
+#: midx.c:821
 msgid "Adding packfiles to multi-pack-index"
 msgstr "Добавяне на пакетни файлове към индекс за множество пакети"
 
-#: midx.c:879
+#: midx.c:855
 #, c-format
 msgid "did not see pack-file %s to drop"
 msgstr "пакетният файл за триене „%s“ не може да се открие"
 
-#: midx.c:931
+#: midx.c:904
 msgid "no pack files to index."
 msgstr "няма пакетни файлове за индексиране"
 
-#: midx.c:982
-msgid "Writing chunks to multi-pack-index"
-msgstr "Запис на откъси към индекс за множество пакети"
-
-#: midx.c:1060
+#: midx.c:965
 #, c-format
 msgid "failed to clear multi-pack-index at %s"
 msgstr "индексът за множество пакети не може да бъде изчистен при „%s“"
 
-#: midx.c:1116
+#: midx.c:1021
 msgid "multi-pack-index file exists, but failed to parse"
 msgstr "файлът с индекса за множество пакети, но не може да бъде анализиран"
 
-#: midx.c:1124
+#: midx.c:1029
 msgid "Looking for referenced packfiles"
 msgstr "Търсене на указаните пакетни файлове"
 
-#: midx.c:1139
+#: midx.c:1044
 #, c-format
 msgid ""
 "oid fanout out of order: fanout[%d] = %<PRIx32> > %<PRIx32> = fanout[%d]"
@@ -5327,72 +5526,72 @@
 "неправилна подредба на откъси (OID fanout): fanout[%d] = %<PRIx32> > "
 "%<PRIx32> = fanout[%d]"
 
-#: midx.c:1144
+#: midx.c:1049
 msgid "the midx contains no oid"
 msgstr "във файла с индекса за множество пакети няма идентификатори на обекти"
 
-#: midx.c:1153
+#: midx.c:1058
 msgid "Verifying OID order in multi-pack-index"
 msgstr ""
 "Проверка на подредбата на идентификатори на обекти във файл с индекс към "
 "множество пакетни файлове"
 
-#: midx.c:1162
+#: midx.c:1067
 #, c-format
 msgid "oid lookup out of order: oid[%d] = %s >= %s = oid[%d]"
 msgstr ""
 "неправилна подредба на откъси (OID lookup): oid[%d] = %s >= %s = oid[%d]"
 
-#: midx.c:1182
+#: midx.c:1087
 msgid "Sorting objects by packfile"
 msgstr "Подредба на обектите по пакетни файлове"
 
-#: midx.c:1189
+#: midx.c:1094
 msgid "Verifying object offsets"
 msgstr "Проверка на отместването на обекти"
 
-#: midx.c:1205
+#: midx.c:1110
 #, c-format
 msgid "failed to load pack entry for oid[%d] = %s"
 msgstr "записът в пакета за обекта oid[%d] = %s не може да бъде зареден"
 
-#: midx.c:1211
+#: midx.c:1116
 #, c-format
 msgid "failed to load pack-index for packfile %s"
 msgstr "индексът на пакета „%s“ не може да бъде зареден"
 
-#: midx.c:1220
+#: midx.c:1125
 #, c-format
 msgid "incorrect object offset for oid[%d] = %s: %<PRIx64> != %<PRIx64>"
 msgstr "неправилно отместване на обект за oid[%d] = %s: %<PRIx64> != %<PRIx64>"
 
-#: midx.c:1245
+#: midx.c:1150
 msgid "Counting referenced objects"
 msgstr "Преброяване на свързаните обекти"
 
-#: midx.c:1255
+#: midx.c:1160
 msgid "Finding and deleting unreferenced packfiles"
 msgstr "Търсене и изтриване на несвързаните пакетни файлове"
 
-#: midx.c:1446
+#: midx.c:1351
 msgid "could not start pack-objects"
 msgstr "командата „pack-objects“ не може да бъде стартирана"
 
-#: midx.c:1466
+#: midx.c:1371
 msgid "could not finish pack-objects"
 msgstr "командата „pack-objects“ не може да бъде завършена"
 
-#: name-hash.c:537
+#: name-hash.c:538
 #, c-format
 msgid "unable to create lazy_dir thread: %s"
 msgstr "не може да се създаде нишка за директории: %s"
 
-#: name-hash.c:559
+#: name-hash.c:560
 #, c-format
 msgid "unable to create lazy_name thread: %s"
 msgstr "не може да се създаде нишка за имена: %s"
 
-#: name-hash.c:565
+#: name-hash.c:566
 #, c-format
 msgid "unable to join lazy_name thread: %s"
 msgstr "не може да се изчака нишка за имена: %s"
@@ -5445,6 +5644,368 @@
 msgid "Bad %s value: '%s'"
 msgstr "Зададена е лоша стойност на променливата „%s“: „%s“"
 
+#: object-file.c:480
+#, c-format
+msgid "object directory %s does not exist; check .git/objects/info/alternates"
+msgstr ""
+"директорията за обекти „%s“ не съществува, проверете „.git/objects/info/"
+"alternates“"
+
+#: object-file.c:531
+#, c-format
+msgid "unable to normalize alternate object path: %s"
+msgstr "алтернативният път към обекти не може да бъде нормализиран: „%s“"
+
+#: object-file.c:603
+#, c-format
+msgid "%s: ignoring alternate object stores, nesting too deep"
+msgstr ""
+"%s: алтернативните хранилища за обекти се пренебрегват поради прекалено "
+"дълбоко влагане"
+
+#: object-file.c:610
+#, c-format
+msgid "unable to normalize object directory: %s"
+msgstr "директорията за обекти „%s“ не може да бъде нормализирана"
+
+#: object-file.c:653
+msgid "unable to fdopen alternates lockfile"
+msgstr "заключващият файл за алтернативите не може да се отвори с „fdopen“"
+
+#: object-file.c:671
+msgid "unable to read alternates file"
+msgstr "файлът с алтернативите не може да бъде прочетен"
+
+#: object-file.c:678
+msgid "unable to move new alternates file into place"
+msgstr "новият файл с алтернативите не може да бъде преместен на мястото му"
+
+#: object-file.c:713
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "пътят „%s“ не съществува."
+
+#: object-file.c:734
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "все още не се поддържа еталонно хранилище „%s“ като свързано."
+
+#: object-file.c:740
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "еталонното хранилище „%s“ не е локално"
+
+#: object-file.c:746
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "еталонното хранилище „%s“ е плитко"
+
+#: object-file.c:754
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "еталонното хранилище „%s“ е с присаждане"
+
+#: object-file.c:814
+#, c-format
+msgid "invalid line while parsing alternate refs: %s"
+msgstr "неправилен ред при анализа на алтернативните указатели: „%s“"
+
+#: object-file.c:964
+#, c-format
+msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
+msgstr ""
+"неуспешен опит за „mmap“ %<PRIuMAX>, което е над позволеното %<PRIuMAX>"
+
+#: object-file.c:985
+msgid "mmap failed"
+msgstr "неуспешно изпълнение на „mmap“"
+
+#: object-file.c:1149
+#, c-format
+msgid "object file %s is empty"
+msgstr "файлът с обектите „%s“ е празен"
+
+#: object-file.c:1284 object-file.c:2477
+#, c-format
+msgid "corrupt loose object '%s'"
+msgstr "непакетираният обект „%s“ е повреден"
+
+#: object-file.c:1286 object-file.c:2481
+#, c-format
+msgid "garbage at end of loose object '%s'"
+msgstr "грешни данни в края на непакетирания обект „%s“"
+
+#: object-file.c:1328
+msgid "invalid object type"
+msgstr "неправилен вид обект"
+
+#: object-file.c:1412
+#, c-format
+msgid "unable to unpack %s header with --allow-unknown-type"
+msgstr ""
+"заглавната част „%s“ не може да се разпакетира с опцията „--allow-unknown-"
+"type“"
+
+#: object-file.c:1415
+#, c-format
+msgid "unable to unpack %s header"
+msgstr "заглавната част на „%s“ не може да бъде разпакетирана"
+
+#: object-file.c:1421
+#, c-format
+msgid "unable to parse %s header with --allow-unknown-type"
+msgstr ""
+"заглавната част „%s“ не може да се анализира с опцията „--allow-unknown-type“"
+
+#: object-file.c:1424
+#, c-format
+msgid "unable to parse %s header"
+msgstr "заглавната част на „%s“ не може да бъде анализирана"
+
+#: object-file.c:1651
+#, c-format
+msgid "failed to read object %s"
+msgstr "обектът „%s“ не може да бъде прочетен"
+
+#: object-file.c:1655
+#, c-format
+msgid "replacement %s not found for %s"
+msgstr "заместителят „%s“ на „%s“ не може да бъде открит"
+
+#: object-file.c:1659
+#, c-format
+msgid "loose object %s (stored in %s) is corrupt"
+msgstr "непакетираният обект „%s“ (в „%s“) е повреден"
+
+#: object-file.c:1663
+#, c-format
+msgid "packed object %s (stored in %s) is corrupt"
+msgstr "пакетираният обект „%s“ (в „%s“) е повреден"
+
+#: object-file.c:1768
+#, c-format
+msgid "unable to write file %s"
+msgstr "файлът „%s“ не може да бъде записан"
+
+#: object-file.c:1775
+#, c-format
+msgid "unable to set permission to '%s'"
+msgstr "правата за достъп до „%s“ не могат да бъдат зададени"
+
+#: object-file.c:1782
+msgid "file write error"
+msgstr "грешка при запис на файл"
+
+#: object-file.c:1802
+msgid "error when closing loose object file"
+msgstr "грешка при затварянето на файла с непакетиран обект"
+
+#: object-file.c:1867
+#, c-format
+msgid "insufficient permission for adding an object to repository database %s"
+msgstr ""
+"няма права за добавяне на обект към базата от данни на хранилището „%s“"
+
+#: object-file.c:1869
+msgid "unable to create temporary file"
+msgstr "не може да бъде създаден временен файл"
+
+#: object-file.c:1893
+msgid "unable to write loose object file"
+msgstr "грешка при записа на файла с непакетиран обект"
+
+#: object-file.c:1899
+#, c-format
+msgid "unable to deflate new object %s (%d)"
+msgstr "новият обект „%s“ не може да се компресира с „deflate“: %d"
+
+#: object-file.c:1903
+#, c-format
+msgid "deflateEnd on object %s failed (%d)"
+msgstr "неуспешно приключване на „deflate“ върху „%s“: %d"
+
+#: object-file.c:1907
+#, c-format
+msgid "confused by unstable object source data for %s"
+msgstr "грешка поради нестабилния източник данни за обектите „%s“"
+
+#: object-file.c:1917 builtin/pack-objects.c:1097
+#, c-format
+msgid "failed utime() on %s"
+msgstr "неуспешно задаване на време на достъп/създаване чрез „utime“ на „%s“"
+
+#: object-file.c:1994
+#, c-format
+msgid "cannot read object for %s"
+msgstr "обектът за „%s“ не може да се прочете"
+
+#: object-file.c:2045
+msgid "corrupt commit"
+msgstr "повредено подаване"
+
+#: object-file.c:2053
+msgid "corrupt tag"
+msgstr "повреден етикет"
+
+#: object-file.c:2153
+#, c-format
+msgid "read error while indexing %s"
+msgstr "грешка при четене по време на индексиране на „%s“"
+
+#: object-file.c:2156
+#, c-format
+msgid "short read while indexing %s"
+msgstr "непълно прочитане по време на индексиране на „%s“"
+
+#: object-file.c:2229 object-file.c:2239
+#, c-format
+msgid "%s: failed to insert into database"
+msgstr "„%s“ не може да се вмъкне в базата от данни"
+
+#: object-file.c:2245
+#, c-format
+msgid "%s: unsupported file type"
+msgstr "неподдържан вид файл: „%s“"
+
+#: object-file.c:2269
+#, c-format
+msgid "%s is not a valid object"
+msgstr "„%s“ е неправилен обект"
+
+#: object-file.c:2271
+#, c-format
+msgid "%s is not a valid '%s' object"
+msgstr "„%s“ е неправилен обект от вид „%s“"
+
+#: object-file.c:2298 builtin/index-pack.c:192
+#, c-format
+msgid "unable to open %s"
+msgstr "обектът „%s“ не може да бъде отворен"
+
+#: object-file.c:2488 object-file.c:2541
+#, c-format
+msgid "hash mismatch for %s (expected %s)"
+msgstr "неправилна контролна сума за „%s“ (трябва да е %s)"
+
+#: object-file.c:2512
+#, c-format
+msgid "unable to mmap %s"
+msgstr "неуспешно изпълнение на „mmap“ върху „%s“"
+
+#: object-file.c:2517
+#, c-format
+msgid "unable to unpack header of %s"
+msgstr "заглавната част на „%s“ не може да бъде разпакетирана"
+
+#: object-file.c:2523
+#, c-format
+msgid "unable to parse header of %s"
+msgstr "заглавната част на „%s“ не може да бъде анализирана"
+
+#: object-file.c:2534
+#, c-format
+msgid "unable to unpack contents of %s"
+msgstr "съдържанието на „%s“ не може да бъде разпакетирано"
+
+#: object-name.c:486
+#, c-format
+msgid "short object ID %s is ambiguous"
+msgstr "късият идентификатор на обект „%s“ не е еднозначен"
+
+#: object-name.c:497
+msgid "The candidates are:"
+msgstr "Възможностите са:"
+
+#: object-name.c:796
+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 switch -c $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 никога не създава указатели, които завършват\n"
+"с 40 шестнадесетични знака, защото стандартно те ще бъдат прескачани.\n"
+"Възможно е такива указатели да са създадени случайно.  Например:\n"
+"\n"
+"    git switch -c $BRANCH $(git rev-parse …)\n"
+"\n"
+"където стойността на променливата на средата BRANCH е празна, при което\n"
+"се създава подобен указател.  Прегледайте тези указатели и ги изтрийте.\n"
+"За да изключите това съобщение, изпълнете:\n"
+"\n"
+"    git config advice.objectNameWarning false"
+
+#: object-name.c:916
+#, c-format
+msgid "log for '%.*s' only goes back to %s"
+msgstr "журналът за „%.*s“ стига само до „%s“"
+
+#: object-name.c:924
+#, c-format
+msgid "log for '%.*s' only has %d entries"
+msgstr "журналът за „%.*s“ съдържа само %d записа"
+
+#: object-name.c:1702
+#, c-format
+msgid "path '%s' exists on disk, but not in '%.*s'"
+msgstr "пътят „%s“ съществува на диска, но не и в „%.*s“"
+
+#: object-name.c:1708
+#, c-format
+msgid ""
+"path '%s' exists, but not '%s'\n"
+"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
+msgstr ""
+"пътят „%s“ съществува на диска, но не е в „%s“\n"
+"Пробвайте с „%.*s:%s“, което е същото като „%.*s:./%s“."
+
+#: object-name.c:1717
+#, c-format
+msgid "path '%s' does not exist in '%.*s'"
+msgstr "пътят „%s“ не съществува в „%.*s“"
+
+#: object-name.c:1745
+#, c-format
+msgid ""
+"path '%s' is in the index, but not at stage %d\n"
+"hint: Did you mean ':%d:%s'?"
+msgstr ""
+"пътят „%s“ е в индекса, но не версия %d\n"
+"Пробвайте с „%d:%s“."
+
+#: object-name.c:1761
+#, c-format
+msgid ""
+"path '%s' is in the index, but not '%s'\n"
+"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
+msgstr ""
+"пътят „%s“ е в индекса, но не в „%s“\n"
+"Пробвайте с „%d:%s“, което е същото като „%d:./%s“."
+
+#: object-name.c:1769
+#, c-format
+msgid "path '%s' exists on disk, but not in the index"
+msgstr "пътят „%s“ съществува на диска, но не е в индекса"
+
+#: object-name.c:1771
+#, c-format
+msgid "path '%s' does not exist (neither on disk nor in the index)"
+msgstr "пътят „%s“ не съществува нито на диска, нито в индекса"
+
+#: object-name.c:1784
+msgid "relative path syntax can't be used outside working tree"
+msgstr "относителен път не може да се ползва извън работното дърво"
+
+#: object-name.c:1922
+#, c-format
+msgid "invalid object name '%.*s'."
+msgstr "неправилно име на обект: „%.*s“"
+
 #: object.c:53
 #, c-format
 msgid "invalid object type \"%s\""
@@ -5470,24 +6031,75 @@
 msgid "hash mismatch %s"
 msgstr "разлика в контролната сума: „%s“"
 
-#: pack-bitmap.c:815 pack-bitmap.c:821 builtin/pack-objects.c:2216
+#: pack-bitmap.c:843 pack-bitmap.c:849 builtin/pack-objects.c:2226
 #, c-format
 msgid "unable to get size of %s"
 msgstr "размерът на „%s“ не може да бъде получен"
 
-#: packfile.c:615
+#: pack-bitmap.c:1489 builtin/rev-list.c:92
+#, c-format
+msgid "unable to get disk usage of %s"
+msgstr "използваното място за „%s“ не може да бъде получено"
+
+#: pack-revindex.c:220
+#, c-format
+msgid "reverse-index file %s is too small"
+msgstr "файлът с обратния индекс „%s“ е твърде малък"
+
+#: pack-revindex.c:225
+#, c-format
+msgid "reverse-index file %s is corrupt"
+msgstr "файлът с обратния индекс „%s“ е повреден"
+
+#: pack-revindex.c:233
+#, c-format
+msgid "reverse-index file %s has unknown signature"
+msgstr "непознат подпис за файла на обратния индекс „%s“"
+
+#: pack-revindex.c:237
+#, c-format
+msgid "reverse-index file %s has unsupported version %<PRIu32>"
+msgstr "версия %2$<PRIu32> на файла с обратен индекс „%1$s“ не се поддържа"
+
+#: pack-revindex.c:242
+#, c-format
+msgid "reverse-index file %s has unsupported hash id %<PRIu32>"
+msgstr ""
+"идентификатор на контролна сума %2$<PRIu32> на файла с обратен индекс „%1$s“ "
+"не се поддържа"
+
+#: pack-write.c:236
+msgid "cannot both write and verify reverse index"
+msgstr "обратният индекс не може едновременно да се записва и да се проверява"
+
+#: pack-write.c:257
+#, c-format
+msgid "could not stat: %s"
+msgstr "не може да се получи информация чрез „stat“ за „%s“"
+
+#: pack-write.c:269
+#, c-format
+msgid "failed to make %s readable"
+msgstr "не може да се дадат права за четене на „%s“"
+
+#: pack-write.c:508
+#, c-format
+msgid "could not write '%s' promisor file"
+msgstr "гарантиращият файл „%s“ не може да се запише"
+
+#: packfile.c:625
 msgid "offset before end of packfile (broken .idx?)"
 msgstr ""
 "отместване преди края на пакетния файл (възможно е индексът да е повреден)"
 
-#: packfile.c:1907
+#: packfile.c:1934
 #, c-format
 msgid "offset before start of pack index for %s (corrupt index?)"
 msgstr ""
 "отместване преди началото на индекса на пакетния файл „%s“ (възможно е "
 "индексът да е повреден)"
 
-#: packfile.c:1911
+#: packfile.c:1938
 #, c-format
 msgid "offset beyond end of pack index for %s (truncated index?)"
 msgstr ""
@@ -5744,16 +6356,16 @@
 msgid "remote error: %s"
 msgstr "отдалечена грешка: %s"
 
-#: preload-index.c:119
+#: preload-index.c:125
 msgid "Refreshing index"
 msgstr "Обновяване на индекса"
 
-#: preload-index.c:138
+#: preload-index.c:144
 #, c-format
 msgid "unable to create threaded lstat: %s"
 msgstr "не може да се създаде нишка за изпълнението на „lstat“: %s"
 
-#: pretty.c:983
+#: pretty.c:984
 msgid "unable to parse --pretty format"
 msgstr "аргументът към опцията „--pretty“ не може да се анализира"
 
@@ -5781,21 +6393,21 @@
 msgid "Removing duplicate objects"
 msgstr "Изтриване на повтарящите се обекти"
 
-#: range-diff.c:77
+#: range-diff.c:78
 msgid "could not start `log`"
 msgstr "командата за журнала с подавания „log“ не може да се стартира"
 
-#: range-diff.c:79
+#: range-diff.c:80
 msgid "could not read `log` output"
 msgstr ""
 "изходът от командата за журнала с подавания „log“ не може да се прочете"
 
-#: range-diff.c:98 sequencer.c:5310
+#: range-diff.c:101 sequencer.c:5318
 #, c-format
 msgid "could not parse commit '%s'"
 msgstr "подаването „%s“ не може да бъде анализирано"
 
-#: range-diff.c:112
+#: range-diff.c:115
 #, c-format
 msgid ""
 "could not parse first line of `log` output: did not start with 'commit ': "
@@ -5804,16 +6416,20 @@
 "първият ред от изхода на командата „log“ не може да се анализира, защото не "
 "започва с „commit “: „%s“"
 
-#: range-diff.c:137
+#: range-diff.c:140
 #, c-format
 msgid "could not parse git header '%.*s'"
 msgstr "заглавната част на git „%.*s“ не може да се анализира"
 
-#: range-diff.c:299
+#: range-diff.c:306
 msgid "failed to generate diff"
 msgstr "неуспешно търсене на разлика"
 
-#: range-diff.c:532 range-diff.c:534
+#: range-diff.c:558
+msgid "--left-only and --right-only are mutually exclusive"
+msgstr "опциите „--left-only“ и „--right-only“ са несъвместими"
+
+#: range-diff.c:561 range-diff.c:563
 #, c-format
 msgid "could not parse log for '%s'"
 msgstr "журналът с подаванията на „%s“ не може да бъде анализиран"
@@ -5860,11 +6476,11 @@
 msgid "'%s' appears as both a file and as a directory"
 msgstr "„%s“ съществува и като файл, и като директория"
 
-#: read-cache.c:1524
+#: read-cache.c:1532
 msgid "Refresh index"
 msgstr "Обновяване на индекса"
 
-#: read-cache.c:1639
+#: read-cache.c:1657
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -5873,7 +6489,7 @@
 "Зададена е неправилна стойност на настройката „index.version“.\n"
 "Ще се ползва версия %i"
 
-#: read-cache.c:1649
+#: read-cache.c:1667
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -5883,142 +6499,142 @@
 "„GIT_INDEX_VERSION“.\n"
 "Ще се ползва версия %i"
 
-#: read-cache.c:1705
+#: read-cache.c:1723
 #, c-format
 msgid "bad signature 0x%08x"
 msgstr "неправилен подпис: „0x%08x“"
 
-#: read-cache.c:1708
+#: read-cache.c:1726
 #, c-format
 msgid "bad index version %d"
 msgstr "неправилна версия на индекса %d"
 
-#: read-cache.c:1717
+#: read-cache.c:1735
 msgid "bad index file sha1 signature"
 msgstr "неправилен подпис за контролна сума по SHA1 на файла на индекса"
 
-#: read-cache.c:1747
+#: read-cache.c:1765
 #, c-format
 msgid "index uses %.4s extension, which we do not understand"
 msgstr ""
 "индексът ползва разширение „%.4s“, което не се поддържа от тази версия на git"
 
-#: read-cache.c:1749
+#: read-cache.c:1767
 #, c-format
 msgid "ignoring %.4s extension"
 msgstr "игнориране на разширението „%.4s“"
 
-#: read-cache.c:1786
+#: read-cache.c:1804
 #, c-format
 msgid "unknown index entry format 0x%08x"
 msgstr "непознат формат на запис в индекса: „0x%08x“"
 
-#: read-cache.c:1802
+#: read-cache.c:1820
 #, c-format
 msgid "malformed name field in the index, near path '%s'"
 msgstr "неправилно име на поле в индекса близо до пътя „%s“"
 
-#: read-cache.c:1859
+#: read-cache.c:1877
 msgid "unordered stage entries in index"
 msgstr "неподредени записи в индекса"
 
-#: read-cache.c:1862
+#: read-cache.c:1880
 #, c-format
 msgid "multiple stage entries for merged file '%s'"
 msgstr "множество записи за слетия файл „%s“"
 
-#: read-cache.c:1865
+#: read-cache.c:1883
 #, c-format
 msgid "unordered stage entries for '%s'"
 msgstr "неподредени записи за „%s“"
 
-#: read-cache.c:1971 read-cache.c:2262 rerere.c:565 rerere.c:599 rerere.c:1111
-#: submodule.c:1628 builtin/add.c:538 builtin/check-ignore.c:181
-#: builtin/checkout.c:502 builtin/checkout.c:688 builtin/clean.c:991
-#: builtin/commit.c:364 builtin/diff-tree.c:122 builtin/grep.c:507
+#: read-cache.c:1989 read-cache.c:2280 rerere.c:549 rerere.c:583 rerere.c:1095
+#: submodule.c:1634 builtin/add.c:546 builtin/check-ignore.c:181
+#: builtin/checkout.c:504 builtin/checkout.c:690 builtin/clean.c:991
+#: builtin/commit.c:364 builtin/diff-tree.c:122 builtin/grep.c:505
 #: builtin/mv.c:146 builtin/reset.c:247 builtin/rm.c:290
 #: builtin/submodule--helper.c:332
 msgid "index file corrupt"
 msgstr "файлът с индекса е повреден"
 
-#: read-cache.c:2115
+#: read-cache.c:2133
 #, c-format
 msgid "unable to create load_cache_entries thread: %s"
 msgstr "не може да се създаде нишка за зареждане на обектите от кеша: %s"
 
-#: read-cache.c:2128
+#: read-cache.c:2146
 #, c-format
 msgid "unable to join load_cache_entries thread: %s"
 msgstr "не може да се изчака нишка за зареждане на обектите от кеша: %s"
 
-#: read-cache.c:2161
+#: read-cache.c:2179
 #, c-format
 msgid "%s: index file open failed"
 msgstr "%s: неуспешно отваряне на файла на индекса"
 
-#: read-cache.c:2165
+#: read-cache.c:2183
 #, c-format
 msgid "%s: cannot stat the open index"
 msgstr "%s: не може да се получи информация за отворения индекс със „stat“"
 
-#: read-cache.c:2169
+#: read-cache.c:2187
 #, c-format
 msgid "%s: index file smaller than expected"
 msgstr "%s: файлът на индекса е по-малък от очакваното"
 
-#: read-cache.c:2173
+#: read-cache.c:2191
 #, c-format
 msgid "%s: unable to map index file"
 msgstr "%s: неуспешно заделяне на съответстваща памет чрез „mmap“ на индекса"
 
-#: read-cache.c:2215
+#: read-cache.c:2233
 #, c-format
 msgid "unable to create load_index_extensions thread: %s"
 msgstr ""
 "не може да се създаде нишка за зареждане на разширенията на индекса: %s"
 
-#: read-cache.c:2242
+#: read-cache.c:2260
 #, c-format
 msgid "unable to join load_index_extensions thread: %s"
 msgstr ""
 "не може да се създаде нишка за зареждане на разширенията на индекса: %s"
 
-#: read-cache.c:2274
+#: read-cache.c:2292
 #, c-format
 msgid "could not freshen shared index '%s'"
 msgstr "споделеният индекс „%s“ не може да се обнови"
 
-#: read-cache.c:2321
+#: read-cache.c:2339
 #, c-format
 msgid "broken index, expect %s in %s, got %s"
 msgstr "грешки в индекса — в „%2$s“ се очаква „%1$s“, а бе получено „%3$s“"
 
-#: read-cache.c:3017 strbuf.c:1171 wrapper.c:633 builtin/merge.c:1140
+#: read-cache.c:3035 strbuf.c:1171 wrapper.c:633 builtin/merge.c:1141
 #, c-format
 msgid "could not close '%s'"
 msgstr "„%s“ не може да се затвори"
 
-#: read-cache.c:3120 sequencer.c:2479 sequencer.c:4231
+#: read-cache.c:3138 sequencer.c:2487 sequencer.c:4239
 #, c-format
 msgid "could not stat '%s'"
 msgstr "неуспешно изпълнение на „stat“ върху „%s“"
 
-#: read-cache.c:3133
+#: read-cache.c:3151
 #, c-format
 msgid "unable to open git dir: %s"
 msgstr "не може да се отвори директорията на git: %s"
 
-#: read-cache.c:3145
+#: read-cache.c:3163
 #, c-format
 msgid "unable to unlink: %s"
 msgstr "неуспешно изтриване на „%s“"
 
-#: read-cache.c:3170
+#: read-cache.c:3188
 #, c-format
 msgid "cannot fix permission bits on '%s'"
 msgstr "правата за достъп до „%s“ не могат да бъдат поправени"
 
-#: read-cache.c:3319
+#: read-cache.c:3337
 #, c-format
 msgid "%s: cannot drop to stage #0"
 msgstr "%s: не може да се премине към етап №0"
@@ -6137,14 +6753,14 @@
 "Ако изтриете всичко, пребазирането ще бъде преустановено.\n"
 "\n"
 
-#: rebase-interactive.c:110 rerere.c:485 rerere.c:692 sequencer.c:3607
-#: sequencer.c:3633 sequencer.c:5416 builtin/fsck.c:347 builtin/rebase.c:270
+#: rebase-interactive.c:110 rerere.c:469 rerere.c:676 sequencer.c:3615
+#: sequencer.c:3641 sequencer.c:5424 builtin/fsck.c:329 builtin/rebase.c:272
 #, c-format
 msgid "could not write '%s'"
 msgstr "„%s“ не може да се запише"
 
-#: rebase-interactive.c:116 builtin/rebase.c:202 builtin/rebase.c:228
-#: builtin/rebase.c:252
+#: rebase-interactive.c:116 builtin/rebase.c:204 builtin/rebase.c:230
+#: builtin/rebase.c:254
 #, c-format
 msgid "could not write '%s'."
 msgstr "„%s“ не може да се запише."
@@ -6175,14 +6791,14 @@
 "предупреждение)\n"
 "или „error“ (считане за грешка).\n"
 
-#: rebase-interactive.c:233 rebase-interactive.c:238 sequencer.c:2394
-#: builtin/rebase.c:188 builtin/rebase.c:213 builtin/rebase.c:239
-#: builtin/rebase.c:264
+#: rebase-interactive.c:233 rebase-interactive.c:238 sequencer.c:2402
+#: builtin/rebase.c:190 builtin/rebase.c:215 builtin/rebase.c:241
+#: builtin/rebase.c:266
 #, c-format
 msgid "could not read '%s'."
 msgstr "от „%s“ не може да се чете."
 
-#: ref-filter.c:42 wt-status.c:1973
+#: ref-filter.c:42 wt-status.c:1975
 msgid "gone"
 msgstr "изтрит"
 
@@ -6201,232 +6817,247 @@
 msgid "ahead %d, behind %d"
 msgstr "напред с %d, назад с %d"
 
-#: ref-filter.c:169
+#: ref-filter.c:175
 #, c-format
 msgid "expected format: %%(color:<color>)"
 msgstr "очакван формат: %%(color:ЦВЯТ)"
 
-#: ref-filter.c:171
+#: ref-filter.c:177
 #, c-format
 msgid "unrecognized color: %%(color:%s)"
 msgstr "непознат цвят: %%(color:%s)"
 
-#: ref-filter.c:193
+#: ref-filter.c:199
 #, c-format
 msgid "Integer value expected refname:lstrip=%s"
 msgstr "очаква се цяло число за „refname:lstrip=%s“"
 
-#: ref-filter.c:197
+#: ref-filter.c:203
 #, c-format
 msgid "Integer value expected refname:rstrip=%s"
 msgstr "очаква се цяло число за „refname:rstrip=%s“"
 
-#: ref-filter.c:199
+#: ref-filter.c:205
 #, c-format
 msgid "unrecognized %%(%s) argument: %s"
 msgstr "непознат аргумент за „%%(%s)“: %s"
 
-#: ref-filter.c:254
+#: ref-filter.c:260
 #, c-format
 msgid "%%(objecttype) does not take arguments"
 msgstr "%%(objecttype) не приема аргументи"
 
-#: ref-filter.c:276
+#: ref-filter.c:282
 #, c-format
 msgid "unrecognized %%(objectsize) argument: %s"
 msgstr "непознат аргумент за %%(objectsize): %s"
 
-#: ref-filter.c:284
+#: ref-filter.c:290
 #, c-format
 msgid "%%(deltabase) does not take arguments"
 msgstr "%%(deltabase) не приема аргументи"
 
-#: ref-filter.c:296
+#: ref-filter.c:302
 #, c-format
 msgid "%%(body) does not take arguments"
 msgstr "%%(body) не приема аргументи"
 
-#: ref-filter.c:309
+#: ref-filter.c:315
 #, c-format
 msgid "unrecognized %%(subject) argument: %s"
 msgstr "непознат аргумент за %%(subject): %s"
 
-#: ref-filter.c:330
+#: ref-filter.c:334
+#, c-format
+msgid "expected %%(trailers:key=<value>)"
+msgstr "очаква се %%(trailers:КЛЮЧ=СТОЙНОСТ)"
+
+#: ref-filter.c:336
 #, c-format
 msgid "unknown %%(trailers) argument: %s"
 msgstr "непознат аргумент „%%(trailers)“: %s"
 
-#: ref-filter.c:363
+#: ref-filter.c:367
 #, c-format
 msgid "positive value expected contents:lines=%s"
 msgstr "очаква се положителна стойност за „contents:lines=%s“"
 
-#: ref-filter.c:365
+#: ref-filter.c:369
 #, c-format
 msgid "unrecognized %%(contents) argument: %s"
 msgstr "непознат аргумент за %%(contents): %s"
 
-#: ref-filter.c:380
+#: ref-filter.c:384
 #, c-format
 msgid "positive value expected '%s' in %%(%s)"
 msgstr "очаква се положителна стойност за „%s“ в %%(%s)"
 
-#: ref-filter.c:384
+#: ref-filter.c:388
 #, c-format
 msgid "unrecognized argument '%s' in %%(%s)"
 msgstr "непознат аргумент „%s“ в %%(%s)"
 
-#: ref-filter.c:398
+#: ref-filter.c:402
 #, c-format
 msgid "unrecognized email option: %s"
 msgstr "непозната опция за е-поща: %s"
 
-#: ref-filter.c:428
+#: ref-filter.c:432
 #, c-format
 msgid "expected format: %%(align:<width>,<position>)"
 msgstr "очакван формат: %%(align:ШИРОЧИНА,ПОЗИЦИЯ)"
 
-#: ref-filter.c:440
+#: ref-filter.c:444
 #, c-format
 msgid "unrecognized position:%s"
 msgstr "непозната позиция: %s"
 
-#: ref-filter.c:447
+#: ref-filter.c:451
 #, c-format
 msgid "unrecognized width:%s"
 msgstr "непозната широчина: %s"
 
-#: ref-filter.c:456
+#: ref-filter.c:460
 #, c-format
 msgid "unrecognized %%(align) argument: %s"
 msgstr "непознат аргумент за %%(align): %s"
 
-#: ref-filter.c:464
+#: ref-filter.c:468
 #, c-format
 msgid "positive width expected with the %%(align) atom"
 msgstr "очаква се положителна широчина с лексемата „%%(align)“"
 
-#: ref-filter.c:482
+#: ref-filter.c:486
 #, c-format
 msgid "unrecognized %%(if) argument: %s"
 msgstr "непознат аргумент за „%%(if)“: %s"
 
-#: ref-filter.c:584
+#: ref-filter.c:588
 #, c-format
 msgid "malformed field name: %.*s"
 msgstr "неправилно име на обект: „%.*s“"
 
-#: ref-filter.c:611
+#: ref-filter.c:615
 #, c-format
 msgid "unknown field name: %.*s"
 msgstr "непознато име на обект: „%.*s“"
 
-#: ref-filter.c:615
+#: ref-filter.c:619
 #, c-format
 msgid ""
 "not a git repository, but the field '%.*s' requires access to object data"
 msgstr "не е хранилище на git, а полето „%.*s“ изисква достъп данни на обектни"
 
-#: ref-filter.c:739
+#: ref-filter.c:743
 #, c-format
 msgid "format: %%(if) atom used without a %%(then) atom"
 msgstr "формат: лексемата %%(if) е използвана без съответната ѝ %%(then)"
 
-#: ref-filter.c:802
+#: ref-filter.c:806
 #, c-format
 msgid "format: %%(then) atom used without an %%(if) atom"
 msgstr "формат: лексемата %%(then) е използвана без съответната ѝ %%(if)"
 
-#: ref-filter.c:804
+#: ref-filter.c:808
 #, c-format
 msgid "format: %%(then) atom used more than once"
 msgstr "формат: лексемата %%(then) е използвана повече от един път"
 
-#: ref-filter.c:806
+#: ref-filter.c:810
 #, c-format
 msgid "format: %%(then) atom used after %%(else)"
 msgstr "формат: лексемата %%(then) е използвана след %%(else)"
 
-#: ref-filter.c:834
+#: ref-filter.c:838
 #, c-format
 msgid "format: %%(else) atom used without an %%(if) atom"
 msgstr "формат: лексемата %%(else) е използвана без съответната ѝ %%(if)"
 
-#: ref-filter.c:836
+#: ref-filter.c:840
 #, c-format
 msgid "format: %%(else) atom used without a %%(then) atom"
 msgstr "формат: лексемата %%(else) е използвана без съответната ѝ %%(then)"
 
-#: ref-filter.c:838
+#: ref-filter.c:842
 #, c-format
 msgid "format: %%(else) atom used more than once"
 msgstr "формат: лексемата %%(else) е използвана повече от един път"
 
-#: ref-filter.c:853
+#: ref-filter.c:857
 #, c-format
 msgid "format: %%(end) atom used without corresponding atom"
 msgstr "формат: лексемата %%(end) е използвана без съответната ѝ"
 
-#: ref-filter.c:910
+#: ref-filter.c:914
 #, c-format
 msgid "malformed format string %s"
 msgstr "неправилен форматиращ низ „%s“"
 
-#: ref-filter.c:1549
-#, c-format
-msgid "no branch, rebasing %s"
-msgstr "извън клон, пребазиране на „%s“"
-
-#: ref-filter.c:1552
-#, c-format
-msgid "no branch, rebasing detached HEAD %s"
-msgstr "извън клон, пребазиране на несвързан указател „HEAD“ при „%s“"
-
 #: ref-filter.c:1555
 #, c-format
-msgid "no branch, bisect started on %s"
-msgstr "извън клон, двоично търсене от „%s“"
+msgid "(no branch, rebasing %s)"
+msgstr "(извън клон, пребазиране на „%s“)"
+
+#: ref-filter.c:1558
+#, c-format
+msgid "(no branch, rebasing detached HEAD %s)"
+msgstr "(извън клон, пребазиране на несвързан указател „HEAD“ при „%s“)"
+
+#: ref-filter.c:1561
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr "(извън клон, двоично търсене от „%s“)"
 
 #: ref-filter.c:1565
-msgid "no branch"
-msgstr "извън клон"
+#, c-format
+msgid "(HEAD detached at %s)"
+msgstr "(указателят „HEAD“ не е свързан и е при „%s“)"
 
-#: ref-filter.c:1599 ref-filter.c:1808
+#: ref-filter.c:1568
+#, c-format
+msgid "(HEAD detached from %s)"
+msgstr "(указателят „HEAD“ не е свързан и е отделѐн от „%s“)"
+
+#: ref-filter.c:1571
+msgid "(no branch)"
+msgstr "(извън клон)"
+
+#: ref-filter.c:1603 ref-filter.c:1812
 #, c-format
 msgid "missing object %s for %s"
 msgstr "обектът „%s“ липсва за „%s“"
 
-#: ref-filter.c:1609
+#: ref-filter.c:1613
 #, c-format
 msgid "parse_object_buffer failed on %s for %s"
 msgstr "неуспешно анализиране чрез „parse_object_buffer“ на „%s“ за „%s“"
 
-#: ref-filter.c:2062
+#: ref-filter.c:1996
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "обект със сгрешен формат при „%s“"
 
-#: ref-filter.c:2151
+#: ref-filter.c:2085
 #, c-format
 msgid "ignoring ref with broken name %s"
 msgstr "игнориране на указателя с грешно име „%s“"
 
-#: ref-filter.c:2156 refs.c:676
+#: ref-filter.c:2090 refs.c:676
 #, c-format
 msgid "ignoring broken ref %s"
 msgstr "игнориране на повредения указател „%s“"
 
-#: ref-filter.c:2472
+#: ref-filter.c:2430
 #, c-format
 msgid "format: %%(end) atom missing"
 msgstr "грешка във форма̀та: липсва лексемата %%(end)"
 
-#: ref-filter.c:2571
+#: ref-filter.c:2529
 #, c-format
 msgid "malformed object name %s"
 msgstr "неправилно име на обект „%s“"
 
-#: ref-filter.c:2576
+#: ref-filter.c:2534
 #, c-format
 msgid "option `%s' must point to a commit"
 msgstr "опцията „%s“ не сочи към подаване"
@@ -6476,50 +7107,50 @@
 msgid "ignoring dangling symref %s"
 msgstr "игнориране на указател на обект извън клон „%s“"
 
-#: refs.c:911
+#: refs.c:922
 #, c-format
 msgid "log for ref %s has gap after %s"
 msgstr "има пропуски в журнала с подаванията за указателя „%s“ след „%s“"
 
-#: refs.c:917
+#: refs.c:929
 #, c-format
 msgid "log for ref %s unexpectedly ended on %s"
 msgstr "журналът с подаванията за указателя „%s“ свършва неочаквано след „%s“"
 
-#: refs.c:976
+#: refs.c:994
 #, c-format
 msgid "log for %s is empty"
 msgstr "журналът с подаванията за указателя „%s“ е празен"
 
-#: refs.c:1068
+#: refs.c:1086
 #, c-format
 msgid "refusing to update ref with bad name '%s'"
 msgstr "указател не може да се обнови с грешно име „%s“"
 
-#: refs.c:1139
+#: refs.c:1157
 #, c-format
 msgid "update_ref failed for ref '%s': %s"
 msgstr "неуспешно обновяване на указателя „%s“: %s"
 
-#: refs.c:1963
+#: refs.c:2051
 #, c-format
 msgid "multiple updates for ref '%s' not allowed"
 msgstr "не са позволени повече от една промени на указателя „%s“"
 
-#: refs.c:2043
+#: refs.c:2131
 msgid "ref updates forbidden inside quarantine environment"
 msgstr "обновяванията на указатели са забранени в среди под карантина"
 
-#: refs.c:2054
+#: refs.c:2142
 msgid "ref updates aborted by hook"
 msgstr "обновяванията на указатели са преустановени от кука"
 
-#: refs.c:2154 refs.c:2184
+#: refs.c:2242 refs.c:2272
 #, c-format
 msgid "'%s' exists; cannot create '%s'"
 msgstr "„%s“ съществува, не може да се създаде „%s“"
 
-#: refs.c:2160 refs.c:2195
+#: refs.c:2248 refs.c:2283
 #, c-format
 msgid "cannot process '%s' and '%s' at the same time"
 msgstr "невъзможно е едновременно да се обработват „%s“ и „%s“"
@@ -6584,12 +7215,12 @@
 msgid "value '%s' of pattern has no '*'"
 msgstr "стойност „%s“ на шаблона не съдържа „*“"
 
-#: remote.c:1073
+#: remote.c:1083
 #, c-format
 msgid "src refspec %s does not match any"
 msgstr "указателят на версия-източник „%s“ не съвпада с никой обект"
 
-#: remote.c:1078
+#: remote.c:1088
 #, c-format
 msgid "src refspec %s matches more than one"
 msgstr "указателят на версия-източник „%s“ съвпада с повече от един обект"
@@ -6598,7 +7229,7 @@
 #. <remote> <src>:<dst>" push, and "being pushed ('%s')" is
 #. the <src>.
 #.
-#: remote.c:1093
+#: remote.c:1103
 #, c-format
 msgid ""
 "The destination you provided is not a full refname (i.e.,\n"
@@ -6622,7 +7253,7 @@
 "Никой от вариантите не сработи.  Трябва сами да укажете пълното име на\n"
 "указателя."
 
-#: remote.c:1113
+#: remote.c:1123
 #, c-format
 msgid ""
 "The <src> part of the refspec is a commit object.\n"
@@ -6633,7 +7264,7 @@
 "като\n"
 "изтласкате към „%s:refs/heads/%s“?"
 
-#: remote.c:1118
+#: remote.c:1128
 #, c-format
 msgid ""
 "The <src> part of the refspec is a tag object.\n"
@@ -6644,7 +7275,7 @@
 "като\n"
 "изтласкате към „%s:refs/tags/%s“?"
 
-#: remote.c:1123
+#: remote.c:1133
 #, c-format
 msgid ""
 "The <src> part of the refspec is a tree object.\n"
@@ -6654,7 +7285,7 @@
 "ИЗТОЧНИКът е обект-дърво.  Не целите ли всъщност да създадете нов клон като\n"
 "изтласкате към „%s:refs/tags/%s“?"
 
-#: remote.c:1128
+#: remote.c:1138
 #, c-format
 msgid ""
 "The <src> part of the refspec is a blob object.\n"
@@ -6664,118 +7295,118 @@
 "ИЗТОЧНИКът е обект-BLOB.  Не целите ли всъщност да създадете нов клон като\n"
 "изтласкате към „%s:refs/tags/%s“?"
 
-#: remote.c:1164
+#: remote.c:1174
 #, c-format
 msgid "%s cannot be resolved to branch"
 msgstr "не е открит клон съответстващ на „%s“"
 
-#: remote.c:1175
+#: remote.c:1185
 #, c-format
 msgid "unable to delete '%s': remote ref does not exist"
 msgstr "„%s“ не може да се изтрие: отдалечения указател не съществува"
 
-#: remote.c:1187
+#: remote.c:1197
 #, c-format
 msgid "dst refspec %s matches more than one"
 msgstr "указателят на версия-цел „%s“ съвпада с повече от един обект"
 
-#: remote.c:1194
+#: remote.c:1204
 #, c-format
 msgid "dst ref %s receives from more than one src"
 msgstr ""
 "указателят на версия-цел „%s“ съответства и ще получава от повече от един "
 "източник"
 
-#: remote.c:1714 remote.c:1815
+#: remote.c:1724 remote.c:1825
 msgid "HEAD does not point to a branch"
 msgstr "Указателят „HEAD“ не сочи към клон"
 
-#: remote.c:1723
+#: remote.c:1733
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "няма клон на име „%s“"
 
-#: remote.c:1726
+#: remote.c:1736
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "не е зададен клон-източник за клона „%s“"
 
-#: remote.c:1732
+#: remote.c:1742
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "клонът-източник „%s“ не е съхранен като следящ клон"
 
-#: remote.c:1747
+#: remote.c:1757
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
 "липсва локален следящ клон за местоположението за изтласкване „%s“ в "
 "хранилището „%s“"
 
-#: remote.c:1759
+#: remote.c:1769
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "няма информация клонът „%s“ да следи някой друг"
 
-#: remote.c:1769
+#: remote.c:1779
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "указателят за изтласкване на „%s“ не включва „%s“"
 
-#: remote.c:1782
+#: remote.c:1792
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "указателят за изтласкване не включва цел („push.default“ е „nothing“)"
 
-#: remote.c:1804
+#: remote.c:1814
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "простото (simple) изтласкване не съответства на една цел"
 
-#: remote.c:1933
+#: remote.c:1943
 #, c-format
 msgid "couldn't find remote ref %s"
 msgstr "отдалеченият указател „%s“ не може да бъде открит"
 
-#: remote.c:1946
+#: remote.c:1956
 #, c-format
 msgid "* Ignoring funny ref '%s' locally"
 msgstr "• прескачане на неочаквания локален указател „%s“"
 
-#: remote.c:2109
+#: remote.c:2119
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "Този клон следи „%s“, но следеният клон е изтрит.\n"
 
-#: remote.c:2113
+#: remote.c:2123
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (за да коригирате това, използвайте „git branch --unset-upstream“)\n"
 
-#: remote.c:2116
+#: remote.c:2126
 #, c-format
 msgid "Your branch is up to date with '%s'.\n"
 msgstr "Клонът е обновен към „%s“.\n"
 
-#: remote.c:2120
+#: remote.c:2130
 #, c-format
 msgid "Your branch and '%s' refer to different commits.\n"
 msgstr "Клонът ви и „%s“ сочат към различни подавания.\n"
 
-#: remote.c:2123
+#: remote.c:2133
 #, c-format
 msgid "  (use \"%s\" for details)\n"
 msgstr "  (за повече информация ползвайте „%s“)\n"
 
-#: remote.c:2127
+#: remote.c:2137
 #, 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:2133
+#: remote.c:2143
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (публикувайте локалните си промени чрез „git push“)\n"
 
-#: remote.c:2136
+#: remote.c:2146
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -6783,11 +7414,11 @@
 msgstr[0] "Клонът ви е с %2$d подаване зад „%1$s“ и може да бъде превъртян.\n"
 msgstr[1] "Клонът ви е с %2$d подавания зад „%1$s“ и може да бъде превъртян.\n"
 
-#: remote.c:2144
+#: remote.c:2154
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (обновете локалния си клон чрез „git pull“)\n"
 
-#: remote.c:2147
+#: remote.c:2157
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -6802,11 +7433,11 @@
 "Текущият клон се е отделил от „%s“,\n"
 "двата имат съответно по %d и %d несъвпадащи подавания.\n"
 
-#: remote.c:2157
+#: remote.c:2167
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (слейте отдалечения клон в локалния чрез „git pull“)\n"
 
-#: remote.c:2349
+#: remote.c:2359
 #, c-format
 msgid "cannot parse expected object name '%s'"
 msgstr "очакваното име на обект „%s“ не може да бъде анализирано"
@@ -6826,99 +7457,99 @@
 msgid "replace depth too high for object %s"
 msgstr "дълбочината на замяна е прекалено голяма за обекта: „%s“"
 
-#: rerere.c:217 rerere.c:226 rerere.c:229
+#: rerere.c:201 rerere.c:210 rerere.c:213
 msgid "corrupt MERGE_RR"
 msgstr "повреден „MERGE_RR“ (запис за коригиране на конфликт)"
 
-#: rerere.c:264 rerere.c:269
+#: rerere.c:248 rerere.c:253
 msgid "unable to write rerere record"
 msgstr "приложеното коригиране на конфликт не може да бъде записано"
 
-#: rerere.c:495
+#: rerere.c:479
 #, c-format
 msgid "there were errors while writing '%s' (%s)"
 msgstr "грешки при записването на „%s“ (%s)"
 
-#: rerere.c:498
+#: rerere.c:482
 #, c-format
 msgid "failed to flush '%s'"
 msgstr "грешка при изчистването на буферите при записването на „%s“"
 
-#: rerere.c:503 rerere.c:1039
+#: rerere.c:487 rerere.c:1023
 #, c-format
 msgid "could not parse conflict hunks in '%s'"
 msgstr "парчетата с конфликти в „%s“ не може да се анализират"
 
-#: rerere.c:684
+#: rerere.c:668
 #, c-format
 msgid "failed utime() on '%s'"
 msgstr "неуспешно задаване на време на достъп/създаване чрез „utime“ на „%s“"
 
-#: rerere.c:694
+#: rerere.c:678
 #, c-format
 msgid "writing '%s' failed"
 msgstr "неуспешен запис на „%s“"
 
-#: rerere.c:714
+#: rerere.c:698
 #, c-format
 msgid "Staged '%s' using previous resolution."
 msgstr ""
 "„%s“ е добавен към индекса с преизползване на запазена корекция при сливане"
 
-#: rerere.c:753
+#: rerere.c:737
 #, c-format
 msgid "Recorded resolution for '%s'."
 msgstr "Корекцията на конфликта при сливане на „%s“ е запазена."
 
-#: rerere.c:788
+#: rerere.c:772
 #, c-format
 msgid "Resolved '%s' using previous resolution."
 msgstr ""
 "Конфликтът при сливане на „%s“ е коригиран с преизползване на предишна "
 "корекция."
 
-#: rerere.c:803
+#: rerere.c:787
 #, c-format
 msgid "cannot unlink stray '%s'"
 msgstr "излишният обект „%s“ не може да се изтрие"
 
-#: rerere.c:807
+#: rerere.c:791
 #, c-format
 msgid "Recorded preimage for '%s'"
 msgstr "Предварителният вариант на „%s“ е запазен"
 
-#: rerere.c:881 submodule.c:2082 builtin/log.c:1992
+#: rerere.c:865 submodule.c:2088 builtin/log.c:1991
 #: builtin/submodule--helper.c:1878 builtin/submodule--helper.c:1890
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "Директорията „%s“ не може да бъде създадена"
 
-#: rerere.c:1057
+#: rerere.c:1041
 #, c-format
 msgid "failed to update conflicted state in '%s'"
 msgstr "конфликтът в „%s“ не може да се обнови"
 
-#: rerere.c:1068 rerere.c:1075
+#: rerere.c:1052 rerere.c:1059
 #, c-format
 msgid "no remembered resolution for '%s'"
 msgstr "липсва запазена корекция на конфликт при „%s“"
 
-#: rerere.c:1077
+#: rerere.c:1061
 #, c-format
 msgid "cannot unlink '%s'"
 msgstr "„%s“ не може да се изтрие"
 
-#: rerere.c:1087
+#: rerere.c:1071
 #, c-format
 msgid "Updated preimage for '%s'"
 msgstr "Предварителният вариант на „%s“ е обновен"
 
-#: rerere.c:1096
+#: rerere.c:1080
 #, c-format
 msgid "Forgot resolution for '%s'\n"
 msgstr "Запазената корекция на конфликт при „%s“ е премахната\n"
 
-#: rerere.c:1199
+#: rerere.c:1191
 msgid "unable to open rr-cache directory"
 msgstr "директорията „rr-cache“ не може да се отвори"
 
@@ -6926,45 +7557,40 @@
 msgid "could not determine HEAD revision"
 msgstr "не може да се определи към какво да сочи указателят „HEAD“"
 
-#: reset.c:70 reset.c:76 sequencer.c:3460
+#: reset.c:70 reset.c:76 sequencer.c:3468
 #, c-format
 msgid "failed to find tree of %s"
 msgstr "дървото, сочено от „%s“, не може да бъде открито"
 
-#: revision.c:2336
+#: revision.c:2338
 msgid "--unpacked=<packfile> no longer supported"
 msgstr "опцията „--unpacked=ПАКЕТЕН_ФАЙЛ“ вече не се поддържа"
 
-#: revision.c:2356
-#, c-format
-msgid "unknown value for --diff-merges: %s"
-msgstr "непозната стойност за опцията „--diff-merges“: „%s“"
-
-#: revision.c:2694
+#: revision.c:2668
 msgid "your current branch appears to be broken"
 msgstr "Текущият клон е повреден"
 
-#: revision.c:2697
+#: revision.c:2671
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "Текущият клон „%s“ е без подавания "
 
-#: revision.c:2907
+#: revision.c:2877
 msgid "-L does not yet support diff formats besides -p and -s"
 msgstr ""
 "опцията „-L“ поддържа единствено форматирането на разликите според опциите „-"
 "p“ и „-s“"
 
-#: run-command.c:764
+#: run-command.c:767
 msgid "open /dev/null failed"
 msgstr "неуспешно отваряне на „/dev/null“"
 
-#: run-command.c:1271
+#: run-command.c:1274
 #, c-format
 msgid "cannot create async thread: %s"
 msgstr "не може да се създаде асинхронна нишка: %s"
 
-#: run-command.c:1335
+#: run-command.c:1338
 #, c-format
 msgid ""
 "The '%s' hook was ignored because it's not set as executable.\n"
@@ -7030,7 +7656,7 @@
 msgid "could not delete '%s'"
 msgstr "„%s“ не може да бъде изтрит"
 
-#: sequencer.c:343 builtin/rebase.c:755 builtin/rebase.c:1596 builtin/rm.c:385
+#: sequencer.c:343 builtin/rebase.c:757 builtin/rebase.c:1602 builtin/rm.c:385
 #, c-format
 msgid "could not remove '%s'"
 msgstr "„%s“ не може да бъде изтрит"
@@ -7070,13 +7696,13 @@
 "пътища с „git add ПЪТ…“ или „git rm ПЪТ…“, след което\n"
 "подайте резултата с командата „git commit'“."
 
-#: sequencer.c:434 sequencer.c:3062
+#: sequencer.c:434 sequencer.c:3070
 #, c-format
 msgid "could not lock '%s'"
 msgstr "„%s“ не може да се заключи"
 
-#: sequencer.c:436 sequencer.c:2861 sequencer.c:3066 sequencer.c:3080
-#: sequencer.c:3337 sequencer.c:5326 strbuf.c:1168 wrapper.c:631
+#: sequencer.c:436 sequencer.c:2869 sequencer.c:3074 sequencer.c:3088
+#: sequencer.c:3345 sequencer.c:5334 strbuf.c:1168 wrapper.c:631
 #, c-format
 msgid "could not write to '%s'"
 msgstr "в „%s“ не може да се пише"
@@ -7086,8 +7712,8 @@
 msgid "could not write eol to '%s'"
 msgstr "краят на ред не може да се запише в „%s“"
 
-#: sequencer.c:446 sequencer.c:2866 sequencer.c:3068 sequencer.c:3082
-#: sequencer.c:3345
+#: sequencer.c:446 sequencer.c:2874 sequencer.c:3076 sequencer.c:3090
+#: sequencer.c:3353
 #, c-format
 msgid "failed to finalize '%s'"
 msgstr "„%s“ не може да се завърши"
@@ -7106,7 +7732,7 @@
 msgid "%s: fast-forward"
 msgstr "%s: превъртане"
 
-#: sequencer.c:560 builtin/tag.c:566
+#: sequencer.c:560 builtin/tag.c:598
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Несъществуващ режим на изчистване „%s“"
@@ -7119,60 +7745,60 @@
 msgid "%s: Unable to write new index file"
 msgstr "%s: новият индекс не може да бъде запазен"
 
-#: sequencer.c:687
+#: sequencer.c:684
 msgid "unable to update cache tree"
 msgstr "дървото на кеша не може да бъде обновено"
 
-#: sequencer.c:701
+#: sequencer.c:698
 msgid "could not resolve HEAD commit"
 msgstr "подаването, сочено от указателя „HEAD“, не може да бъде открито"
 
-#: sequencer.c:781
+#: sequencer.c:778
 #, c-format
 msgid "no key present in '%.*s'"
 msgstr "в „%.*s“ няма ключове"
 
-#: sequencer.c:792
+#: sequencer.c:789
 #, c-format
 msgid "unable to dequote value of '%s'"
 msgstr "цитирането на стойността на „%s“ не може да бъде изчистено"
 
-#: sequencer.c:829 wrapper.c:201 wrapper.c:371 builtin/am.c:710
-#: builtin/am.c:802 builtin/merge.c:1135 builtin/rebase.c:908
+#: sequencer.c:826 wrapper.c:201 wrapper.c:371 builtin/am.c:710
+#: builtin/am.c:802 builtin/merge.c:1136 builtin/rebase.c:910
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "файлът не може да бъде прочетен: „%s“"
 
-#: sequencer.c:839
+#: sequencer.c:836
 msgid "'GIT_AUTHOR_NAME' already given"
 msgstr "настройката за автор „GIT_AUTHOR_NAME“ вече е зададена"
 
-#: sequencer.c:844
+#: sequencer.c:841
 msgid "'GIT_AUTHOR_EMAIL' already given"
 msgstr "настройката за е-поща „GIT_AUTHOR_EMAIL“ вече е зададена"
 
-#: sequencer.c:849
+#: sequencer.c:846
 msgid "'GIT_AUTHOR_DATE' already given"
 msgstr "настройката за дата „GIT_AUTHOR_DATE“ вече е зададена"
 
-#: sequencer.c:853
+#: sequencer.c:850
 #, c-format
 msgid "unknown variable '%s'"
 msgstr "непозната променлива „%s“"
 
-#: sequencer.c:858
+#: sequencer.c:855
 msgid "missing 'GIT_AUTHOR_NAME'"
 msgstr "настройката за автор „GIT_AUTHOR_NAME“ липсва"
 
-#: sequencer.c:860
+#: sequencer.c:857
 msgid "missing 'GIT_AUTHOR_EMAIL'"
 msgstr "настройката за е-поща „GIT_AUTHOR_EMAIL“ липсва"
 
-#: sequencer.c:862
+#: sequencer.c:859
 msgid "missing 'GIT_AUTHOR_DATE'"
 msgstr "настройката за дата „GIT_AUTHOR_DATE“ липсва"
 
-#: sequencer.c:927
+#: sequencer.c:924
 #, c-format
 msgid ""
 "you have staged changes in your working tree\n"
@@ -7201,13 +7827,13 @@
 "\n"
 "    git rebase --continue\n"
 
-#: sequencer.c:1208
+#: sequencer.c:1211
 msgid "'prepare-commit-msg' hook failed"
 msgstr ""
 "неуспешно изпълнение на куката при промяна на съобщението при подаване "
 "(prepare-commit-msg)"
 
-#: sequencer.c:1214
+#: sequencer.c:1217
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -7236,7 +7862,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: sequencer.c:1227
+#: sequencer.c:1230
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -7262,351 +7888,351 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: sequencer.c:1269
+#: sequencer.c:1272
 msgid "couldn't look up newly created commit"
 msgstr "току що създаденото подаване не може да бъде открито"
 
-#: sequencer.c:1271
+#: sequencer.c:1274
 msgid "could not parse newly created commit"
 msgstr "току що създаденото подаване не може да бъде анализирано"
 
-#: sequencer.c:1317
+#: sequencer.c:1320
 msgid "unable to resolve HEAD after creating commit"
 msgstr ""
 "състоянието сочено от указателя „HEAD“ не може да бъде открито след "
 "подаването"
 
-#: sequencer.c:1319
+#: sequencer.c:1322
 msgid "detached HEAD"
 msgstr "несвързан връх „HEAD“"
 
-#: sequencer.c:1323
+#: sequencer.c:1326
 msgid " (root-commit)"
 msgstr " (начално подаване)"
 
-#: sequencer.c:1344
+#: sequencer.c:1347
 msgid "could not parse HEAD"
 msgstr "указателят „HEAD“ не може да бъде анализиран"
 
-#: sequencer.c:1346
+#: sequencer.c:1349
 #, c-format
 msgid "HEAD %s is not a commit!"
 msgstr "указателят „HEAD“ „%s“ сочи към нещо, което не е подаване!"
 
-#: sequencer.c:1350 sequencer.c:1425 builtin/commit.c:1577
+#: sequencer.c:1353 sequencer.c:1431 builtin/commit.c:1577
 msgid "could not parse HEAD commit"
 msgstr "върховото подаване „HEAD“ не може да бъде прочетено"
 
-#: sequencer.c:1403 sequencer.c:2100
+#: sequencer.c:1409 sequencer.c:2108
 msgid "unable to parse commit author"
 msgstr "авторът на подаването не може да бъде анализиран"
 
-#: sequencer.c:1414 builtin/am.c:1566 builtin/merge.c:701
+#: sequencer.c:1420 builtin/am.c:1566 builtin/merge.c:702
 msgid "git write-tree failed to write a tree"
 msgstr "Командата „git write-tree“ не успя да запише обект-дърво"
 
-#: sequencer.c:1447 sequencer.c:1565
+#: sequencer.c:1453 sequencer.c:1573
 #, c-format
 msgid "unable to read commit message from '%s'"
 msgstr "съобщението за подаване не може да бъде прочетено от „%s“"
 
-#: sequencer.c:1476 sequencer.c:1508
+#: sequencer.c:1484 sequencer.c:1516
 #, c-format
 msgid "invalid author identity '%s'"
 msgstr "неправилна самоличност за автор: „%s“"
 
-#: sequencer.c:1482
+#: sequencer.c:1490
 msgid "corrupt author: missing date information"
 msgstr "повредена информация за автор: липсва дата"
 
-#: sequencer.c:1521 builtin/am.c:1593 builtin/commit.c:1678 builtin/merge.c:904
-#: builtin/merge.c:929 t/helper/test-fast-rebase.c:78
+#: sequencer.c:1529 builtin/am.c:1593 builtin/commit.c:1678 builtin/merge.c:905
+#: builtin/merge.c:930 t/helper/test-fast-rebase.c:78
 msgid "failed to write commit object"
 msgstr "обектът за подаването не може да бъде записан"
 
-#: sequencer.c:1548 sequencer.c:4283 t/helper/test-fast-rebase.c:198
+#: sequencer.c:1556 sequencer.c:4291 t/helper/test-fast-rebase.c:198
 #, c-format
 msgid "could not update %s"
 msgstr "„%s“ не може да се обнови"
 
-#: sequencer.c:1597
+#: sequencer.c:1605
 #, c-format
 msgid "could not parse commit %s"
 msgstr "подаването „%s“ не може да бъде анализирано"
 
-#: sequencer.c:1602
+#: sequencer.c:1610
 #, c-format
 msgid "could not parse parent commit %s"
 msgstr "родителското подаване „%s“ не може да бъде анализирано"
 
-#: sequencer.c:1685 sequencer.c:1796
+#: sequencer.c:1693 sequencer.c:1804
 #, c-format
 msgid "unknown command: %d"
 msgstr "непозната команда: %d"
 
-#: sequencer.c:1743 sequencer.c:1768
+#: sequencer.c:1751 sequencer.c:1776
 #, c-format
 msgid "This is a combination of %d commits."
 msgstr "Това е обединение от %d подавания"
 
-#: sequencer.c:1753
+#: sequencer.c:1761
 msgid "need a HEAD to fixup"
 msgstr "За вкарване в предходното подаване ви трябва указател „HEAD“"
 
-#: sequencer.c:1755 sequencer.c:3372
+#: sequencer.c:1763 sequencer.c:3380
 msgid "could not read HEAD"
 msgstr "указателят „HEAD“ не може да се прочете"
 
-#: sequencer.c:1757
+#: sequencer.c:1765
 msgid "could not read HEAD's commit message"
 msgstr ""
 "съобщението за подаване към указателя „HEAD“ не може да бъде прочетено: %s"
 
-#: sequencer.c:1763
+#: sequencer.c:1771
 #, c-format
 msgid "cannot write '%s'"
 msgstr "„%s“ не може да се запази"
 
-#: sequencer.c:1770 git-rebase--preserve-merges.sh:486
+#: sequencer.c:1778 git-rebase--preserve-merges.sh:486
 msgid "This is the 1st commit message:"
 msgstr "Това е 1-то съобщение при подаване:"
 
-#: sequencer.c:1778
+#: sequencer.c:1786
 #, c-format
 msgid "could not read commit message of %s"
 msgstr "съобщението за подаване към „%s“ не може да бъде прочетено"
 
-#: sequencer.c:1785
+#: sequencer.c:1793
 #, c-format
 msgid "This is the commit message #%d:"
 msgstr "Това е съобщение при подаване №%d:"
 
-#: sequencer.c:1791
+#: sequencer.c:1799
 #, c-format
 msgid "The commit message #%d will be skipped:"
 msgstr "Съобщение при подаване №%d ще бъде прескочено:"
 
-#: sequencer.c:1879
+#: sequencer.c:1887
 msgid "your index file is unmerged."
 msgstr "индексът не е слят."
 
-#: sequencer.c:1886
+#: sequencer.c:1894
 msgid "cannot fixup root commit"
 msgstr "началното подаване не може да се вкара в предходното му"
 
-#: sequencer.c:1905
+#: sequencer.c:1913
 #, c-format
 msgid "commit %s is a merge but no -m option was given."
 msgstr "подаването „%s“ е сливане, но не е дадена опцията „-m“"
 
-#: sequencer.c:1913 sequencer.c:1921
+#: sequencer.c:1921 sequencer.c:1929
 #, c-format
 msgid "commit %s does not have parent %d"
 msgstr "подаването „%s“ няма родител %d"
 
-#: sequencer.c:1927
+#: sequencer.c:1935
 #, c-format
 msgid "cannot get commit message for %s"
 msgstr "неуспешно извличане на съобщението за подаване на „%s“"
 
 #. TRANSLATORS: The first %s will be a "todo" command like
 #. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:1946
+#: sequencer.c:1954
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s: неразпозната стойност за родителското подаване „%s“"
 
-#: sequencer.c:2011
+#: sequencer.c:2019
 #, c-format
 msgid "could not rename '%s' to '%s'"
 msgstr "„%s“ не може да се преименува на „%s“"
 
-#: sequencer.c:2071
+#: sequencer.c:2079
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "подаването „%s“… не може да бъде отменено: „%s“"
 
-#: sequencer.c:2072
+#: sequencer.c:2080
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "подаването „%s“… не може да бъде приложено: „%s“"
 
-#: sequencer.c:2092
+#: sequencer.c:2100
 #, c-format
 msgid "dropping %s %s -- patch contents already upstream\n"
 msgstr "прескачане на %s %s — кръпката вече е приложена\n"
 
-#: sequencer.c:2150
+#: sequencer.c:2158
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: неуспешно изчитане на индекса"
 
-#: sequencer.c:2157
+#: sequencer.c:2165
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: неуспешно обновяване на индекса"
 
-#: sequencer.c:2234
+#: sequencer.c:2242
 #, c-format
 msgid "%s does not accept arguments: '%s'"
 msgstr "„%s“ не приема аргументи: „%s“"
 
-#: sequencer.c:2243
+#: sequencer.c:2251
 #, c-format
 msgid "missing arguments for %s"
 msgstr "„%s“ изисква аргументи"
 
-#: sequencer.c:2274
+#: sequencer.c:2282
 #, c-format
 msgid "could not parse '%s'"
 msgstr "„%s“ не може да се анализира"
 
-#: sequencer.c:2335
+#: sequencer.c:2343
 #, c-format
 msgid "invalid line %d: %.*s"
 msgstr "неправилен ред %d: %.*s"
 
-#: sequencer.c:2346
+#: sequencer.c:2354
 #, c-format
 msgid "cannot '%s' without a previous commit"
 msgstr "Без предишно подаване не може да се изпълни „%s“"
 
-#: sequencer.c:2432
+#: sequencer.c:2440
 msgid "cancelling a cherry picking in progress"
 msgstr "преустановяване на извършваното в момента отбиране на подавания"
 
-#: sequencer.c:2441
+#: sequencer.c:2449
 msgid "cancelling a revert in progress"
 msgstr "преустановяване на извършваното в момента отмяна на подаване"
 
-#: sequencer.c:2485
+#: sequencer.c:2493
 msgid "please fix this using 'git rebase --edit-todo'."
 msgstr "коригирайте това чрез „git rebase --edit-todo“."
 
-#: sequencer.c:2487
+#: sequencer.c:2495
 #, c-format
 msgid "unusable instruction sheet: '%s'"
 msgstr "неизползваем файл с описание на предстоящите действия: „%s“"
 
-#: sequencer.c:2492
+#: sequencer.c:2500
 msgid "no commits parsed."
 msgstr "никое от подаванията не може да се разпознае."
 
-#: sequencer.c:2503
+#: sequencer.c:2511
 msgid "cannot cherry-pick during a revert."
 msgstr ""
 "по време на отмяна на подаване не може да се извърши отбиране на подаване."
 
-#: sequencer.c:2505
+#: sequencer.c:2513
 msgid "cannot revert during a cherry-pick."
 msgstr "по време на отбиране не може да се извърши отмяна на подаване."
 
-#: sequencer.c:2583
+#: sequencer.c:2591
 #, c-format
 msgid "invalid value for %s: %s"
 msgstr "неправилна стойност за „%s“: „%s“"
 
-#: sequencer.c:2690
+#: sequencer.c:2698
 msgid "unusable squash-onto"
 msgstr "подаването, в което другите да се вкарат, не може да се използва"
 
-#: sequencer.c:2710
+#: sequencer.c:2718
 #, c-format
 msgid "malformed options sheet: '%s'"
 msgstr "неправилен файл с опции: „%s“"
 
-#: sequencer.c:2803 sequencer.c:4636
+#: sequencer.c:2811 sequencer.c:4644
 msgid "empty commit set passed"
 msgstr "зададено е празно множество от подавания"
 
-#: sequencer.c:2820
+#: sequencer.c:2828
 msgid "revert is already in progress"
 msgstr "в момента вече се извършва отмяна на подавания"
 
-#: sequencer.c:2822
+#: sequencer.c:2830
 #, c-format
 msgid "try \"git revert (--continue | %s--abort | --quit)\""
 msgstr "използвайте „git cherry-pick (--continue | %s--abort | --quit)“"
 
-#: sequencer.c:2825
+#: sequencer.c:2833
 msgid "cherry-pick is already in progress"
 msgstr "в момента вече се извършва отбиране на подавания"
 
-#: sequencer.c:2827
+#: sequencer.c:2835
 #, c-format
 msgid "try \"git cherry-pick (--continue | %s--abort | --quit)\""
 msgstr "използвайте „git cherry-pick (--continue | %s--abort | --quit)“"
 
-#: sequencer.c:2841
+#: sequencer.c:2849
 #, c-format
 msgid "could not create sequencer directory '%s'"
 msgstr ""
 "директорията за определянето на последователността „%s“ не може да бъде "
 "създадена"
 
-#: sequencer.c:2856
+#: sequencer.c:2864
 msgid "could not lock HEAD"
 msgstr "указателят „HEAD“ не може да се заключи"
 
-#: sequencer.c:2916 sequencer.c:4371
+#: sequencer.c:2924 sequencer.c:4379
 msgid "no cherry-pick or revert in progress"
 msgstr ""
 "в момента не се извършва отбиране на подавания или пребазиране на клона"
 
-#: sequencer.c:2918 sequencer.c:2929
+#: sequencer.c:2926 sequencer.c:2937
 msgid "cannot resolve HEAD"
 msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито"
 
-#: sequencer.c:2920 sequencer.c:2964
+#: sequencer.c:2928 sequencer.c:2972
 msgid "cannot abort from a branch yet to be born"
 msgstr ""
 "действието не може да бъде преустановено, когато сте на клон, който тепърва "
 "предстои да бъде създаден"
 
-#: sequencer.c:2950 builtin/grep.c:756
+#: sequencer.c:2958 builtin/grep.c:757
 #, c-format
 msgid "cannot open '%s'"
 msgstr "„%s“ не може да бъде отворен"
 
-#: sequencer.c:2952
+#: sequencer.c:2960
 #, c-format
 msgid "cannot read '%s': %s"
 msgstr "„%s“ не може да бъде прочетен: %s"
 
-#: sequencer.c:2953
+#: sequencer.c:2961
 msgid "unexpected end of file"
 msgstr "неочакван край на файл"
 
-#: sequencer.c:2959
+#: sequencer.c:2967
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr ""
 "запазеният преди започването на отбирането файл за указателя „HEAD“ — „%s“ е "
 "повреден"
 
-#: sequencer.c:2970
+#: sequencer.c:2978
 msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
 msgstr ""
 "Изглежда указателят „HEAD“ е променен.  Проверете към какво сочи.\n"
 "Не се правят промени."
 
-#: sequencer.c:3011
+#: sequencer.c:3019
 msgid "no revert in progress"
 msgstr "в момента не тече пребазиране"
 
-#: sequencer.c:3020
+#: sequencer.c:3028
 msgid "no cherry-pick in progress"
 msgstr "в момента не се извършва отбиране на подавания"
 
-#: sequencer.c:3030
+#: sequencer.c:3038
 msgid "failed to skip the commit"
 msgstr "неуспешно прескачане на подаването"
 
-#: sequencer.c:3037
+#: sequencer.c:3045
 msgid "there is nothing to skip"
 msgstr "няма какво да се прескочи"
 
-#: sequencer.c:3040
+#: sequencer.c:3048
 #, c-format
 msgid ""
 "have you committed already?\n"
@@ -7616,16 +8242,16 @@
 "\n"
 "    git %s --continue"
 
-#: sequencer.c:3202 sequencer.c:4263
+#: sequencer.c:3210 sequencer.c:4271
 msgid "cannot read HEAD"
 msgstr "указателят „HEAD“ не може да бъде прочетен"
 
-#: sequencer.c:3219
+#: sequencer.c:3227
 #, c-format
 msgid "unable to copy '%s' to '%s'"
 msgstr "„%s“ не може да се копира като „%s“"
 
-#: sequencer.c:3227
+#: sequencer.c:3235
 #, c-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -7644,27 +8270,27 @@
 "\n"
 "    git rebase --continue\n"
 
-#: sequencer.c:3237
+#: sequencer.c:3245
 #, c-format
 msgid "Could not apply %s... %.*s"
 msgstr "Подаването „%s“… не може да бъде приложено: „%.*s“"
 
-#: sequencer.c:3244
+#: sequencer.c:3252
 #, c-format
 msgid "Could not merge %.*s"
 msgstr "Невъзможно сливане на „%.*s“"
 
-#: sequencer.c:3258 sequencer.c:3262 builtin/difftool.c:640
+#: sequencer.c:3266 sequencer.c:3270 builtin/difftool.c:640
 #, c-format
 msgid "could not copy '%s' to '%s'"
 msgstr "„%s“ не може да се копира като „%s“"
 
-#: sequencer.c:3274
+#: sequencer.c:3282
 #, c-format
 msgid "Executing: %s\n"
 msgstr "В момента се изпълнява: %s\n"
 
-#: sequencer.c:3289
+#: sequencer.c:3297
 #, c-format
 msgid ""
 "execution failed: %s\n"
@@ -7679,11 +8305,11 @@
 "    git rebase --continue\n"
 "\n"
 
-#: sequencer.c:3295
+#: sequencer.c:3303
 msgid "and made changes to the index and/or the working tree\n"
 msgstr "и променѝ индекса и/или работното дърво\n"
 
-#: sequencer.c:3301
+#: sequencer.c:3309
 #, c-format
 msgid ""
 "execution succeeded: %s\n"
@@ -7700,90 +8326,90 @@
 "    git rebase --continue\n"
 "\n"
 
-#: sequencer.c:3362
+#: sequencer.c:3370
 #, c-format
 msgid "illegal label name: '%.*s'"
 msgstr "неправилно име на етикет: „%.*s“"
 
-#: sequencer.c:3416
+#: sequencer.c:3424
 msgid "writing fake root commit"
 msgstr "запазване на фалшиво начално подаване"
 
-#: sequencer.c:3421
+#: sequencer.c:3429
 msgid "writing squash-onto"
 msgstr "запазване на подаването, в което другите да се вкарат"
 
-#: sequencer.c:3505
+#: sequencer.c:3513
 #, c-format
 msgid "could not resolve '%s'"
 msgstr "„%s“ не може да бъде открит"
 
-#: sequencer.c:3538
+#: sequencer.c:3546
 msgid "cannot merge without a current revision"
 msgstr "без текущо подаване не може да се слива"
 
-#: sequencer.c:3560
+#: sequencer.c:3568
 #, c-format
 msgid "unable to parse '%.*s'"
 msgstr "„%.*s“ не може да се анализира"
 
-#: sequencer.c:3569
+#: sequencer.c:3577
 #, c-format
 msgid "nothing to merge: '%.*s'"
 msgstr "няма нищо за сливане: „%.*s“"
 
-#: sequencer.c:3581
+#: sequencer.c:3589
 msgid "octopus merge cannot be executed on top of a [new root]"
 msgstr "върху начално подаване не може да се извърши множествено сливане"
 
-#: sequencer.c:3597
+#: sequencer.c:3605
 #, c-format
 msgid "could not get commit message of '%s'"
 msgstr "съобщението за подаване към „%s“ не може да бъде получено"
 
-#: sequencer.c:3780
+#: sequencer.c:3788
 #, c-format
 msgid "could not even attempt to merge '%.*s'"
 msgstr "сливането на „%.*s“ не може даже да започне"
 
-#: sequencer.c:3796
+#: sequencer.c:3804
 msgid "merge: Unable to write new index file"
 msgstr "сливане: новият индекс не може да бъде запазен"
 
-#: sequencer.c:3870
+#: sequencer.c:3878
 msgid "Cannot autostash"
 msgstr "Не може да се скатае автоматично"
 
-#: sequencer.c:3873
+#: sequencer.c:3881
 #, c-format
 msgid "Unexpected stash response: '%s'"
 msgstr "Неочакван резултат при скатаване: „%s“"
 
-#: sequencer.c:3879
+#: sequencer.c:3887
 #, c-format
 msgid "Could not create directory for '%s'"
 msgstr "Директорията за „%s“ не може да бъде създадена"
 
-#: sequencer.c:3882
+#: sequencer.c:3890
 #, c-format
 msgid "Created autostash: %s\n"
 msgstr "Автоматично скатано: „%s“\n"
 
-#: sequencer.c:3886
+#: sequencer.c:3894
 msgid "could not reset --hard"
 msgstr "неуспешно изпълнение на „git reset --hard“"
 
-#: sequencer.c:3911
+#: sequencer.c:3919
 #, c-format
 msgid "Applied autostash.\n"
 msgstr "Автоматично скатаното е приложено.\n"
 
-#: sequencer.c:3923
+#: sequencer.c:3931
 #, c-format
 msgid "cannot store %s"
 msgstr "„%s“ не може да бъде запазен"
 
-#: sequencer.c:3926
+#: sequencer.c:3934
 #, c-format
 msgid ""
 "%s\n"
@@ -7795,29 +8421,29 @@
 "„git stash pop“ или да ги изхвърлите чрез „git stash drop“, когато "
 "поискате.\n"
 
-#: sequencer.c:3931
+#: sequencer.c:3939
 msgid "Applying autostash resulted in conflicts."
 msgstr "Конфликти при прилагането на автоматично скатаното."
 
-#: sequencer.c:3932
+#: sequencer.c:3940
 msgid "Autostash exists; creating a new stash entry."
 msgstr "Вече има запис за автоматично скатано, затова се създава нов запис."
 
-#: sequencer.c:4025 git-rebase--preserve-merges.sh:769
+#: sequencer.c:4033 git-rebase--preserve-merges.sh:769
 msgid "could not detach HEAD"
 msgstr "указателят „HEAD“ не може да се отдели"
 
-#: sequencer.c:4040
+#: sequencer.c:4048
 #, c-format
 msgid "Stopped at HEAD\n"
 msgstr "Бе спряно при „HEAD“\n"
 
-#: sequencer.c:4042
+#: sequencer.c:4050
 #, c-format
 msgid "Stopped at %s\n"
 msgstr "Бе спряно при „%s“\n"
 
-#: sequencer.c:4050
+#: sequencer.c:4058
 #, c-format
 msgid ""
 "Could not execute the todo command\n"
@@ -7840,58 +8466,58 @@
 "    git rebase --edit-todo\n"
 "    git rebase --continue\n"
 
-#: sequencer.c:4096
+#: sequencer.c:4104
 #, c-format
 msgid "Rebasing (%d/%d)%s"
 msgstr "Пребазиране (%d/%d)%s"
 
-#: sequencer.c:4141
+#: sequencer.c:4149
 #, c-format
 msgid "Stopped at %s...  %.*s\n"
 msgstr "Спиране при „%s“…  %.*s\n"
 
-#: sequencer.c:4212
+#: sequencer.c:4220
 #, c-format
 msgid "unknown command %d"
 msgstr "непозната команда %d"
 
-#: sequencer.c:4271
+#: sequencer.c:4279
 msgid "could not read orig-head"
 msgstr "указателят за „orig-head“ не може да се прочете"
 
-#: sequencer.c:4276
+#: sequencer.c:4284
 msgid "could not read 'onto'"
 msgstr "указателят за „onto“ не може да се прочете"
 
-#: sequencer.c:4290
+#: sequencer.c:4298
 #, c-format
 msgid "could not update HEAD to %s"
 msgstr "„HEAD“ не може да бъде обновен до „%s“"
 
-#: sequencer.c:4350
+#: sequencer.c:4358
 #, c-format
 msgid "Successfully rebased and updated %s.\n"
 msgstr "Успешно пребазиране и обновяване на „%s“.\n"
 
-#: sequencer.c:4383
+#: sequencer.c:4391
 msgid "cannot rebase: You have unstaged changes."
 msgstr "не може да пребазирате, защото има промени, които не са в индекса."
 
-#: sequencer.c:4392
+#: sequencer.c:4400
 msgid "cannot amend non-existing commit"
 msgstr "несъществуващо подаване не може да се поправи"
 
-#: sequencer.c:4394
+#: sequencer.c:4402
 #, c-format
 msgid "invalid file: '%s'"
 msgstr "неправилен файл: „%s“"
 
-#: sequencer.c:4396
+#: sequencer.c:4404
 #, c-format
 msgid "invalid contents: '%s'"
 msgstr "неправилно съдържание: „%s“"
 
-#: sequencer.c:4399
+#: sequencer.c:4407
 msgid ""
 "\n"
 "You have uncommitted changes in your working tree. Please, commit them\n"
@@ -7901,50 +8527,50 @@
 "В работното дърво има неподадени промени.  Първо ги подайте, а след това\n"
 "отново изпълнете „git rebase --continue“."
 
-#: sequencer.c:4435 sequencer.c:4474
+#: sequencer.c:4443 sequencer.c:4482
 #, c-format
 msgid "could not write file: '%s'"
 msgstr "файлът „%s“ не може да бъде записан"
 
-#: sequencer.c:4490
+#: sequencer.c:4498
 msgid "could not remove CHERRY_PICK_HEAD"
 msgstr "указателят „CHERRY_PICK_HEAD“ не може да бъде изтрит"
 
-#: sequencer.c:4497
+#: sequencer.c:4505
 msgid "could not commit staged changes."
 msgstr "промените в индекса не могат да бъдат подадени."
 
-#: sequencer.c:4613
+#: sequencer.c:4621
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s: не може да се отбере „%s“"
 
-#: sequencer.c:4617
+#: sequencer.c:4625
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s: неправилна версия"
 
-#: sequencer.c:4652
+#: sequencer.c:4660
 msgid "can't revert as initial commit"
 msgstr "първоначалното подаване не може да бъде отменено"
 
-#: sequencer.c:5129
+#: sequencer.c:5137
 msgid "make_script: unhandled options"
 msgstr "make_script: неподдържани опции"
 
-#: sequencer.c:5132
+#: sequencer.c:5140
 msgid "make_script: error preparing revisions"
 msgstr "make_script: грешка при подготовката на версии"
 
-#: sequencer.c:5374 sequencer.c:5391
+#: sequencer.c:5382 sequencer.c:5399
 msgid "nothing to do"
 msgstr "няма какво да се прави"
 
-#: sequencer.c:5410
+#: sequencer.c:5418
 msgid "could not skip unnecessary pick commands"
 msgstr "излишните команди за отбиране не бяха прескочени"
 
-#: sequencer.c:5504
+#: sequencer.c:5512
 msgid "the script was already rearranged."
 msgstr "скриптът вече е преподреден."
 
@@ -8119,368 +8745,6 @@
 msgid "setsid failed"
 msgstr "неуспешно изпълнение на „setsid“"
 
-#: sha1-file.c:480
-#, c-format
-msgid "object directory %s does not exist; check .git/objects/info/alternates"
-msgstr ""
-"директорията за обекти „%s“ не съществува, проверете „.git/objects/info/"
-"alternates“"
-
-#: sha1-file.c:531
-#, c-format
-msgid "unable to normalize alternate object path: %s"
-msgstr "алтернативният път към обекти не може да бъде нормализиран: „%s“"
-
-#: sha1-file.c:603
-#, c-format
-msgid "%s: ignoring alternate object stores, nesting too deep"
-msgstr ""
-"%s: алтернативните хранилища за обекти се пренебрегват поради прекалено "
-"дълбоко влагане"
-
-#: sha1-file.c:610
-#, c-format
-msgid "unable to normalize object directory: %s"
-msgstr "директорията за обекти „%s“ не може да бъде нормализирана"
-
-#: sha1-file.c:653
-msgid "unable to fdopen alternates lockfile"
-msgstr "заключващият файл за алтернативите не може да се отвори с „fdopen“"
-
-#: sha1-file.c:671
-msgid "unable to read alternates file"
-msgstr "файлът с алтернативите не може да бъде прочетен"
-
-#: sha1-file.c:678
-msgid "unable to move new alternates file into place"
-msgstr "новият файл с алтернативите не може да бъде преместен на мястото му"
-
-#: sha1-file.c:713
-#, c-format
-msgid "path '%s' does not exist"
-msgstr "пътят „%s“ не съществува."
-
-#: sha1-file.c:734
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr "все още не се поддържа еталонно хранилище „%s“ като свързано."
-
-#: sha1-file.c:740
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "еталонното хранилище „%s“ не е локално"
-
-#: sha1-file.c:746
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "еталонното хранилище „%s“ е плитко"
-
-#: sha1-file.c:754
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "еталонното хранилище „%s“ е с присаждане"
-
-#: sha1-file.c:814
-#, c-format
-msgid "invalid line while parsing alternate refs: %s"
-msgstr "неправилен ред при анализа на алтернативните указатели: „%s“"
-
-#: sha1-file.c:964
-#, c-format
-msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
-msgstr ""
-"неуспешен опит за „mmap“ %<PRIuMAX>, което е над позволеното %<PRIuMAX>"
-
-#: sha1-file.c:985
-msgid "mmap failed"
-msgstr "неуспешно изпълнение на „mmap“"
-
-#: sha1-file.c:1149
-#, c-format
-msgid "object file %s is empty"
-msgstr "файлът с обектите „%s“ е празен"
-
-#: sha1-file.c:1284 sha1-file.c:2477
-#, c-format
-msgid "corrupt loose object '%s'"
-msgstr "непакетираният обект „%s“ е повреден"
-
-#: sha1-file.c:1286 sha1-file.c:2481
-#, c-format
-msgid "garbage at end of loose object '%s'"
-msgstr "грешни данни в края на непакетирания обект „%s“"
-
-#: sha1-file.c:1328
-msgid "invalid object type"
-msgstr "неправилен вид обект"
-
-#: sha1-file.c:1412
-#, c-format
-msgid "unable to unpack %s header with --allow-unknown-type"
-msgstr ""
-"заглавната част „%s“ не може да се разпакетира с опцията „--allow-unknown-"
-"type“"
-
-#: sha1-file.c:1415
-#, c-format
-msgid "unable to unpack %s header"
-msgstr "заглавната част на „%s“ не може да бъде разпакетирана"
-
-#: sha1-file.c:1421
-#, c-format
-msgid "unable to parse %s header with --allow-unknown-type"
-msgstr ""
-"заглавната част „%s“ не може да се анализира с опцията „--allow-unknown-type“"
-
-#: sha1-file.c:1424
-#, c-format
-msgid "unable to parse %s header"
-msgstr "заглавната част на „%s“ не може да бъде анализирана"
-
-#: sha1-file.c:1651
-#, c-format
-msgid "failed to read object %s"
-msgstr "обектът „%s“ не може да бъде прочетен"
-
-#: sha1-file.c:1655
-#, c-format
-msgid "replacement %s not found for %s"
-msgstr "заместителят „%s“ на „%s“ не може да бъде открит"
-
-#: sha1-file.c:1659
-#, c-format
-msgid "loose object %s (stored in %s) is corrupt"
-msgstr "непакетираният обект „%s“ (в „%s“) е повреден"
-
-#: sha1-file.c:1663
-#, c-format
-msgid "packed object %s (stored in %s) is corrupt"
-msgstr "пакетираният обект „%s“ (в „%s“) е повреден"
-
-#: sha1-file.c:1768
-#, c-format
-msgid "unable to write file %s"
-msgstr "файлът „%s“ не може да бъде записан"
-
-#: sha1-file.c:1775
-#, c-format
-msgid "unable to set permission to '%s'"
-msgstr "правата за достъп до „%s“ не могат да бъдат зададени"
-
-#: sha1-file.c:1782
-msgid "file write error"
-msgstr "грешка при запис на файл"
-
-#: sha1-file.c:1802
-msgid "error when closing loose object file"
-msgstr "грешка при затварянето на файла с непакетиран обект"
-
-#: sha1-file.c:1867
-#, c-format
-msgid "insufficient permission for adding an object to repository database %s"
-msgstr ""
-"няма права за добавяне на обект към базата от данни на хранилището „%s“"
-
-#: sha1-file.c:1869
-msgid "unable to create temporary file"
-msgstr "не може да бъде създаден временен файл"
-
-#: sha1-file.c:1893
-msgid "unable to write loose object file"
-msgstr "грешка при записа на файла с непакетиран обект"
-
-#: sha1-file.c:1899
-#, c-format
-msgid "unable to deflate new object %s (%d)"
-msgstr "новият обект „%s“ не може да се компресира с „deflate“: %d"
-
-#: sha1-file.c:1903
-#, c-format
-msgid "deflateEnd on object %s failed (%d)"
-msgstr "неуспешно приключване на „deflate“ върху „%s“: %d"
-
-#: sha1-file.c:1907
-#, c-format
-msgid "confused by unstable object source data for %s"
-msgstr "грешка поради нестабилния източник данни за обектите „%s“"
-
-#: sha1-file.c:1917 builtin/pack-objects.c:1086
-#, c-format
-msgid "failed utime() on %s"
-msgstr "неуспешно задаване на време на достъп/създаване чрез „utime“ на „%s“"
-
-#: sha1-file.c:1994
-#, c-format
-msgid "cannot read object for %s"
-msgstr "обектът за „%s“ не може да се прочете"
-
-#: sha1-file.c:2045
-msgid "corrupt commit"
-msgstr "повредено подаване"
-
-#: sha1-file.c:2053
-msgid "corrupt tag"
-msgstr "повреден етикет"
-
-#: sha1-file.c:2153
-#, c-format
-msgid "read error while indexing %s"
-msgstr "грешка при четене по време на индексиране на „%s“"
-
-#: sha1-file.c:2156
-#, c-format
-msgid "short read while indexing %s"
-msgstr "непълно прочитане по време на индексиране на „%s“"
-
-#: sha1-file.c:2229 sha1-file.c:2239
-#, c-format
-msgid "%s: failed to insert into database"
-msgstr "„%s“ не може да се вмъкне в базата от данни"
-
-#: sha1-file.c:2245
-#, c-format
-msgid "%s: unsupported file type"
-msgstr "неподдържан вид файл: „%s“"
-
-#: sha1-file.c:2269
-#, c-format
-msgid "%s is not a valid object"
-msgstr "„%s“ е неправилен обект"
-
-#: sha1-file.c:2271
-#, c-format
-msgid "%s is not a valid '%s' object"
-msgstr "„%s“ е неправилен обект от вид „%s“"
-
-#: sha1-file.c:2298 builtin/index-pack.c:192
-#, c-format
-msgid "unable to open %s"
-msgstr "обектът „%s“ не може да бъде отворен"
-
-#: sha1-file.c:2488 sha1-file.c:2541
-#, c-format
-msgid "hash mismatch for %s (expected %s)"
-msgstr "неправилна контролна сума за „%s“ (трябва да е %s)"
-
-#: sha1-file.c:2512
-#, c-format
-msgid "unable to mmap %s"
-msgstr "неуспешно изпълнение на „mmap“ върху „%s“"
-
-#: sha1-file.c:2517
-#, c-format
-msgid "unable to unpack header of %s"
-msgstr "заглавната част на „%s“ не може да бъде разпакетирана"
-
-#: sha1-file.c:2523
-#, c-format
-msgid "unable to parse header of %s"
-msgstr "заглавната част на „%s“ не може да бъде анализирана"
-
-#: sha1-file.c:2534
-#, c-format
-msgid "unable to unpack contents of %s"
-msgstr "съдържанието на „%s“ не може да бъде разпакетирано"
-
-#: sha1-name.c:486
-#, c-format
-msgid "short SHA1 %s is ambiguous"
-msgstr "късият SHA1 „%s“ не е еднозначен"
-
-#: sha1-name.c:497
-msgid "The candidates are:"
-msgstr "Възможностите са:"
-
-#: sha1-name.c:796
-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 switch -c $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 никога не създава указатели, които завършват\n"
-"с 40 шестнадесетични знака, защото стандартно те ще бъдат прескачани.\n"
-"Възможно е такива указатели да са създадени случайно.  Например:\n"
-"\n"
-"    git switch -c $BRANCH $(git rev-parse …)\n"
-"\n"
-"където стойността на променливата на средата BRANCH е празна, при което\n"
-"се създава подобен указател.  Прегледайте тези указатели и ги изтрийте.\n"
-"За да изключите това съобщение, изпълнете:\n"
-"\n"
-"    git config advice.objectNameWarning false"
-
-#: sha1-name.c:916
-#, c-format
-msgid "log for '%.*s' only goes back to %s"
-msgstr "журналът за „%.*s“ стига само до „%s“"
-
-#: sha1-name.c:924
-#, c-format
-msgid "log for '%.*s' only has %d entries"
-msgstr "журналът за „%.*s“ съдържа само %d записа"
-
-#: sha1-name.c:1702
-#, c-format
-msgid "path '%s' exists on disk, but not in '%.*s'"
-msgstr "пътят „%s“ съществува на диска, но не и в „%.*s“"
-
-#: sha1-name.c:1708
-#, c-format
-msgid ""
-"path '%s' exists, but not '%s'\n"
-"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
-msgstr ""
-"пътят „%s“ съществува на диска, но не е в „%s“\n"
-"Пробвайте с „%.*s:%s“, което е същото като „%.*s:./%s“."
-
-#: sha1-name.c:1717
-#, c-format
-msgid "path '%s' does not exist in '%.*s'"
-msgstr "пътят „%s“ не съществува в „%.*s“"
-
-#: sha1-name.c:1745
-#, c-format
-msgid ""
-"path '%s' is in the index, but not at stage %d\n"
-"hint: Did you mean ':%d:%s'?"
-msgstr ""
-"пътят „%s“ е в индекса, но не версия %d\n"
-"Пробвайте с „%d:%s“."
-
-#: sha1-name.c:1761
-#, c-format
-msgid ""
-"path '%s' is in the index, but not '%s'\n"
-"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
-msgstr ""
-"пътят „%s“ е в индекса, но не в „%s“\n"
-"Пробвайте с „%d:%s“, което е същото като „%d:./%s“."
-
-#: sha1-name.c:1769
-#, c-format
-msgid "path '%s' exists on disk, but not in the index"
-msgstr "пътят „%s“ съществува на диска, но не е в индекса"
-
-#: sha1-name.c:1771
-#, c-format
-msgid "path '%s' does not exist (neither on disk nor in the index)"
-msgstr "пътят „%s“ не съществува нито на диска, нито в индекса"
-
-#: sha1-name.c:1784
-msgid "relative path syntax can't be used outside working tree"
-msgstr "относителен път не може да се ползва извън работното дърво"
-
-#: sha1-name.c:1922
-#, c-format
-msgid "invalid object name '%.*s'."
-msgstr "неправилно име на обект: „%.*s“"
-
 #. TRANSLATORS: IEC 80000-13:2008 gibibyte
 #: strbuf.c:848
 #, c-format
@@ -8534,7 +8798,7 @@
 msgstr[1] "%u байта/сек."
 
 #: strbuf.c:1166 wrapper.c:199 wrapper.c:369 builtin/am.c:719
-#: builtin/rebase.c:864
+#: builtin/rebase.c:866
 #, c-format
 msgid "could not open '%s' for writing"
 msgstr "„%s“ не може да бъде отворен за запис"
@@ -8600,12 +8864,12 @@
 msgid "Pathspec '%s' is in submodule '%.*s'"
 msgstr "Пътят „%s“ е в подмодула „%.*s“"
 
-#: submodule.c:434
+#: submodule.c:435
 #, c-format
 msgid "bad --ignore-submodules argument: %s"
 msgstr "неправилен аргумент за „--ignore-submodules“: „%s“"
 
-#: submodule.c:816
+#: submodule.c:817
 #, c-format
 msgid ""
 "Submodule in commit %s at path: '%s' collides with a submodule named the "
@@ -8614,12 +8878,12 @@
 "Подмодулът при подаване %s на пътя „%s“ е различен от другия модул със "
 "същото име, затова първият се прескача."
 
-#: submodule.c:919
+#: submodule.c:920
 #, c-format
 msgid "submodule entry '%s' (%s) is a %s, not a commit"
 msgstr "записът за подмодула „%s“ (%s) е %s, а не подаване!"
 
-#: submodule.c:1004
+#: submodule.c:1005
 #, c-format
 msgid ""
 "Could not run 'git rev-list <commits> --not --remotes -n 1' command in "
@@ -8628,36 +8892,36 @@
 "Командата „git rev-list ПОДАВАНИЯ --not --remotes -n 1“ не може да се "
 "изпълни в подмодула „%s“"
 
-#: submodule.c:1127
+#: submodule.c:1128
 #, c-format
 msgid "process for submodule '%s' failed"
 msgstr "процесът за подмодула „%s“ завърши неуспешно"
 
-#: submodule.c:1156 builtin/branch.c:680 builtin/submodule--helper.c:2469
+#: submodule.c:1157 builtin/branch.c:689 builtin/submodule--helper.c:2469
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Не може да се открие към какво сочи указателят „HEAD“"
 
-#: submodule.c:1167
+#: submodule.c:1168
 #, c-format
 msgid "Pushing submodule '%s'\n"
 msgstr "Изтласкване на подмодула „%s“\n"
 
-#: submodule.c:1170
+#: submodule.c:1171
 #, c-format
 msgid "Unable to push submodule '%s'\n"
 msgstr "Подмодулът „%s“ не може да бъде изтласкан\n"
 
-#: submodule.c:1462
+#: submodule.c:1463
 #, c-format
 msgid "Fetching submodule %s%s\n"
 msgstr "Доставяне на подмодула „%s%s“\n"
 
-#: submodule.c:1492
+#: submodule.c:1497
 #, c-format
 msgid "Could not access submodule '%s'\n"
 msgstr "Подмодулът „%s“ не може да бъде достъпен\n"
 
-#: submodule.c:1646
+#: submodule.c:1652
 #, c-format
 msgid ""
 "Errors during submodule fetch:\n"
@@ -8666,63 +8930,63 @@
 "Грешки при доставяне на подмодул:\n"
 "%s"
 
-#: submodule.c:1671
+#: submodule.c:1677
 #, c-format
 msgid "'%s' not recognized as a git repository"
 msgstr "„%s“ не е хранилище на git"
 
-#: submodule.c:1688
+#: submodule.c:1694
 #, c-format
 msgid "Could not run 'git status --porcelain=2' in submodule %s"
 msgstr ""
 "Командата „git status --porcelain=2“ не може да се изпълни в подмодула „%s“"
 
-#: submodule.c:1729
+#: submodule.c:1735
 #, c-format
 msgid "'git status --porcelain=2' failed in submodule %s"
 msgstr ""
 "командата „git status --porcelain=2“ не може да се изпълни в подмодула „%s“"
 
-#: submodule.c:1804
+#: submodule.c:1810
 #, c-format
 msgid "could not start 'git status' in submodule '%s'"
 msgstr "командата „git status“ не може да се изпълни в подмодула „%s“"
 
-#: submodule.c:1817
+#: submodule.c:1823
 #, c-format
 msgid "could not run 'git status' in submodule '%s'"
 msgstr "командата „git status“ не може да се изпълни в подмодула „%s“"
 
-#: submodule.c:1832
+#: submodule.c:1838
 #, c-format
 msgid "Could not unset core.worktree setting in submodule '%s'"
 msgstr "Настройката „core.worktree“ не може да се изтрие в подмодула „%s“"
 
-#: submodule.c:1859 submodule.c:2169
+#: submodule.c:1865 submodule.c:2175
 #, c-format
 msgid "could not recurse into submodule '%s'"
 msgstr "неуспешна обработка на поддиректориите в подмодула „%s“"
 
-#: submodule.c:1880
+#: submodule.c:1886
 msgid "could not reset submodule index"
 msgstr "неуспешно зануляване на индекса на подмодула"
 
-#: submodule.c:1922
+#: submodule.c:1928
 #, c-format
 msgid "submodule '%s' has dirty index"
 msgstr "индексът на подмодула „%s“ не е чист"
 
-#: submodule.c:1974
+#: submodule.c:1980
 #, c-format
 msgid "Submodule '%s' could not be updated."
 msgstr "Подмодулът „%s“ не може да се обнови."
 
-#: submodule.c:2042
+#: submodule.c:2048
 #, c-format
 msgid "submodule git dir '%s' is inside git dir '%.*s'"
 msgstr "„%s“ (директория на подмодул) е в директорията на git: „%.*s“"
 
-#: submodule.c:2063
+#: submodule.c:2069
 #, c-format
 msgid ""
 "relocate_gitdir for submodule '%s' with more than one worktree not supported"
@@ -8730,17 +8994,17 @@
 "не се поддържа „relocate_gitdir“ за подмодула „%s“, който има повече от едно "
 "работно дърво"
 
-#: submodule.c:2075 submodule.c:2134
+#: submodule.c:2081 submodule.c:2140
 #, c-format
 msgid "could not lookup name for submodule '%s'"
 msgstr "името на подмодула „%s“ не може да бъде намерено"
 
-#: submodule.c:2079
+#: submodule.c:2085
 #, c-format
 msgid "refusing to move '%s' into an existing git dir"
 msgstr "„%s“ не може да се премести в съществуваща директория на git"
 
-#: submodule.c:2086
+#: submodule.c:2092
 #, c-format
 msgid ""
 "Migrating git directory of '%s%s' from\n"
@@ -8751,11 +9015,11 @@
 "„%s“ към\n"
 "„%s“\n"
 
-#: submodule.c:2214
+#: submodule.c:2220
 msgid "could not start ls-files in .."
 msgstr "„ls-stat“ не може да се стартира в „..“"
 
-#: submodule.c:2254
+#: submodule.c:2260
 #, c-format
 msgid "ls-tree returned unexpected return code %d"
 msgstr "„ls-tree“ завърши с неочакван изходен код: %d"
@@ -8786,7 +9050,7 @@
 msgid "could not read input file '%s'"
 msgstr "входният файл „%s“ не може да бъде прочетен"
 
-#: trailer.c:751
+#: trailer.c:751 builtin/mktag.c:91
 msgid "could not read from stdin"
 msgstr "от стандартния вход не може да се чете"
 
@@ -8862,7 +9126,7 @@
 msgid "error while running fast-import"
 msgstr "грешка при изпълнението на бързо внасяне"
 
-#: transport-helper.c:549 transport-helper.c:1236
+#: transport-helper.c:549 transport-helper.c:1237
 #, c-format
 msgid "could not read ref %s"
 msgstr "указателят „%s“ не може да се прочете"
@@ -8880,7 +9144,7 @@
 msgid "invalid remote service path"
 msgstr "неправилен път на отдалечената услуга"
 
-#: transport-helper.c:661 transport.c:1446
+#: transport-helper.c:661 transport.c:1447
 msgid "operation not supported by protocol"
 msgstr "опцията не се поддържа от протокола"
 
@@ -8964,52 +9228,52 @@
 "Няма общи указатели, не са указани никакви указатели —\n"
 "нищо няма да бъде направено.  Пробвайте да укажете клон.\n"
 
-#: transport-helper.c:1213
+#: transport-helper.c:1214
 #, c-format
 msgid "unsupported object format '%s'"
 msgstr "обект с неподдържан формат „%s“"
 
-#: transport-helper.c:1222
+#: transport-helper.c:1223
 #, c-format
 msgid "malformed response in ref list: %s"
 msgstr "неправилен отговор в списъка с указатели: „%s“"
 
-#: transport-helper.c:1374
+#: transport-helper.c:1375
 #, c-format
 msgid "read(%s) failed"
 msgstr "неуспешно четене на „%s“"
 
-#: transport-helper.c:1401
+#: transport-helper.c:1402
 #, c-format
 msgid "write(%s) failed"
 msgstr "неуспешен запис в „%s“"
 
-#: transport-helper.c:1450
+#: transport-helper.c:1451
 #, c-format
 msgid "%s thread failed"
 msgstr "неуспешно изпълнение на нишката „%s“"
 
-#: transport-helper.c:1454
+#: transport-helper.c:1455
 #, c-format
 msgid "%s thread failed to join: %s"
 msgstr "завършването на нишката „%s“ не може да се изчака: „%s“"
 
-#: transport-helper.c:1473 transport-helper.c:1477
+#: transport-helper.c:1474 transport-helper.c:1478
 #, c-format
 msgid "can't start thread for copying data: %s"
 msgstr "неуспешно стартиране на нишка за копиране на данните: „%s“"
 
-#: transport-helper.c:1514
+#: transport-helper.c:1515
 #, c-format
 msgid "%s process failed to wait"
 msgstr "процесът на „%s“ не успя да изчака чрез „waitpid“"
 
-#: transport-helper.c:1518
+#: transport-helper.c:1519
 #, c-format
 msgid "%s process failed"
 msgstr "неуспешно изпълнение на „%s“"
 
-#: transport-helper.c:1536 transport-helper.c:1545
+#: transport-helper.c:1537 transport-helper.c:1546
 msgid "can't start thread for copying data"
 msgstr "неуспешно стартиране на нишка за копиране на данните"
 
@@ -9097,23 +9361,23 @@
 msgid "Aborting."
 msgstr "Преустановяване на действието."
 
-#: transport.c:1315
+#: transport.c:1316
 msgid "failed to push all needed submodules"
 msgstr "неуспешно изтласкване на всички необходими подмодули"
 
-#: tree-walk.c:32
+#: tree-walk.c:33
 msgid "too-short tree object"
 msgstr "прекалено кратък обект-дърво"
 
-#: tree-walk.c:38
+#: tree-walk.c:39
 msgid "malformed mode in tree entry"
 msgstr "неправилни права за достъп в запис в дърво"
 
-#: tree-walk.c:42
+#: tree-walk.c:43
 msgid "empty filename in tree entry"
 msgstr "празно име на файл в запис в дърво"
 
-#: tree-walk.c:117
+#: tree-walk.c:118
 msgid "too-short tree file"
 msgstr "прекалено кратък файл-дърво"
 
@@ -9370,7 +9634,7 @@
 msgid "Updating index flags"
 msgstr "Обновяване на флаговете на индекса"
 
-#: upload-pack.c:1550
+#: upload-pack.c:1543
 msgid "expected flush after fetch arguments"
 msgstr "след аргументите на „fetch“ се очаква изчистване на буферите"
 
@@ -9407,73 +9671,105 @@
 msgid "Fetching objects"
 msgstr "Доставяне на обектите"
 
-#: worktree.c:236 builtin/am.c:2103
+#: worktree.c:238 builtin/am.c:2103
 #, c-format
 msgid "failed to read '%s'"
 msgstr "„%s“ не може да бъде прочетен"
 
-#: worktree.c:283
+#: worktree.c:304
 #, c-format
 msgid "'%s' at main working tree is not the repository directory"
 msgstr "„%s“ в основното работно дърво не е директорията на хранилището"
 
-#: worktree.c:294
+#: worktree.c:315
 #, c-format
 msgid "'%s' file does not contain absolute path to the working tree location"
 msgstr ""
 "файлът „%s“ не съдържа абсолютния път към местоположението на работното дърво"
 
-#: worktree.c:306
+#: worktree.c:327
 #, c-format
 msgid "'%s' does not exist"
 msgstr "„%s“ не съществува."
 
-#: worktree.c:312
+#: worktree.c:333
 #, c-format
 msgid "'%s' is not a .git file, error code %d"
 msgstr "„%s“ не е файл на .git, код за грешка: %d"
 
-#: worktree.c:321
+#: worktree.c:342
 #, c-format
 msgid "'%s' does not point back to '%s'"
 msgstr "„%s“ не сочи към обратно към „%s“"
 
-#: worktree.c:587
+#: worktree.c:608
 msgid "not a directory"
 msgstr "не е директория"
 
-#: worktree.c:596
+#: worktree.c:617
 msgid ".git is not a file"
 msgstr "„.git“ не е файл"
 
-#: worktree.c:598
+#: worktree.c:619
 msgid ".git file broken"
 msgstr "„.git“ е повреден"
 
-#: worktree.c:600
+#: worktree.c:621
 msgid ".git file incorrect"
 msgstr "„.git“ е неправилен"
 
-#: worktree.c:670
+#: worktree.c:727
 msgid "not a valid path"
 msgstr "неправилен път"
 
-#: worktree.c:676
+#: worktree.c:733
 msgid "unable to locate repository; .git is not a file"
 msgstr "не може да се открие хранилище: „.git“ не е файл"
 
-#: worktree.c:679
+#: worktree.c:737
+msgid "unable to locate repository; .git file does not reference a repository"
+msgstr "не може да се открие хранилище: файлът „.git“ не сочи към хранилище"
+
+#: worktree.c:741
 msgid "unable to locate repository; .git file broken"
 msgstr "не може да се открие хранилище: „.git“ е повреден"
 
-#: worktree.c:685
+#: worktree.c:747
 msgid "gitdir unreadable"
 msgstr "директорията „gitdir“ не може да се прочете"
 
-#: worktree.c:689
+#: worktree.c:751
 msgid "gitdir incorrect"
 msgstr "неправилна директория „gitdir“"
 
+#: worktree.c:776
+msgid "not a valid directory"
+msgstr "не е валидна директория"
+
+#: worktree.c:782
+msgid "gitdir file does not exist"
+msgstr "файлът „gitdir“ не съществува"
+
+#: worktree.c:787 worktree.c:796
+#, c-format
+msgid "unable to read gitdir file (%s)"
+msgstr "файлът „gitdir“ не може да бъде прочетен (%s)"
+
+#: worktree.c:806
+#, c-format
+msgid "short read (expected %<PRIuMAX> bytes, read %<PRIuMAX>)"
+msgstr ""
+"изчитането върна по-малко байтове от очакваното (очаквани: %<PRIuMAX> байта, "
+"получени: %<PRIuMAX>)"
+
+#: worktree.c:814
+msgid "invalid gitdir file"
+msgstr "неправилен файл „gitdir“"
+
+#: worktree.c:822
+msgid "gitdir file points to non-existent location"
+msgstr "файлът „gitdir“ сочи несъществуващо местоположение"
+
 #: wrapper.c:197 wrapper.c:367
 #, c-format
 msgid "could not open '%s' for reading and writing"
@@ -9525,11 +9821,11 @@
 msgstr ""
 "  (използвайте „git rm ФАЙЛ…“, за да укажете разрешаването на конфликта)"
 
-#: wt-status.c:211 wt-status.c:1070
+#: wt-status.c:211 wt-status.c:1072
 msgid "Changes to be committed:"
 msgstr "Промени, които ще бъдат подадени:"
 
-#: wt-status.c:234 wt-status.c:1079
+#: wt-status.c:234 wt-status.c:1081
 msgid "Changes not staged for commit:"
 msgstr "Промени, които не са в индекса за подаване:"
 
@@ -9634,22 +9930,22 @@
 msgid "untracked content, "
 msgstr "неследено съдържание, "
 
-#: wt-status.c:903
+#: wt-status.c:905
 #, c-format
 msgid "Your stash currently has %d entry"
 msgid_plural "Your stash currently has %d entries"
 msgstr[0] "Има %d скатаване."
 msgstr[1] "Има %d скатавания."
 
-#: wt-status.c:934
+#: wt-status.c:936
 msgid "Submodules changed but not updated:"
 msgstr "Подмодулите са променени, но не са обновени:"
 
-#: wt-status.c:936
+#: wt-status.c:938
 msgid "Submodule changes to be committed:"
 msgstr "Промени в подмодулите за подаване:"
 
-#: wt-status.c:1018
+#: wt-status.c:1020
 msgid ""
 "Do not modify or remove the line above.\n"
 "Everything below it will be ignored."
@@ -9657,7 +9953,7 @@
 "Не променяйте и не изтривайте горния ред.\n"
 "Всичко отдолу ще бъде изтрито."
 
-#: wt-status.c:1110
+#: wt-status.c:1112
 #, c-format
 msgid ""
 "\n"
@@ -9668,263 +9964,271 @@
 "Изчисляването на броя различаващи се подавания отне %.2f сек.\n"
 "За да избегнете това, ползвайте „--no-ahead-behind“.\n"
 
-#: wt-status.c:1140
+#: wt-status.c:1142
 msgid "You have unmerged paths."
 msgstr "Някои пътища не са слети."
 
-#: wt-status.c:1143
+#: wt-status.c:1145
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git commit“)"
 
-#: wt-status.c:1145
+#: wt-status.c:1147
 msgid "  (use \"git merge --abort\" to abort the merge)"
 msgstr "  (използвайте „git merge --abort“, за да преустановите сливането)"
 
-#: wt-status.c:1149
+#: wt-status.c:1151
 msgid "All conflicts fixed but you are still merging."
 msgstr "Всички конфликти са решени, но продължавате сливането."
 
-#: wt-status.c:1152
+#: wt-status.c:1154
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (използвайте „git commit“, за да завършите сливането)"
 
-#: wt-status.c:1161
+#: wt-status.c:1163
 msgid "You are in the middle of an am session."
 msgstr "В момента прилагате поредица от кръпки чрез „git am“."
 
-#: wt-status.c:1164
+#: wt-status.c:1166
 msgid "The current patch is empty."
 msgstr "Текущата кръпка е празна."
 
-#: wt-status.c:1168
+#: wt-status.c:1170
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git am --continue“)"
 
-#: wt-status.c:1170
+#: wt-status.c:1172
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (използвайте „git am --skip“, за да пропуснете тази кръпка)"
 
-#: wt-status.c:1172
+#: wt-status.c:1174
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
 "  (използвайте „git am --abort“, за да възстановите първоначалния клон)"
 
-#: wt-status.c:1305
+#: wt-status.c:1307
 msgid "git-rebase-todo is missing."
 msgstr "„git-rebase-todo“ липсва."
 
-#: wt-status.c:1307
+#: wt-status.c:1309
 msgid "No commands done."
 msgstr "Не са изпълнени команди."
 
-#: wt-status.c:1310
+#: wt-status.c:1312
 #, 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:1321
+#: wt-status.c:1323
 #, c-format
 msgid "  (see more in file %s)"
 msgstr "  (повече информация има във файла „%s“)"
 
-#: wt-status.c:1326
+#: wt-status.c:1328
 msgid "No commands remaining."
 msgstr "Не остават повече команди."
 
-#: wt-status.c:1329
+#: wt-status.c:1331
 #, 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:1337
+#: wt-status.c:1339
 msgid "  (use \"git rebase --edit-todo\" to view and edit)"
 msgstr ""
 "  (използвайте „git rebase --edit-todo“, за да разгледате и редактирате)"
 
-#: wt-status.c:1349
+#: wt-status.c:1351
 #, c-format
 msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr "В момента пребазирате клона „%s“ върху „%s“."
 
-#: wt-status.c:1354
+#: wt-status.c:1356
 msgid "You are currently rebasing."
 msgstr "В момента пребазирате."
 
-#: wt-status.c:1367
+#: wt-status.c:1369
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr "  (коригирайте конфликтите и използвайте „git rebase --continue“)"
 
-#: wt-status.c:1369
+#: wt-status.c:1371
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr "  (използвайте „git rebase --skip“, за да пропуснете тази кръпка)"
 
-#: wt-status.c:1371
+#: wt-status.c:1373
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
 "  (използвайте „git rebase --abort“, за да възстановите първоначалния клон)"
 
-#: wt-status.c:1378
+#: wt-status.c:1380
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr "  (всички конфликти са коригирани: изпълнете „git rebase --continue“)"
 
-#: wt-status.c:1382
+#: wt-status.c:1384
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
 msgstr "В момента разделяте подаване докато пребазирате клона „%s“ върху „%s“."
 
-#: wt-status.c:1387
+#: wt-status.c:1389
 msgid "You are currently splitting a commit during a rebase."
 msgstr "В момента разделяте подаване докато пребазирате."
 
-#: wt-status.c:1390
+#: wt-status.c:1392
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
 "  (След като работното ви дърво стане чисто, използвайте „git rebase --"
 "continue“)"
 
-#: wt-status.c:1394
+#: wt-status.c:1396
 #, c-format
 msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 "В момента редактирате подаване докато пребазирате клона „%s“ върху „%s“."
 
-#: wt-status.c:1399
+#: wt-status.c:1401
 msgid "You are currently editing a commit during a rebase."
 msgstr "В момента редактирате подаване докато пребазирате."
 
-#: wt-status.c:1402
+#: wt-status.c:1404
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr ""
 "  (използвайте „git commit --amend“, за да редактирате текущото подаване)"
 
-#: wt-status.c:1404
+#: wt-status.c:1406
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
 "  (използвайте „git rebase --continue“, след като завършите промените си)"
 
-#: wt-status.c:1415
+#: wt-status.c:1417
 msgid "Cherry-pick currently in progress."
 msgstr "В момента се извършва отбиране на подавания."
 
-#: wt-status.c:1418
+#: wt-status.c:1420
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr "В момента отбирате подаването „%s“."
 
-#: wt-status.c:1425
+#: wt-status.c:1427
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git cherry-pick --continue“)"
 
-#: wt-status.c:1428
+#: wt-status.c:1430
 msgid "  (run \"git cherry-pick --continue\" to continue)"
 msgstr "  (за да продължите, изпълнете „git cherry-pick --continue“)"
 
-#: wt-status.c:1431
+#: wt-status.c:1433
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
 "  (всички конфликти са коригирани, изпълнете „git cherry-pick --continue“)"
 
-#: wt-status.c:1433
+#: wt-status.c:1435
 msgid "  (use \"git cherry-pick --skip\" to skip this patch)"
 msgstr "  (използвайте „git cherry-pick --skip“, за да пропуснете тази кръпка)"
 
-#: wt-status.c:1435
+#: wt-status.c:1437
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr ""
 "  (използвайте „git cherry-pick --abort“, за да отмените всички действия с "
 "отбиране)"
 
-#: wt-status.c:1445
+#: wt-status.c:1447
 msgid "Revert currently in progress."
 msgstr "В момента тече отмяна на подаване."
 
-#: wt-status.c:1448
+#: wt-status.c:1450
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr "В момента отменяте подаване „%s“."
 
-#: wt-status.c:1454
+#: wt-status.c:1456
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git revert --continue“)"
 
-#: wt-status.c:1457
+#: wt-status.c:1459
 msgid "  (run \"git revert --continue\" to continue)"
 msgstr "  (за да продължите, изпълнете „git revert --continue“)"
 
-#: wt-status.c:1460
+#: wt-status.c:1462
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr "  (всички конфликти са коригирани, изпълнете „git revert --continue“)"
 
-#: wt-status.c:1462
+#: wt-status.c:1464
 msgid "  (use \"git revert --skip\" to skip this patch)"
 msgstr "  (използвайте „git revert --skip“, за да пропуснете тази кръпка)"
 
-#: wt-status.c:1464
+#: wt-status.c:1466
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
 "  (използвайте „git revert --abort“, за да преустановите отмяната на "
 "подаване)"
 
-#: wt-status.c:1474
+#: wt-status.c:1476
 #, c-format
 msgid "You are currently bisecting, started from branch '%s'."
 msgstr "В момента търсите двоично, като сте стартирали от клон „%s“."
 
-#: wt-status.c:1478
+#: wt-status.c:1480
 msgid "You are currently bisecting."
 msgstr "В момента търсите двоично."
 
-#: wt-status.c:1481
+#: wt-status.c:1483
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
 "  (използвайте „git bisect reset“, за да се върнете към първоначалното "
 "състояние и клон)"
 
-#: wt-status.c:1492
+#: wt-status.c:1494
 #, c-format
 msgid "You are in a sparse checkout with %d%% of tracked files present."
 msgstr ""
 "Намирате се в частично изтеглено хранилище с %d%% налични, следени файла."
 
-#: wt-status.c:1731
+#: wt-status.c:1733
 msgid "On branch "
 msgstr "На клон "
 
-#: wt-status.c:1738
+#: wt-status.c:1740
 msgid "interactive rebase in progress; onto "
 msgstr "извършвате интерактивно пребазиране върху "
 
-#: wt-status.c:1740
+#: wt-status.c:1742
 msgid "rebase in progress; onto "
 msgstr "извършвате пребазиране върху "
 
-#: wt-status.c:1750
+#: wt-status.c:1747
+msgid "HEAD detached at "
+msgstr "Указателят „HEAD“ не е свързан и е при "
+
+#: wt-status.c:1749
+msgid "HEAD detached from "
+msgstr "Указателят „HEAD“ не е свързан и е отделѐн от "
+
+#: wt-status.c:1752
 msgid "Not currently on any branch."
 msgstr "Извън всички клони."
 
-#: wt-status.c:1767
+#: wt-status.c:1769
 msgid "Initial commit"
 msgstr "Първоначално подаване"
 
-#: wt-status.c:1768
+#: wt-status.c:1770
 msgid "No commits yet"
 msgstr "Все още липсват подавания"
 
-#: wt-status.c:1782
+#: wt-status.c:1784
 msgid "Untracked files"
 msgstr "Неследени файлове"
 
-#: wt-status.c:1784
+#: wt-status.c:1786
 msgid "Ignored files"
 msgstr "Игнорирани файлове"
 
-#: wt-status.c:1788
+#: wt-status.c:1790
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -9936,32 +10240,32 @@
 "изпълнението, но ще трябва да добавяте новите файлове ръчно.\n"
 "За повече подробности погледнете „git status help“."
 
-#: wt-status.c:1794
+#: wt-status.c:1796
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "Неследените файлове не са изведени%s"
 
-#: wt-status.c:1796
+#: wt-status.c:1798
 msgid " (use -u option to show untracked files)"
 msgstr " (използвайте опцията „-u“, за да изведете неследените файлове)"
 
-#: wt-status.c:1802
+#: wt-status.c:1804
 msgid "No changes"
 msgstr "Няма промени"
 
-#: wt-status.c:1807
+#: wt-status.c:1809
 #, 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:1811
+#: wt-status.c:1813
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "към индекса за подаване не са добавени промени\n"
 
-#: wt-status.c:1815
+#: wt-status.c:1817
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -9970,66 +10274,66 @@
 "към индекса за подаване не са добавени промени, но има нови файлове "
 "(използвайте „git add“, за да започне тяхното следене)\n"
 
-#: wt-status.c:1819
+#: wt-status.c:1821
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr "към индекса за подаване не са добавени промени, но има нови файлове\n"
 
-#: wt-status.c:1823
+#: wt-status.c:1825
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 "липсват каквито и да е промени (създайте или копирайте файлове и използвайте "
 "„git add“, за да започне тяхното следене)\n"
 
-#: wt-status.c:1827 wt-status.c:1833
+#: wt-status.c:1829 wt-status.c:1835
 #, c-format
 msgid "nothing to commit\n"
 msgstr "липсват каквито и да е промени\n"
 
-#: wt-status.c:1830
+#: wt-status.c:1832
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
 "липсват каквито и да е промени (използвайте опцията „-u“, за да се изведат и "
 "неследените файлове)\n"
 
-#: wt-status.c:1835
+#: wt-status.c:1837
 #, c-format
 msgid "nothing to commit, working tree clean\n"
 msgstr "липсват каквито и да е промени, работното дърво е чисто\n"
 
-#: wt-status.c:1940
+#: wt-status.c:1942
 msgid "No commits yet on "
 msgstr "Все още липсват подавания в "
 
-#: wt-status.c:1944
+#: wt-status.c:1946
 msgid "HEAD (no branch)"
 msgstr "HEAD (извън клон)"
 
-#: wt-status.c:1975
+#: wt-status.c:1977
 msgid "different"
 msgstr "различен"
 
-#: wt-status.c:1977 wt-status.c:1985
+#: wt-status.c:1979 wt-status.c:1987
 msgid "behind "
 msgstr "назад с "
 
-#: wt-status.c:1980 wt-status.c:1983
+#: wt-status.c:1982 wt-status.c:1985
 msgid "ahead "
 msgstr "напред с "
 
 #. TRANSLATORS: the action is e.g. "pull with rebase"
-#: wt-status.c:2505
+#: wt-status.c:2507
 #, c-format
 msgid "cannot %s: You have unstaged changes."
 msgstr "не може да извършите „%s“, защото има промени, които не са в индекса."
 
-#: wt-status.c:2511
+#: wt-status.c:2513
 msgid "additionally, your index contains uncommitted changes."
 msgstr "освен това в индекса има неподадени промени."
 
-#: wt-status.c:2513
+#: wt-status.c:2515
 #, c-format
 msgid "cannot %s: Your index contains uncommitted changes."
 msgstr "не може да извършите „%s“, защото в индекса има неподадени промени."
@@ -10043,132 +10347,137 @@
 msgid "git add [<options>] [--] <pathspec>..."
 msgstr "git add [ОПЦИЯ…] [--] ПЪТ…"
 
-#: builtin/add.c:88
+#: builtin/add.c:58
+#, c-format
+msgid "cannot chmod %cx '%s'"
+msgstr "правата на „%2$s“ не може да се зададат да са %1$cx"
+
+#: builtin/add.c:96
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "неочакван изходен код при генериране на разлика: %c"
 
-#: builtin/add.c:93 builtin/commit.c:285
+#: builtin/add.c:101 builtin/commit.c:285
 msgid "updating files failed"
 msgstr "неуспешно обновяване на файловете"
 
-#: builtin/add.c:103
+#: builtin/add.c:111
 #, c-format
 msgid "remove '%s'\n"
 msgstr "изтриване на „%s“\n"
 
-#: builtin/add.c:178
+#: builtin/add.c:186
 msgid "Unstaged changes after refreshing the index:"
 msgstr "Промени, които и след обновяването на индекса не са добавени към него:"
 
-#: builtin/add.c:272 builtin/rev-parse.c:908
+#: builtin/add.c:280 builtin/rev-parse.c:991
 msgid "Could not read the index"
 msgstr "Индексът не може да бъде прочетен"
 
-#: builtin/add.c:283
+#: builtin/add.c:291
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "Файлът „%s“ не може да бъде отворен за запис."
 
-#: builtin/add.c:287
+#: builtin/add.c:295
 msgid "Could not write patch"
 msgstr "Кръпката не може да бъде записана"
 
-#: builtin/add.c:290
+#: builtin/add.c:298
 msgid "editing patch failed"
 msgstr "неуспешно редактиране на кръпка"
 
-#: builtin/add.c:293
+#: builtin/add.c:301
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "Не може да се получи информация чрез „stat“ за файла „%s“"
 
-#: builtin/add.c:295
+#: builtin/add.c:303
 msgid "Empty patch. Aborted."
 msgstr "Празна кръпка, преустановяване на действието."
 
-#: builtin/add.c:300
+#: builtin/add.c:308
 #, c-format
 msgid "Could not apply '%s'"
 msgstr "Кръпката „%s“ не може да бъде приложена"
 
-#: builtin/add.c:308
+#: builtin/add.c:316
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
 "Следните пътища ще бъдат игнорирани според някой от файловете „.gitignore“:\n"
 
-#: builtin/add.c:328 builtin/clean.c:904 builtin/fetch.c:166 builtin/mv.c:124
+#: builtin/add.c:336 builtin/clean.c:904 builtin/fetch.c:169 builtin/mv.c:124
 #: builtin/prune-packed.c:14 builtin/pull.c:204 builtin/push.c:559
 #: builtin/remote.c:1427 builtin/rm.c:242 builtin/send-pack.c:190
 msgid "dry run"
 msgstr "пробно изпълнение"
 
-#: builtin/add.c:331
+#: builtin/add.c:339
 msgid "interactive picking"
 msgstr "интерактивно отбиране на промени"
 
-#: builtin/add.c:332 builtin/checkout.c:1547 builtin/reset.c:308
+#: builtin/add.c:340 builtin/checkout.c:1546 builtin/reset.c:308
 msgid "select hunks interactively"
 msgstr "интерактивен избор на парчета код"
 
-#: builtin/add.c:333
+#: builtin/add.c:341
 msgid "edit current diff and apply"
 msgstr "редактиране на текущата разлика и прилагане"
 
-#: builtin/add.c:334
+#: builtin/add.c:342
 msgid "allow adding otherwise ignored files"
 msgstr "добавяне и на иначе игнорираните файлове"
 
-#: builtin/add.c:335
+#: builtin/add.c:343
 msgid "update tracked files"
 msgstr "обновяване на следените файлове"
 
-#: builtin/add.c:336
+#: builtin/add.c:344
 msgid "renormalize EOL of tracked files (implies -u)"
 msgstr "уеднаквяване на знаците за край на файл (включва опцията „-u“)"
 
-#: builtin/add.c:337
+#: builtin/add.c:345
 msgid "record only the fact that the path will be added later"
 msgstr "отбелязване само на факта, че пътят ще бъде добавен по-късно"
 
-#: builtin/add.c:338
+#: builtin/add.c:346
 msgid "add changes from all tracked and untracked files"
 msgstr "добавяне на всички промени в следените и неследените файлове"
 
-#: builtin/add.c:341
+#: builtin/add.c:349
 msgid "ignore paths removed in the working tree (same as --no-all)"
 msgstr ""
 "игнориране на пътищата, които са изтрити от работното дърво (същото като „--"
 "no-all“)"
 
-#: builtin/add.c:343
+#: builtin/add.c:351
 msgid "don't add, only refresh the index"
 msgstr "без добавяне на нови файлове, само обновяване на индекса"
 
-#: builtin/add.c:344
+#: builtin/add.c:352
 msgid "just skip files which cannot be added because of errors"
 msgstr ""
 "прескачане на файловете, които не могат да бъдат добавени поради грешки"
 
-#: builtin/add.c:345
+#: builtin/add.c:353
 msgid "check if - even missing - files are ignored in dry run"
 msgstr ""
 "проверка, че при пробно изпълнение всички файлове, дори и изтритите, се "
 "игнорират"
 
-#: builtin/add.c:347 builtin/update-index.c:1004
+#: builtin/add.c:355 builtin/update-index.c:1004
 msgid "override the executable bit of the listed files"
 msgstr "изрично задаване на стойността на флага дали файлът е изпълним"
 
-#: builtin/add.c:349
+#: builtin/add.c:357
 msgid "warn when adding an embedded repository"
 msgstr "предупреждаване при добавяне на вградено хранилище"
 
-#: builtin/add.c:351
+#: builtin/add.c:359
 msgid "backend for `git stash -p`"
 msgstr "реализация на „git stash -p“"
 
-#: builtin/add.c:369
+#: builtin/add.c:377
 #, c-format
 msgid ""
 "You've added another git repository inside your current repository.\n"
@@ -10199,12 +10508,12 @@
 "\n"
 "За повече информация погледнете „git help submodule“."
 
-#: builtin/add.c:397
+#: builtin/add.c:405
 #, c-format
 msgid "adding embedded git repository: %s"
 msgstr "добавяне на вградено хранилище: %s"
 
-#: builtin/add.c:416
+#: builtin/add.c:424
 msgid ""
 "Use -f if you really want to add them.\n"
 "Turn this message off by running\n"
@@ -10215,50 +10524,50 @@
 "\n"
 "    git config advice.addIgnoredFile false"
 
-#: builtin/add.c:425
+#: builtin/add.c:433
 msgid "adding files failed"
 msgstr "неуспешно добавяне на файлове"
 
-#: builtin/add.c:453 builtin/commit.c:345
+#: builtin/add.c:461 builtin/commit.c:345
 msgid "--pathspec-from-file is incompatible with --interactive/--patch"
 msgstr ""
 "опцията „--pathspec-from-file“ е несъвместима с всяка от опциите „--"
 "interactive“/„--patch“"
 
-#: builtin/add.c:470
+#: builtin/add.c:478
 msgid "--pathspec-from-file is incompatible with --edit"
 msgstr "опциите „--pathspec-from-file“ и „--edit“ са несъвместими"
 
-#: builtin/add.c:482
+#: builtin/add.c:490
 msgid "-A and -u are mutually incompatible"
 msgstr "опциите „-A“ и „-u“ са несъвместими"
 
-#: builtin/add.c:485
+#: builtin/add.c:493
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "Опцията „--ignore-missing“ изисква „--dry-run“"
 
-#: builtin/add.c:489
+#: builtin/add.c:497
 #, c-format
 msgid "--chmod param '%s' must be either -x or +x"
 msgstr "параметърът към „--chmod“ — „%s“ може да е или „-x“, или „+x“"
 
-#: builtin/add.c:507 builtin/checkout.c:1715 builtin/commit.c:351
-#: builtin/reset.c:328 builtin/rm.c:272 builtin/stash.c:1502
+#: builtin/add.c:515 builtin/checkout.c:1714 builtin/commit.c:351
+#: builtin/reset.c:328 builtin/rm.c:272 builtin/stash.c:1569
 msgid "--pathspec-from-file is incompatible with pathspec arguments"
 msgstr ""
 "опцията „--pathspec-from-file“ е несъвместима с аргументи, указващи пътища"
 
-#: builtin/add.c:514 builtin/checkout.c:1727 builtin/commit.c:357
-#: builtin/reset.c:334 builtin/rm.c:278 builtin/stash.c:1508
+#: builtin/add.c:522 builtin/checkout.c:1726 builtin/commit.c:357
+#: builtin/reset.c:334 builtin/rm.c:278 builtin/stash.c:1575
 msgid "--pathspec-file-nul requires --pathspec-from-file"
 msgstr "опцията „--pathspec-file-nul“ изисква опция „--pathspec-from-file“"
 
-#: builtin/add.c:518
+#: builtin/add.c:526
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Нищо не е зададено и нищо не е добавено.\n"
 
-#: builtin/add.c:520
+#: builtin/add.c:528
 msgid ""
 "Maybe you wanted to say 'git add .'?\n"
 "Turn this message off by running\n"
@@ -10522,7 +10831,7 @@
 msgstr "да се преминава към тройно сливане при нужда."
 
 #: builtin/am.c:2225 builtin/init-db.c:560 builtin/prune-packed.c:16
-#: builtin/repack.c:335 builtin/stash.c:815
+#: builtin/repack.c:334 builtin/stash.c:882
 msgid "be quiet"
 msgstr "без извеждане на информация"
 
@@ -10568,17 +10877,17 @@
 msgstr "прекарване през „git-apply“"
 
 #: builtin/am.c:2263 builtin/commit.c:1395 builtin/fmt-merge-msg.c:17
-#: builtin/fmt-merge-msg.c:20 builtin/grep.c:903 builtin/merge.c:260
+#: builtin/fmt-merge-msg.c:20 builtin/grep.c:904 builtin/merge.c:261
 #: builtin/pull.c:141 builtin/pull.c:200 builtin/pull.c:217
-#: builtin/rebase.c:1341 builtin/repack.c:346 builtin/repack.c:350
-#: builtin/repack.c:352 builtin/show-branch.c:650 builtin/show-ref.c:172
-#: builtin/tag.c:404 parse-options.h:154 parse-options.h:175
+#: builtin/rebase.c:1347 builtin/repack.c:345 builtin/repack.c:349
+#: builtin/repack.c:351 builtin/show-branch.c:650 builtin/show-ref.c:172
+#: builtin/tag.c:436 parse-options.h:154 parse-options.h:175
 #: parse-options.h:316
 msgid "n"
 msgstr "БРОЙ"
 
-#: builtin/am.c:2269 builtin/branch.c:661 builtin/bugreport.c:136
-#: builtin/for-each-ref.c:38 builtin/replace.c:556 builtin/tag.c:438
+#: builtin/am.c:2269 builtin/branch.c:670 builtin/bugreport.c:136
+#: builtin/for-each-ref.c:38 builtin/replace.c:556 builtin/tag.c:470
 #: builtin/verify-tag.c:38
 msgid "format"
 msgstr "ФОРМАТ"
@@ -10604,15 +10913,15 @@
 msgstr "прескачане на текущата кръпка"
 
 #: builtin/am.c:2287
-msgid "restore the original branch and abort the patching operation."
+msgid "restore the original branch and abort the patching operation"
 msgstr ""
 "възстановяване на първоначалното състояние на клона и преустановяване на "
-"прилагането на кръпката."
+"прилагането на кръпката"
 
 #: builtin/am.c:2290
-msgid "abort the patching operation but keep HEAD where it is."
+msgid "abort the patching operation but keep HEAD where it is"
 msgstr ""
-"преустановяване на прилагането на кръпката без промяна към кое сочи „HEAD“."
+"преустановяване на прилагането на кръпката без промяна към кое сочи „HEAD“"
 
 #: builtin/am.c:2294
 msgid "show the patch being applied"
@@ -10627,12 +10936,12 @@
 msgstr "използване на текущото време като това за автор"
 
 #: builtin/am.c:2303 builtin/commit-tree.c:120 builtin/commit.c:1515
-#: builtin/merge.c:297 builtin/pull.c:175 builtin/rebase.c:536
-#: builtin/rebase.c:1394 builtin/revert.c:117 builtin/tag.c:419
+#: builtin/merge.c:298 builtin/pull.c:175 builtin/rebase.c:538
+#: builtin/rebase.c:1400 builtin/revert.c:117 builtin/tag.c:451
 msgid "key-id"
 msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ"
 
-#: builtin/am.c:2304 builtin/rebase.c:537 builtin/rebase.c:1395
+#: builtin/am.c:2304 builtin/rebase.c:539 builtin/rebase.c:1401
 msgid "GPG-sign commits"
 msgstr "подписване на подаванията с GPG"
 
@@ -10716,23 +11025,10 @@
 msgstr "git bisect--helper --bisect-reset [ПОДАВАНЕ]"
 
 #: builtin/bisect--helper.c:24
-msgid ""
-"git bisect--helper --bisect-write [--no-log] <state> <revision> <good_term> "
-"<bad_term>"
-msgstr ""
-"git bisect--helper --bisect-write [--no-log] СЪСТОЯНИЕ ВЕРСИЯ ДОБРО ЛОШО"
-
-#: builtin/bisect--helper.c:25
-msgid ""
-"git bisect--helper --bisect-check-and-set-terms <command> <good_term> "
-"<bad_term>"
-msgstr "git bisect--helper --bisect-check-and-set-terms КОМАНДА ДОБРО"
-
-#: builtin/bisect--helper.c:26
 msgid "git bisect--helper --bisect-next-check <good_term> <bad_term> [<term>]"
 msgstr "git bisect--helper --bisect-next-check ЛОШО ДОБРО УПРАВЛЯВАЩА_ДУМА"
 
-#: builtin/bisect--helper.c:27
+#: builtin/bisect--helper.c:25
 msgid ""
 "git bisect--helper --bisect-terms [--term-good | --term-old | --term-bad | --"
 "term-new]"
@@ -10740,7 +11036,7 @@
 "git bisect--helper --bisect-terms [--term-good | --term-old | --term-bad | --"
 "term-new]"
 
-#: builtin/bisect--helper.c:28
+#: builtin/bisect--helper.c:26
 msgid ""
 "git bisect--helper --bisect-start [--term-{new,bad}=<term> --term-{old,good}"
 "=<term>] [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] "
@@ -10749,62 +11045,66 @@
 "git bisect--helper --bisect-start [--term-{new,bad}=ЛОШО --term-{old,good}"
 "=ДОБРО] [--no-checkout] [--first-parent] [ЛОШО [ДОБРО…]] [--] [ПЪТ…]"
 
-#: builtin/bisect--helper.c:30
+#: builtin/bisect--helper.c:28
 msgid "git bisect--helper --bisect-next"
 msgstr "git bisect--helper --bisect-next"
 
-#: builtin/bisect--helper.c:31
-msgid "git bisect--helper --bisect-auto-next"
-msgstr "git bisect--helper --bisect-auto-next"
-
-#: builtin/bisect--helper.c:32
+#: builtin/bisect--helper.c:29
 msgid "git bisect--helper --bisect-state (bad|new) [<rev>]"
 msgstr "git bisect--helper --bisect-reset (ЛОШО) [ВЕРСИЯ]"
 
-#: builtin/bisect--helper.c:33
+#: builtin/bisect--helper.c:30
 msgid "git bisect--helper --bisect-state (good|old) [<rev>...]"
 msgstr "git bisect--helper --bisect-reset (ДОБРО) [ВЕРСИЯ…]"
 
-#: builtin/bisect--helper.c:108
+#: builtin/bisect--helper.c:31
+msgid "git bisect--helper --bisect-replay <filename>"
+msgstr "git bisect--helper --bisect-next ИМЕ_НА_ФАЙЛ"
+
+#: builtin/bisect--helper.c:32
+msgid "git bisect--helper --bisect-skip [(<rev>|<range>)...]"
+msgstr "git bisect--helper --bisect-reset [(ВЕРСИЯ|ДИАПАЗОН)…]"
+
+#: builtin/bisect--helper.c:107
 #, c-format
 msgid "cannot open file '%s' in mode '%s'"
 msgstr "файлът „%s“ не може да се отвори в режим „%s“"
 
-#: builtin/bisect--helper.c:115
+#: builtin/bisect--helper.c:114
 #, c-format
 msgid "could not write to file '%s'"
 msgstr "във файла „%s“ не може да се пише"
 
-#: builtin/bisect--helper.c:154
+#: builtin/bisect--helper.c:153
 #, c-format
 msgid "'%s' is not a valid term"
 msgstr "„%s“ е неправилна управляваща дума"
 
-#: builtin/bisect--helper.c:158
+#: builtin/bisect--helper.c:157
 #, c-format
 msgid "can't use the builtin command '%s' as a term"
 msgstr "„%s“ е вградена команда и не може да се използва като управляваща дума"
 
-#: builtin/bisect--helper.c:168
+#: builtin/bisect--helper.c:167
 #, c-format
 msgid "can't change the meaning of the term '%s'"
 msgstr "не може да смените значението на управляващата дума „%s“"
 
-#: builtin/bisect--helper.c:178
+#: builtin/bisect--helper.c:177
 msgid "please use two different terms"
 msgstr "използвайте две различни управляващи думи"
 
-#: builtin/bisect--helper.c:194
+#: builtin/bisect--helper.c:193
 #, c-format
 msgid "We are not bisecting.\n"
 msgstr "В момента не се извършва двоично търсене.\n"
 
-#: builtin/bisect--helper.c:202
+#: builtin/bisect--helper.c:201
 #, c-format
 msgid "'%s' is not a valid commit"
 msgstr "„%s“ не е подаване"
 
-#: builtin/bisect--helper.c:211
+#: builtin/bisect--helper.c:210
 #, c-format
 msgid ""
 "could not check out original HEAD '%s'. Try 'git bisect reset <commit>'."
@@ -10812,27 +11112,27 @@
 "първоначално указаното „%s“ в указателя „HEAD“ не може да бъде\n"
 "изтеглено.  Пробвайте да изпълните командата „git bisect reset ПОДАВАНЕ“."
 
-#: builtin/bisect--helper.c:255
+#: builtin/bisect--helper.c:254
 #, c-format
 msgid "Bad bisect_write argument: %s"
 msgstr "Неправилен аргумент на функцията „bisect_write“: „%s“"
 
-#: builtin/bisect--helper.c:260
+#: builtin/bisect--helper.c:259
 #, c-format
 msgid "couldn't get the oid of the rev '%s'"
 msgstr "идентификаторът на обект на версия „%s“ не може да бъде получен"
 
-#: builtin/bisect--helper.c:272
+#: builtin/bisect--helper.c:271
 #, c-format
 msgid "couldn't open the file '%s'"
 msgstr "файлът „%s“ не може да бъде отворен"
 
-#: builtin/bisect--helper.c:298
+#: builtin/bisect--helper.c:297
 #, c-format
 msgid "Invalid command: you're currently in a %s/%s bisect"
 msgstr "Неправилна команда: в момента се изпълнява двоично търсене по %s/%s."
 
-#: builtin/bisect--helper.c:325
+#: builtin/bisect--helper.c:324
 #, c-format
 msgid ""
 "You need to give me at least one %s and %s revision.\n"
@@ -10841,7 +11141,7 @@
 "Трябва да зададете поне една „%s“ и една „%s“ версия.  (Това може да се\n"
 "направи съответно и чрез командите „git bisect %s“ и „git bisect %s“.)"
 
-#: builtin/bisect--helper.c:329
+#: builtin/bisect--helper.c:328
 #, c-format
 msgid ""
 "You need to start by \"git bisect start\".\n"
@@ -10852,7 +11152,7 @@
 "Трябва да зададете поне една „%s“ и една „%s“ версия.  (Това може да се\n"
 "направи съответно и чрез командите „git bisect %s“ и „git bisect %s“.)"
 
-#: builtin/bisect--helper.c:349
+#: builtin/bisect--helper.c:348
 #, c-format
 msgid "bisecting only with a %s commit"
 msgstr "двоично търсене само по „%s“ подаване."
@@ -10861,15 +11161,15 @@
 #. translation. The program will only accept English input
 #. at this point.
 #.
-#: builtin/bisect--helper.c:357
+#: builtin/bisect--helper.c:356
 msgid "Are you sure [Y/n]? "
 msgstr "Да се продължи ли? „Y“ —  ДА, „n“ — не"
 
-#: builtin/bisect--helper.c:418
+#: builtin/bisect--helper.c:417
 msgid "no terms defined"
 msgstr "не са указани управляващи думи"
 
-#: builtin/bisect--helper.c:421
+#: builtin/bisect--helper.c:420
 #, c-format
 msgid ""
 "Your current terms are %s for the old state\n"
@@ -10878,7 +11178,7 @@
 "Текущите управляващи думи са: %s за старото състояние\n"
 "и %s за новото състояние.\n"
 
-#: builtin/bisect--helper.c:431
+#: builtin/bisect--helper.c:430
 #, c-format
 msgid ""
 "invalid argument %s for 'git bisect terms'.\n"
@@ -10887,56 +11187,56 @@
 "на „git bisect terms“ е подаден неправилен аргумент „%s“\n"
 "Поддържат се опциите „--term-good“/„--term-old“ и „--term-bad„/„--term-new“."
 
-#: builtin/bisect--helper.c:498
+#: builtin/bisect--helper.c:497 builtin/bisect--helper.c:1014
 msgid "revision walk setup failed\n"
 msgstr "неуспешно настройване на обхождането на версиите\n"
 
-#: builtin/bisect--helper.c:520
+#: builtin/bisect--helper.c:519
 #, c-format
 msgid "could not open '%s' for appending"
 msgstr "файлът „%s“ не може да се отвори за добавяне"
 
-#: builtin/bisect--helper.c:639 builtin/bisect--helper.c:652
+#: builtin/bisect--helper.c:638 builtin/bisect--helper.c:651
 msgid "'' is not a valid term"
 msgstr "„“ е неправилна управляваща дума"
 
-#: builtin/bisect--helper.c:662
+#: builtin/bisect--helper.c:661
 #, c-format
 msgid "unrecognized option: '%s'"
 msgstr "непозната опция: %s"
 
-#: builtin/bisect--helper.c:666
+#: builtin/bisect--helper.c:665
 #, c-format
 msgid "'%s' does not appear to be a valid revision"
 msgstr "„%s“ не изглежда като указател към версия"
 
-#: builtin/bisect--helper.c:697
+#: builtin/bisect--helper.c:696
 msgid "bad HEAD - I need a HEAD"
 msgstr "Неправилен указател „HEAD“"
 
-#: builtin/bisect--helper.c:712
+#: builtin/bisect--helper.c:711
 #, c-format
 msgid "checking out '%s' failed. Try 'git bisect start <valid-branch>'."
 msgstr ""
 "Неуспешно преминаване към „%s“.  Изпълнете командата „git bisect start "
 "СЪЩЕСТВУВАЩ_КЛОН“."
 
-#: builtin/bisect--helper.c:733
+#: builtin/bisect--helper.c:732
 msgid "won't bisect on cg-seek'ed tree"
 msgstr ""
 "не може да се търси двоично, когато е изпълнена командата „cg-seek“ от "
 "„cogito“"
 
-#: builtin/bisect--helper.c:736
+#: builtin/bisect--helper.c:735
 msgid "bad HEAD - strange symbolic ref"
 msgstr "Неправилен указател „HEAD“ — необичаен символен указател"
 
-#: builtin/bisect--helper.c:756
+#: builtin/bisect--helper.c:755
 #, c-format
 msgid "invalid ref: '%s'"
 msgstr "неправилен указател: „%s“"
 
-#: builtin/bisect--helper.c:814
+#: builtin/bisect--helper.c:813
 msgid "You need to start by \"git bisect start\"\n"
 msgstr "Започнете като изпълните командата „git bisect start“\n"
 
@@ -10944,94 +11244,105 @@
 #. translation. The program will only accept English input
 #. at this point.
 #.
-#: builtin/bisect--helper.c:825
+#: builtin/bisect--helper.c:824
 msgid "Do you want me to do it for you [Y/n]? "
 msgstr "Да се извърши ли автоматично? „Y“ —  ДА, „n“ — не"
 
-#: builtin/bisect--helper.c:843
+#: builtin/bisect--helper.c:842
 msgid "Please call `--bisect-state` with at least one argument"
 msgstr "Опцията „--bisect-state“ изисква поне един аргумент"
 
-#: builtin/bisect--helper.c:856
+#: builtin/bisect--helper.c:855
 #, c-format
 msgid "'git bisect %s' can take only one argument."
 msgstr "Командата „git bisect %s“ приема само един аргумент."
 
-#: builtin/bisect--helper.c:868 builtin/bisect--helper.c:879
+#: builtin/bisect--helper.c:867 builtin/bisect--helper.c:878
 #, c-format
 msgid "Bad rev input: %s"
 msgstr "Неправилна версия: „%s“"
 
-#: builtin/bisect--helper.c:924
+#: builtin/bisect--helper.c:912
+msgid "We are not bisecting."
+msgstr "В момента не се извършва двоично търсене."
+
+#: builtin/bisect--helper.c:962
+#, c-format
+msgid "'%s'?? what are you talking about?"
+msgstr ""
+"Непозната команда „%s“.  Възможностите са: „start“, „skip“, „good“, „bad“ (и "
+"вариантите им)"
+
+#: builtin/bisect--helper.c:974
+#, c-format
+msgid "cannot read file '%s' for replaying"
+msgstr ""
+"файлът „%s“ не може да бъде прочетен, за да се изпълнят командите от него "
+"наново"
+
+#: builtin/bisect--helper.c:1047
 msgid "reset the bisection state"
 msgstr "изчистване на състоянието на двоичното търсене"
 
-#: builtin/bisect--helper.c:926
-msgid "write out the bisection state in BISECT_LOG"
-msgstr "запис на състоянието на двоичното търсене в „BISECT_LOG“"
-
-#: builtin/bisect--helper.c:928
-msgid "check and set terms in a bisection state"
-msgstr ""
-"проверка и задаване на управляващи думи към състоянието на двоичното търсене"
-
-#: builtin/bisect--helper.c:930
+#: builtin/bisect--helper.c:1049
 msgid "check whether bad or good terms exist"
 msgstr "проверка дали съществуват одобряващи/отхвърлящи управляващи думи"
 
-#: builtin/bisect--helper.c:932
+#: builtin/bisect--helper.c:1051
 msgid "print out the bisect terms"
 msgstr "извеждане на управляващите думи"
 
-#: builtin/bisect--helper.c:934
+#: builtin/bisect--helper.c:1053
 msgid "start the bisect session"
 msgstr "начало на двоично търсене"
 
-#: builtin/bisect--helper.c:936
+#: builtin/bisect--helper.c:1055
 msgid "find the next bisection commit"
 msgstr "откриване на следващото подаване при двоично търсене"
 
-#: builtin/bisect--helper.c:938
-msgid "verify the next bisection state then checkout the next bisection commit"
-msgstr ""
-"проверка на следващото състояние и преминаване към следващото подаване при "
-"двоично търсене"
-
-#: builtin/bisect--helper.c:940
+#: builtin/bisect--helper.c:1057
 msgid "mark the state of ref (or refs)"
 msgstr "задаване на състоянието на указателя/ите"
 
-#: builtin/bisect--helper.c:942
+#: builtin/bisect--helper.c:1059
+msgid "list the bisection steps so far"
+msgstr "извеждане на стъпките на двоичното търсене досега"
+
+#: builtin/bisect--helper.c:1061
+msgid "replay the bisection process from the given file"
+msgstr "наново изпълнение на двоичното търсене чрез дадения файл"
+
+#: builtin/bisect--helper.c:1063
+msgid "skip some commits for checkout"
+msgstr "прескачане на някои подавания при изтегляне"
+
+#: builtin/bisect--helper.c:1065
 msgid "no log for BISECT_WRITE"
 msgstr "липсва запис за „BISECT_WRITE“"
 
-#: builtin/bisect--helper.c:957
+#: builtin/bisect--helper.c:1080
 msgid "--bisect-reset requires either no argument or a commit"
 msgstr "опцията „--bisect-reset“ изисква или 0 аргументи, или 1 — подаване"
 
-#: builtin/bisect--helper.c:961
-msgid "--bisect-write requires either 4 or 5 arguments"
-msgstr "опцията „--bisect-write“ изисква 4 или 5 аргумента"
-
-#: builtin/bisect--helper.c:967
-msgid "--check-and-set-terms requires 3 arguments"
-msgstr "опцията „--check-and-set-terms“ изисква 3 аргумента"
-
-#: builtin/bisect--helper.c:973
+#: builtin/bisect--helper.c:1085
 msgid "--bisect-next-check requires 2 or 3 arguments"
 msgstr "опцията „--bisect-next-check“ изисква 2 или 3 аргумента"
 
-#: builtin/bisect--helper.c:979
+#: builtin/bisect--helper.c:1091
 msgid "--bisect-terms requires 0 or 1 argument"
 msgstr "опцията „--bisect-terms“ изисква 0 или 1 аргумента"
 
-#: builtin/bisect--helper.c:988
+#: builtin/bisect--helper.c:1100
 msgid "--bisect-next requires 0 arguments"
 msgstr "опцията „--bisect-next“ не приема аргументи"
 
-#: builtin/bisect--helper.c:994
-msgid "--bisect-auto-next requires 0 arguments"
-msgstr "опцията „--bisect-auto-next“ не приема аргументи"
+#: builtin/bisect--helper.c:1111
+msgid "--bisect-log requires 0 arguments"
+msgstr "опцията „--bisect-log“ не приема аргументи"
+
+#: builtin/bisect--helper.c:1116
+msgid "no logfile given"
+msgstr "не е зададен журнален файл"
 
 #: builtin/blame.c:32
 msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
@@ -11050,155 +11361,158 @@
 msgid "must end with a color"
 msgstr "трябва да завършва с цвят"
 
-#: builtin/blame.c:730
+#: builtin/blame.c:728
 #, c-format
 msgid "invalid color '%s' in color.blame.repeatedLines"
 msgstr "неправилен цвят „%s“ в „color.blame.repeatedLines“"
 
-#: builtin/blame.c:748
+#: builtin/blame.c:746
 msgid "invalid value for blame.coloring"
 msgstr "неправилна стойност за „blame.coloring“"
 
-#: builtin/blame.c:847
+#: builtin/blame.c:845
 #, c-format
 msgid "cannot find revision %s to ignore"
 msgstr "версията за прескачане „%s“ не може да бъде открита"
 
-#: builtin/blame.c:869
-msgid "Show blame entries as we find them, incrementally"
-msgstr "Извеждане на авторството с намирането му, последователно"
+#: builtin/blame.c:867
+msgid "show blame entries as we find them, incrementally"
+msgstr "извеждане на авторството с намирането му, последователно"
 
-#: builtin/blame.c:870
-msgid "Do not show object names of boundary commits (Default: off)"
+#: builtin/blame.c:868
+msgid "do not show object names of boundary commits (Default: off)"
 msgstr ""
-"Без извеждане на имената на обектите за граничните подавания (стандартно "
+"без извеждане на имената на обектите за граничните подавания (стандартно "
 "опцията е изключена)"
 
-#: builtin/blame.c:871
-msgid "Do not treat root commits as boundaries (Default: off)"
+#: builtin/blame.c:869
+msgid "do not treat root commits as boundaries (Default: off)"
 msgstr ""
-"Началните подавания да не се считат за гранични (стандартно опцията е "
+"началните подавания да не се считат за гранични (стандартно опцията е "
 "изключена)"
 
+#: builtin/blame.c:870
+msgid "show work cost statistics"
+msgstr "извеждане на статистика за извършените действия"
+
+#: builtin/blame.c:871 builtin/checkout.c:1503 builtin/clone.c:92
+#: builtin/commit-graph.c:84 builtin/commit-graph.c:222 builtin/fetch.c:175
+#: builtin/merge.c:297 builtin/multi-pack-index.c:27 builtin/pull.c:119
+#: builtin/push.c:575 builtin/send-pack.c:198
+msgid "force progress reporting"
+msgstr "извеждане на напредъка"
+
 #: builtin/blame.c:872
-msgid "Show work cost statistics"
-msgstr "Извеждане на статистика за извършените действия"
+msgid "show output score for blame entries"
+msgstr "извеждане на допълнителна информация за определянето на авторството"
 
 #: builtin/blame.c:873
-msgid "Force progress reporting"
-msgstr "Принудително извеждане на напредъка"
+msgid "show original filename (Default: auto)"
+msgstr ""
+"извеждане на първоначалното име на файл (стандартно това е автоматично)"
 
 #: builtin/blame.c:874
-msgid "Show output score for blame entries"
-msgstr "Извеждане на допълнителна информация за определянето на авторството"
+msgid "show original linenumber (Default: off)"
+msgstr ""
+"извеждане на първоначалния номер на ред (стандартно опцията е изключена)"
 
 #: builtin/blame.c:875
-msgid "Show original filename (Default: auto)"
-msgstr ""
-"Извеждане на първоначалното име на файл (стандартно това е автоматично)"
+msgid "show in a format designed for machine consumption"
+msgstr "извеждане във формат за по-нататъшна обработка"
 
 #: builtin/blame.c:876
-msgid "Show original linenumber (Default: off)"
+msgid "show porcelain format with per-line commit information"
 msgstr ""
-"Извеждане на първоначалният номер на ред (стандартно опцията е изключена)"
-
-#: builtin/blame.c:877
-msgid "Show in a format designed for machine consumption"
-msgstr "Извеждане във формат за по-нататъшна обработка"
-
-#: builtin/blame.c:878
-msgid "Show porcelain format with per-line commit information"
-msgstr ""
-"Извеждане във формат за команди от потребителско ниво с информация на всеки "
+"извеждане във формат за команди от потребителско ниво с информация на всеки "
 "ред"
 
-#: builtin/blame.c:879
-msgid "Use the same output mode as git-annotate (Default: off)"
+#: builtin/blame.c:877
+msgid "use the same output mode as git-annotate (Default: off)"
 msgstr ""
-"Използване на същия формат като „git-annotate“ (стандартно опцията е "
+"използване на същия формат като „git-annotate“ (стандартно опцията е "
 "изключена)"
 
+#: builtin/blame.c:878
+msgid "show raw timestamp (Default: off)"
+msgstr "извеждане на неформатирани времена (стандартно опцията е изключена)"
+
+#: builtin/blame.c:879
+msgid "show long commit SHA1 (Default: off)"
+msgstr "извеждане на пълните суми по SHA1 (стандартно опцията е изключена)"
+
 #: builtin/blame.c:880
-msgid "Show raw timestamp (Default: off)"
-msgstr "Извеждане на неформатирани времена (стандартно опцията е изключена)"
+msgid "suppress author name and timestamp (Default: off)"
+msgstr "без име на автор и време на промяна (стандартно опцията е изключена)"
 
 #: builtin/blame.c:881
-msgid "Show long commit SHA1 (Default: off)"
-msgstr "Извеждане на пълните суми по SHA1 (стандартно опцията е изключена)"
-
-#: builtin/blame.c:882
-msgid "Suppress author name and timestamp (Default: off)"
-msgstr "Без име на автор и време на промяна (стандартно опцията е изключена)"
-
-#: builtin/blame.c:883
-msgid "Show author email instead of name (Default: off)"
+msgid "show author email instead of name (Default: off)"
 msgstr ""
-"Извеждане на е-пощата на автора, а не името му (стандартно опцията е "
+"извеждане на е-пощата на автора, а не името му (стандартно опцията е "
 "изключена)"
 
-#: builtin/blame.c:884
-msgid "Ignore whitespace differences"
-msgstr "Без разлики в знаците за интервали"
+#: builtin/blame.c:882
+msgid "ignore whitespace differences"
+msgstr "без разлики в знаците за интервали"
 
-#: builtin/blame.c:885 builtin/log.c:1813
+#: builtin/blame.c:883 builtin/log.c:1812
 msgid "rev"
 msgstr "ВЕРС"
 
+#: builtin/blame.c:883
+msgid "ignore <rev> when blaming"
+msgstr "прескачане на ВЕРСията при извеждане на авторството"
+
+#: builtin/blame.c:884
+msgid "ignore revisions from <file>"
+msgstr "прескачане на версиите указани във ФАЙЛа"
+
 #: builtin/blame.c:885
-msgid "Ignore <rev> when blaming"
-msgstr "Прескачане на ВЕРСията при извеждане на авторството"
-
-#: builtin/blame.c:886
-msgid "Ignore revisions from <file>"
-msgstr "Прескачане на версиите указани във ФАЙЛа при извеждане на авторството"
-
-#: builtin/blame.c:887
 msgid "color redundant metadata from previous line differently"
 msgstr ""
 "оцветяване на повтарящите се метаданни от предишния ред в различен цвят"
 
-#: builtin/blame.c:888
+#: builtin/blame.c:886
 msgid "color lines by age"
 msgstr "оцветяване на редовете по възраст"
 
+#: builtin/blame.c:887
+msgid "spend extra cycles to find better match"
+msgstr "допълнителни изчисления за по-добри резултати"
+
+#: builtin/blame.c:888
+msgid "use revisions from <file> instead of calling git-rev-list"
+msgstr "изчитане на версиите от ФАЙЛа, а не чрез изпълнение на „git-rev-list“"
+
 #: builtin/blame.c:889
-msgid "Spend extra cycles to find better match"
-msgstr "Допълнителни изчисления за по-добри резултати"
+msgid "use <file>'s contents as the final image"
+msgstr "използване на съдържанието на ФАЙЛа като крайно положение"
 
-#: builtin/blame.c:890
-msgid "Use revisions from <file> instead of calling git-rev-list"
-msgstr "Изчитане на версиите от ФАЙЛ, а не чрез изпълнение на „git-rev-list“"
-
-#: builtin/blame.c:891
-msgid "Use <file>'s contents as the final image"
-msgstr "Използване на съдържанието на ФАЙЛа като крайно положение"
-
-#: builtin/blame.c:892 builtin/blame.c:893
+#: builtin/blame.c:890 builtin/blame.c:891
 msgid "score"
 msgstr "напасване на редовете"
 
-#: builtin/blame.c:892
-msgid "Find line copies within and across files"
+#: builtin/blame.c:890
+msgid "find line copies within and across files"
 msgstr ""
-"Търсене на копирани редове както в рамките на един файл, така и от един файл "
+"търсене на копирани редове както в рамките на един файл, така и от един файл "
 "към друг"
 
-#: builtin/blame.c:893
-msgid "Find line movements within and across files"
+#: builtin/blame.c:891
+msgid "find line movements within and across files"
 msgstr ""
-"Търсене на преместени редове както в рамките на един файл, така и от един "
+"търсене на преместени редове както в рамките на един файл, така и от един "
 "файл към друг"
 
-#: builtin/blame.c:894
+#: builtin/blame.c:892
 msgid "range"
 msgstr "диапазон"
 
-#: builtin/blame.c:895
-msgid "Process only line range <start>,<end> or function :<funcname>"
+#: builtin/blame.c:893
+msgid "process only line range <start>,<end> or function :<funcname>"
 msgstr ""
-"Информация само за редовете в диапазона НАЧАЛО,КРАЙ или само на :ФУНКЦИЯта"
+"информация само за редовете в диапазона НАЧАЛО,КРАЙ или само на :ФУНКЦИЯта"
 
-#: builtin/blame.c:947
+#: builtin/blame.c:945
 msgid "--progress can't be used with --incremental or porcelain formats"
 msgstr ""
 "опцията „--progress“ е несъвместима с „--incremental“ и форма̀та на командите "
@@ -11212,18 +11526,18 @@
 #. your language may need more or fewer display
 #. columns.
 #.
-#: builtin/blame.c:998
+#: builtin/blame.c:996
 msgid "4 years, 11 months ago"
 msgstr "преди 4 години и 11 месеца"
 
-#: builtin/blame.c:1114
+#: builtin/blame.c:1112
 #, c-format
 msgid "file %s has only %lu line"
 msgid_plural "file %s has only %lu lines"
 msgstr[0] "има само %2$lu ред във файла „%1$s“"
 msgstr[1] "има само %2$lu реда във файла „%1$s“"
 
-#: builtin/blame.c:1159
+#: builtin/blame.c:1157
 msgid "Blaming lines"
 msgstr "Редове с авторство"
 
@@ -11291,118 +11605,108 @@
 msgid "Update of config-file failed"
 msgstr "Неуспешно обновяване на конфигурационния файл"
 
-#: builtin/branch.c:220
+#: builtin/branch.c:223
 msgid "cannot use -a with -d"
 msgstr "Опцията „-a“ е несъвместима с опцията „-d“"
 
-#: builtin/branch.c:226
+#: builtin/branch.c:230
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Обектът-подаване, сочен от указателя „HEAD“, не може да бъде открит"
 
-#: builtin/branch.c:240
+#: builtin/branch.c:244
 #, c-format
 msgid "Cannot delete branch '%s' checked out at '%s'"
 msgstr "Не можете да изтриете клона „%s“, който е изтеглен в пътя „%s“"
 
-#: builtin/branch.c:255
+#: builtin/branch.c:259
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "следящият клон „%s“ не може да бъде открит."
 
-#: builtin/branch.c:256
+#: builtin/branch.c:260
 #, c-format
 msgid "branch '%s' not found."
 msgstr "клонът „%s“ не може да бъде открит."
 
-#: builtin/branch.c:271
-#, c-format
-msgid "Error deleting remote-tracking branch '%s'"
-msgstr "Грешка при изтриването на следящия клон „%s“"
-
-#: builtin/branch.c:272
-#, c-format
-msgid "Error deleting branch '%s'"
-msgstr "Грешка при изтриването на клона „%s“"
-
-#: builtin/branch.c:279
+#: builtin/branch.c:291
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Изтрит следящ клон „%s“ (той сочеше към „%s“).\n"
 
-#: builtin/branch.c:280
+#: builtin/branch.c:292
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Изтрит клон „%s“ (той сочеше към „%s“).\n"
 
-#: builtin/branch.c:429 builtin/tag.c:61
+#: builtin/branch.c:438 builtin/tag.c:61
 msgid "unable to parse format string"
 msgstr "форматиращият низ не може да бъде анализиран: %s"
 
-#: builtin/branch.c:460
+#: builtin/branch.c:469
 msgid "could not resolve HEAD"
 msgstr "подаването, сочено от указателя „HEAD“, не може да се установи"
 
-#: builtin/branch.c:466
+#: builtin/branch.c:475
 #, c-format
 msgid "HEAD (%s) points outside of refs/heads/"
 msgstr "„HEAD“ (%s) сочи извън директорията „refs/heads“"
 
-#: builtin/branch.c:481
+#: builtin/branch.c:490
 #, c-format
 msgid "Branch %s is being rebased at %s"
 msgstr "Клонът „%s“ се пребазира върху „%s“"
 
-#: builtin/branch.c:485
+#: builtin/branch.c:494
 #, c-format
 msgid "Branch %s is being bisected at %s"
 msgstr "Търси се двоично в клона „%s“ при „%s“"
 
-#: builtin/branch.c:502
+#: builtin/branch.c:511
 msgid "cannot copy the current branch while not on any."
 msgstr "не можете да копирате текущия клон, защото сте извън който и да е клон"
 
-#: builtin/branch.c:504
+#: builtin/branch.c:513
 msgid "cannot rename the current branch while not on any."
 msgstr ""
 "не можете да преименувате текущия клон, защото сте извън който и да е клон"
 
-#: builtin/branch.c:515
+#: builtin/branch.c:524
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Неправилно име на клон: „%s“"
 
-#: builtin/branch.c:544
+#: builtin/branch.c:553
 msgid "Branch rename failed"
 msgstr "Неуспешно преименуване на клон"
 
-#: builtin/branch.c:546
+#: builtin/branch.c:555
 msgid "Branch copy failed"
 msgstr "Неуспешно копиране на клон"
 
-#: builtin/branch.c:550
+#: builtin/branch.c:559
 #, c-format
 msgid "Created a copy of a misnamed branch '%s'"
 msgstr "Клонът с неправилно име „%s“ е копиран"
 
-#: builtin/branch.c:553
+#: builtin/branch.c:562
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Клонът с неправилно име „%s“ е преименуван"
 
-#: builtin/branch.c:559
+#: builtin/branch.c:568
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Клонът е преименуван на „%s“, но указателят „HEAD“ не е обновен"
 
-#: builtin/branch.c:568
+#: builtin/branch.c:577
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "Клонът е преименуван, но конфигурационният файл не е обновен"
 
-#: builtin/branch.c:570
+#: builtin/branch.c:579
 msgid "Branch is copied, but update of config-file failed"
 msgstr "Клонът е копиран, но конфигурационният файл не е обновен"
 
-#: builtin/branch.c:586
+#: builtin/branch.c:595
 #, c-format
 msgid ""
 "Please edit the description for the branch\n"
@@ -11413,183 +11717,183 @@
 "    %s\n"
 "Редовете, които започват с „%c“, ще бъдат пропуснати.\n"
 
-#: builtin/branch.c:620
+#: builtin/branch.c:629
 msgid "Generic options"
 msgstr "Общи настройки"
 
-#: builtin/branch.c:622
+#: builtin/branch.c:631
 msgid "show hash and subject, give twice for upstream branch"
 msgstr ""
 "извеждане на контролната сума и темата.  Повтарянето на опцията прибавя "
 "отдалечените клони"
 
-#: builtin/branch.c:623
+#: builtin/branch.c:632
 msgid "suppress informational messages"
 msgstr "без информационни съобщения"
 
-#: builtin/branch.c:624
+#: builtin/branch.c:633
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "задаване на режима на следене (виж git-pull(1))"
 
-#: builtin/branch.c:626
+#: builtin/branch.c:635
 msgid "do not use"
 msgstr "да не се ползва"
 
-#: builtin/branch.c:628 builtin/rebase.c:532
+#: builtin/branch.c:637 builtin/rebase.c:534
 msgid "upstream"
 msgstr "клон-източник"
 
-#: builtin/branch.c:628
+#: builtin/branch.c:637
 msgid "change the upstream info"
 msgstr "смяна на клона-източник"
 
-#: builtin/branch.c:629
+#: builtin/branch.c:638
 msgid "unset the upstream info"
 msgstr "изчистване на информацията за клон-източник"
 
-#: builtin/branch.c:630
+#: builtin/branch.c:639
 msgid "use colored output"
 msgstr "цветен изход"
 
-#: builtin/branch.c:631
+#: builtin/branch.c:640
 msgid "act on remote-tracking branches"
 msgstr "действие върху следящите клони"
 
-#: builtin/branch.c:633 builtin/branch.c:635
+#: builtin/branch.c:642 builtin/branch.c:644
 msgid "print only branches that contain the commit"
 msgstr "извеждане само на клоните, които съдържат това ПОДАВАНЕ"
 
-#: builtin/branch.c:634 builtin/branch.c:636
+#: builtin/branch.c:643 builtin/branch.c:645
 msgid "print only branches that don't contain the commit"
 msgstr "извеждане само на клоните, които не съдържат това ПОДАВАНЕ"
 
-#: builtin/branch.c:639
+#: builtin/branch.c:648
 msgid "Specific git-branch actions:"
 msgstr "Специални действия на „git-branch“:"
 
-#: builtin/branch.c:640
+#: builtin/branch.c:649
 msgid "list both remote-tracking and local branches"
 msgstr "извеждане както на следящите, така и на локалните клони"
 
-#: builtin/branch.c:642
+#: builtin/branch.c:651
 msgid "delete fully merged branch"
 msgstr "изтриване на клони, които са напълно слети"
 
-#: builtin/branch.c:643
+#: builtin/branch.c:652
 msgid "delete branch (even if not merged)"
 msgstr "изтриване и на клони, които не са напълно слети"
 
-#: builtin/branch.c:644
+#: builtin/branch.c:653
 msgid "move/rename a branch and its reflog"
 msgstr ""
 "преместване/преименуване на клон и принадлежащият му журнал на указателите"
 
-#: builtin/branch.c:645
+#: builtin/branch.c:654
 msgid "move/rename a branch, even if target exists"
 msgstr "преместване/преименуване на клон, дори ако има вече клон с такова име"
 
-#: builtin/branch.c:646
+#: builtin/branch.c:655
 msgid "copy a branch and its reflog"
 msgstr "копиране на клон и принадлежащия му журнал на указателите"
 
-#: builtin/branch.c:647
+#: builtin/branch.c:656
 msgid "copy a branch, even if target exists"
 msgstr "копиране на клон, дори ако има вече клон с такова име"
 
-#: builtin/branch.c:648
+#: builtin/branch.c:657
 msgid "list branch names"
 msgstr "извеждане на имената на клоните"
 
-#: builtin/branch.c:649
+#: builtin/branch.c:658
 msgid "show current branch name"
 msgstr "извеждане на името на текущия клон"
 
-#: builtin/branch.c:650
+#: builtin/branch.c:659
 msgid "create the branch's reflog"
 msgstr "създаване на журнала на указателите на клона"
 
-#: builtin/branch.c:652
+#: builtin/branch.c:661
 msgid "edit the description for the branch"
 msgstr "редактиране на описанието на клона"
 
-#: builtin/branch.c:653
+#: builtin/branch.c:662
 msgid "force creation, move/rename, deletion"
 msgstr "принудително създаване, преместване, преименуване, изтриване"
 
-#: builtin/branch.c:654
+#: builtin/branch.c:663
 msgid "print only branches that are merged"
 msgstr "извеждане само на слетите клони"
 
-#: builtin/branch.c:655
+#: builtin/branch.c:664
 msgid "print only branches that are not merged"
 msgstr "извеждане само на неслетите клони"
 
-#: builtin/branch.c:656
+#: builtin/branch.c:665
 msgid "list branches in columns"
 msgstr "извеждане по колони"
 
-#: builtin/branch.c:658 builtin/for-each-ref.c:42 builtin/notes.c:415
+#: builtin/branch.c:667 builtin/for-each-ref.c:42 builtin/notes.c:415
 #: builtin/notes.c:418 builtin/notes.c:581 builtin/notes.c:584
-#: builtin/tag.c:434
+#: builtin/tag.c:466
 msgid "object"
 msgstr "ОБЕКТ"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:668
 msgid "print only branches of the object"
 msgstr "извеждане само на клоните на ОБЕКТА"
 
-#: builtin/branch.c:660 builtin/for-each-ref.c:48 builtin/tag.c:441
+#: builtin/branch.c:669 builtin/for-each-ref.c:48 builtin/tag.c:473
 msgid "sorting and filtering are case insensitive"
 msgstr "подредбата и филтрирането третират еднакво малките и главните букви"
 
-#: builtin/branch.c:661 builtin/for-each-ref.c:38 builtin/tag.c:439
+#: builtin/branch.c:670 builtin/for-each-ref.c:38 builtin/tag.c:471
 #: builtin/verify-tag.c:38
 msgid "format to use for the output"
 msgstr "ФОРМАТ за изхода"
 
-#: builtin/branch.c:684 builtin/clone.c:790
+#: builtin/branch.c:693 builtin/clone.c:790
 msgid "HEAD not found below refs/heads!"
 msgstr "В директорията „refs/heads“ липсва файл „HEAD“"
 
-#: builtin/branch.c:708
+#: builtin/branch.c:717
 msgid "--column and --verbose are incompatible"
 msgstr "Опциите „--column“ и „--verbose“ са несъвместими"
 
-#: builtin/branch.c:723 builtin/branch.c:777 builtin/branch.c:786
+#: builtin/branch.c:732 builtin/branch.c:788 builtin/branch.c:797
 msgid "branch name required"
 msgstr "Необходимо е име на клон"
 
-#: builtin/branch.c:753
+#: builtin/branch.c:764
 msgid "Cannot give description to detached HEAD"
 msgstr "Не може да зададете описание на несвързан „HEAD“"
 
-#: builtin/branch.c:758
+#: builtin/branch.c:769
 msgid "cannot edit description of more than one branch"
 msgstr "Не може да редактирате описанието на повече от един клон едновременно"
 
-#: builtin/branch.c:765
+#: builtin/branch.c:776
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "В клона „%s“ все още няма подавания."
 
-#: builtin/branch.c:768
+#: builtin/branch.c:779
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Липсва клон на име „%s“."
 
-#: builtin/branch.c:783
+#: builtin/branch.c:794
 msgid "too many branches for a copy operation"
 msgstr "прекалено много клони за копиране"
 
-#: builtin/branch.c:792
+#: builtin/branch.c:803
 msgid "too many arguments for a rename operation"
 msgstr "прекалено много аргументи към командата за преименуване"
 
-#: builtin/branch.c:797
+#: builtin/branch.c:808
 msgid "too many arguments to set new upstream"
 msgstr "прекалено много аргументи към командата за следене"
 
-#: builtin/branch.c:801
+#: builtin/branch.c:812
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -11597,31 +11901,31 @@
 "Следеното от „HEAD“ не може да се зададе да е „%s“, защото то не сочи към "
 "никой клон."
 
-#: builtin/branch.c:804 builtin/branch.c:827
+#: builtin/branch.c:815 builtin/branch.c:838
 #, c-format
 msgid "no such branch '%s'"
 msgstr "Няма клон на име „%s“."
 
-#: builtin/branch.c:808
+#: builtin/branch.c:819
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "Не съществува клон на име „%s“."
 
-#: builtin/branch.c:821
+#: builtin/branch.c:832
 msgid "too many arguments to unset upstream"
 msgstr "прекалено много аргументи към командата за спиране на следене"
 
-#: builtin/branch.c:825
+#: builtin/branch.c:836
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "Следеното от „HEAD“ не може да махне, защото то не сочи към никой клон."
 
-#: builtin/branch.c:831
+#: builtin/branch.c:842
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Няма информация клонът „%s“ да следи някой друг"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:852
 msgid ""
 "The -a, and -r, options to 'git branch' do not take a branch name.\n"
 "Did you mean to use: -a|-r --list <pattern>?"
@@ -11629,7 +11933,7 @@
 "Опциите „-a“ и „-r“ на „git branch“ са несъвместими с име на клон.\n"
 "Пробвайте с: „-a|-r --list ШАБЛОН“"
 
-#: builtin/branch.c:845
+#: builtin/branch.c:856
 msgid ""
 "the '--set-upstream' option is no longer supported. Please use '--track' or "
 "'--set-upstream-to' instead."
@@ -11750,19 +12054,19 @@
 msgid "git bundle unbundle <file> [<refname>...]"
 msgstr "git bundle unbundle ФАЙЛ [ИМЕ_НА_УКАЗАТЕЛ…]"
 
-#: builtin/bundle.c:67 builtin/pack-objects.c:3480
+#: builtin/bundle.c:67 builtin/pack-objects.c:3495
 msgid "do not show progress meter"
 msgstr "без извеждане на напредъка"
 
-#: builtin/bundle.c:69 builtin/pack-objects.c:3482
+#: builtin/bundle.c:69 builtin/pack-objects.c:3497
 msgid "show progress meter"
 msgstr "извеждане на напредъка"
 
-#: builtin/bundle.c:71 builtin/pack-objects.c:3484
+#: builtin/bundle.c:71 builtin/pack-objects.c:3499
 msgid "show progress meter during object writing phase"
 msgstr "извеждане на напредъка във фазата на запазване на обектите"
 
-#: builtin/bundle.c:74 builtin/pack-objects.c:3487
+#: builtin/bundle.c:74 builtin/pack-objects.c:3502
 msgid "similar to --all-progress when progress meter is shown"
 msgstr ""
 "същото действие като опцията „--all-progress“ при извеждането на напредъка"
@@ -11913,8 +12217,8 @@
 msgid "terminate input and output records by a NUL character"
 msgstr "разделяне на входните и изходните записи с нулевия знак „NUL“"
 
-#: builtin/check-ignore.c:21 builtin/checkout.c:1500 builtin/gc.c:541
-#: builtin/worktree.c:561
+#: builtin/check-ignore.c:21 builtin/checkout.c:1499 builtin/gc.c:549
+#: builtin/worktree.c:489
 msgid "suppress progress reporting"
 msgstr "без показване на напредъка"
 
@@ -11967,54 +12271,54 @@
 msgid "no contacts specified"
 msgstr "не са указани контакти"
 
-#: builtin/checkout-index.c:139
+#: builtin/checkout-index.c:152
 msgid "git checkout-index [<options>] [--] [<file>...]"
 msgstr "git checkout-index [ОПЦИЯ…] [--] [ФАЙЛ…]"
 
-#: builtin/checkout-index.c:156
+#: builtin/checkout-index.c:169
 msgid "stage should be between 1 and 3 or all"
 msgstr "етапът трябва да е „1“, „2“, „3“ или „all“ (всички)"
 
-#: builtin/checkout-index.c:173
+#: builtin/checkout-index.c:186
 msgid "check out all files in the index"
 msgstr "изтегляне на всички файлове в индекса"
 
-#: builtin/checkout-index.c:174
+#: builtin/checkout-index.c:187
 msgid "force overwrite of existing files"
 msgstr "презаписване на файловете, дори и да съществуват"
 
-#: builtin/checkout-index.c:176
+#: builtin/checkout-index.c:189
 msgid "no warning for existing files and files not in index"
 msgstr "без предупреждения при липсващи файлове и файлове не в индекса"
 
-#: builtin/checkout-index.c:178
+#: builtin/checkout-index.c:191
 msgid "don't checkout new files"
 msgstr "без изтегляне на нови файлове"
 
-#: builtin/checkout-index.c:180
+#: builtin/checkout-index.c:193
 msgid "update stat information in the index file"
 msgstr "обновяване на информацията получена чрез „stat“ за файловете в индекса"
 
-#: builtin/checkout-index.c:184
+#: builtin/checkout-index.c:197
 msgid "read list of paths from the standard input"
 msgstr "изчитане на пътищата от стандартния вход"
 
-#: builtin/checkout-index.c:186
+#: builtin/checkout-index.c:199
 msgid "write the content to temporary files"
 msgstr "записване на съдържанието във временни файлове"
 
-#: builtin/checkout-index.c:187 builtin/column.c:31
+#: builtin/checkout-index.c:200 builtin/column.c:31
 #: builtin/submodule--helper.c:1824 builtin/submodule--helper.c:1827
 #: builtin/submodule--helper.c:1835 builtin/submodule--helper.c:2333
-#: builtin/worktree.c:757
+#: builtin/worktree.c:717
 msgid "string"
 msgstr "НИЗ"
 
-#: builtin/checkout-index.c:188
+#: builtin/checkout-index.c:201
 msgid "when creating files, prepend <string>"
 msgstr "при създаването на нови файлове да се добавя префикса НИЗ"
 
-#: builtin/checkout-index.c:190
+#: builtin/checkout-index.c:203
 msgid "copy out the files from named stage"
 msgstr "копиране на файловете от това състояние на сливане"
 
@@ -12117,16 +12421,16 @@
 msgid "'%s' or '%s' cannot be used with %s"
 msgstr "опцията „%3$s“ е несъвместима както с „%1$s“, така и с „%2$s“"
 
-#: builtin/checkout.c:541 builtin/checkout.c:548
+#: builtin/checkout.c:543 builtin/checkout.c:550
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "пътят „%s“ не е слят"
 
-#: builtin/checkout.c:716
+#: builtin/checkout.c:718
 msgid "you need to resolve your current index first"
 msgstr "първо трябва да коригирате индекса си"
 
-#: builtin/checkout.c:770
+#: builtin/checkout.c:772
 #, c-format
 msgid ""
 "cannot continue with staged changes in the following files:\n"
@@ -12136,50 +12440,50 @@
 "индекса:\n"
 "%s"
 
-#: builtin/checkout.c:866
+#: builtin/checkout.c:865
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Журналът на указателите за „%s“ не може да се проследи: %s\n"
 
-#: builtin/checkout.c:908
+#: builtin/checkout.c:907
 msgid "HEAD is now at"
 msgstr "Указателят „HEAD“ в момента сочи към"
 
-#: builtin/checkout.c:912 builtin/clone.c:721 t/helper/test-fast-rebase.c:202
+#: builtin/checkout.c:911 builtin/clone.c:721 t/helper/test-fast-rebase.c:202
 msgid "unable to update HEAD"
 msgstr "Указателят „HEAD“ не може да бъде обновен"
 
-#: builtin/checkout.c:916
+#: builtin/checkout.c:915
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Зануляване на клона „%s“\n"
 
-#: builtin/checkout.c:919
+#: builtin/checkout.c:918
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Вече сте на „%s“\n"
 
-#: builtin/checkout.c:923
+#: builtin/checkout.c:922
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Преминаване към клона „%s“ и зануляване на промените\n"
 
-#: builtin/checkout.c:925 builtin/checkout.c:1356
+#: builtin/checkout.c:924 builtin/checkout.c:1355
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Преминахте към новия клон „%s“\n"
 
-#: builtin/checkout.c:927
+#: builtin/checkout.c:926
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Преминахте към клона „%s“\n"
 
-#: builtin/checkout.c:978
+#: builtin/checkout.c:977
 #, c-format
 msgid " ... and %d more.\n"
 msgstr "… и още %d.\n"
 
-#: builtin/checkout.c:984
+#: builtin/checkout.c:983
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -12201,7 +12505,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -12228,19 +12532,19 @@
 "    git branch ИМЕ_НА_НОВИЯ_КЛОН %s\n"
 "\n"
 
-#: builtin/checkout.c:1038
+#: builtin/checkout.c:1037
 msgid "internal error in revision walk"
 msgstr "вътрешна грешка при обхождането на версиите"
 
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
 msgid "Previous HEAD position was"
 msgstr "Преди това „HEAD“ сочеше към"
 
-#: builtin/checkout.c:1082 builtin/checkout.c:1351
+#: builtin/checkout.c:1081 builtin/checkout.c:1350
 msgid "You are on a branch yet to be born"
 msgstr "В момента сте на клон, който все още не е създаден"
 
-#: builtin/checkout.c:1164
+#: builtin/checkout.c:1163
 #, c-format
 msgid ""
 "'%s' could be both a local file and a tracking branch.\n"
@@ -12249,7 +12553,7 @@
 "„%s“ може да е както локален файл, така и следящ клон.  За уточняване\n"
 "ползвайте разделителя „--“ (и евентуално опцията „--no-guess“)"
 
-#: builtin/checkout.c:1171
+#: builtin/checkout.c:1170
 msgid ""
 "If you meant to check out a remote tracking branch on, e.g. 'origin',\n"
 "you can do so by fully qualifying the name with the --track option:\n"
@@ -12271,51 +12575,51 @@
 "\n"
 "    checkout.defaultRemote=origin"
 
-#: builtin/checkout.c:1181
+#: builtin/checkout.c:1180
 #, c-format
 msgid "'%s' matched multiple (%d) remote tracking branches"
 msgstr "„%s“ напасва с множество (%d) отдалечени клони"
 
-#: builtin/checkout.c:1247
+#: builtin/checkout.c:1246
 msgid "only one reference expected"
 msgstr "очаква се само един указател"
 
-#: builtin/checkout.c:1264
+#: builtin/checkout.c:1263
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "очаква се един указател, а сте подали %d."
 
-#: builtin/checkout.c:1310 builtin/worktree.c:342 builtin/worktree.c:510
+#: builtin/checkout.c:1309 builtin/worktree.c:270 builtin/worktree.c:438
 #, c-format
 msgid "invalid reference: %s"
 msgstr "неправилен указател: %s"
 
-#: builtin/checkout.c:1323 builtin/checkout.c:1689
+#: builtin/checkout.c:1322 builtin/checkout.c:1688
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "указателят не сочи към обект-дърво: %s"
 
-#: builtin/checkout.c:1370
+#: builtin/checkout.c:1369
 #, c-format
 msgid "a branch is expected, got tag '%s'"
 msgstr "очаква се клон, а не етикет — „%s“"
 
-#: builtin/checkout.c:1372
+#: builtin/checkout.c:1371
 #, c-format
 msgid "a branch is expected, got remote branch '%s'"
 msgstr "очаква се локален, а не отдалечен клон — „%s“"
 
-#: builtin/checkout.c:1373 builtin/checkout.c:1381
+#: builtin/checkout.c:1372 builtin/checkout.c:1380
 #, c-format
 msgid "a branch is expected, got '%s'"
 msgstr "очаква се клон, а не „%s“"
 
-#: builtin/checkout.c:1376
+#: builtin/checkout.c:1375
 #, c-format
 msgid "a branch is expected, got commit '%s'"
 msgstr "очаква се клон, а не подаване — „%s“"
 
-#: builtin/checkout.c:1392
+#: builtin/checkout.c:1391
 msgid ""
 "cannot switch branch while merging\n"
 "Consider \"git merge --quit\" or \"git worktree add\"."
@@ -12323,7 +12627,7 @@
 "по време на сливане не може да преминете към друг клон.\n"
 "Пробвайте с „git merge --quit“ или „git worktree add“."
 
-#: builtin/checkout.c:1396
+#: builtin/checkout.c:1395
 msgid ""
 "cannot switch branch in the middle of an am session\n"
 "Consider \"git am --quit\" or \"git worktree add\"."
@@ -12332,7 +12636,7 @@
 "клон.\n"
 "Пробвайте с „git am --quit“ или „git worktree add“."
 
-#: builtin/checkout.c:1400
+#: builtin/checkout.c:1399
 msgid ""
 "cannot switch branch while rebasing\n"
 "Consider \"git rebase --quit\" or \"git worktree add\"."
@@ -12340,7 +12644,7 @@
 "по време на пребазиране не може да преминете към друг клон.\n"
 "Пробвайте с „git rebase --quit“ или „git worktree add“."
 
-#: builtin/checkout.c:1404
+#: builtin/checkout.c:1403
 msgid ""
 "cannot switch branch while cherry-picking\n"
 "Consider \"git cherry-pick --quit\" or \"git worktree add\"."
@@ -12348,7 +12652,7 @@
 "по време на отбиране на подавания не може да преминете към друг клон.\n"
 "Пробвайте с „git cherry-pick --quit“ или „git worktree add“."
 
-#: builtin/checkout.c:1408
+#: builtin/checkout.c:1407
 msgid ""
 "cannot switch branch while reverting\n"
 "Consider \"git revert --quit\" or \"git worktree add\"."
@@ -12356,146 +12660,139 @@
 "по време на отмяна на подавания не може да преминете към друг клон.\n"
 "Пробвайте с „git revert --quit“ или „git worktree add“."
 
-#: builtin/checkout.c:1412
+#: builtin/checkout.c:1411
 msgid "you are switching branch while bisecting"
 msgstr "преминаване към друг клон по време на двоично търсене"
 
-#: builtin/checkout.c:1419
+#: builtin/checkout.c:1418
 msgid "paths cannot be used with switching branches"
 msgstr "задаването на път е несъвместимо с преминаването от един клон към друг"
 
-#: builtin/checkout.c:1422 builtin/checkout.c:1426 builtin/checkout.c:1430
+#: builtin/checkout.c:1421 builtin/checkout.c:1425 builtin/checkout.c:1429
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "опцията „%s“ е несъвместима с преминаването от един клон към друг"
 
-#: builtin/checkout.c:1434 builtin/checkout.c:1437 builtin/checkout.c:1440
-#: builtin/checkout.c:1445 builtin/checkout.c:1450
+#: builtin/checkout.c:1433 builtin/checkout.c:1436 builtin/checkout.c:1439
+#: builtin/checkout.c:1444 builtin/checkout.c:1449
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "опцията „%s“ е несъвместима с „%s“"
 
-#: builtin/checkout.c:1447
+#: builtin/checkout.c:1446
 #, c-format
 msgid "'%s' cannot take <start-point>"
 msgstr "опцията „%s“ е несъвместима със задаването на НАЧАЛО"
 
-#: builtin/checkout.c:1455
+#: builtin/checkout.c:1454
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr ""
 "За да преминете към клон, подайте указател, който сочи към подаване.  „%s“ "
 "не е такъв"
 
-#: builtin/checkout.c:1462
+#: builtin/checkout.c:1461
 msgid "missing branch or commit argument"
 msgstr "липсва аргумент — клон или подаване"
 
-#: builtin/checkout.c:1504 builtin/clone.c:92 builtin/commit-graph.c:84
-#: builtin/commit-graph.c:222 builtin/fetch.c:172 builtin/merge.c:296
-#: builtin/multi-pack-index.c:27 builtin/pull.c:119 builtin/push.c:575
-#: builtin/send-pack.c:198
-msgid "force progress reporting"
-msgstr "извеждане на напредъка"
-
-#: builtin/checkout.c:1505
+#: builtin/checkout.c:1504
 msgid "perform a 3-way merge with the new branch"
 msgstr "извършване на тройно сливане с новия клон"
 
-#: builtin/checkout.c:1506 builtin/log.c:1800 parse-options.h:322
+#: builtin/checkout.c:1505 builtin/log.c:1799 parse-options.h:322
 msgid "style"
 msgstr "СТИЛ"
 
-#: builtin/checkout.c:1507
+#: builtin/checkout.c:1506
 msgid "conflict style (merge or diff3)"
 msgstr "действие при конфликт (сливане или тройна разлика)"
 
-#: builtin/checkout.c:1519 builtin/worktree.c:558
+#: builtin/checkout.c:1518 builtin/worktree.c:486
 msgid "detach HEAD at named commit"
 msgstr "отделяне на указателя „HEAD“ към указаното подаване"
 
-#: builtin/checkout.c:1520
+#: builtin/checkout.c:1519
 msgid "set upstream info for new branch"
 msgstr "задаване на кой клон бива следен при създаването на новия клон"
 
-#: builtin/checkout.c:1522
+#: builtin/checkout.c:1521
 msgid "force checkout (throw away local modifications)"
 msgstr "принудително изтегляне (вашите промени ще бъдат занулени)"
 
-#: builtin/checkout.c:1524
+#: builtin/checkout.c:1523
 msgid "new-branch"
 msgstr "НОВ_КЛОН"
 
-#: builtin/checkout.c:1524
+#: builtin/checkout.c:1523
 msgid "new unparented branch"
 msgstr "нов клон без родител"
 
-#: builtin/checkout.c:1526 builtin/merge.c:300
+#: builtin/checkout.c:1525 builtin/merge.c:301
 msgid "update ignored files (default)"
 msgstr "обновяване на игнорираните файлове (стандартно)"
 
-#: builtin/checkout.c:1529
+#: builtin/checkout.c:1528
 msgid "do not check if another worktree is holding the given ref"
 msgstr "без проверка дали друго работно дърво държи указателя"
 
-#: builtin/checkout.c:1542
+#: builtin/checkout.c:1541
 msgid "checkout our version for unmerged files"
 msgstr "изтегляне на вашата версия на неслетите файлове"
 
-#: builtin/checkout.c:1545
+#: builtin/checkout.c:1544
 msgid "checkout their version for unmerged files"
 msgstr "изтегляне на чуждата версия на неслетите файлове"
 
-#: builtin/checkout.c:1549
+#: builtin/checkout.c:1548
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "без ограничаване на изброените пътища само до частично изтеглените"
 
-#: builtin/checkout.c:1604
+#: builtin/checkout.c:1603
 #, c-format
 msgid "-%c, -%c and --orphan are mutually exclusive"
 msgstr "Опциите „-%c“, „-%c“ и „--orphan“ са несъвместими една с друга"
 
-#: builtin/checkout.c:1608
+#: builtin/checkout.c:1607
 msgid "-p and --overlay are mutually exclusive"
 msgstr "опциите „-p“ и „--overlay“ са несъвместими"
 
-#: builtin/checkout.c:1645
+#: builtin/checkout.c:1644
 msgid "--track needs a branch name"
 msgstr "опцията „--track“ изисква име на клон"
 
-#: builtin/checkout.c:1650
+#: builtin/checkout.c:1649
 #, c-format
 msgid "missing branch name; try -%c"
 msgstr "липсва име на клон, използвайте опцията „-%c“"
 
-#: builtin/checkout.c:1682
+#: builtin/checkout.c:1681
 #, c-format
 msgid "could not resolve %s"
 msgstr "„%s“ не може да бъде открит"
 
-#: builtin/checkout.c:1698
+#: builtin/checkout.c:1697
 msgid "invalid path specification"
 msgstr "указан е неправилен път"
 
-#: builtin/checkout.c:1705
+#: builtin/checkout.c:1704
 #, c-format
 msgid "'%s' is not a commit and a branch '%s' cannot be created from it"
 msgstr "„%s“ не е подаване, затова от него не може да се създаде клон „%s“"
 
-#: builtin/checkout.c:1709
+#: builtin/checkout.c:1708
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: опцията „--detach“ не приема аргумент-път „%s“"
 
-#: builtin/checkout.c:1718
+#: builtin/checkout.c:1717
 msgid "--pathspec-from-file is incompatible with --detach"
 msgstr "опциите „--pathspec-from-file“ и „--detach“ са несъвместими"
 
-#: builtin/checkout.c:1721 builtin/reset.c:325 builtin/stash.c:1499
+#: builtin/checkout.c:1720 builtin/reset.c:325 builtin/stash.c:1566
 msgid "--pathspec-from-file is incompatible with --patch"
 msgstr "опциите „--pathspec-from-file“ и „--patch“ са несъвместими"
 
-#: builtin/checkout.c:1734
+#: builtin/checkout.c:1733
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -12503,74 +12800,74 @@
 "git checkout: опциите „--ours“/„--theirs“, „--force“ и „--merge“\n"
 "са несъвместими с изтегляне от индекса."
 
-#: builtin/checkout.c:1739
+#: builtin/checkout.c:1738
 msgid "you must specify path(s) to restore"
 msgstr "трябва да укажете поне един път за възстановяване"
 
-#: builtin/checkout.c:1765 builtin/checkout.c:1767 builtin/checkout.c:1816
-#: builtin/checkout.c:1818 builtin/clone.c:122 builtin/remote.c:170
-#: builtin/remote.c:172 builtin/submodule--helper.c:2719 builtin/worktree.c:554
-#: builtin/worktree.c:556
+#: builtin/checkout.c:1764 builtin/checkout.c:1766 builtin/checkout.c:1815
+#: builtin/checkout.c:1817 builtin/clone.c:122 builtin/remote.c:170
+#: builtin/remote.c:172 builtin/submodule--helper.c:2719 builtin/worktree.c:482
+#: builtin/worktree.c:484
 msgid "branch"
 msgstr "клон"
 
-#: builtin/checkout.c:1766
+#: builtin/checkout.c:1765
 msgid "create and checkout a new branch"
 msgstr "създаване и преминаване към нов клон"
 
-#: builtin/checkout.c:1768
+#: builtin/checkout.c:1767
 msgid "create/reset and checkout a branch"
 msgstr "създаване/зануляване на клон и преминаване към него"
 
-#: builtin/checkout.c:1769
+#: builtin/checkout.c:1768
 msgid "create reflog for new branch"
 msgstr "създаване на журнал на указателите за нов клон"
 
-#: builtin/checkout.c:1771
+#: builtin/checkout.c:1770
 msgid "second guess 'git checkout <no-such-branch>' (default)"
 msgstr ""
 "опит за отгатване на име на клон след неуспешен опит с „git checkout "
 "НЕСЪЩЕСТВУВАЩ_КЛОН“ (стандартно)"
 
-#: builtin/checkout.c:1772
+#: builtin/checkout.c:1771
 msgid "use overlay mode (default)"
 msgstr "използване на припокриващ режим (стандартно)"
 
-#: builtin/checkout.c:1817
+#: builtin/checkout.c:1816
 msgid "create and switch to a new branch"
 msgstr "създаване и преминаване към нов клон"
 
-#: builtin/checkout.c:1819
+#: builtin/checkout.c:1818
 msgid "create/reset and switch to a branch"
 msgstr "създаване/зануляване на клон и преминаване към него"
 
-#: builtin/checkout.c:1821
+#: builtin/checkout.c:1820
 msgid "second guess 'git switch <no-such-branch>'"
 msgstr ""
 "опит за отгатване на име на клон след неуспешен опит с „git switch "
 "НЕСЪЩЕСТВУВАЩ_КЛОН“"
 
-#: builtin/checkout.c:1823
+#: builtin/checkout.c:1822
 msgid "throw away local modifications"
 msgstr "зануляване на локалните промени"
 
-#: builtin/checkout.c:1857
+#: builtin/checkout.c:1856
 msgid "which tree-ish to checkout from"
 msgstr "към кой указател към дърво да се премине"
 
-#: builtin/checkout.c:1859
+#: builtin/checkout.c:1858
 msgid "restore the index"
 msgstr "възстановяване на индекса"
 
-#: builtin/checkout.c:1861
+#: builtin/checkout.c:1860
 msgid "restore the working tree (default)"
 msgstr "възстановяване на работното дърво (стандартно)"
 
-#: builtin/checkout.c:1863
+#: builtin/checkout.c:1862
 msgid "ignore unmerged entries"
 msgstr "пренебрегване на неслетите елементи"
 
-#: builtin/checkout.c:1864
+#: builtin/checkout.c:1863
 msgid "use overlay mode"
 msgstr "използване на припокриващ режим"
 
@@ -12714,8 +13011,8 @@
 msgstr "изтриване на цели директории"
 
 #: builtin/clean.c:909 builtin/describe.c:565 builtin/describe.c:567
-#: builtin/grep.c:921 builtin/log.c:183 builtin/log.c:185
-#: builtin/ls-files.c:558 builtin/name-rev.c:526 builtin/name-rev.c:528
+#: builtin/grep.c:922 builtin/log.c:184 builtin/log.c:186
+#: builtin/ls-files.c:573 builtin/name-rev.c:526 builtin/name-rev.c:528
 #: builtin/show-ref.c:179
 msgid "pattern"
 msgstr "ШАБЛОН"
@@ -12813,7 +13110,7 @@
 msgstr "опцията „--reference“ може да се използва само при клониране"
 
 #: builtin/clone.c:120 builtin/column.c:27 builtin/init-db.c:563
-#: builtin/merge-file.c:46 builtin/pack-objects.c:3546 builtin/repack.c:358
+#: builtin/merge-file.c:46 builtin/pack-objects.c:3561 builtin/repack.c:357
 msgid "name"
 msgstr "ИМЕ"
 
@@ -12829,7 +13126,7 @@
 msgid "path to git-upload-pack on the remote"
 msgstr "път към командата „git-upload-pack“ на отдалеченото хранилище"
 
-#: builtin/clone.c:126 builtin/fetch.c:173 builtin/grep.c:860
+#: builtin/clone.c:126 builtin/fetch.c:176 builtin/grep.c:861
 #: builtin/pull.c:208
 msgid "depth"
 msgstr "ДЪЛБОЧИНА"
@@ -12838,7 +13135,7 @@
 msgid "create a shallow clone of that depth"
 msgstr "плитко клониране до тази ДЪЛБОЧИНА"
 
-#: builtin/clone.c:128 builtin/fetch.c:175 builtin/pack-objects.c:3535
+#: builtin/clone.c:128 builtin/fetch.c:178 builtin/pack-objects.c:3550
 #: builtin/pull.c:211
 msgid "time"
 msgstr "ВРЕМЕ"
@@ -12847,12 +13144,12 @@
 msgid "create a shallow clone since a specific time"
 msgstr "плитко клониране до момент във времето"
 
-#: builtin/clone.c:130 builtin/fetch.c:177 builtin/fetch.c:200
-#: builtin/pull.c:214 builtin/pull.c:239 builtin/rebase.c:1317
+#: builtin/clone.c:130 builtin/fetch.c:180 builtin/fetch.c:203
+#: builtin/pull.c:214 builtin/pull.c:239 builtin/rebase.c:1323
 msgid "revision"
 msgstr "ВЕРСИЯ"
 
-#: builtin/clone.c:131 builtin/fetch.c:178 builtin/pull.c:215
+#: builtin/clone.c:131 builtin/fetch.c:181 builtin/pull.c:215
 msgid "deepen history of shallow clone, excluding rev"
 msgstr "задълбочаване на историята на плитко хранилище до изключващ указател"
 
@@ -12888,22 +13185,22 @@
 msgid "set config inside the new repository"
 msgstr "задаване на настройките на новото хранилище"
 
-#: builtin/clone.c:143 builtin/fetch.c:195 builtin/ls-remote.c:76
+#: builtin/clone.c:143 builtin/fetch.c:198 builtin/ls-remote.c:77
 #: builtin/pull.c:230 builtin/push.c:584 builtin/send-pack.c:196
 msgid "server-specific"
 msgstr "специфични за сървъра"
 
-#: builtin/clone.c:143 builtin/fetch.c:195 builtin/ls-remote.c:76
+#: builtin/clone.c:143 builtin/fetch.c:198 builtin/ls-remote.c:77
 #: builtin/pull.c:231 builtin/push.c:584 builtin/send-pack.c:197
 msgid "option to transmit"
 msgstr "опция за пренос"
 
-#: builtin/clone.c:144 builtin/fetch.c:196 builtin/pull.c:234
+#: builtin/clone.c:144 builtin/fetch.c:199 builtin/pull.c:234
 #: builtin/push.c:585
 msgid "use IPv4 addresses only"
 msgstr "само адреси IPv4"
 
-#: builtin/clone.c:146 builtin/fetch.c:198 builtin/pull.c:237
+#: builtin/clone.c:146 builtin/fetch.c:201 builtin/pull.c:237
 #: builtin/push.c:587
 msgid "use IPv6 addresses only"
 msgstr "само адреси IPv6"
@@ -13013,70 +13310,70 @@
 msgid "cannot unlink temporary alternates file"
 msgstr "временният файл за алтернативни обекти не може да бъде изтрит"
 
-#: builtin/clone.c:992 builtin/receive-pack.c:2493
+#: builtin/clone.c:993 builtin/receive-pack.c:2493
 msgid "Too many arguments."
 msgstr "Прекалено много аргументи."
 
-#: builtin/clone.c:996
+#: builtin/clone.c:997
 msgid "You must specify a repository to clone."
 msgstr "Трябва да укажете кое хранилище искате да клонирате."
 
-#: builtin/clone.c:1009
+#: builtin/clone.c:1010
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "опциите „--bare“ и „--origin %s“ са несъвместими."
 
-#: builtin/clone.c:1012
+#: builtin/clone.c:1013
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "опциите „--bare“ и „--separate-git-dir“ са несъвместими."
 
-#: builtin/clone.c:1025
+#: builtin/clone.c:1026
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "не съществува хранилище „%s“"
 
-#: builtin/clone.c:1029 builtin/fetch.c:1841
+#: builtin/clone.c:1030 builtin/fetch.c:1951
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "дълбочината трябва да е положително цяло число, а не „%s“"
 
-#: builtin/clone.c:1039
+#: builtin/clone.c:1040
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "целевият път „%s“ съществува и не е празна директория."
 
-#: builtin/clone.c:1045
+#: builtin/clone.c:1046
 #, c-format
 msgid "repository path '%s' already exists and is not an empty directory."
 msgstr "пътят в хранилището „%s“ съществува и не е празна директория."
 
-#: builtin/clone.c:1059
+#: builtin/clone.c:1060
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "в „%s“ вече съществува работно дърво."
 
-#: builtin/clone.c:1074 builtin/clone.c:1095 builtin/difftool.c:271
-#: builtin/log.c:1987 builtin/worktree.c:354 builtin/worktree.c:386
+#: builtin/clone.c:1075 builtin/clone.c:1096 builtin/difftool.c:271
+#: builtin/log.c:1986 builtin/worktree.c:282 builtin/worktree.c:314
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "родителските директории на „%s“ не могат да бъдат създадени"
 
-#: builtin/clone.c:1079
+#: builtin/clone.c:1080
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "работното дърво в „%s“ не може да бъде създадено."
 
-#: builtin/clone.c:1099
+#: builtin/clone.c:1100
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Клониране и създаване на голо хранилище в „%s“…\n"
 
-#: builtin/clone.c:1101
+#: builtin/clone.c:1102
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Клониране и създаване на хранилище в „%s“…\n"
 
-#: builtin/clone.c:1125
+#: builtin/clone.c:1126
 msgid ""
 "clone --recursive is not compatible with both --reference and --reference-if-"
 "able"
@@ -13084,49 +13381,49 @@
 "Опцията „--recursive“ е несъвместима с опциите „--reference“ и „--reference-"
 "if-able“"
 
-#: builtin/clone.c:1169 builtin/remote.c:200 builtin/remote.c:705
+#: builtin/clone.c:1170 builtin/remote.c:200 builtin/remote.c:705
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "„%s“ е неправилно име за отдалечено хранилище"
 
-#: builtin/clone.c:1210
+#: builtin/clone.c:1211
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 "При локално клониране опцията „--depth“ се прескача.  Ползвайте схемата "
 "„file://“."
 
-#: builtin/clone.c:1212
+#: builtin/clone.c:1213
 msgid "--shallow-since is ignored in local clones; use file:// instead."
 msgstr ""
 "При локално клониране опцията „--shallow-since“ се прескача.  Ползвайте "
 "схемата „file://“."
 
-#: builtin/clone.c:1214
+#: builtin/clone.c:1215
 msgid "--shallow-exclude is ignored in local clones; use file:// instead."
 msgstr ""
 "При локално клониране опцията „--shallow-exclude“ се прескача.  Ползвайте "
 "схемата „file://“."
 
-#: builtin/clone.c:1216
+#: builtin/clone.c:1217
 msgid "--filter is ignored in local clones; use file:// instead."
 msgstr ""
 "При локално клониране опцията „--filter“ се прескача.  Ползвайте схемата "
 "„file://“."
 
-#: builtin/clone.c:1219
+#: builtin/clone.c:1220
 msgid "source repository is shallow, ignoring --local"
 msgstr "клонираното хранилище е плитко, затова опцията „--local“ се прескача"
 
-#: builtin/clone.c:1224
+#: builtin/clone.c:1225
 msgid "--local is ignored"
 msgstr "опцията „--local“ се прескача"
 
-#: builtin/clone.c:1311 builtin/clone.c:1319
+#: builtin/clone.c:1315 builtin/clone.c:1323
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Отдалеченият клон „%s“ липсва в клонираното хранилище „%s“"
 
-#: builtin/clone.c:1322
+#: builtin/clone.c:1326
 msgid "You appear to have cloned an empty repository."
 msgstr "Изглежда клонирахте празно хранилище."
 
@@ -13185,13 +13482,13 @@
 msgstr "директорията с обекти, която отговаря на „%s“, не може да бъде открита"
 
 #: builtin/commit-graph.c:80 builtin/commit-graph.c:210
-#: builtin/commit-graph.c:316 builtin/fetch.c:184 builtin/log.c:1769
+#: builtin/commit-graph.c:316 builtin/fetch.c:187 builtin/log.c:1768
 msgid "dir"
 msgstr "директория"
 
 #: builtin/commit-graph.c:81 builtin/commit-graph.c:211
 #: builtin/commit-graph.c:317
-msgid "The object directory to store the graph"
+msgid "the object directory to store the graph"
 msgstr "ДИРекторията_с_ОБЕКТИ за запазване на гра̀фа"
 
 #: builtin/commit-graph.c:83
@@ -13285,7 +13582,7 @@
 msgid "duplicate parent %s ignored"
 msgstr "прескачане на повтарящ се родител: „%s“"
 
-#: builtin/commit-tree.c:56 builtin/commit-tree.c:136 builtin/log.c:555
+#: builtin/commit-tree.c:56 builtin/commit-tree.c:136 builtin/log.c:557
 #, c-format
 msgid "not a valid object name %s"
 msgstr "неправилно име на обект: „%s“"
@@ -13313,9 +13610,9 @@
 msgid "id of a parent commit object"
 msgstr "ИДЕНТИФИКАТОР на обекта за подаването-родител"
 
-#: builtin/commit-tree.c:114 builtin/commit.c:1504 builtin/merge.c:281
-#: builtin/notes.c:409 builtin/notes.c:575 builtin/stash.c:1470
-#: builtin/tag.c:413
+#: builtin/commit-tree.c:114 builtin/commit.c:1504 builtin/merge.c:282
+#: builtin/notes.c:409 builtin/notes.c:575 builtin/stash.c:1537
+#: builtin/tag.c:445
 msgid "message"
 msgstr "СЪОБЩЕНИЕ"
 
@@ -13327,7 +13624,7 @@
 msgid "read commit log message from file"
 msgstr "изчитане на съобщението за подаване от ФАЙЛ"
 
-#: builtin/commit-tree.c:121 builtin/commit.c:1516 builtin/merge.c:298
+#: builtin/commit-tree.c:121 builtin/commit.c:1516 builtin/merge.c:299
 #: builtin/pull.c:176 builtin/revert.c:118
 msgid "GPG sign commit"
 msgstr "подписване на подаването с GPG"
@@ -13490,7 +13787,7 @@
 msgid "could not lookup commit %s"
 msgstr "следното подаване не може да бъде открито: %s"
 
-#: builtin/commit.c:729 builtin/shortlog.c:425
+#: builtin/commit.c:729 builtin/shortlog.c:413
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(изчитане на съобщението за подаване от стандартния вход)\n"
@@ -13589,7 +13886,7 @@
 msgid "Error building trees"
 msgstr "Грешка при изграждане на дърветата"
 
-#: builtin/commit.c:1011 builtin/tag.c:276
+#: builtin/commit.c:1011 builtin/tag.c:308
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Подайте съобщението с някоя от опциите „-m“ или „-F“.\n"
@@ -13685,7 +13982,7 @@
 msgstr "версия"
 
 #: builtin/commit.c:1374 builtin/commit.c:1533 builtin/push.c:560
-#: builtin/worktree.c:725
+#: builtin/worktree.c:679
 msgid "machine-readable output"
 msgstr "формат на изхода за четене от програма"
 
@@ -13699,7 +13996,7 @@
 
 #: builtin/commit.c:1382 builtin/commit.c:1386 builtin/commit.c:1541
 #: builtin/fast-export.c:1198 builtin/fast-export.c:1201
-#: builtin/fast-export.c:1204 builtin/rebase.c:1406 parse-options.h:336
+#: builtin/fast-export.c:1204 builtin/rebase.c:1412 parse-options.h:336
 msgid "mode"
 msgstr "РЕЖИМ"
 
@@ -13760,7 +14057,7 @@
 msgid "Commit message options"
 msgstr "Опции за съобщението при подаване"
 
-#: builtin/commit.c:1501 builtin/merge.c:285 builtin/tag.c:415
+#: builtin/commit.c:1501 builtin/merge.c:286 builtin/tag.c:447
 msgid "read message from file"
 msgstr "взимане на съобщението от ФАЙЛ"
 
@@ -13772,7 +14069,7 @@
 msgid "override author for commit"
 msgstr "задаване на АВТОР за подаването"
 
-#: builtin/commit.c:1503 builtin/gc.c:542
+#: builtin/commit.c:1503 builtin/gc.c:550
 msgid "date"
 msgstr "ДАТА"
 
@@ -13781,7 +14078,7 @@
 msgstr "задаване на ДАТА за подаването"
 
 #: builtin/commit.c:1505 builtin/commit.c:1506 builtin/commit.c:1507
-#: builtin/commit.c:1508 parse-options.h:328 ref-filter.h:87
+#: builtin/commit.c:1508 parse-options.h:328 ref-filter.h:90
 msgid "commit"
 msgstr "ПОДАВАНЕ"
 
@@ -13810,7 +14107,7 @@
 msgstr ""
 "смяна на автора да съвпада с подаващия (използва се с „-C“/„-c“/„--amend“)"
 
-#: builtin/commit.c:1510 builtin/log.c:1744 builtin/merge.c:301
+#: builtin/commit.c:1510 builtin/log.c:1743 builtin/merge.c:302
 #: builtin/pull.c:145 builtin/revert.c:110
 msgid "add a Signed-off-by trailer"
 msgstr "добавяне на епилог за подпис „Signed-off-by“"
@@ -14468,41 +14765,41 @@
 msgid "--merge-base only works with two commits"
 msgstr "опцията „--merge-base“ изисква точно две подавания"
 
-#: builtin/diff.c:91
+#: builtin/diff.c:92
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "„%s“: не е нито обикновен файл, нито символна връзка"
 
-#: builtin/diff.c:258
+#: builtin/diff.c:259
 #, c-format
 msgid "invalid option: %s"
 msgstr "неправилна опция: %s"
 
-#: builtin/diff.c:375
+#: builtin/diff.c:376
 #, c-format
 msgid "%s...%s: no merge base"
 msgstr "„%s..%s“: липсва база за сливане"
 
-#: builtin/diff.c:485
+#: builtin/diff.c:486
 msgid "Not a git repository"
 msgstr "Не е хранилище на Git"
 
-#: builtin/diff.c:530 builtin/grep.c:681
+#: builtin/diff.c:532 builtin/grep.c:682
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "зададен е неправилен обект „%s“."
 
-#: builtin/diff.c:541
+#: builtin/diff.c:543
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "зададени са повече от 2 обекта-BLOB: „%s“"
 
-#: builtin/diff.c:546
+#: builtin/diff.c:548
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "зададен е неподдържан обект „%s“."
 
-#: builtin/diff.c:580
+#: builtin/diff.c:582
 #, c-format
 msgid "%s...%s: multiple merge bases, using %s"
 msgstr "%s...%s: много бази за сливане, ще се ползва „%s“"
@@ -14686,40 +14983,40 @@
 "как да се обработват съобщенията за подаване, които са в друго кодиране"
 
 #: builtin/fast-export.c:1208
-msgid "Dump marks to this file"
-msgstr "Запазване на маркерите в този ФАЙЛ"
+msgid "dump marks to this file"
+msgstr "запазване на маркерите в този ФАЙЛ"
 
 #: builtin/fast-export.c:1210
-msgid "Import marks from this file"
-msgstr "Внасяне на маркерите от този ФАЙЛ"
+msgid "import marks from this file"
+msgstr "внасяне на маркерите от този ФАЙЛ"
 
 #: builtin/fast-export.c:1214
-msgid "Import marks from this file if it exists"
-msgstr "Внасяне на маркерите от този ФАЙЛ, ако съществува"
+msgid "import marks from this file if it exists"
+msgstr "внасяне на маркерите от този ФАЙЛ, ако съществува"
 
 #: builtin/fast-export.c:1216
-msgid "Fake a tagger when tags lack one"
-msgstr "Да се използва изкуствено име на човек при липса на задаващ етикета"
+msgid "fake a tagger when tags lack one"
+msgstr "да се използва изкуствено име на човек при липса на създател на етикета"
 
 #: builtin/fast-export.c:1218
-msgid "Output full tree for each commit"
-msgstr "Извеждане на цялото дърво за всяко подаване"
+msgid "output full tree for each commit"
+msgstr "извеждане на цялото дърво за всяко подаване"
 
 #: builtin/fast-export.c:1220
-msgid "Use the done feature to terminate the stream"
-msgstr "Използване на маркер за завършване на потока"
+msgid "use the done feature to terminate the stream"
+msgstr "използване на маркер за завършване на потока"
 
 #: builtin/fast-export.c:1221
-msgid "Skip output of blob data"
-msgstr "Без извеждане на съдържанието на обектите-BLOB"
+msgid "skip output of blob data"
+msgstr "без извеждане на съдържанието на обектите-BLOB"
 
-#: builtin/fast-export.c:1222 builtin/log.c:1816
+#: builtin/fast-export.c:1222 builtin/log.c:1815
 msgid "refspec"
 msgstr "УКАЗАТЕЛ_НА_ВЕРСИЯ"
 
 #: builtin/fast-export.c:1223
-msgid "Apply refspec to exported refs"
-msgstr "Прилагане на УКАЗАТЕЛя_НА_ВЕРСИЯ към изнесените указатели"
+msgid "apply refspec to exported refs"
+msgstr "прилагане на УКАЗАТЕЛя_НА_ВЕРСИЯ към изнесените указатели"
 
 #: builtin/fast-export.c:1224
 msgid "anonymize output"
@@ -14734,18 +15031,18 @@
 msgstr "заместване ОТ със КЪМ в анонимизирания изход"
 
 #: builtin/fast-export.c:1229
-msgid "Reference parents which are not in fast-export stream by object id"
+msgid "reference parents which are not in fast-export stream by object id"
 msgstr ""
-"Указване на родителите, които не са в потока на бързо изнасяне, с "
+"указване на родителите, които не са в потока на бързо изнасяне, с "
 "идентификатор на обект"
 
 #: builtin/fast-export.c:1231
-msgid "Show original object ids of blobs/commits"
-msgstr "Извеждане на първоначалните идентификатори на обектите BLOB/подавяния"
+msgid "show original object ids of blobs/commits"
+msgstr "извеждане на първоначалните идентификатори на обектите BLOB/подавяния"
 
 #: builtin/fast-export.c:1233
-msgid "Label tags with mark ids"
-msgstr "Задаване на идентификатори на маркери на етикетите"
+msgid "label tags with mark ids"
+msgstr "задаване на идентификатори на маркери на етикетите"
 
 #: builtin/fast-export.c:1256
 msgid "--anonymize-map without --anonymize does not make sense"
@@ -14784,7 +15081,7 @@
 msgid "feature '%s' forbidden in input without --allow-unsafe-features"
 msgstr "„%s“ изисква изричното задаване на опцията „--allow-unsafe-features“"
 
-#: builtin/fetch-pack.c:241
+#: builtin/fetch-pack.c:242
 #, c-format
 msgid "Lockfile created but not reported: %s"
 msgstr "Заключващият файл е създаден, но не е докладван: „%s“"
@@ -14805,94 +15102,98 @@
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [ОПЦИЯ…]"
 
-#: builtin/fetch.c:119
+#: builtin/fetch.c:120
 msgid "fetch.parallel cannot be negative"
 msgstr "опцията „fetch.parallel“ трябва да е неотрицателна"
 
-#: builtin/fetch.c:142 builtin/pull.c:185
+#: builtin/fetch.c:143 builtin/pull.c:185
 msgid "fetch from all remotes"
 msgstr "доставяне от всички отдалечени хранилища"
 
-#: builtin/fetch.c:144 builtin/pull.c:245
+#: builtin/fetch.c:145 builtin/pull.c:245
 msgid "set upstream for git pull/fetch"
 msgstr "задаване на клон за следене за издърпване/доставяне"
 
-#: builtin/fetch.c:146 builtin/pull.c:188
+#: builtin/fetch.c:147 builtin/pull.c:188
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "добавяне към „.git/FETCH_HEAD“ вместо замяна"
 
-#: builtin/fetch.c:148 builtin/pull.c:191
+#: builtin/fetch.c:149
+msgid "use atomic transaction to update references"
+msgstr "изискване на атомарни операции за обновяване на указателите"
+
+#: builtin/fetch.c:151 builtin/pull.c:191
 msgid "path to upload pack on remote end"
 msgstr "отдалечен път, където да се качи пакетът"
 
-#: builtin/fetch.c:149
+#: builtin/fetch.c:152
 msgid "force overwrite of local reference"
 msgstr "принудително презаписване на локален указател"
 
-#: builtin/fetch.c:151
+#: builtin/fetch.c:154
 msgid "fetch from multiple remotes"
 msgstr "доставяне от множество отдалечени хранилища"
 
-#: builtin/fetch.c:153 builtin/pull.c:195
+#: builtin/fetch.c:156 builtin/pull.c:195
 msgid "fetch all tags and associated objects"
 msgstr "доставяне на всички етикети и принадлежащи обекти"
 
-#: builtin/fetch.c:155
+#: builtin/fetch.c:158
 msgid "do not fetch all tags (--no-tags)"
 msgstr "без доставянето на всички етикети „--no-tags“"
 
-#: builtin/fetch.c:157
+#: builtin/fetch.c:160
 msgid "number of submodules fetched in parallel"
 msgstr "брой подмодули доставени паралелно"
 
-#: builtin/fetch.c:159 builtin/pull.c:198
+#: builtin/fetch.c:162 builtin/pull.c:198
 msgid "prune remote-tracking branches no longer on remote"
 msgstr "окастряне на клоните следящи вече несъществуващи отдалечени клони"
 
-#: builtin/fetch.c:161
+#: builtin/fetch.c:164
 msgid "prune local tags no longer on remote and clobber changed tags"
 msgstr ""
 "окастряне на локалните етикети, които вече не съществуват в отдалеченото "
 "хранилище и презаписване на променените"
 
-#: builtin/fetch.c:162 builtin/fetch.c:187 builtin/pull.c:122
+#: builtin/fetch.c:165 builtin/fetch.c:190 builtin/pull.c:122
 msgid "on-demand"
 msgstr "ПРИ НУЖДА"
 
-#: builtin/fetch.c:163
+#: builtin/fetch.c:166
 msgid "control recursive fetching of submodules"
 msgstr "управление на рекурсивното доставяне на подмодулите"
 
-#: builtin/fetch.c:168
+#: builtin/fetch.c:171
 msgid "write fetched references to the FETCH_HEAD file"
 msgstr "запазване на доставените указатели във файла „FETCH_HEAD“"
 
-#: builtin/fetch.c:169 builtin/pull.c:206
+#: builtin/fetch.c:172 builtin/pull.c:206
 msgid "keep downloaded pack"
 msgstr "запазване на изтеглените пакети с обекти"
 
-#: builtin/fetch.c:171
+#: builtin/fetch.c:174
 msgid "allow updating of HEAD ref"
 msgstr "позволяване на обновяването на указателя „HEAD“"
 
-#: builtin/fetch.c:174 builtin/fetch.c:180 builtin/pull.c:209
+#: builtin/fetch.c:177 builtin/fetch.c:183 builtin/pull.c:209
 #: builtin/pull.c:218
 msgid "deepen history of shallow clone"
 msgstr "задълбочаване на историята на плитко хранилище"
 
-#: builtin/fetch.c:176 builtin/pull.c:212
+#: builtin/fetch.c:179 builtin/pull.c:212
 msgid "deepen history of shallow repository based on time"
 msgstr "задълбочаване на историята на плитко хранилище до определено време"
 
-#: builtin/fetch.c:182 builtin/pull.c:221
+#: builtin/fetch.c:185 builtin/pull.c:221
 msgid "convert to a complete repository"
 msgstr "превръщане в пълно хранилище"
 
-#: builtin/fetch.c:185
+#: builtin/fetch.c:188
 msgid "prepend this to submodule path output"
 msgstr "добавяне на това пред пътя на подмодула"
 
-#: builtin/fetch.c:188
+#: builtin/fetch.c:191
 msgid ""
 "default for recursive fetching of submodules (lower priority than config "
 "files)"
@@ -14900,98 +15201,98 @@
 "стандартно рекурсивно изтегляне на подмодулите (файловете с настройки са с "
 "приоритет)"
 
-#: builtin/fetch.c:192 builtin/pull.c:224
+#: builtin/fetch.c:195 builtin/pull.c:224
 msgid "accept refs that update .git/shallow"
 msgstr "приемане на указатели, които обновяват „.git/shallow“"
 
-#: builtin/fetch.c:193 builtin/pull.c:226
+#: builtin/fetch.c:196 builtin/pull.c:226
 msgid "refmap"
 msgstr "КАРТА_С_УКАЗАТЕЛИ"
 
-#: builtin/fetch.c:194 builtin/pull.c:227
+#: builtin/fetch.c:197 builtin/pull.c:227
 msgid "specify fetch refmap"
 msgstr "указване на КАРТАта_С_УКАЗАТЕЛИ за доставяне"
 
-#: builtin/fetch.c:201 builtin/pull.c:240
+#: builtin/fetch.c:204 builtin/pull.c:240
 msgid "report that we have only objects reachable from this object"
 msgstr "докладване, че всички обекти могат са достижими при започване от този"
 
-#: builtin/fetch.c:204 builtin/fetch.c:206
+#: builtin/fetch.c:207 builtin/fetch.c:209
 msgid "run 'maintenance --auto' after fetching"
 msgstr "изпълняване на „maintenance --auto“ след доставяне"
 
-#: builtin/fetch.c:208 builtin/pull.c:243
+#: builtin/fetch.c:211 builtin/pull.c:243
 msgid "check for forced-updates on all updated branches"
 msgstr "проверка за принудителни обновявания на всички клони"
 
-#: builtin/fetch.c:210
+#: builtin/fetch.c:213
 msgid "write the commit-graph after fetching"
 msgstr "запазване на гра̀фа с подаванията след доставяне"
 
-#: builtin/fetch.c:212
+#: builtin/fetch.c:215
 msgid "accept refspecs from stdin"
 msgstr "четене на указателите от стандартния вход"
 
-#: builtin/fetch.c:523
+#: builtin/fetch.c:526
 msgid "Couldn't find remote ref HEAD"
 msgstr "Указателят „HEAD“ в отдалеченото хранилище не може да бъде открит"
 
-#: builtin/fetch.c:677
+#: builtin/fetch.c:697
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr "настройката „fetch.output“ е с неправилна стойност „%s“"
 
-#: builtin/fetch.c:775
+#: builtin/fetch.c:796
 #, c-format
 msgid "object %s not found"
 msgstr "обектът „%s“ липсва"
 
-#: builtin/fetch.c:779
+#: builtin/fetch.c:800
 msgid "[up to date]"
 msgstr "[актуален]"
 
-#: builtin/fetch.c:792 builtin/fetch.c:808 builtin/fetch.c:880
+#: builtin/fetch.c:813 builtin/fetch.c:829 builtin/fetch.c:901
 msgid "[rejected]"
 msgstr "[отхвърлен]"
 
-#: builtin/fetch.c:793
+#: builtin/fetch.c:814
 msgid "can't fetch in current branch"
 msgstr "в текущия клон не може да се доставя"
 
-#: builtin/fetch.c:803
+#: builtin/fetch.c:824
 msgid "[tag update]"
 msgstr "[обновяване на етикетите]"
 
-#: builtin/fetch.c:804 builtin/fetch.c:841 builtin/fetch.c:863
-#: builtin/fetch.c:875
+#: builtin/fetch.c:825 builtin/fetch.c:862 builtin/fetch.c:884
+#: builtin/fetch.c:896
 msgid "unable to update local ref"
 msgstr "локален указател не може да бъде обновен"
 
-#: builtin/fetch.c:808
+#: builtin/fetch.c:829
 msgid "would clobber existing tag"
 msgstr "съществуващ етикет ще бъде презаписан"
 
-#: builtin/fetch.c:830
+#: builtin/fetch.c:851
 msgid "[new tag]"
 msgstr "[нов етикет]"
 
-#: builtin/fetch.c:833
+#: builtin/fetch.c:854
 msgid "[new branch]"
 msgstr "[нов клон]"
 
-#: builtin/fetch.c:836
+#: builtin/fetch.c:857
 msgid "[new ref]"
 msgstr "[нов указател]"
 
-#: builtin/fetch.c:875
+#: builtin/fetch.c:896
 msgid "forced update"
 msgstr "принудително обновяване"
 
-#: builtin/fetch.c:880
+#: builtin/fetch.c:901
 msgid "non-fast-forward"
 msgstr "същинско сливане"
 
-#: builtin/fetch.c:901
+#: builtin/fetch.c:1005
 msgid ""
 "Fetch normally indicates which branches had a forced update,\n"
 "but that check has been disabled. To re-enable, use '--show-forced-updates'\n"
@@ -15002,7 +15303,7 @@
 "\n"
 "    git config fetch.showForcedUpdates true"
 
-#: builtin/fetch.c:905
+#: builtin/fetch.c:1009
 #, c-format
 msgid ""
 "It took %.2f seconds to check forced updates. You can use\n"
@@ -15016,24 +15317,24 @@
 "\n"
 "    git config fetch.showForcedUpdates false\n"
 
-#: builtin/fetch.c:939
+#: builtin/fetch.c:1041
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "хранилището „%s“ не изпрати всички необходими обекти\n"
 
-#: builtin/fetch.c:960
+#: builtin/fetch.c:1069
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 "отхвърляне на върха „%s“, защото плитките хранилища не могат да бъдат "
 "обновявани"
 
-#: builtin/fetch.c:1053 builtin/fetch.c:1191
+#: builtin/fetch.c:1146 builtin/fetch.c:1297
 #, c-format
 msgid "From %.*s\n"
 msgstr "От %.*s\n"
 
-#: builtin/fetch.c:1064
+#: builtin/fetch.c:1168
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -15043,57 +15344,57 @@
 "„git remote prune %s“, за да премахнете остарелите клони, които\n"
 "предизвикват конфликта"
 
-#: builtin/fetch.c:1161
+#: builtin/fetch.c:1267
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (обектът „%s“ ще се окаже извън клон)"
 
-#: builtin/fetch.c:1162
+#: builtin/fetch.c:1268
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (обектът „%s“ вече е извън клон)"
 
-#: builtin/fetch.c:1194
+#: builtin/fetch.c:1300
 msgid "[deleted]"
 msgstr "[изтрит]"
 
-#: builtin/fetch.c:1195 builtin/remote.c:1118
+#: builtin/fetch.c:1301 builtin/remote.c:1118
 msgid "(none)"
 msgstr "(нищо)"
 
-#: builtin/fetch.c:1218
+#: builtin/fetch.c:1324
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "Не може да доставите в текущия клон „%s“ на хранилище, което не е голо"
 
-#: builtin/fetch.c:1237
+#: builtin/fetch.c:1343
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Стойността „%2$s“ за опцията „%1$s“ не е съвместима с „%3$s“"
 
-#: builtin/fetch.c:1240
+#: builtin/fetch.c:1346
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Опцията „%s“ се прескача при „%s“\n"
 
-#: builtin/fetch.c:1448
+#: builtin/fetch.c:1558
 msgid "multiple branches detected, incompatible with --set-upstream"
 msgstr ""
 "засечени са множество клони, това е несъвместимо с опцията „--set-upstream“"
 
-#: builtin/fetch.c:1463
+#: builtin/fetch.c:1573
 msgid "not setting upstream for a remote remote-tracking branch"
 msgstr "не може да указвате клон за следене на отдалечен етикет"
 
-#: builtin/fetch.c:1465
+#: builtin/fetch.c:1575
 msgid "not setting upstream for a remote tag"
 msgstr "не може да указвате клон за следене на отдалечен етикет"
 
-#: builtin/fetch.c:1467
+#: builtin/fetch.c:1577
 msgid "unknown branch type"
 msgstr "непознат вид клон"
 
-#: builtin/fetch.c:1469
+#: builtin/fetch.c:1579
 msgid ""
 "no source branch found.\n"
 "you need to specify exactly one branch with the --set-upstream option."
@@ -15101,22 +15402,22 @@
 "не е открит клон за следене.\n"
 "Трябва изрично да зададете един клон с опцията „--set-upstream option“."
 
-#: builtin/fetch.c:1598 builtin/fetch.c:1661
+#: builtin/fetch.c:1708 builtin/fetch.c:1771
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Доставяне на „%s“\n"
 
-#: builtin/fetch.c:1608 builtin/fetch.c:1663 builtin/remote.c:101
+#: builtin/fetch.c:1718 builtin/fetch.c:1773 builtin/remote.c:101
 #, c-format
 msgid "Could not fetch %s"
 msgstr "„%s“ не може да се достави"
 
-#: builtin/fetch.c:1620
+#: builtin/fetch.c:1730
 #, c-format
 msgid "could not fetch '%s' (exit code: %d)\n"
 msgstr "„%s“ не може да се достави (изходният код е: %d)\n"
 
-#: builtin/fetch.c:1724
+#: builtin/fetch.c:1834
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -15124,45 +15425,45 @@
 "Не сте указали отдалечено хранилище.  Задайте или адрес, или име\n"
 "на отдалечено хранилище, откъдето да се доставят новите версии."
 
-#: builtin/fetch.c:1760
+#: builtin/fetch.c:1870
 msgid "You need to specify a tag name."
 msgstr "Трябва да укажете име на етикет."
 
-#: builtin/fetch.c:1825
+#: builtin/fetch.c:1935
 msgid "Negative depth in --deepen is not supported"
 msgstr "Отрицателна дълбочина като аргумент на „--deepen“ не се поддържа"
 
-#: builtin/fetch.c:1827
+#: builtin/fetch.c:1937
 msgid "--deepen and --depth are mutually exclusive"
 msgstr "опциите „--deepen“ и „--depth“ са несъвместими"
 
-#: builtin/fetch.c:1832
+#: builtin/fetch.c:1942
 msgid "--depth and --unshallow cannot be used together"
 msgstr "опциите „--depth“ и „--unshallow“ са несъвместими"
 
-#: builtin/fetch.c:1834
+#: builtin/fetch.c:1944
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "не можете да използвате опцията „--unshallow“ върху пълно хранилище"
 
-#: builtin/fetch.c:1851
+#: builtin/fetch.c:1961
 msgid "fetch --all does not take a repository argument"
 msgstr "към „git fetch --all“ не можете да добавите аргумент — хранилище"
 
-#: builtin/fetch.c:1853
+#: builtin/fetch.c:1963
 msgid "fetch --all does not make sense with refspecs"
 msgstr ""
 "към „git fetch --all“ не можете да добавите аргумент — указател на версия"
 
-#: builtin/fetch.c:1862
+#: builtin/fetch.c:1972
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Няма нито отдалечено хранилище, нито група от хранилища на име „%s“"
 
-#: builtin/fetch.c:1869
+#: builtin/fetch.c:1979
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Указването на група и указването на версия са несъвместими"
 
-#: builtin/fetch.c:1887
+#: builtin/fetch.c:1997
 msgid ""
 "--filter can only be used with the remote configured in extensions."
 "partialclone"
@@ -15170,7 +15471,12 @@
 "опцията „--filter“ може да се ползва само с отдалеченото хранилище указано в "
 "настройката „extensions.partialClone“"
 
-#: builtin/fetch.c:1891
+#: builtin/fetch.c:2001
+msgid "--atomic can only be used when fetching from one remote"
+msgstr ""
+"опцията „--atomic“ поддържа доставяне само от едно отдалечено хранилище"
+
+#: builtin/fetch.c:2005
 msgid "--stdin can only be used when fetching from one remote"
 msgstr "опцията „--stdin“ поддържа доставяне само от едно отдалечено хранилище"
 
@@ -15238,7 +15544,7 @@
 msgid "show only <n> matched refs"
 msgstr "извеждане само на този БРОЙ напаснати указатели"
 
-#: builtin/for-each-ref.c:39 builtin/tag.c:440
+#: builtin/for-each-ref.c:39 builtin/tag.c:472
 msgid "respect format colors"
 msgstr "спазване на цветовете на форма̀та"
 
@@ -15278,32 +15584,32 @@
 msgid "missing --config=<config>"
 msgstr "липсва --config=НАСТРОЙКА"
 
-#: builtin/fsck.c:69 builtin/fsck.c:148 builtin/fsck.c:149
+#: builtin/fsck.c:69 builtin/fsck.c:130 builtin/fsck.c:131
 msgid "unknown"
 msgstr "непознат"
 
 #. TRANSLATORS: e.g. error in tree 01bfda: <more explanation>
-#: builtin/fsck.c:101 builtin/fsck.c:121
+#: builtin/fsck.c:83 builtin/fsck.c:103
 #, c-format
 msgid "error in %s %s: %s"
 msgstr "грешка в %s „%s“: %s"
 
 #. TRANSLATORS: e.g. warning in tree 01bfda: <more explanation>
-#: builtin/fsck.c:115
+#: builtin/fsck.c:97
 #, c-format
 msgid "warning in %s %s: %s"
 msgstr "предупреждение за %s „%s“: %s"
 
-#: builtin/fsck.c:144 builtin/fsck.c:147
+#: builtin/fsck.c:126 builtin/fsck.c:129
 #, c-format
 msgid "broken link from %7s %s"
 msgstr "скъсана връзка от %7s %s"
 
-#: builtin/fsck.c:156
+#: builtin/fsck.c:138
 msgid "wrong object type in link"
 msgstr "неправилен вид обект във връзката"
 
-#: builtin/fsck.c:172
+#: builtin/fsck.c:154
 #, c-format
 msgid ""
 "broken link from %7s %s\n"
@@ -15312,212 +15618,212 @@
 "скъсана връзка от %7s %s\n"
 "              към %7s %s"
 
-#: builtin/fsck.c:283
+#: builtin/fsck.c:265
 #, c-format
 msgid "missing %s %s"
 msgstr "липсващ обект: %s „%s“"
 
-#: builtin/fsck.c:310
+#: builtin/fsck.c:292
 #, c-format
 msgid "unreachable %s %s"
 msgstr "недостижим обект: %s „%s“"
 
-#: builtin/fsck.c:330
+#: builtin/fsck.c:312
 #, c-format
 msgid "dangling %s %s"
 msgstr "извън клон: %s „%s“"
 
-#: builtin/fsck.c:340
+#: builtin/fsck.c:322
 msgid "could not create lost-found"
 msgstr "„lost-found“ не може да се създаде"
 
-#: builtin/fsck.c:351
+#: builtin/fsck.c:333
 #, c-format
 msgid "could not finish '%s'"
 msgstr "„%s“ не може да се завърши"
 
-#: builtin/fsck.c:368
+#: builtin/fsck.c:350
 #, c-format
 msgid "Checking %s"
 msgstr "Проверка на „%s“"
 
-#: builtin/fsck.c:406
+#: builtin/fsck.c:388
 #, c-format
 msgid "Checking connectivity (%d objects)"
 msgstr "Проверка на свързаността (%d обекта)"
 
-#: builtin/fsck.c:425
+#: builtin/fsck.c:407
 #, c-format
 msgid "Checking %s %s"
 msgstr "Проверяване на %s „%s“"
 
-#: builtin/fsck.c:430
+#: builtin/fsck.c:412
 msgid "broken links"
 msgstr "скъсани връзки"
 
-#: builtin/fsck.c:439
+#: builtin/fsck.c:421
 #, c-format
 msgid "root %s"
 msgstr "начална директория „%s“"
 
-#: builtin/fsck.c:447
+#: builtin/fsck.c:429
 #, c-format
 msgid "tagged %s %s (%s) in %s"
 msgstr "приложен етикет „%s“ върху „%s“ (%s) в „%s“"
 
-#: builtin/fsck.c:476
+#: builtin/fsck.c:458
 #, c-format
 msgid "%s: object corrupt or missing"
 msgstr "%s: липсващ или повреден обект"
 
-#: builtin/fsck.c:501
+#: builtin/fsck.c:483
 #, c-format
 msgid "%s: invalid reflog entry %s"
 msgstr "%s: неправилен запис в журнала за указатели „%s“"
 
-#: builtin/fsck.c:515
+#: builtin/fsck.c:497
 #, c-format
 msgid "Checking reflog %s->%s"
 msgstr "Проверка на журнала на указателите: „%s“ до „%s“"
 
-#: builtin/fsck.c:549
+#: builtin/fsck.c:531
 #, c-format
 msgid "%s: invalid sha1 pointer %s"
 msgstr "„%s“: неправилен указател за SHA1: „%s“"
 
-#: builtin/fsck.c:556
+#: builtin/fsck.c:538
 #, c-format
 msgid "%s: not a commit"
 msgstr "%s: не е подаване!"
 
-#: builtin/fsck.c:610
+#: builtin/fsck.c:592
 msgid "notice: No default references"
 msgstr "внимание: няма указатели по подразбиране"
 
-#: builtin/fsck.c:625
+#: builtin/fsck.c:607
 #, c-format
 msgid "%s: object corrupt or missing: %s"
 msgstr "„%s“: липсващ обект: „%s“"
 
-#: builtin/fsck.c:638
+#: builtin/fsck.c:620
 #, c-format
 msgid "%s: object could not be parsed: %s"
 msgstr "„%s“: не може да се анализира: „%s“"
 
-#: builtin/fsck.c:658
+#: builtin/fsck.c:640
 #, c-format
 msgid "bad sha1 file: %s"
 msgstr "неправилен ред с контролна сума по SHA1: „%s“"
 
-#: builtin/fsck.c:673
+#: builtin/fsck.c:655
 msgid "Checking object directory"
 msgstr "Проверка на директория с обекти"
 
-#: builtin/fsck.c:676
+#: builtin/fsck.c:658
 msgid "Checking object directories"
 msgstr "Проверка на директориите с обекти"
 
-#: builtin/fsck.c:691
+#: builtin/fsck.c:673
 #, c-format
 msgid "Checking %s link"
 msgstr "Проверка на връзките на „%s“"
 
 #
-#: builtin/fsck.c:696 builtin/index-pack.c:865
+#: builtin/fsck.c:678 builtin/index-pack.c:865
 #, c-format
 msgid "invalid %s"
 msgstr "неправилен указател „%s“"
 
-#: builtin/fsck.c:703
+#: builtin/fsck.c:685
 #, c-format
 msgid "%s points to something strange (%s)"
 msgstr "„%s“ сочи към нещо необичайно (%s)"
 
-#: builtin/fsck.c:709
+#: builtin/fsck.c:691
 #, c-format
 msgid "%s: detached HEAD points at nothing"
 msgstr "%s: несвързаният връх „HEAD“ не сочи към нищо"
 
-#: builtin/fsck.c:713
+#: builtin/fsck.c:695
 #, c-format
 msgid "notice: %s points to an unborn branch (%s)"
 msgstr "предупреждение: „%s“ сочи към все още несъществуващ клон (%s)"
 
-#: builtin/fsck.c:725
+#: builtin/fsck.c:707
 msgid "Checking cache tree"
 msgstr "Проверка на дървото на кеша"
 
-#: builtin/fsck.c:730
+#: builtin/fsck.c:712
 #, c-format
 msgid "%s: invalid sha1 pointer in cache-tree"
 msgstr "„%s“: неправилен указател за SHA1 в дървото на кеша"
 
-#: builtin/fsck.c:739
+#: builtin/fsck.c:721
 msgid "non-tree in cache-tree"
 msgstr "в дървото на кеша има нещо, което не е дърво"
 
-#: builtin/fsck.c:770
+#: builtin/fsck.c:752
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [ОПЦИЯ…] [ОБЕКТ…]"
 
-#: builtin/fsck.c:776
+#: builtin/fsck.c:758
 msgid "show unreachable objects"
 msgstr "показване на недостижимите обекти"
 
-#: builtin/fsck.c:777
+#: builtin/fsck.c:759
 msgid "show dangling objects"
 msgstr "показване на обектите извън клоните"
 
-#: builtin/fsck.c:778
+#: builtin/fsck.c:760
 msgid "report tags"
 msgstr "показване на етикетите"
 
-#: builtin/fsck.c:779
+#: builtin/fsck.c:761
 msgid "report root nodes"
 msgstr "показване на кореновите възли"
 
-#: builtin/fsck.c:780
+#: builtin/fsck.c:762
 msgid "make index objects head nodes"
 msgstr "задаване на обекти от индекса да са коренови"
 
-#: builtin/fsck.c:781
+#: builtin/fsck.c:763
 msgid "make reflogs head nodes (default)"
 msgstr "проследяване и на указателите от журнала с указателите (стандартно)"
 
-#: builtin/fsck.c:782
+#: builtin/fsck.c:764
 msgid "also consider packs and alternate objects"
 msgstr "допълнително да се проверяват пакетите и алтернативните обекти"
 
-#: builtin/fsck.c:783
+#: builtin/fsck.c:765
 msgid "check only connectivity"
 msgstr "проверка само на връзката"
 
-#: builtin/fsck.c:784
+#: builtin/fsck.c:766 builtin/mktag.c:78
 msgid "enable more strict checking"
 msgstr "по-строги проверки"
 
-#: builtin/fsck.c:786
+#: builtin/fsck.c:768
 msgid "write dangling objects in .git/lost-found"
 msgstr "запазване на обектите извън клоните в директорията „.git/lost-found“"
 
-#: builtin/fsck.c:787 builtin/prune.c:134
+#: builtin/fsck.c:769 builtin/prune.c:134
 msgid "show progress"
 msgstr "показване на напредъка"
 
-#: builtin/fsck.c:788
+#: builtin/fsck.c:770
 msgid "show verbose names for reachable objects"
 msgstr "показване на подробни имена на достижимите обекти"
 
-#: builtin/fsck.c:847 builtin/index-pack.c:261
+#: builtin/fsck.c:829 builtin/index-pack.c:261
 msgid "Checking objects"
 msgstr "Проверка на обектите"
 
-#: builtin/fsck.c:875
+#: builtin/fsck.c:857
 #, c-format
 msgid "%s: object missing"
 msgstr "„%s“: липсващ обект"
 
-#: builtin/fsck.c:886
+#: builtin/fsck.c:868
 #, c-format
 msgid "invalid parameter: expected sha1, got '%s'"
 msgstr "неправилен параметър: очаква се SHA1, а бе получено: „%s“"
@@ -15526,27 +15832,27 @@
 msgid "git gc [<options>]"
 msgstr "git gc [ОПЦИЯ…]"
 
-#: builtin/gc.c:94
+#: builtin/gc.c:93
 #, c-format
 msgid "Failed to fstat %s: %s"
 msgstr "Неуспешно изпълнение на „fstat“ върху „%s“: %s"
 
-#: builtin/gc.c:130
+#: builtin/gc.c:129
 #, c-format
 msgid "failed to parse '%s' value '%s'"
 msgstr "стойността на „%s“ — „%s“ не може да се анализира"
 
-#: builtin/gc.c:479 builtin/init-db.c:58
+#: builtin/gc.c:487 builtin/init-db.c:58
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "не може да се получи информация чрез „stat“ за директорията „%s“"
 
-#: builtin/gc.c:488 builtin/notes.c:240 builtin/tag.c:530
+#: builtin/gc.c:496 builtin/notes.c:240 builtin/tag.c:562
 #, c-format
 msgid "cannot read '%s'"
 msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: builtin/gc.c:495
+#: builtin/gc.c:503
 #, c-format
 msgid ""
 "The last gc run reported the following. Please correct the root cause\n"
@@ -15563,58 +15869,58 @@
 "\n"
 "%s"
 
-#: builtin/gc.c:543
+#: builtin/gc.c:551
 msgid "prune unreferenced objects"
 msgstr "окастряне на обектите, към които нищо не сочи"
 
-#: builtin/gc.c:545
+#: builtin/gc.c:553
 msgid "be more thorough (increased runtime)"
 msgstr "изчерпателно търсене на боклука (за сметка на повече време работа)"
 
-#: builtin/gc.c:546
+#: builtin/gc.c:554
 msgid "enable auto-gc mode"
 msgstr "включване на автоматичното събиране на боклука (auto-gc)"
 
-#: builtin/gc.c:549
+#: builtin/gc.c:557
 msgid "force running gc even if there may be another gc running"
 msgstr ""
 "изрично стартиране на събирането на боклука, дори и ако вече работи друго "
 "събиране"
 
-#: builtin/gc.c:552
+#: builtin/gc.c:560
 msgid "repack all other packs except the largest pack"
 msgstr "препакетиране на всичко без най-големия пакет"
 
-#: builtin/gc.c:569
+#: builtin/gc.c:576
 #, c-format
 msgid "failed to parse gc.logexpiry value %s"
 msgstr "неразпозната стойност на „gc.logexpiry“ %s"
 
-#: builtin/gc.c:580
+#: builtin/gc.c:587
 #, c-format
 msgid "failed to parse prune expiry value %s"
 msgstr "неразпозната стойност на периода за окастряне: %s"
 
-#: builtin/gc.c:600
+#: builtin/gc.c:607
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 "Автоматично пакетиране на заден фон на хранилището за по-добра "
 "производителност.\n"
 
-#: builtin/gc.c:602
+#: builtin/gc.c:609
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "Автоматично пакетиране на хранилището за по-добра производителност.\n"
 
-#: builtin/gc.c:603
+#: builtin/gc.c:610
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr ""
 "Погледнете ръководството за повече информация как да изпълните „git help "
 "gc“.\n"
 
-#: builtin/gc.c:643
+#: builtin/gc.c:650
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -15623,148 +15929,175 @@
 "процеса: %<PRIuMAX> (ако сте сигурни, че това не е вярно, това използвайте\n"
 "опцията „--force“)"
 
-#: builtin/gc.c:698
+#: builtin/gc.c:705
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
 "Има прекалено много недостижими, непакетирани обекти.\n"
 "Използвайте „git prune“, за да ги окастрите."
 
-#: builtin/gc.c:708
+#: builtin/gc.c:715
 msgid ""
 "git maintenance run [--auto] [--[no-]quiet] [--task=<task>] [--schedule]"
 msgstr ""
 "git maintenance run [--auto] [--[no-]quiet] [--task=ЗАДАЧА] [--schedule]"
 
-#: builtin/gc.c:738
+#: builtin/gc.c:745
 msgid "--no-schedule is not allowed"
 msgstr "опцията „--no-schedule“ не е позволена"
 
-#: builtin/gc.c:743
+#: builtin/gc.c:750
 #, c-format
 msgid "unrecognized --schedule argument '%s'"
 msgstr "непознат аргумент към „--schedule“: %s"
 
-#: builtin/gc.c:862
+#: builtin/gc.c:869
 msgid "failed to write commit-graph"
 msgstr "графът с подаванията не може да бъде записан"
 
-#: builtin/gc.c:901
+#: builtin/gc.c:914
 msgid "failed to fill remotes"
 msgstr "неуспешно попълване на следящите клони"
 
-#: builtin/gc.c:1024
+#: builtin/gc.c:1037
 msgid "failed to start 'git pack-objects' process"
 msgstr "процесът за командата „git pack-objects“ не може да бъде стартиран"
 
-#: builtin/gc.c:1041
+#: builtin/gc.c:1054
 msgid "failed to finish 'git pack-objects' process"
 msgstr "процесът за командата „git pack-objects“ не може да завърши"
 
-#: builtin/gc.c:1093
+#: builtin/gc.c:1106
 msgid "failed to write multi-pack-index"
 msgstr "индексът за множество пакети не може да бъде записан"
 
-#: builtin/gc.c:1111
+#: builtin/gc.c:1124
 msgid "'git multi-pack-index expire' failed"
 msgstr "неуспешно изпълнение на „git multi-pack-index expire“"
 
-#: builtin/gc.c:1172
+#: builtin/gc.c:1185
 msgid "'git multi-pack-index repack' failed"
 msgstr "неуспешно изпълнение на „git multi-pack-index repack“"
 
-#: builtin/gc.c:1181
+#: builtin/gc.c:1194
 msgid ""
 "skipping incremental-repack task because core.multiPackIndex is disabled"
 msgstr ""
 "задачата „incremental-repack“ се прескача, защото настройката „core."
 "multiPackIndex“ е изключена"
 
-#: builtin/gc.c:1279
+#: builtin/gc.c:1298
 #, c-format
 msgid "lock file '%s' exists, skipping maintenance"
 msgstr "заключващият файл „%s“ съществува.  Действието се прескача"
 
-#: builtin/gc.c:1309
+#: builtin/gc.c:1328
 #, c-format
 msgid "task '%s' failed"
 msgstr "неуспешно изпълнение на задачата „%s“"
 
-#: builtin/gc.c:1389
+#: builtin/gc.c:1410
 #, c-format
 msgid "'%s' is not a valid task"
 msgstr "„%s“ не е правилна задача"
 
-#: builtin/gc.c:1394
+#: builtin/gc.c:1415
 #, c-format
 msgid "task '%s' cannot be selected multiple times"
 msgstr "задачата „%s“ не може да се избере повече от веднъж"
 
-#: builtin/gc.c:1409
+#: builtin/gc.c:1430
 msgid "run tasks based on the state of the repository"
 msgstr "изпълняване на задачи според състоянието на хранилището"
 
-#: builtin/gc.c:1410
+#: builtin/gc.c:1431
 msgid "frequency"
 msgstr "честота"
 
-#: builtin/gc.c:1411
+#: builtin/gc.c:1432
 msgid "run tasks based on frequency"
 msgstr "изпълняване на задачи по график"
 
-#: builtin/gc.c:1414
+#: builtin/gc.c:1435
 msgid "do not report progress or other information over stderr"
 msgstr "без извеждане на напредъка и друга информация на стандартния изход"
 
-#: builtin/gc.c:1415
+#: builtin/gc.c:1436
 msgid "task"
 msgstr "задача"
 
-#: builtin/gc.c:1416
+#: builtin/gc.c:1437
 msgid "run a specific task"
 msgstr "изпълнение на определена задача"
 
-#: builtin/gc.c:1433
+#: builtin/gc.c:1454
 msgid "use at most one of --auto and --schedule=<frequency>"
 msgstr ""
 "може да се указва максимум една от опциите „--auto“ и „--schedule=ЧЕСТОТА“"
 
-#: builtin/gc.c:1467
+#: builtin/gc.c:1497
 msgid "failed to run 'git config'"
 msgstr "неуспешно изпълнение на „git config“"
 
-#: builtin/gc.c:1512
-msgid "another process is scheduling background maintenance"
-msgstr "друг процес задава поддръжката на заден фон"
+#: builtin/gc.c:1562
+#, c-format
+msgid "failed to expand path '%s'"
+msgstr "грешка при заместването на пътя „%s“"
 
-#: builtin/gc.c:1525
+#: builtin/gc.c:1591
+msgid "failed to start launchctl"
+msgstr "неуспешно стартиране на „launchctl“."
+
+#: builtin/gc.c:1628
+#, c-format
+msgid "failed to create directories for '%s'"
+msgstr "директориите за „%s“ не може да бъдат създадени"
+
+#: builtin/gc.c:1689
+#, c-format
+msgid "failed to bootstrap service %s"
+msgstr "услугата „%s“ не може се настрои първоначално"
+
+#: builtin/gc.c:1760
+msgid "failed to create temp xml file"
+msgstr "неуспешно създаване на временен файл за xml"
+
+#: builtin/gc.c:1850
+msgid "failed to start schtasks"
+msgstr "задачите за периодично изпълнение не може да се стартират"
+
+#: builtin/gc.c:1894
 msgid "failed to run 'crontab -l'; your system might not support 'cron'"
 msgstr ""
 "неуспешно изпълнение на „crontab -l“.  Системата ви може да не поддържа "
 "„cron“"
 
-#: builtin/gc.c:1544
+#: builtin/gc.c:1911
 msgid "failed to run 'crontab'; your system might not support 'cron'"
 msgstr ""
 "неуспешно изпълнение на „crontab“.  Системата ви може да не поддържа „cron“"
 
-#: builtin/gc.c:1550
+#: builtin/gc.c:1915
 msgid "failed to open stdin of 'crontab'"
 msgstr "стандартният вход на „crontab“ не може да се отвори"
 
-#: builtin/gc.c:1592
+#: builtin/gc.c:1956
 msgid "'crontab' died"
 msgstr "процесът на „crontab“ умря"
 
-#: builtin/gc.c:1605
+#: builtin/gc.c:1990
+msgid "another process is scheduling background maintenance"
+msgstr "друг процес задава поддръжката на заден фон"
+
+#: builtin/gc.c:2009
 msgid "failed to add repo to global config"
 msgstr "неуспешно добавяне на хранилище към файла с глобални настройки"
 
-#: builtin/gc.c:1615
+#: builtin/gc.c:2019
 msgid "git maintenance <subcommand> [<options>]"
 msgstr "git maintenance ПОДКОМАНДА [ОПЦИЯ…]"
 
-#: builtin/gc.c:1634
+#: builtin/gc.c:2038
 #, c-format
 msgid "invalid subcommand: %s"
 msgstr "неправилна подкоманда: „%s“"
@@ -15773,12 +16106,12 @@
 msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr "git grep [ОПЦИЯ…] [-e] ШАБЛОН [ВЕРСИЯ…] [[--] ПЪТ…]"
 
-#: builtin/grep.c:225
+#: builtin/grep.c:223
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep: неуспешно създаване на нишка: %s"
 
-#: builtin/grep.c:279
+#: builtin/grep.c:277
 #, c-format
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "зададен е неправилен брой нишки (%d) за %s"
@@ -15787,271 +16120,271 @@
 #. variable for tweaking threads, currently
 #. grep.threads
 #.
-#: builtin/grep.c:287 builtin/index-pack.c:1576 builtin/index-pack.c:1766
-#: builtin/pack-objects.c:2936
+#: builtin/grep.c:285 builtin/index-pack.c:1589 builtin/index-pack.c:1808
+#: builtin/pack-objects.c:2944
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "липсва поддръжка за нишки.  „%s“ ще се пренебрегне"
 
-#: builtin/grep.c:475 builtin/grep.c:600 builtin/grep.c:640
+#: builtin/grep.c:473 builtin/grep.c:601 builtin/grep.c:641
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "дървото не може да бъде прочетено (%s)"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:656
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "не може да се изпълни „grep“ от обект от вида %s"
 
-#: builtin/grep.c:736
+#: builtin/grep.c:737
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "опцията „%c“ очаква число за аргумент"
 
-#: builtin/grep.c:835
+#: builtin/grep.c:836
 msgid "search in index instead of in the work tree"
 msgstr "търсене в индекса, а не в работното дърво"
 
-#: builtin/grep.c:837
+#: builtin/grep.c:838
 msgid "find in contents not managed by git"
 msgstr "търсене и във файловете, които не са под управлението на git"
 
-#: builtin/grep.c:839
+#: builtin/grep.c:840
 msgid "search in both tracked and untracked files"
 msgstr "търсене и в следените, и в неследените файлове"
 
-#: builtin/grep.c:841
+#: builtin/grep.c:842
 msgid "ignore files specified via '.gitignore'"
 msgstr "игнориране на файловете указани в „.gitignore“"
 
-#: builtin/grep.c:843
+#: builtin/grep.c:844
 msgid "recursively search in each submodule"
 msgstr "рекурсивно търсене във всички подмодули"
 
-#: builtin/grep.c:846
+#: builtin/grep.c:847
 msgid "show non-matching lines"
 msgstr "извеждане на редовете, които не съвпадат"
 
-#: builtin/grep.c:848
+#: builtin/grep.c:849
 msgid "case insensitive matching"
 msgstr "без значение на регистъра на буквите (главни/малки)"
 
-#: builtin/grep.c:850
+#: builtin/grep.c:851
 msgid "match patterns only at word boundaries"
 msgstr "напасване на шаблоните само по границите на думите"
 
-#: builtin/grep.c:852
+#: builtin/grep.c:853
 msgid "process binary files as text"
 msgstr "обработване на двоичните файлове като текстови"
 
-#: builtin/grep.c:854
+#: builtin/grep.c:855
 msgid "don't match patterns in binary files"
 msgstr "прескачане на двоичните файлове"
 
-#: builtin/grep.c:857
+#: builtin/grep.c:858
 msgid "process binary files with textconv filters"
 msgstr ""
 "обработване на двоичните файлове чрез филтри за преобразуване към текст"
 
-#: builtin/grep.c:859
+#: builtin/grep.c:860
 msgid "search in subdirectories (default)"
 msgstr "търсене в поддиректориите (стандартно)"
 
-#: builtin/grep.c:861
+#: builtin/grep.c:862
 msgid "descend at most <depth> levels"
 msgstr "навлизане максимално на тази ДЪЛБОЧИНА в дървото"
 
-#: builtin/grep.c:865
+#: builtin/grep.c:866
 msgid "use extended POSIX regular expressions"
 msgstr "разширени регулярни изрази по POSIX"
 
-#: builtin/grep.c:868
+#: builtin/grep.c:869
 msgid "use basic POSIX regular expressions (default)"
 msgstr "основни регулярни изрази по POSIX (стандартно)"
 
-#: builtin/grep.c:871
+#: builtin/grep.c:872
 msgid "interpret patterns as fixed strings"
 msgstr "шаблоните са дословни низове"
 
-#: builtin/grep.c:874
+#: builtin/grep.c:875
 msgid "use Perl-compatible regular expressions"
 msgstr "регулярни изрази на Perl"
 
-#: builtin/grep.c:877
+#: builtin/grep.c:878
 msgid "show line numbers"
 msgstr "извеждане на номерата на редовете"
 
-#: builtin/grep.c:878
+#: builtin/grep.c:879
 msgid "show column number of first match"
 msgstr "извеждане на номера на колоната на първото напасване"
 
-#: builtin/grep.c:879
+#: builtin/grep.c:880
 msgid "don't show filenames"
 msgstr "без извеждане на имената на файловете"
 
-#: builtin/grep.c:880
+#: builtin/grep.c:881
 msgid "show filenames"
 msgstr "извеждане на имената на файловете"
 
-#: builtin/grep.c:882
+#: builtin/grep.c:883
 msgid "show filenames relative to top directory"
 msgstr ""
 "извеждане на относителните имена на файловете спрямо основната директория на "
 "хранилището"
 
-#: builtin/grep.c:884
+#: builtin/grep.c:885
 msgid "show only filenames instead of matching lines"
 msgstr "извеждане само на имената на файловете без напасващите редове"
 
-#: builtin/grep.c:886
+#: builtin/grep.c:887
 msgid "synonym for --files-with-matches"
 msgstr "псевдоним на „--files-with-matches“"
 
-#: builtin/grep.c:889
+#: builtin/grep.c:890
 msgid "show only the names of files without match"
 msgstr ""
 "извеждане само на имената на файловете, които не съдържат ред, напасващ на "
 "шаблона"
 
-#: builtin/grep.c:891
+#: builtin/grep.c:892
 msgid "print NUL after filenames"
 msgstr "извеждане на нулевия знак „NUL“ след всяко име на файл"
 
-#: builtin/grep.c:894
+#: builtin/grep.c:895
 msgid "show only matching parts of a line"
 msgstr "извеждане само на частите на редовете, които съвпадат"
 
-#: builtin/grep.c:896
+#: builtin/grep.c:897
 msgid "show the number of matches instead of matching lines"
 msgstr "извеждане на броя на съвпаденията вместо напасващите редове"
 
-#: builtin/grep.c:897
+#: builtin/grep.c:898
 msgid "highlight matches"
 msgstr "оцветяване на напасванията"
 
-#: builtin/grep.c:899
+#: builtin/grep.c:900
 msgid "print empty line between matches from different files"
 msgstr "извеждане на празен ред между напасванията от различни файлове"
 
-#: builtin/grep.c:901
+#: builtin/grep.c:902
 msgid "show filename only once above matches from same file"
 msgstr ""
 "извеждане на името на файла само веднъж за всички напасвания от този файл"
 
-#: builtin/grep.c:904
+#: builtin/grep.c:905
 msgid "show <n> context lines before and after matches"
 msgstr "извеждане на такъв БРОЙ редове преди и след напасванията"
 
-#: builtin/grep.c:907
+#: builtin/grep.c:908
 msgid "show <n> context lines before matches"
 msgstr "извеждане на такъв БРОЙ редове преди напасванията"
 
-#: builtin/grep.c:909
+#: builtin/grep.c:910
 msgid "show <n> context lines after matches"
 msgstr "извеждане на такъв БРОЙ редове след напасванията"
 
-#: builtin/grep.c:911
+#: builtin/grep.c:912
 msgid "use <n> worker threads"
 msgstr "използване на такъв БРОЙ работещи нишки"
 
-#: builtin/grep.c:912
+#: builtin/grep.c:913
 msgid "shortcut for -C NUM"
 msgstr "псевдоним на „-C БРОЙ“"
 
-#: builtin/grep.c:915
+#: builtin/grep.c:916
 msgid "show a line with the function name before matches"
 msgstr "извеждане на ред с името на функцията, в която е напаснат шаблона"
 
-#: builtin/grep.c:917
+#: builtin/grep.c:918
 msgid "show the surrounding function"
 msgstr "извеждане на обхващащата функция"
 
-#: builtin/grep.c:920
+#: builtin/grep.c:921
 msgid "read patterns from file"
 msgstr "изчитане на шаблоните от ФАЙЛ"
 
-#: builtin/grep.c:922
+#: builtin/grep.c:923
 msgid "match <pattern>"
 msgstr "напасване на ШАБЛОН"
 
-#: builtin/grep.c:924
+#: builtin/grep.c:925
 msgid "combine patterns specified with -e"
 msgstr "комбиниране на шаблоните указани с опцията „-e“"
 
-#: builtin/grep.c:936
+#: builtin/grep.c:937
 msgid "indicate hit with exit status without output"
 msgstr ""
 "без извеждане на стандартния изход.  Изходният код указва наличието на "
 "напасване"
 
-#: builtin/grep.c:938
+#: builtin/grep.c:939
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "извеждане на редове само от файловете, които напасват на всички шаблони"
 
-#: builtin/grep.c:940
-msgid "show parse tree for grep expression"
-msgstr "извеждане на дървото за анализ на регулярния израз"
-
-#: builtin/grep.c:944
+#: builtin/grep.c:942
 msgid "pager"
 msgstr "програма за преглед по страници"
 
-#: builtin/grep.c:944
+#: builtin/grep.c:942
 msgid "show matching files in the pager"
 msgstr "извеждане на съвпадащите файлове в програма за преглед по страници"
 
-#: builtin/grep.c:948
+#: builtin/grep.c:946
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr ""
 "позволяване на стартирането на grep(1) (текущият компилат пренебрегва тази "
 "опция)"
 
-#: builtin/grep.c:1014
+#: builtin/grep.c:1012
 msgid "no pattern given"
 msgstr "не сте задали шаблон"
 
-#: builtin/grep.c:1050
+#: builtin/grep.c:1048
 msgid "--no-index or --untracked cannot be used with revs"
 msgstr "опциите „--cached“ и „--untracked“ са несъвместими с версии."
 
-#: builtin/grep.c:1058
+#: builtin/grep.c:1056
 #, c-format
 msgid "unable to resolve revision: %s"
 msgstr "версията „%s“ не може бъде открита"
 
-#: builtin/grep.c:1088
+#: builtin/grep.c:1086
 msgid "--untracked not supported with --recurse-submodules"
 msgstr "опциите „--untracked“ и „--recurse-submodules“ са несъвместими"
 
-#: builtin/grep.c:1092
+#: builtin/grep.c:1090
 msgid "invalid option combination, ignoring --threads"
 msgstr "неправилна комбинация от опции, „--threads“ ще се пренебрегне"
 
-#: builtin/grep.c:1095 builtin/pack-objects.c:3655
+#: builtin/grep.c:1093 builtin/pack-objects.c:3672
 msgid "no threads support, ignoring --threads"
 msgstr "липсва поддръжка за нишки.  „--threads“ ще се пренебрегне"
 
-#: builtin/grep.c:1098 builtin/index-pack.c:1573 builtin/pack-objects.c:2933
+#: builtin/grep.c:1096 builtin/index-pack.c:1586 builtin/pack-objects.c:2941
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "зададен е неправилен брой нишки: %d"
 
-#: builtin/grep.c:1132
+#: builtin/grep.c:1130
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "опцията „--open-files-in-pager“ изисква търсене в работното дърво"
 
-#: builtin/grep.c:1158
+#: builtin/grep.c:1156
 msgid "--cached or --untracked cannot be used with --no-index"
 msgstr "опциите „--cached“ и „--untracked“ са несъвместими с „--no-index“"
 
-#: builtin/grep.c:1164
+#: builtin/grep.c:1159
+msgid "--untracked cannot be used with --cached"
+msgstr "опциите „--untracked“ и „--cached“ са несъвместими"
+
+#: builtin/grep.c:1165
 msgid "--[no-]exclude-standard cannot be used for tracked contents"
 msgstr ""
 "опциите „--(no-)exclude-standard“ са несъвместими с търсене по следени "
 "файлове"
 
-#: builtin/grep.c:1172
+#: builtin/grep.c:1173
 msgid "both --cached and trees are given"
 msgstr "опцията „--cached“ е несъвместима със задаване на дърво"
 
@@ -16186,12 +16519,12 @@
 "никоя програма за преглед на информационните страници не успя да обработи "
 "заявката"
 
-#: builtin/help.c:520 builtin/help.c:531 git.c:337
+#: builtin/help.c:520 builtin/help.c:531 git.c:340
 #, c-format
 msgid "'%s' is aliased to '%s'"
 msgstr "„%s“ е псевдоним на „%s“"
 
-#: builtin/help.c:534 git.c:369
+#: builtin/help.c:534 git.c:372
 #, c-format
 msgid "bad alias.%s string: %s"
 msgstr "неправилен низ за настройката „alias.%s“: „%s“"
@@ -16239,7 +16572,7 @@
 msgid "used more bytes than were available"
 msgstr "използвани са повече от наличните байтове"
 
-#: builtin/index-pack.c:324 builtin/pack-objects.c:619
+#: builtin/index-pack.c:324 builtin/pack-objects.c:624
 msgid "pack too large for current definition of off_t"
 msgstr "пакетният файл е прекалено голям за текущата стойност на типа „off_t“"
 
@@ -16247,7 +16580,7 @@
 msgid "pack exceeds maximum allowed size"
 msgstr "пакетният файл надвишава максималния възможен размер"
 
-#: builtin/index-pack.c:342 builtin/repack.c:286
+#: builtin/index-pack.c:342
 #, c-format
 msgid "unable to create '%s'"
 msgstr "пакетният файл „%s“ не може да бъде създаден"
@@ -16339,7 +16672,7 @@
 #: builtin/index-pack.c:870
 #, c-format
 msgid "Not all child objects of %s are reachable"
-msgstr "Някои обекти, наследници на „%s“, не могат да бъдат достигнати"
+msgstr "Някои обекти, наследници на „%s“, не може да бъдат достигнати"
 
 #: builtin/index-pack.c:931 builtin/index-pack.c:978
 msgid "failed to apply delta"
@@ -16376,7 +16709,7 @@
 msgid "Resolving deltas"
 msgstr "Откриване на съответните разлики"
 
-#: builtin/index-pack.c:1249 builtin/pack-objects.c:2697
+#: builtin/index-pack.c:1249 builtin/pack-objects.c:2707
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "не може да се създаде нишка: %s"
@@ -16419,10 +16752,10 @@
 msgid "local object %s is corrupt"
 msgstr "локалният обект „%s“ е повреден"
 
-#: builtin/index-pack.c:1444
+#: builtin/index-pack.c:1445
 #, c-format
-msgid "packfile name '%s' does not end with '.pack'"
-msgstr "името на пакетния файл „%s“ не завършва на „.pack“"
+msgid "packfile name '%s' does not end with '.%s'"
+msgstr "името на пакетния файл „%s“ не завършва с „%s“"
 
 #: builtin/index-pack.c:1469
 #, c-format
@@ -16434,79 +16767,83 @@
 msgid "cannot close written %s file '%s'"
 msgstr "грешка при затварянето на записания файл „%s“ „%s“"
 
-#: builtin/index-pack.c:1501
+#: builtin/index-pack.c:1503
 msgid "error while closing pack file"
 msgstr "грешка при затварянето на пакетния файл"
 
-#: builtin/index-pack.c:1515
+#: builtin/index-pack.c:1517
 msgid "cannot store pack file"
 msgstr "пакетният файл не може да бъде запазен"
 
-#: builtin/index-pack.c:1523
+#: builtin/index-pack.c:1525
 msgid "cannot store index file"
 msgstr "файлът за индекса не може да бъде съхранен"
 
-#: builtin/index-pack.c:1567 builtin/pack-objects.c:2944
+#: builtin/index-pack.c:1534
+msgid "cannot store reverse index file"
+msgstr "файлът за индекса не може да бъде съхранен"
+
+#: builtin/index-pack.c:1580 builtin/pack-objects.c:2952
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "зададена е неправилна версия пакетиране: „pack.indexversion=%<PRIu32>“"
 
-#: builtin/index-pack.c:1631
+#: builtin/index-pack.c:1650
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Съществуващият пакетен файл „%s“ не може да бъде отворен"
 
-#: builtin/index-pack.c:1633
+#: builtin/index-pack.c:1652
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "Съществуващият индекс за пакетния файл „%s“ не може да бъде отворен"
 
-#: builtin/index-pack.c:1681
+#: builtin/index-pack.c:1700
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "%d обект не е разлика"
 msgstr[1] "%d обекта не са разлика"
 
-#: builtin/index-pack.c:1688
+#: builtin/index-pack.c:1707
 #, 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:1728
+#: builtin/index-pack.c:1765
 msgid "Cannot come back to cwd"
 msgstr "Процесът не може да се върне към предишната работна директория"
 
-#: builtin/index-pack.c:1777 builtin/index-pack.c:1780
-#: builtin/index-pack.c:1796 builtin/index-pack.c:1800
+#: builtin/index-pack.c:1819 builtin/index-pack.c:1822
+#: builtin/index-pack.c:1838 builtin/index-pack.c:1842
 #, c-format
 msgid "bad %s"
 msgstr "неправилна стойност „%s“"
 
-#: builtin/index-pack.c:1806 builtin/init-db.c:392 builtin/init-db.c:625
+#: builtin/index-pack.c:1848 builtin/init-db.c:392 builtin/init-db.c:625
 #, c-format
 msgid "unknown hash algorithm '%s'"
 msgstr "непознат алгоритъм за контролни суми „%s“"
 
-#: builtin/index-pack.c:1821
+#: builtin/index-pack.c:1867
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "опцията „--fix-thin“ изисква „--stdin“"
 
-#: builtin/index-pack.c:1823
+#: builtin/index-pack.c:1869
 msgid "--stdin requires a git repository"
 msgstr "„--stdin“ изисква хранилище на git"
 
-#: builtin/index-pack.c:1825
+#: builtin/index-pack.c:1871
 msgid "--object-format cannot be used with --stdin"
 msgstr "опцията „--object-format“ и „--stdin“ са несъвместими"
 
-#: builtin/index-pack.c:1831
+#: builtin/index-pack.c:1886
 msgid "--verify with no packfile name given"
 msgstr "опцията „--verify“ изисква име на пакетен файл"
 
-#: builtin/index-pack.c:1892 builtin/unpack-objects.c:582
+#: builtin/index-pack.c:1956 builtin/unpack-objects.c:582
 msgid "fsck error in pack objects"
 msgstr "грешка при проверка с „fsck“ на пакетните обекти"
 
@@ -16728,132 +17065,132 @@
 msgid "no input file given for in-place editing"
 msgstr "не е зададен входен файл за редактиране на място"
 
-#: builtin/log.c:58
+#: builtin/log.c:59
 msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
 msgstr "git log [ОПЦИЯ…] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] ПЪТ…]"
 
-#: builtin/log.c:59
+#: builtin/log.c:60
 msgid "git show [<options>] <object>..."
 msgstr "git show [ОПЦИЯ…] ОБЕКТ…"
 
-#: builtin/log.c:112
+#: builtin/log.c:113
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "неправилна опция „--decorate“: %s"
 
-#: builtin/log.c:179
+#: builtin/log.c:180
 msgid "show source"
 msgstr "извеждане на изходния код"
 
-#: builtin/log.c:180
-msgid "Use mail map file"
+#: builtin/log.c:181
+msgid "use mail map file"
 msgstr ""
-"Използване на файл за съответствията на имената и адресите на е-поща („."
+"използване на файл за съответствията на имената и адресите на е-поща („."
 "mailmap“)"
 
-#: builtin/log.c:183
+#: builtin/log.c:184
 msgid "only decorate refs that match <pattern>"
 msgstr "специален формат само на указателите напасващи на ШАБЛОНа"
 
-#: builtin/log.c:185
+#: builtin/log.c:186
 msgid "do not decorate refs that match <pattern>"
 msgstr "без специален формат на указателите напасващи на ШАБЛОНа"
 
-#: builtin/log.c:186
+#: builtin/log.c:187
 msgid "decorate options"
 msgstr "настройки на форма̀та на извежданата информация"
 
-#: builtin/log.c:189
+#: builtin/log.c:190
 msgid ""
-"Trace the evolution of line range <start>,<end> or function :<funcname> in "
+"trace the evolution of line range <start>,<end> or function :<funcname> in "
 "<file>"
 msgstr ""
-"Проследяване на еволюцията на диапазона от редове НАЧАЛО,КРАЙ или :ФУНКЦИЯта "
+"проследяване на еволюцията на диапазона от редове НАЧАЛО,КРАЙ или :ФУНКЦИЯта "
 "във ФАЙЛа"
 
-#: builtin/log.c:212
+#: builtin/log.c:213
 msgid "-L<range>:<file> cannot be used with pathspec"
 msgstr "опцията „-LДИАПАЗОН:ФАЙЛ“ не може да се ползва с път"
 
-#: builtin/log.c:302
+#: builtin/log.c:303
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Резултат: %d %s\n"
 
-#: builtin/log.c:564
+#: builtin/log.c:566
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: повреден файл"
 
-#: builtin/log.c:579 builtin/log.c:674
+#: builtin/log.c:581 builtin/log.c:671
 #, c-format
 msgid "could not read object %s"
 msgstr "обектът не може да бъде прочетен: %s"
 
-#: builtin/log.c:699
+#: builtin/log.c:696
 #, c-format
 msgid "unknown type: %d"
 msgstr "неизвестен вид: %d"
 
-#: builtin/log.c:848
+#: builtin/log.c:841
 #, c-format
 msgid "%s: invalid cover from description mode"
 msgstr "%s: неправилно придружаващо писмо от режима на описание"
 
-#: builtin/log.c:855
+#: builtin/log.c:848
 msgid "format.headers without value"
 msgstr "не е зададена стойност на „format.headers“"
 
-#: builtin/log.c:984
+#: builtin/log.c:977
 #, c-format
 msgid "cannot open patch file %s"
 msgstr "файлът-кръпка „%s“ не може да бъде отворен"
 
-#: builtin/log.c:1001
+#: builtin/log.c:994
 msgid "need exactly one range"
 msgstr "трябва да зададете точно един диапазон"
 
-#: builtin/log.c:1011
+#: builtin/log.c:1004
 msgid "not a range"
 msgstr "не е диапазон"
 
-#: builtin/log.c:1175
+#: builtin/log.c:1168
 msgid "cover letter needs email format"
 msgstr "придружаващото писмо трябва да е форматирано като е-писмо"
 
-#: builtin/log.c:1181
+#: builtin/log.c:1174
 msgid "failed to create cover-letter file"
 msgstr "неуспешно създаване на придружаващо писмо"
 
-#: builtin/log.c:1262
+#: builtin/log.c:1261
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "неправилен формат на заглавната част за отговор „in-reply-to“: %s"
 
-#: builtin/log.c:1289
+#: builtin/log.c:1288
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [ОПЦИЯ…] [ОТ | ДИАПАЗОН_НА_ВЕРСИИТЕ]"
 
-#: builtin/log.c:1347
+#: builtin/log.c:1346
 msgid "two output directories?"
 msgstr "може да укажете максимум една директория за изход"
 
-#: builtin/log.c:1498 builtin/log.c:2318 builtin/log.c:2320 builtin/log.c:2332
+#: builtin/log.c:1497 builtin/log.c:2317 builtin/log.c:2319 builtin/log.c:2331
 #, c-format
 msgid "unknown commit %s"
 msgstr "непознато подаване: „%s“"
 
-#: builtin/log.c:1509 builtin/replace.c:58 builtin/replace.c:207
+#: builtin/log.c:1508 builtin/replace.c:58 builtin/replace.c:207
 #: builtin/replace.c:210
 #, c-format
 msgid "failed to resolve '%s' as a valid ref"
 msgstr "„%s“ не е указател или не сочи към нищо"
 
-#: builtin/log.c:1518
+#: builtin/log.c:1517
 msgid "could not find exact merge base"
 msgstr "точната база за сливане не може да бъде открита"
 
-#: builtin/log.c:1528
+#: builtin/log.c:1527
 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"
@@ -16863,303 +17200,303 @@
 "зададете, използвайте „git branch --set-upstream-to“.\n"
 "Можете ръчно да зададете базово подаване чрез „--base=<base-commit-id>“."
 
-#: builtin/log.c:1551
+#: builtin/log.c:1550
 msgid "failed to find exact merge base"
 msgstr "точната база при сливане не може да бъде открита"
 
-#: builtin/log.c:1568
+#: builtin/log.c:1567
 msgid "base commit should be the ancestor of revision list"
 msgstr "базовото подаване трябва да е предшественикът на списъка с версиите"
 
-#: builtin/log.c:1578
+#: builtin/log.c:1577
 msgid "base commit shouldn't be in revision list"
 msgstr "базовото подаване не може да е в списъка с версиите"
 
-#: builtin/log.c:1636
+#: builtin/log.c:1635
 msgid "cannot get patch id"
 msgstr "идентификаторът на кръпката не може да бъде получен"
 
-#: builtin/log.c:1693
+#: builtin/log.c:1692
 msgid "failed to infer range-diff origin of current series"
 msgstr ""
 "неуспешно определяне на началото на диапазонната разлика на текущата поредица"
 
-#: builtin/log.c:1695
+#: builtin/log.c:1694
 #, c-format
 msgid "using '%s' as range-diff origin of current series"
 msgstr ""
 "„%s“ се ползва като началото на диапазонната разлика на текущата поредица"
 
-#: builtin/log.c:1739
+#: builtin/log.c:1738
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "номерация „[PATCH n/m]“ дори и при единствена кръпка"
 
-#: builtin/log.c:1742
+#: builtin/log.c:1741
 msgid "use [PATCH] even with multiple patches"
 msgstr "номерация „[PATCH]“ дори и при множество кръпки"
 
-#: builtin/log.c:1746
+#: builtin/log.c:1745
 msgid "print patches to standard out"
 msgstr "извеждане на кръпките на стандартния изход"
 
-#: builtin/log.c:1748
+#: builtin/log.c:1747
 msgid "generate a cover letter"
 msgstr "създаване на придружаващо писмо"
 
-#: builtin/log.c:1750
+#: builtin/log.c:1749
 msgid "use simple number sequence for output file names"
 msgstr "проста числова последователност за имената на файловете-кръпки"
 
-#: builtin/log.c:1751
+#: builtin/log.c:1750
 msgid "sfx"
 msgstr "ЗНАЦИ"
 
-#: builtin/log.c:1752
+#: builtin/log.c:1751
 msgid "use <sfx> instead of '.patch'"
 msgstr "използване на тези ЗНАЦИ за суфикс вместо „.patch“"
 
-#: builtin/log.c:1754
+#: builtin/log.c:1753
 msgid "start numbering patches at <n> instead of 1"
 msgstr "номерирането на кръпките да започва от този БРОЙ, а не с 1"
 
-#: builtin/log.c:1756
+#: builtin/log.c:1755
 msgid "mark the series as Nth re-roll"
 msgstr "отбелязване, че това е N-тата поредна редакция на поредицата от кръпки"
 
-#: builtin/log.c:1758
+#: builtin/log.c:1757
 msgid "max length of output filename"
 msgstr "максимална дължина на име на всеки пакетен файл"
 
-#: builtin/log.c:1760
-msgid "Use [RFC PATCH] instead of [PATCH]"
-msgstr "Използване на „[RFC PATCH]“ вместо „[PATCH]“"
+#: builtin/log.c:1759
+msgid "use [RFC PATCH] instead of [PATCH]"
+msgstr "използване на „[RFC PATCH]“ вместо „[PATCH]“"
 
-#: builtin/log.c:1763
+#: builtin/log.c:1762
 msgid "cover-from-description-mode"
 msgstr "режим-придружаващо-писмо-по-описание"
 
-#: builtin/log.c:1764
+#: builtin/log.c:1763
 msgid "generate parts of a cover letter based on a branch's description"
 msgstr ""
 "генериране на частите на придружаващото писмо на базата на описанието на "
 "клона"
 
-#: builtin/log.c:1766
-msgid "Use [<prefix>] instead of [PATCH]"
-msgstr "Използване на този „[ПРЕФИКС]“ вместо „[PATCH]“"
+#: builtin/log.c:1765
+msgid "use [<prefix>] instead of [PATCH]"
+msgstr "използване на този „[ПРЕФИКС]“ вместо „[PATCH]“"
 
-#: builtin/log.c:1769
+#: builtin/log.c:1768
 msgid "store resulting files in <dir>"
 msgstr "запазване на изходните файлове в тази ДИРЕКТОРИЯ"
 
-#: builtin/log.c:1772
+#: builtin/log.c:1771
 msgid "don't strip/add [PATCH]"
 msgstr "без добавяне/махане на префикса „[PATCH]“"
 
-#: builtin/log.c:1775
+#: builtin/log.c:1774
 msgid "don't output binary diffs"
 msgstr "без извеждане на разлики между двоични файлове"
 
-#: builtin/log.c:1777
+#: builtin/log.c:1776
 msgid "output all-zero hash in From header"
 msgstr "в заглавната част „From:“ (от) контролната сума да е само от нули"
 
-#: builtin/log.c:1779
+#: builtin/log.c:1778
 msgid "don't include a patch matching a commit upstream"
 msgstr "без кръпки, които присъстват в следения клон"
 
-#: builtin/log.c:1781
+#: builtin/log.c:1780
 msgid "show patch format instead of default (patch + stat)"
 msgstr ""
 "извеждане във формат за кръпки, а на в стандартния (кръпка и статистика)"
 
-#: builtin/log.c:1783
+#: builtin/log.c:1782
 msgid "Messaging"
 msgstr "Опции при изпращане"
 
-#: builtin/log.c:1784
+#: builtin/log.c:1783
 msgid "header"
 msgstr "ЗАГЛАВНА_ЧАСТ"
 
-#: builtin/log.c:1785
+#: builtin/log.c:1784
 msgid "add email header"
 msgstr "добавяне на тази ЗАГЛАВНА_ЧАСТ"
 
-#: builtin/log.c:1786 builtin/log.c:1787
+#: builtin/log.c:1785 builtin/log.c:1786
 msgid "email"
 msgstr "Е-ПОЩА"
 
-#: builtin/log.c:1786
+#: builtin/log.c:1785
 msgid "add To: header"
 msgstr "добавяне на заглавна част „To:“ (до)"
 
-#: builtin/log.c:1787
+#: builtin/log.c:1786
 msgid "add Cc: header"
 msgstr "добавяне на заглавна част „Cc:“ (и до)"
 
-#: builtin/log.c:1788
+#: builtin/log.c:1787
 msgid "ident"
 msgstr "ИДЕНТИЧНОСТ"
 
-#: builtin/log.c:1789
+#: builtin/log.c:1788
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "задаване на адреса в заглавната част „From“ (от) да е тази ИДЕНТИЧНОСТ.  Ако "
 "не е зададена такава, се взима адреса на подаващия"
 
-#: builtin/log.c:1791
+#: builtin/log.c:1790
 msgid "message-id"
 msgstr "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
 
-#: builtin/log.c:1792
+#: builtin/log.c:1791
 msgid "make first mail a reply to <message-id>"
 msgstr ""
 "първото съобщение да е в отговор на е-писмото с този "
 "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
 
-#: builtin/log.c:1793 builtin/log.c:1796
+#: builtin/log.c:1792 builtin/log.c:1795
 msgid "boundary"
 msgstr "граница"
 
-#: builtin/log.c:1794
+#: builtin/log.c:1793
 msgid "attach the patch"
 msgstr "прикрепяне на кръпката"
 
-#: builtin/log.c:1797
+#: builtin/log.c:1796
 msgid "inline the patch"
 msgstr "включване на кръпката в текста на писмата"
 
-#: builtin/log.c:1801
+#: builtin/log.c:1800
 msgid "enable message threading, styles: shallow, deep"
 msgstr ""
 "използване на нишки за съобщенията.  СТИЛът е „shallow“ (плитък) или "
 "„deep“ (дълбок)"
 
-#: builtin/log.c:1803
+#: builtin/log.c:1802
 msgid "signature"
 msgstr "подпис"
 
-#: builtin/log.c:1804
+#: builtin/log.c:1803
 msgid "add a signature"
 msgstr "добавяне на поле за подпис"
 
-#: builtin/log.c:1805
+#: builtin/log.c:1804
 msgid "base-commit"
 msgstr "БАЗОВО_ПОДАВАНЕ"
 
-#: builtin/log.c:1806
+#: builtin/log.c:1805
 msgid "add prerequisite tree info to the patch series"
 msgstr "добавяне на необходимото БАЗово дърво към поредицата от кръпки"
 
-#: builtin/log.c:1809
+#: builtin/log.c:1808
 msgid "add a signature from a file"
 msgstr "добавяне на подпис от файл"
 
-#: builtin/log.c:1810
+#: builtin/log.c:1809
 msgid "don't print the patch filenames"
 msgstr "без извеждане на имената на кръпките"
 
-#: builtin/log.c:1812
+#: builtin/log.c:1811
 msgid "show progress while generating patches"
 msgstr "извеждане на напредъка във фазата на създаване на кръпките"
 
-#: builtin/log.c:1814
+#: builtin/log.c:1813
 msgid "show changes against <rev> in cover letter or single patch"
 msgstr ""
 "показване на промените спрямо ВЕРСията в придружаващото писмо или единствена "
 "кръпка"
 
-#: builtin/log.c:1817
+#: builtin/log.c:1816
 msgid "show changes against <refspec> in cover letter or single patch"
 msgstr ""
 "показване на промените спрямо указателя на ВЕРСията в придружаващото писмо "
 "или единствена кръпка"
 
-#: builtin/log.c:1819
+#: builtin/log.c:1818
 msgid "percentage by which creation is weighted"
 msgstr "процент за претегляне при оценка на създаването"
 
-#: builtin/log.c:1905
+#: builtin/log.c:1904
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "грешна идентичност: %s"
 
-#: builtin/log.c:1920
+#: builtin/log.c:1919
 msgid "-n and -k are mutually exclusive"
 msgstr "опциите „-n“ и „-k“ са несъвместими"
 
-#: builtin/log.c:1922
+#: builtin/log.c:1921
 msgid "--subject-prefix/--rfc and -k are mutually exclusive"
 msgstr "опциите „--subject-prefix“/„-rfc“ и „-k“ са несъвместими"
 
-#: builtin/log.c:1930
+#: builtin/log.c:1929
 msgid "--name-only does not make sense"
 msgstr "опцията „--name-only“ е несъвместима с генерирането на кръпки"
 
-#: builtin/log.c:1932
+#: builtin/log.c:1931
 msgid "--name-status does not make sense"
 msgstr "опцията „--name-status“ е несъвместима с генерирането на кръпки"
 
-#: builtin/log.c:1934
+#: builtin/log.c:1933
 msgid "--check does not make sense"
 msgstr "опцията „--check“ е несъвместима с генерирането на кръпки"
 
-#: builtin/log.c:1956
+#: builtin/log.c:1955
 msgid "--stdout, --output, and --output-directory are mutually exclusive"
 msgstr ""
 "Опциите „--stdout“, „--output“ и „--output-directory“ са несъвместими една с "
 "друга"
 
-#: builtin/log.c:2079
+#: builtin/log.c:2078
 msgid "--interdiff requires --cover-letter or single patch"
 msgstr ""
 "опцията „--interdiff“ изисква опция „--cover-letter“ или единствена кръпка"
 
-#: builtin/log.c:2083
+#: builtin/log.c:2082
 msgid "Interdiff:"
 msgstr "Разлика в разликите:"
 
-#: builtin/log.c:2084
+#: builtin/log.c:2083
 #, c-format
 msgid "Interdiff against v%d:"
 msgstr "Разлика в разликите спрямо v%d:"
 
-#: builtin/log.c:2090
+#: builtin/log.c:2089
 msgid "--creation-factor requires --range-diff"
 msgstr "опцията „--creation-factor“ изисква опция „--range-diff“"
 
-#: builtin/log.c:2094
+#: builtin/log.c:2093
 msgid "--range-diff requires --cover-letter or single patch"
 msgstr ""
 "опцията „--range-diff“ изисква опция „--cover-letter“ или единствена кръпка"
 
-#: builtin/log.c:2102
+#: builtin/log.c:2101
 msgid "Range-diff:"
 msgstr "Диапазонна разлика:"
 
-#: builtin/log.c:2103
+#: builtin/log.c:2102
 #, c-format
 msgid "Range-diff against v%d:"
 msgstr "Диапазонна разлика спрямо v%d:"
 
-#: builtin/log.c:2114
+#: builtin/log.c:2113
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "файлът „%s“ с подпис не може да бъде прочетен"
 
-#: builtin/log.c:2150
+#: builtin/log.c:2149
 msgid "Generating patches"
 msgstr "Създаване на кръпки"
 
-#: builtin/log.c:2194
+#: builtin/log.c:2193
 msgid "failed to create output files"
 msgstr "неуспешно създаване на изходни файлове"
 
-#: builtin/log.c:2253
+#: builtin/log.c:2252
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [ОТДАЛЕЧЕН_КЛОН [ВРЪХ [ПРЕДЕЛ]]]"
 
-#: builtin/log.c:2307
+#: builtin/log.c:2306
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -17167,112 +17504,116 @@
 "Следеният отдалечен клон не бе открит, затова изрично задайте "
 "ОТДАЛЕЧЕН_КЛОН.\n"
 
-#: builtin/ls-files.c:471
+#: builtin/ls-files.c:486
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [ОПЦИЯ…] [ФАЙЛ…]"
 
-#: builtin/ls-files.c:527
+#: builtin/ls-files.c:542
 msgid "identify the file status with tags"
 msgstr "извеждане на състоянието на файловете с еднобуквени флагове"
 
-#: builtin/ls-files.c:529
+#: builtin/ls-files.c:544
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "малки букви за файловете, които да се счетат за непроменени"
 
-#: builtin/ls-files.c:531
+#: builtin/ls-files.c:546
 msgid "use lowercase letters for 'fsmonitor clean' files"
 msgstr "малки букви за файловете за командата „fsmonitor clean“"
 
-#: builtin/ls-files.c:533
+#: builtin/ls-files.c:548
 msgid "show cached files in the output (default)"
 msgstr "извеждане на кешираните файлове (стандартно)"
 
-#: builtin/ls-files.c:535
+#: builtin/ls-files.c:550
 msgid "show deleted files in the output"
 msgstr "извеждане на изтритите файлове"
 
-#: builtin/ls-files.c:537
+#: builtin/ls-files.c:552
 msgid "show modified files in the output"
 msgstr "извеждане на променените файлове"
 
-#: builtin/ls-files.c:539
+#: builtin/ls-files.c:554
 msgid "show other files in the output"
 msgstr "извеждане на другите файлове"
 
-#: builtin/ls-files.c:541
+#: builtin/ls-files.c:556
 msgid "show ignored files in the output"
 msgstr "извеждане на игнорираните файлове"
 
-#: builtin/ls-files.c:544
+#: builtin/ls-files.c:559
 msgid "show staged contents' object name in the output"
 msgstr "извеждане на името на обекта за съдържанието на индекса"
 
-#: builtin/ls-files.c:546
+#: builtin/ls-files.c:561
 msgid "show files on the filesystem that need to be removed"
 msgstr "извеждане на файловете, които трябва да бъдат изтрити"
 
-#: builtin/ls-files.c:548
+#: builtin/ls-files.c:563
 msgid "show 'other' directories' names only"
 msgstr "извеждане само на името на другите (неследените) директории"
 
-#: builtin/ls-files.c:550
+#: builtin/ls-files.c:565
 msgid "show line endings of files"
 msgstr "извеждане на знаците за край на ред във файловете"
 
-#: builtin/ls-files.c:552
+#: builtin/ls-files.c:567
 msgid "don't show empty directories"
 msgstr "без извеждане на празните директории"
 
-#: builtin/ls-files.c:555
+#: builtin/ls-files.c:570
 msgid "show unmerged files in the output"
 msgstr "извеждане на неслетите файлове"
 
-#: builtin/ls-files.c:557
+#: builtin/ls-files.c:572
 msgid "show resolve-undo information"
 msgstr "извеждане на информацията за отмяна на разрешените подавания"
 
-#: builtin/ls-files.c:559
+#: builtin/ls-files.c:574
 msgid "skip files matching pattern"
 msgstr "прескачане на файловете напасващи ШАБЛОНа"
 
-#: builtin/ls-files.c:562
+#: builtin/ls-files.c:577
 msgid "exclude patterns are read from <file>"
 msgstr "шаблоните за игнориране да се прочетат от този ФАЙЛ"
 
-#: builtin/ls-files.c:565
+#: builtin/ls-files.c:580
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr ""
 "изчитане на допълнителните шаблони за игнориране по директория от този ФАЙЛ"
 
-#: builtin/ls-files.c:567
+#: builtin/ls-files.c:582
 msgid "add the standard git exclusions"
 msgstr "добавяне на стандартно игнорираните от Git файлове"
 
-#: builtin/ls-files.c:571
+#: builtin/ls-files.c:586
 msgid "make the output relative to the project top directory"
 msgstr "пътищата да са относителни спрямо основната директория на проекта"
 
-#: builtin/ls-files.c:574
+#: builtin/ls-files.c:589
 msgid "recurse through submodules"
 msgstr "рекурсивно обхождане подмодулите"
 
-#: builtin/ls-files.c:576
+#: builtin/ls-files.c:591
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "грешка, ако някой от тези ФАЙЛове не е в индекса"
 
-#: builtin/ls-files.c:577
+#: builtin/ls-files.c:592
 msgid "tree-ish"
 msgstr "УКАЗАТЕЛ_КЪМ_ДЪРВО"
 
-#: builtin/ls-files.c:578
+#: builtin/ls-files.c:593
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 "считане, че пътищата изтрити след УКАЗАТЕЛя_КЪМ_ДЪРВО все още съществуват"
 
-#: builtin/ls-files.c:580
+#: builtin/ls-files.c:595
 msgid "show debugging data"
 msgstr "извеждане на информацията за изчистване на грешки"
 
+#: builtin/ls-files.c:597
+msgid "suppress duplicate entries"
+msgstr "без повтаряне на записите"
+
 #: builtin/ls-remote.c:9
 msgid ""
 "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
@@ -17283,39 +17624,39 @@
 "                     [-q | --quiet] [--exit-code] [--get-url]\n"
 "                     [--symref] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]"
 
-#: builtin/ls-remote.c:59
+#: builtin/ls-remote.c:60
 msgid "do not print remote URL"
 msgstr "без извеждане на адресите на отдалечените хранилища"
 
-#: builtin/ls-remote.c:60 builtin/ls-remote.c:62 builtin/rebase.c:1398
+#: builtin/ls-remote.c:61 builtin/ls-remote.c:63 builtin/rebase.c:1404
 msgid "exec"
 msgstr "КОМАНДА"
 
-#: builtin/ls-remote.c:61 builtin/ls-remote.c:63
+#: builtin/ls-remote.c:62 builtin/ls-remote.c:64
 msgid "path of git-upload-pack on the remote host"
 msgstr "път към командата „git-upload-pack“ на отдалечената машина"
 
-#: builtin/ls-remote.c:65
+#: builtin/ls-remote.c:66
 msgid "limit to tags"
 msgstr "само етикетите"
 
-#: builtin/ls-remote.c:66
+#: builtin/ls-remote.c:67
 msgid "limit to heads"
 msgstr "само върховете"
 
-#: builtin/ls-remote.c:67
+#: builtin/ls-remote.c:68
 msgid "do not show peeled tags"
 msgstr "без проследяване на непреките етикети"
 
-#: builtin/ls-remote.c:69
+#: builtin/ls-remote.c:70
 msgid "take url.<base>.insteadOf into account"
 msgstr "взимане предвид на „url.БАЗА.insteadOf“"
 
-#: builtin/ls-remote.c:72
+#: builtin/ls-remote.c:73
 msgid "exit with exit code 2 if no matching refs are found"
 msgstr "изход с код 2, ако не се открият съвпадащи указатели"
 
-#: builtin/ls-remote.c:75
+#: builtin/ls-remote.c:76
 msgid "show underlying ref in addition to the object pointed by it"
 msgstr "извеждане на указателя заедно с обекта сочен от него"
 
@@ -17474,196 +17815,196 @@
 msgid "Merging %s with %s\n"
 msgstr "Сливане на „%s“ с „%s“\n"
 
-#: builtin/merge.c:57
+#: builtin/merge.c:58
 msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [ОПЦИЯ…] [ПОДАВАНЕ…]"
 
-#: builtin/merge.c:58
+#: builtin/merge.c:59
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:59
+#: builtin/merge.c:60
 msgid "git merge --continue"
 msgstr "git merge --continue"
 
-#: builtin/merge.c:122
+#: builtin/merge.c:123
 msgid "switch `m' requires a value"
 msgstr "опцията „-m“ изисква стойност"
 
-#: builtin/merge.c:145
+#: builtin/merge.c:146
 #, c-format
 msgid "option `%s' requires a value"
 msgstr "опцията „%s“ изисква стойност"
 
-#: builtin/merge.c:198
+#: builtin/merge.c:199
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Няма такава стратегия за сливане: „%s“.\n"
 
-#: builtin/merge.c:199
+#: builtin/merge.c:200
 #, c-format
 msgid "Available strategies are:"
 msgstr "Наличните стратегии са:"
 
-#: builtin/merge.c:204
+#: builtin/merge.c:205
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Допълнителните стратегии са:"
 
-#: builtin/merge.c:255 builtin/pull.c:133
+#: builtin/merge.c:256 builtin/pull.c:133
 msgid "do not show a diffstat at the end of the merge"
 msgstr "без извеждане на статистиката след завършване на сливане"
 
-#: builtin/merge.c:258 builtin/pull.c:136
+#: builtin/merge.c:259 builtin/pull.c:136
 msgid "show a diffstat at the end of the merge"
 msgstr "извеждане на статистиката след завършване на сливане"
 
-#: builtin/merge.c:259 builtin/pull.c:139
+#: builtin/merge.c:260 builtin/pull.c:139
 msgid "(synonym to --stat)"
 msgstr "(псевдоним на „--stat“)"
 
-#: builtin/merge.c:261 builtin/pull.c:142
+#: builtin/merge.c:262 builtin/pull.c:142
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "добавяне (на максимум такъв БРОЙ) записи от съкратения журнал в съобщението "
 "за подаване"
 
-#: builtin/merge.c:264 builtin/pull.c:148
+#: builtin/merge.c:265 builtin/pull.c:148
 msgid "create a single commit instead of doing a merge"
 msgstr "създаване на едно подаване вместо извършване на сливане"
 
-#: builtin/merge.c:266 builtin/pull.c:151
+#: builtin/merge.c:267 builtin/pull.c:151
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "извършване на подаване при успешно сливане (стандартно действие)"
 
-#: builtin/merge.c:268 builtin/pull.c:154
+#: builtin/merge.c:269 builtin/pull.c:154
 msgid "edit message before committing"
 msgstr "редактиране на съобщението преди подаване"
 
-#: builtin/merge.c:270
+#: builtin/merge.c:271
 msgid "allow fast-forward (default)"
 msgstr "позволяване на превъртане (стандартно действие)"
 
-#: builtin/merge.c:272 builtin/pull.c:161
+#: builtin/merge.c:273 builtin/pull.c:161
 msgid "abort if fast-forward is not possible"
 msgstr "преустановяване, ако превъртането е невъзможно"
 
-#: builtin/merge.c:276 builtin/pull.c:164
+#: builtin/merge.c:277 builtin/pull.c:164
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "проверка, че указаното подаване е с правилен подпис на GPG"
 
-#: builtin/merge.c:277 builtin/notes.c:787 builtin/pull.c:168
-#: builtin/rebase.c:539 builtin/rebase.c:1412 builtin/revert.c:114
+#: builtin/merge.c:278 builtin/notes.c:787 builtin/pull.c:168
+#: builtin/rebase.c:541 builtin/rebase.c:1418 builtin/revert.c:114
 msgid "strategy"
 msgstr "СТРАТЕГИЯ"
 
-#: builtin/merge.c:278 builtin/pull.c:169
+#: builtin/merge.c:279 builtin/pull.c:169
 msgid "merge strategy to use"
 msgstr "СТРАТЕГИЯ за сливане, която да се ползва"
 
-#: builtin/merge.c:279 builtin/pull.c:172
+#: builtin/merge.c:280 builtin/pull.c:172
 msgid "option=value"
 msgstr "ОПЦИЯ=СТОЙНОСТ"
 
-#: builtin/merge.c:280 builtin/pull.c:173
+#: builtin/merge.c:281 builtin/pull.c:173
 msgid "option for selected merge strategy"
 msgstr "ОПЦИЯ за избраната стратегия за сливане"
 
-#: builtin/merge.c:282
+#: builtin/merge.c:283
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr "СЪОБЩЕНИЕ при подаването със сливане (при същински сливания)"
 
-#: builtin/merge.c:289
+#: builtin/merge.c:290
 msgid "abort the current in-progress merge"
 msgstr "преустановяване на текущото сливане"
 
-#: builtin/merge.c:291
+#: builtin/merge.c:292
 msgid "--abort but leave index and working tree alone"
 msgstr "преустановяване без промяна на индекса и работното дърво"
 
-#: builtin/merge.c:293
+#: builtin/merge.c:294
 msgid "continue the current in-progress merge"
 msgstr "продължаване на текущото сливане"
 
-#: builtin/merge.c:295 builtin/pull.c:180
+#: builtin/merge.c:296 builtin/pull.c:180
 msgid "allow merging unrelated histories"
 msgstr "позволяване на сливане на независими истории"
 
-#: builtin/merge.c:302
+#: builtin/merge.c:303
 msgid "bypass pre-merge-commit and commit-msg hooks"
 msgstr ""
 "без изпълнение на куките преди подаване и сливане и при промяна на "
 "съобщението за подаване (pre-merge-commit и commit-msg)"
 
-#: builtin/merge.c:319
+#: builtin/merge.c:320
 msgid "could not run stash."
 msgstr "не може да се извърши скатаване"
 
-#: builtin/merge.c:324
+#: builtin/merge.c:325
 msgid "stash failed"
 msgstr "неуспешно скатаване"
 
-#: builtin/merge.c:329
+#: builtin/merge.c:330
 #, c-format
 msgid "not a valid object: %s"
 msgstr "неправилен обект: „%s“"
 
-#: builtin/merge.c:351 builtin/merge.c:368
+#: builtin/merge.c:352 builtin/merge.c:369
 msgid "read-tree failed"
 msgstr "неуспешно прочитане на обект-дърво"
 
-#: builtin/merge.c:398
+#: builtin/merge.c:399
 msgid " (nothing to squash)"
 msgstr " (няма какво да се вкара)"
 
-#: builtin/merge.c:409
+#: builtin/merge.c:410
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Вкарано подаване — указателят „HEAD“ няма да бъде обновен\n"
 
-#: builtin/merge.c:459
+#: builtin/merge.c:460
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr ""
 "Липсва съобщение при подаване — указателят „HEAD“ няма да бъде обновен\n"
 
-#: builtin/merge.c:510
+#: builtin/merge.c:511
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "„%s“ не сочи към подаване"
 
-#: builtin/merge.c:597
+#: builtin/merge.c:598
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Неправилен низ за настройката „branch.%s.mergeoptions“: „%s“"
 
-#: builtin/merge.c:723
+#: builtin/merge.c:724
 msgid "Not handling anything other than two heads merge."
 msgstr "Поддържа се само сливане на точно две истории."
 
-#: builtin/merge.c:736
+#: builtin/merge.c:737
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Непозната опция за рекурсивното сливане „merge-recursive“: „-X%s“"
 
-#: builtin/merge.c:755 t/helper/test-fast-rebase.c:209
+#: builtin/merge.c:756 t/helper/test-fast-rebase.c:209
 #, c-format
 msgid "unable to write %s"
 msgstr "„%s“ не може да бъде записан"
 
-#: builtin/merge.c:807
+#: builtin/merge.c:808
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "От „%s“ не може да се чете"
 
-#: builtin/merge.c:816
+#: builtin/merge.c:817
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "Сливането няма да бъде подадено.  За завършването му и подаването му "
 "използвайте командата „git commit“.\n"
 
-#: builtin/merge.c:822
+#: builtin/merge.c:823
 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"
@@ -17672,11 +18013,11 @@
 "В съобщението при подаване добавете информация за причината за\n"
 "сливането, особено ако сливате обновен отдалечен клон в тематичен клон.\n"
 
-#: builtin/merge.c:827
+#: builtin/merge.c:828
 msgid "An empty message aborts the commit.\n"
 msgstr "Празно съобщение предотвратява подаването.\n"
 
-#: builtin/merge.c:830
+#: builtin/merge.c:831
 #, c-format
 msgid ""
 "Lines starting with '%c' will be ignored, and an empty message aborts\n"
@@ -17685,76 +18026,76 @@
 "Редовете, които започват с „%c“, ще бъдат пропуснати, а празно\n"
 "съобщение преустановява подаването.\n"
 
-#: builtin/merge.c:883
+#: builtin/merge.c:884
 msgid "Empty commit message."
 msgstr "Празно съобщение при подаване."
 
-#: builtin/merge.c:898
+#: builtin/merge.c:899
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Първият етап на сливането завърши.\n"
 
-#: builtin/merge.c:959
+#: builtin/merge.c:960
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "Неуспешно автоматично сливане — коригирайте конфликтите и подайте "
 "резултата.\n"
 
-#: builtin/merge.c:998
+#: builtin/merge.c:999
 msgid "No current branch."
 msgstr "Няма текущ клон."
 
-#: builtin/merge.c:1000
+#: builtin/merge.c:1001
 msgid "No remote for the current branch."
 msgstr "Текущият клон не следи никой."
 
-#: builtin/merge.c:1002
+#: builtin/merge.c:1003
 msgid "No default upstream defined for the current branch."
 msgstr "Текущият клон не следи никой клон."
 
-#: builtin/merge.c:1007
+#: builtin/merge.c:1008
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Никой клон не следи клона „%s“ от хранилището „%s“"
 
-#: builtin/merge.c:1064
+#: builtin/merge.c:1065
 #, c-format
 msgid "Bad value '%s' in environment '%s'"
 msgstr "Неправилна стойност „%s“ в средата „%s“"
 
-#: builtin/merge.c:1167
+#: builtin/merge.c:1168
 #, c-format
 msgid "not something we can merge in %s: %s"
 msgstr "не може да се слее в „%s“: %s"
 
-#: builtin/merge.c:1201
+#: builtin/merge.c:1202
 msgid "not something we can merge"
 msgstr "не може да се слее"
 
-#: builtin/merge.c:1311
+#: builtin/merge.c:1312
 msgid "--abort expects no arguments"
 msgstr "опцията „--abort“ не приема аргументи"
 
-#: builtin/merge.c:1315
+#: builtin/merge.c:1316
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr ""
 "Не може да преустановите сливане, защото в момента не се извършва такова "
 "(липсва указател „MERGE_HEAD“)."
 
-#: builtin/merge.c:1333
+#: builtin/merge.c:1334
 msgid "--quit expects no arguments"
 msgstr "опцията „--quit“ не приема аргументи"
 
-#: builtin/merge.c:1346
+#: builtin/merge.c:1347
 msgid "--continue expects no arguments"
 msgstr "опцията „--continue“ не приема аргументи"
 
-#: builtin/merge.c:1350
+#: builtin/merge.c:1351
 msgid "There is no merge in progress (MERGE_HEAD missing)."
 msgstr "В момента не се извършва сливане (липсва указател „MERGE_HEAD“)."
 
-#: builtin/merge.c:1366
+#: builtin/merge.c:1367
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -17762,7 +18103,7 @@
 "Не сте завършили сливане.  (Указателят „MERGE_HEAD“ съществува).\n"
 "Подайте промените си, преди да започнете ново сливане."
 
-#: builtin/merge.c:1373
+#: builtin/merge.c:1374
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -17770,109 +18111,150 @@
 "Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
 "съществува).  Подайте промените си, преди да започнете ново сливане."
 
-#: builtin/merge.c:1376
+#: builtin/merge.c:1377
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr ""
 "Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
 "съществува)."
 
-#: builtin/merge.c:1390
+#: builtin/merge.c:1391
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Опцията „--squash“ е несъвместима с „--no-ff“."
 
-#: builtin/merge.c:1392
+#: builtin/merge.c:1393
 msgid "You cannot combine --squash with --commit."
 msgstr "Опцията „--squash“ е несъвместима с „--commit“."
 
-#: builtin/merge.c:1408
+#: builtin/merge.c:1409
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 "Не е указано подаване и настройката „merge.defaultToUpstream“ не е зададена."
 
-#: builtin/merge.c:1425
+#: builtin/merge.c:1426
 msgid "Squash commit into empty head not supported yet"
 msgstr "Вкарване на подаване във връх без история все още не се поддържа"
 
-#: builtin/merge.c:1427
+#: builtin/merge.c:1428
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 "Понеже върхът е без история, всички сливания са превъртания, не може да се "
 "извърши същинско сливане изисквано от опцията „--no-ff“"
 
-#: builtin/merge.c:1432
+#: builtin/merge.c:1433
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "„%s“ — не е нещо, което може да се слее"
 
-#: builtin/merge.c:1434
+#: builtin/merge.c:1435
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Можете да слеете точно едно подаване във връх без история"
 
-#: builtin/merge.c:1515
+#: builtin/merge.c:1516
 msgid "refusing to merge unrelated histories"
 msgstr "независими истории не може да се слеят"
 
-#: builtin/merge.c:1524
+#: builtin/merge.c:1525
 msgid "Already up to date."
 msgstr "Вече е обновено."
 
-#: builtin/merge.c:1534
+#: builtin/merge.c:1535
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Обновяване „%s..%s“\n"
 
-#: builtin/merge.c:1580
+#: builtin/merge.c:1581
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Проба със сливане в рамките на индекса…\n"
 
-#: builtin/merge.c:1587
+#: builtin/merge.c:1588
 #, c-format
 msgid "Nope.\n"
 msgstr "Неуспешно сливане.\n"
 
-#: builtin/merge.c:1612
+#: builtin/merge.c:1613
 msgid "Already up to date. Yeeah!"
 msgstr "Вече е обновено!"
 
-#: builtin/merge.c:1618
+#: builtin/merge.c:1619
 msgid "Not possible to fast-forward, aborting."
 msgstr "Не може да се извърши превъртане, преустановяване на действието."
 
-#: builtin/merge.c:1646 builtin/merge.c:1711
+#: builtin/merge.c:1647 builtin/merge.c:1712
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Привеждане на дървото към първоначалното…\n"
 
-#: builtin/merge.c:1650
+#: builtin/merge.c:1651
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Пробване със стратегията за сливане „%s“…\n"
 
-#: builtin/merge.c:1702
+#: builtin/merge.c:1703
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Никоя стратегия за сливане не може да извърши сливането.\n"
 
-#: builtin/merge.c:1704
+#: builtin/merge.c:1705
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Неуспешно сливане със стратегия „%s“.\n"
 
-#: builtin/merge.c:1713
+#: builtin/merge.c:1714
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr ""
 "Ползва се стратегията „%s“, която ще подготви дървото за коригиране на "
 "ръка.\n"
 
-#: builtin/merge.c:1727
+#: builtin/merge.c:1728
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
 "Автоматичното сливане завърши успешно.  Самото подаване не е извършено, "
 "защото бе зададена опцията „--no-commit“.\n"
 
+#: builtin/mktag.c:10
+msgid "git mktag"
+msgstr "git mktag"
+
+#: builtin/mktag.c:30
+#, c-format
+msgid "warning: tag input does not pass fsck: %s"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: аргументът-етикет не минава проверка с „fsck“: %s"
+
+#: builtin/mktag.c:41
+#, c-format
+msgid "error: tag input does not pass fsck: %s"
+msgstr "ГРЕШКА: аргументът-етикет не минава проверка с „fsck“: %s"
+
+#: builtin/mktag.c:44
+#, c-format
+msgid "%d (FSCK_IGNORE?) should never trigger this callback"
+msgstr "%d (FSCK_IGNORE?) никога не трябва да задейства тази функция"
+
+#: builtin/mktag.c:59
+#, c-format
+msgid "could not read tagged object '%s'"
+msgstr "обектът с етикет не може да бъде прочетен: %s"
+
+#: builtin/mktag.c:62
+#, c-format
+msgid "object '%s' tagged as '%s', but is a '%s' type"
+msgstr "обектът „%s“ е с етикет за %s, но е %s"
+
+#: builtin/mktag.c:99
+msgid "tag on stdin did not pass our strict fsck check"
+msgstr "етикетът на стандартния вход не преминава строгата проверка с „fsck“"
+
+#: builtin/mktag.c:102
+msgid "tag on stdin did not refer to a valid object"
+msgstr "етикетът на стандартния вход не сочи към правилен обект"
+
+#: builtin/mktag.c:105 builtin/tag.c:232
+msgid "unable to write tag file"
+msgstr "файлът за етикета не може да бъде запазен"
+
 #: builtin/mktree.c:66
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -17911,7 +18293,10 @@
 "при препакетиране пакетните файлове, които са с по-малък от този размер, да "
 "се обединяват в пакети с по-голям от този размер"
 
-#: builtin/multi-pack-index.c:50 builtin/prune-packed.c:25
+#: builtin/multi-pack-index.c:50 builtin/notes.c:376 builtin/notes.c:431
+#: builtin/notes.c:509 builtin/notes.c:521 builtin/notes.c:598
+#: builtin/notes.c:665 builtin/notes.c:815 builtin/notes.c:963
+#: builtin/notes.c:985 builtin/prune-packed.c:25 builtin/tag.c:575
 msgid "too many arguments"
 msgstr "прекалено много аргументи"
 
@@ -18017,7 +18402,7 @@
 msgid "Renaming %s to %s\n"
 msgstr "Преименуване на „%s“ на „%s“\n"
 
-#: builtin/mv.c:280 builtin/remote.c:785 builtin/repack.c:484
+#: builtin/mv.c:280 builtin/remote.c:785 builtin/repack.c:483
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "неуспешно преименуване на „%s“"
@@ -18211,7 +18596,7 @@
 msgid "the note contents have been left in %s"
 msgstr "съдържанието на бележката е във файла „%s“"
 
-#: builtin/notes.c:242 builtin/tag.c:533
+#: builtin/notes.c:242 builtin/tag.c:565
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "файлът „%s“ не може да бъде отворен или прочетен"
@@ -18254,12 +18639,6 @@
 "няма да се извърши „%s“ върху бележките в „%s“, защото са извън „refs/"
 "notes/“."
 
-#: builtin/notes.c:376 builtin/notes.c:431 builtin/notes.c:509
-#: builtin/notes.c:521 builtin/notes.c:598 builtin/notes.c:665
-#: builtin/notes.c:815 builtin/notes.c:963 builtin/notes.c:985
-msgid "too many parameters"
-msgstr "прекалено много параметри"
-
 #: builtin/notes.c:389 builtin/notes.c:678
 #, c-format
 msgid "no note found for object %s."
@@ -18319,8 +18698,8 @@
 "опцията „--stdin“)"
 
 #: builtin/notes.c:517
-msgid "too few parameters"
-msgstr "прекалено малко параметри"
+msgid "too few arguments"
+msgstr "прекалено малко аргументи"
 
 #: builtin/notes.c:538
 #, c-format
@@ -18452,7 +18831,7 @@
 "резултата с „git notes merge --commit“ или преустановете сливането с "
 "командата „git notes merge --abort“.\n"
 
-#: builtin/notes.c:897 builtin/tag.c:546
+#: builtin/notes.c:897 builtin/tag.c:578
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Не може да се открие към какво сочи „%s“."
@@ -18470,7 +18849,7 @@
 msgid "read object names from the standard input"
 msgstr "изчитане на имената на обектите от стандартния вход"
 
-#: builtin/notes.c:954 builtin/prune.c:132 builtin/worktree.c:220
+#: builtin/notes.c:954 builtin/prune.c:132 builtin/worktree.c:148
 msgid "do not remove, show only"
 msgstr "само извеждане без действително окастряне"
 
@@ -18486,7 +18865,7 @@
 msgid "use notes from <notes-ref>"
 msgstr "да се използва бележката сочена от този УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
 
-#: builtin/notes.c:1034 builtin/stash.c:1604
+#: builtin/notes.c:1034 builtin/stash.c:1671
 #, c-format
 msgid "unknown subcommand: %s"
 msgstr "непозната подкоманда: %s"
@@ -18504,107 +18883,121 @@
 "git pack-objects [ОПЦИЯ…] ПРЕФИКС_НА_ИМЕТО [< СПИСЪК_С_УКАЗАТЕЛИ | < "
 "СПИСЪК_С_ОБЕКТИ]"
 
-#: builtin/pack-objects.c:443
+#: builtin/pack-objects.c:440
+#, c-format
+msgid ""
+"write_reuse_object: could not locate %s, expected at offset %<PRIuMAX> in "
+"pack %s"
+msgstr ""
+"write_reuse_object: „%s“ не може да се открие, а се очакваше при отместване "
+"%<PRIuMAX> в пакетния файл „%s“"
+
+#: builtin/pack-objects.c:448
 #, c-format
 msgid "bad packed object CRC for %s"
 msgstr "лоша контролна сума за пакетирания обект „%s“"
 
-#: builtin/pack-objects.c:454
+#: builtin/pack-objects.c:459
 #, c-format
 msgid "corrupt packed object for %s"
 msgstr "пакетиран обект с грешки за „%s“"
 
-#: builtin/pack-objects.c:585
+#: builtin/pack-objects.c:590
 #, c-format
 msgid "recursive delta detected for object %s"
 msgstr "рекурсивна разлика за обект „%s“"
 
-#: builtin/pack-objects.c:796
+#: builtin/pack-objects.c:801
 #, c-format
 msgid "ordered %u objects, expected %<PRIu32>"
 msgstr "подредени бяха %u обекта, а се очакваха %<PRIu32>"
 
-#: builtin/pack-objects.c:1004
+#: builtin/pack-objects.c:896
+#, c-format
+msgid "expected object at offset %<PRIuMAX> in pack %s"
+msgstr "очаква се обект при отместване %<PRIuMAX> в пакетния файл „%s“"
+
+#: builtin/pack-objects.c:1015
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr ""
 "изключване на записването на битовата маска, пакетите са разделени поради "
 "стойността на „pack.packSizeLimit“"
 
-#: builtin/pack-objects.c:1017
+#: builtin/pack-objects.c:1028
 msgid "Writing objects"
 msgstr "Записване на обектите"
 
-#: builtin/pack-objects.c:1078 builtin/update-index.c:90
+#: builtin/pack-objects.c:1089 builtin/update-index.c:90
 #, c-format
 msgid "failed to stat %s"
 msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
 
-#: builtin/pack-objects.c:1131
+#: builtin/pack-objects.c:1141
 #, c-format
 msgid "wrote %<PRIu32> objects while expecting %<PRIu32>"
 msgstr "бяха записани %<PRIu32> обекти, а се очакваха %<PRIu32>"
 
-#: builtin/pack-objects.c:1348
+#: builtin/pack-objects.c:1358
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 "изключване на записването на битовата маска, защото някои обекти няма да се "
 "пакетират"
 
-#: builtin/pack-objects.c:1796
+#: builtin/pack-objects.c:1806
 #, c-format
 msgid "delta base offset overflow in pack for %s"
 msgstr "прекалено далечно начало на отместването за обектите-разлика за „%s“"
 
-#: builtin/pack-objects.c:1805
+#: builtin/pack-objects.c:1815
 #, c-format
 msgid "delta base offset out of bound for %s"
 msgstr "недостижимо начало на отместването за обектите-разлика за „%s“"
 
-#: builtin/pack-objects.c:2086
+#: builtin/pack-objects.c:2096
 msgid "Counting objects"
 msgstr "Преброяване на обектите"
 
-#: builtin/pack-objects.c:2231
+#: builtin/pack-objects.c:2241
 #, c-format
 msgid "unable to parse object header of %s"
 msgstr "заглавната част на „%s“ не може да бъде анализирана"
 
-#: builtin/pack-objects.c:2301 builtin/pack-objects.c:2317
-#: builtin/pack-objects.c:2327
+#: builtin/pack-objects.c:2311 builtin/pack-objects.c:2327
+#: builtin/pack-objects.c:2337
 #, c-format
 msgid "object %s cannot be read"
 msgstr "обектът „%s“ не може да се прочете"
 
-#: builtin/pack-objects.c:2304 builtin/pack-objects.c:2331
+#: builtin/pack-objects.c:2314 builtin/pack-objects.c:2341
 #, c-format
 msgid "object %s inconsistent object length (%<PRIuMAX> vs %<PRIuMAX>)"
 msgstr "обектът „%s“ е с неправилна дължина (%<PRIuMAX>, а не %<PRIuMAX>)"
 
-#: builtin/pack-objects.c:2341
+#: builtin/pack-objects.c:2351
 msgid "suboptimal pack - out of memory"
 msgstr "неоптимизиран пакет — паметта свърши"
 
-#: builtin/pack-objects.c:2656
+#: builtin/pack-objects.c:2666
 #, c-format
 msgid "Delta compression using up to %d threads"
 msgstr "Делта компресията ще използва до %d нишки"
 
-#: builtin/pack-objects.c:2795
+#: builtin/pack-objects.c:2805
 #, c-format
 msgid "unable to pack objects reachable from tag %s"
 msgstr ""
 "обектите, които могат да бъдат достигнати от етикета „%s“, не може да бъдат "
 "пакетирани"
 
-#: builtin/pack-objects.c:2883
+#: builtin/pack-objects.c:2891
 msgid "Compressing objects"
 msgstr "Компресиране на обектите"
 
-#: builtin/pack-objects.c:2889
+#: builtin/pack-objects.c:2897
 msgid "inconsistency with delta count"
 msgstr "неправилен брой разлики"
 
-#: builtin/pack-objects.c:2961
+#: builtin/pack-objects.c:2976
 #, c-format
 msgid ""
 "value of uploadpack.blobpackfileuri must be of the form '<object-hash> <pack-"
@@ -18613,7 +19006,7 @@
 "стойността на „uploadpack.blobpackfileuri“ трябва да е във формат "
 "„СУМА_НА_ОБЕКТ СУМА_НА_ПАКЕТ АДРЕС“ (получена е „%s“)"
 
-#: builtin/pack-objects.c:2964
+#: builtin/pack-objects.c:2979
 #, c-format
 msgid ""
 "object already configured in another uploadpack.blobpackfileuri (got '%s')"
@@ -18621,7 +19014,7 @@
 "вече има настройка за обекта в друг ред „uploadpack."
 "blobpackfileuri“ (получена е „%s“)"
 
-#: builtin/pack-objects.c:2993
+#: builtin/pack-objects.c:3008
 #, c-format
 msgid ""
 "expected edge object ID, got garbage:\n"
@@ -18630,7 +19023,7 @@
 "очаква се идентификатор на краен обект, а не:\n"
 " %s"
 
-#: builtin/pack-objects.c:2999
+#: builtin/pack-objects.c:3014
 #, c-format
 msgid ""
 "expected object ID, got garbage:\n"
@@ -18639,253 +19032,253 @@
 "очаква се идентификатор на обект, а не:\n"
 " %s"
 
-#: builtin/pack-objects.c:3097
+#: builtin/pack-objects.c:3112
 msgid "invalid value for --missing"
 msgstr "неправилна стойност за „--missing“"
 
-#: builtin/pack-objects.c:3156 builtin/pack-objects.c:3264
+#: builtin/pack-objects.c:3171 builtin/pack-objects.c:3279
 msgid "cannot open pack index"
 msgstr "индексът на пакетния файл не може да бъде отворен"
 
-#: builtin/pack-objects.c:3187
+#: builtin/pack-objects.c:3202
 #, c-format
 msgid "loose object at %s could not be examined"
 msgstr "непакетираният обект в „%s“ не може да бъде анализиран"
 
-#: builtin/pack-objects.c:3272
+#: builtin/pack-objects.c:3287
 msgid "unable to force loose object"
 msgstr "оставането на обекта непакетиран не може да бъде наложено"
 
-#: builtin/pack-objects.c:3365
+#: builtin/pack-objects.c:3380
 #, c-format
 msgid "not a rev '%s'"
 msgstr "„%s“ не е версия"
 
-#: builtin/pack-objects.c:3368
+#: builtin/pack-objects.c:3383
 #, c-format
 msgid "bad revision '%s'"
 msgstr "неправилна версия „%s“"
 
-#: builtin/pack-objects.c:3393
+#: builtin/pack-objects.c:3408
 msgid "unable to add recent objects"
 msgstr "скорошните обекти не могат да бъдат добавени"
 
-#: builtin/pack-objects.c:3446
+#: builtin/pack-objects.c:3461
 #, c-format
 msgid "unsupported index version %s"
 msgstr "неподдържана версия на индекса „%s“"
 
-#: builtin/pack-objects.c:3450
+#: builtin/pack-objects.c:3465
 #, c-format
 msgid "bad index version '%s'"
 msgstr "неправилна версия на индекса „%s“"
 
-#: builtin/pack-objects.c:3488
+#: builtin/pack-objects.c:3503
 msgid "<version>[,<offset>]"
 msgstr "ВЕРСИЯ[,ОТМЕСТВАНЕ]"
 
-#: builtin/pack-objects.c:3489
+#: builtin/pack-objects.c:3504
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 "запазване на индекса на пакетните файлове във форма̀та с указаната версия"
 
-#: builtin/pack-objects.c:3492
+#: builtin/pack-objects.c:3507
 msgid "maximum size of each output pack file"
 msgstr "максимален размер на всеки пакетен файл"
 
-#: builtin/pack-objects.c:3494
+#: builtin/pack-objects.c:3509
 msgid "ignore borrowed objects from alternate object store"
 msgstr "игнориране на обектите заети от други хранилища на обекти"
 
-#: builtin/pack-objects.c:3496
+#: builtin/pack-objects.c:3511
 msgid "ignore packed objects"
 msgstr "игнориране на пакетираните обекти"
 
-#: builtin/pack-objects.c:3498
+#: builtin/pack-objects.c:3513
 msgid "limit pack window by objects"
 msgstr "ограничаване на прозореца за пакетиране по брой обекти"
 
-#: builtin/pack-objects.c:3500
+#: builtin/pack-objects.c:3515
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 "ограничаване на прозореца за пакетиране и по памет освен по брой обекти"
 
-#: builtin/pack-objects.c:3502
+#: builtin/pack-objects.c:3517
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 "максимална дължина на веригата от разлики, която е позволена в пакетния файл"
 
-#: builtin/pack-objects.c:3504
+#: builtin/pack-objects.c:3519
 msgid "reuse existing deltas"
 msgstr "преизползване на съществуващите разлики"
 
-#: builtin/pack-objects.c:3506
+#: builtin/pack-objects.c:3521
 msgid "reuse existing objects"
 msgstr "преизползване на съществуващите обекти"
 
-#: builtin/pack-objects.c:3508
+#: builtin/pack-objects.c:3523
 msgid "use OFS_DELTA objects"
 msgstr "използване на обекти „OFS_DELTA“"
 
-#: builtin/pack-objects.c:3510
+#: builtin/pack-objects.c:3525
 msgid "use threads when searching for best delta matches"
 msgstr ""
 "стартиране на нишки за претърсване на най-добрите съвпадения на разликите"
 
-#: builtin/pack-objects.c:3512
+#: builtin/pack-objects.c:3527
 msgid "do not create an empty pack output"
 msgstr "без създаване на празен пакетен файл"
 
-#: builtin/pack-objects.c:3514
+#: builtin/pack-objects.c:3529
 msgid "read revision arguments from standard input"
 msgstr "изчитане на версиите от стандартния вход"
 
-#: builtin/pack-objects.c:3516
+#: builtin/pack-objects.c:3531
 msgid "limit the objects to those that are not yet packed"
 msgstr "ограничаване до все още непакетираните обекти"
 
-#: builtin/pack-objects.c:3519
+#: builtin/pack-objects.c:3534
 msgid "include objects reachable from any reference"
 msgstr ""
 "включване на всички обекти, които могат да се достигнат от произволен "
 "указател"
 
-#: builtin/pack-objects.c:3522
+#: builtin/pack-objects.c:3537
 msgid "include objects referred by reflog entries"
 msgstr "включване и на обектите сочени от записите в журнала на указателите"
 
-#: builtin/pack-objects.c:3525
+#: builtin/pack-objects.c:3540
 msgid "include objects referred to by the index"
 msgstr "включване и на обектите сочени от индекса"
 
-#: builtin/pack-objects.c:3528
+#: builtin/pack-objects.c:3543
 msgid "output pack to stdout"
 msgstr "извеждане на пакета на стандартния изход"
 
-#: builtin/pack-objects.c:3530
+#: builtin/pack-objects.c:3545
 msgid "include tag objects that refer to objects to be packed"
 msgstr ""
 "включване и на обектите-етикети, които сочат към обектите, които ще бъдат "
 "пакетирани"
 
-#: builtin/pack-objects.c:3532
+#: builtin/pack-objects.c:3547
 msgid "keep unreachable objects"
 msgstr "запазване на недостижимите обекти"
 
-#: builtin/pack-objects.c:3534
+#: builtin/pack-objects.c:3549
 msgid "pack loose unreachable objects"
 msgstr "пакетиране и на недостижимите обекти"
 
-#: builtin/pack-objects.c:3536
+#: builtin/pack-objects.c:3551
 msgid "unpack unreachable objects newer than <time>"
 msgstr "разпакетиране на недостижимите обекти, които са по-нови от това ВРЕМЕ"
 
-#: builtin/pack-objects.c:3539
+#: builtin/pack-objects.c:3554
 msgid "use the sparse reachability algorithm"
 msgstr "използване на алгоритъм за частична достижимост"
 
-#: builtin/pack-objects.c:3541
+#: builtin/pack-objects.c:3556
 msgid "create thin packs"
 msgstr "създаване на съкратени пакети"
 
-#: builtin/pack-objects.c:3543
+#: builtin/pack-objects.c:3558
 msgid "create packs suitable for shallow fetches"
 msgstr "пакетиране подходящо за плитко доставяне"
 
-#: builtin/pack-objects.c:3545
+#: builtin/pack-objects.c:3560
 msgid "ignore packs that have companion .keep file"
 msgstr "игнориране на пакетите, които са придружени от файл „.keep“"
 
-#: builtin/pack-objects.c:3547
+#: builtin/pack-objects.c:3562
 msgid "ignore this pack"
 msgstr "пропускане на този пакет"
 
-#: builtin/pack-objects.c:3549
+#: builtin/pack-objects.c:3564
 msgid "pack compression level"
 msgstr "ниво на компресиране при пакетиране"
 
-#: builtin/pack-objects.c:3551
+#: builtin/pack-objects.c:3566
 msgid "do not hide commits by grafts"
 msgstr ""
 "извеждане на всички родители — дори и тези, които нормално са скрити при "
 "присажданията"
 
-#: builtin/pack-objects.c:3553
+#: builtin/pack-objects.c:3568
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 "използване на съществуващи индекси на база битови маски за ускоряване на "
 "преброяването на обектите"
 
-#: builtin/pack-objects.c:3555
+#: builtin/pack-objects.c:3570
 msgid "write a bitmap index together with the pack index"
 msgstr ""
 "запазване и на индекс на база побитова маска, заедно с индекса за пакета"
 
-#: builtin/pack-objects.c:3559
+#: builtin/pack-objects.c:3574
 msgid "write a bitmap index if possible"
 msgstr "записване на индекси на база битови маски при възможност"
 
-#: builtin/pack-objects.c:3563
+#: builtin/pack-objects.c:3578
 msgid "handling for missing objects"
 msgstr "как да се обработват липсващите обекти"
 
-#: builtin/pack-objects.c:3566
+#: builtin/pack-objects.c:3581
 msgid "do not pack objects in promisor packfiles"
 msgstr "без пакетиране на обекти в гарантиращи пакети"
 
-#: builtin/pack-objects.c:3568
+#: builtin/pack-objects.c:3583
 msgid "respect islands during delta compression"
 msgstr "без промяна на групите при делта компресия"
 
-#: builtin/pack-objects.c:3570
+#: builtin/pack-objects.c:3585
 msgid "protocol"
 msgstr "протокол"
 
-#: builtin/pack-objects.c:3571
+#: builtin/pack-objects.c:3586
 msgid "exclude any configured uploadpack.blobpackfileuri with this protocol"
 msgstr "без ползване на настройки „uploadpack.blobpackfileuri“ с този протокол"
 
-#: builtin/pack-objects.c:3600
+#: builtin/pack-objects.c:3617
 #, c-format
 msgid "delta chain depth %d is too deep, forcing %d"
 msgstr "веригата с разлики е прекалено дълбока — %d, ще се ползва %d"
 
-#: builtin/pack-objects.c:3605
+#: builtin/pack-objects.c:3622
 #, c-format
 msgid "pack.deltaCacheLimit is too high, forcing %d"
 msgstr ""
 "Стойността на настройката „pack.deltaCacheLimit“ е прекалено голяма.  Ще се "
 "ползва %d"
 
-#: builtin/pack-objects.c:3659
+#: builtin/pack-objects.c:3676
 msgid "--max-pack-size cannot be used to build a pack for transfer"
 msgstr ""
 "опцията „--max-pack-size“ не може да се използва за създаване на пакетни "
 "файлове за пренос"
 
-#: builtin/pack-objects.c:3661
+#: builtin/pack-objects.c:3678
 msgid "minimum pack size limit is 1 MiB"
 msgstr "минималният размер на пакетите е 1 MiB"
 
-#: builtin/pack-objects.c:3666
+#: builtin/pack-objects.c:3683
 msgid "--thin cannot be used to build an indexable pack"
 msgstr ""
 "опцията „--thin“не може да се използва за създаване на пакетни файлове с "
 "индекс"
 
-#: builtin/pack-objects.c:3669
+#: builtin/pack-objects.c:3686
 msgid "--keep-unreachable and --unpack-unreachable are incompatible"
 msgstr "опциите „--keep-unreachable“ и „--unpack-unreachable“ са несъвместими"
 
-#: builtin/pack-objects.c:3675
+#: builtin/pack-objects.c:3692
 msgid "cannot use --filter without --stdout"
 msgstr "опцията „-filter“ изисква „-stdout“"
 
-#: builtin/pack-objects.c:3735
+#: builtin/pack-objects.c:3752
 msgid "Enumerating objects"
 msgstr "Изброяване на обектите"
 
-#: builtin/pack-objects.c:3766
+#: builtin/pack-objects.c:3783
 #, c-format
 msgid ""
 "Total %<PRIu32> (delta %<PRIu32>), reused %<PRIu32> (delta %<PRIu32>), pack-"
@@ -18894,6 +19287,20 @@
 "Общо: %<PRIu32> (разлики: %<PRIu32>), преизползвани: %<PRIu32> (разлики: "
 "%<PRIu32>), преизползвани при пакетиране: %<PRIu32>"
 
+#: builtin/pack-redundant.c:601
+msgid ""
+"'git pack-redundant' is nominated for removal.\n"
+"If you still use this command, please add an extra\n"
+"option, '--i-still-use-this', on the command line\n"
+"and let us know you still use it by sending an e-mail\n"
+"to <git@vger.kernel.org>.  Thanks.\n"
+msgstr ""
+"Командата „git pack-redundant“ е остаряла и предстои\n"
+"пълното ѝ премахване.  Ако все още я ползвате, добавете\n"
+"опцията „--i-still-use-this“ на командния ред и молим да\n"
+"ни известите с е-писмо до пощенския списък:\n"
+"<git@vger.kernel.org>.\n"
+
 #: builtin/pack-refs.c:8
 msgid "git pack-refs [<options>]"
 msgstr "git pack-refs [ОПЦИЯ…]"
@@ -18951,7 +19358,7 @@
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "внасяне на промените чрез пребазиране, а не чрез сливане"
 
-#: builtin/pull.c:158 builtin/rebase.c:490 builtin/revert.c:126
+#: builtin/pull.c:158 builtin/rebase.c:492 builtin/revert.c:126
 msgid "allow fast-forward"
 msgstr "позволяване на превъртания"
 
@@ -18976,7 +19383,95 @@
 msgid "Invalid value for pull.ff: %s"
 msgstr "Неправилна стойност за „pull.ff“: „%s“"
 
-#: builtin/pull.c:348
+#: builtin/pull.c:445
+msgid ""
+"There is no candidate for rebasing against among the refs that you just "
+"fetched."
+msgstr ""
+"Между указателите, които току що доставихте, няма подходящ кандидат, върху "
+"който да пребазирате."
+
+#: builtin/pull.c:447
+msgid ""
+"There are no candidates for merging among the refs that you just fetched."
+msgstr ""
+"Между указателите, които току що доставихте, няма подходящ кандидат, който "
+"да слеете."
+
+#: builtin/pull.c:448
+msgid ""
+"Generally this means that you provided a wildcard refspec which had no\n"
+"matches on the remote end."
+msgstr ""
+"Най вероятно сте подали шаблон за указатели, който не е напаснал с нищо в "
+"отдалеченото хранилище."
+
+#: builtin/pull.c:451
+#, c-format
+msgid ""
+"You asked to pull from the remote '%s', but did not specify\n"
+"a branch. Because this is not the default configured remote\n"
+"for your current branch, you must specify a branch on the command line."
+msgstr ""
+"Заявихте издърпване от отдалеченото хранилище „%s“, но не указахте клон.\n"
+"Понеже това не е хранилището по подразбиране на текущия клон, трябва\n"
+"да укажете отдалечения клон на командния ред."
+
+#: builtin/pull.c:456 builtin/rebase.c:1253
+msgid "You are not currently on a branch."
+msgstr "Извън всички клони."
+
+#: builtin/pull.c:458 builtin/pull.c:473
+msgid "Please specify which branch you want to rebase against."
+msgstr "Укажете върху кой клон искате да пребазирате."
+
+#: builtin/pull.c:460 builtin/pull.c:475
+msgid "Please specify which branch you want to merge with."
+msgstr "Укажете кой клон искате да слеете."
+
+#: builtin/pull.c:461 builtin/pull.c:476
+msgid "See git-pull(1) for details."
+msgstr "За повече информация погледнете ръководството „git-pull(1)“"
+
+#: builtin/pull.c:463 builtin/pull.c:469 builtin/pull.c:478
+#: builtin/rebase.c:1259
+msgid "<remote>"
+msgstr "ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ"
+
+#: builtin/pull.c:463 builtin/pull.c:478 builtin/pull.c:483
+msgid "<branch>"
+msgstr "КЛОН"
+
+#: builtin/pull.c:471 builtin/rebase.c:1251
+msgid "There is no tracking information for the current branch."
+msgstr "Текущият клон не следи никой."
+
+#: builtin/pull.c:480
+msgid ""
+"If you wish to set tracking information for this branch you can do so with:"
+msgstr ""
+"Ако искате да зададете информация за следен клон, можете да направите това с "
+"командата:"
+
+#: builtin/pull.c:485
+#, c-format
+msgid ""
+"Your configuration specifies to merge with the ref '%s'\n"
+"from the remote, but no such ref was fetched."
+msgstr ""
+"За сливане е указан отдалеченият указател „%s“,\n"
+"но такъв не е доставен."
+
+#: builtin/pull.c:596
+#, c-format
+msgid "unable to access commit %s"
+msgstr "недостъпно подаване: %s"
+
+#: builtin/pull.c:902
+msgid "ignoring --verify-signatures for rebase"
+msgstr "без „--verify-signatures“ при пребазиране"
+
+#: builtin/pull.c:930
 msgid ""
 "Pulling without specifying how to reconcile divergent branches is\n"
 "discouraged. You can squelch this message by running one of the following\n"
@@ -19005,107 +19500,19 @@
 "използвайте опциите „--rebase“, „--no-rebase“, „--ff-only“.  Те са с\n"
 "приоритет пред настройките.\n"
 
-#: builtin/pull.c:458
-msgid ""
-"There is no candidate for rebasing against among the refs that you just "
-"fetched."
-msgstr ""
-"Между указателите, които току що доставихте, няма подходящ кандидат, върху "
-"който да пребазирате."
-
-#: builtin/pull.c:460
-msgid ""
-"There are no candidates for merging among the refs that you just fetched."
-msgstr ""
-"Между указателите, които току що доставихте, няма подходящ кандидат, който "
-"да слеете."
-
-#: builtin/pull.c:461
-msgid ""
-"Generally this means that you provided a wildcard refspec which had no\n"
-"matches on the remote end."
-msgstr ""
-"Най вероятно сте подали шаблон за указатели, който не е напаснал с нищо в "
-"отдалеченото хранилище."
-
-#: builtin/pull.c:464
-#, c-format
-msgid ""
-"You asked to pull from the remote '%s', but did not specify\n"
-"a branch. Because this is not the default configured remote\n"
-"for your current branch, you must specify a branch on the command line."
-msgstr ""
-"Заявихте издърпване от отдалеченото хранилище „%s“, но не указахте клон.\n"
-"Понеже това не е хранилището по подразбиране на текущия клон, трябва\n"
-"да укажете отдалечения клон на командния ред."
-
-#: builtin/pull.c:469 builtin/rebase.c:1246
-msgid "You are not currently on a branch."
-msgstr "Извън всички клони."
-
-#: builtin/pull.c:471 builtin/pull.c:486
-msgid "Please specify which branch you want to rebase against."
-msgstr "Укажете върху кой клон искате да пребазирате."
-
-#: builtin/pull.c:473 builtin/pull.c:488
-msgid "Please specify which branch you want to merge with."
-msgstr "Укажете кой клон искате да слеете."
-
-#: builtin/pull.c:474 builtin/pull.c:489
-msgid "See git-pull(1) for details."
-msgstr "За повече информация погледнете ръководството „git-pull(1)“"
-
-#: builtin/pull.c:476 builtin/pull.c:482 builtin/pull.c:491
-#: builtin/rebase.c:1252
-msgid "<remote>"
-msgstr "ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ"
-
-#: builtin/pull.c:476 builtin/pull.c:491 builtin/pull.c:496
-msgid "<branch>"
-msgstr "КЛОН"
-
-#: builtin/pull.c:484 builtin/rebase.c:1244
-msgid "There is no tracking information for the current branch."
-msgstr "Текущият клон не следи никой."
-
-#: builtin/pull.c:493
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:"
-msgstr ""
-"Ако искате да зададете информация за следен клон, можете да направите това с "
-"командата:"
-
-#: builtin/pull.c:498
-#, c-format
-msgid ""
-"Your configuration specifies to merge with the ref '%s'\n"
-"from the remote, but no such ref was fetched."
-msgstr ""
-"За сливане е указан отдалеченият указател „%s“,\n"
-"но такъв не е доставен."
-
-#: builtin/pull.c:609
-#, c-format
-msgid "unable to access commit %s"
-msgstr "недостъпно подаване: %s"
-
-#: builtin/pull.c:915
-msgid "ignoring --verify-signatures for rebase"
-msgstr "без „--verify-signatures“ при пребазиране"
-
-#: builtin/pull.c:972
+#: builtin/pull.c:991
 msgid "Updating an unborn branch with changes added to the index."
 msgstr "Обновяване на все още несъздаден клон с промените от индекса"
 
-#: builtin/pull.c:976
+#: builtin/pull.c:995
 msgid "pull with rebase"
 msgstr "издърпване с пребазиране"
 
-#: builtin/pull.c:977
+#: builtin/pull.c:996
 msgid "please commit or stash them."
 msgstr "трябва да подадете или скатаете промените."
 
-#: builtin/pull.c:1002
+#: builtin/pull.c:1021
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -19115,7 +19522,7 @@
 "доставянето обнови върха на текущия клон.  Работното\n"
 "ви копие бе превъртяно от подаване „%s“."
 
-#: builtin/pull.c:1008
+#: builtin/pull.c:1027
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -19132,15 +19539,15 @@
 "    git reset --hard\n"
 "за връщане към нормално състояние."
 
-#: builtin/pull.c:1023
+#: builtin/pull.c:1042
 msgid "Cannot merge multiple branches into empty head."
 msgstr "Не може да сливате множество клони в празен върхов указател."
 
-#: builtin/pull.c:1027
+#: builtin/pull.c:1046
 msgid "Cannot rebase onto multiple branches."
 msgstr "Не може да пребазирате върху повече от един клон."
 
-#: builtin/pull.c:1041
+#: builtin/pull.c:1067
 msgid "cannot rebase with locally recorded submodule modifications"
 msgstr ""
 "пребазирането е невъзможно заради локално записаните промени по подмодулите"
@@ -19466,44 +19873,52 @@
 msgid "push options must not have new line characters"
 msgstr "опциите за изтласкване не трябва да съдържат знак за нов ред"
 
-#: builtin/range-diff.c:8
+#: builtin/range-diff.c:9
 msgid "git range-diff [<options>] <old-base>..<old-tip> <new-base>..<new-tip>"
 msgstr "git range-diff [ОПЦИЯ…] СТАРА_БАЗА..СТАР_ВРЪХ НОВА_БАЗА..НОВ_ВРЪХ"
 
-#: builtin/range-diff.c:9
+#: builtin/range-diff.c:10
 msgid "git range-diff [<options>] <old-tip>...<new-tip>"
 msgstr "git range-diff [ОПЦИЯ…] СТАР_ВРЪХ...НОВ_ВРЪХ"
 
-#: builtin/range-diff.c:10
+#: builtin/range-diff.c:11
 msgid "git range-diff [<options>] <base> <old-tip> <new-tip>"
 msgstr "git range-diff [ОПЦИЯ…] БАЗА СТАР_ВРЪХ НОВ_ВРЪХ"
 
-#: builtin/range-diff.c:22
+#: builtin/range-diff.c:28
 msgid "Percentage by which creation is weighted"
 msgstr "Процент за оценка на създаването"
 
-#: builtin/range-diff.c:24
+#: builtin/range-diff.c:30
 msgid "use simple diff colors"
 msgstr "използване на прости цветове за разликите"
 
-#: builtin/range-diff.c:26
+#: builtin/range-diff.c:32
 msgid "notes"
 msgstr "бележки"
 
-#: builtin/range-diff.c:26
+#: builtin/range-diff.c:32
 msgid "passed to 'git log'"
 msgstr "подава се на командата „git log“"
 
-#: builtin/range-diff.c:50 builtin/range-diff.c:54
-#, c-format
-msgid "no .. in range: '%s'"
-msgstr "„..“ липсва в диапазона „%s“"
+#: builtin/range-diff.c:35
+msgid "only emit output related to the first range"
+msgstr "извеждане само на информацията за първия диапазон"
 
-#: builtin/range-diff.c:64
+#: builtin/range-diff.c:37
+msgid "only emit output related to the second range"
+msgstr "извеждане само на информацията за втория диапазон"
+
+#: builtin/range-diff.c:60 builtin/range-diff.c:64
+#, c-format
+msgid "not a commit range: '%s'"
+msgstr "не е диапазон с подавания: „%s“"
+
+#: builtin/range-diff.c:74
 msgid "single arg format must be symmetric range"
 msgstr "вариантът с единствен аргумент изисква симетричен диапазон"
 
-#: builtin/range-diff.c:79
+#: builtin/range-diff.c:89
 msgid "need two commit ranges"
 msgstr "необходими са два диапазона с подавания"
 
@@ -19608,197 +20023,197 @@
 msgid "git rebase --continue | --abort | --skip | --edit-todo"
 msgstr "git rebase --continue | --abort | --skip | --edit-todo"
 
-#: builtin/rebase.c:193 builtin/rebase.c:217 builtin/rebase.c:244
+#: builtin/rebase.c:195 builtin/rebase.c:219 builtin/rebase.c:246
 #, c-format
 msgid "unusable todo list: '%s'"
 msgstr "неуспешно изтриване на списъка за изпълнение: „%s“"
 
-#: builtin/rebase.c:310
+#: builtin/rebase.c:312
 #, c-format
 msgid "could not create temporary %s"
 msgstr "не може да се създаде временна директория „%s“"
 
-#: builtin/rebase.c:316
+#: builtin/rebase.c:318
 msgid "could not mark as interactive"
 msgstr "невъзможно задаване на интерактивна работа"
 
-#: builtin/rebase.c:369
+#: builtin/rebase.c:371
 msgid "could not generate todo list"
 msgstr "файлът с командите не може да се генерира"
 
-#: builtin/rebase.c:411
+#: builtin/rebase.c:413
 msgid "a base commit must be provided with --upstream or --onto"
 msgstr "опциите „--upstream“ и „--onto“ изискват базово подаване"
 
-#: builtin/rebase.c:480
+#: builtin/rebase.c:482
 msgid "git rebase--interactive [<options>]"
 msgstr "git rebase--interactive [ОПЦИЯ…]"
 
-#: builtin/rebase.c:493 builtin/rebase.c:1388
+#: builtin/rebase.c:495 builtin/rebase.c:1394
 msgid "keep commits which start empty"
 msgstr "запазванe на първоначално празните подавания"
 
-#: builtin/rebase.c:497 builtin/revert.c:128
+#: builtin/rebase.c:499 builtin/revert.c:128
 msgid "allow commits with empty messages"
 msgstr "позволяване на празни съобщения при подаване"
 
-#: builtin/rebase.c:499
+#: builtin/rebase.c:501
 msgid "rebase merge commits"
 msgstr "пребазиране на подаванията със сливания"
 
-#: builtin/rebase.c:501
+#: builtin/rebase.c:503
 msgid "keep original branch points of cousins"
 msgstr ""
 "запазване на първоначалните точки на разклоняване на сестринските клони"
 
-#: builtin/rebase.c:503
+#: builtin/rebase.c:505
 msgid "move commits that begin with squash!/fixup!"
 msgstr "преместване на подаванията, които започват със „squash!“/“fixup!“"
 
-#: builtin/rebase.c:504
+#: builtin/rebase.c:506
 msgid "sign commits"
 msgstr "подписване на подаванията"
 
-#: builtin/rebase.c:506 builtin/rebase.c:1327
+#: builtin/rebase.c:508 builtin/rebase.c:1333
 msgid "display a diffstat of what changed upstream"
 msgstr "извеждане на статистика с промените в следения клон"
 
-#: builtin/rebase.c:508
+#: builtin/rebase.c:510
 msgid "continue rebase"
 msgstr "продължаване на пребазирането"
 
-#: builtin/rebase.c:510
+#: builtin/rebase.c:512
 msgid "skip commit"
 msgstr "прескачане на подаване"
 
-#: builtin/rebase.c:511
+#: builtin/rebase.c:513
 msgid "edit the todo list"
 msgstr "редактиране на списъка с команди за изпълнение"
 
-#: builtin/rebase.c:513
+#: builtin/rebase.c:515
 msgid "show the current patch"
 msgstr "извеждане на текущата кръпка"
 
-#: builtin/rebase.c:516
+#: builtin/rebase.c:518
 msgid "shorten commit ids in the todo list"
 msgstr "съкратени идентификатори в списъка за изпълнение"
 
-#: builtin/rebase.c:518
+#: builtin/rebase.c:520
 msgid "expand commit ids in the todo list"
 msgstr "пълни идентификатори в списъка за изпълнение"
 
-#: builtin/rebase.c:520
+#: builtin/rebase.c:522
 msgid "check the todo list"
 msgstr "проверка на списъка за изпълнение"
 
-#: builtin/rebase.c:522
+#: builtin/rebase.c:524
 msgid "rearrange fixup/squash lines"
 msgstr ""
 "преподреждане на редовете за вкарване на подаванията подаванията в "
 "предходните им със и без смени на съобщението"
 
-#: builtin/rebase.c:524
+#: builtin/rebase.c:526
 msgid "insert exec commands in todo list"
 msgstr "вмъкване на командите за изпълнение в списъка за изпълнение"
 
-#: builtin/rebase.c:525
+#: builtin/rebase.c:527
 msgid "onto"
 msgstr "върху"
 
-#: builtin/rebase.c:528
+#: builtin/rebase.c:530
 msgid "restrict-revision"
 msgstr "ограничена версия"
 
-#: builtin/rebase.c:528
+#: builtin/rebase.c:530
 msgid "restrict revision"
 msgstr "ограничена версия"
 
-#: builtin/rebase.c:530
+#: builtin/rebase.c:532
 msgid "squash-onto"
 msgstr "подаване, в което другите да се вкарат"
 
-#: builtin/rebase.c:531
+#: builtin/rebase.c:533
 msgid "squash onto"
 msgstr "подаване, в което другите да се вкарат"
 
-#: builtin/rebase.c:533
+#: builtin/rebase.c:535
 msgid "the upstream commit"
 msgstr "подаване на източника"
 
-#: builtin/rebase.c:535
+#: builtin/rebase.c:537
 msgid "head-name"
 msgstr "име на върха"
 
-#: builtin/rebase.c:535
+#: builtin/rebase.c:537
 msgid "head name"
 msgstr "име на върха"
 
-#: builtin/rebase.c:540
+#: builtin/rebase.c:542
 msgid "rebase strategy"
 msgstr "стратегия на пребазиране"
 
-#: builtin/rebase.c:541
+#: builtin/rebase.c:543
 msgid "strategy-opts"
 msgstr "опции на стратегията"
 
-#: builtin/rebase.c:542
+#: builtin/rebase.c:544
 msgid "strategy options"
 msgstr "опции на стратегията"
 
-#: builtin/rebase.c:543
+#: builtin/rebase.c:545
 msgid "switch-to"
 msgstr "преминаване към"
 
-#: builtin/rebase.c:544
+#: builtin/rebase.c:546
 msgid "the branch or commit to checkout"
 msgstr "клонът, към който да се премине"
 
-#: builtin/rebase.c:545
+#: builtin/rebase.c:547
 msgid "onto-name"
 msgstr "име на база"
 
-#: builtin/rebase.c:545
+#: builtin/rebase.c:547
 msgid "onto name"
 msgstr "име на база"
 
-#: builtin/rebase.c:546
+#: builtin/rebase.c:548
 msgid "cmd"
 msgstr "команда"
 
-#: builtin/rebase.c:546
+#: builtin/rebase.c:548
 msgid "the command to run"
 msgstr "команда за изпълнение"
 
-#: builtin/rebase.c:549 builtin/rebase.c:1421
+#: builtin/rebase.c:551 builtin/rebase.c:1427
 msgid "automatically re-schedule any `exec` that fails"
 msgstr ""
 "автоматично подаване за повторно изпълнение на командите завършили с неуспех"
 
-#: builtin/rebase.c:565
+#: builtin/rebase.c:567
 msgid "--[no-]rebase-cousins has no effect without --rebase-merges"
 msgstr "опциите „--[no-]rebase-cousins“ изискват опцията „--rebase-merges“"
 
-#: builtin/rebase.c:581
+#: builtin/rebase.c:583
 #, c-format
 msgid "%s requires the merge backend"
 msgstr "„%s“ изисква пребазиране"
 
-#: builtin/rebase.c:624
+#: builtin/rebase.c:626
 #, c-format
 msgid "could not get 'onto': '%s'"
 msgstr "не може да се премине към новата база, зададена с „onto“: „%s“"
 
-#: builtin/rebase.c:641
+#: builtin/rebase.c:643
 #, c-format
 msgid "invalid orig-head: '%s'"
 msgstr "неправилен указател към първоначален връх „orig-head“: „%s“"
 
-#: builtin/rebase.c:666
+#: builtin/rebase.c:668
 #, c-format
 msgid "ignoring invalid allow_rerere_autoupdate: '%s'"
 msgstr "неправилната стойност на „allow_rerere_autoupdate“ се прескача: „%s“"
 
-#: builtin/rebase.c:811 git-rebase--preserve-merges.sh:81
+#: builtin/rebase.c:813 git-rebase--preserve-merges.sh:81
 msgid ""
 "Resolve all conflicts manually, mark them as resolved with\n"
 "\"git add/rm <conflicted_files>\", then run \"git rebase --continue\".\n"
@@ -19812,7 +20227,7 @@
 "За да откажете пребазирането и да се върнете към първоначалното състояние,\n"
 "изпълнете „git rebase --abort“."
 
-#: builtin/rebase.c:894
+#: builtin/rebase.c:896
 #, c-format
 msgid ""
 "\n"
@@ -19830,7 +20245,7 @@
 "\n"
 "В резултат те не могат да се пребазират."
 
-#: builtin/rebase.c:1220
+#: builtin/rebase.c:1227
 #, c-format
 msgid ""
 "unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and \"ask"
@@ -19839,7 +20254,7 @@
 "неправилна стойност „%s“: вариантите са „drop“ (прескачане), "
 "„keep“ (запазване) и „ask“ (питане)"
 
-#: builtin/rebase.c:1238
+#: builtin/rebase.c:1245
 #, c-format
 msgid ""
 "%s\n"
@@ -19856,7 +20271,7 @@
 "    git rebase КЛОН\n"
 "\n"
 
-#: builtin/rebase.c:1254
+#: builtin/rebase.c:1261
 #, c-format
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:\n"
@@ -19869,154 +20284,154 @@
 "\n"
 "    git branch --set-upstream-to=%s/КЛОН %s\n"
 
-#: builtin/rebase.c:1284
+#: builtin/rebase.c:1291
 msgid "exec commands cannot contain newlines"
 msgstr "командите за изпълнение не може да съдържат нови редове"
 
-#: builtin/rebase.c:1288
+#: builtin/rebase.c:1295
 msgid "empty exec command"
 msgstr "празна команда за изпълнение"
 
-#: builtin/rebase.c:1318
+#: builtin/rebase.c:1324
 msgid "rebase onto given branch instead of upstream"
 msgstr "пребазиране върху зададения, а не следения клон"
 
-#: builtin/rebase.c:1320
+#: builtin/rebase.c:1326
 msgid "use the merge-base of upstream and branch as the current base"
 msgstr "за текуща база да се ползва базата за сливане на клона и следеното"
 
-#: builtin/rebase.c:1322
+#: builtin/rebase.c:1328
 msgid "allow pre-rebase hook to run"
 msgstr "позволяване на куката преди пребазиране да се изпълни"
 
-#: builtin/rebase.c:1324
+#: builtin/rebase.c:1330
 msgid "be quiet. implies --no-stat"
 msgstr "без извеждане на информация.  Включва опцията „--no-stat“"
 
-#: builtin/rebase.c:1330
+#: builtin/rebase.c:1336
 msgid "do not show diffstat of what changed upstream"
 msgstr "без извеждане на статистика с промените в следения клон"
 
-#: builtin/rebase.c:1333
+#: builtin/rebase.c:1339
 msgid "add a Signed-off-by trailer to each commit"
 msgstr "добавяне на епилог за подпис „Signed-off-by“ към всяко подаване"
 
-#: builtin/rebase.c:1336
+#: builtin/rebase.c:1342
 msgid "make committer date match author date"
 msgstr "датата на подаващия да отговаря на датата на автора"
 
-#: builtin/rebase.c:1338
+#: builtin/rebase.c:1344
 msgid "ignore author date and use current date"
 msgstr "да се ползва днешна дата, а не тази на автора"
 
-#: builtin/rebase.c:1340
+#: builtin/rebase.c:1346
 msgid "synonym of --reset-author-date"
 msgstr "псевдоним на „--reset-author-date“"
 
-#: builtin/rebase.c:1342 builtin/rebase.c:1346
+#: builtin/rebase.c:1348 builtin/rebase.c:1352
 msgid "passed to 'git apply'"
 msgstr "подава се на командата „git apply“"
 
-#: builtin/rebase.c:1344
+#: builtin/rebase.c:1350
 msgid "ignore changes in whitespace"
 msgstr "без промени в празните знаци"
 
-#: builtin/rebase.c:1348 builtin/rebase.c:1351
+#: builtin/rebase.c:1354 builtin/rebase.c:1357
 msgid "cherry-pick all commits, even if unchanged"
 msgstr "отбиране на всички подавания дори да няма промени"
 
-#: builtin/rebase.c:1353
+#: builtin/rebase.c:1359
 msgid "continue"
 msgstr "продължаване"
 
-#: builtin/rebase.c:1356
+#: builtin/rebase.c:1362
 msgid "skip current patch and continue"
 msgstr "прескачане на текущата кръпка и продължаване"
 
-#: builtin/rebase.c:1358
+#: builtin/rebase.c:1364
 msgid "abort and check out the original branch"
 msgstr "преустановяване и възстановяване на първоначалния клон"
 
-#: builtin/rebase.c:1361
+#: builtin/rebase.c:1367
 msgid "abort but keep HEAD where it is"
 msgstr "преустановяване без промяна към какво сочи „HEAD“"
 
-#: builtin/rebase.c:1362
+#: builtin/rebase.c:1368
 msgid "edit the todo list during an interactive rebase"
 msgstr "редактиране на файла с команди при интерактивно пребазиране"
 
-#: builtin/rebase.c:1365
+#: builtin/rebase.c:1371
 msgid "show the patch file being applied or merged"
 msgstr "показване на кръпката, която се прилага или слива"
 
-#: builtin/rebase.c:1368
+#: builtin/rebase.c:1374
 msgid "use apply strategies to rebase"
 msgstr "при пребазиране да се ползва стратегия с прилагане"
 
-#: builtin/rebase.c:1372
+#: builtin/rebase.c:1378
 msgid "use merging strategies to rebase"
 msgstr "при пребазиране да се ползва стратегия със сливане"
 
-#: builtin/rebase.c:1376
+#: builtin/rebase.c:1382
 msgid "let the user edit the list of commits to rebase"
 msgstr ""
 "позволяване на потребителя да редактира списъка с подавания за пребазиране"
 
-#: builtin/rebase.c:1380
+#: builtin/rebase.c:1386
 msgid "(DEPRECATED) try to recreate merges instead of ignoring them"
 msgstr "(ОСТАРЯЛО) пресъздаване на сливанията вместо да се прескачат"
 
-#: builtin/rebase.c:1385
+#: builtin/rebase.c:1391
 msgid "how to handle commits that become empty"
 msgstr "как да се обработват оказалите се празни подавания"
 
-#: builtin/rebase.c:1392
+#: builtin/rebase.c:1398
 msgid "move commits that begin with squash!/fixup! under -i"
 msgstr ""
 "преместване на подаванията, които започват със „squash!“/“fixup!“ при „-i“"
 
-#: builtin/rebase.c:1399
+#: builtin/rebase.c:1405
 msgid "add exec lines after each commit of the editable list"
 msgstr ""
 "добавяне на редове с команди за изпълнение след всяко подаване в "
 "редактирания списък"
 
-#: builtin/rebase.c:1403
+#: builtin/rebase.c:1409
 msgid "allow rebasing commits with empty messages"
 msgstr "позволяване на пребазиране на подавания с празни съобщения"
 
-#: builtin/rebase.c:1407
+#: builtin/rebase.c:1413
 msgid "try to rebase merges instead of skipping them"
 msgstr "опит за пребазиране на сливанията вместо те да се прескачат"
 
-#: builtin/rebase.c:1410
+#: builtin/rebase.c:1416
 msgid "use 'merge-base --fork-point' to refine upstream"
 msgstr ""
 "за доуточняването на следения клон, използвайте:\n"
 "\n"
 "    git merge-base --fork-point"
 
-#: builtin/rebase.c:1412
+#: builtin/rebase.c:1418
 msgid "use the given merge strategy"
 msgstr "използване на зададената стратегията на сливане"
 
-#: builtin/rebase.c:1414 builtin/revert.c:115
+#: builtin/rebase.c:1420 builtin/revert.c:115
 msgid "option"
 msgstr "опция"
 
-#: builtin/rebase.c:1415
+#: builtin/rebase.c:1421
 msgid "pass the argument through to the merge strategy"
 msgstr "аргументът да се подаде на стратегията за сливане"
 
-#: builtin/rebase.c:1418
+#: builtin/rebase.c:1424
 msgid "rebase all reachable commits up to the root(s)"
 msgstr "пребазиране на всички достижими подавания до началното им подаване"
 
-#: builtin/rebase.c:1423
+#: builtin/rebase.c:1429
 msgid "apply all changes, even those already present upstream"
 msgstr "прилагане на всички промени, дори и наличните вече в следеното"
 
-#: builtin/rebase.c:1440
+#: builtin/rebase.c:1446
 msgid ""
 "the rebase.useBuiltin support has been removed!\n"
 "See its entry in 'git help config' for details."
@@ -20024,45 +20439,45 @@
 "поддръжката на „rebase.useBuiltin“ е премахната.\n"
 "За повече информация вижте „git help config“."
 
-#: builtin/rebase.c:1446
+#: builtin/rebase.c:1452
 msgid "It looks like 'git am' is in progress. Cannot rebase."
 msgstr ""
 "Изглежда, че сега се прилагат кръпки чрез командата „git-am“.  Не може да "
 "пребазирате в момента."
 
-#: builtin/rebase.c:1487
+#: builtin/rebase.c:1493
 msgid ""
 "git rebase --preserve-merges is deprecated. Use --rebase-merges instead."
 msgstr ""
 "Опцията „--preserve-merges“ е остаряла.  Ползвайте „--rebase-merges“ вместо "
 "нея."
 
-#: builtin/rebase.c:1492
+#: builtin/rebase.c:1498
 msgid "cannot combine '--keep-base' with '--onto'"
 msgstr "опциите „--keep-base“ и „--onto“ са несъвместими"
 
-#: builtin/rebase.c:1494
+#: builtin/rebase.c:1500
 msgid "cannot combine '--keep-base' with '--root'"
 msgstr "опциите „--keep-base“ и „--root“ са несъвместими"
 
-#: builtin/rebase.c:1498
+#: builtin/rebase.c:1504
 msgid "cannot combine '--root' with '--fork-point'"
 msgstr "опциите „--root“ и „--fork-point“ са несъвместими"
 
-#: builtin/rebase.c:1501
+#: builtin/rebase.c:1507
 msgid "No rebase in progress?"
 msgstr "Изглежда в момента не тече пребазиране"
 
-#: builtin/rebase.c:1505
+#: builtin/rebase.c:1511
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "Опцията „--edit-todo“ е достъпна само по време на интерактивно пребазиране."
 
-#: builtin/rebase.c:1528 t/helper/test-fast-rebase.c:123
+#: builtin/rebase.c:1534 t/helper/test-fast-rebase.c:123
 msgid "Cannot read HEAD"
 msgstr "Указателят „HEAD“ не може да бъде прочетен"
 
-#: builtin/rebase.c:1540
+#: builtin/rebase.c:1546
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -20070,16 +20485,16 @@
 "Трябва да редактирате всички конфликти при сливането.  След това\n"
 "отбележете коригирането им чрез командата „git add“"
 
-#: builtin/rebase.c:1559
+#: builtin/rebase.c:1565
 msgid "could not discard worktree changes"
 msgstr "промените в работното дърво не могат да бъдат занулени"
 
-#: builtin/rebase.c:1578
+#: builtin/rebase.c:1584
 #, c-format
 msgid "could not move back to %s"
 msgstr "връщането към „%s“ е невъзможно"
 
-#: builtin/rebase.c:1624
+#: builtin/rebase.c:1630
 #, c-format
 msgid ""
 "It seems that there is already a %s directory, and\n"
@@ -20100,138 +20515,138 @@
 "за\n"
 "да не загубите случайно промени.\n"
 
-#: builtin/rebase.c:1652
+#: builtin/rebase.c:1658
 msgid "switch `C' expects a numerical value"
 msgstr "опцията „C“ очаква число за аргумент"
 
-#: builtin/rebase.c:1694
+#: builtin/rebase.c:1700
 #, c-format
 msgid "Unknown mode: %s"
 msgstr "Неизвестна стратегия: „%s“"
 
-#: builtin/rebase.c:1733
+#: builtin/rebase.c:1739
 msgid "--strategy requires --merge or --interactive"
 msgstr ""
 "опцията „--strategy“ изисква някоя от опциите „--merge“ или „--interactive“"
 
-#: builtin/rebase.c:1763
+#: builtin/rebase.c:1769
 msgid "cannot combine apply options with merge options"
 msgstr "опциите за „apply“ са несъвместими с опциите за сливане"
 
-#: builtin/rebase.c:1776
+#: builtin/rebase.c:1782
 #, c-format
 msgid "Unknown rebase backend: %s"
 msgstr "Непозната реализация на пребазиране: %s"
 
-#: builtin/rebase.c:1806
+#: builtin/rebase.c:1812
 msgid "--reschedule-failed-exec requires --exec or --interactive"
 msgstr ""
 "опцията „--reschedule-failed-exec“ изисква някоя от опциите „--exec“ или „--"
 "interactive“"
 
-#: builtin/rebase.c:1826
+#: builtin/rebase.c:1832
 msgid "cannot combine '--preserve-merges' with '--rebase-merges'"
 msgstr "опциите „--preserve-merges“ и „--rebase-merges“ са несъвместими"
 
-#: builtin/rebase.c:1830
+#: builtin/rebase.c:1836
 msgid ""
 "error: cannot combine '--preserve-merges' with '--reschedule-failed-exec'"
 msgstr ""
 "ГРЕШКА: опциите „--preserve-merges“ и „--reschedule-failed-exec“ са "
 "несъвместими"
 
-#: builtin/rebase.c:1854
+#: builtin/rebase.c:1860
 #, c-format
 msgid "invalid upstream '%s'"
 msgstr "неправилен следен клон: „%s“"
 
-#: builtin/rebase.c:1860
+#: builtin/rebase.c:1866
 msgid "Could not create new root commit"
 msgstr "Не може да се създаде ново начално подаване"
 
-#: builtin/rebase.c:1886
+#: builtin/rebase.c:1892
 #, c-format
 msgid "'%s': need exactly one merge base with branch"
 msgstr "„%s“: изисква се точно една база за сливане с клона"
 
-#: builtin/rebase.c:1889
+#: builtin/rebase.c:1895
 #, c-format
 msgid "'%s': need exactly one merge base"
 msgstr "„%s“: изисква се точно една база за пребазиране"
 
-#: builtin/rebase.c:1897
+#: builtin/rebase.c:1903
 #, c-format
 msgid "Does not point to a valid commit '%s'"
 msgstr "Указателят „%s“ не сочи към подаване"
 
-#: builtin/rebase.c:1923
+#: builtin/rebase.c:1931
 #, c-format
 msgid "fatal: no such branch/commit '%s'"
 msgstr "ФАТАЛНА ГРЕШКА: не съществува клон „%s“"
 
-#: builtin/rebase.c:1931 builtin/submodule--helper.c:40
+#: builtin/rebase.c:1939 builtin/submodule--helper.c:40
 #: builtin/submodule--helper.c:2414
 #, c-format
 msgid "No such ref: %s"
 msgstr "Такъв указател няма: %s"
 
-#: builtin/rebase.c:1942
+#: builtin/rebase.c:1950
 msgid "Could not resolve HEAD to a revision"
 msgstr "Подаването, сочено от указателя „HEAD“, не може да бъде открито"
 
-#: builtin/rebase.c:1963
+#: builtin/rebase.c:1971
 msgid "Please commit or stash them."
 msgstr "Промените трябва или да се подадат, или да се скатаят."
 
-#: builtin/rebase.c:1999
+#: builtin/rebase.c:2007
 #, c-format
 msgid "could not switch to %s"
 msgstr "не може да се премине към „%s“"
 
-#: builtin/rebase.c:2010
+#: builtin/rebase.c:2018
 msgid "HEAD is up to date."
 msgstr "Указателят „HEAD“ е напълно актуален."
 
-#: builtin/rebase.c:2012
+#: builtin/rebase.c:2020
 #, c-format
 msgid "Current branch %s is up to date.\n"
 msgstr "Текущият клон „%s“ е напълно актуален.\n"
 
-#: builtin/rebase.c:2020
+#: builtin/rebase.c:2028
 msgid "HEAD is up to date, rebase forced."
 msgstr "Указателят „HEAD“ е напълно актуален — принудително пребазиране"
 
-#: builtin/rebase.c:2022
+#: builtin/rebase.c:2030
 #, c-format
 msgid "Current branch %s is up to date, rebase forced.\n"
 msgstr "Текущият клон „%s“ е напълно актуален — принудително пребазиране\n"
 
-#: builtin/rebase.c:2030
+#: builtin/rebase.c:2038
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Куката за изпълнение преди пребазиране отхвърли пребазирането."
 
-#: builtin/rebase.c:2037
+#: builtin/rebase.c:2045
 #, c-format
 msgid "Changes to %s:\n"
 msgstr "Промените в „%s“:\n"
 
-#: builtin/rebase.c:2040
+#: builtin/rebase.c:2048
 #, c-format
 msgid "Changes from %s to %s:\n"
 msgstr "Промените от „%s“ към „%s“:\n"
 
-#: builtin/rebase.c:2065
+#: builtin/rebase.c:2073
 #, c-format
 msgid "First, rewinding head to replay your work on top of it...\n"
 msgstr ""
 "Първо, указателят „HEAD“ започва да сочи към базата, върху която "
 "пребазирате…\n"
 
-#: builtin/rebase.c:2074
+#: builtin/rebase.c:2082
 msgid "Could not detach HEAD"
 msgstr "Указателят „HEAD“ не може да се отделѝ"
 
-#: builtin/rebase.c:2083
+#: builtin/rebase.c:2091
 #, c-format
 msgid "Fast-forwarded %s to %s.\n"
 msgstr "Превъртане на „%s“ към „%s“.\n"
@@ -20328,36 +20743,36 @@
 msgid "'%s' is not a valid timestamp"
 msgstr "„%s“ не е правилна стойност за време"
 
-#: builtin/reflog.c:606
+#: builtin/reflog.c:609
 #, c-format
 msgid "Marking reachable objects..."
 msgstr "Отбелязване на достижимите обекти…"
 
-#: builtin/reflog.c:644
+#: builtin/reflog.c:647
 #, c-format
 msgid "%s points nowhere!"
 msgstr "„%s“ не сочи наникъде!"
 
-#: builtin/reflog.c:696
+#: builtin/reflog.c:699
 msgid "no reflog specified to delete"
 msgstr "не е указан журнал с подавания за изтриване"
 
-#: builtin/reflog.c:705
+#: builtin/reflog.c:708
 #, c-format
 msgid "not a reflog: %s"
 msgstr "„%s“ не е журнал с подавания"
 
-#: builtin/reflog.c:710
+#: builtin/reflog.c:713
 #, c-format
 msgid "no reflog for '%s'"
 msgstr "липсва журнал с подаванията за „%s“"
 
-#: builtin/reflog.c:756
+#: builtin/reflog.c:759
 #, c-format
 msgid "invalid ref format: %s"
 msgstr "неправилен формат на указател: %s"
 
-#: builtin/reflog.c:765
+#: builtin/reflog.c:768
 msgid "git reflog [ show | expire | delete | exists ]"
 msgstr "git reflog [ show | expire | delete | exists ]"
 
@@ -20881,11 +21296,11 @@
 msgid "Will not delete all non-push URLs"
 msgstr "Никой от адресите, които не са за изтласкване, няма да се изтрие"
 
-#: builtin/repack.c:25
+#: builtin/repack.c:26
 msgid "git repack [<options>]"
 msgstr "git repack [ОПЦИЯ…]"
 
-#: builtin/repack.c:30
+#: builtin/repack.c:31
 msgid ""
 "Incremental repacks are incompatible with bitmap indexes.  Use\n"
 "--no-write-bitmap-index or disable the pack.writebitmaps configuration."
@@ -20894,131 +21309,131 @@
 "Ползвайте опцията --no-write-bitmap-index или изключете настройката\n"
 "„pack.writebitmaps“."
 
-#: builtin/repack.c:197
+#: builtin/repack.c:198
 msgid "could not start pack-objects to repack promisor objects"
 msgstr ""
 "командата „pack-objects“ не може да се стартира за препакетирането на "
 "гарантиращите обекти"
 
-#: builtin/repack.c:268 builtin/repack.c:447
+#: builtin/repack.c:270 builtin/repack.c:446
 msgid "repack: Expecting full hex object ID lines only from pack-objects."
 msgstr ""
 "repack: от „pack-objects“ се изискват редове само с пълни шестнайсетични "
 "указатели."
 
-#: builtin/repack.c:295
+#: builtin/repack.c:294
 msgid "could not finish pack-objects to repack promisor objects"
 msgstr ""
 "командата „pack-objects“ не може да завърши за препакетирането на "
 "гарантиращите обекти"
 
-#: builtin/repack.c:323
+#: builtin/repack.c:322
 msgid "pack everything in a single pack"
 msgstr "пакетиране на всичко в пакет"
 
-#: builtin/repack.c:325
+#: builtin/repack.c:324
 msgid "same as -a, and turn unreachable objects loose"
 msgstr ""
 "същото като опцията „-a“.  Допълнително — недостижимите обекти да станат "
 "непакетирани"
 
-#: builtin/repack.c:328
+#: builtin/repack.c:327
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr ""
 "премахване на ненужните пакетирани файлове и изпълнение на командата „git-"
 "prune-packed“"
 
-#: builtin/repack.c:330
+#: builtin/repack.c:329
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "подаване на опцията „--no-reuse-delta“ на командата „git-pack-objects“"
 
-#: builtin/repack.c:332
+#: builtin/repack.c:331
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr ""
 "подаване на опцията „--no-reuse-object“ на командата „git-pack-objects“"
 
-#: builtin/repack.c:334
+#: builtin/repack.c:333
 msgid "do not run git-update-server-info"
 msgstr "без изпълнение на командата „git-update-server-info“"
 
-#: builtin/repack.c:337
+#: builtin/repack.c:336
 msgid "pass --local to git-pack-objects"
 msgstr "подаване на опцията „--local“ на командата „git-pack-objects“"
 
-#: builtin/repack.c:339
+#: builtin/repack.c:338
 msgid "write bitmap index"
 msgstr "създаване и записване на индекси на база битови маски"
 
-#: builtin/repack.c:341
+#: builtin/repack.c:340
 msgid "pass --delta-islands to git-pack-objects"
 msgstr "подаване на опцията „--delta-islands“ на командата „git-pack-objects“"
 
-#: builtin/repack.c:342
+#: builtin/repack.c:341
 msgid "approxidate"
 msgstr "евристична дата"
 
-#: builtin/repack.c:343
+#: builtin/repack.c:342
 msgid "with -A, do not loosen objects older than this"
 msgstr ""
 "при комбинирането с опцията „-A“ — без разпакетиране на обектите по стари от "
 "това"
 
-#: builtin/repack.c:345
+#: builtin/repack.c:344
 msgid "with -a, repack unreachable objects"
 msgstr "с „-a“ — препакетиране на недостижимите обекти"
 
-#: builtin/repack.c:347
+#: builtin/repack.c:346
 msgid "size of the window used for delta compression"
 msgstr "размер на прозореца за делта компресията"
 
-#: builtin/repack.c:348 builtin/repack.c:354
+#: builtin/repack.c:347 builtin/repack.c:353
 msgid "bytes"
 msgstr "байтове"
 
-#: builtin/repack.c:349
+#: builtin/repack.c:348
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
 "същото като горната опция, но ограничението да е по размер на паметта, а не "
 "по броя на обектите"
 
-#: builtin/repack.c:351
+#: builtin/repack.c:350
 msgid "limits the maximum delta depth"
 msgstr "ограничаване на максималната дълбочина на делтата"
 
-#: builtin/repack.c:353
+#: builtin/repack.c:352
 msgid "limits the maximum number of threads"
 msgstr "ограничаване на максималния брой нишки"
 
-#: builtin/repack.c:355
+#: builtin/repack.c:354
 msgid "maximum size of each packfile"
 msgstr "максимален размер на всеки пакет"
 
-#: builtin/repack.c:357
+#: builtin/repack.c:356
 msgid "repack objects in packs marked with .keep"
 msgstr "препакетиране на обектите в пакети белязани с „.keep“"
 
-#: builtin/repack.c:359
+#: builtin/repack.c:358
 msgid "do not repack this pack"
 msgstr "без препакетиране на този пакет"
 
-#: builtin/repack.c:369
+#: builtin/repack.c:368
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "пакетите в хранилище с важни обекти не може да се трият"
 
-#: builtin/repack.c:373
+#: builtin/repack.c:372
 msgid "--keep-unreachable and -A are incompatible"
 msgstr "Опциите „--keep-unreachable“ и „-A“ са несъвместими"
 
-#: builtin/repack.c:456
+#: builtin/repack.c:455
 msgid "Nothing new to pack."
 msgstr "Нищо ново за пакетиране"
 
-#: builtin/repack.c:486
+#: builtin/repack.c:485
 #, c-format
 msgid "missing required file: %s"
 msgstr "липсва задължителния файл „%s“"
 
-#: builtin/repack.c:488
+#: builtin/repack.c:487
 #, c-format
 msgid "could not unlink: %s"
 msgstr "неуспешно изтриване на „%s“"
@@ -21352,8 +21767,8 @@
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr "Не може да се извърши %s зануляване по време на сливане."
 
-#: builtin/reset.c:295 builtin/stash.c:520 builtin/stash.c:594
-#: builtin/stash.c:618
+#: builtin/reset.c:295 builtin/stash.c:587 builtin/stash.c:661
+#: builtin/stash.c:685
 msgid "be quiet, only report errors"
 msgstr "по-малко подробности, да се извеждат само грешките"
 
@@ -21440,19 +21855,19 @@
 msgid "Could not write new index file."
 msgstr "Новият индекс не може да бъде записан."
 
-#: builtin/rev-list.c:499
+#: builtin/rev-list.c:534
 msgid "cannot combine --exclude-promisor-objects and --missing"
 msgstr "опциите „--exclude-promisor-objects“ и „--missing“ и са несъвместими"
 
-#: builtin/rev-list.c:560
+#: builtin/rev-list.c:595
 msgid "object filtering requires --objects"
 msgstr "филтрирането на обекти изисква опцията „--objects“"
 
-#: builtin/rev-list.c:610
+#: builtin/rev-list.c:651
 msgid "rev-list does not support display of notes"
 msgstr "командата „rev-list“ не поддържа извеждането на бележки"
 
-#: builtin/rev-list.c:615
+#: builtin/rev-list.c:656
 msgid "marked counting is incompatible with --objects"
 msgstr "опцията „--objects“ е несъвместима с изброяването"
 
@@ -21699,54 +22114,52 @@
 msgid "git log --pretty=short | git shortlog [<options>]"
 msgstr "git log --pretty=short | git shortlog [ОПЦИЯ…]"
 
-#: builtin/shortlog.c:135
+#: builtin/shortlog.c:123
 msgid "using multiple --group options with stdin is not supported"
 msgstr "повече от една опции „--group“ са несъвместими със стандартния вход"
 
-#: builtin/shortlog.c:145
+#: builtin/shortlog.c:133
 msgid "using --group=trailer with stdin is not supported"
 msgstr "опцията „--group=trailer“ е несъвместима със стандартния вход"
 
-#: builtin/shortlog.c:335
+#: builtin/shortlog.c:323
 #, c-format
 msgid "unknown group type: %s"
 msgstr "неизвестен вид група: %s"
 
-#: builtin/shortlog.c:363
-msgid "Group by committer rather than author"
-msgstr "Групиране по подаващ, а не по автор"
+#: builtin/shortlog.c:351
+msgid "group by committer rather than author"
+msgstr "групиране по подаващ, а не по автор"
 
-#: builtin/shortlog.c:366
+#: builtin/shortlog.c:354
 msgid "sort output according to the number of commits per author"
 msgstr "подредба на подаванията по броя подавания от автор"
 
-#: builtin/shortlog.c:368
-msgid "Suppress commit descriptions, only provides commit count"
-msgstr "Без описания на подаванията — да се показва само броя подавания"
+#: builtin/shortlog.c:356
+msgid "suppress commit descriptions, only provides commit count"
+msgstr "без описания на подаванията — да се показва само броя подавания"
 
-#: builtin/shortlog.c:370
-msgid "Show the email address of each author"
-msgstr "Извеждане на адреса на е-поща за всеки автор"
+#: builtin/shortlog.c:358
+msgid "show the email address of each author"
+msgstr "извеждане на адреса на е-поща за всеки автор"
 
-#: builtin/shortlog.c:371
+#: builtin/shortlog.c:359
 msgid "<w>[,<i1>[,<i2>]]"
 msgstr "<ШИРОЧИНА>[,<ОТСТЪП_1>[,<ОТСТЪП_2>]]"
 
-#: builtin/shortlog.c:372
-msgid "Linewrap output"
-msgstr ""
-"Пренасяне на редовете до тази обща ШИРОЧИНА (76), с ОТСТЪП_1 (6) за първия "
-"ред и ОТСТЪП_2 (9) за останалите"
+#: builtin/shortlog.c:360
+msgid "linewrap output"
+msgstr "пренасяне на редовете"
 
-#: builtin/shortlog.c:374
+#: builtin/shortlog.c:362
 msgid "field"
 msgstr "поле"
 
-#: builtin/shortlog.c:375
-msgid "Group by field"
-msgstr "Групиране по поле"
+#: builtin/shortlog.c:363
+msgid "group by field"
+msgstr "групиране по поле"
 
-#: builtin/shortlog.c:403
+#: builtin/shortlog.c:391
 msgid "too many arguments given outside repository"
 msgstr "прекалено много аргументи извън хранилище"
 
@@ -21948,73 +22361,73 @@
 msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>"
 msgstr "git sparse-checkout (init|list|set|add|reapply|disable) ОПЦИЯ…"
 
-#: builtin/sparse-checkout.c:50
+#: builtin/sparse-checkout.c:45
 msgid "git sparse-checkout list"
 msgstr "git sparse-checkout list"
 
-#: builtin/sparse-checkout.c:76
+#: builtin/sparse-checkout.c:71
 msgid "this worktree is not sparse (sparse-checkout file may not exist)"
 msgstr ""
 "това не е частично работно дърво (вероятно липсва файл „sparse-checkout“)"
 
-#: builtin/sparse-checkout.c:228
+#: builtin/sparse-checkout.c:223
 msgid "failed to create directory for sparse-checkout file"
 msgstr "директорията за частично изтегляне „%s“ не може да бъде създадена"
 
-#: builtin/sparse-checkout.c:269
+#: builtin/sparse-checkout.c:264
 msgid "unable to upgrade repository format to enable worktreeConfig"
 msgstr ""
 "настройката „worktreeConfig“ не може да се включи, защото форматът на "
 "хранилището не може да се обнови"
 
-#: builtin/sparse-checkout.c:271
+#: builtin/sparse-checkout.c:266
 msgid "failed to set extensions.worktreeConfig setting"
 msgstr "неуспешно задаване на настройката „extensions.worktreeConfig“"
 
-#: builtin/sparse-checkout.c:288
+#: builtin/sparse-checkout.c:283
 msgid "git sparse-checkout init [--cone]"
 msgstr "git sparse-checkout init [--cone]"
 
-#: builtin/sparse-checkout.c:307
+#: builtin/sparse-checkout.c:302
 msgid "initialize the sparse-checkout in cone mode"
 msgstr "инициализиране на частичното изтегляне в пътеводен режим"
 
-#: builtin/sparse-checkout.c:344
+#: builtin/sparse-checkout.c:339
 #, c-format
 msgid "failed to open '%s'"
 msgstr "„%s“ не може да се отвори"
 
-#: builtin/sparse-checkout.c:401
+#: builtin/sparse-checkout.c:396
 #, c-format
 msgid "could not normalize path %s"
 msgstr "пътят „%s“  не може да се нормализира"
 
-#: builtin/sparse-checkout.c:413
+#: builtin/sparse-checkout.c:408
 msgid "git sparse-checkout (set|add) (--stdin | <patterns>)"
 msgstr "git sparse-checkout (set|add) (--stdin | ШАБЛОН…)"
 
-#: builtin/sparse-checkout.c:438
+#: builtin/sparse-checkout.c:433
 #, c-format
 msgid "unable to unquote C-style string '%s'"
 msgstr "цитирането на низ, форматиран за C — „%s“ не може да бъде изчистено"
 
-#: builtin/sparse-checkout.c:492 builtin/sparse-checkout.c:516
+#: builtin/sparse-checkout.c:487 builtin/sparse-checkout.c:511
 msgid "unable to load existing sparse-checkout patterns"
 msgstr "шаблоните за частично изтегляне не могат да се заредят"
 
-#: builtin/sparse-checkout.c:561
+#: builtin/sparse-checkout.c:556
 msgid "read patterns from standard in"
 msgstr "изчитане на шаблоните от стандартния вход"
 
-#: builtin/sparse-checkout.c:576
+#: builtin/sparse-checkout.c:571
 msgid "git sparse-checkout reapply"
 msgstr "git sparse-checkout reapply"
 
-#: builtin/sparse-checkout.c:595
+#: builtin/sparse-checkout.c:590
 msgid "git sparse-checkout disable"
 msgstr "git sparse-checkout disable"
 
-#: builtin/sparse-checkout.c:623
+#: builtin/sparse-checkout.c:618
 msgid "error while refreshing working directory"
 msgstr "грешка при обновяване на работната директория"
 
@@ -22104,155 +22517,166 @@
 msgstr "„%s“ е неправилно име за указател"
 
 #: builtin/stash.c:225
-msgid "git stash clear with parameters is unimplemented"
+msgid "git stash clear with arguments is unimplemented"
 msgstr "командата „git stash clear“ не поддържа аргументи"
 
-#: builtin/stash.c:404
+#: builtin/stash.c:429
+#, c-format
+msgid ""
+"WARNING: Untracked file in way of tracked file!  Renaming\n"
+"            %s -> %s\n"
+"         to make room.\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: Неследен файл на мястото на следен!  Преименуване\n"
+"            „%s“ на „%s“\n"
+"         за да се направи място.\n"
+
+#: builtin/stash.c:490
 msgid "cannot apply a stash in the middle of a merge"
 msgstr "по време на сливане не може да приложите нещо скатано"
 
-#: builtin/stash.c:415
+#: builtin/stash.c:501
 #, c-format
 msgid "could not generate diff %s^!."
 msgstr "файлът с разликите „%s^!“ не може да се генерира"
 
-#: builtin/stash.c:422
+#: builtin/stash.c:508
 msgid "conflicts in index. Try without --index."
 msgstr ""
 "в индекса има конфликти.  Пробвайте да изпълните командата без опцията „--"
 "index“."
 
-#: builtin/stash.c:428
+#: builtin/stash.c:514
 msgid "could not save index tree"
 msgstr "дървото сочено от индекса не може да бъде запазено"
 
-#: builtin/stash.c:437
+#: builtin/stash.c:523
 msgid "could not restore untracked files from stash"
 msgstr "неследени файлове не могат да се възстановят от скатаното"
 
-#: builtin/stash.c:451
+#: builtin/stash.c:537
 #, c-format
 msgid "Merging %s with %s"
 msgstr "Сливане на „%s“ с „%s“"
 
-#: builtin/stash.c:461
+#: builtin/stash.c:547
 msgid "Index was not unstashed."
 msgstr "Индексът не е изваден от скатаното."
 
-#: builtin/stash.c:522 builtin/stash.c:620
+#: builtin/stash.c:589 builtin/stash.c:687
 msgid "attempt to recreate the index"
 msgstr "опит за повторно създаване на индекса"
 
-#: builtin/stash.c:566
+#: builtin/stash.c:633
 #, c-format
 msgid "Dropped %s (%s)"
 msgstr "Изтрито: „%s“ (%s)"
 
-#: builtin/stash.c:569
+#: builtin/stash.c:636
 #, c-format
 msgid "%s: Could not drop stash entry"
 msgstr "Скатаното „%s“ не може да бъде изтрито"
 
-#: builtin/stash.c:582
+#: builtin/stash.c:649
 #, c-format
 msgid "'%s' is not a stash reference"
 msgstr "„%s“ не е указател към нещо скатано"
 
-#: builtin/stash.c:632
+#: builtin/stash.c:699
 msgid "The stash entry is kept in case you need it again."
 msgstr "Скатаното е запазено в случай, че ви потрябва отново."
 
-#: builtin/stash.c:655
+#: builtin/stash.c:722
 msgid "No branch name specified"
 msgstr "Не е указано име на клон"
 
-#: builtin/stash.c:799 builtin/stash.c:836
+#: builtin/stash.c:866 builtin/stash.c:903
 #, c-format
 msgid "Cannot update %s with %s"
 msgstr "Указателят „%s“ не може да бъде обновен да сочи към „%s“"
 
-#: builtin/stash.c:817 builtin/stash.c:1471 builtin/stash.c:1536
+#: builtin/stash.c:884 builtin/stash.c:1538 builtin/stash.c:1603
 msgid "stash message"
 msgstr "съобщение при скатаване"
 
-#: builtin/stash.c:827
+#: builtin/stash.c:894
 msgid "\"git stash store\" requires one <commit> argument"
 msgstr "командата „git stash store“ изисква точно един аргумент-ПОДАВАНЕ"
 
-#: builtin/stash.c:1042
+#: builtin/stash.c:1109
 msgid "No changes selected"
 msgstr "Не са избрани никакви промени"
 
-#: builtin/stash.c:1142
+#: builtin/stash.c:1209
 msgid "You do not have the initial commit yet"
 msgstr "Все още липсва първоначално подаване"
 
-#: builtin/stash.c:1169
+#: builtin/stash.c:1236
 msgid "Cannot save the current index state"
 msgstr "Състоянието на текущия индекс не може да бъде запазено"
 
-#: builtin/stash.c:1178
+#: builtin/stash.c:1245
 msgid "Cannot save the untracked files"
 msgstr "Неследените файлове не могат да се запазят"
 
-#: builtin/stash.c:1189 builtin/stash.c:1198
+#: builtin/stash.c:1256 builtin/stash.c:1265
 msgid "Cannot save the current worktree state"
 msgstr "Състоянието на работното дърво не може да бъде запазено"
 
-#: builtin/stash.c:1226
+#: builtin/stash.c:1293
 msgid "Cannot record working tree state"
 msgstr "Състоянието на работното дърво не може да бъде запазено"
 
-#: builtin/stash.c:1275
+#: builtin/stash.c:1342
 msgid "Can't use --patch and --include-untracked or --all at the same time"
 msgstr "Опцията „--patch“ е несъвместима с „--include-untracked“ и „--all“"
 
-#: builtin/stash.c:1291
+#: builtin/stash.c:1358
 msgid "Did you forget to 'git add'?"
 msgstr "Пробвайте да използвате „git add“"
 
-#: builtin/stash.c:1306
+#: builtin/stash.c:1373
 msgid "No local changes to save"
 msgstr "Няма никакви локални промени за скатаване"
 
-#: builtin/stash.c:1313
+#: builtin/stash.c:1380
 msgid "Cannot initialize stash"
 msgstr "Скатаването не може да стартира"
 
-#: builtin/stash.c:1328
+#: builtin/stash.c:1395
 msgid "Cannot save the current status"
 msgstr "Текущото състояние не може да бъде запазено"
 
-#: builtin/stash.c:1333
+#: builtin/stash.c:1400
 #, c-format
 msgid "Saved working directory and index state %s"
 msgstr "Състоянието на работната директория и индекса e запазено: „%s“"
 
-#: builtin/stash.c:1423
+#: builtin/stash.c:1490
 msgid "Cannot remove worktree changes"
 msgstr "Промените в работното дърво не могат да бъдат занулени"
 
-#: builtin/stash.c:1462 builtin/stash.c:1527
+#: builtin/stash.c:1529 builtin/stash.c:1594
 msgid "keep index"
 msgstr "запазване на индекса"
 
-#: builtin/stash.c:1464 builtin/stash.c:1529
+#: builtin/stash.c:1531 builtin/stash.c:1596
 msgid "stash in patch mode"
 msgstr "скатаване в режим за кръпки"
 
-#: builtin/stash.c:1465 builtin/stash.c:1530
+#: builtin/stash.c:1532 builtin/stash.c:1597
 msgid "quiet mode"
 msgstr "без извеждане на информация"
 
-#: builtin/stash.c:1467 builtin/stash.c:1532
+#: builtin/stash.c:1534 builtin/stash.c:1599
 msgid "include untracked files in stash"
 msgstr "скатаване и на неследените файлове"
 
-#: builtin/stash.c:1469 builtin/stash.c:1534
+#: builtin/stash.c:1536 builtin/stash.c:1601
 msgid "include ignore files"
 msgstr "скатаване и на игнорираните файлове"
 
-#: builtin/stash.c:1569
+#: builtin/stash.c:1636
 msgid ""
 "the stash.useBuiltin support has been removed!\n"
 "See its entry in 'git help config' for details."
@@ -22331,12 +22755,13 @@
 "."
 
 #: builtin/submodule--helper.c:565
-msgid "Suppress output of entering each submodule command"
-msgstr "Без извеждане на изход при въвеждането на всяка команда за подмодули"
+msgid "suppress output of entering each submodule command"
+msgstr "без извеждане на изход при въвеждането на всяка команда за подмодули"
 
-#: builtin/submodule--helper.c:567 builtin/submodule--helper.c:1487
-msgid "Recurse into nested submodules"
-msgstr "Рекурсивно обхождане на подмодулите"
+#: builtin/submodule--helper.c:567 builtin/submodule--helper.c:888
+#: builtin/submodule--helper.c:1487
+msgid "recurse into nested submodules"
+msgstr "рекурсивно обхождане на подмодулите"
 
 #: builtin/submodule--helper.c:572
 msgid "git submodule--helper foreach [--quiet] [--recursive] [--] <command>"
@@ -22373,8 +22798,8 @@
 "Неуспешно регистриране на режима на обновяване за пътя към подмодул „%s“"
 
 #: builtin/submodule--helper.c:709
-msgid "Suppress output for initializing a submodule"
-msgstr "Без извеждане на информация при инициализирането на подмодул"
+msgid "suppress output for initializing a submodule"
+msgstr "без извеждане на информация при инициализирането на подмодул"
 
 #: builtin/submodule--helper.c:714
 msgid "git submodule--helper init [<options>] [<path>]"
@@ -22396,21 +22821,17 @@
 msgstr "неуспешно рекурсивно обхождане на подмодула „%s“"
 
 #: builtin/submodule--helper.c:886 builtin/submodule--helper.c:1623
-msgid "Suppress submodule status output"
-msgstr "Без изход за състоянието на подмодула"
+msgid "suppress submodule status output"
+msgstr "без изход за състоянието на подмодула"
 
 #: builtin/submodule--helper.c:887
 msgid ""
-"Use commit stored in the index instead of the one stored in the submodule "
+"use commit stored in the index instead of the one stored in the submodule "
 "HEAD"
 msgstr ""
-"Използване на подаването указано в индекса, а не това от указателя „HEAD“ на "
+"използване на подаването указано в индекса, а не това от указателя „HEAD“ на "
 "подмодула"
 
-#: builtin/submodule--helper.c:888
-msgid "recurse into nested submodules"
-msgstr "рекурсивно обхождане на подмодулите"
-
 #: builtin/submodule--helper.c:893
 msgid "git submodule status [--quiet] [--cached] [--recursive] [<path>...]"
 msgstr "git submodule status [--quiet] [--cached] [--recursive] [ПЪТ…]"
@@ -22497,8 +22918,8 @@
 msgstr "отдалеченият адрес на подмодула „%s“ не може да бъде променен"
 
 #: builtin/submodule--helper.c:1485
-msgid "Suppress output of synchronizing submodule url"
-msgstr "Без извеждане на информация при синхронизирането на подмодул"
+msgid "suppress output of synchronizing submodule url"
+msgstr "без извеждане на информация при синхронизирането на подмодул"
 
 #: builtin/submodule--helper.c:1492
 msgid "git submodule--helper sync [--quiet] [--recursive] [<path>]"
@@ -22544,14 +22965,14 @@
 msgstr "Регистрацията на подмодула „%s“ (%s) за пътя „%s“ е премахната\n"
 
 #: builtin/submodule--helper.c:1624
-msgid "Remove submodule working trees even if they contain local changes"
+msgid "remove submodule working trees even if they contain local changes"
 msgstr ""
-"Изтриване на работните дървета на подмодулите, дори когато те съдържат "
+"изтриване на работните дървета на подмодулите, дори когато те съдържат "
 "локални промени"
 
 #: builtin/submodule--helper.c:1625
-msgid "Unregister all submodules"
-msgstr "Премахване на регистрациите на всички подмодули"
+msgid "unregister all submodules"
+msgstr "премахване на регистрациите на всички подмодули"
 
 #: builtin/submodule--helper.c:1630
 msgid ""
@@ -22701,8 +23122,8 @@
 "„none“ (нищо да не се прави)"
 
 #: builtin/submodule--helper.c:2340
-msgid "Create a shallow clone truncated to the specified number of revisions"
-msgstr "Плитко клониране, отрязано до указания брой версии"
+msgid "create a shallow clone truncated to the specified number of revisions"
+msgstr "извършване на плитко клониране, отрязано до указания брой версии"
 
 #: builtin/submodule--helper.c:2343
 msgid "parallel jobs"
@@ -22772,8 +23193,8 @@
 msgstr "файлът „.gitmodules“ трябва да е в работното дърво"
 
 #: builtin/submodule--helper.c:2681
-msgid "Suppress output for setting url of a submodule"
-msgstr "Без извеждане на информация при задаването на адреса на подмодул"
+msgid "suppress output for setting url of a submodule"
+msgstr "без извеждане на информация при задаването на адреса на подмодул"
 
 #: builtin/submodule--helper.c:2685
 msgid "git submodule--helper set-url [--quiet] <path> <newurl>"
@@ -22804,7 +23225,7 @@
 msgid "--branch and --default are mutually exclusive"
 msgstr "опциите „--branch“ и „--default“ са несъвместими"
 
-#: builtin/submodule--helper.c:2792 git.c:438 git.c:711
+#: builtin/submodule--helper.c:2792 git.c:441 git.c:714
 #, c-format
 msgid "%s doesn't support --super-prefix"
 msgstr "„%s“ не поддържа опцията „--super-prefix“"
@@ -22874,12 +23295,12 @@
 msgid "tag '%s' not found."
 msgstr "етикетът „%s“ не е открит."
 
-#: builtin/tag.c:105
+#: builtin/tag.c:124
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Изтрит е етикетът „%s“ (бе „%s“)\n"
 
-#: builtin/tag.c:135
+#: builtin/tag.c:159
 #, c-format
 msgid ""
 "\n"
@@ -22892,7 +23313,7 @@
 "    %s\n"
 "Редовете, които започват с „%c“, ще бъдат пропуснати.\n"
 
-#: builtin/tag.c:139
+#: builtin/tag.c:163
 #, c-format
 msgid ""
 "\n"
@@ -22907,15 +23328,11 @@
 "Редовете, които започват с „%c“, също ще бъдат включени — може да ги "
 "изтриете вие.\n"
 
-#: builtin/tag.c:198
+#: builtin/tag.c:230
 msgid "unable to sign the tag"
 msgstr "етикетът не може да бъде подписан"
 
-#: builtin/tag.c:200
-msgid "unable to write tag file"
-msgstr "файлът за етикета не може да бъде запазен"
-
-#: builtin/tag.c:216
+#: builtin/tag.c:248
 #, c-format
 msgid ""
 "You have created a nested tag. The object referred to by your new tag is\n"
@@ -22929,138 +23346,134 @@
 "\n"
 "    git tag -f %s %s^{}"
 
-#: builtin/tag.c:232
+#: builtin/tag.c:264
 msgid "bad object type."
 msgstr "неправилен вид обект."
 
-#: builtin/tag.c:285
+#: builtin/tag.c:317
 msgid "no tag message?"
 msgstr "липсва съобщение за етикета"
 
-#: builtin/tag.c:292
+#: builtin/tag.c:324
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Съобщението за етикета е запазено във файла „%s“\n"
 
-#: builtin/tag.c:403
+#: builtin/tag.c:435
 msgid "list tag names"
 msgstr "извеждане на имената на етикетите"
 
-#: builtin/tag.c:405
+#: builtin/tag.c:437
 msgid "print <n> lines of each tag message"
 msgstr "извеждане на този БРОЙ редове от всяко съобщение за етикет"
 
-#: builtin/tag.c:407
+#: builtin/tag.c:439
 msgid "delete tags"
 msgstr "изтриване на етикети"
 
-#: builtin/tag.c:408
+#: builtin/tag.c:440
 msgid "verify tags"
 msgstr "проверка на етикети"
 
-#: builtin/tag.c:410
+#: builtin/tag.c:442
 msgid "Tag creation options"
 msgstr "Опции при създаването на етикети"
 
-#: builtin/tag.c:412
+#: builtin/tag.c:444
 msgid "annotated tag, needs a message"
 msgstr "анотирането на етикети изисква съобщение"
 
-#: builtin/tag.c:414
+#: builtin/tag.c:446
 msgid "tag message"
 msgstr "СЪОБЩЕНИЕ за етикет"
 
-#: builtin/tag.c:416
+#: builtin/tag.c:448
 msgid "force edit of tag message"
 msgstr "принудително редактиране на съобщение за етикет"
 
-#: builtin/tag.c:417
+#: builtin/tag.c:449
 msgid "annotated and GPG-signed tag"
 msgstr "анотиран етикет с подпис по GPG"
 
-#: builtin/tag.c:420
+#: builtin/tag.c:452
 msgid "use another key to sign the tag"
 msgstr "използване на друг ключ за подписването на етикет"
 
-#: builtin/tag.c:421
+#: builtin/tag.c:453
 msgid "replace the tag if exists"
 msgstr "замяна на етикета, ако съществува"
 
-#: builtin/tag.c:422 builtin/update-ref.c:505
+#: builtin/tag.c:454 builtin/update-ref.c:505
 msgid "create a reflog"
 msgstr "създаване на журнал на указателите"
 
-#: builtin/tag.c:424
+#: builtin/tag.c:456
 msgid "Tag listing options"
 msgstr "Опции за извеждането на етикети"
 
-#: builtin/tag.c:425
+#: builtin/tag.c:457
 msgid "show tag list in columns"
 msgstr "извеждане на списъка на етикетите по колони"
 
-#: builtin/tag.c:426 builtin/tag.c:428
+#: builtin/tag.c:458 builtin/tag.c:460
 msgid "print only tags that contain the commit"
 msgstr "извеждане само на етикетите, които съдържат подаването"
 
-#: builtin/tag.c:427 builtin/tag.c:429
+#: builtin/tag.c:459 builtin/tag.c:461
 msgid "print only tags that don't contain the commit"
 msgstr "извеждане само на етикетите, които не съдържат подаването"
 
-#: builtin/tag.c:430
+#: builtin/tag.c:462
 msgid "print only tags that are merged"
 msgstr "извеждане само на слетите етикети"
 
-#: builtin/tag.c:431
+#: builtin/tag.c:463
 msgid "print only tags that are not merged"
 msgstr "извеждане само на неслетите етикети"
 
-#: builtin/tag.c:435
+#: builtin/tag.c:467
 msgid "print only tags of the object"
 msgstr "извеждане само на етикетите на ОБЕКТА"
 
-#: builtin/tag.c:483
+#: builtin/tag.c:515
 msgid "--column and -n are incompatible"
 msgstr "Опциите „--column“ и „-n“ са несъвместими"
 
-#: builtin/tag.c:505
+#: builtin/tag.c:537
 msgid "-n option is only allowed in list mode"
 msgstr "Опцията „-n“ изисква режим на списък."
 
-#: builtin/tag.c:507
+#: builtin/tag.c:539
 msgid "--contains option is only allowed in list mode"
 msgstr "Опцията „-contains“ изисква режим на списък."
 
-#: builtin/tag.c:509
+#: builtin/tag.c:541
 msgid "--no-contains option is only allowed in list mode"
 msgstr "Опцията „-contains“ изисква  режим на списък."
 
-#: builtin/tag.c:511
+#: builtin/tag.c:543
 msgid "--points-at option is only allowed in list mode"
 msgstr "Опцията „-points-at“ изисква режим на списък."
 
-#: builtin/tag.c:513
+#: builtin/tag.c:545
 msgid "--merged and --no-merged options are only allowed in list mode"
 msgstr "Опциите „--merged“ и „--no-merged“ изискват режим на списък."
 
-#: builtin/tag.c:524
+#: builtin/tag.c:556
 msgid "only one -F or -m option is allowed."
 msgstr "Опциите „-F“ и „-m“ са несъвместими."
 
-#: builtin/tag.c:543
-msgid "too many params"
-msgstr "Прекалено много аргументи"
-
-#: builtin/tag.c:549
+#: builtin/tag.c:581
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "„%s“ е неправилно име за етикет."
 
-#: builtin/tag.c:554
+#: builtin/tag.c:586
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "етикетът „%s“ вече съществува"
 
-#: builtin/tag.c:585
+#: builtin/tag.c:617
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Обновен етикет „%s“ (бе „%s“)\n"
@@ -23437,91 +23850,63 @@
 msgid "print tag contents"
 msgstr "извеждане на съдържанието на ЕТИКЕТи"
 
-#: builtin/worktree.c:17
+#: builtin/worktree.c:18
 msgid "git worktree add [<options>] <path> [<commit-ish>]"
 msgstr "git worktree add [ОПЦИЯ…] ПЪТ [УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ]"
 
-#: builtin/worktree.c:18
+#: builtin/worktree.c:19
 msgid "git worktree list [<options>]"
 msgstr "git worktree list [ОПЦИЯ…]"
 
-#: builtin/worktree.c:19
+#: builtin/worktree.c:20
 msgid "git worktree lock [<options>] <path>"
 msgstr "git worktree lock [ОПЦИЯ…] [ПЪТ]"
 
-#: builtin/worktree.c:20
+#: builtin/worktree.c:21
 msgid "git worktree move <worktree> <new-path>"
 msgstr "git worktree move [ДЪРВО] [НОВ_ПЪТ]"
 
-#: builtin/worktree.c:21
+#: builtin/worktree.c:22
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [ОПЦИЯ…]"
 
-#: builtin/worktree.c:22
+#: builtin/worktree.c:23
 msgid "git worktree remove [<options>] <worktree>"
 msgstr "git worktree remove [ОПЦИЯ…] [ДЪРВО]"
 
-#: builtin/worktree.c:23
+#: builtin/worktree.c:24
 msgid "git worktree unlock <path>"
 msgstr "git worktree unlock [ПЪТ]"
 
-#: builtin/worktree.c:60 builtin/worktree.c:973
+#: builtin/worktree.c:61 builtin/worktree.c:933
 #, c-format
 msgid "failed to delete '%s'"
 msgstr "неуспешно изтриване на „%s“"
 
-#: builtin/worktree.c:85
-msgid "not a valid directory"
-msgstr "не е валидна директория"
-
-#: builtin/worktree.c:91
-msgid "gitdir file does not exist"
-msgstr "файлът „gitdir“ не съществува"
-
-#: builtin/worktree.c:96 builtin/worktree.c:105
-#, c-format
-msgid "unable to read gitdir file (%s)"
-msgstr "файлът „gitdir“ не може да бъде прочетен (%s)"
-
-#: builtin/worktree.c:115
-#, c-format
-msgid "short read (expected %<PRIuMAX> bytes, read %<PRIuMAX>)"
-msgstr ""
-"изчитането върна по-малко байтове от очакваното (очаквани: %<PRIuMAX> байта, "
-"получени: %<PRIuMAX>)"
-
-#: builtin/worktree.c:123
-msgid "invalid gitdir file"
-msgstr "неправилен файл „gitdir“"
-
-#: builtin/worktree.c:131
-msgid "gitdir file points to non-existent location"
-msgstr "файлът „gitdir“ сочи несъществуващо местоположение"
-
-#: builtin/worktree.c:146
+#: builtin/worktree.c:74
 #, c-format
 msgid "Removing %s/%s: %s"
 msgstr "Изтриване на „%s/%s“: %s"
 
-#: builtin/worktree.c:221
+#: builtin/worktree.c:149
 msgid "report pruned working trees"
 msgstr "докладване на окастрените работни дървета"
 
-#: builtin/worktree.c:223
+#: builtin/worktree.c:151
 msgid "expire working trees older than <time>"
 msgstr "обявяване на работните копия по-стари от това ВРЕМЕ за остарели"
 
-#: builtin/worktree.c:293
+#: builtin/worktree.c:221
 #, c-format
 msgid "'%s' already exists"
 msgstr "„%s“ вече съществува"
 
-#: builtin/worktree.c:302
+#: builtin/worktree.c:230
 #, c-format
 msgid "unusable worktree destination '%s'"
 msgstr "целта не може да се ползва за работно дърво: „%s“"
 
-#: builtin/worktree.c:307
+#: builtin/worktree.c:235
 #, c-format
 msgid ""
 "'%s' is a missing but locked worktree;\n"
@@ -23531,7 +23916,7 @@
 "За изрично задаване ползвайте „%s -f -f“, а за изчистване —\n"
 "„unlock“, „prune“ или „remove“"
 
-#: builtin/worktree.c:309
+#: builtin/worktree.c:237
 #, c-format
 msgid ""
 "'%s' is a missing but already registered worktree;\n"
@@ -23541,120 +23926,133 @@
 "За изрично задаване ползвайте „%s -f“, а за изчистване —\n"
 "„prune“ или „remove“"
 
-#: builtin/worktree.c:360
+#: builtin/worktree.c:288
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "директорията „%s“ не може да бъде създадена"
 
-#: builtin/worktree.c:494 builtin/worktree.c:500
+#: builtin/worktree.c:422 builtin/worktree.c:428
 #, c-format
 msgid "Preparing worktree (new branch '%s')"
 msgstr "Приготвяне на работното дърво (нов клон „%s“)"
 
-#: builtin/worktree.c:496
+#: builtin/worktree.c:424
 #, c-format
 msgid "Preparing worktree (resetting branch '%s'; was at %s)"
 msgstr ""
 "Приготвяне на работното дърво (зануляване на клона „%s“, който сочеше към "
 "„%s“)"
 
-#: builtin/worktree.c:505
+#: builtin/worktree.c:433
 #, c-format
 msgid "Preparing worktree (checking out '%s')"
 msgstr "Приготвяне на работното дърво (изтегляне на „%s“)"
 
-#: builtin/worktree.c:511
+#: builtin/worktree.c:439
 #, c-format
 msgid "Preparing worktree (detached HEAD %s)"
 msgstr "Подготвяне на работно дърво (указателят „HEAD“ не свързан: %s)"
 
-#: builtin/worktree.c:552
+#: builtin/worktree.c:480
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr "Изтегляне КЛОНа, дори и да е изтеглен в друго работно дърво"
 
-#: builtin/worktree.c:555
+#: builtin/worktree.c:483
 msgid "create a new branch"
 msgstr "създаване на нов клон"
 
-#: builtin/worktree.c:557
+#: builtin/worktree.c:485
 msgid "create or reset a branch"
 msgstr "създаване или зануляване на клони"
 
-#: builtin/worktree.c:559
+#: builtin/worktree.c:487
 msgid "populate the new working tree"
 msgstr "подготвяне на новото работно дърво"
 
-#: builtin/worktree.c:560
+#: builtin/worktree.c:488
 msgid "keep the new working tree locked"
 msgstr "новото работно дърво да остане заключено"
 
-#: builtin/worktree.c:563
+#: builtin/worktree.c:491
 msgid "set up tracking mode (see git-branch(1))"
 msgstr "задаване на режима на следене (виж git-branch(1))"
 
-#: builtin/worktree.c:566
+#: builtin/worktree.c:494
 msgid "try to match the new branch name with a remote-tracking branch"
 msgstr "опит за напасване на името на новия клон с това на следящ клон"
 
-#: builtin/worktree.c:574
+#: builtin/worktree.c:502
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "Опциите „-b“, „-B“ и „--detach“ са несъвместими една с друга"
 
-#: builtin/worktree.c:635
+#: builtin/worktree.c:563
 msgid "--[no-]track can only be used if a new branch is created"
 msgstr "„--[no-]track“ може да се използва само при създаването на нов клон"
 
-#: builtin/worktree.c:758
+#: builtin/worktree.c:680
+msgid "show extended annotations and reasons, if available"
+msgstr "извеждане на подробни анотации и обяснения, ако такива са налични"
+
+#: builtin/worktree.c:682
+msgid "add 'prunable' annotation to worktrees older than <time>"
+msgstr ""
+"добавяне на анотация за окастряне на работните копия по-стари от това ВРЕМЕ"
+
+#: builtin/worktree.c:691
+msgid "--verbose and --porcelain are mutually exclusive"
+msgstr "опциите „--verbose“ и „--porcelain“ са несъвместими"
+
+#: builtin/worktree.c:718
 msgid "reason for locking"
 msgstr "причина за заключване"
 
-#: builtin/worktree.c:770 builtin/worktree.c:803 builtin/worktree.c:877
-#: builtin/worktree.c:1001
+#: builtin/worktree.c:730 builtin/worktree.c:763 builtin/worktree.c:837
+#: builtin/worktree.c:961
 #, c-format
 msgid "'%s' is not a working tree"
 msgstr "„%s“ не е работно дърво"
 
-#: builtin/worktree.c:772 builtin/worktree.c:805
+#: builtin/worktree.c:732 builtin/worktree.c:765
 msgid "The main working tree cannot be locked or unlocked"
 msgstr "Основното дърво не може да се отключи или заключи"
 
-#: builtin/worktree.c:777
+#: builtin/worktree.c:737
 #, c-format
 msgid "'%s' is already locked, reason: %s"
 msgstr "„%s“ вече е заключено, защото „%s“"
 
-#: builtin/worktree.c:779
+#: builtin/worktree.c:739
 #, c-format
 msgid "'%s' is already locked"
 msgstr "„%s“ вече е заключено"
 
-#: builtin/worktree.c:807
+#: builtin/worktree.c:767
 #, c-format
 msgid "'%s' is not locked"
 msgstr "„%s“ не е заключено"
 
-#: builtin/worktree.c:848
+#: builtin/worktree.c:808
 msgid "working trees containing submodules cannot be moved or removed"
 msgstr ""
 "не може да местите или изтривате работни дървета, в които има подмодули"
 
-#: builtin/worktree.c:856
+#: builtin/worktree.c:816
 msgid "force move even if worktree is dirty or locked"
 msgstr ""
 "принудително преместване, дори работното дърво да не е чисто или да е "
 "заключено"
 
-#: builtin/worktree.c:879 builtin/worktree.c:1003
+#: builtin/worktree.c:839 builtin/worktree.c:963
 #, c-format
 msgid "'%s' is a main working tree"
 msgstr "„%s“ е основно работно дърво"
 
-#: builtin/worktree.c:884
+#: builtin/worktree.c:844
 #, c-format
 msgid "could not figure out destination name from '%s'"
 msgstr "името на целта не може да се определи от „%s“"
 
-#: builtin/worktree.c:897
+#: builtin/worktree.c:857
 #, c-format
 msgid ""
 "cannot move a locked working tree, lock reason: %s\n"
@@ -23663,7 +24061,7 @@
 "не може да преместите заключено работно дърво, причина за заключването: %s\n"
 "или го отключете, или го преместете принудително с „move -f -f“"
 
-#: builtin/worktree.c:899
+#: builtin/worktree.c:859
 msgid ""
 "cannot move a locked working tree;\n"
 "use 'move -f -f' to override or unlock first"
@@ -23671,41 +24069,41 @@
 "не може да преместите заключено работно дърво:\n"
 "или го отключете, или го преместете принудително с „move -f -f“"
 
-#: builtin/worktree.c:902
+#: builtin/worktree.c:862
 #, c-format
 msgid "validation failed, cannot move working tree: %s"
 msgstr ""
 "проверките са неуспешни, работното дърво не може да бъде преместено: %s"
 
-#: builtin/worktree.c:907
+#: builtin/worktree.c:867
 #, c-format
 msgid "failed to move '%s' to '%s'"
 msgstr "„%s“ не може да се премести в „%s“"
 
-#: builtin/worktree.c:953
+#: builtin/worktree.c:913
 #, c-format
 msgid "failed to run 'git status' on '%s'"
 msgstr "неуспешно изпълнение на „git status“ върху „%s“"
 
-#: builtin/worktree.c:957
+#: builtin/worktree.c:917
 #, c-format
 msgid "'%s' contains modified or untracked files, use --force to delete it"
 msgstr ""
 "„%s“ съдържа променени или нови файлове, за принудително изтриване е "
 "необходима опцията „--force“"
 
-#: builtin/worktree.c:962
+#: builtin/worktree.c:922
 #, c-format
 msgid "failed to run 'git status' on '%s', code %d"
 msgstr ""
 "командата „git status“ не може да се изпълни за „%s“, код за грешка: %d"
 
-#: builtin/worktree.c:985
+#: builtin/worktree.c:945
 msgid "force removal even if worktree is dirty or locked"
 msgstr ""
 "принудително изтриване, дори работното дърво да не е чисто или да е заключено"
 
-#: builtin/worktree.c:1008
+#: builtin/worktree.c:968
 #, c-format
 msgid ""
 "cannot remove a locked working tree, lock reason: %s\n"
@@ -23714,7 +24112,7 @@
 "не може да изтриете заключено работно дърво, причина за заключването: %s\n"
 "или го отключете, или го изтрийте принудително с „remove -f -f“"
 
-#: builtin/worktree.c:1010
+#: builtin/worktree.c:970
 msgid ""
 "cannot remove a locked working tree;\n"
 "use 'remove -f -f' to override or unlock first"
@@ -23722,17 +24120,17 @@
 "не може да изтриете заключено работно дърво:\n"
 "или го отключете, или го изтрийте принудително с „remove -f -f“"
 
-#: builtin/worktree.c:1013
+#: builtin/worktree.c:973
 #, c-format
 msgid "validation failed, cannot remove working tree: %s"
 msgstr "проверките са неуспешни, работното дърво не може да бъде изтрито: %s"
 
-#: builtin/worktree.c:1037
+#: builtin/worktree.c:997
 #, c-format
 msgid "repair: %s: %s"
 msgstr "поправяне: %s: „%s“"
 
-#: builtin/worktree.c:1040
+#: builtin/worktree.c:1000
 #, c-format
 msgid "error: %s: %s"
 msgstr "грешка: %s: „%s“"
@@ -23753,15 +24151,23 @@
 msgid "only useful for debugging"
 msgstr "само за изчистване на грешки"
 
-#: http-fetch.c:114
+#: http-fetch.c:118
 #, c-format
 msgid "argument to --packfile must be a valid hash (got '%s')"
 msgstr "опцията „--packfile“ изисква валидна контролна сума (а не „%s“)"
 
-#: http-fetch.c:122
+#: http-fetch.c:128
 msgid "not a git repository"
 msgstr "не е хранилище на Git"
 
+#: http-fetch.c:134
+msgid "--packfile requires --index-pack-args"
+msgstr "опцията „--packfile“ изисква опция „--index-pack-args“"
+
+#: http-fetch.c:143
+msgid "--index-pack-args can only be used with --packfile"
+msgstr "опцията „--index-pack-args“ изисква опция „--packfile“"
+
 #: t/helper/test-fast-rebase.c:141
 msgid "unhandled options"
 msgstr "неподдържани опции"
@@ -23794,15 +24200,18 @@
 "           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--"
 "bare]\n"
 "           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]\n"
+"           [--super-prefix=<path>] [--config-env=<name>=<envvar>]\n"
 "           <command> [<args>]"
 msgstr ""
 "git [--version] [--help] [-C ПЪТ] [-c ИМЕ=СТОЙНОСТ]\n"
 "           [--exec-path[=ПЪТ]] [--html-path] [--man-path] [--info-path]\n"
-"           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]\n"
+"           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--"
+"bare]\n"
 "           [--git-dir=ПЪТ] [--work-tree=ПЪТ] [--namespace=ИМЕ]\n"
+"           [--super-prefix=ПЪТ] [--config-env=ИМЕ=ПРОМЕНЛИВА_НА_СРЕДАТА]\n"
 "           КОМАНДА [АРГ…]"
 
-#: git.c:35
+#: git.c:36
 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"
@@ -23816,47 +24225,47 @@
 "някое определено ПОНЯТИЕ използвайте „git help ПОНЯТИЕ“.  За преглед на\n"
 "системата за помощ използвайте „git help git“."
 
-#: git.c:187
+#: git.c:188
 #, c-format
 msgid "no directory given for --git-dir\n"
 msgstr "опцията „--git-dir“ изисква директория\n"
 
-#: git.c:201
+#: git.c:202
 #, c-format
 msgid "no namespace given for --namespace\n"
 msgstr "опцията „--namespace“ изисква име\n"
 
-#: git.c:215
+#: git.c:216
 #, c-format
 msgid "no directory given for --work-tree\n"
 msgstr "опцията „--work-tree“ изисква директория\n"
 
-#: git.c:229
+#: git.c:230
 #, c-format
 msgid "no prefix given for --super-prefix\n"
 msgstr "опцията „--super-prefix“ изисква префикс\n"
 
-#: git.c:251
+#: git.c:252
 #, c-format
 msgid "-c expects a configuration string\n"
 msgstr "опцията „-c“ изисква низ за настройка\n"
 
-#: git.c:289
+#: git.c:292
 #, c-format
 msgid "no directory given for -C\n"
 msgstr "опцията „-C“ изисква директория\n"
 
-#: git.c:315
+#: git.c:318
 #, c-format
 msgid "unknown option: %s\n"
 msgstr "непозната опция: „%s“\n"
 
-#: git.c:364
+#: git.c:367
 #, c-format
 msgid "while expanding alias '%s': '%s'"
 msgstr "при заместването на псевдоним „%s“: „%s“"
 
-#: git.c:373
+#: git.c:376
 #, c-format
 msgid ""
 "alias '%s' changes environment variables.\n"
@@ -23865,39 +24274,39 @@
 "псевдонимът „%s“ променя променливи на средата.\n"
 "За това може да ползвате „!git“ в псевдонима"
 
-#: git.c:380
+#: git.c:383
 #, c-format
 msgid "empty alias for %s"
 msgstr "празен псевдоним за „%s“"
 
-#: git.c:383
+#: git.c:386
 #, c-format
 msgid "recursive alias: %s"
 msgstr "зациклен псевдоним: „%s“"
 
-#: git.c:465
+#: git.c:468
 msgid "write failure on standard output"
 msgstr "грешка при запис на стандартния изход"
 
-#: git.c:467
+#: git.c:470
 msgid "unknown write failure on standard output"
 msgstr "неизвестна грешка при запис на стандартния изход"
 
-#: git.c:469
+#: git.c:472
 msgid "close failed on standard output"
 msgstr "грешка при затваряне на стандартния изход"
 
-#: git.c:820
+#: git.c:823
 #, c-format
 msgid "alias loop detected: expansion of '%s' does not terminate:%s"
 msgstr "зацикляне в псевдонимите: заместванията на „%s“ не приключват:%s"
 
-#: git.c:870
+#: git.c:873
 #, c-format
 msgid "cannot handle %s as a builtin"
 msgstr "„%s“ не може да се обработи като вградена команда"
 
-#: git.c:883
+#: git.c:886
 #, c-format
 msgid ""
 "usage: %s\n"
@@ -23906,14 +24315,14 @@
 "употреба: %s\n"
 "\n"
 
-#: git.c:903
+#: git.c:906
 #, c-format
 msgid "expansion of alias '%s' failed; '%s' is not a git command\n"
 msgstr ""
 "неуспешно заместване на псевдонима „%s“ — резултатът „%s“ не е команда на "
 "git\n"
 
-#: git.c:915
+#: git.c:918
 #, c-format
 msgid "failed to run command '%s': %s\n"
 msgstr "командата „%s“ не може да се изпълни: %s\n"
@@ -24162,11 +24571,11 @@
 "при ползването на „--pathspec-from-file“, пътищата са разделени с нулевия "
 "знак „NUL“"
 
-#: ref-filter.h:96
+#: ref-filter.h:99
 msgid "key"
 msgstr "КЛЮЧ"
 
-#: ref-filter.h:96
+#: ref-filter.h:99
 msgid "field name to sort on"
 msgstr "име на полето, по което да е подредбата"
 
@@ -24176,14 +24585,6 @@
 "при възможност преизползване на решението на конфликта за обновяване на "
 "индекса"
 
-#: wt-status.h:80
-msgid "HEAD detached at "
-msgstr "Указателят „HEAD“ не е свързан и е при "
-
-#: wt-status.h:81
-msgid "HEAD detached from "
-msgstr "Указателят „HEAD“ не е свързан и е отделѐн от "
-
 #: command-list.h:50
 msgid "Add file contents to the index"
 msgstr "Добавяне на съдържанието на файла към индекса"
@@ -24529,8 +24930,8 @@
 msgstr "Запис и проверка на индексите за множество пакети"
 
 #: command-list.h:132
-msgid "Creates a tag object"
-msgstr "Създаване на обект-етикет"
+msgid "Creates a tag object with extra validation"
+msgstr "Създаване на обект-етикет с допълнителни проверки"
 
 #: command-list.h:133
 msgid "Build a tree-object from ls-tree formatted text"
@@ -24838,72 +25239,55 @@
 msgstr "Указване на неследени файлове, които да бъдат нарочно пренебрегвани"
 
 #: command-list.h:209
+msgid "Map author/committer names and/or E-Mail addresses"
+msgstr "Съответствия на имена на автор/подаващ и/или адреси на е-поща"
+
+#: command-list.h:210
 msgid "Defining submodule properties"
 msgstr "Дефиниране на свойствата на подмодулите"
 
-#: command-list.h:210
+#: command-list.h:211
 msgid "Git namespaces"
 msgstr "Пространства от имена на Git"
 
-#: command-list.h:211
+#: command-list.h:212
 msgid "Helper programs to interact with remote repositories"
 msgstr "Помощни програми за работа с отдалечените хранилища"
 
-#: command-list.h:212
+#: command-list.h:213
 msgid "Git Repository Layout"
 msgstr "Устройство на хранилището на Git"
 
-#: command-list.h:213
+#: command-list.h:214
 msgid "Specifying revisions and ranges for Git"
 msgstr "Указване на версии и диапазони в Git"
 
-#: command-list.h:214
+#: command-list.h:215
 msgid "Mounting one repository inside another"
 msgstr "Монтиране на едно хранилище в друго"
 
-#: command-list.h:215
+#: command-list.h:216
 msgid "A tutorial introduction to Git: part two"
 msgstr "Въвеждащ урок за Git: втора част"
 
-#: command-list.h:216
+#: command-list.h:217
 msgid "A tutorial introduction to Git"
 msgstr "Въвеждащ урок за Git"
 
-#: command-list.h:217
+#: command-list.h:218
 msgid "An overview of recommended workflows with Git"
 msgstr "Общ преглед на препоръчваните начини за работа с Git"
 
-#: git-bisect.sh:48
-#, sh-format
-msgid "Bad rev input: $arg"
-msgstr "Неправилна версия: „${arg}“"
-
-#: git-bisect.sh:82
-msgid "No logfile given"
-msgstr "Не е зададен журнален файл"
-
-#: git-bisect.sh:83
-#, sh-format
-msgid "cannot read $file for replaying"
-msgstr ""
-"Журналният файл „${file}“ не може да бъде прочетен, за да се изпълнят "
-"командите от него наново"
-
-#: git-bisect.sh:105
-msgid "?? what are you talking about?"
-msgstr ""
-"Непозната команда.  Възможните варианти са: „start“, „good“, „bad“, „skip“"
-
-#: git-bisect.sh:115
+#: git-bisect.sh:68
 msgid "bisect run failed: no command provided."
 msgstr "неуспешно двоично търсене, не е зададена команда."
 
-#: git-bisect.sh:120
+#: git-bisect.sh:73
 #, sh-format
 msgid "running $command"
 msgstr "изпълнение на командата „${command}“"
 
-#: git-bisect.sh:127
+#: git-bisect.sh:80
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -24913,11 +25297,11 @@
 "изходният код от командата „${command}“ е ${res} — това е извън интервала "
 "[0, 128)"
 
-#: git-bisect.sh:152
+#: git-bisect.sh:105
 msgid "bisect run cannot continue any more"
 msgstr "двоичното търсене не може да продължи"
 
-#: git-bisect.sh:158
+#: git-bisect.sh:111
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -24926,14 +25310,10 @@
 "неуспешно двоично търсене:\n"
 "функцията „bisect-state ${state}“ завърши с код за грешка ${res}"
 
-#: git-bisect.sh:165
+#: git-bisect.sh:118
 msgid "bisect run success"
 msgstr "успешно двоично търсене"
 
-#: git-bisect.sh:173
-msgid "We are not bisecting."
-msgstr "В момента не се извършва двоично търсене."
-
 #: git-merge-octopus.sh:46
 msgid ""
 "Error: Your local changes to the following files would be overwritten by "
diff --git a/po/ca.po b/po/ca.po
index 2131ed7..cd60e5b 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -14,7 +14,7 @@
 #   chunk            |  fragment
 #   delta            |  diferència
 #   deprecated       |  en desús
-#   dry              |  simulació
+#   dry-run          |  fer una prova
 #   fatal            |  fatal
 #   flush            |  buidar / buidatge
 #   hook             |  lligam
@@ -9865,7 +9865,7 @@
 #: builtin/prune-packed.c:14 builtin/pull.c:204 builtin/push.c:559
 #: builtin/remote.c:1427 builtin/rm.c:242 builtin/send-pack.c:190
 msgid "dry run"
-msgstr "marxa en sec"
+msgstr "fer una prova"
 
 #: builtin/add.c:331
 msgid "interactive picking"
@@ -9916,8 +9916,7 @@
 #: builtin/add.c:345
 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"
+"comproveu si els fitxers, fins i tot els absents, s'ignoren en una fer una prova"
 
 #: builtin/add.c:347 builtin/update-index.c:1004
 msgid "override the executable bit of the listed files"
@@ -13303,7 +13302,7 @@
 "with '%c' will be ignored, and an empty message aborts the commit.\n"
 msgstr ""
 "Introduïu el missatge de comissió dels vostres canvis.\n"
-"S'ignoraran les línies que comencin amb «%c», i un missatge de\n"
+"S'ignoraran les línies que comencin amb «%c». Un missatge de\n"
 "comissió buit avorta la comissió.\n"
 
 #: builtin/commit.c:876
@@ -13554,7 +13553,7 @@
 
 #: builtin/commit.c:1509
 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)"
+msgstr "l'autor de la comissió soc jo ara (s'usa amb -C/-c/--amend)"
 
 #: builtin/commit.c:1510 builtin/log.c:1744 builtin/merge.c:301
 #: builtin/pull.c:145 builtin/revert.c:110
@@ -15394,7 +15393,7 @@
 #: builtin/gc.c:708
 msgid ""
 "git maintenance run [--auto] [--[no-]quiet] [--task=<task>] [--schedule]"
-msgstr 
+msgstr ""
 "git maintenance run [--auto] [--[no-]quiet] [--task=<task>] [--schedule]"
 
 #: builtin/gc.c:738
@@ -18758,17 +18757,17 @@
 "invocation.\n"
 msgstr ""
 "Baixar sense especificar com conciliar branques divergents està\n"
-"desaconsellat. Podeu desactivar aquest missatge executant una de les següents\n"
-"comandes abans de la propera baixada:\n"
+"desaconsellat. Podeu desactivar aquest missatge executant una de les\n"
+"següents ordres abans de la propera baixada:\n"
 "\n"
 "  git config pull.rebase false  # merge (estratègia per defecte)\n"
 "  git config pull.rebase true   # rebase\n"
 "  git config pull.ff only       # només fast-forward\n"
 "\n"
-"Podeu reemplaçar «git config» per «git config --global» per a establir una preferència\n"
-"per defecte per a tots els dipòsits. Podeu també usar -rebase, --no-rebase,\n"
-"o --ff-only en la línia d'ordres per sobreescriure el valor per defecte configuratW\n"
-"en aquesta execució.\n"
+"Podeu reemplaçar «git config» per «git config --global» per a establir una\n"
+"preferència per defecte per a tots els dipòsits. Podeu també usar --rebase,\n"
+"--no-rebase o --ff-only en la línia d'ordres per sobreescriure el valor\n"
+"per defecte configuració en aquesta execució.\n"
 
 #: builtin/pull.c:458
 msgid ""
diff --git a/po/de.po b/po/de.po
index e1f4149..aff78ea 100644
--- a/po/de.po
+++ b/po/de.po
@@ -8,8 +8,8 @@
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2020-12-21 07:10+0800\n"
-"PO-Revision-Date: 2020-12-19 14:01+0100\n"
+"POT-Creation-Date: 2021-03-04 22:41+0800\n"
+"PO-Revision-Date: 2021-03-03 20:13+0100\n"
 "Last-Translator: Matthias Rüster <matthias.ruester@gmail.com>\n"
 "Language-Team: Matthias Rüster <matthias.ruester@gmail.com>\n"
 "Language: de\n"
@@ -17,15 +17,16 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"X-Generator: Poedit 2.4.2\n"
 
 #: add-interactive.c:376
 #, c-format
 msgid "Huh (%s)?"
 msgstr "Wie bitte (%s)?"
 
-#: add-interactive.c:529 add-interactive.c:830 reset.c:65 sequencer.c:3284
-#: sequencer.c:3735 sequencer.c:3890 builtin/rebase.c:1532
-#: builtin/rebase.c:1955
+#: add-interactive.c:529 add-interactive.c:830 reset.c:65 sequencer.c:3292
+#: sequencer.c:3743 sequencer.c:3898 builtin/rebase.c:1538
+#: builtin/rebase.c:1963
 msgid "could not read index"
 msgstr "Index konnte nicht gelesen werden"
 
@@ -53,9 +54,9 @@
 msgid "could not stage '%s'"
 msgstr "Konnte '%s' nicht zum Commit vormerken."
 
-#: add-interactive.c:703 add-interactive.c:892 reset.c:89 sequencer.c:3478
+#: add-interactive.c:703 add-interactive.c:892 reset.c:89 sequencer.c:3486
 msgid "could not write index"
-msgstr "Konnte Index nicht schreiben."
+msgstr "konnte Index nicht schreiben"
 
 #: add-interactive.c:706 git-add--interactive.perl:626
 #, c-format, perl-format
@@ -97,7 +98,7 @@
 
 #: add-interactive.c:868 git-add--interactive.perl:687
 msgid "Add untracked"
-msgstr "unversionierte Dateien hinzufügen"
+msgstr "Unversionierte Dateien hinzufügen"
 
 #: add-interactive.c:895 git-add--interactive.perl:623
 #, c-format, perl-format
@@ -211,7 +212,7 @@
 
 #: add-interactive.c:1144 apply.c:4987 apply.c:4990 builtin/am.c:2257
 #: builtin/am.c:2260 builtin/bugreport.c:134 builtin/clone.c:124
-#: builtin/fetch.c:147 builtin/merge.c:284 builtin/pull.c:190
+#: builtin/fetch.c:150 builtin/merge.c:285 builtin/pull.c:190
 #: builtin/submodule--helper.c:409 builtin/submodule--helper.c:1818
 #: builtin/submodule--helper.c:1821 builtin/submodule--helper.c:2326
 #: builtin/submodule--helper.c:2329 builtin/submodule--helper.c:2572
@@ -818,7 +819,7 @@
 msgid "Exiting because of an unresolved conflict."
 msgstr "Beende wegen unaufgelöstem Konflikt."
 
-#: advice.c:281 builtin/merge.c:1369
+#: advice.c:281 builtin/merge.c:1370
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert)."
 
@@ -901,18 +902,15 @@
 
 #: apply.c:140
 msgid "--3way outside a repository"
-msgstr ""
-"Die Option --3way kann nicht außerhalb eines Repositories verwendet werden."
+msgstr "--3way kann nicht außerhalb eines Repositories verwendet werden"
 
 #: apply.c:151
 msgid "--index outside a repository"
-msgstr ""
-"Die Option --index kann nicht außerhalb eines Repositories verwendet werden."
+msgstr "--index kann nicht außerhalb eines Repositories verwendet werden"
 
 #: apply.c:154
 msgid "--cached outside a repository"
-msgstr ""
-"Die Option --cached kann nicht außerhalb eines Repositories verwendet werden."
+msgstr "--cached kann nicht außerhalb eines Repositories verwendet werden"
 
 #: apply.c:801
 #, c-format
@@ -927,7 +925,7 @@
 #: apply.c:884
 #, c-format
 msgid "unable to find filename in patch at line %d"
-msgstr "Konnte keinen Dateinamen in Zeile %d des Patches finden."
+msgstr "konnte keinen Dateinamen in Zeile %d des Patches finden"
 
 #: apply.c:922
 #, c-format
@@ -1132,7 +1130,8 @@
 msgid "cannot checkout %s"
 msgstr "kann %s nicht auschecken"
 
-#: apply.c:3405 apply.c:3416 apply.c:3462 midx.c:73 setup.c:308
+#: apply.c:3405 apply.c:3416 apply.c:3462 midx.c:86 pack-revindex.c:213
+#: setup.c:308
 #, c-format
 msgid "failed to read %s"
 msgstr "Fehler beim Lesen von %s"
@@ -1293,7 +1292,7 @@
 msgid "unable to add cache entry for %s"
 msgstr "kann für %s keinen Eintrag in den Zwischenspeicher hinzufügen"
 
-#: apply.c:4374 builtin/bisect--helper.c:524
+#: apply.c:4374 builtin/bisect--helper.c:523
 #, c-format
 msgid "failed to write to '%s'"
 msgstr "Fehler beim Schreiben nach '%s'"
@@ -1329,7 +1328,7 @@
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "Verkürze Name von .rej Datei zu %.*s.rej"
 
-#: apply.c:4576 builtin/fetch.c:927 builtin/fetch.c:1228
+#: apply.c:4576 builtin/fetch.c:933 builtin/fetch.c:1334
 #, c-format
 msgid "cannot open %s"
 msgstr "kann '%s' nicht öffnen"
@@ -1383,7 +1382,7 @@
 msgstr[0] "%d Zeile nach Behebung von Whitespace-Fehlern angewendet."
 msgstr[1] "%d Zeilen nach Behebung von Whitespace-Fehlern angewendet."
 
-#: apply.c:4960 builtin/add.c:618 builtin/mv.c:304 builtin/rm.c:406
+#: apply.c:4960 builtin/add.c:626 builtin/mv.c:304 builtin/rm.c:406
 msgid "Unable to write new index file"
 msgstr "Konnte neue Index-Datei nicht schreiben."
 
@@ -1412,8 +1411,7 @@
 #: apply.c:4999
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr ""
-"anstatt der Anwendung des Patches, den \"diffstat\" für die Eingabe "
-"ausgegeben"
+"statt den Patch anzuwenden, den \"diffstat\" für die Eingabe ausgegeben"
 
 #: apply.c:5003
 msgid "show number of added and deleted lines in decimal notation"
@@ -1423,13 +1421,12 @@
 #: apply.c:5005
 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"
+"statt den Patch anzuwenden, eine Zusammenfassung für die Eingabe ausgeben"
 
 #: apply.c:5007
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr ""
-"anstatt der Anwendung des Patches, zeige ob Patch angewendet werden kann"
+"statt den Patch anzuwenden, anzeigen ob der Patch angewendet werden kann"
 
 #: apply.c:5009
 msgid "make sure the patch is applicable to the current index"
@@ -1463,7 +1460,7 @@
 "einen temporären Index, basierend auf den integrierten Index-Informationen, "
 "erstellen"
 
-#: apply.c:5025 builtin/checkout-index.c:182 builtin/ls-files.c:525
+#: apply.c:5025 builtin/checkout-index.c:195 builtin/ls-files.c:540
 msgid "paths are separated with NUL character"
 msgstr "Pfade sind getrennt durch NUL Zeichen"
 
@@ -1474,7 +1471,7 @@
 
 #: apply.c:5028 builtin/am.c:2245 builtin/interpret-trailers.c:98
 #: builtin/interpret-trailers.c:100 builtin/interpret-trailers.c:102
-#: builtin/pack-objects.c:3562 builtin/rebase.c:1346
+#: builtin/pack-objects.c:3577 builtin/rebase.c:1352
 msgid "action"
 msgstr "Aktion"
 
@@ -1503,9 +1500,9 @@
 msgid "allow overlapping hunks"
 msgstr "sich überlappende Patch-Blöcke erlauben"
 
-#: apply.c:5045 builtin/add.c:329 builtin/check-ignore.c:22
-#: builtin/commit.c:1364 builtin/count-objects.c:98 builtin/fsck.c:775
-#: builtin/log.c:2287 builtin/mv.c:123 builtin/read-tree.c:128
+#: apply.c:5045 builtin/add.c:337 builtin/check-ignore.c:22
+#: builtin/commit.c:1364 builtin/count-objects.c:98 builtin/fsck.c:757
+#: builtin/log.c:2286 builtin/mv.c:123 builtin/read-tree.c:128
 msgid "be verbose"
 msgstr "erweiterte Ausgaben"
 
@@ -1593,14 +1590,14 @@
 msgid "cannot read %s"
 msgstr "Kann %s nicht lesen."
 
-#: archive.c:345 sequencer.c:459 sequencer.c:1736 sequencer.c:2886
-#: sequencer.c:3327 sequencer.c:3436 builtin/am.c:249 builtin/commit.c:786
-#: builtin/merge.c:1138
+#: archive.c:345 sequencer.c:459 sequencer.c:1744 sequencer.c:2894
+#: sequencer.c:3335 sequencer.c:3444 builtin/am.c:249 builtin/commit.c:786
+#: builtin/merge.c:1139
 #, c-format
 msgid "could not read '%s'"
 msgstr "Konnte '%s' nicht lesen"
 
-#: archive.c:430 builtin/add.c:181 builtin/add.c:594 builtin/rm.c:315
+#: archive.c:430 builtin/add.c:189 builtin/add.c:602 builtin/rm.c:315
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein"
@@ -1608,7 +1605,7 @@
 #: archive.c:454
 #, c-format
 msgid "no such ref: %.*s"
-msgstr "Keine solche Referenz: %.*s"
+msgstr "Referenz nicht gefunden: %.*s"
 
 #: archive.c:460
 #, c-format
@@ -1642,7 +1639,7 @@
 msgid "archive format"
 msgstr "Archivformat"
 
-#: archive.c:556 builtin/log.c:1765
+#: archive.c:556 builtin/log.c:1764
 msgid "prefix"
 msgstr "Präfix"
 
@@ -1650,11 +1647,11 @@
 msgid "prepend prefix to each pathname in the archive"
 msgstr "einen Präfix vor jeden Pfadnamen in dem Archiv stellen"
 
-#: archive.c:558 archive.c:561 builtin/blame.c:886 builtin/blame.c:890
-#: builtin/blame.c:891 builtin/commit-tree.c:117 builtin/config.c:135
+#: archive.c:558 archive.c:561 builtin/blame.c:884 builtin/blame.c:888
+#: builtin/blame.c:889 builtin/commit-tree.c:117 builtin/config.c:135
 #: builtin/fast-export.c:1207 builtin/fast-export.c:1209
-#: builtin/fast-export.c:1213 builtin/grep.c:919 builtin/hash-object.c:105
-#: builtin/ls-files.c:561 builtin/ls-files.c:564 builtin/notes.c:412
+#: builtin/fast-export.c:1213 builtin/grep.c:920 builtin/hash-object.c:105
+#: builtin/ls-files.c:576 builtin/ls-files.c:579 builtin/notes.c:412
 #: builtin/notes.c:578 builtin/read-tree.c:123 parse-options.h:190
 msgid "file"
 msgstr "Datei"
@@ -1707,7 +1704,7 @@
 
 #: archive.c:584
 msgid "Option --exec can only be used together with --remote"
-msgstr "Die Option --exec kann nur zusammen mit --remote verwendet werden."
+msgstr "Die Option --exec kann nur zusammen mit --remote verwendet werden"
 
 #: archive.c:586
 msgid "Unexpected option --output"
@@ -1716,7 +1713,7 @@
 #: archive.c:588
 msgid "Options --add-file and --remote cannot be used together"
 msgstr ""
-"Die Optionen --add-file und --remote können nicht gemeinsam verwendet werden."
+"Die Optionen --add-file und --remote können nicht gemeinsam verwendet werden"
 
 #: archive.c:610
 #, c-format
@@ -1821,12 +1818,12 @@
 msgid "a %s revision is needed"
 msgstr "ein %s Commit wird benötigt"
 
-#: bisect.c:941 builtin/notes.c:177 builtin/tag.c:255
+#: bisect.c:941 builtin/notes.c:177 builtin/tag.c:287
 #, c-format
 msgid "could not create file '%s'"
 msgstr "konnte Datei '%s' nicht erstellen"
 
-#: bisect.c:987 builtin/merge.c:152
+#: bisect.c:987 builtin/merge.c:153
 #, c-format
 msgid "could not read file '%s'"
 msgstr "Konnte Datei '%s' nicht lesen"
@@ -1844,10 +1841,10 @@
 #, c-format
 msgid ""
 "No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
+"Maybe you started with bad path arguments?\n"
 msgstr ""
 "Kein testbarer Commit gefunden.\n"
-"Vielleicht starteten Sie mit falschen Pfad-Parametern?\n"
+"Vielleicht starteten Sie mit schlechten Pfad-Argumenten?\n"
 
 #: bisect.c:1095
 #, c-format
@@ -1882,11 +1879,11 @@
 "endgültigen\n"
 "Commits"
 
-#: blame.c:2821 bundle.c:213 ref-filter.c:2272 remote.c:2031 sequencer.c:2138
-#: sequencer.c:4633 submodule.c:855 builtin/commit.c:1045 builtin/log.c:409
-#: builtin/log.c:1023 builtin/log.c:1625 builtin/log.c:2046 builtin/log.c:2336
-#: builtin/merge.c:423 builtin/pack-objects.c:3380 builtin/pack-objects.c:3395
-#: builtin/shortlog.c:267
+#: blame.c:2821 bundle.c:213 ref-filter.c:2206 remote.c:2041 sequencer.c:2146
+#: sequencer.c:4641 submodule.c:856 builtin/commit.c:1045 builtin/log.c:411
+#: builtin/log.c:1016 builtin/log.c:1624 builtin/log.c:2045 builtin/log.c:2335
+#: builtin/merge.c:424 builtin/pack-objects.c:3395 builtin/pack-objects.c:3410
+#: builtin/shortlog.c:255
 msgid "revision walk setup failed"
 msgstr "Einrichtung des Revisionsgangs fehlgeschlagen"
 
@@ -1900,7 +1897,7 @@
 #: blame.c:2850
 #, c-format
 msgid "no such path %s in %s"
-msgstr "Pfad %s nicht in %s"
+msgstr "Pfad %s nicht in %s gefunden"
 
 #: blame.c:2861
 #, c-format
@@ -2069,7 +2066,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr "nicht erkannter Kopfbereich: %s%s (%d)"
 
-#: bundle.c:136 rerere.c:480 rerere.c:690 sequencer.c:2390 sequencer.c:3176
+#: bundle.c:136 rerere.c:464 rerere.c:674 sequencer.c:2398 sequencer.c:3184
 #: builtin/commit.c:814
 #, c-format
 msgid "could not open '%s'"
@@ -2113,279 +2110,292 @@
 msgid "pack-objects died"
 msgstr "Erstellung der Paketobjekte abgebrochen"
 
-#: bundle.c:379
-msgid "rev-list died"
-msgstr "\"rev-list\" abgebrochen"
-
-#: bundle.c:428
+#: bundle.c:386
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen"
 
-#: bundle.c:498
+#: bundle.c:490
 #, c-format
 msgid "unsupported bundle version %d"
 msgstr "nicht unterstützte Paket-Version %d"
 
-#: bundle.c:500
+#: bundle.c:492
 #, c-format
 msgid "cannot write bundle version %d with algorithm %s"
 msgstr "kann Paket-Version %d nicht mit Algorithmus %s schreiben"
 
-#: bundle.c:522 builtin/log.c:209 builtin/log.c:1927 builtin/shortlog.c:408
+#: bundle.c:510 builtin/log.c:210 builtin/log.c:1926 builtin/shortlog.c:396
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "nicht erkanntes Argument: %s"
 
-#: bundle.c:530
+#: bundle.c:539
 msgid "Refusing to create empty bundle."
 msgstr "Erstellung eines leeren Pakets zurückgewiesen."
 
-#: bundle.c:540
+#: bundle.c:549
 #, c-format
 msgid "cannot create '%s'"
 msgstr "kann '%s' nicht erstellen"
 
-#: bundle.c:565
+#: bundle.c:574
 msgid "index-pack died"
 msgstr "Erstellung der Paketindexdatei abgebrochen"
 
+#: chunk-format.c:113
+msgid "terminating chunk id appears earlier than expected"
+msgstr "abschließende Chunk-ID erscheint eher als erwartet"
+
+#: chunk-format.c:122
+#, c-format
+msgid "improper chunk offset(s) %<PRIx64> and %<PRIx64>"
+msgstr "unzulässige(r) Chunk-Offset(s) %<PRIx64> und %<PRIx64>"
+
+#: chunk-format.c:129
+#, c-format
+msgid "duplicate chunk ID %<PRIx32> found"
+msgstr "doppelte Chunk-ID %<PRIx32> gefunden"
+
+#: chunk-format.c:143
+#, c-format
+msgid "final chunk has non-zero id %<PRIx32>"
+msgstr "letzter Chunk hat nicht-Null ID %<PRIx32>"
+
 #: color.c:329
 #, c-format
 msgid "invalid color value: %.*s"
 msgstr "Ungültiger Farbwert: %.*s"
 
-#: commit-graph.c:188 midx.c:47
+#: commit-graph.c:197 midx.c:46
 msgid "invalid hash version"
 msgstr "ungültige Hash-Version"
 
-#: commit-graph.c:246
+#: commit-graph.c:255
 msgid "commit-graph file is too small"
-msgstr "Commit-Graph-Datei ist zu klein."
+msgstr "Commit-Graph-Datei ist zu klein"
 
-#: commit-graph.c:311
+#: commit-graph.c:348
 #, c-format
 msgid "commit-graph signature %X does not match signature %X"
 msgstr "Commit-Graph-Signatur %X stimmt nicht mit Signatur %X überein."
 
-#: commit-graph.c:318
+#: commit-graph.c:355
 #, c-format
 msgid "commit-graph version %X does not match version %X"
 msgstr "Commit-Graph-Version %X stimmt nicht mit Version %X überein."
 
-#: commit-graph.c:325
+#: commit-graph.c:362
 #, c-format
 msgid "commit-graph hash version %X does not match version %X"
 msgstr "Hash-Version des Commit-Graph %X stimmt nicht mit Version %X überein."
 
-#: commit-graph.c:342
+#: commit-graph.c:379
 #, c-format
 msgid "commit-graph file is too small to hold %u chunks"
 msgstr "Commit-Graph-Datei ist zu klein, um %u Chunks zu enthalten"
 
-#: commit-graph.c:361
-#, c-format
-msgid "commit-graph improper chunk offset %08x%08x"
-msgstr "Unzulässiger Commit-Graph Chunk-Offset %08x%08x"
-
-#: commit-graph.c:433
-#, c-format
-msgid "commit-graph chunk id %08x appears multiple times"
-msgstr "Commit-Graph Chunk-Id %08x kommt mehrfach vor."
-
-#: commit-graph.c:499
+#: commit-graph.c:472
 msgid "commit-graph has no base graphs chunk"
 msgstr "Commit-Graph hat keinen Basis-Graph-Chunk"
 
-#: commit-graph.c:509
+#: commit-graph.c:482
 msgid "commit-graph chain does not match"
 msgstr "Commit-Graph Verkettung stimmt nicht überein."
 
-#: commit-graph.c:557
+#: commit-graph.c:530
 #, c-format
 msgid "invalid commit-graph chain: line '%s' not a hash"
 msgstr "Ungültige Commit-Graph Verkettung: Zeile '%s' ist kein Hash"
 
-#: commit-graph.c:581
+#: commit-graph.c:554
 msgid "unable to find all commit-graph files"
 msgstr "Konnte nicht alle Commit-Graph-Dateien finden."
 
-#: commit-graph.c:721 commit-graph.c:785
+#: commit-graph.c:735 commit-graph.c:772
 msgid "invalid commit position. commit-graph is likely corrupt"
 msgstr "Ungültige Commit-Position. Commit-Graph ist wahrscheinlich beschädigt."
 
-#: commit-graph.c:742
+#: commit-graph.c:756
 #, c-format
 msgid "could not find commit %s"
 msgstr "Konnte Commit %s nicht finden."
 
-#: commit-graph.c:1036 builtin/am.c:1292
+#: commit-graph.c:789
+msgid "commit-graph requires overflow generation data but has none"
+msgstr "Commit-Graph erfordert Überlaufgenerierungsdaten, aber hat keine"
+
+#: commit-graph.c:1065 builtin/am.c:1292
 #, c-format
 msgid "unable to parse commit %s"
 msgstr "Konnte Commit '%s' nicht parsen."
 
-#: commit-graph.c:1252 builtin/pack-objects.c:2864
+#: commit-graph.c:1327 builtin/pack-objects.c:2872
 #, c-format
 msgid "unable to get type of object %s"
 msgstr "Konnte Art von Objekt '%s' nicht bestimmen."
 
-#: commit-graph.c:1283
+#: commit-graph.c:1358
 msgid "Loading known commits in commit graph"
 msgstr "Lade bekannte Commits in Commit-Graph"
 
-#: commit-graph.c:1300
+#: commit-graph.c:1375
 msgid "Expanding reachable commits in commit graph"
 msgstr "Erweitere erreichbare Commits in Commit-Graph"
 
-#: commit-graph.c:1320
+#: commit-graph.c:1395
 msgid "Clearing commit marks in commit graph"
 msgstr "Lösche Commit-Markierungen in Commit-Graph"
 
-#: commit-graph.c:1339
+#: commit-graph.c:1414
+msgid "Computing commit graph topological levels"
+msgstr "Topologische Ebenen des Commit-Graph werden berechnet"
+
+#: commit-graph.c:1467
 msgid "Computing commit graph generation numbers"
 msgstr "Commit-Graph Generationsnummern berechnen"
 
-#: commit-graph.c:1406
+#: commit-graph.c:1548
 msgid "Computing commit changed paths Bloom filters"
 msgstr "Berechnung der Bloom-Filter für veränderte Pfade des Commits"
 
-#: commit-graph.c:1483
+#: commit-graph.c:1625
 msgid "Collecting referenced commits"
 msgstr "Sammle referenzierte Commits"
 
-#: commit-graph.c:1508
+#: commit-graph.c:1650
 #, c-format
 msgid "Finding commits for commit graph in %d pack"
 msgid_plural "Finding commits for commit graph in %d packs"
 msgstr[0] "Suche Commits für Commit-Graph in %d Paket"
 msgstr[1] "Suche Commits für Commit-Graph in %d Paketen"
 
-#: commit-graph.c:1521
+#: commit-graph.c:1663
 #, c-format
 msgid "error adding pack %s"
 msgstr "Fehler beim Hinzufügen von Paket %s."
 
-#: commit-graph.c:1525
+#: commit-graph.c:1667
 #, c-format
 msgid "error opening index for %s"
 msgstr "Fehler beim Öffnen des Index für %s."
 
-#: commit-graph.c:1562
+#: commit-graph.c:1704
 msgid "Finding commits for commit graph among packed objects"
 msgstr "Suche Commits für Commit-Graph in gepackten Objekten"
 
-#: commit-graph.c:1580
+#: commit-graph.c:1722
 msgid "Finding extra edges in commit graph"
 msgstr "Suche zusätzliche Ränder in Commit-Graph"
 
-#: commit-graph.c:1628
+#: commit-graph.c:1771
 msgid "failed to write correct number of base graph ids"
 msgstr "Fehler beim Schreiben der korrekten Anzahl von Basis-Graph-IDs."
 
-#: commit-graph.c:1670 midx.c:819
+#: commit-graph.c:1802 midx.c:794
 #, c-format
 msgid "unable to create leading directories of %s"
 msgstr "Konnte führende Verzeichnisse von '%s' nicht erstellen."
 
-#: commit-graph.c:1683
+#: commit-graph.c:1815
 msgid "unable to create temporary graph layer"
 msgstr "konnte temporäre Graphen-Schicht nicht erstellen"
 
-#: commit-graph.c:1688
+#: commit-graph.c:1820
 #, c-format
 msgid "unable to adjust shared permissions for '%s'"
 msgstr "konnte geteilte Zugriffsberechtigungen für '%s' nicht ändern"
 
-#: commit-graph.c:1758
+#: commit-graph.c:1879
 #, c-format
 msgid "Writing out commit graph in %d pass"
 msgid_plural "Writing out commit graph in %d passes"
 msgstr[0] "Schreibe Commit-Graph in %d Durchgang"
 msgstr[1] "Schreibe Commit-Graph in %d Durchgängen"
 
-#: commit-graph.c:1803
+#: commit-graph.c:1915
 msgid "unable to open commit-graph chain file"
 msgstr "konnte Commit-Graph Chain-Datei nicht öffnen"
 
-#: commit-graph.c:1819
+#: commit-graph.c:1931
 msgid "failed to rename base commit-graph file"
 msgstr "konnte Basis-Commit-Graph-Datei nicht umbenennen"
 
-#: commit-graph.c:1839
+#: commit-graph.c:1951
 msgid "failed to rename temporary commit-graph file"
 msgstr "konnte temporäre Commit-Graph-Datei nicht umbenennen"
 
-#: commit-graph.c:1965
+#: commit-graph.c:2084
 msgid "Scanning merged commits"
 msgstr "Durchsuche zusammengeführte Commits"
 
-#: commit-graph.c:2009
+#: commit-graph.c:2128
 msgid "Merging commit-graph"
 msgstr "Zusammenführen von Commit-Graph"
 
-#: commit-graph.c:2115
+#: commit-graph.c:2235
 msgid "attempting to write a commit-graph, but 'core.commitGraph' is disabled"
 msgstr ""
 "versuche einen Commit-Graph zu schreiben, aber 'core.commitGraph' ist "
 "deaktiviert"
 
-#: commit-graph.c:2214
+#: commit-graph.c:2342
 msgid "too many commits to write graph"
 msgstr "zu viele Commits zum Schreiben des Graphen"
 
-#: commit-graph.c:2307
+#: commit-graph.c:2440
 msgid "the commit-graph file has incorrect checksum and is likely corrupt"
 msgstr ""
 "die Commit-Graph-Datei hat eine falsche Prüfsumme und ist wahrscheinlich "
 "beschädigt"
 
-#: commit-graph.c:2317
+#: commit-graph.c:2450
 #, c-format
 msgid "commit-graph has incorrect OID order: %s then %s"
 msgstr "Commit-Graph hat fehlerhafte OID-Reihenfolge: %s dann %s"
 
-#: commit-graph.c:2327 commit-graph.c:2342
+#: commit-graph.c:2460 commit-graph.c:2475
 #, c-format
 msgid "commit-graph has incorrect fanout value: fanout[%d] = %u != %u"
 msgstr "Commit-Graph hat fehlerhaften Fanout-Wert: fanout[%d] = %u != %u"
 
-#: commit-graph.c:2334
+#: commit-graph.c:2467
 #, c-format
 msgid "failed to parse commit %s from commit-graph"
 msgstr "konnte Commit %s von Commit-Graph nicht parsen"
 
-#: commit-graph.c:2352
+#: commit-graph.c:2485
 msgid "Verifying commits in commit graph"
 msgstr "Commit in Commit-Graph überprüfen"
 
-#: commit-graph.c:2367
+#: commit-graph.c:2500
 #, c-format
 msgid "failed to parse commit %s from object database for commit-graph"
 msgstr ""
 "Fehler beim Parsen des Commits %s von Objekt-Datenbank für Commit-Graph"
 
-#: commit-graph.c:2374
+#: commit-graph.c:2507
 #, c-format
 msgid "root tree OID for commit %s in commit-graph is %s != %s"
 msgstr ""
 "OID des Wurzelverzeichnisses für Commit %s in Commit-Graph ist %s != %s"
 
-#: commit-graph.c:2384
+#: commit-graph.c:2517
 #, c-format
 msgid "commit-graph parent list for commit %s is too long"
 msgstr "Commit-Graph Vorgänger-Liste für Commit %s ist zu lang"
 
-#: commit-graph.c:2393
+#: commit-graph.c:2526
 #, c-format
 msgid "commit-graph parent for %s is %s != %s"
 msgstr "Commit-Graph-Vorgänger für %s ist %s != %s"
 
-#: commit-graph.c:2407
+#: commit-graph.c:2540
 #, c-format
 msgid "commit-graph parent list for commit %s terminates early"
 msgstr "Commit-Graph Vorgänger-Liste für Commit %s endet zu früh"
 
-#: commit-graph.c:2412
+#: commit-graph.c:2545
 #, c-format
 msgid ""
 "commit-graph has generation number zero for commit %s, but non-zero elsewhere"
@@ -2393,7 +2403,7 @@
 "Commit-Graph hat Generationsnummer null für Commit %s, aber sonst ungleich "
 "null"
 
-#: commit-graph.c:2416
+#: commit-graph.c:2549
 #, c-format
 msgid ""
 "commit-graph has non-zero generation number for commit %s, but zero elsewhere"
@@ -2401,18 +2411,18 @@
 "Commit-Graph hat Generationsnummer ungleich null für Commit %s, aber sonst "
 "null"
 
-#: commit-graph.c:2432
+#: commit-graph.c:2566
 #, c-format
-msgid "commit-graph generation for commit %s is %u != %u"
-msgstr "Commit-Graph Erstellung für Commit %s ist %u != %u"
+msgid "commit-graph generation for commit %s is %<PRIuMAX> < %<PRIuMAX>"
+msgstr "Commit-Graph Erstellung für Commit %s ist %<PRIuMAX> < %<PRIuMAX>"
 
-#: commit-graph.c:2438
+#: commit-graph.c:2572
 #, c-format
 msgid "commit date for commit %s in commit-graph is %<PRIuMAX> != %<PRIuMAX>"
 msgstr ""
 "Commit-Datum für Commit %s in Commit-Graph ist %<PRIuMAX> != %<PRIuMAX>"
 
-#: commit.c:52 sequencer.c:2879 builtin/am.c:359 builtin/am.c:403
+#: commit.c:52 sequencer.c:2887 builtin/am.c:359 builtin/am.c:403
 #: builtin/am.c:1371 builtin/am.c:2018 builtin/replace.c:457
 #, c-format
 msgid "could not parse %s"
@@ -2444,28 +2454,28 @@
 "Sie können diese Meldung unterdrücken, indem Sie\n"
 "\"git config advice.graftFileDeprecated false\" ausführen."
 
-#: commit.c:1172
+#: commit.c:1223
 #, 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."
 
-#: commit.c:1176
+#: commit.c:1227
 #, 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."
 
-#: commit.c:1179
+#: commit.c:1230
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Commit %s hat keine GPG-Signatur."
 
-#: commit.c:1182
+#: commit.c:1233
 #, 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"
 
-#: commit.c:1436
+#: commit.c:1487
 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"
@@ -2481,7 +2491,7 @@
 msgid "memory exhausted"
 msgstr "Speicher verbraucht"
 
-#: config.c:125
+#: config.c:126
 #, c-format
 msgid ""
 "exceeded maximum include depth (%d) while including\n"
@@ -2497,306 +2507,350 @@
 "überschritten.\n"
 "Das könnte durch zirkulare Includes entstanden sein."
 
-#: config.c:141
+#: config.c:142
 #, c-format
 msgid "could not expand include path '%s'"
 msgstr "Konnte Include-Pfad '%s' nicht erweitern."
 
-#: config.c:152
+#: config.c:153
 msgid "relative config includes must come from files"
 msgstr "Relative Includes von Konfigurationen müssen aus Dateien kommen."
 
-#: config.c:198
+#: config.c:199
 msgid "relative config include conditionals must come from files"
 msgstr ""
 "Bedingungen für das Einbinden von Konfigurationen aus relativen Pfaden "
 "müssen\n"
 "aus Dateien kommen."
 
-#: config.c:378
+#: config.c:396
+#, c-format
+msgid "invalid config format: %s"
+msgstr "ungültiges Konfigurationsformat: %s"
+
+#: config.c:400
+#, c-format
+msgid "missing environment variable name for configuration '%.*s'"
+msgstr "fehlender Name der Umgebungsvariable für Konfiguration '%.*s'"
+
+#: config.c:405
+#, c-format
+msgid "missing environment variable '%s' for configuration '%.*s'"
+msgstr "fehlende Umgebungsvariable '%s' für Konfiguration '%.*s'"
+
+#: config.c:442
 #, c-format
 msgid "key does not contain a section: %s"
 msgstr "Schlüssel enthält keine Sektion: %s"
 
-#: config.c:384
+#: config.c:448
 #, c-format
 msgid "key does not contain variable name: %s"
 msgstr "Schlüssel enthält keinen Variablennamen: %s"
 
-#: config.c:408 sequencer.c:2580
+#: config.c:472 sequencer.c:2588
 #, c-format
 msgid "invalid key: %s"
 msgstr "Ungültiger Schlüssel: %s"
 
-#: config.c:414
+#: config.c:478
 #, c-format
 msgid "invalid key (newline): %s"
 msgstr "Ungültiger Schlüssel (neue Zeile): %s"
 
-#: config.c:450 config.c:462
+#: config.c:511
+msgid "empty config key"
+msgstr "leerer Konfigurationsschlüssel"
+
+#: config.c:529 config.c:541
 #, c-format
 msgid "bogus config parameter: %s"
 msgstr "Fehlerhafter Konfigurationsparameter: %s"
 
-#: config.c:497
+#: config.c:555 config.c:572 config.c:579 config.c:588
 #, c-format
 msgid "bogus format in %s"
 msgstr "Fehlerhaftes Format in %s"
 
-#: config.c:836
+#: config.c:622
+#, c-format
+msgid "bogus count in %s"
+msgstr "falsche Zählung in %s"
+
+#: config.c:626
+#, c-format
+msgid "too many entries in %s"
+msgstr "zu viele Einträge in %s"
+
+#: config.c:636
+#, c-format
+msgid "missing config key %s"
+msgstr "fehlender Konfigurationsschlüssel %s"
+
+#: config.c:644
+#, c-format
+msgid "missing config value %s"
+msgstr "fehlender Konfigurationswert %s"
+
+#: config.c:995
 #, c-format
 msgid "bad config line %d in blob %s"
 msgstr "Ungültige Konfigurationszeile %d in Blob %s"
 
-#: config.c:840
+#: config.c:999
 #, c-format
 msgid "bad config line %d in file %s"
 msgstr "Ungültige Konfigurationszeile %d in Datei %s"
 
-#: config.c:844
+#: config.c:1003
 #, c-format
 msgid "bad config line %d in standard input"
 msgstr "Ungültige Konfigurationszeile %d in Standard-Eingabe"
 
-#: config.c:848
+#: config.c:1007
 #, c-format
 msgid "bad config line %d in submodule-blob %s"
 msgstr "Ungültige Konfigurationszeile %d in Submodul-Blob %s"
 
-#: config.c:852
+#: config.c:1011
 #, c-format
 msgid "bad config line %d in command line %s"
 msgstr "Ungültige Konfigurationszeile %d in Kommandozeile %s"
 
-#: config.c:856
+#: config.c:1015
 #, c-format
 msgid "bad config line %d in %s"
 msgstr "Ungültige Konfigurationszeile %d in %s"
 
-#: config.c:993
+#: config.c:1152
 msgid "out of range"
 msgstr "Außerhalb des Bereichs"
 
-#: config.c:993
+#: config.c:1152
 msgid "invalid unit"
 msgstr "Ungültige Einheit"
 
-#: config.c:994
+#: config.c:1153
 #, c-format
 msgid "bad numeric config value '%s' for '%s': %s"
 msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s': %s"
 
-#: config.c:1013
+#: config.c:1163
 #, 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:1016
+#: config.c:1166
 #, 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:1019
+#: config.c:1169
 #, 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:1022
+#: config.c:1172
 #, 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:1025
+#: config.c:1175
 #, 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:1028
+#: config.c:1178
 #, 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:1123
+#: config.c:1194
+#, c-format
+msgid "bad boolean config value '%s' for '%s'"
+msgstr "ungültiger boolescher Konfigurationswert '%s' für '%s'"
+
+#: config.c:1289
 #, c-format
 msgid "failed to expand user dir in: '%s'"
 msgstr "Fehler beim Erweitern des Nutzerverzeichnisses in: '%s'"
 
-#: config.c:1132
+#: config.c:1298
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
 msgstr "'%s' ist kein gültiger Zeitstempel für '%s'"
 
-#: config.c:1223
+#: config.c:1391
 #, c-format
 msgid "abbrev length out of range: %d"
 msgstr "Länge für Abkürzung von Commit-IDs außerhalb des Bereichs: %d"
 
-#: config.c:1237 config.c:1248
+#: config.c:1405 config.c:1416
 #, c-format
 msgid "bad zlib compression level %d"
 msgstr "ungültiger zlib Komprimierungsgrad %d"
 
-#: config.c:1340
+#: config.c:1508
 msgid "core.commentChar should only be one character"
 msgstr "core.commentChar sollte nur ein Zeichen sein"
 
-#: config.c:1373
+#: config.c:1541
 #, c-format
 msgid "invalid mode for object creation: %s"
 msgstr "Ungültiger Modus für Objekterstellung: %s"
 
-#: config.c:1445
+#: config.c:1613
 #, c-format
 msgid "malformed value for %s"
 msgstr "Ungültiger Wert für %s."
 
-#: config.c:1471
+#: config.c:1639
 #, c-format
 msgid "malformed value for %s: %s"
 msgstr "Ungültiger Wert für %s: %s"
 
-#: config.c:1472
+#: config.c:1640
 msgid "must be one of nothing, matching, simple, upstream or current"
 msgstr ""
 "Muss einer von diesen sein: nothing, matching, simple, upstream, current"
 
-#: config.c:1533 builtin/pack-objects.c:3649
+#: config.c:1701 builtin/pack-objects.c:3666
 #, c-format
 msgid "bad pack compression level %d"
 msgstr "ungültiger Komprimierungsgrad (%d) für Paketierung"
 
-#: config.c:1655
+#: config.c:1823
 #, c-format
 msgid "unable to load config blob object '%s'"
 msgstr "Konnte Blob-Objekt '%s' für Konfiguration nicht laden."
 
-#: config.c:1658
+#: config.c:1826
 #, c-format
 msgid "reference '%s' does not point to a blob"
 msgstr "Referenz '%s' zeigt auf keinen Blob."
 
-#: config.c:1675
+#: config.c:1843
 #, c-format
 msgid "unable to resolve config blob '%s'"
 msgstr "Konnte Blob '%s' für Konfiguration nicht auflösen."
 
-#: config.c:1705
+#: config.c:1873
 #, c-format
 msgid "failed to parse %s"
 msgstr "Fehler beim Parsen von %s."
 
-#: config.c:1759
+#: config.c:1927
 msgid "unable to parse command-line config"
 msgstr ""
 "Konnte die über die Befehlszeile angegebene Konfiguration nicht parsen."
 
-#: config.c:2122
+#: config.c:2290
 msgid "unknown error occurred while reading the configuration files"
 msgstr ""
 "Es trat ein unbekannter Fehler beim Lesen der Konfigurationsdateien auf."
 
-#: config.c:2296
+#: config.c:2464
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "Ungültiger %s: '%s'"
 
-#: config.c:2341
+#: config.c:2509
 #, c-format
 msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
 msgstr ""
 "Der Wert '%d' von splitIndex.maxPercentChange sollte zwischen 0 und 100 "
 "liegen."
 
-#: config.c:2387
+#: config.c:2555
 #, 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:2389
+#: config.c:2557
 #, 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:2473
+#: config.c:2641
 #, c-format
 msgid "invalid section name '%s'"
 msgstr "Ungültiger Sektionsname '%s'"
 
-#: config.c:2505
+#: config.c:2673
 #, c-format
 msgid "%s has multiple values"
 msgstr "%s hat mehrere Werte"
 
-#: config.c:2534
+#: config.c:2702
 #, c-format
 msgid "failed to write new configuration file %s"
 msgstr "Konnte neue Konfigurationsdatei '%s' nicht schreiben."
 
-#: config.c:2786 config.c:3112
+#: config.c:2954 config.c:3280
 #, c-format
 msgid "could not lock config file %s"
 msgstr "Konnte Konfigurationsdatei '%s' nicht sperren."
 
-#: config.c:2797
+#: config.c:2965
 #, c-format
 msgid "opening %s"
 msgstr "Öffne %s"
 
-#: config.c:2834 builtin/config.c:361
+#: config.c:3002 builtin/config.c:361
 #, c-format
 msgid "invalid pattern: %s"
 msgstr "Ungültiges Muster: %s"
 
-#: config.c:2859
+#: config.c:3027
 #, c-format
 msgid "invalid config file %s"
 msgstr "Ungültige Konfigurationsdatei %s"
 
-#: config.c:2872 config.c:3125
+#: config.c:3040 config.c:3293
 #, c-format
 msgid "fstat on %s failed"
 msgstr "fstat auf %s fehlgeschlagen"
 
-#: config.c:2883
+#: config.c:3051
 #, c-format
 msgid "unable to mmap '%s'"
 msgstr "mmap für '%s' fehlgeschlagen"
 
-#: config.c:2892 config.c:3130
+#: config.c:3060 config.c:3298
 #, c-format
 msgid "chmod on %s failed"
 msgstr "chmod auf %s fehlgeschlagen"
 
-#: config.c:2977 config.c:3227
+#: config.c:3145 config.c:3395
 #, c-format
 msgid "could not write config file %s"
 msgstr "Konnte Konfigurationsdatei %s nicht schreiben."
 
-#: config.c:3011
+#: config.c:3179
 #, c-format
 msgid "could not set '%s' to '%s'"
 msgstr "Konnte '%s' nicht zu '%s' setzen."
 
-#: config.c:3013 builtin/remote.c:657 builtin/remote.c:855 builtin/remote.c:863
+#: config.c:3181 builtin/remote.c:657 builtin/remote.c:855 builtin/remote.c:863
 #, c-format
 msgid "could not unset '%s'"
 msgstr "Konnte '%s' nicht aufheben."
 
-#: config.c:3103
+#: config.c:3271
 #, c-format
 msgid "invalid section name: %s"
 msgstr "Ungültiger Sektionsname: %s"
 
-#: config.c:3270
+#: config.c:3438
 #, c-format
 msgid "missing value for '%s'"
 msgstr "Fehlender Wert für '%s'"
@@ -2861,45 +2915,45 @@
 msgid "protocol error: unexpected '%s'"
 msgstr "Protokollfehler: unerwartetes '%s'"
 
-#: connect.c:473
+#: connect.c:497
 #, c-format
 msgid "unknown object format '%s' specified by server"
 msgstr "unbekanntes Objekt-Format '%s' vom Server angegeben"
 
-#: connect.c:500
+#: connect.c:526
 #, c-format
 msgid "invalid ls-refs response: %s"
 msgstr "ungültige ls-refs Antwort: %s"
 
-#: connect.c:504
+#: connect.c:530
 msgid "expected flush after ref listing"
 msgstr "Flush nach Auflistung der Referenzen erwartet"
 
-#: connect.c:507
+#: connect.c:533
 msgid "expected response end packet after ref listing"
 msgstr "Antwort-Endpaket nach Auflistung der Referenzen erwartet"
 
-#: connect.c:640
+#: connect.c:666
 #, c-format
 msgid "protocol '%s' is not supported"
 msgstr "Protokoll '%s' wird nicht unterstützt"
 
-#: connect.c:691
+#: connect.c:717
 msgid "unable to set SO_KEEPALIVE on socket"
 msgstr "kann SO_KEEPALIVE bei Socket nicht setzen"
 
-#: connect.c:731 connect.c:794
+#: connect.c:757 connect.c:820
 #, c-format
 msgid "Looking up %s ... "
 msgstr "Suche nach %s ..."
 
-#: connect.c:735
+#: connect.c:761
 #, c-format
 msgid "unable to look up %s (port %s) (%s)"
 msgstr "Fehler bei Suche nach %s (Port %s) (%s)."
 
 #. TRANSLATORS: this is the end of "Looking up %s ... "
-#: connect.c:739 connect.c:810
+#: connect.c:765 connect.c:836
 #, c-format
 msgid ""
 "done.\n"
@@ -2908,7 +2962,7 @@
 "Fertig.\n"
 "Verbinde nach %s (Port %s) ... "
 
-#: connect.c:761 connect.c:838
+#: connect.c:787 connect.c:864
 #, c-format
 msgid ""
 "unable to connect to %s:\n"
@@ -2918,62 +2972,65 @@
 "%s"
 
 #. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
-#: connect.c:767 connect.c:844
+#: connect.c:793 connect.c:870
 msgid "done."
 msgstr "Fertig."
 
-#: connect.c:798
+#: connect.c:824
 #, c-format
 msgid "unable to look up %s (%s)"
 msgstr "Fehler bei der Suche nach %s (%s)"
 
-#: connect.c:804
+#: connect.c:830
 #, c-format
 msgid "unknown port %s"
 msgstr "Unbekannter Port %s"
 
-#: connect.c:941 connect.c:1271
+#: connect.c:967 connect.c:1299
 #, c-format
 msgid "strange hostname '%s' blocked"
 msgstr "Merkwürdigen Hostnamen '%s' blockiert."
 
-#: connect.c:943
+#: connect.c:969
 #, c-format
 msgid "strange port '%s' blocked"
 msgstr "Merkwürdigen Port '%s' blockiert."
 
-#: connect.c:953
+#: connect.c:979
 #, c-format
 msgid "cannot start proxy %s"
 msgstr "Kann Proxy %s nicht starten."
 
-#: connect.c:1024
+#: connect.c:1050
 msgid "no path specified; see 'git help pull' for valid url syntax"
-msgstr ""
-"Kein Pfad angegeben; siehe 'git help pull' für eine gültige URL-Syntax."
+msgstr "kein Pfad angegeben; siehe 'git help pull' für eine gültige URL-Syntax"
 
-#: connect.c:1219
+#: connect.c:1190
+msgid "newline is forbidden in git:// hosts and repo paths"
+msgstr "Zeilenumbruch ist in git:// Hosts und Repository-Pfaden verboten"
+
+#: connect.c:1247
 msgid "ssh variant 'simple' does not support -4"
-msgstr "SSH-Variante 'simple' unterstützt kein -4."
+msgstr "SSH-Variante 'simple' unterstützt kein -4"
 
-#: connect.c:1231
+#: connect.c:1259
 msgid "ssh variant 'simple' does not support -6"
-msgstr "SSH-Variante 'simple' unterstützt kein -6."
+msgstr "SSH-Variante 'simple' unterstützt kein -6"
 
-#: connect.c:1248
+#: connect.c:1276
 msgid "ssh variant 'simple' does not support setting port"
-msgstr "SSH-Variante 'simple' unterstützt nicht das Setzen eines Ports."
+msgstr "SSH-Variante 'simple' unterstützt nicht das Setzen eines Ports"
 
-#: connect.c:1360
+#: connect.c:1388
 #, c-format
 msgid "strange pathname '%s' blocked"
-msgstr "Merkwürdigen Pfadnamen '%s' blockiert."
+msgstr "Merkwürdigen Pfadnamen '%s' blockiert"
 
-#: connect.c:1408
+#: connect.c:1436
 msgid "unable to fork"
-msgstr "Kann Prozess nicht starten."
+msgstr "kann Prozess nicht starten"
 
-#: connected.c:108 builtin/fsck.c:209 builtin/prune.c:45
+#: connected.c:108 builtin/fsck.c:191 builtin/prune.c:45
 msgid "Checking connectivity"
 msgstr "Prüfe Konnektivität"
 
@@ -2997,7 +3054,7 @@
 #: convert.c:207
 #, c-format
 msgid "CRLF would be replaced by LF in %s"
-msgstr "CRLF würde in %s durch LF ersetzt werden."
+msgstr "CRLF würde in %s durch LF ersetzt werden"
 
 #: convert.c:209
 #, c-format
@@ -3012,7 +3069,7 @@
 #: convert.c:217
 #, c-format
 msgid "LF would be replaced by CRLF in %s"
-msgstr "LF würde in %s durch CRLF ersetzt werden."
+msgstr "LF würde in %s durch CRLF ersetzt werden"
 
 #: convert.c:219
 #, c-format
@@ -3027,7 +3084,7 @@
 #: convert.c:284
 #, c-format
 msgid "BOM is prohibited in '%s' if encoded as %s"
-msgstr "BOM ist in '%s' unzulässig, wenn als %s codiert."
+msgstr "BOM ist in '%s' unzulässig, wenn als %s codiert"
 
 #: convert.c:291
 #, c-format
@@ -3041,7 +3098,7 @@
 #: convert.c:304
 #, c-format
 msgid "BOM is required in '%s' if encoded as %s"
-msgstr "BOM ist erforderlich in '%s', wenn als %s codiert."
+msgstr "BOM ist erforderlich in '%s', wenn als %s codiert"
 
 #: convert.c:306
 #, c-format
@@ -3056,45 +3113,45 @@
 #: convert.c:419 convert.c:490
 #, c-format
 msgid "failed to encode '%s' from %s to %s"
-msgstr "Fehler beim Codieren von '%s' von %s nach %s."
+msgstr "Fehler beim Codieren von '%s' von %s nach %s"
 
 #: convert.c:462
 #, c-format
 msgid "encoding '%s' from %s to %s and back is not the same"
-msgstr "Die Codierung '%s' von %s nach %s und zurück ist nicht dasselbe."
+msgstr "Codierung von '%s' von %s nach %s und zurück ist nicht dasselbe"
 
 #: convert.c:665
 #, c-format
 msgid "cannot fork to run external filter '%s'"
-msgstr "Kann externen Filter '%s' nicht starten."
+msgstr "kann externen Filter '%s' nicht starten"
 
 #: convert.c:685
 #, c-format
 msgid "cannot feed the input to external filter '%s'"
-msgstr "Kann Eingaben nicht an externen Filter '%s' übergeben."
+msgstr "kann Eingaben nicht an externen Filter '%s' übergeben"
 
 #: convert.c:692
 #, c-format
 msgid "external filter '%s' failed %d"
-msgstr "Externer Filter '%s' fehlgeschlagen %d"
+msgstr "externer Filter '%s' fehlgeschlagen %d"
 
 #: convert.c:727 convert.c:730
 #, c-format
 msgid "read from external filter '%s' failed"
-msgstr "Lesen von externem Filter '%s' fehlgeschlagen."
+msgstr "Lesen von externem Filter '%s' fehlgeschlagen"
 
 #: convert.c:733 convert.c:788
 #, c-format
 msgid "external filter '%s' failed"
-msgstr "Externer Filter '%s' fehlgeschlagen."
+msgstr "externer Filter '%s' fehlgeschlagen"
 
 #: convert.c:837
 msgid "unexpected filter type"
-msgstr "Unerwartete Filterart."
+msgstr "unerwartete Filterart"
 
 #: convert.c:848
 msgid "path name too long for external filter"
-msgstr "Pfadname zu lang für externen Filter."
+msgstr "Pfadname zu lang für externen Filter"
 
 #: convert.c:940
 #, c-format
@@ -3102,21 +3159,22 @@
 "external filter '%s' is not available anymore although not all paths have "
 "been filtered"
 msgstr ""
-"Externer Filter '%s' nicht mehr verfügbar. Nicht alle Pfade wurden gefiltert."
+"externer Filter '%s' nicht mehr verfügbar, obwohl nicht alle Pfade gefiltert "
+"wurden"
 
 #: convert.c:1240
 msgid "true/false are no valid working-tree-encodings"
-msgstr "true/false sind keine gültigen Codierungen im Arbeitsverzeichnis."
+msgstr "true/false sind keine gültigen Codierungen im Arbeitsverzeichnis"
 
 #: convert.c:1428 convert.c:1462
 #, c-format
 msgid "%s: clean filter '%s' failed"
-msgstr "%s: clean-Filter '%s' fehlgeschlagen."
+msgstr "%s: clean-Filter '%s' fehlgeschlagen"
 
 #: convert.c:1508
 #, c-format
 msgid "%s: smudge filter %s failed"
-msgstr "%s: smudge-Filter '%s' fehlgeschlagen."
+msgstr "%s: smudge-Filter '%s' fehlgeschlagen"
 
 #: credential.c:96
 #, c-format
@@ -3241,6 +3299,11 @@
 msgid "Marked %d islands, done.\n"
 msgstr "%d Delta-Islands markiert, fertig.\n"
 
+#: diff-merges.c:70
+#, c-format
+msgid "unknown value for --diff-merges: %s"
+msgstr "unbekannter Wert für --diff-merges: %s"
+
 #: diff-lib.c:534
 msgid "--merge-base does not work with ranges"
 msgstr "--merge-base funktioniert nicht mit Bereichen"
@@ -3328,31 +3391,31 @@
 msgid "external diff died, stopping at %s"
 msgstr "externes Diff-Programm unerwartet beendet, angehalten bei %s"
 
-#: diff.c:4625
+#: diff.c:4628
 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:4628
+#: diff.c:4631
 msgid "-G, -S and --find-object are mutually exclusive"
 msgstr "-G, -S und --find-object schließen sich gegenseitig aus"
 
-#: diff.c:4707
+#: diff.c:4710
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow erfordert genau eine Pfadspezifikation"
 
-#: diff.c:4755
+#: diff.c:4758
 #, c-format
 msgid "invalid --stat value: %s"
 msgstr "Ungültiger --stat Wert: %s"
 
-#: diff.c:4760 diff.c:4765 diff.c:4770 diff.c:4775 diff.c:5303
+#: diff.c:4763 diff.c:4768 diff.c:4773 diff.c:4778 diff.c:5306
 #: parse-options.c:197 parse-options.c:201 builtin/commit-graph.c:180
 #, c-format
 msgid "%s expects a numerical value"
 msgstr "%s erwartet einen numerischen Wert."
 
-#: diff.c:4792
+#: diff.c:4795
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -3361,42 +3424,42 @@
 "Fehler beim Parsen des --dirstat/-X Optionsparameters:\n"
 "%s"
 
-#: diff.c:4877
+#: diff.c:4880
 #, c-format
 msgid "unknown change class '%c' in --diff-filter=%s"
 msgstr "unbekannte Änderungsklasse '%c' in --diff-filter=%s"
 
-#: diff.c:4901
+#: diff.c:4904
 #, c-format
 msgid "unknown value after ws-error-highlight=%.*s"
 msgstr "unbekannter Wert nach ws-error-highlight=%.*s"
 
-#: diff.c:4915
+#: diff.c:4918
 #, c-format
 msgid "unable to resolve '%s'"
 msgstr "konnte '%s' nicht auflösen"
 
-#: diff.c:4965 diff.c:4971
+#: diff.c:4968 diff.c:4974
 #, c-format
 msgid "%s expects <n>/<m> form"
 msgstr "%s erwartet die Form <n>/<m>"
 
-#: diff.c:4983
+#: diff.c:4986
 #, c-format
 msgid "%s expects a character, got '%s'"
 msgstr "%s erwartet ein Zeichen, '%s' bekommen"
 
-#: diff.c:5004
+#: diff.c:5007
 #, c-format
 msgid "bad --color-moved argument: %s"
 msgstr "ungültiges --color-moved Argument: %s"
 
-#: diff.c:5023
+#: diff.c:5026
 #, c-format
 msgid "invalid mode '%s' in --color-moved-ws"
 msgstr "ungültiger Modus '%s' in --color-moved-ws"
 
-#: diff.c:5063
+#: diff.c:5066
 msgid ""
 "option diff-algorithm accepts \"myers\", \"minimal\", \"patience\" and "
 "\"histogram\""
@@ -3404,157 +3467,157 @@
 "Option diff-algorithm akzeptiert: \"myers\", \"minimal\", \"patience\" and "
 "\"histogram\""
 
-#: diff.c:5099 diff.c:5119
+#: diff.c:5102 diff.c:5122
 #, c-format
 msgid "invalid argument to %s"
 msgstr "ungültiges Argument für %s"
 
-#: diff.c:5223
+#: diff.c:5226
 #, c-format
 msgid "invalid regex given to -I: '%s'"
 msgstr "ungültiger regulärer Ausdruck für -I gegeben: '%s'"
 
-#: diff.c:5272
+#: diff.c:5275
 #, c-format
 msgid "failed to parse --submodule option parameter: '%s'"
 msgstr "Fehler beim Parsen des --submodule Optionsparameters: '%s'"
 
-#: diff.c:5328
+#: diff.c:5331
 #, c-format
 msgid "bad --word-diff argument: %s"
 msgstr "ungültiges --word-diff Argument: %s"
 
-#: diff.c:5351
+#: diff.c:5367
 msgid "Diff output format options"
 msgstr "Diff-Optionen zu Ausgabeformaten"
 
-#: diff.c:5353 diff.c:5359
+#: diff.c:5369 diff.c:5375
 msgid "generate patch"
 msgstr "Patch erzeugen"
 
-#: diff.c:5356 builtin/log.c:178
+#: diff.c:5372 builtin/log.c:179
 msgid "suppress diff output"
 msgstr "Ausgabe der Unterschiede unterdrücken"
 
-#: diff.c:5361 diff.c:5475 diff.c:5482
+#: diff.c:5377 diff.c:5491 diff.c:5498
 msgid "<n>"
 msgstr "<n>"
 
-#: diff.c:5362 diff.c:5365
+#: diff.c:5378 diff.c:5381
 msgid "generate diffs with <n> lines context"
 msgstr "Unterschiede mit <n> Zeilen des Kontextes erstellen"
 
-#: diff.c:5367
+#: diff.c:5383
 msgid "generate the diff in raw format"
 msgstr "Unterschiede im Rohformat erstellen"
 
-#: diff.c:5370
+#: diff.c:5386
 msgid "synonym for '-p --raw'"
 msgstr "Synonym für '-p --raw'"
 
-#: diff.c:5374
+#: diff.c:5390
 msgid "synonym for '-p --stat'"
 msgstr "Synonym für '-p --stat'"
 
-#: diff.c:5378
+#: diff.c:5394
 msgid "machine friendly --stat"
 msgstr "maschinenlesbare Ausgabe von --stat"
 
-#: diff.c:5381
+#: diff.c:5397
 msgid "output only the last line of --stat"
 msgstr "nur die letzte Zeile von --stat ausgeben"
 
-#: diff.c:5383 diff.c:5391
+#: diff.c:5399 diff.c:5407
 msgid "<param1,param2>..."
 msgstr "<Parameter1,Parameter2>..."
 
-#: diff.c:5384
+#: diff.c:5400
 msgid ""
 "output the distribution of relative amount of changes for each sub-directory"
 msgstr ""
 "die Verteilung des relativen Umfangs der Änderungen für jedes "
 "Unterverzeichnis ausgeben"
 
-#: diff.c:5388
+#: diff.c:5404
 msgid "synonym for --dirstat=cumulative"
 msgstr "Synonym für --dirstat=cumulative"
 
-#: diff.c:5392
+#: diff.c:5408
 msgid "synonym for --dirstat=files,param1,param2..."
 msgstr "Synonym für --dirstat=files,Parameter1,Parameter2..."
 
-#: diff.c:5396
+#: diff.c:5412
 msgid "warn if changes introduce conflict markers or whitespace errors"
 msgstr ""
 "warnen, wenn Änderungen Konfliktmarker oder Whitespace-Fehler einbringen"
 
-#: diff.c:5399
+#: diff.c:5415
 msgid "condensed summary such as creations, renames and mode changes"
 msgstr ""
 "gekürzte Zusammenfassung, wie z.B. Erstellungen, Umbenennungen und "
 "Änderungen der Datei-Rechte"
 
-#: diff.c:5402
+#: diff.c:5418
 msgid "show only names of changed files"
 msgstr "nur Dateinamen der geänderten Dateien anzeigen"
 
-#: diff.c:5405
+#: diff.c:5421
 msgid "show only names and status of changed files"
 msgstr "nur Dateinamen und Status der geänderten Dateien anzeigen"
 
-#: diff.c:5407
+#: diff.c:5423
 msgid "<width>[,<name-width>[,<count>]]"
 msgstr "<Breite>[,<Namens-Breite>[,<Anzahl>]]"
 
-#: diff.c:5408
+#: diff.c:5424
 msgid "generate diffstat"
 msgstr "Zusammenfassung der Unterschiede erzeugen"
 
-#: diff.c:5410 diff.c:5413 diff.c:5416
+#: diff.c:5426 diff.c:5429 diff.c:5432
 msgid "<width>"
 msgstr "<Breite>"
 
-#: diff.c:5411
+#: diff.c:5427
 msgid "generate diffstat with a given width"
 msgstr "Zusammenfassung der Unterschiede mit gegebener Breite erzeugen"
 
-#: diff.c:5414
+#: diff.c:5430
 msgid "generate diffstat with a given name width"
 msgstr "Zusammenfassung der Unterschiede mit gegebener Namens-Breite erzeugen"
 
-#: diff.c:5417
+#: diff.c:5433
 msgid "generate diffstat with a given graph width"
 msgstr "Zusammenfassung der Unterschiede mit gegebener Graph-Breite erzeugen"
 
-#: diff.c:5419
+#: diff.c:5435
 msgid "<count>"
 msgstr "<Anzahl>"
 
-#: diff.c:5420
+#: diff.c:5436
 msgid "generate diffstat with limited lines"
 msgstr "Zusammenfassung der Unterschiede mit begrenzten Zeilen erzeugen"
 
-#: diff.c:5423
+#: diff.c:5439
 msgid "generate compact summary in diffstat"
 msgstr "kompakte Zusammenstellung in Zusammenfassung der Unterschiede erzeugen"
 
-#: diff.c:5426
+#: diff.c:5442
 msgid "output a binary diff that can be applied"
 msgstr "eine binäre Differenz ausgeben, dass angewendet werden kann"
 
-#: diff.c:5429
+#: diff.c:5445
 msgid "show full pre- and post-image object names on the \"index\" lines"
 msgstr "vollständige Objekt-Namen in den \"index\"-Zeilen anzeigen"
 
-#: diff.c:5431
+#: diff.c:5447
 msgid "show colored diff"
 msgstr "farbige Unterschiede anzeigen"
 
-#: diff.c:5432
+#: diff.c:5448
 msgid "<kind>"
 msgstr "<Art>"
 
-#: diff.c:5433
+#: diff.c:5449
 msgid ""
 "highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
 "diff"
@@ -3562,7 +3625,7 @@
 "Whitespace-Fehler in den Zeilen 'context', 'old' oder 'new' bei den "
 "Unterschieden hervorheben"
 
-#: diff.c:5436
+#: diff.c:5452
 msgid ""
 "do not munge pathnames and use NULs as output field terminators in --raw or "
 "--numstat"
@@ -3570,91 +3633,91 @@
 "die Pfadnamen nicht verschleiern und NUL-Zeichen als Schlusszeichen in "
 "Ausgabefeldern bei --raw oder --numstat nutzen"
 
-#: diff.c:5439 diff.c:5442 diff.c:5445 diff.c:5554
+#: diff.c:5455 diff.c:5458 diff.c:5461 diff.c:5570
 msgid "<prefix>"
 msgstr "<Präfix>"
 
-#: diff.c:5440
+#: diff.c:5456
 msgid "show the given source prefix instead of \"a/\""
 msgstr "den gegebenen Quell-Präfix statt \"a/\" anzeigen"
 
-#: diff.c:5443
+#: diff.c:5459
 msgid "show the given destination prefix instead of \"b/\""
 msgstr "den gegebenen Ziel-Präfix statt \"b/\" anzeigen"
 
-#: diff.c:5446
+#: diff.c:5462
 msgid "prepend an additional prefix to every line of output"
 msgstr "einen zusätzlichen Präfix bei jeder Ausgabezeile voranstellen"
 
-#: diff.c:5449
+#: diff.c:5465
 msgid "do not show any source or destination prefix"
 msgstr "keine Quell- oder Ziel-Präfixe anzeigen"
 
-#: diff.c:5452
+#: diff.c:5468
 msgid "show context between diff hunks up to the specified number of lines"
 msgstr ""
 "Kontext zwischen Unterschied-Blöcken bis zur angegebenen Anzahl von Zeilen "
 "anzeigen"
 
-#: diff.c:5456 diff.c:5461 diff.c:5466
+#: diff.c:5472 diff.c:5477 diff.c:5482
 msgid "<char>"
 msgstr "<Zeichen>"
 
-#: diff.c:5457
+#: diff.c:5473
 msgid "specify the character to indicate a new line instead of '+'"
 msgstr "das Zeichen festlegen, das eine neue Zeile kennzeichnet (statt '+')"
 
-#: diff.c:5462
+#: diff.c:5478
 msgid "specify the character to indicate an old line instead of '-'"
 msgstr "das Zeichen festlegen, das eine alte Zeile kennzeichnet (statt '-')"
 
-#: diff.c:5467
+#: diff.c:5483
 msgid "specify the character to indicate a context instead of ' '"
 msgstr "das Zeichen festlegen, das den Kontext kennzeichnet (statt ' ')"
 
-#: diff.c:5470
+#: diff.c:5486
 msgid "Diff rename options"
 msgstr "Diff-Optionen zur Umbenennung"
 
-#: diff.c:5471
+#: diff.c:5487
 msgid "<n>[/<m>]"
 msgstr "<n>[/<m>]"
 
-#: diff.c:5472
+#: diff.c:5488
 msgid "break complete rewrite changes into pairs of delete and create"
 msgstr ""
 "teile komplette Rewrite-Änderungen in Änderungen mit \"löschen\" und "
 "\"erstellen\""
 
-#: diff.c:5476
+#: diff.c:5492
 msgid "detect renames"
 msgstr "Umbenennungen erkennen"
 
-#: diff.c:5480
+#: diff.c:5496
 msgid "omit the preimage for deletes"
 msgstr "Preimage für Löschungen weglassen"
 
-#: diff.c:5483
+#: diff.c:5499
 msgid "detect copies"
 msgstr "Kopien erkennen"
 
-#: diff.c:5487
+#: diff.c:5503
 msgid "use unmodified files as source to find copies"
 msgstr "ungeänderte Dateien als Quelle zum Finden von Kopien nutzen"
 
-#: diff.c:5489
+#: diff.c:5505
 msgid "disable rename detection"
 msgstr "Erkennung von Umbenennungen deaktivieren"
 
-#: diff.c:5492
+#: diff.c:5508
 msgid "use empty blobs as rename source"
 msgstr "leere Blobs als Quelle von Umbenennungen nutzen"
 
-#: diff.c:5494
+#: diff.c:5510
 msgid "continue listing the history of a file beyond renames"
 msgstr "Auflistung der Historie einer Datei nach Umbenennung fortführen"
 
-#: diff.c:5497
+#: diff.c:5513
 msgid ""
 "prevent rename/copy detection if the number of rename/copy targets exceeds "
 "given limit"
@@ -3662,164 +3725,164 @@
 "Erkennung von Umbenennungen und Kopien verhindern, wenn die Anzahl der Ziele "
 "für Umbenennungen und Kopien das gegebene Limit überschreitet"
 
-#: diff.c:5499
+#: diff.c:5515
 msgid "Diff algorithm options"
 msgstr "Diff Algorithmus-Optionen"
 
-#: diff.c:5501
+#: diff.c:5517
 msgid "produce the smallest possible diff"
 msgstr "die kleinstmöglichen Änderungen erzeugen"
 
-#: diff.c:5504
+#: diff.c:5520
 msgid "ignore whitespace when comparing lines"
 msgstr "Whitespace-Änderungen beim Vergleich von Zeilen ignorieren"
 
-#: diff.c:5507
+#: diff.c:5523
 msgid "ignore changes in amount of whitespace"
 msgstr "Änderungen bei der Anzahl von Whitespace ignorieren"
 
-#: diff.c:5510
+#: diff.c:5526
 msgid "ignore changes in whitespace at EOL"
 msgstr "Whitespace-Änderungen am Zeilenende ignorieren"
 
-#: diff.c:5513
+#: diff.c:5529
 msgid "ignore carrier-return at the end of line"
 msgstr "den Zeilenumbruch am Ende der Zeile ignorieren"
 
-#: diff.c:5516
+#: diff.c:5532
 msgid "ignore changes whose lines are all blank"
 msgstr "Änderungen in leeren Zeilen ignorieren"
 
-#: diff.c:5518 diff.c:5540 diff.c:5543 diff.c:5588
+#: diff.c:5534 diff.c:5556 diff.c:5559 diff.c:5604
 msgid "<regex>"
 msgstr "<Regex>"
 
-#: diff.c:5519
+#: diff.c:5535
 msgid "ignore changes whose all lines match <regex>"
 msgstr ""
 "Änderungen ignorieren, bei denen alle Zeilen mit <Regex> übereinstimmen"
 
-#: diff.c:5522
+#: diff.c:5538
 msgid "heuristic to shift diff hunk boundaries for easy reading"
 msgstr ""
 "Heuristik, um Grenzen der Änderungsblöcke für bessere Lesbarkeit zu "
 "verschieben"
 
-#: diff.c:5525
+#: diff.c:5541
 msgid "generate diff using the \"patience diff\" algorithm"
 msgstr "Änderungen durch Nutzung des Algorithmus \"Patience Diff\" erzeugen"
 
-#: diff.c:5529
+#: diff.c:5545
 msgid "generate diff using the \"histogram diff\" algorithm"
 msgstr "Änderungen durch Nutzung des Algorithmus \"Histogram Diff\" erzeugen"
 
-#: diff.c:5531
+#: diff.c:5547
 msgid "<algorithm>"
 msgstr "<Algorithmus>"
 
-#: diff.c:5532
+#: diff.c:5548
 msgid "choose a diff algorithm"
 msgstr "einen Algorithmus für Änderungen wählen"
 
-#: diff.c:5534
+#: diff.c:5550
 msgid "<text>"
 msgstr "<Text>"
 
-#: diff.c:5535
+#: diff.c:5551
 msgid "generate diff using the \"anchored diff\" algorithm"
 msgstr "Änderungen durch Nutzung des Algorithmus \"Anchored Diff\" erzeugen"
 
-#: diff.c:5537 diff.c:5546 diff.c:5549
+#: diff.c:5553 diff.c:5562 diff.c:5565
 msgid "<mode>"
 msgstr "<Modus>"
 
-#: diff.c:5538
+#: diff.c:5554
 msgid "show word diff, using <mode> to delimit changed words"
 msgstr "Wort-Änderungen zeigen, nutze <Modus>, um Wörter abzugrenzen"
 
-#: diff.c:5541
+#: diff.c:5557
 msgid "use <regex> to decide what a word is"
 msgstr "<Regex> nutzen, um zu entscheiden, was ein Wort ist"
 
-#: diff.c:5544
+#: diff.c:5560
 msgid "equivalent to --word-diff=color --word-diff-regex=<regex>"
 msgstr "entsprechend wie --word-diff=color --word-diff-regex=<Regex>"
 
-#: diff.c:5547
+#: diff.c:5563
 msgid "moved lines of code are colored differently"
 msgstr "verschobene Codezeilen sind andersfarbig"
 
-#: diff.c:5550
+#: diff.c:5566
 msgid "how white spaces are ignored in --color-moved"
 msgstr "wie Whitespaces in --color-moved ignoriert werden"
 
-#: diff.c:5553
+#: diff.c:5569
 msgid "Other diff options"
 msgstr "Andere Diff-Optionen"
 
-#: diff.c:5555
+#: diff.c:5571
 msgid "when run from subdir, exclude changes outside and show relative paths"
 msgstr ""
 "wenn vom Unterverzeichnis aufgerufen, schließe Änderungen außerhalb aus und "
 "zeige relative Pfade an"
 
-#: diff.c:5559
+#: diff.c:5575
 msgid "treat all files as text"
 msgstr "alle Dateien als Text behandeln"
 
-#: diff.c:5561
+#: diff.c:5577
 msgid "swap two inputs, reverse the diff"
 msgstr "die beiden Eingaben vertauschen und die Änderungen umkehren"
 
-#: diff.c:5563
+#: diff.c:5579
 msgid "exit with 1 if there were differences, 0 otherwise"
 msgstr ""
 "mit Exit-Status 1 beenden, wenn Änderungen vorhanden sind, andernfalls mit 0"
 
-#: diff.c:5565
+#: diff.c:5581
 msgid "disable all output of the program"
 msgstr "alle Ausgaben vom Programm deaktivieren"
 
-#: diff.c:5567
+#: diff.c:5583
 msgid "allow an external diff helper to be executed"
 msgstr "erlaube die Ausführung eines externes Programms für Änderungen"
 
-#: diff.c:5569
+#: diff.c:5585
 msgid "run external text conversion filters when comparing binary files"
 msgstr ""
 "Führe externe Text-Konvertierungsfilter aus, wenn binäre Dateien vergleicht "
 "werden"
 
-#: diff.c:5571
+#: diff.c:5587
 msgid "<when>"
 msgstr "<wann>"
 
-#: diff.c:5572
+#: diff.c:5588
 msgid "ignore changes to submodules in the diff generation"
 msgstr ""
 "Änderungen in Submodulen während der Erstellung der Unterschiede ignorieren"
 
-#: diff.c:5575
+#: diff.c:5591
 msgid "<format>"
 msgstr "<Format>"
 
-#: diff.c:5576
+#: diff.c:5592
 msgid "specify how differences in submodules are shown"
 msgstr "angeben, wie Unterschiede in Submodulen gezeigt werden"
 
-#: diff.c:5580
+#: diff.c:5596
 msgid "hide 'git add -N' entries from the index"
 msgstr "'git add -N' Einträge vom Index verstecken"
 
-#: diff.c:5583
+#: diff.c:5599
 msgid "treat 'git add -N' entries as real in the index"
 msgstr "'git add -N' Einträge im Index als echt behandeln"
 
-#: diff.c:5585
+#: diff.c:5601
 msgid "<string>"
 msgstr "<Zeichenkette>"
 
-#: diff.c:5586
+#: diff.c:5602
 msgid ""
 "look for differences that change the number of occurrences of the specified "
 "string"
@@ -3827,7 +3890,7 @@
 "nach Unterschieden suchen, welche die Anzahl des Vorkommens der angegebenen "
 "Zeichenkette verändern"
 
-#: diff.c:5589
+#: diff.c:5605
 msgid ""
 "look for differences that change the number of occurrences of the specified "
 "regex"
@@ -3835,25 +3898,37 @@
 "nach Unterschieden suchen, welche die Anzahl des Vorkommens des angegebenen "
 "regulären Ausdrucks verändern"
 
-#: diff.c:5592
+#: diff.c:5608
 msgid "show all changes in the changeset with -S or -G"
 msgstr "alle Änderungen im Changeset mit -S oder -G anzeigen"
 
-#: diff.c:5595
+#: diff.c:5611
 msgid "treat <string> in -S as extended POSIX regular expression"
 msgstr ""
 "<Zeichenkette> bei -S als erweiterten POSIX regulären Ausdruck behandeln"
 
-#: diff.c:5598
+#: diff.c:5614
 msgid "control the order in which files appear in the output"
 msgstr ""
 "die Reihenfolge kontrollieren, in der die Dateien in der Ausgabe erscheinen"
 
-#: diff.c:5599
+#: diff.c:5615 diff.c:5618
+msgid "<path>"
+msgstr "<Pfad>"
+
+#: diff.c:5616
+msgid "show the change in the specified path first"
+msgstr "die Änderung des angegebenen Pfades zuerst anzeigen"
+
+#: diff.c:5619
+msgid "skip the output to the specified path"
+msgstr "überspringe die Ausgabe bis zum angegebenen Pfad"
+
+#: diff.c:5621
 msgid "<object-id>"
 msgstr "<Objekt-ID>"
 
-#: diff.c:5600
+#: diff.c:5622
 msgid ""
 "look for differences that change the number of occurrences of the specified "
 "object"
@@ -3861,33 +3936,33 @@
 "nach Unterschieden suchen, welche die Anzahl des Vorkommens des angegebenen "
 "Objektes verändern"
 
-#: diff.c:5602
+#: diff.c:5624
 msgid "[(A|C|D|M|R|T|U|X|B)...[*]]"
 msgstr "[(A|C|D|M|R|T|U|X|B)...[*]]"
 
-#: diff.c:5603
+#: diff.c:5625
 msgid "select files by diff type"
 msgstr "Dateien anhand der Art der Änderung wählen"
 
-#: diff.c:5605
+#: diff.c:5627
 msgid "<file>"
 msgstr "<Datei>"
 
-#: diff.c:5606
+#: diff.c:5628
 msgid "Output to a specific file"
 msgstr "Ausgabe zu einer bestimmten Datei"
 
-#: diff.c:6263
+#: diff.c:6285
 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:6266
+#: diff.c:6288
 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:6269
+#: diff.c:6291
 #, c-format
 msgid ""
 "you may want to set your %s variable to at least %d and retry the command."
@@ -3900,10 +3975,15 @@
 msgid "failed to read orderfile '%s'"
 msgstr "Fehler beim Lesen der Reihenfolgedatei '%s'"
 
-#: diffcore-rename.c:592
+#: diffcore-rename.c:786
 msgid "Performing inexact rename detection"
 msgstr "Führe Erkennung für ungenaue Umbenennung aus"
 
+#: diffcore-rotate.c:29
+#, c-format
+msgid "No such path '%s' in the diff"
+msgstr "Pfad '%s' nicht im Diff gefunden"
+
 #: dir.c:578
 #, c-format
 msgid "pathspec '%s' did not match any file(s) known to git"
@@ -3950,17 +4030,17 @@
 "Cache für unversionierte Dateien ist auf diesem System oder\n"
 "für dieses Verzeichnis deaktiviert"
 
-#: dir.c:3520
+#: dir.c:3534
 #, c-format
 msgid "index file corrupt in repo %s"
 msgstr "Index-Datei in Repository %s beschädigt"
 
-#: dir.c:3565 dir.c:3570
+#: dir.c:3579 dir.c:3584
 #, c-format
 msgid "could not create directories for %s"
 msgstr "Konnte Verzeichnisse für '%s' nicht erstellen"
 
-#: dir.c:3599
+#: dir.c:3613
 #, c-format
 msgid "could not migrate git directory from '%s' to '%s'"
 msgstr "Konnte Git-Verzeichnis nicht von '%s' nach '%s' migrieren"
@@ -3979,12 +4059,12 @@
 msgid "could not stat file '%s'"
 msgstr "konnte Datei '%s' nicht lesen"
 
-#: environment.c:150
+#: environment.c:152
 #, c-format
 msgid "bad git namespace path \"%s\""
 msgstr "ungültiger Git-Namespace-Pfad \"%s\""
 
-#: environment.c:337
+#: environment.c:335
 #, c-format
 msgid "could not set GIT_DIR to '%s'"
 msgstr "konnte GIT_DIR nicht zu '%s' setzen"
@@ -4019,32 +4099,32 @@
 msgid "--stateless-rpc requires multi_ack_detailed"
 msgstr "--stateless-rpc benötigt multi_ack_detailed"
 
-#: fetch-pack.c:378 fetch-pack.c:1406
+#: fetch-pack.c:378 fetch-pack.c:1457
 #, c-format
 msgid "invalid shallow line: %s"
 msgstr "ungültige shallow-Zeile: %s"
 
-#: fetch-pack.c:384 fetch-pack.c:1412
+#: fetch-pack.c:384 fetch-pack.c:1463
 #, c-format
 msgid "invalid unshallow line: %s"
 msgstr "ungültige unshallow-Zeile: %s"
 
-#: fetch-pack.c:386 fetch-pack.c:1414
+#: fetch-pack.c:386 fetch-pack.c:1465
 #, c-format
 msgid "object not found: %s"
 msgstr "Objekt nicht gefunden: %s"
 
-#: fetch-pack.c:389 fetch-pack.c:1417
+#: fetch-pack.c:389 fetch-pack.c:1468
 #, c-format
 msgid "error in object: %s"
 msgstr "Fehler in Objekt: %s"
 
-#: fetch-pack.c:391 fetch-pack.c:1419
+#: fetch-pack.c:391 fetch-pack.c:1470
 #, c-format
 msgid "no shallow found: %s"
 msgstr "kein shallow-Objekt gefunden: %s"
 
-#: fetch-pack.c:394 fetch-pack.c:1423
+#: fetch-pack.c:394 fetch-pack.c:1474
 #, c-format
 msgid "expected shallow/unshallow, got %s"
 msgstr "shallow/unshallow erwartet, %s bekommen"
@@ -4082,171 +4162,175 @@
 msgid "already have %s (%s)"
 msgstr "habe %s (%s) bereits"
 
-#: fetch-pack.c:827
+#: fetch-pack.c:844
 msgid "fetch-pack: unable to fork off sideband demultiplexer"
 msgstr "fetch-pack: Fehler beim Starten des sideband demultiplexer"
 
-#: fetch-pack.c:835
+#: fetch-pack.c:852
 msgid "protocol error: bad pack header"
 msgstr "Protokollfehler: ungültiger Pack-Header"
 
-#: fetch-pack.c:919
+#: fetch-pack.c:946
 #, c-format
 msgid "fetch-pack: unable to fork off %s"
 msgstr "fetch-pack: konnte %s nicht starten"
 
-#: fetch-pack.c:937
+#: fetch-pack.c:952
+msgid "fetch-pack: invalid index-pack output"
+msgstr "fetch-pack: ungültige index-pack Ausgabe"
+
+#: fetch-pack.c:969
 #, c-format
 msgid "%s failed"
 msgstr "%s fehlgeschlagen"
 
-#: fetch-pack.c:939
+#: fetch-pack.c:971
 msgid "error in sideband demultiplexer"
 msgstr "Fehler in sideband demultiplexer"
 
-#: fetch-pack.c:982
+#: fetch-pack.c:1031
 #, c-format
 msgid "Server version is %.*s"
 msgstr "Server-Version ist %.*s"
 
-#: fetch-pack.c:990 fetch-pack.c:996 fetch-pack.c:999 fetch-pack.c:1005
-#: fetch-pack.c:1009 fetch-pack.c:1013 fetch-pack.c:1017 fetch-pack.c:1021
-#: fetch-pack.c:1025 fetch-pack.c:1029 fetch-pack.c:1033 fetch-pack.c:1037
-#: fetch-pack.c:1043 fetch-pack.c:1049 fetch-pack.c:1054 fetch-pack.c:1059
+#: fetch-pack.c:1039 fetch-pack.c:1045 fetch-pack.c:1048 fetch-pack.c:1054
+#: fetch-pack.c:1058 fetch-pack.c:1062 fetch-pack.c:1066 fetch-pack.c:1070
+#: fetch-pack.c:1074 fetch-pack.c:1078 fetch-pack.c:1082 fetch-pack.c:1086
+#: fetch-pack.c:1092 fetch-pack.c:1098 fetch-pack.c:1103 fetch-pack.c:1108
 #, c-format
 msgid "Server supports %s"
 msgstr "Server unterstützt %s"
 
-#: fetch-pack.c:992
+#: fetch-pack.c:1041
 msgid "Server does not support shallow clients"
 msgstr "Server unterstützt keine shallow-Clients"
 
-#: fetch-pack.c:1052
+#: fetch-pack.c:1101
 msgid "Server does not support --shallow-since"
 msgstr "Server unterstützt kein --shallow-since"
 
-#: fetch-pack.c:1057
+#: fetch-pack.c:1106
 msgid "Server does not support --shallow-exclude"
 msgstr "Server unterstützt kein --shallow-exclude"
 
-#: fetch-pack.c:1061
+#: fetch-pack.c:1110
 msgid "Server does not support --deepen"
 msgstr "Server unterstützt kein --deepen"
 
-#: fetch-pack.c:1063
+#: fetch-pack.c:1112
 msgid "Server does not support this repository's object format"
 msgstr "Server unterstützt das Objekt-Format dieses Repositories nicht"
 
-#: fetch-pack.c:1076
+#: fetch-pack.c:1125
 msgid "no common commits"
 msgstr "keine gemeinsamen Commits"
 
-#: fetch-pack.c:1088 fetch-pack.c:1628
+#: fetch-pack.c:1138 fetch-pack.c:1682
 msgid "git fetch-pack: fetch failed."
 msgstr "git fetch-pack: Abholen fehlgeschlagen."
 
-#: fetch-pack.c:1214
+#: fetch-pack.c:1265
 #, c-format
 msgid "mismatched algorithms: client %s; server %s"
 msgstr "Algorithmen stimmen nicht überein: Client %s; Server %s"
 
-#: fetch-pack.c:1218
+#: fetch-pack.c:1269
 #, c-format
 msgid "the server does not support algorithm '%s'"
 msgstr "der Server unterstützt Algorithmus '%s' nicht"
 
-#: fetch-pack.c:1238
+#: fetch-pack.c:1289
 msgid "Server does not support shallow requests"
 msgstr "Server unterstützt keine shallow-Anfragen"
 
-#: fetch-pack.c:1245
+#: fetch-pack.c:1296
 msgid "Server supports filter"
 msgstr "Server unterstützt Filter"
 
-#: fetch-pack.c:1284
+#: fetch-pack.c:1335
 msgid "unable to write request to remote"
 msgstr "konnte Anfrage nicht zum Remote schreiben"
 
-#: fetch-pack.c:1302
+#: fetch-pack.c:1353
 #, c-format
 msgid "error reading section header '%s'"
 msgstr "Fehler beim Lesen von Sektionskopf '%s'."
 
-#: fetch-pack.c:1308
+#: fetch-pack.c:1359
 #, c-format
 msgid "expected '%s', received '%s'"
 msgstr "'%s' erwartet, '%s' empfangen"
 
-#: fetch-pack.c:1369
+#: fetch-pack.c:1420
 #, c-format
 msgid "unexpected acknowledgment line: '%s'"
 msgstr "Unerwartete Acknowledgment-Zeile: '%s'"
 
-#: fetch-pack.c:1374
+#: fetch-pack.c:1425
 #, c-format
 msgid "error processing acks: %d"
 msgstr "Fehler beim Verarbeiten von ACKS: %d"
 
-#: fetch-pack.c:1384
+#: fetch-pack.c:1435
 msgid "expected packfile to be sent after 'ready'"
 msgstr "Erwartete Versand einer Packdatei nach 'ready'."
 
-#: fetch-pack.c:1386
+#: fetch-pack.c:1437
 msgid "expected no other sections to be sent after no 'ready'"
 msgstr "Erwartete keinen Versand einer anderen Sektion ohne 'ready'."
 
-#: fetch-pack.c:1428
+#: fetch-pack.c:1479
 #, c-format
 msgid "error processing shallow info: %d"
 msgstr "Fehler beim Verarbeiten von Shallow-Informationen: %d"
 
-#: fetch-pack.c:1475
+#: fetch-pack.c:1526
 #, c-format
 msgid "expected wanted-ref, got '%s'"
 msgstr "wanted-ref erwartet, '%s' bekommen"
 
-#: fetch-pack.c:1480
+#: fetch-pack.c:1531
 #, c-format
 msgid "unexpected wanted-ref: '%s'"
 msgstr "unerwartetes wanted-ref: '%s'"
 
-#: fetch-pack.c:1485
+#: fetch-pack.c:1536
 #, c-format
 msgid "error processing wanted refs: %d"
 msgstr "Fehler beim Verarbeiten von wanted-refs: %d"
 
-#: fetch-pack.c:1515
+#: fetch-pack.c:1566
 msgid "git fetch-pack: expected response end packet"
 msgstr "git fetch-pack: Antwort-Endpaket erwartet"
 
-#: fetch-pack.c:1897
+#: fetch-pack.c:1960
 msgid "no matching remote head"
 msgstr "kein übereinstimmender Remote-Branch"
 
-#: fetch-pack.c:1920 builtin/clone.c:693
+#: fetch-pack.c:1983 builtin/clone.c:693
 msgid "remote did not send all necessary objects"
 msgstr "Remote-Repository hat nicht alle erforderlichen Objekte gesendet"
 
-#: fetch-pack.c:1947
+#: fetch-pack.c:2010
 #, c-format
 msgid "no such remote ref %s"
-msgstr "keine solche Remote-Referenz %s"
+msgstr "Remote-Referenz %s nicht gefunden"
 
-#: fetch-pack.c:1950
+#: fetch-pack.c:2013
 #, c-format
 msgid "Server does not allow request for unadvertised object %s"
 msgstr "Der Server lehnt Anfrage nach nicht angebotenem Objekt %s ab."
 
-#: gpg-interface.c:272
+#: gpg-interface.c:273
 msgid "could not create temporary file"
 msgstr "konnte temporäre Datei nicht erstellen"
 
-#: gpg-interface.c:275
+#: gpg-interface.c:276
 #, c-format
 msgid "failed writing detached signature to '%s'"
 msgstr "Fehler beim Schreiben der losgelösten Signatur nach '%s'"
 
-#: gpg-interface.c:457
+#: gpg-interface.c:470
 msgid "gpg failed to sign the data"
 msgstr "gpg beim Signieren der Daten fehlgeschlagen"
 
@@ -4255,7 +4339,7 @@
 msgid "ignore invalid color '%.*s' in log.graphColors"
 msgstr "Ignoriere ungültige Farbe '%.*s' in log.graphColors"
 
-#: grep.c:640
+#: grep.c:543
 msgid ""
 "given pattern contains NULL byte (via -f <file>). This is only supported "
 "with -P under PCRE v2"
@@ -4263,18 +4347,18 @@
 "Angegebenes Muster enthält NULL Byte (über -f <Datei>). Das wird nur mit -"
 "Punter PCRE v2 unterstützt."
 
-#: grep.c:2100
+#: grep.c:1906
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "'%s': konnte %s nicht lesen"
 
-#: grep.c:2117 setup.c:176 builtin/clone.c:412 builtin/diff.c:89
+#: grep.c:1923 setup.c:176 builtin/clone.c:412 builtin/diff.c:90
 #: builtin/rm.c:135
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "Konnte '%s' nicht lesen"
 
-#: grep.c:2128
+#: grep.c:1934
 #, c-format
 msgid "'%s': short read"
 msgstr "'%s': read() zu kurz"
@@ -4344,7 +4428,7 @@
 msgid "These are common Git commands used in various situations:"
 msgstr "Allgemeine Git-Befehle, verwendet in verschiedenen Situationen:"
 
-#: help.c:365 git.c:99
+#: help.c:365 git.c:100
 #, c-format
 msgid "unsupported command listing type '%s'"
 msgstr "Nicht unterstützte Art zur Befehlsauflistung '%s'."
@@ -4588,11 +4672,255 @@
 msgid "Unable to create '%s.lock': %s"
 msgstr "Konnte '%s.lock' nicht erstellen: %s"
 
-#: ls-refs.c:109
+#: ls-refs.c:37
+#, c-format
+msgid "invalid value '%s' for lsrefs.unborn"
+msgstr "ungültiger Wert '%s' für lsrefs.unborn"
+
+#: ls-refs.c:167
 msgid "expected flush after ls-refs arguments"
 msgstr "erwartete Flush nach Argumenten für die Auflistung der Referenzen"
 
-#: merge-ort-wrappers.c:13 merge-recursive.c:3672
+#: merge-ort.c:888 merge-recursive.c:1191
+#, c-format
+msgid "Failed to merge submodule %s (not checked out)"
+msgstr "Fehler beim Merge von Submodul %s (nicht ausgecheckt)."
+
+#: merge-ort.c:897 merge-recursive.c:1198
+#, c-format
+msgid "Failed to merge submodule %s (commits not present)"
+msgstr "Fehler beim Merge von Submodul %s (Commits nicht vorhanden)."
+
+#: merge-ort.c:906 merge-recursive.c:1205
+#, c-format
+msgid "Failed to merge submodule %s (commits don't follow merge-base)"
+msgstr "Fehler beim Merge von Submodul %s (Commits folgen keiner Merge-Basis)"
+
+#: merge-ort.c:916 merge-ort.c:923
+#, c-format
+msgid "Note: Fast-forwarding submodule %s to %s"
+msgstr "Hinweis: Spule Submodul %s vor zu %s"
+
+#: merge-ort.c:944
+#, c-format
+msgid "Failed to merge submodule %s"
+msgstr "Fehler beim Zusammenführen von Submodul %s"
+
+#: merge-ort.c:951
+#, c-format
+msgid ""
+"Failed to merge submodule %s, but a possible merge resolution exists:\n"
+"%s\n"
+msgstr ""
+"Fehler beim Zusammenführen von Submodul %s, aber es ist eine mögliche "
+"Auflösung des Merges vorhanden:\n"
+"%s\n"
+
+#: merge-ort.c:955 merge-recursive.c:1259
+#, c-format
+msgid ""
+"If this is correct simply add it to the index for example\n"
+"by using:\n"
+"\n"
+"  git update-index --cacheinfo 160000 %s \"%s\"\n"
+"\n"
+"which will accept this suggestion.\n"
+msgstr ""
+"Falls das korrekt ist, fügen Sie es einfach der Staging-Area, zum Beispiel "
+"mit:\n"
+"\n"
+"  git update-index --cacheinfo 160000 %s \"%s\"\n"
+"\n"
+"hinzu, um diesen Vorschlag zu akzeptieren.\n"
+
+#: merge-ort.c:968
+#, c-format
+msgid ""
+"Failed to merge submodule %s, but multiple possible merges exist:\n"
+"%s"
+msgstr ""
+"Fehler beim Zusammenführen von Submodul %s, aber mehrere mögliche Merges "
+"sind vorhanden:\n"
+"%s"
+
+#: merge-ort.c:1127 merge-recursive.c:1341
+msgid "Failed to execute internal merge"
+msgstr "Fehler bei Ausführung des internen Merges"
+
+#: merge-ort.c:1132 merge-recursive.c:1346
+#, c-format
+msgid "Unable to add %s to database"
+msgstr "Konnte %s nicht zur Datenbank hinzufügen"
+
+#: merge-ort.c:1139 merge-recursive.c:1378
+#, c-format
+msgid "Auto-merging %s"
+msgstr "automatischer Merge von %s"
+
+#: merge-ort.c:1278 merge-recursive.c:2100
+#, c-format
+msgid ""
+"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
+"implicit directory rename(s) putting the following path(s) there: %s."
+msgstr ""
+"KONFLIKT (implizite Verzeichnisumbenennung): Existierende Datei/Pfad bei %s "
+"im\n"
+"Weg von impliziter Verzeichnisumbenennung, die versucht, einen oder mehrere\n"
+"Pfade dahin zu setzen: %s."
+
+#: merge-ort.c:1288 merge-recursive.c:2110
+#, c-format
+msgid ""
+"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
+"implicit directory renames tried to put these paths there: %s"
+msgstr ""
+"KONFLIKT (implizite Verzeichnisumbenennung): Kann nicht mehr als ein Pfad "
+"zu\n"
+"%s mappen; implizite Verzeichnisumbenennungen versuchten diese Pfade dahin\n"
+"zu setzen: %s"
+
+#: merge-ort.c:1471
+#, c-format
+msgid ""
+"CONFLICT (directory rename split): Unclear where to rename %s to; it was "
+"renamed to multiple other directories, with no destination getting a "
+"majority of the files."
+msgstr ""
+"KONFLIKT (Aufteilung Verzeichnisumbenennung): Unklar, wo %s zu platzieren "
+"ist; es wurde zu mehreren anderen Verzeichnissen umbenannt, ohne dass ein "
+"Ziel die Mehrheit der Dateien erhält."
+
+#: merge-ort.c:1637 merge-recursive.c:2447
+#, c-format
+msgid ""
+"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
+"renamed."
+msgstr ""
+"WARNUNG: Vermeide Umbenennung %s -> %s von %s, weil %s selbst umbenannt "
+"wurde."
+
+#: merge-ort.c:1781 merge-recursive.c:3215
+#, c-format
+msgid ""
+"Path updated: %s added in %s inside a directory that was renamed in %s; "
+"moving it to %s."
+msgstr ""
+"Pfad aktualisiert: %s hinzugefügt in %s innerhalb eines Verzeichnisses, das "
+"umbenannt wurde in %s; Verschiebe es nach %s."
+
+#: merge-ort.c:1788 merge-recursive.c:3222
+#, c-format
+msgid ""
+"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
+"%s; moving it to %s."
+msgstr ""
+"Pfad aktualisiert: %s umbenannt nach %s in %s, innerhalb eines "
+"Verzeichnisses, das umbenannt wurde in %s; Verschiebe es nach %s."
+
+#: merge-ort.c:1801 merge-recursive.c:3218
+#, c-format
+msgid ""
+"CONFLICT (file location): %s added in %s inside a directory that was renamed "
+"in %s, suggesting it should perhaps be moved to %s."
+msgstr ""
+"KONFLIKT (Speicherort): %s hinzugefügt in %s innerhalb eines Verzeichnisses, "
+"das umbenannt wurde in %s, es sollte vielleicht nach %s verschoben werden."
+
+#: merge-ort.c:1809 merge-recursive.c:3225
+#, c-format
+msgid ""
+"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
+"was renamed in %s, suggesting it should perhaps be moved to %s."
+msgstr ""
+"KONFLIKT (Speicherort): %s umbenannt nach %s in %s, innerhalb eines "
+"Verzeichnisses, das umbenannt wurde in %s, es sollte vielleicht nach %s "
+"verschoben werden."
+
+#: merge-ort.c:1952
+#, c-format
+msgid "CONFLICT (rename/rename): %s renamed to %s in %s and to %s in %s."
+msgstr ""
+"KONFLIKT (umbenennen/umbenennen): %s zu %s in %s umbenannt und zu %s in %s."
+
+#: merge-ort.c:2047
+#, c-format
+msgid ""
+"CONFLICT (rename involved in collision): rename of %s -> %s has content "
+"conflicts AND collides with another path; this may result in nested conflict "
+"markers."
+msgstr ""
+"KONFLIKT (Umbenennung in Kollision beteiligt): Umbenennung von %s -> %s hat "
+"Inhaltskonflikte UND kollidiert mit einem anderen Pfad; dies kann zu "
+"verschachtelten Konfliktmarkierungen führen."
+
+#: merge-ort.c:2066 merge-ort.c:2090
+#, c-format
+msgid "CONFLICT (rename/delete): %s renamed to %s in %s, but deleted in %s."
+msgstr ""
+"KONFLIKT (umbenennen/löschen): %s zu %s in %s umbenannt, aber in %s gelöscht."
+
+#: merge-ort.c:2735
+#, c-format
+msgid ""
+"CONFLICT (file/directory): directory in the way of %s from %s; moving it to "
+"%s instead."
+msgstr ""
+"KONFLIKT (Datei/Verzeichnis): Verzeichnis im Weg von %s aus %s; stattdessen "
+"nach %s verschieben."
+
+#: merge-ort.c:2808
+#, c-format
+msgid ""
+"CONFLICT (distinct types): %s had different types on each side; renamed %s "
+"of them so each can be recorded somewhere."
+msgstr ""
+"KONFLIKT (verschiedene Typen): %s hatte unterschiedliche Typen auf jeder "
+"Seite; %s wurde(n) umbenannt, damit jeder irgendwo aufgezeichnet werden kann."
+
+#: merge-ort.c:2812
+msgid "both"
+msgstr "beide"
+
+#: merge-ort.c:2812
+msgid "one"
+msgstr "einer"
+
+#: merge-ort.c:2907 merge-recursive.c:3052
+msgid "content"
+msgstr "Inhalt"
+
+#: merge-ort.c:2909 merge-recursive.c:3056
+msgid "add/add"
+msgstr "hinzufügen/hinzufügen"
+
+#: merge-ort.c:2911 merge-recursive.c:3101
+msgid "submodule"
+msgstr "Submodul"
+
+#: merge-ort.c:2913 merge-recursive.c:3102
+#, c-format
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "KONFLIKT (%s): Merge-Konflikt in %s"
+
+#: merge-ort.c:2938
+#, c-format
+msgid ""
+"CONFLICT (modify/delete): %s deleted in %s and modified in %s.  Version %s "
+"of %s left in tree."
+msgstr ""
+"KONFLIKT (ändern/löschen): %s gelöscht in %s und geändert in %s. Stand %s "
+"von %s wurde im Arbeitsbereich gelassen."
+
+#. TRANSLATORS: The %s arguments are: 1) tree hash of a merge
+#. base, and 2-3) the trees for the two trees we're merging.
+#.
+#: merge-ort.c:3406
+#, c-format
+msgid "collecting merge info failed for trees %s, %s, %s"
+msgstr ""
+"Sammeln von Merge-Informationen für die Referenzen %s, %s, %s fehlgeschlagen"
+
+#: merge-ort-wrappers.c:13 merge-recursive.c:3661
 #, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by merge:\n"
@@ -4667,21 +4995,6 @@
 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:1191
-#, c-format
-msgid "Failed to merge submodule %s (not checked out)"
-msgstr "Fehler beim Merge von Submodul %s (nicht ausgecheckt)."
-
-#: merge-recursive.c:1198
-#, c-format
-msgid "Failed to merge submodule %s (commits not present)"
-msgstr "Fehler beim Merge von Submodul %s (Commits nicht vorhanden)."
-
-#: merge-recursive.c:1205
-#, c-format
-msgid "Failed to merge submodule %s (commits don't follow merge-base)"
-msgstr "Fehler beim Merge von Submodul %s (Commits folgen keiner Merge-Basis)"
-
 #: merge-recursive.c:1213 merge-recursive.c:1225
 #, c-format
 msgid "Fast-forwarding submodule %s to the following commit:"
@@ -4708,42 +5021,11 @@
 msgid "Found a possible merge resolution for the submodule:\n"
 msgstr "Mögliche Auflösung des Merges für Submodul gefunden:\n"
 
-#: merge-recursive.c:1259
-#, c-format
-msgid ""
-"If this is correct simply add it to the index for example\n"
-"by using:\n"
-"\n"
-"  git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"which will accept this suggestion.\n"
-msgstr ""
-"Falls das korrekt ist, fügen Sie es einfach der Staging-Area, zum Beispiel "
-"mit:\n"
-"\n"
-"  git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"hinzu, um diesen Vorschlag zu akzeptieren.\n"
-
 #: merge-recursive.c:1268
 #, c-format
 msgid "Failed to merge submodule %s (multiple merges found)"
 msgstr "Fehler beim Merge von Submodul %s (mehrere Merges gefunden)"
 
-#: merge-recursive.c:1341
-msgid "Failed to execute internal merge"
-msgstr "Fehler bei Ausführung des internen Merges"
-
-#: merge-recursive.c:1346
-#, c-format
-msgid "Unable to add %s to database"
-msgstr "Konnte %s nicht zur Datenbank hinzufügen"
-
-#: merge-recursive.c:1378
-#, c-format
-msgid "Auto-merging %s"
-msgstr "automatischer Merge von %s"
-
 #: merge-recursive.c:1402
 #, c-format
 msgid "Error: Refusing to lose untracked file at %s; writing to %s instead."
@@ -4859,28 +5141,6 @@
 "wobei\n"
 "keines dieser Ziele die Mehrheit der Dateien erhielt."
 
-#: merge-recursive.c:2100
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
-"implicit directory rename(s) putting the following path(s) there: %s."
-msgstr ""
-"KONFLIKT (implizite Verzeichnisumbenennung): Existierende Datei/Pfad bei %s "
-"im\n"
-"Weg von impliziter Verzeichnisumbenennung, die versucht, einen oder mehrere\n"
-"Pfade dahin zu setzen: %s."
-
-#: merge-recursive.c:2110
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
-"implicit directory renames tried to put these paths there: %s"
-msgstr ""
-"KONFLIKT (implizite Verzeichnisumbenennung): Kann nicht mehr als ein Pfad "
-"zu\n"
-"%s mappen; implizite Verzeichnisumbenennungen versuchten diese Pfade dahin\n"
-"zu setzen: %s"
-
 #: merge-recursive.c:2202
 #, c-format
 msgid ""
@@ -4890,15 +5150,6 @@
 "KONFLIKT (umbenennen/umbenennen): Benenne Verzeichnis um %s->%s in %s.\n"
 "Benenne Verzeichnis um %s->%s in %s"
 
-#: merge-recursive.c:2447
-#, c-format
-msgid ""
-"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
-"renamed."
-msgstr ""
-"WARNUNG: Vermeide Umbenennung %s -> %s von %s, weil %s selbst umbenannt "
-"wurde."
-
 #: merge-recursive.c:2973
 #, c-format
 msgid "cannot read object %s"
@@ -4917,70 +5168,16 @@
 msgid "modified"
 msgstr "geändert"
 
-#: merge-recursive.c:3052
-msgid "content"
-msgstr "Inhalt"
-
-#: merge-recursive.c:3056
-msgid "add/add"
-msgstr "hinzufügen/hinzufügen"
-
 #: merge-recursive.c:3079
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "%s ausgelassen (Ergebnis des Merges existiert bereits)"
 
-#: merge-recursive.c:3101
-msgid "submodule"
-msgstr "Submodul"
-
-#: merge-recursive.c:3102
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "KONFLIKT (%s): Merge-Konflikt in %s"
-
 #: merge-recursive.c:3132
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Füge stattdessen als %s hinzu"
 
-#: merge-recursive.c:3215
-#, c-format
-msgid ""
-"Path updated: %s added in %s inside a directory that was renamed in %s; "
-"moving it to %s."
-msgstr ""
-"Pfad aktualisiert: %s hinzugefügt in %s innerhalb eines Verzeichnisses, das "
-"umbenannt wurde in %s; Verschiebe es nach %s."
-
-#: merge-recursive.c:3218
-#, c-format
-msgid ""
-"CONFLICT (file location): %s added in %s inside a directory that was renamed "
-"in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-"KONFLIKT (Speicherort): %s hinzugefügt in %s innerhalb eines Verzeichnisses, "
-"das umbenannt wurde in %s, es sollte vielleicht nach %s verschoben werden."
-
-#: merge-recursive.c:3222
-#, c-format
-msgid ""
-"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
-"%s; moving it to %s."
-msgstr ""
-"Pfad aktualisiert: %s umbenannt nach %s in %s, innerhalb eines "
-"Verzeichnisses, das umbenannt wurde in %s; Verschiebe es nach %s."
-
-#: merge-recursive.c:3225
-#, c-format
-msgid ""
-"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
-"was renamed in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-"KONFLIKT (Speicherort): %s umbenannt nach %s in %s, innerhalb eines "
-"Verzeichnisses, das umbenannt wurde in %s, es sollte vielleicht nach %s "
-"verschoben werden."
-
 #: merge-recursive.c:3339
 #, c-format
 msgid "Removing %s"
@@ -5016,27 +5213,28 @@
 msgid "merging of trees %s and %s failed"
 msgstr "Zusammenführen der \"Tree\"-Objekte %s und %s fehlgeschlagen"
 
-#: merge-recursive.c:3550
+#: merge-recursive.c:3539
 msgid "Merging:"
 msgstr "Merge:"
 
-#: merge-recursive.c:3563
+#: merge-recursive.c:3552
 #, 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:3613
+#: merge-recursive.c:3602
 msgid "merge returned no commit"
 msgstr "Merge hat keinen Commit zurückgegeben"
 
-#: merge-recursive.c:3769
+#: merge-recursive.c:3758
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: merge-recursive.c:3787 builtin/merge.c:711 builtin/merge.c:895
+#: merge-recursive.c:3776 builtin/merge.c:712 builtin/merge.c:896
+#: builtin/stash.c:471
 msgid "Unable to write index."
 msgstr "Konnte Index nicht schreiben."
 
@@ -5044,118 +5242,110 @@
 msgid "failed to read the cache"
 msgstr "Lesen des Zwischenspeichers fehlgeschlagen"
 
-#: merge.c:109 rerere.c:720 builtin/am.c:1883 builtin/am.c:1917
-#: builtin/checkout.c:573 builtin/checkout.c:829 builtin/clone.c:817
+#: merge.c:109 rerere.c:704 builtin/am.c:1883 builtin/am.c:1917
+#: builtin/checkout.c:575 builtin/checkout.c:828 builtin/clone.c:817
 #: builtin/stash.c:265
 msgid "unable to write new index file"
 msgstr "Konnte neue Index-Datei nicht schreiben."
 
-#: midx.c:80
+#: midx.c:62
+msgid "multi-pack-index OID fanout is of the wrong size"
+msgstr "multi-pack-index OID fanout hat die falsche Größe"
+
+#: midx.c:93
 #, c-format
 msgid "multi-pack-index file %s is too small"
 msgstr "multi-pack-index-Datei %s ist zu klein."
 
-#: midx.c:96
+#: midx.c:109
 #, c-format
 msgid "multi-pack-index signature 0x%08x does not match signature 0x%08x"
 msgstr ""
 "multi-pack-index-Signatur 0x%08x stimmt nicht mit Signatur 0x%08x überein."
 
-#: midx.c:101
+#: midx.c:114
 #, c-format
 msgid "multi-pack-index version %d not recognized"
 msgstr "multi-pack-index-Version %d nicht erkannt."
 
-#: midx.c:106
+#: midx.c:119
 #, c-format
 msgid "multi-pack-index hash version %u does not match version %u"
 msgstr "multi-pack-index Hash-Version %u stimmt nicht mit Version %u überein"
 
-#: midx.c:123
-msgid "invalid chunk offset (too large)"
-msgstr "Ungültiger Chunk-Offset (zu groß)"
-
-#: midx.c:147
-msgid "terminating multi-pack-index chunk id appears earlier than expected"
-msgstr "Abschließende multi-pack-index Chunk-Id erscheint eher als erwartet."
-
-#: midx.c:160
+#: midx.c:136
 msgid "multi-pack-index missing required pack-name chunk"
-msgstr "multi-pack-index fehlt erforderlicher pack-name Chunk."
+msgstr "multi-pack-index fehlt erforderlicher Pack-Namen Chunk"
 
-#: midx.c:162
+#: midx.c:138
 msgid "multi-pack-index missing required OID fanout chunk"
-msgstr "multi-pack-index fehlt erforderlicher OID fanout Chunk."
+msgstr "multi-pack-index fehlt erforderlicher OID fanout Chunk"
 
-#: midx.c:164
+#: midx.c:140
 msgid "multi-pack-index missing required OID lookup chunk"
-msgstr "multi-pack-index fehlt erforderlicher OID lookup Chunk."
+msgstr "multi-pack-index fehlt erforderlicher OID lookup Chunk"
 
-#: midx.c:166
+#: midx.c:142
 msgid "multi-pack-index missing required object offsets chunk"
-msgstr "multi-pack-index fehlt erforderlicher object offset Chunk."
+msgstr "multi-pack-index fehlt erforderlicher Objekt offset Chunk"
 
-#: midx.c:180
+#: midx.c:158
 #, c-format
 msgid "multi-pack-index pack names out of order: '%s' before '%s'"
 msgstr "Falsche Reihenfolge bei multi-pack-index Pack-Namen: '%s' vor '%s'"
 
-#: midx.c:223
+#: midx.c:202
 #, c-format
 msgid "bad pack-int-id: %u (%u total packs)"
 msgstr "Ungültige pack-int-id: %u (%u Pakete insgesamt)"
 
-#: midx.c:273
+#: midx.c:252
 msgid "multi-pack-index stores a 64-bit offset, but off_t is too small"
 msgstr ""
-"multi-pack-index speichert einen 64-Bit Offset, aber off_t ist zu klein."
+"multi-pack-index speichert einen 64-Bit Offset, aber off_t ist zu klein"
 
-#: midx.c:480
+#: midx.c:467
 #, c-format
 msgid "failed to add packfile '%s'"
-msgstr "Fehler beim Hinzufügen von Packdatei '%s'."
+msgstr "Fehler beim Hinzufügen von Packdatei '%s'"
 
-#: midx.c:486
+#: midx.c:473
 #, c-format
 msgid "failed to open pack-index '%s'"
 msgstr "Fehler beim Öffnen von pack-index '%s'"
 
-#: midx.c:546
+#: midx.c:533
 #, c-format
 msgid "failed to locate object %d in packfile"
-msgstr "Fehler beim Lokalisieren von Objekt %d in Packdatei."
+msgstr "Fehler beim Lokalisieren von Objekt %d in Packdatei"
 
-#: midx.c:846
+#: midx.c:821
 msgid "Adding packfiles to multi-pack-index"
 msgstr "Packdateien zum multi-pack-index hinzufügen"
 
-#: midx.c:879
+#: midx.c:855
 #, c-format
 msgid "did not see pack-file %s to drop"
 msgstr "Pack-Datei %s zum Weglassen nicht gefunden"
 
-#: midx.c:931
+#: midx.c:904
 msgid "no pack files to index."
 msgstr "keine Packdateien zum Indizieren."
 
-#: midx.c:982
-msgid "Writing chunks to multi-pack-index"
-msgstr "Chunks zum multi-pack-index schreiben"
-
-#: midx.c:1060
+#: midx.c:965
 #, c-format
 msgid "failed to clear multi-pack-index at %s"
 msgstr "Fehler beim Löschen des multi-pack-index bei %s"
 
-#: midx.c:1116
+#: midx.c:1021
 msgid "multi-pack-index file exists, but failed to parse"
 msgstr "multi-pack-index-Datei existiert, aber das Parsen schlug fehl"
 
-#: midx.c:1124
+#: midx.c:1029
 msgid "Looking for referenced packfiles"
 msgstr "Suche nach referenzierten Pack-Dateien"
 
-#: midx.c:1139
+#: midx.c:1044
 #, c-format
 msgid ""
 "oid fanout out of order: fanout[%d] = %<PRIx32> > %<PRIx32> = fanout[%d]"
@@ -5163,69 +5353,69 @@
 "Ungültige oid fanout Reihenfolge: fanout[%d] = %<PRIx32> > %<PRIx32> = "
 "fanout[%d]"
 
-#: midx.c:1144
+#: midx.c:1049
 msgid "the midx contains no oid"
 msgstr "das midx enthält keine oid"
 
-#: midx.c:1153
+#: midx.c:1058
 msgid "Verifying OID order in multi-pack-index"
 msgstr "Verifiziere OID-Reihenfolge im multi-pack-index"
 
-#: midx.c:1162
+#: midx.c:1067
 #, c-format
 msgid "oid lookup out of order: oid[%d] = %s >= %s = oid[%d]"
 msgstr "Ungültige oid lookup Reihenfolge: oid[%d] = %s >= %s = oid[%d]"
 
-#: midx.c:1182
+#: midx.c:1087
 msgid "Sorting objects by packfile"
 msgstr "Sortiere Objekte nach Pack-Datei"
 
-#: midx.c:1189
+#: midx.c:1094
 msgid "Verifying object offsets"
 msgstr "Überprüfe Objekt-Offsets"
 
-#: midx.c:1205
+#: midx.c:1110
 #, c-format
 msgid "failed to load pack entry for oid[%d] = %s"
 msgstr "Fehler beim Laden des Pack-Eintrags für oid[%d] = %s"
 
-#: midx.c:1211
+#: midx.c:1116
 #, c-format
 msgid "failed to load pack-index for packfile %s"
 msgstr "Fehler beim Laden des Pack-Index für Packdatei %s"
 
-#: midx.c:1220
+#: midx.c:1125
 #, c-format
 msgid "incorrect object offset for oid[%d] = %s: %<PRIx64> != %<PRIx64>"
 msgstr "Falscher Objekt-Offset für oid[%d] = %s: %<PRIx64> != %<PRIx64>"
 
-#: midx.c:1245
+#: midx.c:1150
 msgid "Counting referenced objects"
 msgstr "Referenzierte Objekte zählen"
 
-#: midx.c:1255
+#: midx.c:1160
 msgid "Finding and deleting unreferenced packfiles"
 msgstr "Suchen und Löschen von unreferenzierten Pack-Dateien"
 
-#: midx.c:1446
+#: midx.c:1351
 msgid "could not start pack-objects"
 msgstr "Konnte 'pack-objects' nicht ausführen"
 
-#: midx.c:1466
+#: midx.c:1371
 msgid "could not finish pack-objects"
 msgstr "Konnte 'pack-objects' nicht beenden"
 
-#: name-hash.c:537
+#: name-hash.c:538
 #, c-format
 msgid "unable to create lazy_dir thread: %s"
 msgstr "Kann lazy_dir Thread nicht erzeugen: %s"
 
-#: name-hash.c:559
+#: name-hash.c:560
 #, c-format
 msgid "unable to create lazy_name thread: %s"
 msgstr "Kann lazy_name Thread nicht erzeugen: %s"
 
-#: name-hash.c:565
+#: name-hash.c:566
 #, c-format
 msgid "unable to join lazy_name thread: %s"
 msgstr "Kann lazy_name Thread nicht beitreten: %s"
@@ -5275,6 +5465,370 @@
 msgid "Bad %s value: '%s'"
 msgstr "Ungültiger %s Wert: '%s'"
 
+#: object-file.c:480
+#, c-format
+msgid "object directory %s does not exist; check .git/objects/info/alternates"
+msgstr ""
+"Objektverzeichnis %s existiert nicht; prüfe .git/objects/info/alternates"
+
+#: object-file.c:531
+#, c-format
+msgid "unable to normalize alternate object path: %s"
+msgstr "Konnte alternativen Objektpfad '%s' nicht normalisieren."
+
+#: object-file.c:603
+#, c-format
+msgid "%s: ignoring alternate object stores, nesting too deep"
+msgstr "%s: ignoriere alternative Objektspeicher - Verschachtelung zu tief"
+
+#: object-file.c:610
+#, c-format
+msgid "unable to normalize object directory: %s"
+msgstr "Konnte Objektverzeichnis '%s' nicht normalisieren."
+
+#: object-file.c:653
+msgid "unable to fdopen alternates lockfile"
+msgstr "Konnte fdopen nicht auf Lock-Datei für \"alternates\" aufrufen."
+
+#: object-file.c:671
+msgid "unable to read alternates file"
+msgstr "Konnte \"alternates\"-Datei nicht lesen."
+
+#: object-file.c:678
+msgid "unable to move new alternates file into place"
+msgstr "Konnte neue \"alternates\"-Datei nicht übernehmen."
+
+#: object-file.c:713
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "Pfad '%s' existiert nicht"
+
+#: object-file.c:734
+#, 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."
+
+#: object-file.c:740
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "Referenziertes Repository '%s' ist kein lokales Repository."
+
+#: object-file.c:746
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr ""
+"Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)."
+
+#: object-file.c:754
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr ""
+"Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") "
+"eingehängt."
+
+#: object-file.c:814
+#, c-format
+msgid "invalid line while parsing alternate refs: %s"
+msgstr "Ungültige Zeile beim Parsen alternativer Referenzen: %s"
+
+#: object-file.c:964
+#, c-format
+msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
+msgstr "Versuche mmap %<PRIuMAX> über Limit %<PRIuMAX>."
+
+#: object-file.c:985
+msgid "mmap failed"
+msgstr "mmap fehlgeschlagen"
+
+#: object-file.c:1149
+#, c-format
+msgid "object file %s is empty"
+msgstr "Objektdatei %s ist leer."
+
+#: object-file.c:1284 object-file.c:2477
+#, c-format
+msgid "corrupt loose object '%s'"
+msgstr "Fehlerhaftes loses Objekt '%s'."
+
+#: object-file.c:1286 object-file.c:2481
+#, c-format
+msgid "garbage at end of loose object '%s'"
+msgstr "Nutzlose Daten am Ende von losem Objekt '%s'."
+
+#: object-file.c:1328
+msgid "invalid object type"
+msgstr "ungültiger Objekt-Typ"
+
+#: object-file.c:1412
+#, c-format
+msgid "unable to unpack %s header with --allow-unknown-type"
+msgstr "Konnte %s Kopfbereich nicht mit --allow-unknown-type entpacken."
+
+#: object-file.c:1415
+#, c-format
+msgid "unable to unpack %s header"
+msgstr "Konnte %s Kopfbereich nicht entpacken."
+
+#: object-file.c:1421
+#, c-format
+msgid "unable to parse %s header with --allow-unknown-type"
+msgstr "Konnte %s Kopfbereich mit --allow-unknown-type nicht parsen."
+
+#: object-file.c:1424
+#, c-format
+msgid "unable to parse %s header"
+msgstr "Konnte %s Kopfbereich nicht parsen."
+
+#: object-file.c:1651
+#, c-format
+msgid "failed to read object %s"
+msgstr "Konnte Objekt %s nicht lesen."
+
+#: object-file.c:1655
+#, c-format
+msgid "replacement %s not found for %s"
+msgstr "Ersetzung %s für %s nicht gefunden."
+
+#: object-file.c:1659
+#, c-format
+msgid "loose object %s (stored in %s) is corrupt"
+msgstr "Loses Objekt %s (gespeichert in %s) ist beschädigt."
+
+#: object-file.c:1663
+#, c-format
+msgid "packed object %s (stored in %s) is corrupt"
+msgstr "Gepacktes Objekt %s (gespeichert in %s) ist beschädigt."
+
+#: object-file.c:1768
+#, c-format
+msgid "unable to write file %s"
+msgstr "Konnte Datei %s nicht schreiben."
+
+#: object-file.c:1775
+#, c-format
+msgid "unable to set permission to '%s'"
+msgstr "Konnte Zugriffsberechtigung auf '%s' nicht setzen."
+
+#: object-file.c:1782
+msgid "file write error"
+msgstr "Fehler beim Schreiben einer Datei."
+
+#: object-file.c:1802
+msgid "error when closing loose object file"
+msgstr "Fehler beim Schließen der Datei für lose Objekte."
+
+#: object-file.c:1867
+#, c-format
+msgid "insufficient permission for adding an object to repository database %s"
+msgstr ""
+"Unzureichende Berechtigung zum Hinzufügen eines Objektes zur Repository-"
+"Datenbank %s"
+
+#: object-file.c:1869
+msgid "unable to create temporary file"
+msgstr "Konnte temporäre Datei nicht erstellen."
+
+#: object-file.c:1893
+msgid "unable to write loose object file"
+msgstr "Fehler beim Schreiben der Datei für lose Objekte."
+
+#: object-file.c:1899
+#, c-format
+msgid "unable to deflate new object %s (%d)"
+msgstr "Konnte neues Objekt %s (%d) nicht komprimieren."
+
+#: object-file.c:1903
+#, c-format
+msgid "deflateEnd on object %s failed (%d)"
+msgstr "deflateEnd auf Objekt %s fehlgeschlagen (%d)"
+
+#: object-file.c:1907
+#, c-format
+msgid "confused by unstable object source data for %s"
+msgstr "Fehler wegen instabilen Objektquelldaten für %s"
+
+#: object-file.c:1917 builtin/pack-objects.c:1097
+#, c-format
+msgid "failed utime() on %s"
+msgstr "Fehler beim Aufruf von utime() auf '%s'."
+
+#: object-file.c:1994
+#, c-format
+msgid "cannot read object for %s"
+msgstr "Kann Objekt für %s nicht lesen."
+
+#: object-file.c:2045
+msgid "corrupt commit"
+msgstr "fehlerhafter Commit"
+
+#: object-file.c:2053
+msgid "corrupt tag"
+msgstr "fehlerhaftes Tag"
+
+#: object-file.c:2153
+#, c-format
+msgid "read error while indexing %s"
+msgstr "Lesefehler beim Indizieren von '%s'."
+
+#: object-file.c:2156
+#, c-format
+msgid "short read while indexing %s"
+msgstr "read() zu kurz beim Indizieren von '%s'."
+
+#: object-file.c:2229 object-file.c:2239
+#, c-format
+msgid "%s: failed to insert into database"
+msgstr "%s: Fehler beim Einfügen in die Datenbank"
+
+#: object-file.c:2245
+#, c-format
+msgid "%s: unsupported file type"
+msgstr "%s: nicht unterstützte Dateiart"
+
+#: object-file.c:2269
+#, c-format
+msgid "%s is not a valid object"
+msgstr "%s ist kein gültiges Objekt"
+
+#: object-file.c:2271
+#, c-format
+msgid "%s is not a valid '%s' object"
+msgstr "%s ist kein gültiges '%s' Objekt"
+
+#: object-file.c:2298 builtin/index-pack.c:192
+#, c-format
+msgid "unable to open %s"
+msgstr "kann %s nicht öffnen"
+
+#: object-file.c:2488 object-file.c:2541
+#, c-format
+msgid "hash mismatch for %s (expected %s)"
+msgstr "Hash für %s stimmt nicht überein (%s erwartet)."
+
+#: object-file.c:2512
+#, c-format
+msgid "unable to mmap %s"
+msgstr "Konnte mmap nicht auf %s ausführen."
+
+#: object-file.c:2517
+#, c-format
+msgid "unable to unpack header of %s"
+msgstr "Konnte Kopfbereich von %s nicht entpacken."
+
+#: object-file.c:2523
+#, c-format
+msgid "unable to parse header of %s"
+msgstr "Konnte Kopfbereich von %s nicht parsen."
+
+#: object-file.c:2534
+#, c-format
+msgid "unable to unpack contents of %s"
+msgstr "Konnte Inhalt von %s nicht entpacken."
+
+#: object-name.c:486
+#, c-format
+msgid "short object ID %s is ambiguous"
+msgstr "kurze Objekt-ID %s ist mehrdeutig"
+
+#: object-name.c:497
+msgid "The candidates are:"
+msgstr "Die Kandidaten sind:"
+
+#: object-name.c:796
+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 switch -c $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 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 switch -c $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."
+
+#: object-name.c:916
+#, c-format
+msgid "log for '%.*s' only goes back to %s"
+msgstr "Log für '%.*s' geht nur bis %s zurück"
+
+#: object-name.c:924
+#, c-format
+msgid "log for '%.*s' only has %d entries"
+msgstr "Log für '%.*s' hat nur %d Einträge"
+
+#: object-name.c:1702
+#, c-format
+msgid "path '%s' exists on disk, but not in '%.*s'"
+msgstr "Pfad '%s' befindet sich im Dateisystem, aber nicht in '%.*s'"
+
+#: object-name.c:1708
+#, c-format
+msgid ""
+"path '%s' exists, but not '%s'\n"
+"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
+msgstr ""
+"Pfad '%s' existiert, aber nicht '%s'\n"
+"Hinweis: Meinten Sie '%.*s:%s' auch bekannt als '%.*s:./%s'?"
+
+#: object-name.c:1717
+#, c-format
+msgid "path '%s' does not exist in '%.*s'"
+msgstr "Pfad '%s' existiert nicht in '%.*s'"
+
+#: object-name.c:1745
+#, c-format
+msgid ""
+"path '%s' is in the index, but not at stage %d\n"
+"hint: Did you mean ':%d:%s'?"
+msgstr ""
+"Pfad '%s' ist im Index, aber nicht in Stufe %d\n"
+"Hinweis: Meinten Sie ':%d:%s'?"
+
+#: object-name.c:1761
+#, c-format
+msgid ""
+"path '%s' is in the index, but not '%s'\n"
+"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
+msgstr ""
+"Pfad '%s' ist im Index, aber nicht '%s'\n"
+"Hinweis: Meinten Sie ':%d:%s' auch bekannt als ':%d:./%s'?"
+
+#: object-name.c:1769
+#, c-format
+msgid "path '%s' exists on disk, but not in the index"
+msgstr "Pfad '%s' existiert im Dateisystem, aber nicht im Index"
+
+#: object-name.c:1771
+#, c-format
+msgid "path '%s' does not exist (neither on disk nor in the index)"
+msgstr "Pfad '%s' existiert nicht (weder im Dateisystem noch im Index)"
+
+#: object-name.c:1784
+msgid "relative path syntax can't be used outside working tree"
+msgstr ""
+"Die Syntax für relative Pfade kann nicht außerhalb des Arbeitsverzeichnisses "
+"benutzt werden."
+
+#: object-name.c:1922
+#, c-format
+msgid "invalid object name '%.*s'."
+msgstr "ungültiger Objektname '%.*s'."
+
 #: object.c:53
 #, c-format
 msgid "invalid object type \"%s\""
@@ -5300,21 +5854,71 @@
 msgid "hash mismatch %s"
 msgstr "Hash stimmt nicht mit %s überein."
 
-#: pack-bitmap.c:815 pack-bitmap.c:821 builtin/pack-objects.c:2216
+#: pack-bitmap.c:843 pack-bitmap.c:849 builtin/pack-objects.c:2226
 #, c-format
 msgid "unable to get size of %s"
 msgstr "Konnte Größe von %s nicht bestimmen."
 
-#: packfile.c:615
+#: pack-bitmap.c:1489 builtin/rev-list.c:92
+#, c-format
+msgid "unable to get disk usage of %s"
+msgstr "konnte Festplattennutzung von %s nicht bekommen"
+
+#: pack-revindex.c:220
+#, c-format
+msgid "reverse-index file %s is too small"
+msgstr "Reverse-Index-Datei %s ist zu klein"
+
+#: pack-revindex.c:225
+#, c-format
+msgid "reverse-index file %s is corrupt"
+msgstr "Reverse-Index-Datei %s ist beschädigt"
+
+#: pack-revindex.c:233
+#, c-format
+msgid "reverse-index file %s has unknown signature"
+msgstr "Reverse-Index-Datei %s hat eine unbekannte Signatur"
+
+#: pack-revindex.c:237
+#, c-format
+msgid "reverse-index file %s has unsupported version %<PRIu32>"
+msgstr "Reverse-Index-Datei %s hat nicht unterstützte Version %<PRIu32>"
+
+#: pack-revindex.c:242
+#, c-format
+msgid "reverse-index file %s has unsupported hash id %<PRIu32>"
+msgstr "Reverse-Index-Datei %s hat nicht unterstützte Hash-ID %<PRIu32>"
+
+#: pack-write.c:236
+msgid "cannot both write and verify reverse index"
+msgstr ""
+"Reverse-Index kann nicht gleichzeitig geschrieben und verifiziert werden"
+
+#: pack-write.c:257
+#, c-format
+msgid "could not stat: %s"
+msgstr "konnte nicht lesen: %s"
+
+#: pack-write.c:269
+#, c-format
+msgid "failed to make %s readable"
+msgstr "Fehler beim lesbar machen von %s"
+
+#: pack-write.c:508
+#, c-format
+msgid "could not write '%s' promisor file"
+msgstr "konnte Promisor-Datei '%s' nicht schreiben"
+
+#: packfile.c:625
 msgid "offset before end of packfile (broken .idx?)"
 msgstr "Offset vor Ende der Packdatei (fehlerhafte Indexdatei?)"
 
-#: packfile.c:1907
+#: packfile.c:1934
 #, 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?)"
 
-#: packfile.c:1911
+#: packfile.c:1938
 #, 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?)"
@@ -5569,16 +6173,16 @@
 msgid "remote error: %s"
 msgstr "Fehler am anderen Ende: %s"
 
-#: preload-index.c:119
+#: preload-index.c:125
 msgid "Refreshing index"
 msgstr "Aktualisiere Index"
 
-#: preload-index.c:138
+#: preload-index.c:144
 #, c-format
 msgid "unable to create threaded lstat: %s"
 msgstr "Kann Thread für lstat nicht erzeugen: %s"
 
-#: pretty.c:983
+#: pretty.c:984
 msgid "unable to parse --pretty format"
 msgstr "Konnte --pretty Format nicht parsen."
 
@@ -5605,20 +6209,20 @@
 msgid "Removing duplicate objects"
 msgstr "Lösche doppelte Objekte"
 
-#: range-diff.c:77
+#: range-diff.c:78
 msgid "could not start `log`"
 msgstr "Konnte `log` nicht starten."
 
-#: range-diff.c:79
+#: range-diff.c:80
 msgid "could not read `log` output"
 msgstr "Konnte Ausgabe von `log` nicht lesen."
 
-#: range-diff.c:98 sequencer.c:5310
+#: range-diff.c:101 sequencer.c:5318
 #, c-format
 msgid "could not parse commit '%s'"
 msgstr "Konnte Commit '%s' nicht parsen."
 
-#: range-diff.c:112
+#: range-diff.c:115
 #, c-format
 msgid ""
 "could not parse first line of `log` output: did not start with 'commit ': "
@@ -5627,16 +6231,20 @@
 "konnte erste Zeile der Ausgabe von `log` nicht parsen: fängt nicht mit "
 "'commit ' an: '%s'"
 
-#: range-diff.c:137
+#: range-diff.c:140
 #, c-format
 msgid "could not parse git header '%.*s'"
 msgstr "Konnte Git-Header '%.*s' nicht parsen."
 
-#: range-diff.c:299
+#: range-diff.c:306
 msgid "failed to generate diff"
 msgstr "Fehler beim Generieren des Diffs."
 
-#: range-diff.c:532 range-diff.c:534
+#: range-diff.c:558
+msgid "--left-only and --right-only are mutually exclusive"
+msgstr "--left-only und --right-only schließen sich gegenseitig aus"
+
+#: range-diff.c:561 range-diff.c:563
 #, c-format
 msgid "could not parse log for '%s'"
 msgstr "Konnte Log für '%s' nicht parsen."
@@ -5676,18 +6284,18 @@
 #: read-cache.c:807
 #, c-format
 msgid "unable to stat '%s'"
-msgstr "Konnte '%s' nicht lesen."
+msgstr "konnte '%s' nicht lesen"
 
 #: read-cache.c:1318
 #, c-format
 msgid "'%s' appears as both a file and as a directory"
-msgstr "'%s' scheint eine Datei und ein Verzeichnis zu sein."
+msgstr "'%s' scheint eine Datei und ein Verzeichnis zu sein"
 
-#: read-cache.c:1524
+#: read-cache.c:1532
 msgid "Refresh index"
 msgstr "Aktualisiere Index"
 
-#: read-cache.c:1639
+#: read-cache.c:1657
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -5696,7 +6304,7 @@
 "index.version gesetzt, aber Wert ungültig.\n"
 "Verwende Version %i"
 
-#: read-cache.c:1649
+#: read-cache.c:1667
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -5705,139 +6313,139 @@
 "GIT_INDEX_VERSION gesetzt, aber Wert ungültig.\n"
 "Verwende Version %i"
 
-#: read-cache.c:1705
+#: read-cache.c:1723
 #, c-format
 msgid "bad signature 0x%08x"
 msgstr "Ungültige Signatur 0x%08x"
 
-#: read-cache.c:1708
+#: read-cache.c:1726
 #, c-format
 msgid "bad index version %d"
 msgstr "Ungültige Index-Version %d"
 
-#: read-cache.c:1717
+#: read-cache.c:1735
 msgid "bad index file sha1 signature"
 msgstr "Ungültige SHA1-Signatur der Index-Datei."
 
-#: read-cache.c:1747
+#: read-cache.c:1765
 #, c-format
 msgid "index uses %.4s extension, which we do not understand"
 msgstr "Index verwendet Erweiterung %.4s, welche wir nicht unterstützen."
 
-#: read-cache.c:1749
+#: read-cache.c:1767
 #, c-format
 msgid "ignoring %.4s extension"
 msgstr "Ignoriere Erweiterung %.4s"
 
-#: read-cache.c:1786
+#: read-cache.c:1804
 #, c-format
 msgid "unknown index entry format 0x%08x"
 msgstr "Unbekanntes Format für Index-Eintrag 0x%08x"
 
-#: read-cache.c:1802
+#: read-cache.c:1820
 #, c-format
 msgid "malformed name field in the index, near path '%s'"
 msgstr "Ungültiges Namensfeld im Index, in der Nähe von Pfad '%s'."
 
-#: read-cache.c:1859
+#: read-cache.c:1877
 msgid "unordered stage entries in index"
 msgstr "Ungeordnete Stage-Einträge im Index."
 
-#: read-cache.c:1862
+#: read-cache.c:1880
 #, c-format
 msgid "multiple stage entries for merged file '%s'"
 msgstr "Mehrere Stage-Einträge für zusammengeführte Datei '%s'."
 
-#: read-cache.c:1865
+#: read-cache.c:1883
 #, c-format
 msgid "unordered stage entries for '%s'"
 msgstr "Ungeordnete Stage-Einträge für '%s'."
 
-#: read-cache.c:1971 read-cache.c:2262 rerere.c:565 rerere.c:599 rerere.c:1111
-#: submodule.c:1628 builtin/add.c:538 builtin/check-ignore.c:181
-#: builtin/checkout.c:502 builtin/checkout.c:688 builtin/clean.c:991
-#: builtin/commit.c:364 builtin/diff-tree.c:122 builtin/grep.c:507
+#: read-cache.c:1989 read-cache.c:2280 rerere.c:549 rerere.c:583 rerere.c:1095
+#: submodule.c:1634 builtin/add.c:546 builtin/check-ignore.c:181
+#: builtin/checkout.c:504 builtin/checkout.c:690 builtin/clean.c:991
+#: builtin/commit.c:364 builtin/diff-tree.c:122 builtin/grep.c:505
 #: builtin/mv.c:146 builtin/reset.c:247 builtin/rm.c:290
 #: builtin/submodule--helper.c:332
 msgid "index file corrupt"
 msgstr "Index-Datei beschädigt"
 
-#: read-cache.c:2115
+#: read-cache.c:2133
 #, c-format
 msgid "unable to create load_cache_entries thread: %s"
 msgstr "Kann Thread für load_cache_entries nicht erzeugen: %s"
 
-#: read-cache.c:2128
+#: read-cache.c:2146
 #, c-format
 msgid "unable to join load_cache_entries thread: %s"
 msgstr "Kann Thread für load_cache_entries nicht erzeugen: %s"
 
-#: read-cache.c:2161
+#: read-cache.c:2179
 #, c-format
 msgid "%s: index file open failed"
 msgstr "%s: Öffnen der Index-Datei fehlgeschlagen."
 
-#: read-cache.c:2165
+#: read-cache.c:2183
 #, c-format
 msgid "%s: cannot stat the open index"
 msgstr "%s: Kann geöffneten Index nicht lesen."
 
-#: read-cache.c:2169
+#: read-cache.c:2187
 #, c-format
 msgid "%s: index file smaller than expected"
 msgstr "%s: Index-Datei ist kleiner als erwartet."
 
-#: read-cache.c:2173
+#: read-cache.c:2191
 #, c-format
 msgid "%s: unable to map index file"
 msgstr "%s: Konnte Index-Datei nicht einlesen."
 
-#: read-cache.c:2215
+#: read-cache.c:2233
 #, c-format
 msgid "unable to create load_index_extensions thread: %s"
 msgstr "Kann Thread für load_index_extensions nicht erzeugen: %s"
 
-#: read-cache.c:2242
+#: read-cache.c:2260
 #, c-format
 msgid "unable to join load_index_extensions thread: %s"
 msgstr "Kann Thread für load_index_extensions nicht beitreten: %s"
 
-#: read-cache.c:2274
+#: read-cache.c:2292
 #, c-format
 msgid "could not freshen shared index '%s'"
 msgstr "Konnte geteilten Index '%s' nicht aktualisieren."
 
-#: read-cache.c:2321
+#: read-cache.c:2339
 #, c-format
 msgid "broken index, expect %s in %s, got %s"
 msgstr "Fehlerhafter Index. Erwartete %s in %s, erhielt %s."
 
-#: read-cache.c:3017 strbuf.c:1171 wrapper.c:633 builtin/merge.c:1140
+#: read-cache.c:3035 strbuf.c:1171 wrapper.c:633 builtin/merge.c:1141
 #, c-format
 msgid "could not close '%s'"
 msgstr "Konnte '%s' nicht schließen."
 
-#: read-cache.c:3120 sequencer.c:2479 sequencer.c:4231
+#: read-cache.c:3138 sequencer.c:2487 sequencer.c:4239
 #, c-format
 msgid "could not stat '%s'"
 msgstr "Konnte '%s' nicht lesen."
 
-#: read-cache.c:3133
+#: read-cache.c:3151
 #, c-format
 msgid "unable to open git dir: %s"
 msgstr "konnte Git-Verzeichnis nicht öffnen: %s"
 
-#: read-cache.c:3145
+#: read-cache.c:3163
 #, c-format
 msgid "unable to unlink: %s"
 msgstr "Konnte '%s' nicht entfernen."
 
-#: read-cache.c:3170
+#: read-cache.c:3188
 #, c-format
 msgid "cannot fix permission bits on '%s'"
 msgstr "Konnte Zugriffsberechtigung auf '%s' nicht setzen."
 
-#: read-cache.c:3319
+#: read-cache.c:3337
 #, c-format
 msgid "%s: cannot drop to stage #0"
 msgstr "%s: Kann nicht auf Stufe #0 wechseln."
@@ -5953,14 +6561,14 @@
 "Wenn Sie jedoch alles löschen, wird der Rebase abgebrochen.\n"
 "\n"
 
-#: rebase-interactive.c:110 rerere.c:485 rerere.c:692 sequencer.c:3607
-#: sequencer.c:3633 sequencer.c:5416 builtin/fsck.c:347 builtin/rebase.c:270
+#: rebase-interactive.c:110 rerere.c:469 rerere.c:676 sequencer.c:3615
+#: sequencer.c:3641 sequencer.c:5424 builtin/fsck.c:329 builtin/rebase.c:272
 #, c-format
 msgid "could not write '%s'"
 msgstr "Konnte '%s' nicht schreiben."
 
-#: rebase-interactive.c:116 builtin/rebase.c:202 builtin/rebase.c:228
-#: builtin/rebase.c:252
+#: rebase-interactive.c:116 builtin/rebase.c:204 builtin/rebase.c:230
+#: builtin/rebase.c:254
 #, c-format
 msgid "could not write '%s'."
 msgstr "Konnte '%s' nicht schreiben."
@@ -5991,14 +6599,14 @@
 "Warnungen zu ändern.\n"
 "Die möglichen Verhaltensweisen sind: ignore, warn, error.\n"
 
-#: rebase-interactive.c:233 rebase-interactive.c:238 sequencer.c:2394
-#: builtin/rebase.c:188 builtin/rebase.c:213 builtin/rebase.c:239
-#: builtin/rebase.c:264
+#: rebase-interactive.c:233 rebase-interactive.c:238 sequencer.c:2402
+#: builtin/rebase.c:190 builtin/rebase.c:215 builtin/rebase.c:241
+#: builtin/rebase.c:266
 #, c-format
 msgid "could not read '%s'."
 msgstr "Konnte '%s' nicht lesen."
 
-#: ref-filter.c:42 wt-status.c:1973
+#: ref-filter.c:42 wt-status.c:1975
 msgid "gone"
 msgstr "entfernt"
 
@@ -6017,233 +6625,248 @@
 msgid "ahead %d, behind %d"
 msgstr "%d voraus, %d hinterher"
 
-#: ref-filter.c:169
+#: ref-filter.c:175
 #, c-format
 msgid "expected format: %%(color:<color>)"
 msgstr "Erwartetes Format: %%(color:<Farbe>)"
 
-#: ref-filter.c:171
+#: ref-filter.c:177
 #, c-format
 msgid "unrecognized color: %%(color:%s)"
 msgstr "nicht erkannte Farbe: %%(color:%s)"
 
-#: ref-filter.c:193
+#: ref-filter.c:199
 #, c-format
 msgid "Integer value expected refname:lstrip=%s"
 msgstr "Positiver Wert erwartet refname:lstrip=%s"
 
-#: ref-filter.c:197
+#: ref-filter.c:203
 #, c-format
 msgid "Integer value expected refname:rstrip=%s"
 msgstr "Positiver Wert erwartet refname:rstrip=%s"
 
-#: ref-filter.c:199
+#: ref-filter.c:205
 #, c-format
 msgid "unrecognized %%(%s) argument: %s"
 msgstr "nicht erkanntes %%(%s) Argument: %s"
 
-#: ref-filter.c:254
+#: ref-filter.c:260
 #, c-format
 msgid "%%(objecttype) does not take arguments"
 msgstr "%%(objecttype) akzeptiert keine Argumente"
 
-#: ref-filter.c:276
+#: ref-filter.c:282
 #, c-format
 msgid "unrecognized %%(objectsize) argument: %s"
 msgstr "nicht erkanntes %%(objectsize) Argument: %s"
 
-#: ref-filter.c:284
+#: ref-filter.c:290
 #, c-format
 msgid "%%(deltabase) does not take arguments"
 msgstr "%%(deltabase) akzeptiert keine Argumente"
 
-#: ref-filter.c:296
+#: ref-filter.c:302
 #, c-format
 msgid "%%(body) does not take arguments"
 msgstr "%%(body) akzeptiert keine Argumente"
 
-#: ref-filter.c:309
+#: ref-filter.c:315
 #, c-format
 msgid "unrecognized %%(subject) argument: %s"
 msgstr "nicht erkanntes %%(subject) Argument: %s"
 
-#: ref-filter.c:330
+#: ref-filter.c:334
+#, c-format
+msgid "expected %%(trailers:key=<value>)"
+msgstr "%%(trailers:key=<Wert>) erwartet"
+
+#: ref-filter.c:336
 #, c-format
 msgid "unknown %%(trailers) argument: %s"
 msgstr "unbekanntes %%(trailers) Argument: %s"
 
-#: ref-filter.c:363
+#: ref-filter.c:367
 #, c-format
 msgid "positive value expected contents:lines=%s"
 msgstr "Positiver Wert erwartet contents:lines=%s"
 
-#: ref-filter.c:365
+#: ref-filter.c:369
 #, c-format
 msgid "unrecognized %%(contents) argument: %s"
 msgstr "nicht erkanntes %%(contents) Argument: %s"
 
-#: ref-filter.c:380
+#: ref-filter.c:384
 #, c-format
 msgid "positive value expected '%s' in %%(%s)"
 msgstr "positiver Wert erwartet '%s' in %%(%s)"
 
-#: ref-filter.c:384
+#: ref-filter.c:388
 #, c-format
 msgid "unrecognized argument '%s' in %%(%s)"
 msgstr "nicht erkanntes Argument '%s' in %%(%s)"
 
-#: ref-filter.c:398
+#: ref-filter.c:402
 #, c-format
 msgid "unrecognized email option: %s"
 msgstr "nicht erkannte E-Mail Option: %s"
 
-#: ref-filter.c:428
+#: ref-filter.c:432
 #, c-format
 msgid "expected format: %%(align:<width>,<position>)"
 msgstr "erwartetes Format: %%(align:<Breite>,<Position>)"
 
-#: ref-filter.c:440
+#: ref-filter.c:444
 #, c-format
 msgid "unrecognized position:%s"
 msgstr "nicht erkannte Position:%s"
 
-#: ref-filter.c:447
+#: ref-filter.c:451
 #, c-format
 msgid "unrecognized width:%s"
 msgstr "nicht erkannte Breite:%s"
 
-#: ref-filter.c:456
+#: ref-filter.c:460
 #, c-format
 msgid "unrecognized %%(align) argument: %s"
 msgstr "nicht erkanntes %%(align) Argument: %s"
 
-#: ref-filter.c:464
+#: ref-filter.c:468
 #, c-format
 msgid "positive width expected with the %%(align) atom"
 msgstr "Positive Breitenangabe für %%(align) erwartet"
 
-#: ref-filter.c:482
+#: ref-filter.c:486
 #, c-format
 msgid "unrecognized %%(if) argument: %s"
 msgstr "nicht erkanntes %%(if) Argument: %s"
 
-#: ref-filter.c:584
+#: ref-filter.c:588
 #, c-format
 msgid "malformed field name: %.*s"
 msgstr "Fehlerhafter Feldname: %.*s"
 
-#: ref-filter.c:611
+#: ref-filter.c:615
 #, c-format
 msgid "unknown field name: %.*s"
 msgstr "Unbekannter Feldname: %.*s"
 
-#: ref-filter.c:615
+#: ref-filter.c:619
 #, c-format
 msgid ""
 "not a git repository, but the field '%.*s' requires access to object data"
 msgstr ""
 "Kein Git-Repository, aber das Feld '%.*s' erfordert Zugriff auf Objektdaten."
 
-#: ref-filter.c:739
+#: ref-filter.c:743
 #, c-format
 msgid "format: %%(if) atom used without a %%(then) atom"
 msgstr "format: %%(if) Atom ohne ein %%(then) Atom verwendet"
 
-#: ref-filter.c:802
+#: ref-filter.c:806
 #, c-format
 msgid "format: %%(then) atom used without an %%(if) atom"
 msgstr "format: %%(then) Atom ohne ein %%(if) Atom verwendet"
 
-#: ref-filter.c:804
+#: ref-filter.c:808
 #, c-format
 msgid "format: %%(then) atom used more than once"
 msgstr "format: %%(then) Atom mehr als einmal verwendet"
 
-#: ref-filter.c:806
+#: ref-filter.c:810
 #, c-format
 msgid "format: %%(then) atom used after %%(else)"
 msgstr "format: %%(then) Atom nach %%(else) verwendet"
 
-#: ref-filter.c:834
+#: ref-filter.c:838
 #, c-format
 msgid "format: %%(else) atom used without an %%(if) atom"
 msgstr "format: %%(else) Atom ohne ein %%(if) Atom verwendet"
 
-#: ref-filter.c:836
+#: ref-filter.c:840
 #, c-format
 msgid "format: %%(else) atom used without a %%(then) atom"
 msgstr "Format: %%(else) Atom ohne ein %%(then) Atom verwendet"
 
-#: ref-filter.c:838
+#: ref-filter.c:842
 #, c-format
 msgid "format: %%(else) atom used more than once"
 msgstr "Format: %%(end) Atom mehr als einmal verwendet"
 
-#: ref-filter.c:853
+#: ref-filter.c:857
 #, c-format
 msgid "format: %%(end) atom used without corresponding atom"
 msgstr "Format: %%(end) Atom ohne zugehöriges Atom verwendet"
 
-#: ref-filter.c:910
+#: ref-filter.c:914
 #, c-format
 msgid "malformed format string %s"
 msgstr "Fehlerhafter Formatierungsstring %s"
 
-#: ref-filter.c:1549
-#, c-format
-msgid "no branch, rebasing %s"
-msgstr "kein Branch, Rebase von %s"
-
-#: ref-filter.c:1552
-#, c-format
-msgid "no branch, rebasing detached HEAD %s"
-msgstr "kein Branch, Rebase von losgelöstem HEAD %s"
-
 #: ref-filter.c:1555
 #, c-format
-msgid "no branch, bisect started on %s"
-msgstr "kein Branch, binäre Suche begonnen bei %s"
+msgid "(no branch, rebasing %s)"
+msgstr "(kein Branch, Rebase von %s)"
+
+#: ref-filter.c:1558
+#, c-format
+msgid "(no branch, rebasing detached HEAD %s)"
+msgstr "(kein Branch, Rebase von losgelöstem HEAD %s)"
+
+#: ref-filter.c:1561
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr "(kein Branch, binäre Suche begonnen bei %s)"
 
 #: ref-filter.c:1565
-msgid "no branch"
-msgstr "kein Branch"
+#, c-format
+msgid "(HEAD detached at %s)"
+msgstr "(HEAD losgelöst bei %s)"
 
-#: ref-filter.c:1599 ref-filter.c:1808
+#: ref-filter.c:1568
+#, c-format
+msgid "(HEAD detached from %s)"
+msgstr "(HEAD losgelöst von %s)"
+
+#: ref-filter.c:1571
+msgid "(no branch)"
+msgstr "(kein Branch)"
+
+#: ref-filter.c:1603 ref-filter.c:1812
 #, c-format
 msgid "missing object %s for %s"
 msgstr "Objekt %s fehlt für %s"
 
-#: ref-filter.c:1609
+#: ref-filter.c:1613
 #, c-format
 msgid "parse_object_buffer failed on %s for %s"
 msgstr "parse_object_buffer bei %s für %s fehlgeschlagen"
 
-#: ref-filter.c:2062
+#: ref-filter.c:1996
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "fehlerhaftes Objekt bei '%s'"
 
-#: ref-filter.c:2151
+#: ref-filter.c:2085
 #, c-format
 msgid "ignoring ref with broken name %s"
 msgstr "Ignoriere Referenz mit fehlerhaftem Namen %s"
 
-#: ref-filter.c:2156 refs.c:676
+#: ref-filter.c:2090 refs.c:676
 #, c-format
 msgid "ignoring broken ref %s"
 msgstr "Ignoriere fehlerhafte Referenz %s"
 
-#: ref-filter.c:2472
+#: ref-filter.c:2430
 #, c-format
 msgid "format: %%(end) atom missing"
 msgstr "Format: %%(end) Atom fehlt"
 
-#: ref-filter.c:2571
+#: ref-filter.c:2529
 #, c-format
 msgid "malformed object name %s"
 msgstr "missgebildeter Objektname %s"
 
-#: ref-filter.c:2576
+#: ref-filter.c:2534
 #, c-format
 msgid "option `%s' must point to a commit"
 msgstr "die Option `%s' muss auf einen Commit zeigen"
@@ -6295,52 +6918,52 @@
 msgid "ignoring dangling symref %s"
 msgstr "Ignoriere unreferenzierte symbolische Referenz %s"
 
-#: refs.c:911
+#: refs.c:922
 #, c-format
 msgid "log for ref %s has gap after %s"
 msgstr "Log für Referenz %s hat eine Lücke nach %s."
 
-#: refs.c:917
+#: refs.c:929
 #, c-format
 msgid "log for ref %s unexpectedly ended on %s"
 msgstr "Log für Referenz %s unerwartet bei %s beendet."
 
-#: refs.c:976
+#: refs.c:994
 #, c-format
 msgid "log for %s is empty"
 msgstr "Log für %s ist leer."
 
-#: refs.c:1068
+#: refs.c:1086
 #, c-format
 msgid "refusing to update ref with bad name '%s'"
 msgstr "verweigere Aktualisierung einer Referenz mit fehlerhaftem Namen '%s'"
 
-#: refs.c:1139
+#: refs.c:1157
 #, c-format
 msgid "update_ref failed for ref '%s': %s"
 msgstr "update_ref für Referenz '%s' fehlgeschlagen: %s"
 
-#: refs.c:1963
+#: refs.c:2051
 #, c-format
 msgid "multiple updates for ref '%s' not allowed"
 msgstr "mehrere Aktualisierungen für Referenz '%s' nicht erlaubt"
 
-#: refs.c:2043
+#: refs.c:2131
 msgid "ref updates forbidden inside quarantine environment"
 msgstr ""
 "Aktualisierungen von Referenzen ist innerhalb der Quarantäne-Umgebung "
 "verboten"
 
-#: refs.c:2054
+#: refs.c:2142
 msgid "ref updates aborted by hook"
 msgstr "Aktualisierungen von Referenzen durch Hook abgebrochen"
 
-#: refs.c:2154 refs.c:2184
+#: refs.c:2242 refs.c:2272
 #, c-format
 msgid "'%s' exists; cannot create '%s'"
 msgstr "'%s' existiert; kann '%s' nicht erstellen"
 
-#: refs.c:2160 refs.c:2195
+#: refs.c:2248 refs.c:2283
 #, c-format
 msgid "cannot process '%s' and '%s' at the same time"
 msgstr "kann '%s' und '%s' nicht zur selben Zeit verarbeiten"
@@ -6406,12 +7029,12 @@
 msgid "value '%s' of pattern has no '*'"
 msgstr "Wert '%s' des Musters hat kein '*'."
 
-#: remote.c:1073
+#: remote.c:1083
 #, c-format
 msgid "src refspec %s does not match any"
 msgstr "Src-Refspec %s entspricht keiner Referenz."
 
-#: remote.c:1078
+#: remote.c:1088
 #, c-format
 msgid "src refspec %s matches more than one"
 msgstr "Src-Refspec %s entspricht mehr als einer Referenz."
@@ -6420,7 +7043,7 @@
 #. <remote> <src>:<dst>" push, and "being pushed ('%s')" is
 #. the <src>.
 #.
-#: remote.c:1093
+#: remote.c:1103
 #, c-format
 msgid ""
 "The destination you provided is not a full refname (i.e.,\n"
@@ -6447,7 +7070,7 @@
 "Keines hat funktioniert, sodass wir aufgegeben haben. Sie müssen die\n"
 "Referenz mit vollqualifizierten Namen angeben."
 
-#: remote.c:1113
+#: remote.c:1123
 #, c-format
 msgid ""
 "The <src> part of the refspec is a commit object.\n"
@@ -6458,7 +7081,7 @@
 "Meinten Sie, einen neuen Branch mittels Push nach\n"
 "'%s:refs/heads/%s' zu erstellen?"
 
-#: remote.c:1118
+#: remote.c:1128
 #, c-format
 msgid ""
 "The <src> part of the refspec is a tag object.\n"
@@ -6469,7 +7092,7 @@
 "Meinten Sie, einen neuen Tag mittels Push nach\n"
 "'%s:refs/tags/%s' zu erstellen?"
 
-#: remote.c:1123
+#: remote.c:1133
 #, c-format
 msgid ""
 "The <src> part of the refspec is a tree object.\n"
@@ -6480,7 +7103,7 @@
 "Meinten Sie, einen Tag für ein neues Tree-Objekt\n"
 "mittels Push nach '%s:refs/tags/'%s' zu erstellen?"
 
-#: remote.c:1128
+#: remote.c:1138
 #, c-format
 msgid ""
 "The <src> part of the refspec is a blob object.\n"
@@ -6491,117 +7114,117 @@
 "Meinten Sie, einen Tag für ein neues Blob-Objekt\n"
 "mittels Push nach '%s:refs/tags/%s' zu erstellen?"
 
-#: remote.c:1164
+#: remote.c:1174
 #, c-format
 msgid "%s cannot be resolved to branch"
 msgstr "%s kann nicht zu Branch aufgelöst werden."
 
-#: remote.c:1175
+#: remote.c:1185
 #, c-format
 msgid "unable to delete '%s': remote ref does not exist"
 msgstr "Konnte '%s' nicht löschen: Remote-Referenz existiert nicht."
 
-#: remote.c:1187
+#: remote.c:1197
 #, c-format
 msgid "dst refspec %s matches more than one"
 msgstr "Dst-Refspec %s entspricht mehr als einer Referenz."
 
-#: remote.c:1194
+#: remote.c:1204
 #, c-format
 msgid "dst ref %s receives from more than one src"
 msgstr "Dst-Referenz %s empfängt von mehr als einer Quelle"
 
-#: remote.c:1714 remote.c:1815
+#: remote.c:1724 remote.c:1825
 msgid "HEAD does not point to a branch"
 msgstr "HEAD zeigt auf keinen Branch"
 
-#: remote.c:1723
+#: remote.c:1733
 #, c-format
 msgid "no such branch: '%s'"
-msgstr "Kein solcher Branch: '%s'"
+msgstr "Branch nicht gefunden: '%s'"
 
-#: remote.c:1726
+#: remote.c:1736
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "Kein Upstream-Branch für Branch '%s' konfiguriert."
 
-#: remote.c:1732
+#: remote.c:1742
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "Upstream-Branch '%s' nicht als Remote-Tracking-Branch gespeichert"
 
-#: remote.c:1747
+#: remote.c:1757
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
 "Ziel für \"push\" '%s' auf Remote-Repository '%s' hat keinen lokal gefolgten "
 "Branch"
 
-#: remote.c:1759
+#: remote.c:1769
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "Branch '%s' hat keinen Upstream-Branch gesetzt"
 
-#: remote.c:1769
+#: remote.c:1779
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "Push-Refspecs für '%s' beinhalten nicht '%s'"
 
-#: remote.c:1782
+#: remote.c:1792
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "kein Ziel für \"push\" (push.default ist 'nothing')"
 
-#: remote.c:1804
+#: remote.c:1814
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "kann einzelnes Ziel für \"push\" im Modus 'simple' nicht auflösen"
 
-#: remote.c:1933
+#: remote.c:1943
 #, c-format
 msgid "couldn't find remote ref %s"
 msgstr "Konnte Remote-Referenz %s nicht finden."
 
-#: remote.c:1946
+#: remote.c:1956
 #, c-format
 msgid "* Ignoring funny ref '%s' locally"
 msgstr "* Ignoriere sonderbare Referenz '%s' lokal"
 
-#: remote.c:2109
+#: remote.c:2119
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr ""
 "Ihr Branch basiert auf '%s', aber der Upstream-Branch wurde entfernt.\n"
 
-#: remote.c:2113
+#: remote.c:2123
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (benutzen Sie \"git branch --unset-upstream\" zum Beheben)\n"
 
-#: remote.c:2116
+#: remote.c:2126
 #, c-format
 msgid "Your branch is up to date with '%s'.\n"
 msgstr "Ihr Branch ist auf demselben Stand wie '%s'.\n"
 
-#: remote.c:2120
+#: remote.c:2130
 #, c-format
 msgid "Your branch and '%s' refer to different commits.\n"
 msgstr "Ihr Branch und '%s' zeigen auf unterschiedliche Commits.\n"
 
-#: remote.c:2123
+#: remote.c:2133
 #, c-format
 msgid "  (use \"%s\" for details)\n"
 msgstr "  (benutzen Sie \"%s\" für Details)\n"
 
-#: remote.c:2127
+#: remote.c:2137
 #, c-format
 msgid "Your branch is ahead of '%s' by %d commit.\n"
 msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
 msgstr[0] "Ihr Branch ist %2$d Commit vor '%1$s'.\n"
 msgstr[1] "Ihr Branch ist %2$d Commits vor '%1$s'.\n"
 
-#: remote.c:2133
+#: remote.c:2143
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (benutzen Sie \"git push\", um lokale Commits zu publizieren)\n"
 
-#: remote.c:2136
+#: remote.c:2146
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -6611,12 +7234,12 @@
 msgstr[1] ""
 "Ihr Branch ist %2$d Commits hinter '%1$s', und kann vorgespult werden.\n"
 
-#: remote.c:2144
+#: remote.c:2154
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr ""
 "  (benutzen Sie \"git pull\", um Ihren lokalen Branch zu aktualisieren)\n"
 
-#: remote.c:2147
+#: remote.c:2157
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -6631,13 +7254,13 @@
 "Ihr Branch und '%s' sind divergiert,\n"
 "und haben jeweils %d und %d unterschiedliche Commits.\n"
 
-#: remote.c:2157
+#: remote.c:2167
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
 "  (benutzen Sie \"git pull\", um Ihren Branch mit dem Remote-Branch "
 "zusammenzuführen)\n"
 
-#: remote.c:2349
+#: remote.c:2359
 #, c-format
 msgid "cannot parse expected object name '%s'"
 msgstr "Kann erwarteten Objektnamen '%s' nicht parsen."
@@ -6657,96 +7280,96 @@
 msgid "replace depth too high for object %s"
 msgstr "Ersetzungstiefe zu hoch für Objekt %s"
 
-#: rerere.c:217 rerere.c:226 rerere.c:229
+#: rerere.c:201 rerere.c:210 rerere.c:213
 msgid "corrupt MERGE_RR"
 msgstr "Fehlerhaftes MERGE_RR"
 
-#: rerere.c:264 rerere.c:269
+#: rerere.c:248 rerere.c:253
 msgid "unable to write rerere record"
 msgstr "Konnte Rerere-Eintrag nicht schreiben."
 
-#: rerere.c:495
+#: rerere.c:479
 #, c-format
 msgid "there were errors while writing '%s' (%s)"
 msgstr "Fehler beim Schreiben von '%s' (%s)."
 
-#: rerere.c:498
+#: rerere.c:482
 #, c-format
 msgid "failed to flush '%s'"
 msgstr "Flush bei '%s' fehlgeschlagen."
 
-#: rerere.c:503 rerere.c:1039
+#: rerere.c:487 rerere.c:1023
 #, c-format
 msgid "could not parse conflict hunks in '%s'"
 msgstr "Konnte Konflikt-Blöcke in '%s' nicht parsen."
 
-#: rerere.c:684
+#: rerere.c:668
 #, c-format
 msgid "failed utime() on '%s'"
 msgstr "Fehler beim Aufruf von utime() auf '%s'."
 
-#: rerere.c:694
+#: rerere.c:678
 #, c-format
 msgid "writing '%s' failed"
 msgstr "Schreiben von '%s' fehlgeschlagen."
 
-#: rerere.c:714
+#: rerere.c:698
 #, c-format
 msgid "Staged '%s' using previous resolution."
 msgstr "'%s' mit vorheriger Konfliktauflösung zum Commit vorgemerkt."
 
-#: rerere.c:753
+#: rerere.c:737
 #, c-format
 msgid "Recorded resolution for '%s'."
 msgstr "Konfliktauflösung für '%s' aufgezeichnet."
 
-#: rerere.c:788
+#: rerere.c:772
 #, c-format
 msgid "Resolved '%s' using previous resolution."
 msgstr "Konflikte in '%s' mit vorheriger Konfliktauflösung beseitigt."
 
-#: rerere.c:803
+#: rerere.c:787
 #, c-format
 msgid "cannot unlink stray '%s'"
 msgstr "Kann '%s' nicht löschen."
 
-#: rerere.c:807
+#: rerere.c:791
 #, c-format
 msgid "Recorded preimage for '%s'"
 msgstr "Preimage für '%s' aufgezeichnet."
 
-#: rerere.c:881 submodule.c:2082 builtin/log.c:1992
+#: rerere.c:865 submodule.c:2088 builtin/log.c:1991
 #: builtin/submodule--helper.c:1878 builtin/submodule--helper.c:1890
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: rerere.c:1057
+#: rerere.c:1041
 #, c-format
 msgid "failed to update conflicted state in '%s'"
 msgstr "Fehler beim Aktualisieren des Konflikt-Status in '%s'."
 
-#: rerere.c:1068 rerere.c:1075
+#: rerere.c:1052 rerere.c:1059
 #, c-format
 msgid "no remembered resolution for '%s'"
 msgstr "Keine aufgezeichnete Konfliktauflösung für '%s'."
 
-#: rerere.c:1077
+#: rerere.c:1061
 #, c-format
 msgid "cannot unlink '%s'"
 msgstr "Kann '%s' nicht löschen."
 
-#: rerere.c:1087
+#: rerere.c:1071
 #, c-format
 msgid "Updated preimage for '%s'"
 msgstr "Preimage für '%s' aktualisiert."
 
-#: rerere.c:1096
+#: rerere.c:1080
 #, c-format
 msgid "Forgot resolution for '%s'\n"
 msgstr "Aufgezeichnete Konfliktauflösung für '%s' gelöscht.\n"
 
-#: rerere.c:1199
+#: rerere.c:1191
 msgid "unable to open rr-cache directory"
 msgstr "Konnte rr-cache Verzeichnis nicht öffnen."
 
@@ -6754,43 +7377,38 @@
 msgid "could not determine HEAD revision"
 msgstr "Konnte HEAD-Commit nicht bestimmen."
 
-#: reset.c:70 reset.c:76 sequencer.c:3460
+#: reset.c:70 reset.c:76 sequencer.c:3468
 #, c-format
 msgid "failed to find tree of %s"
 msgstr "Fehler beim Finden des \"Tree\"-Objektes von %s."
 
-#: revision.c:2336
+#: revision.c:2338
 msgid "--unpacked=<packfile> no longer supported"
 msgstr "--unpacked=<Pack-Datei> wird nicht länger unterstützt"
 
-#: revision.c:2356
-#, c-format
-msgid "unknown value for --diff-merges: %s"
-msgstr "unbekannter Wert für --diff-merges: %s"
-
-#: revision.c:2694
+#: revision.c:2668
 msgid "your current branch appears to be broken"
 msgstr "Ihr aktueller Branch scheint fehlerhaft zu sein."
 
-#: revision.c:2697
+#: revision.c:2671
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "Ihr aktueller Branch '%s' hat noch keine Commits."
 
-#: revision.c:2907
+#: revision.c:2877
 msgid "-L does not yet support diff formats besides -p and -s"
 msgstr "-L unterstützt noch keine anderen Diff-Formate außer -p und -s"
 
-#: run-command.c:764
+#: run-command.c:767
 msgid "open /dev/null failed"
 msgstr "Öffnen von /dev/null fehlgeschlagen"
 
-#: run-command.c:1271
+#: run-command.c:1274
 #, c-format
 msgid "cannot create async thread: %s"
 msgstr "Konnte Thread für async nicht erzeugen: %s"
 
-#: run-command.c:1335
+#: run-command.c:1338
 #, c-format
 msgid ""
 "The '%s' hook was ignored because it's not set as executable.\n"
@@ -6854,7 +7472,7 @@
 msgid "could not delete '%s'"
 msgstr "Konnte '%s' nicht löschen."
 
-#: sequencer.c:343 builtin/rebase.c:755 builtin/rebase.c:1596 builtin/rm.c:385
+#: sequencer.c:343 builtin/rebase.c:757 builtin/rebase.c:1602 builtin/rm.c:385
 #, c-format
 msgid "could not remove '%s'"
 msgstr "Konnte '%s' nicht löschen"
@@ -6894,13 +7512,13 @@
 "mit 'git add <Pfade>' oder 'git rm <Pfade>' und tragen Sie das Ergebnis mit\n"
 "'git commit' ein"
 
-#: sequencer.c:434 sequencer.c:3062
+#: sequencer.c:434 sequencer.c:3070
 #, c-format
 msgid "could not lock '%s'"
 msgstr "Konnte '%s' nicht sperren"
 
-#: sequencer.c:436 sequencer.c:2861 sequencer.c:3066 sequencer.c:3080
-#: sequencer.c:3337 sequencer.c:5326 strbuf.c:1168 wrapper.c:631
+#: sequencer.c:436 sequencer.c:2869 sequencer.c:3074 sequencer.c:3088
+#: sequencer.c:3345 sequencer.c:5334 strbuf.c:1168 wrapper.c:631
 #, c-format
 msgid "could not write to '%s'"
 msgstr "Konnte nicht nach '%s' schreiben."
@@ -6910,8 +7528,8 @@
 msgid "could not write eol to '%s'"
 msgstr "Konnte EOL nicht nach '%s' schreiben."
 
-#: sequencer.c:446 sequencer.c:2866 sequencer.c:3068 sequencer.c:3082
-#: sequencer.c:3345
+#: sequencer.c:446 sequencer.c:2874 sequencer.c:3076 sequencer.c:3090
+#: sequencer.c:3353
 #, c-format
 msgid "failed to finalize '%s'"
 msgstr "Fehler beim Fertigstellen von '%s'."
@@ -6931,7 +7549,7 @@
 msgid "%s: fast-forward"
 msgstr "%s: Vorspulen"
 
-#: sequencer.c:560 builtin/tag.c:566
+#: sequencer.c:560 builtin/tag.c:598
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Ungültiger \"cleanup\" Modus %s"
@@ -6944,60 +7562,60 @@
 msgid "%s: Unable to write new index file"
 msgstr "%s: Konnte neue Index-Datei nicht schreiben"
 
-#: sequencer.c:687
+#: sequencer.c:684
 msgid "unable to update cache tree"
 msgstr "Konnte Cache-Verzeichnis nicht aktualisieren."
 
-#: sequencer.c:701
+#: sequencer.c:698
 msgid "could not resolve HEAD commit"
 msgstr "Konnte HEAD-Commit nicht auflösen."
 
-#: sequencer.c:781
+#: sequencer.c:778
 #, c-format
 msgid "no key present in '%.*s'"
 msgstr "Kein Schlüssel in '%.*s' vorhanden."
 
-#: sequencer.c:792
+#: sequencer.c:789
 #, c-format
 msgid "unable to dequote value of '%s'"
 msgstr "Konnte Anführungszeichen von '%s' nicht entfernen."
 
-#: sequencer.c:829 wrapper.c:201 wrapper.c:371 builtin/am.c:710
-#: builtin/am.c:802 builtin/merge.c:1135 builtin/rebase.c:908
+#: sequencer.c:826 wrapper.c:201 wrapper.c:371 builtin/am.c:710
+#: builtin/am.c:802 builtin/merge.c:1136 builtin/rebase.c:910
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "Konnte '%s' nicht zum Lesen öffnen."
 
-#: sequencer.c:839
+#: sequencer.c:836
 msgid "'GIT_AUTHOR_NAME' already given"
 msgstr "'GIT_AUTHOR_NAME' bereits angegeben."
 
-#: sequencer.c:844
+#: sequencer.c:841
 msgid "'GIT_AUTHOR_EMAIL' already given"
 msgstr "'GIT_AUTHOR_EMAIL' bereits angegeben."
 
-#: sequencer.c:849
+#: sequencer.c:846
 msgid "'GIT_AUTHOR_DATE' already given"
 msgstr "'GIT_AUTHOR_DATE' bereits angegeben."
 
-#: sequencer.c:853
+#: sequencer.c:850
 #, c-format
 msgid "unknown variable '%s'"
 msgstr "Unbekannte Variable '%s'"
 
-#: sequencer.c:858
+#: sequencer.c:855
 msgid "missing 'GIT_AUTHOR_NAME'"
 msgstr "'GIT_AUTHOR_NAME' fehlt."
 
-#: sequencer.c:860
+#: sequencer.c:857
 msgid "missing 'GIT_AUTHOR_EMAIL'"
 msgstr "'GIT_AUTHOR_EMAIL' fehlt."
 
-#: sequencer.c:862
+#: sequencer.c:859
 msgid "missing 'GIT_AUTHOR_DATE'"
 msgstr "'GIT_AUTHOR_DATE' fehlt."
 
-#: sequencer.c:927
+#: sequencer.c:924
 #, c-format
 msgid ""
 "you have staged changes in your working tree\n"
@@ -7028,11 +7646,11 @@
 "\n"
 "  git rebase --continue\n"
 
-#: sequencer.c:1208
+#: sequencer.c:1211
 msgid "'prepare-commit-msg' hook failed"
 msgstr "'prepare-commit-msg' Hook fehlgeschlagen."
 
-#: sequencer.c:1214
+#: sequencer.c:1217
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -7060,7 +7678,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: sequencer.c:1227
+#: sequencer.c:1230
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -7086,340 +7704,340 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: sequencer.c:1269
+#: sequencer.c:1272
 msgid "couldn't look up newly created commit"
 msgstr "Konnte neu erstellten Commit nicht nachschlagen."
 
-#: sequencer.c:1271
+#: sequencer.c:1274
 msgid "could not parse newly created commit"
 msgstr "Konnte neu erstellten Commit nicht analysieren."
 
-#: sequencer.c:1317
+#: sequencer.c:1320
 msgid "unable to resolve HEAD after creating commit"
 msgstr "Konnte HEAD nicht auflösen, nachdem der Commit erstellt wurde."
 
-#: sequencer.c:1319
+#: sequencer.c:1322
 msgid "detached HEAD"
 msgstr "losgelöster HEAD"
 
-#: sequencer.c:1323
+#: sequencer.c:1326
 msgid " (root-commit)"
 msgstr " (Root-Commit)"
 
-#: sequencer.c:1344
+#: sequencer.c:1347
 msgid "could not parse HEAD"
 msgstr "Konnte HEAD nicht parsen."
 
-#: sequencer.c:1346
+#: sequencer.c:1349
 #, c-format
 msgid "HEAD %s is not a commit!"
 msgstr "HEAD %s ist kein Commit!"
 
-#: sequencer.c:1350 sequencer.c:1425 builtin/commit.c:1577
+#: sequencer.c:1353 sequencer.c:1431 builtin/commit.c:1577
 msgid "could not parse HEAD commit"
 msgstr "Konnte Commit von HEAD nicht analysieren."
 
-#: sequencer.c:1403 sequencer.c:2100
+#: sequencer.c:1409 sequencer.c:2108
 msgid "unable to parse commit author"
 msgstr "Konnte Commit-Autor nicht parsen."
 
-#: sequencer.c:1414 builtin/am.c:1566 builtin/merge.c:701
+#: sequencer.c:1420 builtin/am.c:1566 builtin/merge.c:702
 msgid "git write-tree failed to write a tree"
 msgstr "\"git write-tree\" schlug beim Schreiben eines \"Tree\"-Objektes fehl"
 
-#: sequencer.c:1447 sequencer.c:1565
+#: sequencer.c:1453 sequencer.c:1573
 #, c-format
 msgid "unable to read commit message from '%s'"
 msgstr "Konnte Commit-Beschreibung von '%s' nicht lesen."
 
-#: sequencer.c:1476 sequencer.c:1508
+#: sequencer.c:1484 sequencer.c:1516
 #, c-format
 msgid "invalid author identity '%s'"
 msgstr "ungültige Autor-Identität '%s'"
 
-#: sequencer.c:1482
+#: sequencer.c:1490
 msgid "corrupt author: missing date information"
 msgstr "unbrauchbarer Autor: Datumsinformationen fehlen"
 
-#: sequencer.c:1521 builtin/am.c:1593 builtin/commit.c:1678 builtin/merge.c:904
-#: builtin/merge.c:929 t/helper/test-fast-rebase.c:78
+#: sequencer.c:1529 builtin/am.c:1593 builtin/commit.c:1678 builtin/merge.c:905
+#: builtin/merge.c:930 t/helper/test-fast-rebase.c:78
 msgid "failed to write commit object"
 msgstr "Fehler beim Schreiben des Commit-Objektes."
 
-#: sequencer.c:1548 sequencer.c:4283 t/helper/test-fast-rebase.c:198
+#: sequencer.c:1556 sequencer.c:4291 t/helper/test-fast-rebase.c:198
 #, c-format
 msgid "could not update %s"
 msgstr "Konnte %s nicht aktualisieren."
 
-#: sequencer.c:1597
+#: sequencer.c:1605
 #, c-format
 msgid "could not parse commit %s"
 msgstr "Konnte Commit %s nicht parsen."
 
-#: sequencer.c:1602
+#: sequencer.c:1610
 #, c-format
 msgid "could not parse parent commit %s"
 msgstr "Konnte Eltern-Commit %s nicht parsen."
 
-#: sequencer.c:1685 sequencer.c:1796
+#: sequencer.c:1693 sequencer.c:1804
 #, c-format
 msgid "unknown command: %d"
 msgstr "Unbekannter Befehl: %d"
 
-#: sequencer.c:1743 sequencer.c:1768
+#: sequencer.c:1751 sequencer.c:1776
 #, c-format
 msgid "This is a combination of %d commits."
 msgstr "Das ist eine Kombination aus %d Commits."
 
-#: sequencer.c:1753
+#: sequencer.c:1761
 msgid "need a HEAD to fixup"
 msgstr "benötige HEAD für fixup"
 
-#: sequencer.c:1755 sequencer.c:3372
+#: sequencer.c:1763 sequencer.c:3380
 msgid "could not read HEAD"
 msgstr "Konnte HEAD nicht lesen"
 
-#: sequencer.c:1757
+#: sequencer.c:1765
 msgid "could not read HEAD's commit message"
 msgstr "Konnte Commit-Beschreibung von HEAD nicht lesen"
 
-#: sequencer.c:1763
+#: sequencer.c:1771
 #, c-format
 msgid "cannot write '%s'"
 msgstr "kann '%s' nicht schreiben"
 
-#: sequencer.c:1770 git-rebase--preserve-merges.sh:486
+#: sequencer.c:1778 git-rebase--preserve-merges.sh:486
 msgid "This is the 1st commit message:"
 msgstr "Das ist die erste Commit-Beschreibung:"
 
-#: sequencer.c:1778
+#: sequencer.c:1786
 #, c-format
 msgid "could not read commit message of %s"
 msgstr "Konnte Commit-Beschreibung von %s nicht lesen."
 
-#: sequencer.c:1785
+#: sequencer.c:1793
 #, c-format
 msgid "This is the commit message #%d:"
 msgstr "Das ist Commit-Beschreibung #%d:"
 
-#: sequencer.c:1791
+#: sequencer.c:1799
 #, c-format
 msgid "The commit message #%d will be skipped:"
 msgstr "Die Commit-Beschreibung #%d wird ausgelassen:"
 
-#: sequencer.c:1879
+#: sequencer.c:1887
 msgid "your index file is unmerged."
 msgstr "Ihre Index-Datei ist nicht zusammengeführt."
 
-#: sequencer.c:1886
+#: sequencer.c:1894
 msgid "cannot fixup root commit"
 msgstr "kann fixup nicht auf Root-Commit anwenden"
 
-#: sequencer.c:1905
+#: sequencer.c:1913
 #, 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:1913 sequencer.c:1921
+#: sequencer.c:1921 sequencer.c:1929
 #, c-format
 msgid "commit %s does not have parent %d"
 msgstr "Commit %s hat keinen Eltern-Commit %d"
 
-#: sequencer.c:1927
+#: sequencer.c:1935
 #, c-format
 msgid "cannot get commit message for %s"
 msgstr "Kann keine Commit-Beschreibung für %s bekommen."
 
 #. TRANSLATORS: The first %s will be a "todo" command like
 #. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:1946
+#: sequencer.c:1954
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s: kann Eltern-Commit %s nicht parsen"
 
-#: sequencer.c:2011
+#: sequencer.c:2019
 #, c-format
 msgid "could not rename '%s' to '%s'"
 msgstr "Konnte '%s' nicht zu '%s' umbenennen."
 
-#: sequencer.c:2071
+#: sequencer.c:2079
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "Konnte \"revert\" nicht auf %s... (%s) ausführen"
 
-#: sequencer.c:2072
+#: sequencer.c:2080
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "Konnte %s... (%s) nicht anwenden"
 
-#: sequencer.c:2092
+#: sequencer.c:2100
 #, c-format
 msgid "dropping %s %s -- patch contents already upstream\n"
 msgstr "Weglassen von %s %s -- Patch-Inhalte sind bereits im Upstream-Branch\n"
 
-#: sequencer.c:2150
+#: sequencer.c:2158
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: Fehler beim Lesen des Index"
 
-#: sequencer.c:2157
+#: sequencer.c:2165
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: Fehler beim Aktualisieren des Index"
 
-#: sequencer.c:2234
+#: sequencer.c:2242
 #, c-format
 msgid "%s does not accept arguments: '%s'"
 msgstr "%s akzeptiert keine Argumente: '%s'"
 
-#: sequencer.c:2243
+#: sequencer.c:2251
 #, c-format
 msgid "missing arguments for %s"
 msgstr "Fehlende Argumente für %s."
 
-#: sequencer.c:2274
+#: sequencer.c:2282
 #, c-format
 msgid "could not parse '%s'"
 msgstr "Konnte '%s' nicht parsen."
 
-#: sequencer.c:2335
+#: sequencer.c:2343
 #, c-format
 msgid "invalid line %d: %.*s"
 msgstr "Ungültige Zeile %d: %.*s"
 
-#: sequencer.c:2346
+#: sequencer.c:2354
 #, c-format
 msgid "cannot '%s' without a previous commit"
 msgstr "Kann '%s' nicht ohne vorherigen Commit ausführen"
 
-#: sequencer.c:2432
+#: sequencer.c:2440
 msgid "cancelling a cherry picking in progress"
 msgstr "Abbrechen eines laufenden \"cherry-pick\""
 
-#: sequencer.c:2441
+#: sequencer.c:2449
 msgid "cancelling a revert in progress"
 msgstr "Abbrechen eines laufenden \"revert\""
 
-#: sequencer.c:2485
+#: sequencer.c:2493
 msgid "please fix this using 'git rebase --edit-todo'."
 msgstr ""
 "Bitte beheben Sie dieses, indem Sie 'git rebase --edit-todo' ausführen."
 
-#: sequencer.c:2487
+#: sequencer.c:2495
 #, c-format
 msgid "unusable instruction sheet: '%s'"
 msgstr "Unbenutzbares Instruktionsblatt: '%s'"
 
-#: sequencer.c:2492
+#: sequencer.c:2500
 msgid "no commits parsed."
 msgstr "Keine Commits geparst."
 
-#: sequencer.c:2503
+#: sequencer.c:2511
 msgid "cannot cherry-pick during a revert."
 msgstr "Kann Cherry-Pick nicht während eines Reverts ausführen."
 
-#: sequencer.c:2505
+#: sequencer.c:2513
 msgid "cannot revert during a cherry-pick."
 msgstr "Kann Revert nicht während eines Cherry-Picks ausführen."
 
-#: sequencer.c:2583
+#: sequencer.c:2591
 #, c-format
 msgid "invalid value for %s: %s"
 msgstr "Ungültiger Wert für %s: %s"
 
-#: sequencer.c:2690
+#: sequencer.c:2698
 msgid "unusable squash-onto"
 msgstr "Unbenutzbares squash-onto."
 
-#: sequencer.c:2710
+#: sequencer.c:2718
 #, c-format
 msgid "malformed options sheet: '%s'"
 msgstr "Fehlerhaftes Optionsblatt: '%s'"
 
-#: sequencer.c:2803 sequencer.c:4636
+#: sequencer.c:2811 sequencer.c:4644
 msgid "empty commit set passed"
 msgstr "leere Menge von Commits übergeben"
 
-#: sequencer.c:2820
+#: sequencer.c:2828
 msgid "revert is already in progress"
 msgstr "\"revert\" ist bereits im Gange"
 
-#: sequencer.c:2822
+#: sequencer.c:2830
 #, c-format
 msgid "try \"git revert (--continue | %s--abort | --quit)\""
 msgstr "Versuchen Sie \"git revert (--continue | %s--abort | --quit)\""
 
-#: sequencer.c:2825
+#: sequencer.c:2833
 msgid "cherry-pick is already in progress"
 msgstr "\"cherry-pick\" wird bereits durchgeführt"
 
-#: sequencer.c:2827
+#: sequencer.c:2835
 #, c-format
 msgid "try \"git cherry-pick (--continue | %s--abort | --quit)\""
 msgstr "Versuchen Sie \"git cherry-pick (--continue | %s--abort | --quit)\""
 
-#: sequencer.c:2841
+#: sequencer.c:2849
 #, c-format
 msgid "could not create sequencer directory '%s'"
 msgstr "Konnte \"sequencer\"-Verzeichnis '%s' nicht erstellen."
 
-#: sequencer.c:2856
+#: sequencer.c:2864
 msgid "could not lock HEAD"
 msgstr "Konnte HEAD nicht sperren"
 
-#: sequencer.c:2916 sequencer.c:4371
+#: sequencer.c:2924 sequencer.c:4379
 msgid "no cherry-pick or revert in progress"
 msgstr "kein \"cherry-pick\" oder \"revert\" im Gange"
 
-#: sequencer.c:2918 sequencer.c:2929
+#: sequencer.c:2926 sequencer.c:2937
 msgid "cannot resolve HEAD"
 msgstr "kann HEAD nicht auflösen"
 
-#: sequencer.c:2920 sequencer.c:2964
+#: sequencer.c:2928 sequencer.c:2972
 msgid "cannot abort from a branch yet to be born"
 msgstr "kann nicht abbrechen: bin auf einem Branch, der noch nicht geboren ist"
 
-#: sequencer.c:2950 builtin/grep.c:756
+#: sequencer.c:2958 builtin/grep.c:757
 #, c-format
 msgid "cannot open '%s'"
 msgstr "kann '%s' nicht öffnen"
 
-#: sequencer.c:2952
+#: sequencer.c:2960
 #, c-format
 msgid "cannot read '%s': %s"
 msgstr "Kann '%s' nicht lesen: %s"
 
-#: sequencer.c:2953
+#: sequencer.c:2961
 msgid "unexpected end of file"
 msgstr "Unerwartetes Dateiende"
 
-#: sequencer.c:2959
+#: sequencer.c:2967
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr "gespeicherte \"pre-cherry-pick\" HEAD Datei '%s' ist beschädigt"
 
-#: sequencer.c:2970
+#: sequencer.c:2978
 msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
 msgstr ""
 "Sie scheinen HEAD verändert zu haben. Keine Rückspulung, prüfen Sie HEAD."
 
-#: sequencer.c:3011
+#: sequencer.c:3019
 msgid "no revert in progress"
 msgstr "Kein Revert im Gange"
 
-#: sequencer.c:3020
+#: sequencer.c:3028
 msgid "no cherry-pick in progress"
 msgstr "kein \"cherry-pick\" im Gange"
 
-#: sequencer.c:3030
+#: sequencer.c:3038
 msgid "failed to skip the commit"
 msgstr "Überspringen des Commits fehlgeschlagen"
 
-#: sequencer.c:3037
+#: sequencer.c:3045
 msgid "there is nothing to skip"
 msgstr "Nichts zum Überspringen vorhanden"
 
-#: sequencer.c:3040
+#: sequencer.c:3048
 #, c-format
 msgid ""
 "have you committed already?\n"
@@ -7428,16 +8046,16 @@
 "Haben Sie bereits committet?\n"
 "Versuchen Sie \"git %s --continue\""
 
-#: sequencer.c:3202 sequencer.c:4263
+#: sequencer.c:3210 sequencer.c:4271
 msgid "cannot read HEAD"
 msgstr "Kann HEAD nicht lesen"
 
-#: sequencer.c:3219
+#: sequencer.c:3227
 #, c-format
 msgid "unable to copy '%s' to '%s'"
 msgstr "Konnte '%s' nicht nach '%s' kopieren."
 
-#: sequencer.c:3227
+#: sequencer.c:3235
 #, c-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -7456,27 +8074,27 @@
 "\n"
 "  git rebase --continue\n"
 
-#: sequencer.c:3237
+#: sequencer.c:3245
 #, c-format
 msgid "Could not apply %s... %.*s"
 msgstr "Konnte %s... (%.*s) nicht anwenden"
 
-#: sequencer.c:3244
+#: sequencer.c:3252
 #, c-format
 msgid "Could not merge %.*s"
 msgstr "Konnte \"%.*s\" nicht zusammenführen."
 
-#: sequencer.c:3258 sequencer.c:3262 builtin/difftool.c:640
+#: sequencer.c:3266 sequencer.c:3270 builtin/difftool.c:640
 #, c-format
 msgid "could not copy '%s' to '%s'"
 msgstr "Konnte '%s' nicht nach '%s' kopieren."
 
-#: sequencer.c:3274
+#: sequencer.c:3282
 #, c-format
 msgid "Executing: %s\n"
 msgstr "Führe aus: %s\n"
 
-#: sequencer.c:3289
+#: sequencer.c:3297
 #, c-format
 msgid ""
 "execution failed: %s\n"
@@ -7492,11 +8110,11 @@
 "\n"
 "ausführen.\n"
 
-#: sequencer.c:3295
+#: sequencer.c:3303
 msgid "and made changes to the index and/or the working tree\n"
 msgstr "Der Index und/oder das Arbeitsverzeichnis wurde geändert.\n"
 
-#: sequencer.c:3301
+#: sequencer.c:3309
 #, c-format
 msgid ""
 "execution succeeded: %s\n"
@@ -7514,91 +8132,91 @@
 "  git rebase --continue\n"
 "\n"
 
-#: sequencer.c:3362
+#: sequencer.c:3370
 #, c-format
 msgid "illegal label name: '%.*s'"
 msgstr "Unerlaubter Beschriftungsname: '%.*s'"
 
-#: sequencer.c:3416
+#: sequencer.c:3424
 msgid "writing fake root commit"
 msgstr "unechten Root-Commit schreiben"
 
-#: sequencer.c:3421
+#: sequencer.c:3429
 msgid "writing squash-onto"
 msgstr "squash-onto schreiben"
 
-#: sequencer.c:3505
+#: sequencer.c:3513
 #, c-format
 msgid "could not resolve '%s'"
 msgstr "Konnte '%s' nicht auflösen."
 
-#: sequencer.c:3538
+#: sequencer.c:3546
 msgid "cannot merge without a current revision"
 msgstr "Kann nicht ohne einen aktuellen Commit mergen."
 
-#: sequencer.c:3560
+#: sequencer.c:3568
 #, c-format
 msgid "unable to parse '%.*s'"
 msgstr "Konnte '%.*s' nicht parsen."
 
-#: sequencer.c:3569
+#: sequencer.c:3577
 #, c-format
 msgid "nothing to merge: '%.*s'"
 msgstr "Nichts zum Zusammenführen: '%.*s'"
 
-#: sequencer.c:3581
+#: sequencer.c:3589
 msgid "octopus merge cannot be executed on top of a [new root]"
 msgstr ""
 "Oktopus-Merge kann nicht auf Basis von [neuem Root-Commit] ausgeführt werden."
 
-#: sequencer.c:3597
+#: sequencer.c:3605
 #, c-format
 msgid "could not get commit message of '%s'"
 msgstr "Konnte keine Commit-Beschreibung von '%s' bekommen."
 
-#: sequencer.c:3780
+#: sequencer.c:3788
 #, c-format
 msgid "could not even attempt to merge '%.*s'"
 msgstr "Konnte nicht einmal versuchen '%.*s' zu mergen."
 
-#: sequencer.c:3796
+#: sequencer.c:3804
 msgid "merge: Unable to write new index file"
 msgstr "merge: Konnte neue Index-Datei nicht schreiben."
 
-#: sequencer.c:3870
+#: sequencer.c:3878
 msgid "Cannot autostash"
 msgstr "Kann automatischen Stash nicht erzeugen."
 
-#: sequencer.c:3873
+#: sequencer.c:3881
 #, c-format
 msgid "Unexpected stash response: '%s'"
 msgstr "Unerwartete 'stash'-Antwort: '%s'"
 
-#: sequencer.c:3879
+#: sequencer.c:3887
 #, c-format
 msgid "Could not create directory for '%s'"
 msgstr "Konnte Verzeichnis für '%s' nicht erstellen."
 
-#: sequencer.c:3882
+#: sequencer.c:3890
 #, c-format
 msgid "Created autostash: %s\n"
 msgstr "Automatischen Stash erzeugt: %s\n"
 
-#: sequencer.c:3886
+#: sequencer.c:3894
 msgid "could not reset --hard"
 msgstr "Konnte 'reset --hard' nicht ausführen."
 
-#: sequencer.c:3911
+#: sequencer.c:3919
 #, c-format
 msgid "Applied autostash.\n"
 msgstr "Automatischen Stash angewendet.\n"
 
-#: sequencer.c:3923
+#: sequencer.c:3931
 #, c-format
 msgid "cannot store %s"
 msgstr "kann %s nicht speichern"
 
-#: sequencer.c:3926
+#: sequencer.c:3934
 #, c-format
 msgid ""
 "%s\n"
@@ -7609,29 +8227,29 @@
 "Ihre Änderungen sind im Stash sicher.\n"
 "Sie können jederzeit \"git stash pop\" oder \"git stash drop\" ausführen.\n"
 
-#: sequencer.c:3931
+#: sequencer.c:3939
 msgid "Applying autostash resulted in conflicts."
 msgstr "Beim Anwenden des automatischen Stash traten Konflikte auf."
 
-#: sequencer.c:3932
+#: sequencer.c:3940
 msgid "Autostash exists; creating a new stash entry."
 msgstr "Automatischer Stash existiert; ein neuer Stash-Eintrag wird erstellt."
 
-#: sequencer.c:4025 git-rebase--preserve-merges.sh:769
+#: sequencer.c:4033 git-rebase--preserve-merges.sh:769
 msgid "could not detach HEAD"
 msgstr "Konnte HEAD nicht loslösen"
 
-#: sequencer.c:4040
+#: sequencer.c:4048
 #, c-format
 msgid "Stopped at HEAD\n"
 msgstr "Angehalten bei HEAD\n"
 
-#: sequencer.c:4042
+#: sequencer.c:4050
 #, c-format
 msgid "Stopped at %s\n"
 msgstr "Angehalten bei %s\n"
 
-#: sequencer.c:4050
+#: sequencer.c:4058
 #, c-format
 msgid ""
 "Could not execute the todo command\n"
@@ -7653,60 +8271,60 @@
 "    git rebase --edit-todo\n"
 "    git rebase --continue\n"
 
-#: sequencer.c:4096
+#: sequencer.c:4104
 #, c-format
 msgid "Rebasing (%d/%d)%s"
 msgstr "Rebase (%d/%d)%s"
 
-#: sequencer.c:4141
+#: sequencer.c:4149
 #, c-format
 msgid "Stopped at %s...  %.*s\n"
 msgstr "Angehalten bei %s... %.*s\n"
 
-#: sequencer.c:4212
+#: sequencer.c:4220
 #, c-format
 msgid "unknown command %d"
 msgstr "Unbekannter Befehl %d"
 
-#: sequencer.c:4271
+#: sequencer.c:4279
 msgid "could not read orig-head"
 msgstr "Konnte orig-head nicht lesen."
 
-#: sequencer.c:4276
+#: sequencer.c:4284
 msgid "could not read 'onto'"
 msgstr "Konnte 'onto' nicht lesen."
 
-#: sequencer.c:4290
+#: sequencer.c:4298
 #, c-format
 msgid "could not update HEAD to %s"
 msgstr "Konnte HEAD nicht auf %s aktualisieren."
 
-#: sequencer.c:4350
+#: sequencer.c:4358
 #, c-format
 msgid "Successfully rebased and updated %s.\n"
 msgstr "Erfolgreich Rebase ausgeführt und %s aktualisiert.\n"
 
-#: sequencer.c:4383
+#: sequencer.c:4391
 msgid "cannot rebase: You have unstaged changes."
 msgstr ""
 "Rebase nicht möglich: Sie haben Änderungen, die nicht zum Commit\n"
 "vorgemerkt sind."
 
-#: sequencer.c:4392
+#: sequencer.c:4400
 msgid "cannot amend non-existing commit"
 msgstr "Kann nicht existierenden Commit nicht nachbessern."
 
-#: sequencer.c:4394
+#: sequencer.c:4402
 #, c-format
 msgid "invalid file: '%s'"
 msgstr "Ungültige Datei: '%s'"
 
-#: sequencer.c:4396
+#: sequencer.c:4404
 #, c-format
 msgid "invalid contents: '%s'"
 msgstr "Ungültige Inhalte: '%s'"
 
-#: sequencer.c:4399
+#: sequencer.c:4407
 msgid ""
 "\n"
 "You have uncommitted changes in your working tree. Please, commit them\n"
@@ -7717,50 +8335,50 @@
 "committen Sie diese zuerst und führen Sie dann 'git rebase --continue'\n"
 "erneut aus."
 
-#: sequencer.c:4435 sequencer.c:4474
+#: sequencer.c:4443 sequencer.c:4482
 #, c-format
 msgid "could not write file: '%s'"
 msgstr "Konnte Datei nicht schreiben: '%s'"
 
-#: sequencer.c:4490
+#: sequencer.c:4498
 msgid "could not remove CHERRY_PICK_HEAD"
 msgstr "Konnte CHERRY_PICK_HEAD nicht löschen."
 
-#: sequencer.c:4497
+#: sequencer.c:4505
 msgid "could not commit staged changes."
 msgstr "Konnte Änderungen aus der Staging-Area nicht committen."
 
-#: sequencer.c:4613
+#: sequencer.c:4621
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s: %s kann nicht in \"cherry-pick\" benutzt werden"
 
-#: sequencer.c:4617
+#: sequencer.c:4625
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s: ungültiger Commit"
 
-#: sequencer.c:4652
+#: sequencer.c:4660
 msgid "can't revert as initial commit"
 msgstr "Kann nicht als allerersten Commit einen Revert ausführen."
 
-#: sequencer.c:5129
+#: sequencer.c:5137
 msgid "make_script: unhandled options"
 msgstr "make_script: unbehandelte Optionen"
 
-#: sequencer.c:5132
+#: sequencer.c:5140
 msgid "make_script: error preparing revisions"
 msgstr "make_script: Fehler beim Vorbereiten der Commits"
 
-#: sequencer.c:5374 sequencer.c:5391
+#: sequencer.c:5382 sequencer.c:5399
 msgid "nothing to do"
 msgstr "Nichts zu tun."
 
-#: sequencer.c:5410
+#: sequencer.c:5418
 msgid "could not skip unnecessary pick commands"
 msgstr "Konnte unnötige \"pick\"-Befehle nicht auslassen."
 
-#: sequencer.c:5504
+#: sequencer.c:5512
 msgid "the script was already rearranged."
 msgstr "Das Script wurde bereits umgeordnet."
 
@@ -7775,7 +8393,7 @@
 "%s: no such path in the working tree.\n"
 "Use 'git <command> -- <path>...' to specify paths that do not exist locally."
 msgstr ""
-"%s: kein solcher Pfad im Arbeitsverzeichnis.\n"
+"%s: Pfad nicht im Arbeitsverzeichnis gefunden.\n"
 "Benutzen Sie 'git <Befehl> -- <Pfad>...' zur Angabe von Pfaden, die lokal\n"
 "nicht existieren."
 
@@ -7929,370 +8547,6 @@
 msgid "setsid failed"
 msgstr "setsid fehlgeschlagen"
 
-#: sha1-file.c:480
-#, c-format
-msgid "object directory %s does not exist; check .git/objects/info/alternates"
-msgstr ""
-"Objektverzeichnis %s existiert nicht; prüfe .git/objects/info/alternates"
-
-#: sha1-file.c:531
-#, c-format
-msgid "unable to normalize alternate object path: %s"
-msgstr "Konnte alternativen Objektpfad '%s' nicht normalisieren."
-
-#: sha1-file.c:603
-#, c-format
-msgid "%s: ignoring alternate object stores, nesting too deep"
-msgstr "%s: ignoriere alternative Objektspeicher - Verschachtelung zu tief"
-
-#: sha1-file.c:610
-#, c-format
-msgid "unable to normalize object directory: %s"
-msgstr "Konnte Objektverzeichnis '%s' nicht normalisieren."
-
-#: sha1-file.c:653
-msgid "unable to fdopen alternates lockfile"
-msgstr "Konnte fdopen nicht auf Lock-Datei für \"alternates\" aufrufen."
-
-#: sha1-file.c:671
-msgid "unable to read alternates file"
-msgstr "Konnte \"alternates\"-Datei nicht lesen."
-
-#: sha1-file.c:678
-msgid "unable to move new alternates file into place"
-msgstr "Konnte neue \"alternates\"-Datei nicht übernehmen."
-
-#: sha1-file.c:713
-#, c-format
-msgid "path '%s' does not exist"
-msgstr "Pfad '%s' existiert nicht"
-
-#: sha1-file.c:734
-#, 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."
-
-#: sha1-file.c:740
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "Referenziertes Repository '%s' ist kein lokales Repository."
-
-#: sha1-file.c:746
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr ""
-"Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)."
-
-#: sha1-file.c:754
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr ""
-"Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") "
-"eingehängt."
-
-#: sha1-file.c:814
-#, c-format
-msgid "invalid line while parsing alternate refs: %s"
-msgstr "Ungültige Zeile beim Parsen alternativer Referenzen: %s"
-
-#: sha1-file.c:964
-#, c-format
-msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
-msgstr "Versuche mmap %<PRIuMAX> über Limit %<PRIuMAX>."
-
-#: sha1-file.c:985
-msgid "mmap failed"
-msgstr "mmap fehlgeschlagen"
-
-#: sha1-file.c:1149
-#, c-format
-msgid "object file %s is empty"
-msgstr "Objektdatei %s ist leer."
-
-#: sha1-file.c:1284 sha1-file.c:2477
-#, c-format
-msgid "corrupt loose object '%s'"
-msgstr "Fehlerhaftes loses Objekt '%s'."
-
-#: sha1-file.c:1286 sha1-file.c:2481
-#, c-format
-msgid "garbage at end of loose object '%s'"
-msgstr "Nutzlose Daten am Ende von losem Objekt '%s'."
-
-#: sha1-file.c:1328
-msgid "invalid object type"
-msgstr "ungültiger Objekt-Typ"
-
-#: sha1-file.c:1412
-#, c-format
-msgid "unable to unpack %s header with --allow-unknown-type"
-msgstr "Konnte %s Kopfbereich nicht mit --allow-unknown-type entpacken."
-
-#: sha1-file.c:1415
-#, c-format
-msgid "unable to unpack %s header"
-msgstr "Konnte %s Kopfbereich nicht entpacken."
-
-#: sha1-file.c:1421
-#, c-format
-msgid "unable to parse %s header with --allow-unknown-type"
-msgstr "Konnte %s Kopfbereich mit --allow-unknown-type nicht parsen."
-
-#: sha1-file.c:1424
-#, c-format
-msgid "unable to parse %s header"
-msgstr "Konnte %s Kopfbereich nicht parsen."
-
-#: sha1-file.c:1651
-#, c-format
-msgid "failed to read object %s"
-msgstr "Konnte Objekt %s nicht lesen."
-
-#: sha1-file.c:1655
-#, c-format
-msgid "replacement %s not found for %s"
-msgstr "Ersetzung %s für %s nicht gefunden."
-
-#: sha1-file.c:1659
-#, c-format
-msgid "loose object %s (stored in %s) is corrupt"
-msgstr "Loses Objekt %s (gespeichert in %s) ist beschädigt."
-
-#: sha1-file.c:1663
-#, c-format
-msgid "packed object %s (stored in %s) is corrupt"
-msgstr "Gepacktes Objekt %s (gespeichert in %s) ist beschädigt."
-
-#: sha1-file.c:1768
-#, c-format
-msgid "unable to write file %s"
-msgstr "Konnte Datei %s nicht schreiben."
-
-#: sha1-file.c:1775
-#, c-format
-msgid "unable to set permission to '%s'"
-msgstr "Konnte Zugriffsberechtigung auf '%s' nicht setzen."
-
-#: sha1-file.c:1782
-msgid "file write error"
-msgstr "Fehler beim Schreiben einer Datei."
-
-#: sha1-file.c:1802
-msgid "error when closing loose object file"
-msgstr "Fehler beim Schließen der Datei für lose Objekte."
-
-#: sha1-file.c:1867
-#, c-format
-msgid "insufficient permission for adding an object to repository database %s"
-msgstr ""
-"Unzureichende Berechtigung zum Hinzufügen eines Objektes zur Repository-"
-"Datenbank %s"
-
-#: sha1-file.c:1869
-msgid "unable to create temporary file"
-msgstr "Konnte temporäre Datei nicht erstellen."
-
-#: sha1-file.c:1893
-msgid "unable to write loose object file"
-msgstr "Fehler beim Schreiben der Datei für lose Objekte."
-
-#: sha1-file.c:1899
-#, c-format
-msgid "unable to deflate new object %s (%d)"
-msgstr "Konnte neues Objekt %s (%d) nicht komprimieren."
-
-#: sha1-file.c:1903
-#, c-format
-msgid "deflateEnd on object %s failed (%d)"
-msgstr "deflateEnd auf Objekt %s fehlgeschlagen (%d)"
-
-#: sha1-file.c:1907
-#, c-format
-msgid "confused by unstable object source data for %s"
-msgstr "Fehler wegen instabilen Objektquelldaten für %s"
-
-#: sha1-file.c:1917 builtin/pack-objects.c:1086
-#, c-format
-msgid "failed utime() on %s"
-msgstr "Fehler beim Aufruf von utime() auf '%s'."
-
-#: sha1-file.c:1994
-#, c-format
-msgid "cannot read object for %s"
-msgstr "Kann Objekt für %s nicht lesen."
-
-#: sha1-file.c:2045
-msgid "corrupt commit"
-msgstr "fehlerhafter Commit"
-
-#: sha1-file.c:2053
-msgid "corrupt tag"
-msgstr "fehlerhaftes Tag"
-
-#: sha1-file.c:2153
-#, c-format
-msgid "read error while indexing %s"
-msgstr "Lesefehler beim Indizieren von '%s'."
-
-#: sha1-file.c:2156
-#, c-format
-msgid "short read while indexing %s"
-msgstr "read() zu kurz beim Indizieren von '%s'."
-
-#: sha1-file.c:2229 sha1-file.c:2239
-#, c-format
-msgid "%s: failed to insert into database"
-msgstr "%s: Fehler beim Einfügen in die Datenbank"
-
-#: sha1-file.c:2245
-#, c-format
-msgid "%s: unsupported file type"
-msgstr "%s: nicht unterstützte Dateiart"
-
-#: sha1-file.c:2269
-#, c-format
-msgid "%s is not a valid object"
-msgstr "%s ist kein gültiges Objekt"
-
-#: sha1-file.c:2271
-#, c-format
-msgid "%s is not a valid '%s' object"
-msgstr "%s ist kein gültiges '%s' Objekt"
-
-#: sha1-file.c:2298 builtin/index-pack.c:192
-#, c-format
-msgid "unable to open %s"
-msgstr "kann %s nicht öffnen"
-
-#: sha1-file.c:2488 sha1-file.c:2541
-#, c-format
-msgid "hash mismatch for %s (expected %s)"
-msgstr "Hash für %s stimmt nicht überein (%s erwartet)."
-
-#: sha1-file.c:2512
-#, c-format
-msgid "unable to mmap %s"
-msgstr "Konnte mmap nicht auf %s ausführen."
-
-#: sha1-file.c:2517
-#, c-format
-msgid "unable to unpack header of %s"
-msgstr "Konnte Kopfbereich von %s nicht entpacken."
-
-#: sha1-file.c:2523
-#, c-format
-msgid "unable to parse header of %s"
-msgstr "Konnte Kopfbereich von %s nicht parsen."
-
-#: sha1-file.c:2534
-#, c-format
-msgid "unable to unpack contents of %s"
-msgstr "Konnte Inhalt von %s nicht entpacken."
-
-#: sha1-name.c:486
-#, c-format
-msgid "short SHA1 %s is ambiguous"
-msgstr "Kurzer SHA-1 %s ist mehrdeutig."
-
-#: sha1-name.c:497
-msgid "The candidates are:"
-msgstr "Die Kandidaten sind:"
-
-#: sha1-name.c:796
-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 switch -c $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 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 switch -c $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."
-
-#: sha1-name.c:916
-#, c-format
-msgid "log for '%.*s' only goes back to %s"
-msgstr "Log für '%.*s' geht nur bis %s zurück"
-
-#: sha1-name.c:924
-#, c-format
-msgid "log for '%.*s' only has %d entries"
-msgstr "Log für '%.*s' hat nur %d Einträge"
-
-#: sha1-name.c:1702
-#, c-format
-msgid "path '%s' exists on disk, but not in '%.*s'"
-msgstr "Pfad '%s' befindet sich im Dateisystem, aber nicht in '%.*s'"
-
-#: sha1-name.c:1708
-#, c-format
-msgid ""
-"path '%s' exists, but not '%s'\n"
-"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
-msgstr ""
-"Pfad '%s' existiert, aber nicht '%s'\n"
-"Hinweis: Meinten Sie '%.*s:%s' auch bekannt als '%.*s:./%s'?"
-
-#: sha1-name.c:1717
-#, c-format
-msgid "path '%s' does not exist in '%.*s'"
-msgstr "Pfad '%s' existiert nicht in '%.*s'"
-
-#: sha1-name.c:1745
-#, c-format
-msgid ""
-"path '%s' is in the index, but not at stage %d\n"
-"hint: Did you mean ':%d:%s'?"
-msgstr ""
-"Pfad '%s' ist im Index, aber nicht in Stufe %d\n"
-"Hinweis: Meinten Sie ':%d:%s'?"
-
-#: sha1-name.c:1761
-#, c-format
-msgid ""
-"path '%s' is in the index, but not '%s'\n"
-"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
-msgstr ""
-"Pfad '%s' ist im Index, aber nicht '%s'\n"
-"Hinweis: Meinten Sie ':%d:%s' auch bekannt als ':%d:./%s'?"
-
-#: sha1-name.c:1769
-#, c-format
-msgid "path '%s' exists on disk, but not in the index"
-msgstr "Pfad '%s' existiert im Dateisystem, aber nicht im Index"
-
-#: sha1-name.c:1771
-#, c-format
-msgid "path '%s' does not exist (neither on disk nor in the index)"
-msgstr "Pfad '%s' existiert nicht (weder im Dateisystem noch im Index)"
-
-#: sha1-name.c:1784
-msgid "relative path syntax can't be used outside working tree"
-msgstr ""
-"Die Syntax für relative Pfade kann nicht außerhalb des Arbeitsverzeichnisses "
-"benutzt werden."
-
-#: sha1-name.c:1922
-#, c-format
-msgid "invalid object name '%.*s'."
-msgstr "ungültiger Objektname '%.*s'."
-
 #. TRANSLATORS: IEC 80000-13:2008 gibibyte
 #: strbuf.c:848
 #, c-format
@@ -8346,7 +8600,7 @@
 msgstr[1] "%u Bytes/s"
 
 #: strbuf.c:1166 wrapper.c:199 wrapper.c:369 builtin/am.c:719
-#: builtin/rebase.c:864
+#: builtin/rebase.c:866
 #, c-format
 msgid "could not open '%s' for writing"
 msgstr "Konnte '%s' nicht zum Schreiben öffnen."
@@ -8412,12 +8666,12 @@
 msgid "Pathspec '%s' is in submodule '%.*s'"
 msgstr "Pfadspezifikation '%s' befindet sich in Submodul '%.*s'"
 
-#: submodule.c:434
+#: submodule.c:435
 #, c-format
 msgid "bad --ignore-submodules argument: %s"
 msgstr "ungültiges --ignore-submodules Argument: %s"
 
-#: submodule.c:816
+#: submodule.c:817
 #, c-format
 msgid ""
 "Submodule in commit %s at path: '%s' collides with a submodule named the "
@@ -8426,12 +8680,12 @@
 "Submodul in Commit %s beim Pfad: '%s' hat den gleichen Namen wie ein "
 "Submodul. Wird übersprungen."
 
-#: submodule.c:919
+#: submodule.c:920
 #, c-format
 msgid "submodule entry '%s' (%s) is a %s, not a commit"
 msgstr "Submodul-Eintrag '%s' (%s) ist ein %s, kein Commit."
 
-#: submodule.c:1004
+#: submodule.c:1005
 #, c-format
 msgid ""
 "Could not run 'git rev-list <commits> --not --remotes -n 1' command in "
@@ -8440,36 +8694,36 @@
 "Konnte 'git rev-list <Commits> --not --remotes -n 1' nicht in Submodul '%s' "
 "ausführen."
 
-#: submodule.c:1127
+#: submodule.c:1128
 #, c-format
 msgid "process for submodule '%s' failed"
 msgstr "Prozess für Submodul '%s' fehlgeschlagen"
 
-#: submodule.c:1156 builtin/branch.c:680 builtin/submodule--helper.c:2469
+#: submodule.c:1157 builtin/branch.c:689 builtin/submodule--helper.c:2469
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Konnte HEAD nicht als gültige Referenz auflösen."
 
-#: submodule.c:1167
+#: submodule.c:1168
 #, c-format
 msgid "Pushing submodule '%s'\n"
 msgstr "Pushe Submodul '%s'\n"
 
-#: submodule.c:1170
+#: submodule.c:1171
 #, c-format
 msgid "Unable to push submodule '%s'\n"
 msgstr "Kann Push für Submodul '%s' nicht ausführen\n"
 
-#: submodule.c:1462
+#: submodule.c:1463
 #, c-format
 msgid "Fetching submodule %s%s\n"
 msgstr "Anfordern des Submoduls %s%s\n"
 
-#: submodule.c:1492
+#: submodule.c:1497
 #, c-format
 msgid "Could not access submodule '%s'\n"
 msgstr "Konnte nicht auf Submodul '%s' zugreifen\n"
 
-#: submodule.c:1646
+#: submodule.c:1652
 #, c-format
 msgid ""
 "Errors during submodule fetch:\n"
@@ -8478,62 +8732,62 @@
 "Fehler während des Anforderns der Submodule:\n"
 "%s"
 
-#: submodule.c:1671
+#: submodule.c:1677
 #, c-format
 msgid "'%s' not recognized as a git repository"
 msgstr "'%s' nicht als Git-Repository erkannt"
 
-#: submodule.c:1688
+#: submodule.c:1694
 #, c-format
 msgid "Could not run 'git status --porcelain=2' in submodule %s"
 msgstr "Konnte 'git status --porcelain=2' nicht in Submodul %s ausführen"
 
-#: submodule.c:1729
+#: submodule.c:1735
 #, c-format
 msgid "'git status --porcelain=2' failed in submodule %s"
 msgstr "'git status --porcelain=2' ist in Submodul %s fehlgeschlagen"
 
-#: submodule.c:1804
+#: submodule.c:1810
 #, c-format
 msgid "could not start 'git status' in submodule '%s'"
 msgstr "Konnte 'git status' in Submodul '%s' nicht starten."
 
-#: submodule.c:1817
+#: submodule.c:1823
 #, c-format
 msgid "could not run 'git status' in submodule '%s'"
 msgstr "Konnte 'git status' in Submodul '%s' nicht ausführen."
 
-#: submodule.c:1832
+#: submodule.c:1838
 #, c-format
 msgid "Could not unset core.worktree setting in submodule '%s'"
 msgstr "Konnte core.worktree Einstellung in Submodul '%s' nicht aufheben."
 
-#: submodule.c:1859 submodule.c:2169
+#: submodule.c:1865 submodule.c:2175
 #, c-format
 msgid "could not recurse into submodule '%s'"
 msgstr "Fehler bei Rekursion in Submodul-Pfad '%s'"
 
-#: submodule.c:1880
+#: submodule.c:1886
 msgid "could not reset submodule index"
 msgstr "konnte Index des Submoduls nicht zurücksetzen"
 
-#: submodule.c:1922
+#: submodule.c:1928
 #, c-format
 msgid "submodule '%s' has dirty index"
 msgstr "Submodul '%s' hat einen geänderten Index."
 
-#: submodule.c:1974
+#: submodule.c:1980
 #, c-format
 msgid "Submodule '%s' could not be updated."
 msgstr "Submodule '%s' konnte nicht aktualisiert werden."
 
-#: submodule.c:2042
+#: submodule.c:2048
 #, c-format
 msgid "submodule git dir '%s' is inside git dir '%.*s'"
 msgstr ""
 "Git-Verzeichnis des Submoduls '%s' ist im Git-Verzeichnis '%.*s' enthalten."
 
-#: submodule.c:2063
+#: submodule.c:2069
 #, c-format
 msgid ""
 "relocate_gitdir for submodule '%s' with more than one worktree not supported"
@@ -8541,17 +8795,17 @@
 "relocate_gitdir für Submodul '%s' mit mehr als einem Arbeitsverzeichnis\n"
 "wird nicht unterstützt"
 
-#: submodule.c:2075 submodule.c:2134
+#: submodule.c:2081 submodule.c:2140
 #, c-format
 msgid "could not lookup name for submodule '%s'"
 msgstr "Konnte Name für Submodul '%s' nicht nachschlagen."
 
-#: submodule.c:2079
+#: submodule.c:2085
 #, c-format
 msgid "refusing to move '%s' into an existing git dir"
 msgstr "Verschieben von '%s' in ein existierendes Git-Verzeichnis verweigert."
 
-#: submodule.c:2086
+#: submodule.c:2092
 #, c-format
 msgid ""
 "Migrating git directory of '%s%s' from\n"
@@ -8562,11 +8816,11 @@
 "'%s' nach\n"
 "'%s'\n"
 
-#: submodule.c:2214
+#: submodule.c:2220
 msgid "could not start ls-files in .."
 msgstr "Konnte 'ls-files' nicht in .. starten"
 
-#: submodule.c:2254
+#: submodule.c:2260
 #, c-format
 msgid "ls-tree returned unexpected return code %d"
 msgstr "ls-tree mit unerwartetem Rückgabewert %d beendet"
@@ -8597,7 +8851,7 @@
 msgid "could not read input file '%s'"
 msgstr "Konnte Eingabe-Datei '%s' nicht lesen"
 
-#: trailer.c:751
+#: trailer.c:751 builtin/mktag.c:91
 msgid "could not read from stdin"
 msgstr "konnte nicht von der Standard-Eingabe lesen"
 
@@ -8671,7 +8925,7 @@
 msgid "error while running fast-import"
 msgstr "Fehler beim Ausführen von 'fast-import'."
 
-#: transport-helper.c:549 transport-helper.c:1236
+#: transport-helper.c:549 transport-helper.c:1237
 #, c-format
 msgid "could not read ref %s"
 msgstr "konnte Referenz %s nicht lesen"
@@ -8690,7 +8944,7 @@
 msgid "invalid remote service path"
 msgstr "ungültiger Remote-Service Pfad."
 
-#: transport-helper.c:661 transport.c:1446
+#: transport-helper.c:661 transport.c:1447
 msgid "operation not supported by protocol"
 msgstr "die Operation wird von dem Protokoll nicht unterstützt"
 
@@ -8769,52 +9023,52 @@
 "Keine gemeinsamen Referenzen und nichts spezifiziert; keine Ausführung.\n"
 "Vielleicht sollten Sie einen Branch angeben.\n"
 
-#: transport-helper.c:1213
+#: transport-helper.c:1214
 #, c-format
 msgid "unsupported object format '%s'"
 msgstr "nicht unterstütztes Objekt-Format '%s'"
 
-#: transport-helper.c:1222
+#: transport-helper.c:1223
 #, c-format
 msgid "malformed response in ref list: %s"
 msgstr "Ungültige Antwort in Referenzliste: %s"
 
-#: transport-helper.c:1374
+#: transport-helper.c:1375
 #, c-format
 msgid "read(%s) failed"
 msgstr "Lesen von %s fehlgeschlagen."
 
-#: transport-helper.c:1401
+#: transport-helper.c:1402
 #, c-format
 msgid "write(%s) failed"
 msgstr "Schreiben von %s fehlgeschlagen."
 
-#: transport-helper.c:1450
+#: transport-helper.c:1451
 #, c-format
 msgid "%s thread failed"
 msgstr "Thread %s fehlgeschlagen."
 
-#: transport-helper.c:1454
+#: transport-helper.c:1455
 #, c-format
 msgid "%s thread failed to join: %s"
 msgstr "Fehler beim Beitreten zu Thread %s: %s"
 
-#: transport-helper.c:1473 transport-helper.c:1477
+#: transport-helper.c:1474 transport-helper.c:1478
 #, c-format
 msgid "can't start thread for copying data: %s"
 msgstr "Kann Thread zum Kopieren von Daten nicht starten: %s"
 
-#: transport-helper.c:1514
+#: transport-helper.c:1515
 #, c-format
 msgid "%s process failed to wait"
 msgstr "Fehler beim Warten von Prozess %s."
 
-#: transport-helper.c:1518
+#: transport-helper.c:1519
 #, c-format
 msgid "%s process failed"
 msgstr "Prozess %s fehlgeschlagen"
 
-#: transport-helper.c:1536 transport-helper.c:1545
+#: transport-helper.c:1537 transport-helper.c:1546
 msgid "can't start thread for copying data"
 msgstr "Kann Thread zum Kopieren von Daten nicht starten."
 
@@ -8903,23 +9157,23 @@
 msgid "Aborting."
 msgstr "Abbruch."
 
-#: transport.c:1315
+#: transport.c:1316
 msgid "failed to push all needed submodules"
 msgstr "Fehler beim Versand aller erforderlichen Submodule."
 
-#: tree-walk.c:32
+#: tree-walk.c:33
 msgid "too-short tree object"
 msgstr "zu kurzes Tree-Objekt"
 
-#: tree-walk.c:38
+#: tree-walk.c:39
 msgid "malformed mode in tree entry"
 msgstr "fehlerhafter Modus in Tree-Eintrag"
 
-#: tree-walk.c:42
+#: tree-walk.c:43
 msgid "empty filename in tree entry"
 msgstr "leerer Dateiname in Tree-Eintrag"
 
-#: tree-walk.c:117
+#: tree-walk.c:118
 msgid "too-short tree file"
 msgstr "zu kurze Tree-Datei"
 
@@ -9197,7 +9451,7 @@
 msgid "Updating index flags"
 msgstr "Aktualisiere Index-Markierungen"
 
-#: upload-pack.c:1550
+#: upload-pack.c:1543
 msgid "expected flush after fetch arguments"
 msgstr "erwartete Flush nach Abrufen der Argumente"
 
@@ -9234,72 +9488,103 @@
 msgid "Fetching objects"
 msgstr "Anfordern der Objekte"
 
-#: worktree.c:236 builtin/am.c:2103
+#: worktree.c:238 builtin/am.c:2103
 #, c-format
 msgid "failed to read '%s'"
 msgstr "Fehler beim Lesen von '%s'"
 
-#: worktree.c:283
+#: worktree.c:304
 #, c-format
 msgid "'%s' at main working tree is not the repository directory"
 msgstr "'%s' im Hauptarbeitsverzeichnis ist nicht das Repository-Verzeichnis."
 
-#: worktree.c:294
+#: worktree.c:315
 #, c-format
 msgid "'%s' file does not contain absolute path to the working tree location"
 msgstr "'%s' Datei enthält nicht den absoluten Pfad zum Arbeitsverzeichnis."
 
-#: worktree.c:306
+#: worktree.c:327
 #, c-format
 msgid "'%s' does not exist"
 msgstr "'%s' existiert nicht."
 
-#: worktree.c:312
+#: worktree.c:333
 #, c-format
 msgid "'%s' is not a .git file, error code %d"
 msgstr "'%s' ist keine .git-Datei, Fehlercode %d"
 
-#: worktree.c:321
+#: worktree.c:342
 #, c-format
 msgid "'%s' does not point back to '%s'"
 msgstr "'%s' zeigt nicht zurück auf '%s'"
 
-#: worktree.c:587
+#: worktree.c:608
 msgid "not a directory"
 msgstr "kein Verzeichnis"
 
-#: worktree.c:596
+#: worktree.c:617
 msgid ".git is not a file"
 msgstr ".git ist keine Datei"
 
-#: worktree.c:598
+#: worktree.c:619
 msgid ".git file broken"
 msgstr ".git-Datei kaputt"
 
-#: worktree.c:600
+#: worktree.c:621
 msgid ".git file incorrect"
 msgstr ".git-Datei fehlerhaft"
 
-#: worktree.c:670
+#: worktree.c:727
 msgid "not a valid path"
 msgstr "kein gültiger Pfad"
 
-#: worktree.c:676
+#: worktree.c:733
 msgid "unable to locate repository; .git is not a file"
 msgstr "Konnte Repository nicht finden; .git ist keine Datei"
 
-#: worktree.c:679
+#: worktree.c:737
+msgid "unable to locate repository; .git file does not reference a repository"
+msgstr ""
+"konnte Repository nicht finden; .git-Datei referenziert kein Repository"
+
+#: worktree.c:741
 msgid "unable to locate repository; .git file broken"
 msgstr "Konnte Repository nicht finden; .git-Datei ist kaputt"
 
-#: worktree.c:685
+#: worktree.c:747
 msgid "gitdir unreadable"
 msgstr "gitdir nicht lesbar"
 
-#: worktree.c:689
+#: worktree.c:751
 msgid "gitdir incorrect"
 msgstr "gitdir fehlerhaft"
 
+#: worktree.c:776
+msgid "not a valid directory"
+msgstr "kein gültiges Verzeichnis"
+
+#: worktree.c:782
+msgid "gitdir file does not exist"
+msgstr "gitdir-Datei existiert nicht"
+
+#: worktree.c:787 worktree.c:796
+#, c-format
+msgid "unable to read gitdir file (%s)"
+msgstr "konnte gitdir-Datei nicht lesen (%s)"
+
+#: worktree.c:806
+#, c-format
+msgid "short read (expected %<PRIuMAX> bytes, read %<PRIuMAX>)"
+msgstr "read() zu kurz (%<PRIuMAX> Bytes erwartet, %<PRIuMAX> gelesen)"
+
+#: worktree.c:814
+msgid "invalid gitdir file"
+msgstr "ungültige gitdir-Datei"
+
+#: worktree.c:822
+msgid "gitdir file points to non-existent location"
+msgstr "gitdir-Datei verweist auf nicht existierenden Ort"
+
 #: wrapper.c:197 wrapper.c:367
 #, c-format
 msgid "could not open '%s' for reading and writing"
@@ -9353,11 +9638,11 @@
 msgstr ""
 "  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)"
 
-#: wt-status.c:211 wt-status.c:1070
+#: wt-status.c:211 wt-status.c:1072
 msgid "Changes to be committed:"
 msgstr "Zum Commit vorgemerkte Änderungen:"
 
-#: wt-status.c:234 wt-status.c:1079
+#: wt-status.c:234 wt-status.c:1081
 msgid "Changes not staged for commit:"
 msgstr "Änderungen, die nicht zum Commit vorgemerkt sind:"
 
@@ -9465,22 +9750,22 @@
 msgid "untracked content, "
 msgstr "unversionierter Inhalt, "
 
-#: wt-status.c:903
+#: wt-status.c:905
 #, c-format
 msgid "Your stash currently has %d entry"
 msgid_plural "Your stash currently has %d entries"
 msgstr[0] "Ihr Stash hat gerade %d Eintrag"
 msgstr[1] "Ihr Stash hat gerade %d Einträge"
 
-#: wt-status.c:934
+#: wt-status.c:936
 msgid "Submodules changed but not updated:"
 msgstr "Submodule geändert, aber nicht aktualisiert:"
 
-#: wt-status.c:936
+#: wt-status.c:938
 msgid "Submodule changes to be committed:"
 msgstr "Änderungen in Submodul zum Committen:"
 
-#: wt-status.c:1018
+#: wt-status.c:1020
 msgid ""
 "Do not modify or remove the line above.\n"
 "Everything below it will be ignored."
@@ -9488,7 +9773,7 @@
 "Ändern oder entfernen Sie nicht die obige Zeile.\n"
 "Alles unterhalb von ihr wird ignoriert."
 
-#: wt-status.c:1110
+#: wt-status.c:1112
 #, c-format
 msgid ""
 "\n"
@@ -9500,114 +9785,114 @@
 "berechnen.\n"
 "Sie können '--no-ahead-behind' benutzen, um das zu verhindern.\n"
 
-#: wt-status.c:1140
+#: wt-status.c:1142
 msgid "You have unmerged paths."
 msgstr "Sie haben nicht zusammengeführte Pfade."
 
-#: wt-status.c:1143
+#: wt-status.c:1145
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (beheben Sie die Konflikte und führen Sie \"git commit\" aus)"
 
-#: wt-status.c:1145
+#: wt-status.c:1147
 msgid "  (use \"git merge --abort\" to abort the merge)"
 msgstr "  (benutzen Sie \"git merge --abort\", um den Merge abzubrechen)"
 
-#: wt-status.c:1149
+#: wt-status.c:1151
 msgid "All conflicts fixed but you are still merging."
 msgstr "Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge."
 
-#: wt-status.c:1152
+#: wt-status.c:1154
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (benutzen Sie \"git commit\", um den Merge abzuschließen)"
 
-#: wt-status.c:1161
+#: wt-status.c:1163
 msgid "You are in the middle of an am session."
 msgstr "Eine \"am\"-Sitzung ist im Gange."
 
-#: wt-status.c:1164
+#: wt-status.c:1166
 msgid "The current patch is empty."
 msgstr "Der aktuelle Patch ist leer."
 
-#: wt-status.c:1168
+#: wt-status.c:1170
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr ""
 "  (beheben Sie die Konflikte und führen Sie dann \"git am --continue\" aus)"
 
-#: wt-status.c:1170
+#: wt-status.c:1172
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (benutzen Sie \"git am --skip\", um diesen Patch auszulassen)"
 
-#: wt-status.c:1172
+#: wt-status.c:1174
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
 "  (benutzen Sie \"git am --abort\", um den ursprünglichen Branch "
 "wiederherzustellen)"
 
-#: wt-status.c:1305
+#: wt-status.c:1307
 msgid "git-rebase-todo is missing."
 msgstr "git-rebase-todo fehlt."
 
-#: wt-status.c:1307
+#: wt-status.c:1309
 msgid "No commands done."
 msgstr "Keine Befehle ausgeführt."
 
-#: wt-status.c:1310
+#: wt-status.c:1312
 #, 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):"
 
-#: wt-status.c:1321
+#: wt-status.c:1323
 #, c-format
 msgid "  (see more in file %s)"
 msgstr "  (mehr Informationen in Datei %s)"
 
-#: wt-status.c:1326
+#: wt-status.c:1328
 msgid "No commands remaining."
 msgstr "Keine Befehle verbleibend."
 
-#: wt-status.c:1329
+#: wt-status.c:1331
 #, 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:1337
+#: wt-status.c:1339
 msgid "  (use \"git rebase --edit-todo\" to view and edit)"
 msgstr "  (benutzen Sie \"git rebase --edit-todo\" zum Ansehen und Bearbeiten)"
 
-#: wt-status.c:1349
+#: wt-status.c:1351
 #, c-format
 msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr "Sie sind gerade beim Rebase von Branch '%s' auf '%s'."
 
-#: wt-status.c:1354
+#: wt-status.c:1356
 msgid "You are currently rebasing."
 msgstr "Sie sind gerade beim Rebase."
 
-#: wt-status.c:1367
+#: wt-status.c:1369
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr ""
 "  (beheben Sie die Konflikte und führen Sie dann \"git rebase --continue\" "
 "aus)"
 
-#: wt-status.c:1369
+#: wt-status.c:1371
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr "  (benutzen Sie \"git rebase --skip\", um diesen Patch auszulassen)"
 
-#: wt-status.c:1371
+#: wt-status.c:1373
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
 "  (benutzen Sie \"git rebase --abort\", um den ursprünglichen Branch "
 "auszuchecken)"
 
-#: wt-status.c:1378
+#: wt-status.c:1380
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr "  (alle Konflikte behoben: führen Sie \"git rebase --continue\" aus)"
 
-#: wt-status.c:1382
+#: wt-status.c:1384
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -9615,162 +9900,170 @@
 "Sie teilen gerade einen Commit auf, während ein Rebase von Branch '%s' auf "
 "'%s' im Gange ist."
 
-#: wt-status.c:1387
+#: wt-status.c:1389
 msgid "You are currently splitting a commit during a rebase."
 msgstr "Sie teilen gerade einen Commit während eines Rebase auf."
 
-#: wt-status.c:1390
+#: wt-status.c:1392
 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)"
 
-#: wt-status.c:1394
+#: wt-status.c:1396
 #, 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'."
 
-#: wt-status.c:1399
+#: wt-status.c:1401
 msgid "You are currently editing a commit during a rebase."
 msgstr "Sie editieren gerade einen Commit während eines Rebase."
 
-#: wt-status.c:1402
+#: wt-status.c:1404
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr ""
 "  (benutzen Sie \"git commit --amend\", um den aktuellen Commit "
 "nachzubessern)"
 
-#: wt-status.c:1404
+#: wt-status.c:1406
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
 "  (benutzen Sie \"git rebase --continue\" sobald Ihre Änderungen "
 "abgeschlossen sind)"
 
-#: wt-status.c:1415
+#: wt-status.c:1417
 msgid "Cherry-pick currently in progress."
 msgstr "Cherry-pick zurzeit im Gange."
 
-#: wt-status.c:1418
+#: wt-status.c:1420
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr "Sie führen gerade \"cherry-pick\" von Commit %s aus."
 
-#: wt-status.c:1425
+#: wt-status.c:1427
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr ""
 "  (beheben Sie die Konflikte und führen Sie dann \"git cherry-pick --continue"
 "\" aus)"
 
-#: wt-status.c:1428
+#: wt-status.c:1430
 msgid "  (run \"git cherry-pick --continue\" to continue)"
 msgstr "  (Führen Sie \"git cherry-pick --continue\" aus, um weiterzumachen)"
 
-#: wt-status.c:1431
+#: wt-status.c:1433
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
 "  (alle Konflikte behoben: führen Sie \"git cherry-pick --continue\" aus)"
 
-#: wt-status.c:1433
+#: wt-status.c:1435
 msgid "  (use \"git cherry-pick --skip\" to skip this patch)"
 msgstr ""
 "  (benutzen Sie \"git cherry-pick --skip\", um diesen Patch auszulassen)"
 
-#: wt-status.c:1435
+#: wt-status.c:1437
 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:1445
+#: wt-status.c:1447
 msgid "Revert currently in progress."
 msgstr "Revert zurzeit im Gange."
 
-#: wt-status.c:1448
+#: wt-status.c:1450
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr "Sie sind gerade beim Revert von Commit '%s'."
 
-#: wt-status.c:1454
+#: wt-status.c:1456
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr ""
 "  (beheben Sie die Konflikte und führen Sie dann \"git revert --continue\" "
 "aus)"
 
-#: wt-status.c:1457
+#: wt-status.c:1459
 msgid "  (run \"git revert --continue\" to continue)"
 msgstr "  (Führen Sie \"git revert --continue\", um weiterzumachen)"
 
-#: wt-status.c:1460
+#: wt-status.c:1462
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr "  (alle Konflikte behoben: führen Sie \"git revert --continue\" aus)"
 
-#: wt-status.c:1462
+#: wt-status.c:1464
 msgid "  (use \"git revert --skip\" to skip this patch)"
 msgstr "  (benutzen Sie \"git revert --skip\", um diesen Patch auszulassen)"
 
-#: wt-status.c:1464
+#: wt-status.c:1466
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
 "  (benutzen Sie \"git revert --abort\", um die Revert-Operation abzubrechen)"
 
-#: wt-status.c:1474
+#: wt-status.c:1476
 #, 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:1478
+#: wt-status.c:1480
 msgid "You are currently bisecting."
 msgstr "Sie sind gerade bei einer binären Suche."
 
-#: wt-status.c:1481
+#: wt-status.c:1483
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
 "  (benutzen Sie \"git bisect reset\", um zum ursprünglichen Branch "
 "zurückzukehren)"
 
-#: wt-status.c:1492
+#: wt-status.c:1494
 #, c-format
 msgid "You are in a sparse checkout with %d%% of tracked files present."
 msgstr ""
 "Sie sind in einem partiellen Checkout mit %d%% vorhandenen versionierten "
 "Dateien."
 
-#: wt-status.c:1731
+#: wt-status.c:1733
 msgid "On branch "
 msgstr "Auf Branch "
 
-#: wt-status.c:1738
+#: wt-status.c:1740
 msgid "interactive rebase in progress; onto "
 msgstr "interaktives Rebase im Gange; auf "
 
-#: wt-status.c:1740
+#: wt-status.c:1742
 msgid "rebase in progress; onto "
 msgstr "Rebase im Gange; auf "
 
-#: wt-status.c:1750
+#: wt-status.c:1747
+msgid "HEAD detached at "
+msgstr "HEAD losgelöst bei "
+
+#: wt-status.c:1749
+msgid "HEAD detached from "
+msgstr "HEAD losgelöst von "
+
+#: wt-status.c:1752
 msgid "Not currently on any branch."
 msgstr "Im Moment auf keinem Branch."
 
-#: wt-status.c:1767
+#: wt-status.c:1769
 msgid "Initial commit"
 msgstr "Initialer Commit"
 
-#: wt-status.c:1768
+#: wt-status.c:1770
 msgid "No commits yet"
 msgstr "Noch keine Commits"
 
-#: wt-status.c:1782
+#: wt-status.c:1784
 msgid "Untracked files"
 msgstr "Unversionierte Dateien"
 
-#: wt-status.c:1784
+#: wt-status.c:1786
 msgid "Ignored files"
 msgstr "Ignorierte Dateien"
 
-#: wt-status.c:1788
+#: wt-status.c:1790
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -9781,32 +10074,32 @@
 "'status -uno' könnte das beschleunigen, aber Sie müssen darauf achten,\n"
 "neue Dateien selbstständig hinzuzufügen (siehe 'git help status')."
 
-#: wt-status.c:1794
+#: wt-status.c:1796
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "Unversionierte Dateien nicht aufgelistet%s"
 
-#: wt-status.c:1796
+#: wt-status.c:1798
 msgid " (use -u option to show untracked files)"
 msgstr " (benutzen Sie die Option -u, um unversionierte Dateien anzuzeigen)"
 
-#: wt-status.c:1802
+#: wt-status.c:1804
 msgid "No changes"
 msgstr "Keine Änderungen"
 
-#: wt-status.c:1807
+#: wt-status.c:1809
 #, 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"
 
-#: wt-status.c:1811
+#: wt-status.c:1813
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "keine Änderungen zum Commit vorgemerkt\n"
 
-#: wt-status.c:1815
+#: wt-status.c:1817
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -9815,67 +10108,67 @@
 "nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien\n"
 "(benutzen Sie \"git add\" zum Versionieren)\n"
 
-#: wt-status.c:1819
+#: wt-status.c:1821
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr "nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien\n"
 
-#: wt-status.c:1823
+#: wt-status.c:1825
 #, 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\n"
 "Sie \"git add\" zum Versionieren)\n"
 
-#: wt-status.c:1827 wt-status.c:1833
+#: wt-status.c:1829 wt-status.c:1835
 #, c-format
 msgid "nothing to commit\n"
 msgstr "nichts zu committen\n"
 
-#: wt-status.c:1830
+#: wt-status.c:1832
 #, 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"
 
-#: wt-status.c:1835
+#: wt-status.c:1837
 #, c-format
 msgid "nothing to commit, working tree clean\n"
 msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n"
 
-#: wt-status.c:1940
+#: wt-status.c:1942
 msgid "No commits yet on "
 msgstr "Noch keine Commits in "
 
-#: wt-status.c:1944
+#: wt-status.c:1946
 msgid "HEAD (no branch)"
 msgstr "HEAD (kein Branch)"
 
-#: wt-status.c:1975
+#: wt-status.c:1977
 msgid "different"
 msgstr "unterschiedlich"
 
-#: wt-status.c:1977 wt-status.c:1985
+#: wt-status.c:1979 wt-status.c:1987
 msgid "behind "
 msgstr "hinterher "
 
-#: wt-status.c:1980 wt-status.c:1983
+#: wt-status.c:1982 wt-status.c:1985
 msgid "ahead "
 msgstr "voraus "
 
 #. TRANSLATORS: the action is e.g. "pull with rebase"
-#: wt-status.c:2505
+#: wt-status.c:2507
 #, c-format
 msgid "cannot %s: You have unstaged changes."
 msgstr ""
 "%s nicht möglich: Sie haben Änderungen, die nicht zum Commit vorgemerkt sind."
 
-#: wt-status.c:2511
+#: wt-status.c:2513
 msgid "additionally, your index contains uncommitted changes."
 msgstr "Zusätzlich enthält die Staging-Area nicht committete Änderungen."
 
-#: wt-status.c:2513
+#: wt-status.c:2515
 #, c-format
 msgid "cannot %s: Your index contains uncommitted changes."
 msgstr ""
@@ -9890,134 +10183,139 @@
 msgid "git add [<options>] [--] <pathspec>..."
 msgstr "git add [<Optionen>] [--] <Pfadspezifikation>..."
 
-#: builtin/add.c:88
+#: builtin/add.c:58
+#, c-format
+msgid "cannot chmod %cx '%s'"
+msgstr "kann chmod %cx '%s' nicht ausführen"
+
+#: builtin/add.c:96
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "unerwarteter Differenz-Status %c"
 
-#: builtin/add.c:93 builtin/commit.c:285
+#: builtin/add.c:101 builtin/commit.c:285
 msgid "updating files failed"
 msgstr "Aktualisierung der Dateien fehlgeschlagen"
 
-#: builtin/add.c:103
+#: builtin/add.c:111
 #, c-format
 msgid "remove '%s'\n"
 msgstr "lösche '%s'\n"
 
-#: builtin/add.c:178
+#: builtin/add.c:186
 msgid "Unstaged changes after refreshing the index:"
 msgstr ""
 "Nicht zum Commit vorgemerkte Änderungen nach Aktualisierung der Staging-Area:"
 
-#: builtin/add.c:272 builtin/rev-parse.c:908
+#: builtin/add.c:280 builtin/rev-parse.c:991
 msgid "Could not read the index"
 msgstr "Konnte den Index nicht lesen"
 
-#: builtin/add.c:283
+#: builtin/add.c:291
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: builtin/add.c:287
+#: builtin/add.c:295
 msgid "Could not write patch"
 msgstr "Konnte Patch nicht schreiben"
 
-#: builtin/add.c:290
+#: builtin/add.c:298
 msgid "editing patch failed"
 msgstr "Bearbeitung des Patches fehlgeschlagen"
 
-#: builtin/add.c:293
+#: builtin/add.c:301
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht lesen"
 
-#: builtin/add.c:295
+#: builtin/add.c:303
 msgid "Empty patch. Aborted."
 msgstr "Leerer Patch. Abgebrochen."
 
-#: builtin/add.c:300
+#: builtin/add.c:308
 #, c-format
 msgid "Could not apply '%s'"
 msgstr "Konnte '%s' nicht anwenden."
 
-#: builtin/add.c:308
+#: builtin/add.c:316
 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/add.c:328 builtin/clean.c:904 builtin/fetch.c:166 builtin/mv.c:124
+#: builtin/add.c:336 builtin/clean.c:904 builtin/fetch.c:169 builtin/mv.c:124
 #: builtin/prune-packed.c:14 builtin/pull.c:204 builtin/push.c:559
 #: builtin/remote.c:1427 builtin/rm.c:242 builtin/send-pack.c:190
 msgid "dry run"
 msgstr "Probelauf"
 
-#: builtin/add.c:331
+#: builtin/add.c:339
 msgid "interactive picking"
 msgstr "interaktives Auswählen"
 
-#: builtin/add.c:332 builtin/checkout.c:1547 builtin/reset.c:308
+#: builtin/add.c:340 builtin/checkout.c:1546 builtin/reset.c:308
 msgid "select hunks interactively"
 msgstr "Blöcke interaktiv auswählen"
 
-#: builtin/add.c:333
+#: builtin/add.c:341
 msgid "edit current diff and apply"
 msgstr "aktuelle Unterschiede editieren und anwenden"
 
-#: builtin/add.c:334
+#: builtin/add.c:342
 msgid "allow adding otherwise ignored files"
 msgstr "das Hinzufügen andernfalls ignorierter Dateien erlauben"
 
-#: builtin/add.c:335
+#: builtin/add.c:343
 msgid "update tracked files"
 msgstr "versionierte Dateien aktualisieren"
 
-#: builtin/add.c:336
+#: builtin/add.c:344
 msgid "renormalize EOL of tracked files (implies -u)"
 msgstr ""
 "erneutes Normalisieren der Zeilenenden von versionierten Dateien (impliziert "
 "-u)"
 
-#: builtin/add.c:337
+#: builtin/add.c:345
 msgid "record only the fact that the path will be added later"
 msgstr "nur speichern, dass der Pfad später hinzugefügt werden soll"
 
-#: builtin/add.c:338
+#: builtin/add.c:346
 msgid "add changes from all tracked and untracked files"
 msgstr ""
 "Änderungen von allen versionierten und unversionierten Dateien hinzufügen"
 
-#: builtin/add.c:341
+#: builtin/add.c:349
 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:343
+#: builtin/add.c:351
 msgid "don't add, only refresh the index"
 msgstr "nichts hinzufügen, nur den Index aktualisieren"
 
-#: builtin/add.c:344
+#: builtin/add.c:352
 msgid "just skip files which cannot be added because of errors"
 msgstr ""
 "Dateien überspringen, die aufgrund von Fehlern nicht hinzugefügt werden "
 "konnten"
 
-#: builtin/add.c:345
+#: builtin/add.c:353
 msgid "check if - even missing - files are ignored in dry run"
 msgstr "prüfen ob - auch fehlende - Dateien im Probelauf ignoriert werden"
 
-#: builtin/add.c:347 builtin/update-index.c:1004
+#: builtin/add.c:355 builtin/update-index.c:1004
 msgid "override the executable bit of the listed files"
 msgstr "das \"ausführbar\"-Bit der aufgelisteten Dateien überschreiben"
 
-#: builtin/add.c:349
+#: builtin/add.c:357
 msgid "warn when adding an embedded repository"
 msgstr "warnen wenn eingebettetes Repository hinzugefügt wird"
 
-#: builtin/add.c:351
+#: builtin/add.c:359
 msgid "backend for `git stash -p`"
 msgstr "Backend für `git stash -p`"
 
-#: builtin/add.c:369
+#: builtin/add.c:377
 #, c-format
 msgid ""
 "You've added another git repository inside your current repository.\n"
@@ -10051,12 +10349,12 @@
 "\n"
 "Siehe \"git help submodule\" für weitere Informationen."
 
-#: builtin/add.c:397
+#: builtin/add.c:405
 #, c-format
 msgid "adding embedded git repository: %s"
 msgstr "Füge eingebettetes Repository hinzu: %s"
 
-#: builtin/add.c:416
+#: builtin/add.c:424
 msgid ""
 "Use -f if you really want to add them.\n"
 "Turn this message off by running\n"
@@ -10066,52 +10364,48 @@
 "Um diese Meldung abzuschalten, führen Sie folgenden Befehl aus:\n"
 "\"git config advice.addIgnoredFile false\""
 
-#: builtin/add.c:425
+#: builtin/add.c:433
 msgid "adding files failed"
 msgstr "Hinzufügen von Dateien fehlgeschlagen"
 
-#: builtin/add.c:453 builtin/commit.c:345
+#: builtin/add.c:461 builtin/commit.c:345
 msgid "--pathspec-from-file is incompatible with --interactive/--patch"
-msgstr ""
-"Die Optionen --pathspec-from-file und --interactive/--patch sind "
-"inkompatibel."
+msgstr "--pathspec-from-file und --interactive/--patch sind inkompatibel"
 
-#: builtin/add.c:470
+#: builtin/add.c:478
 msgid "--pathspec-from-file is incompatible with --edit"
-msgstr "Die Optionen --pathspec-from-file und --edit sind inkompatibel."
+msgstr "--pathspec-from-file und --edit sind inkompatibel"
 
-#: builtin/add.c:482
+#: builtin/add.c:490
 msgid "-A and -u are mutually incompatible"
-msgstr "Die Optionen -A und -u sind zueinander inkompatibel."
+msgstr "-A und -u sind zueinander inkompatibel"
 
-#: builtin/add.c:485
+#: builtin/add.c:493
 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."
+"Die Option --ignore-missing kann nur zusammen mit --dry-run verwendet werden"
 
-#: builtin/add.c:489
+#: builtin/add.c:497
 #, c-format
 msgid "--chmod param '%s' must be either -x or +x"
 msgstr "--chmod Parameter '%s' muss entweder -x oder +x sein"
 
-#: builtin/add.c:507 builtin/checkout.c:1715 builtin/commit.c:351
-#: builtin/reset.c:328 builtin/rm.c:272 builtin/stash.c:1502
+#: builtin/add.c:515 builtin/checkout.c:1714 builtin/commit.c:351
+#: builtin/reset.c:328 builtin/rm.c:272 builtin/stash.c:1569
 msgid "--pathspec-from-file is incompatible with pathspec arguments"
-msgstr ""
-"Die Option --pathspec-from-file ist inkompatibel mit\n"
-"Pfadspezifikation-Argumenten."
+msgstr "--pathspec-from-file ist inkompatibel mit Pfadspezifikation-Argumenten"
 
-#: builtin/add.c:514 builtin/checkout.c:1727 builtin/commit.c:357
-#: builtin/reset.c:334 builtin/rm.c:278 builtin/stash.c:1508
+#: builtin/add.c:522 builtin/checkout.c:1726 builtin/commit.c:357
+#: builtin/reset.c:334 builtin/rm.c:278 builtin/stash.c:1575
 msgid "--pathspec-file-nul requires --pathspec-from-file"
-msgstr "Die Option --pathspec-file-nul benötigt --pathspec-from-file"
+msgstr "--pathspec-file-nul benötigt --pathspec-from-file"
 
-#: builtin/add.c:518
+#: builtin/add.c:526
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Nichts spezifiziert, nichts hinzugefügt.\n"
 
-#: builtin/add.c:520
+#: builtin/add.c:528
 msgid ""
 "Maybe you wanted to say 'git add .'?\n"
 "Turn this message off by running\n"
@@ -10375,7 +10669,7 @@
 msgstr "erlaube, falls notwendig, das Zurückfallen auf einen 3-Wege-Merge"
 
 #: builtin/am.c:2225 builtin/init-db.c:560 builtin/prune-packed.c:16
-#: builtin/repack.c:335 builtin/stash.c:815
+#: builtin/repack.c:334 builtin/stash.c:882
 msgid "be quiet"
 msgstr "weniger Ausgaben"
 
@@ -10418,17 +10712,17 @@
 msgstr "an git-apply übergeben"
 
 #: builtin/am.c:2263 builtin/commit.c:1395 builtin/fmt-merge-msg.c:17
-#: builtin/fmt-merge-msg.c:20 builtin/grep.c:903 builtin/merge.c:260
+#: builtin/fmt-merge-msg.c:20 builtin/grep.c:904 builtin/merge.c:261
 #: builtin/pull.c:141 builtin/pull.c:200 builtin/pull.c:217
-#: builtin/rebase.c:1341 builtin/repack.c:346 builtin/repack.c:350
-#: builtin/repack.c:352 builtin/show-branch.c:650 builtin/show-ref.c:172
-#: builtin/tag.c:404 parse-options.h:154 parse-options.h:175
+#: builtin/rebase.c:1347 builtin/repack.c:345 builtin/repack.c:349
+#: builtin/repack.c:351 builtin/show-branch.c:650 builtin/show-ref.c:172
+#: builtin/tag.c:436 parse-options.h:154 parse-options.h:175
 #: parse-options.h:316
 msgid "n"
 msgstr "Anzahl"
 
-#: builtin/am.c:2269 builtin/branch.c:661 builtin/bugreport.c:136
-#: builtin/for-each-ref.c:38 builtin/replace.c:556 builtin/tag.c:438
+#: builtin/am.c:2269 builtin/branch.c:670 builtin/bugreport.c:136
+#: builtin/for-each-ref.c:38 builtin/replace.c:556 builtin/tag.c:470
 #: builtin/verify-tag.c:38
 msgid "format"
 msgstr "Format"
@@ -10454,12 +10748,12 @@
 msgstr "den aktuellen Patch auslassen"
 
 #: builtin/am.c:2287
-msgid "restore the original branch and abort the patching operation."
+msgid "restore the original branch and abort the patching operation"
 msgstr ""
 "ursprünglichen Branch wiederherstellen und Anwendung der Patches abbrechen"
 
 #: builtin/am.c:2290
-msgid "abort the patching operation but keep HEAD where it is."
+msgid "abort the patching operation but keep HEAD where it is"
 msgstr "Patch-Operation abbrechen, aber HEAD an aktueller Stelle belassen"
 
 #: builtin/am.c:2294
@@ -10475,12 +10769,12 @@
 msgstr "aktuellen Zeitstempel als Autor-Datum verwenden"
 
 #: builtin/am.c:2303 builtin/commit-tree.c:120 builtin/commit.c:1515
-#: builtin/merge.c:297 builtin/pull.c:175 builtin/rebase.c:536
-#: builtin/rebase.c:1394 builtin/revert.c:117 builtin/tag.c:419
+#: builtin/merge.c:298 builtin/pull.c:175 builtin/rebase.c:538
+#: builtin/rebase.c:1400 builtin/revert.c:117 builtin/tag.c:451
 msgid "key-id"
 msgstr "GPG-Schlüsselkennung"
 
-#: builtin/am.c:2304 builtin/rebase.c:537 builtin/rebase.c:1395
+#: builtin/am.c:2304 builtin/rebase.c:539 builtin/rebase.c:1401
 msgid "GPG-sign commits"
 msgstr "Commits mit GPG signieren"
 
@@ -10561,28 +10855,12 @@
 msgstr "git bisect--helper --bisect-reset [<Commit>]"
 
 #: builtin/bisect--helper.c:24
-msgid ""
-"git bisect--helper --bisect-write [--no-log] <state> <revision> <good_term> "
-"<bad_term>"
-msgstr ""
-"git bisect--helper --bisect-write [--no-log] <Zustand> <Revision> "
-"<Begriff_gut> <Begriff_schlecht>"
-
-#: builtin/bisect--helper.c:25
-msgid ""
-"git bisect--helper --bisect-check-and-set-terms <command> <good_term> "
-"<bad_term>"
-msgstr ""
-"git bisect--helper --bisect-check-and-set-terms <Befehl> <Begriff_gut> "
-"<Begriff_schlecht>"
-
-#: builtin/bisect--helper.c:26
 msgid "git bisect--helper --bisect-next-check <good_term> <bad_term> [<term>]"
 msgstr ""
 "git bisect--helper --bisect-next-check <Begriff_gut> <Begriff_schlecht> "
 "[<Begriff>]"
 
-#: builtin/bisect--helper.c:27
+#: builtin/bisect--helper.c:25
 msgid ""
 "git bisect--helper --bisect-terms [--term-good | --term-old | --term-bad | --"
 "term-new]"
@@ -10590,7 +10868,7 @@
 "git bisect--helper --bisect-terms [--term-good | --term-old | --term-bad | --"
 "term-new]"
 
-#: builtin/bisect--helper.c:28
+#: builtin/bisect--helper.c:26
 msgid ""
 "git bisect--helper --bisect-start [--term-{new,bad}=<term> --term-{old,good}"
 "=<term>] [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] "
@@ -10600,62 +10878,66 @@
 "good}=<Begriff>] [--no-checkout] [--first-parent] [<schlecht> [<gut>...]] "
 "[--] [<Pfade>...]"
 
-#: builtin/bisect--helper.c:30
+#: builtin/bisect--helper.c:28
 msgid "git bisect--helper --bisect-next"
 msgstr "git bisect--helper --bisect-next"
 
-#: builtin/bisect--helper.c:31
-msgid "git bisect--helper --bisect-auto-next"
-msgstr "git bisect--helper --bisect-auto-next"
-
-#: builtin/bisect--helper.c:32
+#: builtin/bisect--helper.c:29
 msgid "git bisect--helper --bisect-state (bad|new) [<rev>]"
 msgstr "git bisect--helper --bisect-state (bad|new) [<Commit>]"
 
-#: builtin/bisect--helper.c:33
+#: builtin/bisect--helper.c:30
 msgid "git bisect--helper --bisect-state (good|old) [<rev>...]"
 msgstr "git bisect--helper --bisect-state (good|old) [<Commit>...]"
 
-#: builtin/bisect--helper.c:108
+#: builtin/bisect--helper.c:31
+msgid "git bisect--helper --bisect-replay <filename>"
+msgstr "git bisect--helper --bisect-replay <Dateiname>"
+
+#: builtin/bisect--helper.c:32
+msgid "git bisect--helper --bisect-skip [(<rev>|<range>)...]"
+msgstr "git bisect--helper --bisect-skip [(<Commit>|<Bereich>)...]"
+
+#: builtin/bisect--helper.c:107
 #, c-format
 msgid "cannot open file '%s' in mode '%s'"
 msgstr "kann Datei '%s' nicht im Modus '%s' öffnen"
 
-#: builtin/bisect--helper.c:115
+#: builtin/bisect--helper.c:114
 #, c-format
 msgid "could not write to file '%s'"
 msgstr "konnte nicht in Datei '%s' schreiben"
 
-#: builtin/bisect--helper.c:154
+#: builtin/bisect--helper.c:153
 #, c-format
 msgid "'%s' is not a valid term"
 msgstr "'%s' ist kein gültiger Begriff"
 
-#: builtin/bisect--helper.c:158
+#: builtin/bisect--helper.c:157
 #, c-format
 msgid "can't use the builtin command '%s' as a term"
 msgstr "kann den eingebauten Befehl '%s' nicht als Begriff verwenden"
 
-#: builtin/bisect--helper.c:168
+#: builtin/bisect--helper.c:167
 #, c-format
 msgid "can't change the meaning of the term '%s'"
 msgstr "kann die Bedeutung von dem Begriff '%s' nicht ändern"
 
-#: builtin/bisect--helper.c:178
+#: builtin/bisect--helper.c:177
 msgid "please use two different terms"
 msgstr "bitte verwenden Sie zwei verschiedene Begriffe"
 
-#: builtin/bisect--helper.c:194
+#: builtin/bisect--helper.c:193
 #, c-format
 msgid "We are not bisecting.\n"
 msgstr "Keine binäre Suche im Gange.\n"
 
-#: builtin/bisect--helper.c:202
+#: builtin/bisect--helper.c:201
 #, c-format
 msgid "'%s' is not a valid commit"
 msgstr "'%s' ist kein gültiger Commit"
 
-#: builtin/bisect--helper.c:211
+#: builtin/bisect--helper.c:210
 #, c-format
 msgid ""
 "could not check out original HEAD '%s'. Try 'git bisect reset <commit>'."
@@ -10663,27 +10945,27 @@
 "Konnte den ursprünglichen HEAD '%s' nicht auschecken.\n"
 "Versuchen Sie 'git bisect reset <Commit>'."
 
-#: builtin/bisect--helper.c:255
+#: builtin/bisect--helper.c:254
 #, c-format
 msgid "Bad bisect_write argument: %s"
 msgstr "Ungültiges \"bisect_write\" Argument: %s"
 
-#: builtin/bisect--helper.c:260
+#: builtin/bisect--helper.c:259
 #, c-format
 msgid "couldn't get the oid of the rev '%s'"
-msgstr "Konnte die OID der Revision '%s' nicht erhalten."
+msgstr "konnte die OID der Revision '%s' nicht erhalten"
 
-#: builtin/bisect--helper.c:272
+#: builtin/bisect--helper.c:271
 #, c-format
 msgid "couldn't open the file '%s'"
-msgstr "Konnte die Datei '%s' nicht öffnen."
+msgstr "konnte die Datei '%s' nicht öffnen"
 
-#: builtin/bisect--helper.c:298
+#: builtin/bisect--helper.c:297
 #, c-format
 msgid "Invalid command: you're currently in a %s/%s bisect"
-msgstr "Ungültiger Befehl: Sie sind gerade bei einer binären %s/%s Suche."
+msgstr "Ungültiger Befehl: Sie sind gerade innerhalb einer binären %s/%s Suche"
 
-#: builtin/bisect--helper.c:325
+#: builtin/bisect--helper.c:324
 #, c-format
 msgid ""
 "You need to give me at least one %s and %s revision.\n"
@@ -10692,7 +10974,7 @@
 "Sie müssen mindestens einen \"%s\" und einen \"%s\" Commit angeben.\n"
 "Sie können dafür \"git bisect %s\" und \"git bisect %s\" benutzen."
 
-#: builtin/bisect--helper.c:329
+#: builtin/bisect--helper.c:328
 #, c-format
 msgid ""
 "You need to start by \"git bisect start\".\n"
@@ -10703,24 +10985,24 @@
 "Danach müssen Sie mindestens einen \"%s\" und einen \"%s\" Commit angeben.\n"
 "Sie können dafür \"git bisect %s\" und \"git bisect %s\" benutzen."
 
-#: builtin/bisect--helper.c:349
+#: builtin/bisect--helper.c:348
 #, c-format
 msgid "bisecting only with a %s commit"
-msgstr "Binäre Suche nur mit einem %s Commit."
+msgstr "binäre Suche nur mit einem %s Commit"
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
 #.
-#: builtin/bisect--helper.c:357
+#: builtin/bisect--helper.c:356
 msgid "Are you sure [Y/n]? "
 msgstr "Sind Sie sicher [Y/n]? "
 
-#: builtin/bisect--helper.c:418
+#: builtin/bisect--helper.c:417
 msgid "no terms defined"
-msgstr "Keine Begriffe definiert."
+msgstr "keine Begriffe definiert"
 
-#: builtin/bisect--helper.c:421
+#: builtin/bisect--helper.c:420
 #, c-format
 msgid ""
 "Your current terms are %s for the old state\n"
@@ -10729,7 +11011,7 @@
 "Ihre aktuellen Begriffe sind %s für den alten Zustand\n"
 "und %s für den neuen Zustand.\n"
 
-#: builtin/bisect--helper.c:431
+#: builtin/bisect--helper.c:430
 #, c-format
 msgid ""
 "invalid argument %s for 'git bisect terms'.\n"
@@ -10738,55 +11020,55 @@
 "Ungültiges Argument %s für 'git bisect terms'.\n"
 "Unterstützte Optionen sind: --term-good|--term-old und --term-bad|--term-new."
 
-#: builtin/bisect--helper.c:498
+#: builtin/bisect--helper.c:497 builtin/bisect--helper.c:1014
 msgid "revision walk setup failed\n"
 msgstr "Einrichtung des Revisionsgangs fehlgeschlagen\n"
 
-#: builtin/bisect--helper.c:520
+#: builtin/bisect--helper.c:519
 #, c-format
 msgid "could not open '%s' for appending"
 msgstr "konnte '%s' nicht zum Anhängen öffnen"
 
-#: builtin/bisect--helper.c:639 builtin/bisect--helper.c:652
+#: builtin/bisect--helper.c:638 builtin/bisect--helper.c:651
 msgid "'' is not a valid term"
 msgstr "'' ist kein gültiger Begriff"
 
-#: builtin/bisect--helper.c:662
+#: builtin/bisect--helper.c:661
 #, c-format
 msgid "unrecognized option: '%s'"
 msgstr "nicht erkannte Option: '%s'"
 
-#: builtin/bisect--helper.c:666
+#: builtin/bisect--helper.c:665
 #, c-format
 msgid "'%s' does not appear to be a valid revision"
 msgstr "'%s' scheint kein gültiger Commit zu sein"
 
-#: builtin/bisect--helper.c:697
+#: builtin/bisect--helper.c:696
 msgid "bad HEAD - I need a HEAD"
 msgstr "ungültiger HEAD - HEAD wird benötigt"
 
-#: builtin/bisect--helper.c:712
+#: builtin/bisect--helper.c:711
 #, c-format
 msgid "checking out '%s' failed. Try 'git bisect start <valid-branch>'."
 msgstr ""
 "Auschecken von '%s' fehlgeschlagen. Versuchen Sie 'git bisect start "
 "<gültiger-Branch>'."
 
-#: builtin/bisect--helper.c:733
+#: builtin/bisect--helper.c:732
 msgid "won't bisect on cg-seek'ed tree"
 msgstr ""
 "binäre Suche auf einem durch 'cg-seek' geändertem Verzeichnis nicht möglich"
 
-#: builtin/bisect--helper.c:736
+#: builtin/bisect--helper.c:735
 msgid "bad HEAD - strange symbolic ref"
 msgstr "ungültiger HEAD - merkwürdige symbolische Referenz"
 
-#: builtin/bisect--helper.c:756
+#: builtin/bisect--helper.c:755
 #, c-format
 msgid "invalid ref: '%s'"
 msgstr "ungültige Referenz: '%s'"
 
-#: builtin/bisect--helper.c:814
+#: builtin/bisect--helper.c:813
 msgid "You need to start by \"git bisect start\"\n"
 msgstr "Sie müssen mit \"git bisect start\" beginnen\n"
 
@@ -10794,93 +11076,101 @@
 #. translation. The program will only accept English input
 #. at this point.
 #.
-#: builtin/bisect--helper.c:825
+#: builtin/bisect--helper.c:824
 msgid "Do you want me to do it for you [Y/n]? "
 msgstr "Wollen Sie, dass ich es für Sie mache [Y/n]? "
 
-#: builtin/bisect--helper.c:843
+#: builtin/bisect--helper.c:842
 msgid "Please call `--bisect-state` with at least one argument"
 msgstr "Bitte führen Sie `--bisect-state` mit mindestens einem Argument aus"
 
-#: builtin/bisect--helper.c:856
+#: builtin/bisect--helper.c:855
 #, c-format
 msgid "'git bisect %s' can take only one argument."
 msgstr "'git bisect %s' kann nur ein Argument entgegennehmen."
 
-#: builtin/bisect--helper.c:868 builtin/bisect--helper.c:879
+#: builtin/bisect--helper.c:867 builtin/bisect--helper.c:878
 #, c-format
 msgid "Bad rev input: %s"
 msgstr "Ungültige Referenz-Eingabe: %s"
 
-#: builtin/bisect--helper.c:924
+#: builtin/bisect--helper.c:912
+msgid "We are not bisecting."
+msgstr "Keine binäre Suche im Gange."
+
+#: builtin/bisect--helper.c:962
+#, c-format
+msgid "'%s'?? what are you talking about?"
+msgstr "'%s'?? Was reden Sie da?"
+
+#: builtin/bisect--helper.c:974
+#, c-format
+msgid "cannot read file '%s' for replaying"
+msgstr "kann Datei '%s' nicht für die Wiederholung lesen"
+
+#: builtin/bisect--helper.c:1047
 msgid "reset the bisection state"
 msgstr "den Zustand der binären Suche zurücksetzen"
 
-#: builtin/bisect--helper.c:926
-msgid "write out the bisection state in BISECT_LOG"
-msgstr "den Zustand der binären Suche nach BISECT_LOG schreiben"
-
-#: builtin/bisect--helper.c:928
-msgid "check and set terms in a bisection state"
-msgstr "Begriffe innerhalb einer binären Suche prüfen und setzen"
-
-#: builtin/bisect--helper.c:930
+#: builtin/bisect--helper.c:1049
 msgid "check whether bad or good terms exist"
 msgstr "prüfen, ob Begriffe für gute und schlechte Commits existieren"
 
-#: builtin/bisect--helper.c:932
+#: builtin/bisect--helper.c:1051
 msgid "print out the bisect terms"
 msgstr "die Begriffe für die binäre Suche ausgeben"
 
-#: builtin/bisect--helper.c:934
+#: builtin/bisect--helper.c:1053
 msgid "start the bisect session"
 msgstr "Sitzung für binäre Suche starten"
 
-#: builtin/bisect--helper.c:936
+#: builtin/bisect--helper.c:1055
 msgid "find the next bisection commit"
 msgstr "nächsten Commit für die binäre Suche finden"
 
-#: builtin/bisect--helper.c:938
-msgid "verify the next bisection state then checkout the next bisection commit"
-msgstr ""
-"überprüfe den nächsten Zustand der binären Suche, checke dann den nächsten "
-"Commit der binären Suche aus"
-
-#: builtin/bisect--helper.c:940
+#: builtin/bisect--helper.c:1057
 msgid "mark the state of ref (or refs)"
 msgstr "den Status der Referenz(en) markieren"
 
-#: builtin/bisect--helper.c:942
+#: builtin/bisect--helper.c:1059
+msgid "list the bisection steps so far"
+msgstr "die bisherigen Schritte der binären Suche auflisten"
+
+#: builtin/bisect--helper.c:1061
+msgid "replay the bisection process from the given file"
+msgstr "binäre Suche aus der angegebenen Datei wiederholen"
+
+#: builtin/bisect--helper.c:1063
+msgid "skip some commits for checkout"
+msgstr "einige Commits für das Auschecken überspringen"
+
+#: builtin/bisect--helper.c:1065
 msgid "no log for BISECT_WRITE"
 msgstr "kein Log für BISECT_WRITE"
 
-#: builtin/bisect--helper.c:957
+#: builtin/bisect--helper.c:1080
 msgid "--bisect-reset requires either no argument or a commit"
 msgstr "--bisect-reset benötigt entweder kein Argument oder ein Commit"
 
-#: builtin/bisect--helper.c:961
-msgid "--bisect-write requires either 4 or 5 arguments"
-msgstr "--bisect-write benötigt entweder 4 oder 5 Argumente"
-
-#: builtin/bisect--helper.c:967
-msgid "--check-and-set-terms requires 3 arguments"
-msgstr "--check-and-set-terms benötigt 3 Argumente"
-
-#: builtin/bisect--helper.c:973
+#: builtin/bisect--helper.c:1085
 msgid "--bisect-next-check requires 2 or 3 arguments"
 msgstr "--bisect-next-check benötigt 2 oder 3 Argumente"
 
-#: builtin/bisect--helper.c:979
+#: builtin/bisect--helper.c:1091
 msgid "--bisect-terms requires 0 or 1 argument"
 msgstr "--bisect-terms benötigt 0 oder 1 Argument"
 
-#: builtin/bisect--helper.c:988
+#: builtin/bisect--helper.c:1100
 msgid "--bisect-next requires 0 arguments"
 msgstr "--bisect-next benötigt 0 Argumente"
 
-#: builtin/bisect--helper.c:994
-msgid "--bisect-auto-next requires 0 arguments"
-msgstr "--bisect-auto-next benötigt 0 Argumente"
+#: builtin/bisect--helper.c:1111
+msgid "--bisect-log requires 0 arguments"
+msgstr "--bisect-log benötigt 0 Argumente"
+
+#: builtin/bisect--helper.c:1116
+msgid "no logfile given"
+msgstr "keine Log-Datei angegeben"
 
 #: builtin/blame.c:32
 msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
@@ -10899,142 +11189,146 @@
 msgid "must end with a color"
 msgstr "muss mit einer Farbe enden"
 
-#: builtin/blame.c:730
+#: builtin/blame.c:728
 #, c-format
 msgid "invalid color '%s' in color.blame.repeatedLines"
 msgstr "ungültige Farbe '%s' in color.blame.repeatedLines"
 
-#: builtin/blame.c:748
+#: builtin/blame.c:746
 msgid "invalid value for blame.coloring"
 msgstr "ungültiger Wert für blame.coloring"
 
-#: builtin/blame.c:847
+#: builtin/blame.c:845
 #, c-format
 msgid "cannot find revision %s to ignore"
 msgstr "konnte Commit %s zum Ignorieren nicht finden"
 
+#: builtin/blame.c:867
+msgid "show blame entries as we find them, incrementally"
+msgstr "\"blame\"-Einträge schrittweise anzeigen, während wir sie finden"
+
+#: builtin/blame.c:868
+msgid "do not show object names of boundary commits (Default: off)"
+msgstr "keine Objektnamen für Grenz-Commits anzeigen (Standard: aus)"
+
 #: builtin/blame.c:869
-msgid "Show blame entries as we find them, incrementally"
-msgstr "\"blame\"-Einträge schrittweise anzeigen, während wir sie generieren"
-
-#: builtin/blame.c:870
-msgid "Do not show object names of boundary commits (Default: off)"
-msgstr "Zeige keine Objektnamen für Grenz-Commits an (Standard: aus)"
-
-#: builtin/blame.c:871
-msgid "Do not treat root commits as boundaries (Default: off)"
+msgid "do not treat root commits as boundaries (Default: off)"
 msgstr "Root-Commits nicht als Grenzen behandeln (Standard: aus)"
 
-#: builtin/blame.c:872
-msgid "Show work cost statistics"
+#: builtin/blame.c:870
+msgid "show work cost statistics"
 msgstr "Statistiken zum Arbeitsaufwand anzeigen"
 
-#: builtin/blame.c:873
-msgid "Force progress reporting"
+#: builtin/blame.c:871 builtin/checkout.c:1503 builtin/clone.c:92
+#: builtin/commit-graph.c:84 builtin/commit-graph.c:222 builtin/fetch.c:175
+#: builtin/merge.c:297 builtin/multi-pack-index.c:27 builtin/pull.c:119
+#: builtin/push.c:575 builtin/send-pack.c:198
+msgid "force progress reporting"
 msgstr "Fortschrittsanzeige erzwingen"
 
-#: builtin/blame.c:874
-msgid "Show output score for blame entries"
+#: builtin/blame.c:872
+msgid "show output score for blame entries"
 msgstr "Ausgabebewertung für \"blame\"-Einträge anzeigen"
 
-#: builtin/blame.c:875
-msgid "Show original filename (Default: auto)"
+#: builtin/blame.c:873
+msgid "show original filename (Default: auto)"
 msgstr "ursprünglichen Dateinamen anzeigen (Standard: auto)"
 
-#: builtin/blame.c:876
-msgid "Show original linenumber (Default: off)"
+#: builtin/blame.c:874
+msgid "show original linenumber (Default: off)"
 msgstr "ursprüngliche Zeilennummer anzeigen (Standard: aus)"
 
-#: builtin/blame.c:877
-msgid "Show in a format designed for machine consumption"
+#: builtin/blame.c:875
+msgid "show in a format designed for machine consumption"
 msgstr "Anzeige in einem Format für maschinelle Auswertung"
 
-#: builtin/blame.c:878
-msgid "Show porcelain format with per-line commit information"
+#: builtin/blame.c:876
+msgid "show porcelain format with per-line commit information"
 msgstr ""
 "Anzeige in Format für Fremdprogramme mit Commit-Informationen pro Zeile"
 
-#: builtin/blame.c:879
-msgid "Use the same output mode as git-annotate (Default: off)"
+#: builtin/blame.c:877
+msgid "use the same output mode as git-annotate (Default: off)"
 msgstr ""
-"Den gleichen Ausgabemodus benutzen wie \"git-annotate\" (Standard: aus)"
+"den gleichen Ausgabemodus benutzen wie \"git-annotate\" (Standard: aus)"
+
+#: builtin/blame.c:878
+msgid "show raw timestamp (Default: off)"
+msgstr "unbearbeiteten Zeitstempel anzeigen (Standard: aus)"
+
+#: builtin/blame.c:879
+msgid "show long commit SHA1 (Default: off)"
+msgstr "langen Commit-SHA1 anzeigen (Standard: aus)"
 
 #: builtin/blame.c:880
-msgid "Show raw timestamp (Default: off)"
-msgstr "Unbearbeiteten Zeitstempel anzeigen (Standard: aus)"
+msgid "suppress author name and timestamp (Default: off)"
+msgstr "den Namen des Autors und den Zeitstempel unterdrücken (Standard: aus)"
 
 #: builtin/blame.c:881
-msgid "Show long commit SHA1 (Default: off)"
-msgstr "Langen Commit-SHA1 anzeigen (Standard: aus)"
+msgid "show author email instead of name (Default: off)"
+msgstr ""
+"statt des Namens die E-Mail-Adresse des Autors anzeigen (Standard: aus)"
 
 #: builtin/blame.c:882
-msgid "Suppress author name and timestamp (Default: off)"
-msgstr "Den Namen des Autors und den Zeitstempel unterdrücken (Standard: aus)"
+msgid "ignore whitespace differences"
+msgstr "Whitespace-Unterschiede ignorieren"
 
-#: builtin/blame.c:883
-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:884
-msgid "Ignore whitespace differences"
-msgstr "Unterschiede im Whitespace ignorieren"
-
-#: builtin/blame.c:885 builtin/log.c:1813
+#: builtin/blame.c:883 builtin/log.c:1812
 msgid "rev"
 msgstr "Commit"
 
+#: builtin/blame.c:883
+msgid "ignore <rev> when blaming"
+msgstr "ignoriere <Commit> beim Ausführen von 'blame'"
+
+#: builtin/blame.c:884
+msgid "ignore revisions from <file>"
+msgstr "ignoriere Commits aus <Datei>"
+
 #: builtin/blame.c:885
-msgid "Ignore <rev> when blaming"
-msgstr "Ignoriere <Commit> beim Ausführen von 'blame'"
-
-#: builtin/blame.c:886
-msgid "Ignore revisions from <file>"
-msgstr "Ignoriere Commits aus <Datei>"
-
-#: builtin/blame.c:887
 msgid "color redundant metadata from previous line differently"
 msgstr "redundante Metadaten der vorherigen Zeile unterschiedlich einfärben"
 
-#: builtin/blame.c:888
+#: builtin/blame.c:886
 msgid "color lines by age"
 msgstr "Zeilen nach Alter einfärben"
 
+#: builtin/blame.c:887
+msgid "spend extra cycles to find better match"
+msgstr ""
+"mehr Arbeitsschritte ausführen, um eine bessere Übereinstimmung zu finden"
+
+#: builtin/blame.c:888
+msgid "use revisions from <file> instead of calling git-rev-list"
+msgstr "Commits von <Datei> benutzen, statt \"git-rev-list\" aufzurufen"
+
 #: builtin/blame.c:889
-msgid "Spend extra cycles to find better match"
-msgstr "Länger arbeiten, um bessere Übereinstimmungen zu finden"
-
-#: builtin/blame.c:890
-msgid "Use revisions from <file> instead of calling git-rev-list"
-msgstr "Commits von <Datei> benutzen, anstatt \"git-rev-list\" aufzurufen"
-
-#: builtin/blame.c:891
-msgid "Use <file>'s contents as the final image"
+msgid "use <file>'s contents as the final image"
 msgstr "Inhalte der <Datei>en als endgültiges Abbild benutzen"
 
-#: builtin/blame.c:892 builtin/blame.c:893
+#: builtin/blame.c:890 builtin/blame.c:891
 msgid "score"
 msgstr "Bewertung"
 
-#: builtin/blame.c:892
-msgid "Find line copies within and across files"
+#: builtin/blame.c:890
+msgid "find line copies within and across files"
 msgstr "kopierte Zeilen innerhalb oder zwischen Dateien finden"
 
-#: builtin/blame.c:893
-msgid "Find line movements within and across files"
+#: builtin/blame.c:891
+msgid "find line movements within and across files"
 msgstr "verschobene Zeilen innerhalb oder zwischen Dateien finden"
 
-#: builtin/blame.c:894
+#: builtin/blame.c:892
 msgid "range"
 msgstr "Bereich"
 
-#: builtin/blame.c:895
-msgid "Process only line range <start>,<end> or function :<funcname>"
+#: builtin/blame.c:893
+msgid "process only line range <start>,<end> or function :<funcname>"
 msgstr ""
-"Nur Zeilen im Bereich <Start>,<Ende> oder Funktion :<Funktionsname> "
+"nur Zeilen im Bereich <Start>,<Ende> oder Funktion :<Funktionsname> "
 "verarbeiten"
 
-#: builtin/blame.c:947
+#: builtin/blame.c:945
 msgid "--progress can't be used with --incremental or porcelain formats"
 msgstr ""
 "--progress kann nicht mit --incremental oder Formaten für Fremdprogramme\n"
@@ -11048,18 +11342,18 @@
 #. your language may need more or fewer display
 #. columns.
 #.
-#: builtin/blame.c:998
+#: builtin/blame.c:996
 msgid "4 years, 11 months ago"
 msgstr "vor 4 Jahren und 11 Monaten"
 
-#: builtin/blame.c:1114
+#: builtin/blame.c:1112
 #, 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/blame.c:1159
+#: builtin/blame.c:1157
 msgid "Blaming lines"
 msgstr "Verarbeite Zeilen"
 
@@ -11128,124 +11422,114 @@
 msgid "Update of config-file failed"
 msgstr "Aktualisierung der Konfigurationsdatei fehlgeschlagen."
 
-#: builtin/branch.c:220
+#: builtin/branch.c:223
 msgid "cannot use -a with -d"
 msgstr "kann -a nicht mit -d benutzen"
 
-#: builtin/branch.c:226
+#: builtin/branch.c:230
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Konnte Commit-Objekt für HEAD nicht nachschlagen."
 
-#: builtin/branch.c:240
+#: builtin/branch.c:244
 #, c-format
 msgid "Cannot delete branch '%s' checked out at '%s'"
 msgstr "Kann Branch '%s' nicht entfernen, ausgecheckt in '%s'."
 
-#: builtin/branch.c:255
+#: builtin/branch.c:259
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "Remote-Tracking-Branch '%s' nicht gefunden"
 
-#: builtin/branch.c:256
+#: builtin/branch.c:260
 #, c-format
 msgid "branch '%s' not found."
 msgstr "Branch '%s' nicht gefunden."
 
-#: builtin/branch.c:271
-#, c-format
-msgid "Error deleting remote-tracking branch '%s'"
-msgstr "Fehler beim Entfernen des Remote-Tracking-Branches '%s'"
-
-#: builtin/branch.c:272
-#, c-format
-msgid "Error deleting branch '%s'"
-msgstr "Fehler beim Entfernen des Branches '%s'"
-
-#: builtin/branch.c:279
+#: builtin/branch.c:291
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Remote-Tracking-Branch %s entfernt (war %s).\n"
 
-#: builtin/branch.c:280
+#: builtin/branch.c:292
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Branch %s entfernt (war %s).\n"
 
-#: builtin/branch.c:429 builtin/tag.c:61
+#: builtin/branch.c:438 builtin/tag.c:61
 msgid "unable to parse format string"
 msgstr "Konnte Formatierungsstring nicht parsen."
 
-#: builtin/branch.c:460
+#: builtin/branch.c:469
 msgid "could not resolve HEAD"
 msgstr "Konnte HEAD-Commit nicht auflösen."
 
-#: builtin/branch.c:466
+#: builtin/branch.c:475
 #, c-format
 msgid "HEAD (%s) points outside of refs/heads/"
 msgstr "HEAD (%s) wurde nicht unter \"refs/heads/\" gefunden!"
 
-#: builtin/branch.c:481
+#: builtin/branch.c:490
 #, c-format
 msgid "Branch %s is being rebased at %s"
 msgstr "Branch %s wird auf %s umgesetzt"
 
-#: builtin/branch.c:485
+#: builtin/branch.c:494
 #, c-format
 msgid "Branch %s is being bisected at %s"
 msgstr "Binäre Suche von Branch %s zu %s im Gange"
 
-#: builtin/branch.c:502
+#: builtin/branch.c:511
 msgid "cannot copy the current branch while not on any."
 msgstr ""
 "Kann den aktuellen Branch nicht kopieren, solange Sie sich auf keinem "
 "befinden."
 
-#: builtin/branch.c:504
+#: builtin/branch.c:513
 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:515
+#: builtin/branch.c:524
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Ungültiger Branchname: '%s'"
 
-#: builtin/branch.c:544
+#: builtin/branch.c:553
 msgid "Branch rename failed"
 msgstr "Umbenennung des Branches fehlgeschlagen"
 
-#: builtin/branch.c:546
+#: builtin/branch.c:555
 msgid "Branch copy failed"
 msgstr "Kopie des Branches fehlgeschlagen"
 
-#: builtin/branch.c:550
+#: builtin/branch.c:559
 #, c-format
 msgid "Created a copy of a misnamed branch '%s'"
 msgstr "Kopie eines falsch benannten Branches '%s' erstellt."
 
-#: builtin/branch.c:553
+#: builtin/branch.c:562
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "falsch benannten Branch '%s' umbenannt"
 
-#: builtin/branch.c:559
+#: builtin/branch.c:568
 #, 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:568
+#: builtin/branch.c:577
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 "Branch ist umbenannt, aber die Aktualisierung der Konfigurationsdatei ist "
 "fehlgeschlagen."
 
-#: builtin/branch.c:570
+#: builtin/branch.c:579
 msgid "Branch is copied, but update of config-file failed"
 msgstr ""
 "Branch wurde kopiert, aber die Aktualisierung der Konfigurationsdatei ist\n"
 "fehlgeschlagen."
 
-#: builtin/branch.c:586
+#: builtin/branch.c:595
 #, c-format
 msgid ""
 "Please edit the description for the branch\n"
@@ -11256,181 +11540,181 @@
 "  %s\n"
 "Zeilen, die mit '%c' beginnen, werden entfernt.\n"
 
-#: builtin/branch.c:620
+#: builtin/branch.c:629
 msgid "Generic options"
 msgstr "Allgemeine Optionen"
 
-#: builtin/branch.c:622
+#: builtin/branch.c:631
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "Hash und Betreff anzeigen; -vv: zusätzlich Upstream-Branch"
 
-#: builtin/branch.c:623
+#: builtin/branch.c:632
 msgid "suppress informational messages"
 msgstr "Informationsmeldungen unterdrücken"
 
-#: builtin/branch.c:624
+#: builtin/branch.c:633
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "Modus zum Folgen von Branches einstellen (siehe git-pull(1))"
 
-#: builtin/branch.c:626
+#: builtin/branch.c:635
 msgid "do not use"
 msgstr "nicht verwenden"
 
-#: builtin/branch.c:628 builtin/rebase.c:532
+#: builtin/branch.c:637 builtin/rebase.c:534
 msgid "upstream"
 msgstr "Upstream"
 
-#: builtin/branch.c:628
+#: builtin/branch.c:637
 msgid "change the upstream info"
 msgstr "Informationen zum Upstream-Branch ändern"
 
-#: builtin/branch.c:629
+#: builtin/branch.c:638
 msgid "unset the upstream info"
 msgstr "Informationen zum Upstream-Branch entfernen"
 
-#: builtin/branch.c:630
+#: builtin/branch.c:639
 msgid "use colored output"
 msgstr "farbige Ausgaben verwenden"
 
-#: builtin/branch.c:631
+#: builtin/branch.c:640
 msgid "act on remote-tracking branches"
 msgstr "auf Remote-Tracking-Branches wirken"
 
-#: builtin/branch.c:633 builtin/branch.c:635
+#: builtin/branch.c:642 builtin/branch.c:644
 msgid "print only branches that contain the commit"
 msgstr "nur Branches ausgeben, die diesen Commit enthalten"
 
-#: builtin/branch.c:634 builtin/branch.c:636
+#: builtin/branch.c:643 builtin/branch.c:645
 msgid "print only branches that don't contain the commit"
 msgstr "nur Branches ausgeben, die diesen Commit nicht enthalten"
 
-#: builtin/branch.c:639
+#: builtin/branch.c:648
 msgid "Specific git-branch actions:"
 msgstr "spezifische Aktionen für \"git-branch\":"
 
-#: builtin/branch.c:640
+#: builtin/branch.c:649
 msgid "list both remote-tracking and local branches"
 msgstr "Remote-Tracking und lokale Branches auflisten"
 
-#: builtin/branch.c:642
+#: builtin/branch.c:651
 msgid "delete fully merged branch"
 msgstr "vollständig zusammengeführten Branch entfernen"
 
-#: builtin/branch.c:643
+#: builtin/branch.c:652
 msgid "delete branch (even if not merged)"
 msgstr "Branch löschen (auch wenn nicht zusammengeführt)"
 
-#: builtin/branch.c:644
+#: builtin/branch.c:653
 msgid "move/rename a branch and its reflog"
 msgstr "einen Branch und dessen Reflog verschieben/umbenennen"
 
-#: builtin/branch.c:645
+#: builtin/branch.c:654
 msgid "move/rename a branch, even if target exists"
 msgstr ""
 "einen Branch verschieben/umbenennen, auch wenn das Ziel bereits existiert"
 
-#: builtin/branch.c:646
+#: builtin/branch.c:655
 msgid "copy a branch and its reflog"
 msgstr "einen Branch und dessen Reflog kopieren"
 
-#: builtin/branch.c:647
+#: builtin/branch.c:656
 msgid "copy a branch, even if target exists"
 msgstr "einen Branch kopieren, auch wenn das Ziel bereits existiert"
 
-#: builtin/branch.c:648
+#: builtin/branch.c:657
 msgid "list branch names"
 msgstr "Branchnamen auflisten"
 
-#: builtin/branch.c:649
+#: builtin/branch.c:658
 msgid "show current branch name"
 msgstr "Zeige aktuellen Branch-Namen."
 
-#: builtin/branch.c:650
+#: builtin/branch.c:659
 msgid "create the branch's reflog"
 msgstr "das Reflog des Branches erzeugen"
 
-#: builtin/branch.c:652
+#: builtin/branch.c:661
 msgid "edit the description for the branch"
 msgstr "die Beschreibung für den Branch bearbeiten"
 
-#: builtin/branch.c:653
+#: builtin/branch.c:662
 msgid "force creation, move/rename, deletion"
 msgstr "Erstellung, Verschiebung/Umbenennung oder Löschung erzwingen"
 
-#: builtin/branch.c:654
+#: builtin/branch.c:663
 msgid "print only branches that are merged"
 msgstr "nur zusammengeführte Branches ausgeben"
 
-#: builtin/branch.c:655
+#: builtin/branch.c:664
 msgid "print only branches that are not merged"
 msgstr "nur nicht zusammengeführte Branches ausgeben"
 
-#: builtin/branch.c:656
+#: builtin/branch.c:665
 msgid "list branches in columns"
 msgstr "Branches in Spalten auflisten"
 
-#: builtin/branch.c:658 builtin/for-each-ref.c:42 builtin/notes.c:415
+#: builtin/branch.c:667 builtin/for-each-ref.c:42 builtin/notes.c:415
 #: builtin/notes.c:418 builtin/notes.c:581 builtin/notes.c:584
-#: builtin/tag.c:434
+#: builtin/tag.c:466
 msgid "object"
 msgstr "Objekt"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:668
 msgid "print only branches of the object"
 msgstr "nur Branches von diesem Objekt ausgeben"
 
-#: builtin/branch.c:660 builtin/for-each-ref.c:48 builtin/tag.c:441
+#: builtin/branch.c:669 builtin/for-each-ref.c:48 builtin/tag.c:473
 msgid "sorting and filtering are case insensitive"
 msgstr "Sortierung und Filterung sind unabhängig von Groß- und Kleinschreibung"
 
-#: builtin/branch.c:661 builtin/for-each-ref.c:38 builtin/tag.c:439
+#: builtin/branch.c:670 builtin/for-each-ref.c:38 builtin/tag.c:471
 #: builtin/verify-tag.c:38
 msgid "format to use for the output"
 msgstr "für die Ausgabe zu verwendendes Format"
 
-#: builtin/branch.c:684 builtin/clone.c:790
+#: builtin/branch.c:693 builtin/clone.c:790
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD wurde nicht unter \"refs/heads\" gefunden!"
 
-#: builtin/branch.c:708
+#: builtin/branch.c:717
 msgid "--column and --verbose are incompatible"
-msgstr "Die Optionen --column und --verbose sind inkompatibel."
+msgstr "--column und --verbose sind inkompatibel"
 
-#: builtin/branch.c:723 builtin/branch.c:777 builtin/branch.c:786
+#: builtin/branch.c:732 builtin/branch.c:788 builtin/branch.c:797
 msgid "branch name required"
 msgstr "Branchname erforderlich"
 
-#: builtin/branch.c:753
+#: builtin/branch.c:764
 msgid "Cannot give description to detached HEAD"
 msgstr "zu losgelöstem HEAD kann keine Beschreibung hinterlegt werden"
 
-#: builtin/branch.c:758
+#: builtin/branch.c:769
 msgid "cannot edit description of more than one branch"
 msgstr "Beschreibung von mehr als einem Branch kann nicht bearbeitet werden"
 
-#: builtin/branch.c:765
+#: builtin/branch.c:776
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Noch kein Commit in Branch '%s'."
 
-#: builtin/branch.c:768
+#: builtin/branch.c:779
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Branch '%s' nicht vorhanden."
 
-#: builtin/branch.c:783
+#: builtin/branch.c:794
 msgid "too many branches for a copy operation"
 msgstr "zu viele Branches für eine Kopieroperation angegeben"
 
-#: builtin/branch.c:792
+#: builtin/branch.c:803
 msgid "too many arguments for a rename operation"
 msgstr "zu viele Argumente für eine Umbenennen-Operation angegeben"
 
-#: builtin/branch.c:797
+#: builtin/branch.c:808
 msgid "too many arguments to set new upstream"
 msgstr "zu viele Argumente angegeben, um Upstream-Branch zu setzen"
 
-#: builtin/branch.c:801
+#: builtin/branch.c:812
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -11438,34 +11722,34 @@
 "Konnte keinen neuen Upstream-Branch von HEAD zu %s setzen, da dieser auf\n"
 "keinen Branch zeigt."
 
-#: builtin/branch.c:804 builtin/branch.c:827
+#: builtin/branch.c:815 builtin/branch.c:838
 #, c-format
 msgid "no such branch '%s'"
-msgstr "Kein solcher Branch '%s'"
+msgstr "Branch '%s' nicht gefunden"
 
-#: builtin/branch.c:808
+#: builtin/branch.c:819
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "Branch '%s' existiert nicht"
 
-#: builtin/branch.c:821
+#: builtin/branch.c:832
 msgid "too many arguments to unset upstream"
 msgstr ""
 "zu viele Argumente angegeben, um Konfiguration zu Upstream-Branch zu "
 "entfernen"
 
-#: builtin/branch.c:825
+#: builtin/branch.c:836
 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:831
+#: builtin/branch.c:842
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Branch '%s' hat keinen Upstream-Branch gesetzt"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:852
 msgid ""
 "The -a, and -r, options to 'git branch' do not take a branch name.\n"
 "Did you mean to use: -a|-r --list <pattern>?"
@@ -11474,7 +11758,7 @@
 "verwendet werden.\n"
 "Wollten Sie -a|-r --list <Muster> benutzen?"
 
-#: builtin/branch.c:845
+#: builtin/branch.c:856
 msgid ""
 "the '--set-upstream' option is no longer supported. Please use '--track' or "
 "'--set-upstream-to' instead."
@@ -11596,19 +11880,19 @@
 msgid "git bundle unbundle <file> [<refname>...]"
 msgstr "git bundle unbundle <Datei> [<Referenzname>...]"
 
-#: builtin/bundle.c:67 builtin/pack-objects.c:3480
+#: builtin/bundle.c:67 builtin/pack-objects.c:3495
 msgid "do not show progress meter"
 msgstr "keine Fortschrittsanzeige anzeigen"
 
-#: builtin/bundle.c:69 builtin/pack-objects.c:3482
+#: builtin/bundle.c:69 builtin/pack-objects.c:3497
 msgid "show progress meter"
 msgstr "Fortschrittsanzeige anzeigen"
 
-#: builtin/bundle.c:71 builtin/pack-objects.c:3484
+#: builtin/bundle.c:71 builtin/pack-objects.c:3499
 msgid "show progress meter during object writing phase"
 msgstr "Forschrittsanzeige während des Schreibens von Objekten anzeigen"
 
-#: builtin/bundle.c:74 builtin/pack-objects.c:3487
+#: builtin/bundle.c:74 builtin/pack-objects.c:3502
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "ähnlich zu --all-progress wenn Fortschrittsanzeige darstellt wird"
 
@@ -11755,8 +12039,8 @@
 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:21 builtin/checkout.c:1500 builtin/gc.c:541
-#: builtin/worktree.c:561
+#: builtin/check-ignore.c:21 builtin/checkout.c:1499 builtin/gc.c:549
+#: builtin/worktree.c:489
 msgid "suppress progress reporting"
 msgstr "Fortschrittsanzeige unterdrücken"
 
@@ -11774,7 +12058,7 @@
 
 #: builtin/check-ignore.c:166
 msgid "-z only makes sense with --stdin"
-msgstr "Die Option -z kann nur mit --stdin verwendet werden."
+msgstr "-z kann nur mit --stdin verwendet werden"
 
 #: builtin/check-ignore.c:168
 msgid "no path specified"
@@ -11782,12 +12066,11 @@
 
 #: builtin/check-ignore.c:172
 msgid "--quiet is only valid with a single pathname"
-msgstr "Die Option --quiet ist nur mit einem einzelnen Pfadnamen gültig."
+msgstr "--quiet ist nur mit einem einzelnen Pfadnamen gültig"
 
 #: builtin/check-ignore.c:174
 msgid "cannot have both --quiet and --verbose"
-msgstr ""
-"Die Optionen --quiet und --verbose können nicht gemeinsam verwendet werden."
+msgstr "--quiet und --verbose können nicht gemeinsam verwendet werden"
 
 #: builtin/check-ignore.c:177
 msgid "--non-matching is only valid with --verbose"
@@ -11810,57 +12093,57 @@
 msgid "no contacts specified"
 msgstr "keine Kontakte angegeben"
 
-#: builtin/checkout-index.c:139
+#: builtin/checkout-index.c:152
 msgid "git checkout-index [<options>] [--] [<file>...]"
 msgstr "git checkout-index [<Optionen>] [--] [<Datei>...]"
 
-#: builtin/checkout-index.c:156
+#: builtin/checkout-index.c:169
 msgid "stage should be between 1 and 3 or all"
 msgstr "--stage sollte zwischen 1 und 3 oder 'all' sein"
 
-#: builtin/checkout-index.c:173
+#: builtin/checkout-index.c:186
 msgid "check out all files in the index"
 msgstr "alle Dateien im Index auschecken"
 
-#: builtin/checkout-index.c:174
+#: builtin/checkout-index.c:187
 msgid "force overwrite of existing files"
 msgstr "das Überschreiben bereits existierender Dateien erzwingen"
 
-#: builtin/checkout-index.c:176
+#: builtin/checkout-index.c:189
 msgid "no warning for existing files and files not in index"
 msgstr ""
 "keine Warnung für existierende Dateien, und Dateien, die sich nicht im Index "
 "befinden"
 
-#: builtin/checkout-index.c:178
+#: builtin/checkout-index.c:191
 msgid "don't checkout new files"
 msgstr "keine neuen Dateien auschecken"
 
-#: builtin/checkout-index.c:180
+#: builtin/checkout-index.c:193
 msgid "update stat information in the index file"
 msgstr "Dateiinformationen in der Index-Datei aktualisieren"
 
-#: builtin/checkout-index.c:184
+#: builtin/checkout-index.c:197
 msgid "read list of paths from the standard input"
 msgstr "eine Liste von Pfaden von der Standard-Eingabe lesen"
 
-#: builtin/checkout-index.c:186
+#: builtin/checkout-index.c:199
 msgid "write the content to temporary files"
 msgstr "den Inhalt in temporäre Dateien schreiben"
 
-#: builtin/checkout-index.c:187 builtin/column.c:31
+#: builtin/checkout-index.c:200 builtin/column.c:31
 #: builtin/submodule--helper.c:1824 builtin/submodule--helper.c:1827
 #: builtin/submodule--helper.c:1835 builtin/submodule--helper.c:2333
-#: builtin/worktree.c:757
+#: builtin/worktree.c:717
 msgid "string"
 msgstr "Zeichenkette"
 
-#: builtin/checkout-index.c:188
+#: builtin/checkout-index.c:201
 msgid "when creating files, prepend <string>"
 msgstr ""
 "wenn Dateien erzeugt werden, stelle <Zeichenkette> dem Dateinamen voran"
 
-#: builtin/checkout-index.c:190
+#: builtin/checkout-index.c:203
 msgid "copy out the files from named stage"
 msgstr "Dateien von dem benannten Stand kopieren"
 
@@ -11963,16 +12246,16 @@
 msgid "'%s' or '%s' cannot be used with %s"
 msgstr "'%s' oder '%s' kann nicht mit %s verwendet werden"
 
-#: builtin/checkout.c:541 builtin/checkout.c:548
+#: builtin/checkout.c:543 builtin/checkout.c:550
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "Pfad '%s' ist nicht zusammengeführt."
 
-#: builtin/checkout.c:716
+#: builtin/checkout.c:718
 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:770
+#: builtin/checkout.c:772
 #, c-format
 msgid ""
 "cannot continue with staged changes in the following files:\n"
@@ -11981,50 +12264,50 @@
 "Kann nicht mit vorgemerkten Änderungen in folgenden Dateien fortsetzen:\n"
 "%s"
 
-#: builtin/checkout.c:866
+#: builtin/checkout.c:865
 #, 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:908
+#: builtin/checkout.c:907
 msgid "HEAD is now at"
 msgstr "HEAD ist jetzt bei"
 
-#: builtin/checkout.c:912 builtin/clone.c:721 t/helper/test-fast-rebase.c:202
+#: builtin/checkout.c:911 builtin/clone.c:721 t/helper/test-fast-rebase.c:202
 msgid "unable to update HEAD"
 msgstr "Konnte HEAD nicht aktualisieren."
 
-#: builtin/checkout.c:916
+#: builtin/checkout.c:915
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Setze Branch '%s' neu\n"
 
-#: builtin/checkout.c:919
+#: builtin/checkout.c:918
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Bereits auf '%s'\n"
 
-#: builtin/checkout.c:923
+#: builtin/checkout.c:922
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Zu umgesetztem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:925 builtin/checkout.c:1356
+#: builtin/checkout.c:924 builtin/checkout.c:1355
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Zu neuem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:927
+#: builtin/checkout.c:926
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Zu Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:978
+#: builtin/checkout.c:977
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... und %d weitere.\n"
 
-#: builtin/checkout.c:984
+#: builtin/checkout.c:983
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -12047,7 +12330,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -12074,19 +12357,19 @@
 " git branch <neuer-Branchname> %s\n"
 "\n"
 
-#: builtin/checkout.c:1038
+#: builtin/checkout.c:1037
 msgid "internal error in revision walk"
 msgstr "interner Fehler im Revisionsgang"
 
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
 msgid "Previous HEAD position was"
 msgstr "Vorherige Position von HEAD war"
 
-#: builtin/checkout.c:1082 builtin/checkout.c:1351
+#: builtin/checkout.c:1081 builtin/checkout.c:1350
 msgid "You are on a branch yet to be born"
 msgstr "Sie sind auf einem Branch, der noch nicht geboren ist"
 
-#: builtin/checkout.c:1164
+#: builtin/checkout.c:1163
 #, c-format
 msgid ""
 "'%s' could be both a local file and a tracking branch.\n"
@@ -12096,7 +12379,7 @@
 "Bitte benutzen Sie -- (und optional --no-guess), um diese\n"
 "eindeutig voneinander zu unterscheiden."
 
-#: builtin/checkout.c:1171
+#: builtin/checkout.c:1170
 msgid ""
 "If you meant to check out a remote tracking branch on, e.g. 'origin',\n"
 "you can do so by fully qualifying the name with the --track option:\n"
@@ -12119,51 +12402,51 @@
 "bevorzugen möchten, z.B. 'origin', können Sie die Einstellung\n"
 "checkout.defaultRemote=origin in Ihrer Konfiguration setzen."
 
-#: builtin/checkout.c:1181
+#: builtin/checkout.c:1180
 #, c-format
 msgid "'%s' matched multiple (%d) remote tracking branches"
 msgstr "'%s' entspricht mehreren (%d) Remote-Tracking-Branches"
 
-#: builtin/checkout.c:1247
+#: builtin/checkout.c:1246
 msgid "only one reference expected"
 msgstr "nur eine Referenz erwartet"
 
-#: builtin/checkout.c:1264
+#: builtin/checkout.c:1263
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "nur eine Referenz erwartet, %d gegeben."
 
-#: builtin/checkout.c:1310 builtin/worktree.c:342 builtin/worktree.c:510
+#: builtin/checkout.c:1309 builtin/worktree.c:270 builtin/worktree.c:438
 #, c-format
 msgid "invalid reference: %s"
 msgstr "Ungültige Referenz: %s"
 
-#: builtin/checkout.c:1323 builtin/checkout.c:1689
+#: builtin/checkout.c:1322 builtin/checkout.c:1688
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "Referenz ist kein \"Tree\"-Objekt: %s"
 
-#: builtin/checkout.c:1370
+#: builtin/checkout.c:1369
 #, c-format
 msgid "a branch is expected, got tag '%s'"
 msgstr "Ein Branch wird erwartet, Tag '%s' bekommen"
 
-#: builtin/checkout.c:1372
+#: builtin/checkout.c:1371
 #, c-format
 msgid "a branch is expected, got remote branch '%s'"
 msgstr "Ein Branch wird erwartet, Remote-Branch '%s' bekommen"
 
-#: builtin/checkout.c:1373 builtin/checkout.c:1381
+#: builtin/checkout.c:1372 builtin/checkout.c:1380
 #, c-format
 msgid "a branch is expected, got '%s'"
 msgstr "Ein Branch wird erwartet, '%s' bekommen"
 
-#: builtin/checkout.c:1376
+#: builtin/checkout.c:1375
 #, c-format
 msgid "a branch is expected, got commit '%s'"
 msgstr "Ein Branch wird erwartet, Commit '%s' bekommen"
 
-#: builtin/checkout.c:1392
+#: builtin/checkout.c:1391
 msgid ""
 "cannot switch branch while merging\n"
 "Consider \"git merge --quit\" or \"git worktree add\"."
@@ -12171,7 +12454,7 @@
 "Der Branch kann nicht während eines Merges gewechselt werden.\n"
 "Ziehen Sie \"git merge --quit\" oder \"git worktree add\" in Betracht."
 
-#: builtin/checkout.c:1396
+#: builtin/checkout.c:1395
 msgid ""
 "cannot switch branch in the middle of an am session\n"
 "Consider \"git am --quit\" or \"git worktree add\"."
@@ -12180,7 +12463,7 @@
 "werden.\n"
 "Ziehen Sie \"git am --quit\" oder \"git worktree add\" in Betracht."
 
-#: builtin/checkout.c:1400
+#: builtin/checkout.c:1399
 msgid ""
 "cannot switch branch while rebasing\n"
 "Consider \"git rebase --quit\" or \"git worktree add\"."
@@ -12189,7 +12472,7 @@
 "werden.\n"
 "Ziehen Sie \"git rebase --quit\" oder \"git worktree add\" in Betracht."
 
-#: builtin/checkout.c:1404
+#: builtin/checkout.c:1403
 msgid ""
 "cannot switch branch while cherry-picking\n"
 "Consider \"git cherry-pick --quit\" or \"git worktree add\"."
@@ -12198,7 +12481,7 @@
 "gewechselt werden.\n"
 "Ziehen Sie \"git cherry-pick --quit\" oder \"git worktree add\" in Betracht."
 
-#: builtin/checkout.c:1408
+#: builtin/checkout.c:1407
 msgid ""
 "cannot switch branch while reverting\n"
 "Consider \"git revert --quit\" or \"git worktree add\"."
@@ -12207,147 +12490,140 @@
 "werden.\n"
 "Ziehen Sie \"git revert --quit\" oder \"git worktree add\" in Betracht."
 
-#: builtin/checkout.c:1412
+#: builtin/checkout.c:1411
 msgid "you are switching branch while bisecting"
 msgstr "Sie wechseln den Branch während einer binären Suche"
 
-#: builtin/checkout.c:1419
+#: builtin/checkout.c:1418
 msgid "paths cannot be used with switching branches"
 msgstr "Pfade können nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1422 builtin/checkout.c:1426 builtin/checkout.c:1430
+#: builtin/checkout.c:1421 builtin/checkout.c:1425 builtin/checkout.c:1429
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' kann nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1434 builtin/checkout.c:1437 builtin/checkout.c:1440
-#: builtin/checkout.c:1445 builtin/checkout.c:1450
+#: builtin/checkout.c:1433 builtin/checkout.c:1436 builtin/checkout.c:1439
+#: builtin/checkout.c:1444 builtin/checkout.c:1449
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' kann nicht mit '%s' verwendet werden"
 
-#: builtin/checkout.c:1447
+#: builtin/checkout.c:1446
 #, c-format
 msgid "'%s' cannot take <start-point>"
 msgstr "'%s' kann nicht <Startpunkt> bekommen"
 
-#: builtin/checkout.c:1455
+#: builtin/checkout.c:1454
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Kann Branch nicht zu Nicht-Commit '%s' wechseln"
 
-#: builtin/checkout.c:1462
+#: builtin/checkout.c:1461
 msgid "missing branch or commit argument"
 msgstr "Branch- oder Commit-Argument fehlt"
 
-#: builtin/checkout.c:1504 builtin/clone.c:92 builtin/commit-graph.c:84
-#: builtin/commit-graph.c:222 builtin/fetch.c:172 builtin/merge.c:296
-#: builtin/multi-pack-index.c:27 builtin/pull.c:119 builtin/push.c:575
-#: builtin/send-pack.c:198
-msgid "force progress reporting"
-msgstr "Fortschrittsanzeige erzwingen"
-
-#: builtin/checkout.c:1505
+#: builtin/checkout.c:1504
 msgid "perform a 3-way merge with the new branch"
 msgstr "einen 3-Wege-Merge mit dem neuen Branch ausführen"
 
-#: builtin/checkout.c:1506 builtin/log.c:1800 parse-options.h:322
+#: builtin/checkout.c:1505 builtin/log.c:1799 parse-options.h:322
 msgid "style"
 msgstr "Stil"
 
-#: builtin/checkout.c:1507
+#: builtin/checkout.c:1506
 msgid "conflict style (merge or diff3)"
 msgstr "Konfliktstil (merge oder diff3)"
 
-#: builtin/checkout.c:1519 builtin/worktree.c:558
+#: builtin/checkout.c:1518 builtin/worktree.c:486
 msgid "detach HEAD at named commit"
 msgstr "HEAD bei benanntem Commit loslösen"
 
-#: builtin/checkout.c:1520
+#: builtin/checkout.c:1519
 msgid "set upstream info for new branch"
 msgstr "Informationen zum Upstream-Branch für den neuen Branch setzen"
 
-#: builtin/checkout.c:1522
+#: builtin/checkout.c:1521
 msgid "force checkout (throw away local modifications)"
 msgstr "Auschecken erzwingen (verwirft lokale Änderungen)"
 
-#: builtin/checkout.c:1524
+#: builtin/checkout.c:1523
 msgid "new-branch"
 msgstr "neuer Branch"
 
-#: builtin/checkout.c:1524
+#: builtin/checkout.c:1523
 msgid "new unparented branch"
 msgstr "neuer Branch ohne Eltern-Commit"
 
-#: builtin/checkout.c:1526 builtin/merge.c:300
+#: builtin/checkout.c:1525 builtin/merge.c:301
 msgid "update ignored files (default)"
 msgstr "ignorierte Dateien aktualisieren (Standard)"
 
-#: builtin/checkout.c:1529
+#: builtin/checkout.c:1528
 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:1542
+#: builtin/checkout.c:1541
 msgid "checkout our version for unmerged files"
 msgstr "unsere Variante für nicht zusammengeführte Dateien auschecken"
 
-#: builtin/checkout.c:1545
+#: builtin/checkout.c:1544
 msgid "checkout their version for unmerged files"
 msgstr "ihre Variante für nicht zusammengeführte Dateien auschecken"
 
-#: builtin/checkout.c:1549
+#: builtin/checkout.c:1548
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "keine Einschränkung bei Pfadspezifikationen zum partiellen Auschecken"
 
-#: builtin/checkout.c:1604
+#: builtin/checkout.c:1603
 #, c-format
 msgid "-%c, -%c and --orphan are mutually exclusive"
-msgstr "die Optionen -%c, -%c und --orphan schließen sich gegenseitig aus"
+msgstr "-%c, -%c und --orphan schließen sich gegenseitig aus"
 
-#: builtin/checkout.c:1608
+#: builtin/checkout.c:1607
 msgid "-p and --overlay are mutually exclusive"
-msgstr "-p und --overlay schließen sich gegenseitig aus."
+msgstr "-p und --overlay schließen sich gegenseitig aus"
 
-#: builtin/checkout.c:1645
+#: builtin/checkout.c:1644
 msgid "--track needs a branch name"
-msgstr "Bei der Option --track muss ein Branchname angegeben werden."
+msgstr "--track benötigt ein Branchname"
 
-#: builtin/checkout.c:1650
+#: builtin/checkout.c:1649
 #, c-format
 msgid "missing branch name; try -%c"
 msgstr "kein Branchname; versuchen Sie -%c"
 
-#: builtin/checkout.c:1682
+#: builtin/checkout.c:1681
 #, c-format
 msgid "could not resolve %s"
-msgstr "Konnte %s nicht auflösen."
+msgstr "konnte %s nicht auflösen"
 
-#: builtin/checkout.c:1698
+#: builtin/checkout.c:1697
 msgid "invalid path specification"
 msgstr "ungültige Pfadspezifikation"
 
-#: builtin/checkout.c:1705
+#: builtin/checkout.c:1704
 #, c-format
 msgid "'%s' is not a commit and a branch '%s' cannot be created from it"
 msgstr ""
 "'%s' ist kein Commit und es kann kein Branch '%s' aus diesem erstellt werden."
 
-#: builtin/checkout.c:1709
+#: builtin/checkout.c:1708
 #, 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:1718
+#: builtin/checkout.c:1717
 msgid "--pathspec-from-file is incompatible with --detach"
-msgstr "Die Optionen --pathspec-from-file und --detach sind inkompatibel."
+msgstr "--pathspec-from-file und --detach sind inkompatibel"
 
-#: builtin/checkout.c:1721 builtin/reset.c:325 builtin/stash.c:1499
+#: builtin/checkout.c:1720 builtin/reset.c:325 builtin/stash.c:1566
 msgid "--pathspec-from-file is incompatible with --patch"
-msgstr "Die Optionen --pathspec-from-file und --patch sind inkompatibel."
+msgstr "--pathspec-from-file und --patch sind inkompatibel"
 
-#: builtin/checkout.c:1734
+#: builtin/checkout.c:1733
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -12355,70 +12631,70 @@
 "git checkout: --ours/--theirs, --force und --merge sind inkompatibel wenn\n"
 "Sie aus dem Index auschecken."
 
-#: builtin/checkout.c:1739
+#: builtin/checkout.c:1738
 msgid "you must specify path(s) to restore"
 msgstr "Sie müssen Pfad(e) zur Wiederherstellung angeben."
 
-#: builtin/checkout.c:1765 builtin/checkout.c:1767 builtin/checkout.c:1816
-#: builtin/checkout.c:1818 builtin/clone.c:122 builtin/remote.c:170
-#: builtin/remote.c:172 builtin/submodule--helper.c:2719 builtin/worktree.c:554
-#: builtin/worktree.c:556
+#: builtin/checkout.c:1764 builtin/checkout.c:1766 builtin/checkout.c:1815
+#: builtin/checkout.c:1817 builtin/clone.c:122 builtin/remote.c:170
+#: builtin/remote.c:172 builtin/submodule--helper.c:2719 builtin/worktree.c:482
+#: builtin/worktree.c:484
 msgid "branch"
 msgstr "Branch"
 
-#: builtin/checkout.c:1766
+#: builtin/checkout.c:1765
 msgid "create and checkout a new branch"
 msgstr "einen neuen Branch erzeugen und auschecken"
 
-#: builtin/checkout.c:1768
+#: builtin/checkout.c:1767
 msgid "create/reset and checkout a branch"
 msgstr "einen Branch erstellen/umsetzen und auschecken"
 
-#: builtin/checkout.c:1769
+#: builtin/checkout.c:1768
 msgid "create reflog for new branch"
 msgstr "das Reflog für den neuen Branch erzeugen"
 
-#: builtin/checkout.c:1771
+#: builtin/checkout.c:1770
 msgid "second guess 'git checkout <no-such-branch>' (default)"
 msgstr "Zweite Vermutung 'git checkout <kein-solcher-Branch>' (Standard)"
 
-#: builtin/checkout.c:1772
+#: builtin/checkout.c:1771
 msgid "use overlay mode (default)"
 msgstr "benutze Overlay-Modus (Standard)"
 
-#: builtin/checkout.c:1817
+#: builtin/checkout.c:1816
 msgid "create and switch to a new branch"
 msgstr "einen neuen Branch erzeugen und dahin wechseln"
 
-#: builtin/checkout.c:1819
+#: builtin/checkout.c:1818
 msgid "create/reset and switch to a branch"
 msgstr "einen Branch erstellen/umsetzen und dahin wechseln"
 
-#: builtin/checkout.c:1821
+#: builtin/checkout.c:1820
 msgid "second guess 'git switch <no-such-branch>'"
 msgstr "Zweite Vermutung 'git switch <kein-solcher-Branch>'"
 
-#: builtin/checkout.c:1823
+#: builtin/checkout.c:1822
 msgid "throw away local modifications"
 msgstr "lokale Änderungen verwerfen"
 
-#: builtin/checkout.c:1857
+#: builtin/checkout.c:1856
 msgid "which tree-ish to checkout from"
 msgstr "Von welcher Commit-Referenz ausgecheckt werden soll"
 
-#: builtin/checkout.c:1859
+#: builtin/checkout.c:1858
 msgid "restore the index"
 msgstr "Index wiederherstellen"
 
-#: builtin/checkout.c:1861
+#: builtin/checkout.c:1860
 msgid "restore the working tree (default)"
 msgstr "das Arbeitsverzeichnis wiederherstellen (Standard)"
 
-#: builtin/checkout.c:1863
+#: builtin/checkout.c:1862
 msgid "ignore unmerged entries"
 msgstr "ignoriere nicht zusammengeführte Einträge"
 
-#: builtin/checkout.c:1864
+#: builtin/checkout.c:1863
 msgid "use overlay mode"
 msgstr "benutze Overlay-Modus"
 
@@ -12563,8 +12839,8 @@
 msgstr "ganze Verzeichnisse löschen"
 
 #: builtin/clean.c:909 builtin/describe.c:565 builtin/describe.c:567
-#: builtin/grep.c:921 builtin/log.c:183 builtin/log.c:185
-#: builtin/ls-files.c:558 builtin/name-rev.c:526 builtin/name-rev.c:528
+#: builtin/grep.c:922 builtin/log.c:184 builtin/log.c:186
+#: builtin/ls-files.c:573 builtin/name-rev.c:526 builtin/name-rev.c:528
 #: builtin/show-ref.c:179
 msgid "pattern"
 msgstr "Muster"
@@ -12599,7 +12875,7 @@
 
 #: builtin/clean.c:944
 msgid "-x and -X cannot be used together"
-msgstr "Die Optionen -x und -X können nicht gemeinsam verwendet werden."
+msgstr "-x und -X können nicht gemeinsam verwendet werden"
 
 #: builtin/clone.c:45
 msgid "git clone [<options>] [--] <repo> [<dir>]"
@@ -12660,7 +12936,7 @@
 msgstr "--reference nur während des Klonens benutzen"
 
 #: builtin/clone.c:120 builtin/column.c:27 builtin/init-db.c:563
-#: builtin/merge-file.c:46 builtin/pack-objects.c:3546 builtin/repack.c:358
+#: builtin/merge-file.c:46 builtin/pack-objects.c:3561 builtin/repack.c:357
 msgid "name"
 msgstr "Name"
 
@@ -12676,7 +12952,7 @@
 msgid "path to git-upload-pack on the remote"
 msgstr "Pfad zu \"git-upload-pack\" auf der Gegenseite"
 
-#: builtin/clone.c:126 builtin/fetch.c:173 builtin/grep.c:860
+#: builtin/clone.c:126 builtin/fetch.c:176 builtin/grep.c:861
 #: builtin/pull.c:208
 msgid "depth"
 msgstr "Tiefe"
@@ -12686,7 +12962,7 @@
 msgstr ""
 "einen Klon mit unvollständiger Historie (shallow) in dieser Tiefe erstellen"
 
-#: builtin/clone.c:128 builtin/fetch.c:175 builtin/pack-objects.c:3535
+#: builtin/clone.c:128 builtin/fetch.c:178 builtin/pack-objects.c:3550
 #: builtin/pull.c:211
 msgid "time"
 msgstr "Zeit"
@@ -12698,12 +12974,12 @@
 "Zeit\n"
 "erstellen"
 
-#: builtin/clone.c:130 builtin/fetch.c:177 builtin/fetch.c:200
-#: builtin/pull.c:214 builtin/pull.c:239 builtin/rebase.c:1317
+#: builtin/clone.c:130 builtin/fetch.c:180 builtin/fetch.c:203
+#: builtin/pull.c:214 builtin/pull.c:239 builtin/rebase.c:1323
 msgid "revision"
 msgstr "Commit"
 
-#: builtin/clone.c:131 builtin/fetch.c:178 builtin/pull.c:215
+#: builtin/clone.c:131 builtin/fetch.c:181 builtin/pull.c:215
 msgid "deepen history of shallow clone, excluding rev"
 msgstr ""
 "die Historie eines Klons mit unvollständiger Historie (shallow) mittels\n"
@@ -12738,22 +13014,22 @@
 msgid "set config inside the new repository"
 msgstr "Konfiguration innerhalb des neuen Repositories setzen"
 
-#: builtin/clone.c:143 builtin/fetch.c:195 builtin/ls-remote.c:76
+#: builtin/clone.c:143 builtin/fetch.c:198 builtin/ls-remote.c:77
 #: builtin/pull.c:230 builtin/push.c:584 builtin/send-pack.c:196
 msgid "server-specific"
 msgstr "serverspezifisch"
 
-#: builtin/clone.c:143 builtin/fetch.c:195 builtin/ls-remote.c:76
+#: builtin/clone.c:143 builtin/fetch.c:198 builtin/ls-remote.c:77
 #: builtin/pull.c:231 builtin/push.c:584 builtin/send-pack.c:197
 msgid "option to transmit"
 msgstr "Option übertragen"
 
-#: builtin/clone.c:144 builtin/fetch.c:196 builtin/pull.c:234
+#: builtin/clone.c:144 builtin/fetch.c:199 builtin/pull.c:234
 #: builtin/push.c:585
 msgid "use IPv4 addresses only"
 msgstr "nur IPv4-Adressen benutzen"
 
-#: builtin/clone.c:146 builtin/fetch.c:198 builtin/pull.c:237
+#: builtin/clone.c:146 builtin/fetch.c:201 builtin/pull.c:237
 #: builtin/push.c:587
 msgid "use IPv6 addresses only"
 msgstr "nur IPv6-Adressen benutzen"
@@ -12857,71 +13133,71 @@
 msgid "cannot unlink temporary alternates file"
 msgstr "Kann temporäre \"alternates\"-Datei nicht entfernen"
 
-#: builtin/clone.c:992 builtin/receive-pack.c:2493
+#: builtin/clone.c:993 builtin/receive-pack.c:2493
 msgid "Too many arguments."
 msgstr "Zu viele Argumente."
 
-#: builtin/clone.c:996
+#: builtin/clone.c:997
 msgid "You must specify a repository to clone."
 msgstr "Sie müssen ein Repository zum Klonen angeben."
 
-#: builtin/clone.c:1009
+#: builtin/clone.c:1010
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
-msgstr "Die Optionen --bare und --origin %s sind inkompatibel."
+msgstr "--bare und --origin %s sind inkompatibel."
 
-#: builtin/clone.c:1012
+#: builtin/clone.c:1013
 msgid "--bare and --separate-git-dir are incompatible."
-msgstr "Die Optionen --bare und --separate-git-dir sind inkompatibel."
+msgstr "--bare und --separate-git-dir sind inkompatibel."
 
-#: builtin/clone.c:1025
+#: builtin/clone.c:1026
 #, c-format
 msgid "repository '%s' does not exist"
-msgstr "Repository '%s' existiert nicht."
+msgstr "Repository '%s' existiert nicht"
 
-#: builtin/clone.c:1029 builtin/fetch.c:1841
+#: builtin/clone.c:1030 builtin/fetch.c:1951
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "Tiefe %s ist keine positive Zahl"
 
-#: builtin/clone.c:1039
+#: builtin/clone.c:1040
 #, 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:1045
+#: builtin/clone.c:1046
 #, c-format
 msgid "repository path '%s' already exists and is not an empty directory."
 msgstr ""
 "Pfad des Repositories '%s' existiert bereits und ist kein leeres Verzeichnis."
 
-#: builtin/clone.c:1059
+#: builtin/clone.c:1060
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "Arbeitsverzeichnis '%s' existiert bereits."
 
-#: builtin/clone.c:1074 builtin/clone.c:1095 builtin/difftool.c:271
-#: builtin/log.c:1987 builtin/worktree.c:354 builtin/worktree.c:386
+#: builtin/clone.c:1075 builtin/clone.c:1096 builtin/difftool.c:271
+#: builtin/log.c:1986 builtin/worktree.c:282 builtin/worktree.c:314
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "Konnte führende Verzeichnisse von '%s' nicht erstellen."
 
-#: builtin/clone.c:1079
+#: builtin/clone.c:1080
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "Konnte Arbeitsverzeichnis '%s' nicht erstellen"
 
-#: builtin/clone.c:1099
+#: builtin/clone.c:1100
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Klone in Bare-Repository '%s' ...\n"
 
-#: builtin/clone.c:1101
+#: builtin/clone.c:1102
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Klone nach '%s' ...\n"
 
-#: builtin/clone.c:1125
+#: builtin/clone.c:1126
 msgid ""
 "clone --recursive is not compatible with both --reference and --reference-if-"
 "able"
@@ -12929,50 +13205,51 @@
 "'clone --recursive' ist nicht kompatibel mit --reference und --reference-if-"
 "able"
 
-#: builtin/clone.c:1169 builtin/remote.c:200 builtin/remote.c:705
+#: builtin/clone.c:1170 builtin/remote.c:200 builtin/remote.c:705
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "'%s' ist kein gültiger Name für ein Remote-Repository"
 
-#: builtin/clone.c:1210
+#: builtin/clone.c:1211
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
-"Die Option --depth wird in lokalen Klonen ignoriert; benutzen Sie "
-"stattdessen file://"
+"--depth wird in lokalen Klonen ignoriert; benutzen Sie stattdessen \"file://"
+"\"."
 
-#: builtin/clone.c:1212
+#: builtin/clone.c:1213
 msgid "--shallow-since is ignored in local clones; use file:// instead."
 msgstr ""
 "--shallow-since wird in lokalen Klonen ignoriert; benutzen Sie stattdessen "
-"file://"
+"\"file://\"."
 
-#: builtin/clone.c:1214
+#: builtin/clone.c:1215
 msgid "--shallow-exclude is ignored in local clones; use file:// instead."
 msgstr ""
 "--shallow-exclude wird in lokalen Klonen ignoriert; benutzen Sie stattdessen "
-"file://"
+"\"file://\"."
 
-#: builtin/clone.c:1216
+#: builtin/clone.c:1217
 msgid "--filter is ignored in local clones; use file:// instead."
 msgstr ""
-"--filter wird in lokalen Klonen ignoriert; benutzen Sie stattdessen file://"
+"--filter wird in lokalen Klonen ignoriert; benutzen Sie stattdessen \"file://"
+"\"."
 
-#: builtin/clone.c:1219
+#: builtin/clone.c:1220
 msgid "source repository is shallow, ignoring --local"
 msgstr ""
 "Quelle ist ein Repository mit unvollständiger Historie (shallow),\n"
 "ignoriere --local"
 
-#: builtin/clone.c:1224
+#: builtin/clone.c:1225
 msgid "--local is ignored"
 msgstr "--local wird ignoriert"
 
-#: builtin/clone.c:1311 builtin/clone.c:1319
+#: builtin/clone.c:1315 builtin/clone.c:1323
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Remote-Branch %s nicht im Upstream-Repository %s gefunden"
 
-#: builtin/clone.c:1322
+#: builtin/clone.c:1326
 msgid "You appear to have cloned an empty repository."
 msgstr "Sie scheinen ein leeres Repository geklont zu haben."
 
@@ -13006,7 +13283,7 @@
 
 #: builtin/column.c:51
 msgid "--command must be the first argument"
-msgstr "Die Option --command muss an erster Stelle stehen."
+msgstr "--command muss an erster Stelle stehen"
 
 #: builtin/commit-graph.c:13 builtin/commit-graph.c:22
 msgid ""
@@ -13031,14 +13308,14 @@
 msgstr "konnte Objekt-Verzeichnis nicht finden, dass '%s' entsprechen soll"
 
 #: builtin/commit-graph.c:80 builtin/commit-graph.c:210
-#: builtin/commit-graph.c:316 builtin/fetch.c:184 builtin/log.c:1769
+#: builtin/commit-graph.c:316 builtin/fetch.c:187 builtin/log.c:1768
 msgid "dir"
 msgstr "Verzeichnis"
 
 #: builtin/commit-graph.c:81 builtin/commit-graph.c:211
 #: builtin/commit-graph.c:317
-msgid "The object directory to store the graph"
-msgstr "Das Objektverzeichnis zum Speichern des Graphen."
+msgid "the object directory to store the graph"
+msgstr "das Objektverzeichnis zum Speichern des Graphen"
 
 #: builtin/commit-graph.c:83
 msgid "if the commit-graph is split, only verify the tip file"
@@ -13132,7 +13409,7 @@
 msgid "duplicate parent %s ignored"
 msgstr "doppelter Vorgänger %s ignoriert"
 
-#: builtin/commit-tree.c:56 builtin/commit-tree.c:136 builtin/log.c:555
+#: builtin/commit-tree.c:56 builtin/commit-tree.c:136 builtin/log.c:557
 #, c-format
 msgid "not a valid object name %s"
 msgstr "Kein gültiger Objektname: %s"
@@ -13160,9 +13437,9 @@
 msgid "id of a parent commit object"
 msgstr "ID eines Eltern-Commit-Objektes."
 
-#: builtin/commit-tree.c:114 builtin/commit.c:1504 builtin/merge.c:281
-#: builtin/notes.c:409 builtin/notes.c:575 builtin/stash.c:1470
-#: builtin/tag.c:413
+#: builtin/commit-tree.c:114 builtin/commit.c:1504 builtin/merge.c:282
+#: builtin/notes.c:409 builtin/notes.c:575 builtin/stash.c:1537
+#: builtin/tag.c:445
 msgid "message"
 msgstr "Beschreibung"
 
@@ -13174,7 +13451,7 @@
 msgid "read commit log message from file"
 msgstr "Commit-Beschreibung von Datei lesen"
 
-#: builtin/commit-tree.c:121 builtin/commit.c:1516 builtin/merge.c:298
+#: builtin/commit-tree.c:121 builtin/commit.c:1516 builtin/merge.c:299
 #: builtin/pull.c:176 builtin/revert.c:118
 msgid "GPG sign commit"
 msgstr "Commit mit GPG signieren"
@@ -13330,7 +13607,7 @@
 msgid "could not lookup commit %s"
 msgstr "Konnte Commit %s nicht nachschlagen"
 
-#: builtin/commit.c:729 builtin/shortlog.c:425
+#: builtin/commit.c:729 builtin/shortlog.c:413
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(lese Log-Nachricht von Standard-Eingabe)\n"
@@ -13430,7 +13707,7 @@
 msgid "Error building trees"
 msgstr "Fehler beim Erzeugen der \"Tree\"-Objekte"
 
-#: builtin/commit.c:1011 builtin/tag.c:276
+#: builtin/commit.c:1011 builtin/tag.c:308
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr ""
@@ -13455,13 +13732,11 @@
 
 #: builtin/commit.c:1127
 msgid "--long and -z are incompatible"
-msgstr "Die Optionen --long und -z sind inkompatibel."
+msgstr "--long und -z sind inkompatibel"
 
 #: builtin/commit.c:1171
 msgid "Using both --reset-author and --author does not make sense"
-msgstr ""
-"Die Optionen --reset-author und --author können nicht gemeinsam verwendet "
-"werden."
+msgstr "--reset-author und --author können nicht gemeinsam verwendet werden"
 
 #: builtin/commit.c:1180
 msgid "You have nothing to amend."
@@ -13482,7 +13757,7 @@
 #: builtin/commit.c:1190
 msgid "Options --squash and --fixup cannot be used together"
 msgstr ""
-"Die Optionen --squash und --fixup können nicht gemeinsam verwendet werden."
+"Die Optionen --squash und --fixup können nicht gemeinsam verwendet werden"
 
 #: builtin/commit.c:1200
 msgid "Only one of -c/-C/-F/--fixup can be used."
@@ -13494,8 +13769,7 @@
 
 #: builtin/commit.c:1211
 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."
+msgstr "--reset--author kann nur mit -C, -c oder --amend verwendet werden"
 
 #: builtin/commit.c:1229
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
@@ -13529,7 +13803,7 @@
 msgstr "Version"
 
 #: builtin/commit.c:1374 builtin/commit.c:1533 builtin/push.c:560
-#: builtin/worktree.c:725
+#: builtin/worktree.c:679
 msgid "machine-readable output"
 msgstr "maschinenlesbare Ausgabe"
 
@@ -13543,7 +13817,7 @@
 
 #: builtin/commit.c:1382 builtin/commit.c:1386 builtin/commit.c:1541
 #: builtin/fast-export.c:1198 builtin/fast-export.c:1201
-#: builtin/fast-export.c:1204 builtin/rebase.c:1406 parse-options.h:336
+#: builtin/fast-export.c:1204 builtin/rebase.c:1412 parse-options.h:336
 msgid "mode"
 msgstr "Modus"
 
@@ -13602,7 +13876,7 @@
 msgid "Commit message options"
 msgstr "Optionen für Commit-Beschreibung"
 
-#: builtin/commit.c:1501 builtin/merge.c:285 builtin/tag.c:415
+#: builtin/commit.c:1501 builtin/merge.c:286 builtin/tag.c:447
 msgid "read message from file"
 msgstr "Beschreibung von Datei lesen"
 
@@ -13614,7 +13888,7 @@
 msgid "override author for commit"
 msgstr "Autor eines Commits überschreiben"
 
-#: builtin/commit.c:1503 builtin/gc.c:542
+#: builtin/commit.c:1503 builtin/gc.c:550
 msgid "date"
 msgstr "Datum"
 
@@ -13623,7 +13897,7 @@
 msgstr "Datum eines Commits überschreiben"
 
 #: builtin/commit.c:1505 builtin/commit.c:1506 builtin/commit.c:1507
-#: builtin/commit.c:1508 parse-options.h:328 ref-filter.h:87
+#: builtin/commit.c:1508 parse-options.h:328 ref-filter.h:90
 msgid "commit"
 msgstr "Commit"
 
@@ -13651,7 +13925,7 @@
 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:1510 builtin/log.c:1744 builtin/merge.c:301
+#: builtin/commit.c:1510 builtin/log.c:1743 builtin/merge.c:302
 #: builtin/pull.c:145 builtin/revert.c:110
 msgid "add a Signed-off-by trailer"
 msgstr "eine Signed-off-by Zeile hinzufügen"
@@ -14079,7 +14353,7 @@
 #: builtin/config.c:943 builtin/config.c:954
 #, c-format
 msgid "no such section: %s"
-msgstr "Keine solche Sektion: %s"
+msgstr "Sektion nicht gefunden: %s"
 
 #: builtin/count-objects.c:90
 msgid "git count-objects [-v] [-H | --human-readable]"
@@ -14278,7 +14552,7 @@
 
 #: builtin/describe.c:593
 msgid "--long is incompatible with --abbrev=0"
-msgstr "Die Optionen --long und --abbrev=0 sind inkompatibel."
+msgstr "--long und --abbrev=0 sind inkompatibel"
 
 #: builtin/describe.c:622
 msgid "No names found, cannot describe anything."
@@ -14286,11 +14560,11 @@
 
 #: builtin/describe.c:673
 msgid "--dirty is incompatible with commit-ishes"
-msgstr "Die Option --dirty kann nicht mit Commits verwendet werden."
+msgstr "--dirty kann nicht mit Commits verwendet werden"
 
 #: builtin/describe.c:675
 msgid "--broken is incompatible with commit-ishes"
-msgstr "Die Option --broken kann nicht mit Commits verwendet werden."
+msgstr "--broken kann nicht mit Commits verwendet werden"
 
 #: builtin/diff-tree.c:155
 msgid "--stdin and --merge-base are mutually exclusive"
@@ -14300,41 +14574,41 @@
 msgid "--merge-base only works with two commits"
 msgstr "--merge-base funktioniert nur mit zwei Commits"
 
-#: builtin/diff.c:91
+#: builtin/diff.c:92
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s': keine reguläre Datei oder symbolische Verknüpfung"
 
-#: builtin/diff.c:258
+#: builtin/diff.c:259
 #, c-format
 msgid "invalid option: %s"
 msgstr "Ungültige Option: %s"
 
-#: builtin/diff.c:375
+#: builtin/diff.c:376
 #, c-format
 msgid "%s...%s: no merge base"
 msgstr "%s...%s: keine Merge-Basis"
 
-#: builtin/diff.c:485
+#: builtin/diff.c:486
 msgid "Not a git repository"
 msgstr "Kein Git-Repository"
 
-#: builtin/diff.c:530 builtin/grep.c:681
+#: builtin/diff.c:532 builtin/grep.c:682
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "Objekt '%s' ist ungültig."
 
-#: builtin/diff.c:541
+#: builtin/diff.c:543
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "Mehr als zwei Blobs angegeben: '%s'"
 
-#: builtin/diff.c:546
+#: builtin/diff.c:548
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "unbehandeltes Objekt '%s' angegeben"
 
-#: builtin/diff.c:580
+#: builtin/diff.c:582
 #, c-format
 msgid "%s...%s: multiple merge bases, using %s"
 msgstr "%s...%s: mehrere Merge-Basen, nutze %s"
@@ -14391,7 +14665,7 @@
 
 #: builtin/difftool.c:696
 msgid "use `diff.guitool` instead of `diff.tool`"
-msgstr "`diff.guitool` anstatt `diff.tool` benutzen"
+msgstr "`diff.guitool` statt `diff.tool` benutzen"
 
 #: builtin/difftool.c:698
 msgid "perform a full-directory diff"
@@ -14519,39 +14793,39 @@
 "Auswählen der Behandlung von Commit-Beschreibungen bei wechselndem Encoding"
 
 #: builtin/fast-export.c:1208
-msgid "Dump marks to this file"
+msgid "dump marks to this file"
 msgstr "Markierungen in diese Datei schreiben"
 
 #: builtin/fast-export.c:1210
-msgid "Import marks from this file"
+msgid "import marks from this file"
 msgstr "Markierungen von dieser Datei importieren"
 
 #: builtin/fast-export.c:1214
-msgid "Import marks from this file if it exists"
+msgid "import marks from this file if it exists"
 msgstr "Markierungen von dieser Datei importieren, wenn diese existiert"
 
 #: builtin/fast-export.c:1216
-msgid "Fake a tagger when tags lack one"
-msgstr "künstlich einen Tag-Ersteller erzeugen, wenn das Tag keinen hat"
+msgid "fake a tagger when tags lack one"
+msgstr "einen Tag-Ersteller vortäuschen, wenn das Tag keinen hat"
 
 #: builtin/fast-export.c:1218
-msgid "Output full tree for each commit"
+msgid "output full tree for each commit"
 msgstr "für jeden Commit das gesamte Verzeichnis ausgeben"
 
 #: builtin/fast-export.c:1220
-msgid "Use the done feature to terminate the stream"
+msgid "use the done feature to terminate the stream"
 msgstr "die \"done\"-Funktion benutzen, um den Datenstrom abzuschließen"
 
 #: builtin/fast-export.c:1221
-msgid "Skip output of blob data"
+msgid "skip output of blob data"
 msgstr "Ausgabe von Blob-Daten überspringen"
 
-#: builtin/fast-export.c:1222 builtin/log.c:1816
+#: builtin/fast-export.c:1222 builtin/log.c:1815
 msgid "refspec"
 msgstr "Refspec"
 
 #: builtin/fast-export.c:1223
-msgid "Apply refspec to exported refs"
+msgid "apply refspec to exported refs"
 msgstr "Refspec auf exportierte Referenzen anwenden"
 
 #: builtin/fast-export.c:1224
@@ -14567,17 +14841,17 @@
 msgstr "konvertiere <von> zu <nach> in anonymisierter Ausgabe"
 
 #: builtin/fast-export.c:1229
-msgid "Reference parents which are not in fast-export stream by object id"
+msgid "reference parents which are not in fast-export stream by object id"
 msgstr ""
 "Eltern, die nicht im Fast-Export-Stream sind, anhand ihrer Objekt-ID "
 "referenzieren"
 
 #: builtin/fast-export.c:1231
-msgid "Show original object ids of blobs/commits"
+msgid "show original object ids of blobs/commits"
 msgstr "originale Objekt-IDs von Blobs/Commits anzeigen"
 
 #: builtin/fast-export.c:1233
-msgid "Label tags with mark ids"
+msgid "label tags with mark ids"
 msgstr "Tags mit Markierungs-IDs beschriften"
 
 #: builtin/fast-export.c:1256
@@ -14619,7 +14893,7 @@
 msgid "feature '%s' forbidden in input without --allow-unsafe-features"
 msgstr "Feature '%s' verboten in Eingabe ohne Option --allow-unsafe-features"
 
-#: builtin/fetch-pack.c:241
+#: builtin/fetch-pack.c:242
 #, c-format
 msgid "Lockfile created but not reported: %s"
 msgstr "Lock-Datei erstellt, aber nicht gemeldet: %s"
@@ -14640,100 +14914,104 @@
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<Optionen>]"
 
-#: builtin/fetch.c:119
+#: builtin/fetch.c:120
 msgid "fetch.parallel cannot be negative"
 msgstr "fetch.parallel kann nicht negativ sein"
 
-#: builtin/fetch.c:142 builtin/pull.c:185
+#: builtin/fetch.c:143 builtin/pull.c:185
 msgid "fetch from all remotes"
 msgstr "fordert von allen Remote-Repositories an"
 
-#: builtin/fetch.c:144 builtin/pull.c:245
+#: builtin/fetch.c:145 builtin/pull.c:245
 msgid "set upstream for git pull/fetch"
 msgstr "Upstream für \"git pull/fetch\" setzen"
 
-#: builtin/fetch.c:146 builtin/pull.c:188
+#: builtin/fetch.c:147 builtin/pull.c:188
 msgid "append to .git/FETCH_HEAD instead of overwriting"
-msgstr "an .git/FETCH_HEAD anhängen, anstatt zu überschreiben"
+msgstr "an .git/FETCH_HEAD anhängen statt zu überschreiben"
 
-#: builtin/fetch.c:148 builtin/pull.c:191
+#: builtin/fetch.c:149
+msgid "use atomic transaction to update references"
+msgstr "atomare Transaktionen nutzen, um Referenzen zu aktualisieren"
+
+#: builtin/fetch.c:151 builtin/pull.c:191
 msgid "path to upload pack on remote end"
 msgstr "Pfad des Programms zum Hochladen von Paketen auf der Gegenseite"
 
-#: builtin/fetch.c:149
+#: builtin/fetch.c:152
 msgid "force overwrite of local reference"
 msgstr "das Überschreiben einer lokalen Referenz erzwingen"
 
-#: builtin/fetch.c:151
+#: builtin/fetch.c:154
 msgid "fetch from multiple remotes"
 msgstr "von mehreren Remote-Repositories anfordern"
 
-#: builtin/fetch.c:153 builtin/pull.c:195
+#: builtin/fetch.c:156 builtin/pull.c:195
 msgid "fetch all tags and associated objects"
 msgstr "alle Tags und verbundene Objekte anfordern"
 
-#: builtin/fetch.c:155
+#: builtin/fetch.c:158
 msgid "do not fetch all tags (--no-tags)"
 msgstr "nicht alle Tags anfordern (--no-tags)"
 
-#: builtin/fetch.c:157
+#: builtin/fetch.c:160
 msgid "number of submodules fetched in parallel"
 msgstr "Anzahl der parallel anzufordernden Submodule"
 
-#: builtin/fetch.c:159 builtin/pull.c:198
+#: builtin/fetch.c:162 builtin/pull.c:198
 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:161
+#: builtin/fetch.c:164
 msgid "prune local tags no longer on remote and clobber changed tags"
 msgstr ""
 "lokale Tags entfernen, die sich nicht mehr im Remote-Repository befinden, "
 "und geänderte Tags aktualisieren"
 
-#: builtin/fetch.c:162 builtin/fetch.c:187 builtin/pull.c:122
+#: builtin/fetch.c:165 builtin/fetch.c:190 builtin/pull.c:122
 msgid "on-demand"
 msgstr "bei-Bedarf"
 
-#: builtin/fetch.c:163
+#: builtin/fetch.c:166
 msgid "control recursive fetching of submodules"
 msgstr "rekursive Anforderungen von Submodulen kontrollieren"
 
-#: builtin/fetch.c:168
+#: builtin/fetch.c:171
 msgid "write fetched references to the FETCH_HEAD file"
 msgstr "schreibe angeforderte Referenzen in die FETCH_HEAD-Datei"
 
-#: builtin/fetch.c:169 builtin/pull.c:206
+#: builtin/fetch.c:172 builtin/pull.c:206
 msgid "keep downloaded pack"
 msgstr "heruntergeladenes Paket behalten"
 
-#: builtin/fetch.c:171
+#: builtin/fetch.c:174
 msgid "allow updating of HEAD ref"
 msgstr "Aktualisierung der \"HEAD\"-Referenz erlauben"
 
-#: builtin/fetch.c:174 builtin/fetch.c:180 builtin/pull.c:209
+#: builtin/fetch.c:177 builtin/fetch.c:183 builtin/pull.c:209
 #: builtin/pull.c:218
 msgid "deepen history of shallow clone"
 msgstr ""
 "die Historie eines Klons mit unvollständiger Historie (shallow) vertiefen"
 
-#: builtin/fetch.c:176 builtin/pull.c:212
+#: builtin/fetch.c:179 builtin/pull.c:212
 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:182 builtin/pull.c:221
+#: builtin/fetch.c:185 builtin/pull.c:221
 msgid "convert to a complete repository"
 msgstr "zu einem vollständigen Repository konvertieren"
 
-#: builtin/fetch.c:185
+#: builtin/fetch.c:188
 msgid "prepend this to submodule path output"
 msgstr "dies an die Ausgabe der Submodul-Pfade voranstellen"
 
-#: builtin/fetch.c:188
+#: builtin/fetch.c:191
 msgid ""
 "default for recursive fetching of submodules (lower priority than config "
 "files)"
@@ -14741,100 +15019,100 @@
 "Standard für die rekursive Anforderung von Submodulen (geringere Priorität\n"
 "als Konfigurationsdateien)"
 
-#: builtin/fetch.c:192 builtin/pull.c:224
+#: builtin/fetch.c:195 builtin/pull.c:224
 msgid "accept refs that update .git/shallow"
 msgstr "Referenzen, die .git/shallow aktualisieren, akzeptieren"
 
-#: builtin/fetch.c:193 builtin/pull.c:226
+#: builtin/fetch.c:196 builtin/pull.c:226
 msgid "refmap"
 msgstr "Refmap"
 
-#: builtin/fetch.c:194 builtin/pull.c:227
+#: builtin/fetch.c:197 builtin/pull.c:227
 msgid "specify fetch refmap"
 msgstr "Refmap für 'fetch' angeben"
 
-#: builtin/fetch.c:201 builtin/pull.c:240
+#: builtin/fetch.c:204 builtin/pull.c:240
 msgid "report that we have only objects reachable from this object"
 msgstr ""
 "ausgeben, dass wir nur Objekte haben, die von diesem Objekt aus erreichbar "
 "sind"
 
-#: builtin/fetch.c:204 builtin/fetch.c:206
+#: builtin/fetch.c:207 builtin/fetch.c:209
 msgid "run 'maintenance --auto' after fetching"
 msgstr "führe 'maintenance --auto' nach \"fetch\" aus"
 
-#: builtin/fetch.c:208 builtin/pull.c:243
+#: builtin/fetch.c:211 builtin/pull.c:243
 msgid "check for forced-updates on all updated branches"
 msgstr "Prüfe auf erzwungene Aktualisierungen in allen aktualisierten Branches"
 
-#: builtin/fetch.c:210
+#: builtin/fetch.c:213
 msgid "write the commit-graph after fetching"
 msgstr "Schreibe den Commit-Graph nach \"fetch\""
 
-#: builtin/fetch.c:212
+#: builtin/fetch.c:215
 msgid "accept refspecs from stdin"
 msgstr "akzeptiere Refspecs von der Standard-Eingabe"
 
-#: builtin/fetch.c:523
+#: builtin/fetch.c:526
 msgid "Couldn't find remote ref HEAD"
 msgstr "Konnte Remote-Referenz von HEAD nicht finden."
 
-#: builtin/fetch.c:677
+#: builtin/fetch.c:697
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr "Konfiguration fetch.output enthält ungültigen Wert %s"
 
-#: builtin/fetch.c:775
+#: builtin/fetch.c:796
 #, c-format
 msgid "object %s not found"
 msgstr "Objekt %s nicht gefunden"
 
-#: builtin/fetch.c:779
+#: builtin/fetch.c:800
 msgid "[up to date]"
 msgstr "[aktuell]"
 
-#: builtin/fetch.c:792 builtin/fetch.c:808 builtin/fetch.c:880
+#: builtin/fetch.c:813 builtin/fetch.c:829 builtin/fetch.c:901
 msgid "[rejected]"
 msgstr "[zurückgewiesen]"
 
-#: builtin/fetch.c:793
+#: builtin/fetch.c:814
 msgid "can't fetch in current branch"
 msgstr "kann \"fetch\" im aktuellen Branch nicht ausführen"
 
-#: builtin/fetch.c:803
+#: builtin/fetch.c:824
 msgid "[tag update]"
 msgstr "[Tag Aktualisierung]"
 
-#: builtin/fetch.c:804 builtin/fetch.c:841 builtin/fetch.c:863
-#: builtin/fetch.c:875
+#: builtin/fetch.c:825 builtin/fetch.c:862 builtin/fetch.c:884
+#: builtin/fetch.c:896
 msgid "unable to update local ref"
 msgstr "kann lokale Referenz nicht aktualisieren"
 
-#: builtin/fetch.c:808
+#: builtin/fetch.c:829
 msgid "would clobber existing tag"
 msgstr "würde bestehende Tags verändern"
 
-#: builtin/fetch.c:830
+#: builtin/fetch.c:851
 msgid "[new tag]"
 msgstr "[neues Tag]"
 
-#: builtin/fetch.c:833
+#: builtin/fetch.c:854
 msgid "[new branch]"
 msgstr "[neuer Branch]"
 
-#: builtin/fetch.c:836
+#: builtin/fetch.c:857
 msgid "[new ref]"
 msgstr "[neue Referenz]"
 
-#: builtin/fetch.c:875
+#: builtin/fetch.c:896
 msgid "forced update"
 msgstr "Aktualisierung erzwungen"
 
-#: builtin/fetch.c:880
+#: builtin/fetch.c:901
 msgid "non-fast-forward"
 msgstr "kein Vorspulen"
 
-#: builtin/fetch.c:901
+#: builtin/fetch.c:1005
 msgid ""
 "Fetch normally indicates which branches had a forced update,\n"
 "but that check has been disabled. To re-enable, use '--show-forced-updates'\n"
@@ -14845,7 +15123,7 @@
 "aktivieren, nutzen Sie die Option '--show-forced-updated' oder führen\n"
 "Sie 'git config fetch.showForcedUpdates true' aus."
 
-#: builtin/fetch.c:905
+#: builtin/fetch.c:1009
 #, c-format
 msgid ""
 "It took %.2f seconds to check forced updates. You can use\n"
@@ -14858,12 +15136,12 @@
 "'git config fetch.showForcedUpdates false' ausführen, um diese Überprüfung\n"
 "zu umgehen.\n"
 
-#: builtin/fetch.c:939
+#: builtin/fetch.c:1041
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s hat nicht alle erforderlichen Objekte gesendet\n"
 
-#: builtin/fetch.c:960
+#: builtin/fetch.c:1069
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
@@ -14871,12 +15149,12 @@
 "unvollständiger\n"
 "Historie (shallow) nicht aktualisiert werden dürfen."
 
-#: builtin/fetch.c:1053 builtin/fetch.c:1191
+#: builtin/fetch.c:1146 builtin/fetch.c:1297
 #, c-format
 msgid "From %.*s\n"
 msgstr "Von %.*s\n"
 
-#: builtin/fetch.c:1064
+#: builtin/fetch.c:1168
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -14885,58 +15163,58 @@
 "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:1161
+#: builtin/fetch.c:1267
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s wird unreferenziert)"
 
-#: builtin/fetch.c:1162
+#: builtin/fetch.c:1268
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s wurde unreferenziert)"
 
-#: builtin/fetch.c:1194
+#: builtin/fetch.c:1300
 msgid "[deleted]"
 msgstr "[gelöscht]"
 
-#: builtin/fetch.c:1195 builtin/remote.c:1118
+#: builtin/fetch.c:1301 builtin/remote.c:1118
 msgid "(none)"
 msgstr "(nichts)"
 
-#: builtin/fetch.c:1218
+#: builtin/fetch.c:1324
 #, 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:1237
+#: builtin/fetch.c:1343
 #, 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:1240
+#: builtin/fetch.c:1346
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Option \"%s\" wird ignoriert für %s\n"
 
-#: builtin/fetch.c:1448
+#: builtin/fetch.c:1558
 msgid "multiple branches detected, incompatible with --set-upstream"
 msgstr "Mehrere Branches erkannt, inkompatibel mit --set-upstream"
 
-#: builtin/fetch.c:1463
+#: builtin/fetch.c:1573
 msgid "not setting upstream for a remote remote-tracking branch"
 msgstr "Setze keinen Upstream für einen entfernten Remote-Tracking-Branch."
 
-#: builtin/fetch.c:1465
+#: builtin/fetch.c:1575
 msgid "not setting upstream for a remote tag"
 msgstr "Setze keinen Upstream für einen Tag eines Remote-Repositories."
 
-#: builtin/fetch.c:1467
+#: builtin/fetch.c:1577
 msgid "unknown branch type"
 msgstr "Unbekannter Branch-Typ"
 
-#: builtin/fetch.c:1469
+#: builtin/fetch.c:1579
 msgid ""
 "no source branch found.\n"
 "you need to specify exactly one branch with the --set-upstream option."
@@ -14944,22 +15222,22 @@
 "Keinen Quell-Branch gefunden.\n"
 "Sie müssen bei der Option --set-upstream genau einen Branch angeben."
 
-#: builtin/fetch.c:1598 builtin/fetch.c:1661
+#: builtin/fetch.c:1708 builtin/fetch.c:1771
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Fordere an von %s\n"
 
-#: builtin/fetch.c:1608 builtin/fetch.c:1663 builtin/remote.c:101
+#: builtin/fetch.c:1718 builtin/fetch.c:1773 builtin/remote.c:101
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Konnte nicht von %s anfordern"
 
-#: builtin/fetch.c:1620
+#: builtin/fetch.c:1730
 #, c-format
 msgid "could not fetch '%s' (exit code: %d)\n"
 msgstr "Konnte '%s' nicht anfordern (Exit-Code: %d)\n"
 
-#: builtin/fetch.c:1724
+#: builtin/fetch.c:1834
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -14968,49 +15246,48 @@
 "oder den Namen des Remote-Repositories an, von welchem neue\n"
 "Commits angefordert werden sollen."
 
-#: builtin/fetch.c:1760
+#: builtin/fetch.c:1870
 msgid "You need to specify a tag name."
 msgstr "Sie müssen den Namen des Tags angeben."
 
-#: builtin/fetch.c:1825
+#: builtin/fetch.c:1935
 msgid "Negative depth in --deepen is not supported"
 msgstr "Negative Tiefe wird von --deepen nicht unterstützt."
 
-#: builtin/fetch.c:1827
+#: builtin/fetch.c:1937
 msgid "--deepen and --depth are mutually exclusive"
 msgstr "--deepen und --depth schließen sich gegenseitig aus"
 
-#: builtin/fetch.c:1832
+#: builtin/fetch.c:1942
 msgid "--depth and --unshallow cannot be used together"
-msgstr ""
-"Die Optionen --depth und --unshallow können nicht gemeinsam verwendet werden."
+msgstr "--depth und --unshallow können nicht gemeinsam verwendet werden"
 
-#: builtin/fetch.c:1834
+#: builtin/fetch.c:1944
 msgid "--unshallow on a complete repository does not make sense"
 msgstr ""
-"Die Option --unshallow kann nicht in einem Repository mit vollständiger "
-"Historie verwendet werden."
+"--unshallow kann nicht in einem Repository mit vollständiger Historie "
+"verwendet werden"
 
-#: builtin/fetch.c:1851
+#: builtin/fetch.c:1961
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all akzeptiert kein Repository als Argument"
 
-#: builtin/fetch.c:1853
+#: builtin/fetch.c:1963
 msgid "fetch --all does not make sense with refspecs"
-msgstr "fetch --all kann nicht mit Refspecs verwendet werden."
+msgstr "fetch --all kann nicht mit Refspecs verwendet werden"
 
-#: builtin/fetch.c:1862
+#: builtin/fetch.c:1972
 #, c-format
 msgid "No such remote or remote group: %s"
-msgstr "Kein Remote-Repository (einzeln oder Gruppe): %s"
+msgstr "Remote-Repository (einzeln oder Gruppe) nicht gefunden: %s"
 
-#: builtin/fetch.c:1869
+#: builtin/fetch.c:1979
 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"
 "von Refspecs verwendet werden."
 
-#: builtin/fetch.c:1887
+#: builtin/fetch.c:1997
 msgid ""
 "--filter can only be used with the remote configured in extensions."
 "partialclone"
@@ -15018,11 +15295,17 @@
 "--filter kann nur mit den Remote-Repositories verwendet werden,\n"
 "die in extensions.partialclone konfiguriert sind"
 
-#: builtin/fetch.c:1891
+#: builtin/fetch.c:2001
+msgid "--atomic can only be used when fetching from one remote"
+msgstr ""
+"--atomic kann nur verwendet werden, wenn nur von einem Remote-Repository "
+"abgefragt wird"
+
+#: builtin/fetch.c:2005
 msgid "--stdin can only be used when fetching from one remote"
 msgstr ""
-"die Option --stdin kann nur verwendet werden, wenn nur von einem Remote-\n"
-"Repository abgefragt wird"
+"--stdin kann nur verwendet werden, wenn nur von einem Remote-Repository "
+"abgefragt wird"
 
 #: builtin/fmt-merge-msg.c:7
 msgid ""
@@ -15087,7 +15370,7 @@
 msgid "show only <n> matched refs"
 msgstr "nur <n> passende Referenzen anzeigen"
 
-#: builtin/for-each-ref.c:39 builtin/tag.c:440
+#: builtin/for-each-ref.c:39 builtin/tag.c:472
 msgid "respect format colors"
 msgstr "Formatfarben beachten"
 
@@ -15127,32 +15410,32 @@
 msgid "missing --config=<config>"
 msgstr "Option --config=<Konfiguration> fehlt"
 
-#: builtin/fsck.c:69 builtin/fsck.c:148 builtin/fsck.c:149
+#: builtin/fsck.c:69 builtin/fsck.c:130 builtin/fsck.c:131
 msgid "unknown"
 msgstr "unbekannt"
 
 #. TRANSLATORS: e.g. error in tree 01bfda: <more explanation>
-#: builtin/fsck.c:101 builtin/fsck.c:121
+#: builtin/fsck.c:83 builtin/fsck.c:103
 #, c-format
 msgid "error in %s %s: %s"
 msgstr "Fehler in %s %s: %s"
 
 #. TRANSLATORS: e.g. warning in tree 01bfda: <more explanation>
-#: builtin/fsck.c:115
+#: builtin/fsck.c:97
 #, c-format
 msgid "warning in %s %s: %s"
 msgstr "Warnung in %s %s: %s"
 
-#: builtin/fsck.c:144 builtin/fsck.c:147
+#: builtin/fsck.c:126 builtin/fsck.c:129
 #, c-format
 msgid "broken link from %7s %s"
 msgstr "fehlerhafte Verknüpfung von %7s %s"
 
-#: builtin/fsck.c:156
+#: builtin/fsck.c:138
 msgid "wrong object type in link"
 msgstr "falscher Objekttyp in Verknüpfung"
 
-#: builtin/fsck.c:172
+#: builtin/fsck.c:154
 #, c-format
 msgid ""
 "broken link from %7s %s\n"
@@ -15161,211 +15444,211 @@
 "fehlerhafte Verknüpfung von %7s %s\n"
 "                       nach %7s %s"
 
-#: builtin/fsck.c:283
+#: builtin/fsck.c:265
 #, c-format
 msgid "missing %s %s"
 msgstr "%s %s fehlt"
 
-#: builtin/fsck.c:310
+#: builtin/fsck.c:292
 #, c-format
 msgid "unreachable %s %s"
 msgstr "%s %s nicht erreichbar"
 
-#: builtin/fsck.c:330
+#: builtin/fsck.c:312
 #, c-format
 msgid "dangling %s %s"
 msgstr "%s %s unreferenziert"
 
-#: builtin/fsck.c:340
+#: builtin/fsck.c:322
 msgid "could not create lost-found"
 msgstr "Konnte lost-found nicht erstellen."
 
-#: builtin/fsck.c:351
+#: builtin/fsck.c:333
 #, c-format
 msgid "could not finish '%s'"
 msgstr "Konnte '%s' nicht abschließen."
 
-#: builtin/fsck.c:368
+#: builtin/fsck.c:350
 #, c-format
 msgid "Checking %s"
 msgstr "Prüfe %s"
 
-#: builtin/fsck.c:406
+#: builtin/fsck.c:388
 #, c-format
 msgid "Checking connectivity (%d objects)"
 msgstr "Prüfe Konnektivität (%d Objekte)"
 
-#: builtin/fsck.c:425
+#: builtin/fsck.c:407
 #, c-format
 msgid "Checking %s %s"
 msgstr "Prüfe %s %s"
 
-#: builtin/fsck.c:430
+#: builtin/fsck.c:412
 msgid "broken links"
 msgstr "Fehlerhafte Verknüpfungen"
 
-#: builtin/fsck.c:439
+#: builtin/fsck.c:421
 #, c-format
 msgid "root %s"
 msgstr "Wurzel %s"
 
-#: builtin/fsck.c:447
+#: builtin/fsck.c:429
 #, c-format
 msgid "tagged %s %s (%s) in %s"
 msgstr "%s %s (%s) in %s getaggt"
 
-#: builtin/fsck.c:476
+#: builtin/fsck.c:458
 #, c-format
 msgid "%s: object corrupt or missing"
 msgstr "%s: Objekt fehlerhaft oder nicht vorhanden"
 
-#: builtin/fsck.c:501
+#: builtin/fsck.c:483
 #, c-format
 msgid "%s: invalid reflog entry %s"
 msgstr "%s: Ungültiger Reflog-Eintrag %s"
 
-#: builtin/fsck.c:515
+#: builtin/fsck.c:497
 #, c-format
 msgid "Checking reflog %s->%s"
 msgstr "Prüfe Reflog %s->%s"
 
-#: builtin/fsck.c:549
+#: builtin/fsck.c:531
 #, c-format
 msgid "%s: invalid sha1 pointer %s"
 msgstr "%s: Ungültiger SHA1-Zeiger %s"
 
-#: builtin/fsck.c:556
+#: builtin/fsck.c:538
 #, c-format
 msgid "%s: not a commit"
 msgstr "%s: kein Commit"
 
-#: builtin/fsck.c:610
+#: builtin/fsck.c:592
 msgid "notice: No default references"
 msgstr "Notiz: Keine Standardreferenzen"
 
-#: builtin/fsck.c:625
+#: builtin/fsck.c:607
 #, c-format
 msgid "%s: object corrupt or missing: %s"
 msgstr "%s: Objekt fehlerhaft oder nicht vorhanden: %s"
 
-#: builtin/fsck.c:638
+#: builtin/fsck.c:620
 #, c-format
 msgid "%s: object could not be parsed: %s"
 msgstr "%s: Objekt konnte nicht geparst werden: %s"
 
-#: builtin/fsck.c:658
+#: builtin/fsck.c:640
 #, c-format
 msgid "bad sha1 file: %s"
 msgstr "Ungültige SHA1-Datei: %s"
 
-#: builtin/fsck.c:673
+#: builtin/fsck.c:655
 msgid "Checking object directory"
 msgstr "Prüfe Objekt-Verzeichnis"
 
-#: builtin/fsck.c:676
+#: builtin/fsck.c:658
 msgid "Checking object directories"
 msgstr "Prüfe Objekt-Verzeichnisse"
 
-#: builtin/fsck.c:691
+#: builtin/fsck.c:673
 #, c-format
 msgid "Checking %s link"
 msgstr "Prüfe %s Verknüpfung"
 
-#: builtin/fsck.c:696 builtin/index-pack.c:865
+#: builtin/fsck.c:678 builtin/index-pack.c:865
 #, c-format
 msgid "invalid %s"
 msgstr "Ungültiger Objekt-Typ %s"
 
-#: builtin/fsck.c:703
+#: builtin/fsck.c:685
 #, c-format
 msgid "%s points to something strange (%s)"
 msgstr "%s zeigt auf etwas seltsames (%s)"
 
-#: builtin/fsck.c:709
+#: builtin/fsck.c:691
 #, c-format
 msgid "%s: detached HEAD points at nothing"
 msgstr "%s: losgelöster HEAD zeigt auf nichts"
 
-#: builtin/fsck.c:713
+#: builtin/fsck.c:695
 #, c-format
 msgid "notice: %s points to an unborn branch (%s)"
 msgstr "Notiz: %s zeigt auf einen ungeborenen Branch (%s)"
 
-#: builtin/fsck.c:725
+#: builtin/fsck.c:707
 msgid "Checking cache tree"
 msgstr "Prüfe Cache-Verzeichnis"
 
-#: builtin/fsck.c:730
+#: builtin/fsck.c:712
 #, c-format
 msgid "%s: invalid sha1 pointer in cache-tree"
 msgstr "%s: Ungültiger SHA1-Zeiger in Cache-Verzeichnis"
 
-#: builtin/fsck.c:739
+#: builtin/fsck.c:721
 msgid "non-tree in cache-tree"
 msgstr "non-tree in Cache-Verzeichnis"
 
-#: builtin/fsck.c:770
+#: builtin/fsck.c:752
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<Optionen>] [<Objekt>...]"
 
-#: builtin/fsck.c:776
+#: builtin/fsck.c:758
 msgid "show unreachable objects"
 msgstr "unerreichbare Objekte anzeigen"
 
-#: builtin/fsck.c:777
+#: builtin/fsck.c:759
 msgid "show dangling objects"
 msgstr "unreferenzierte Objekte anzeigen"
 
-#: builtin/fsck.c:778
+#: builtin/fsck.c:760
 msgid "report tags"
 msgstr "Tags melden"
 
-#: builtin/fsck.c:779
+#: builtin/fsck.c:761
 msgid "report root nodes"
 msgstr "Hauptwurzeln melden"
 
-#: builtin/fsck.c:780
+#: builtin/fsck.c:762
 msgid "make index objects head nodes"
 msgstr "Index-Objekte in Erreichbarkeitsprüfung einbeziehen"
 
-#: builtin/fsck.c:781
+#: builtin/fsck.c:763
 msgid "make reflogs head nodes (default)"
 msgstr "Reflogs in Erreichbarkeitsprüfung einbeziehen (Standard)"
 
-#: builtin/fsck.c:782
+#: builtin/fsck.c:764
 msgid "also consider packs and alternate objects"
 msgstr "ebenso Pakete und alternative Objekte betrachten"
 
-#: builtin/fsck.c:783
+#: builtin/fsck.c:765
 msgid "check only connectivity"
 msgstr "nur Konnektivität prüfen"
 
-#: builtin/fsck.c:784
+#: builtin/fsck.c:766 builtin/mktag.c:78
 msgid "enable more strict checking"
 msgstr "genauere Prüfung aktivieren"
 
-#: builtin/fsck.c:786
+#: builtin/fsck.c:768
 msgid "write dangling objects in .git/lost-found"
 msgstr "unreferenzierte Objekte nach .git/lost-found schreiben"
 
-#: builtin/fsck.c:787 builtin/prune.c:134
+#: builtin/fsck.c:769 builtin/prune.c:134
 msgid "show progress"
 msgstr "Fortschrittsanzeige anzeigen"
 
-#: builtin/fsck.c:788
+#: builtin/fsck.c:770
 msgid "show verbose names for reachable objects"
 msgstr "ausführliche Namen für erreichbare Objekte anzeigen"
 
-#: builtin/fsck.c:847 builtin/index-pack.c:261
+#: builtin/fsck.c:829 builtin/index-pack.c:261
 msgid "Checking objects"
 msgstr "Prüfe Objekte"
 
-#: builtin/fsck.c:875
+#: builtin/fsck.c:857
 #, c-format
 msgid "%s: object missing"
 msgstr "%s: Objekt nicht vorhanden"
 
-#: builtin/fsck.c:886
+#: builtin/fsck.c:868
 #, c-format
 msgid "invalid parameter: expected sha1, got '%s'"
 msgstr "Ungültiger Parameter: SHA-1 erwartet, '%s' bekommen"
@@ -15374,27 +15657,27 @@
 msgid "git gc [<options>]"
 msgstr "git gc [<Optionen>]"
 
-#: builtin/gc.c:94
+#: builtin/gc.c:93
 #, c-format
 msgid "Failed to fstat %s: %s"
 msgstr "Konnte '%s' nicht lesen: %s"
 
-#: builtin/gc.c:130
+#: builtin/gc.c:129
 #, c-format
 msgid "failed to parse '%s' value '%s'"
 msgstr "Fehler beim Parsen von '%s' mit dem Wert '%s'"
 
-#: builtin/gc.c:479 builtin/init-db.c:58
+#: builtin/gc.c:487 builtin/init-db.c:58
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "Kann '%s' nicht lesen"
 
-#: builtin/gc.c:488 builtin/notes.c:240 builtin/tag.c:530
+#: builtin/gc.c:496 builtin/notes.c:240 builtin/tag.c:562
 #, c-format
 msgid "cannot read '%s'"
 msgstr "kann '%s' nicht lesen"
 
-#: builtin/gc.c:495
+#: builtin/gc.c:503
 #, c-format
 msgid ""
 "The last gc run reported the following. Please correct the root cause\n"
@@ -15410,58 +15693,58 @@
 "\n"
 "%s"
 
-#: builtin/gc.c:543
+#: builtin/gc.c:551
 msgid "prune unreferenced objects"
 msgstr "unreferenzierte Objekte entfernen"
 
-#: builtin/gc.c:545
+#: builtin/gc.c:553
 msgid "be more thorough (increased runtime)"
 msgstr "mehr Gründlichkeit (erhöht Laufzeit)"
 
-#: builtin/gc.c:546
+#: builtin/gc.c:554
 msgid "enable auto-gc mode"
 msgstr "\"auto-gc\" Modus aktivieren"
 
-#: builtin/gc.c:549
+#: builtin/gc.c:557
 msgid "force running gc even if there may be another gc running"
 msgstr ""
 "Ausführung von \"git gc\" erzwingen, selbst wenn ein anderes\n"
 "\"git gc\" bereits ausgeführt wird"
 
-#: builtin/gc.c:552
+#: builtin/gc.c:560
 msgid "repack all other packs except the largest pack"
 msgstr "alle anderen Pakete, außer das größte Paket, neu packen"
 
-#: builtin/gc.c:569
+#: builtin/gc.c:576
 #, c-format
 msgid "failed to parse gc.logexpiry value %s"
 msgstr "Fehler beim Parsen des Wertes '%s' von gc.logexpiry."
 
-#: builtin/gc.c:580
+#: builtin/gc.c:587
 #, c-format
 msgid "failed to parse prune expiry value %s"
 msgstr "Fehler beim Parsen des \"prune expiry\" Wertes %s"
 
-#: builtin/gc.c:600
+#: builtin/gc.c:607
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 "Die Datenbank des Repositories wird für eine optimale Performance im\n"
 "Hintergrund komprimiert.\n"
 
-#: builtin/gc.c:602
+#: builtin/gc.c:609
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr ""
 "Die Datenbank des Projektarchivs wird für eine optimale Performance "
 "komprimiert.\n"
 
-#: builtin/gc.c:603
+#: builtin/gc.c:610
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "Siehe \"git help gc\" für manuelles Aufräumen.\n"
 
-#: builtin/gc.c:643
+#: builtin/gc.c:650
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -15469,149 +15752,176 @@
 "\"git gc\" wird bereits auf Maschine '%s' pid %<PRIuMAX> ausgeführt\n"
 "(benutzen Sie --force falls nicht)"
 
-#: builtin/gc.c:698
+#: builtin/gc.c:705
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
 "Es gibt zu viele unerreichbare lose Objekte; führen Sie 'git prune' aus, um "
 "diese zu löschen."
 
-#: builtin/gc.c:708
+#: builtin/gc.c:715
 msgid ""
 "git maintenance run [--auto] [--[no-]quiet] [--task=<task>] [--schedule]"
 msgstr ""
 "git maintenance run [--auto] [--[no-]quiet] [--task=<Aufgabe>] [--schedule]"
 
-#: builtin/gc.c:738
+#: builtin/gc.c:745
 msgid "--no-schedule is not allowed"
 msgstr "--no-schedule ist nicht erlaubt"
 
-#: builtin/gc.c:743
+#: builtin/gc.c:750
 #, c-format
 msgid "unrecognized --schedule argument '%s'"
 msgstr "nicht erkanntes --schedule Argument '%s'"
 
-#: builtin/gc.c:862
+#: builtin/gc.c:869
 msgid "failed to write commit-graph"
 msgstr "Fehler beim Schreiben des Commit-Graph"
 
-#: builtin/gc.c:901
+#: builtin/gc.c:914
 msgid "failed to fill remotes"
 msgstr "Fehler beim Eintragen der Remote-Repositories"
 
-#: builtin/gc.c:1024
+#: builtin/gc.c:1037
 msgid "failed to start 'git pack-objects' process"
 msgstr "konnte 'git pack-objects' Prozess nicht starten"
 
-#: builtin/gc.c:1041
+#: builtin/gc.c:1054
 msgid "failed to finish 'git pack-objects' process"
 msgstr "konnte 'git pack-objects' Prozess nicht beenden"
 
-#: builtin/gc.c:1093
+#: builtin/gc.c:1106
 msgid "failed to write multi-pack-index"
 msgstr "Fehler beim Schreiben des multi-pack-index"
 
-#: builtin/gc.c:1111
+#: builtin/gc.c:1124
 msgid "'git multi-pack-index expire' failed"
 msgstr "Fehler beim Ausführen von 'git multi-pack-index expire'"
 
-#: builtin/gc.c:1172
+#: builtin/gc.c:1185
 msgid "'git multi-pack-index repack' failed"
 msgstr "Fehler beim Ausführen von 'git multi-pack-index repack'"
 
-#: builtin/gc.c:1181
+#: builtin/gc.c:1194
 msgid ""
 "skipping incremental-repack task because core.multiPackIndex is disabled"
 msgstr ""
 "Überspringen der Aufgabe 'incremental-repack', weil core.multiPackIndex "
 "deaktiviert ist"
 
-#: builtin/gc.c:1279
+#: builtin/gc.c:1298
 #, c-format
 msgid "lock file '%s' exists, skipping maintenance"
 msgstr "Sperrdatei '%s' existiert, Wartung wird übersprungen"
 
-#: builtin/gc.c:1309
+#: builtin/gc.c:1328
 #, c-format
 msgid "task '%s' failed"
 msgstr "Aufgabe '%s' fehlgeschlagen"
 
-#: builtin/gc.c:1389
+#: builtin/gc.c:1410
 #, c-format
 msgid "'%s' is not a valid task"
 msgstr "'%s' ist keine gültige Aufgabe"
 
-#: builtin/gc.c:1394
+#: builtin/gc.c:1415
 #, c-format
 msgid "task '%s' cannot be selected multiple times"
 msgstr "Aufgabe '%s' kann nicht mehrfach ausgewählt werden"
 
-#: builtin/gc.c:1409
+#: builtin/gc.c:1430
 msgid "run tasks based on the state of the repository"
 msgstr "Aufgaben abhängig vom Zustand des Repositories ausführen"
 
-#: builtin/gc.c:1410
+#: builtin/gc.c:1431
 msgid "frequency"
 msgstr "Häufigkeit"
 
-#: builtin/gc.c:1411
+#: builtin/gc.c:1432
 msgid "run tasks based on frequency"
 msgstr "Aufgaben abhängig von der Häufigkeit ausführen"
 
-#: builtin/gc.c:1414
+#: builtin/gc.c:1435
 msgid "do not report progress or other information over stderr"
 msgstr "zeige keinen Fortschritt oder andere Informationen über stderr"
 
-#: builtin/gc.c:1415
+#: builtin/gc.c:1436
 msgid "task"
 msgstr "Aufgabe"
 
-#: builtin/gc.c:1416
+#: builtin/gc.c:1437
 msgid "run a specific task"
 msgstr "eine bestimmte Aufgabe ausführen"
 
-#: builtin/gc.c:1433
+#: builtin/gc.c:1454
 msgid "use at most one of --auto and --schedule=<frequency>"
 msgstr ""
 "nutzen Sie höchstens eine der Optionen --auto oder --schedule=<Häufigkeit>"
 
-#: builtin/gc.c:1467
+#: builtin/gc.c:1497
 msgid "failed to run 'git config'"
 msgstr "Fehler beim Ausführen von 'git config'"
 
-#: builtin/gc.c:1512
-msgid "another process is scheduling background maintenance"
-msgstr "ein anderer Prozess plant die Hintergrundwartung"
+#: builtin/gc.c:1562
+#, c-format
+msgid "failed to expand path '%s'"
+msgstr "Fehler beim Erweitern des Pfades '%s'"
 
-#: builtin/gc.c:1525
+#: builtin/gc.c:1591
+msgid "failed to start launchctl"
+msgstr "konnte launchctl nicht starten"
+
+#: builtin/gc.c:1628
+#, c-format
+msgid "failed to create directories for '%s'"
+msgstr "Fehler beim Erstellen von Verzeichnissen für '%s'"
+
+#: builtin/gc.c:1689
+#, c-format
+msgid "failed to bootstrap service %s"
+msgstr "Fehler beim Laden des Services %s"
+
+#: builtin/gc.c:1760
+msgid "failed to create temp xml file"
+msgstr "Fehler beim Erstellen der temporären XML-Datei"
+
+#: builtin/gc.c:1850
+msgid "failed to start schtasks"
+msgstr "Fehler beim Starten von schtasks"
+
+#: builtin/gc.c:1894
 msgid "failed to run 'crontab -l'; your system might not support 'cron'"
 msgstr ""
 "Fehler beim Ausführen von 'crontab -l'; Ihr System unterstützt eventuell "
 "'cron' nicht"
 
-#: builtin/gc.c:1544
+#: builtin/gc.c:1911
 msgid "failed to run 'crontab'; your system might not support 'cron'"
 msgstr ""
 "Fehler beim Ausführen von 'crontab'; Ihr System unterstützt eventuell 'cron' "
 "nicht"
 
-#: builtin/gc.c:1550
+#: builtin/gc.c:1915
 msgid "failed to open stdin of 'crontab'"
 msgstr "Fehler beim Öffnen der Standard-Eingabe von 'crontab'"
 
-#: builtin/gc.c:1592
+#: builtin/gc.c:1956
 msgid "'crontab' died"
 msgstr "'crontab' abgebrochen"
 
-#: builtin/gc.c:1605
+#: builtin/gc.c:1990
+msgid "another process is scheduling background maintenance"
+msgstr "ein anderer Prozess plant die Hintergrundwartung"
+
+#: builtin/gc.c:2009
 msgid "failed to add repo to global config"
 msgstr "Repository konnte nicht zur globalen Konfiguration hinzugefügt werden"
 
-#: builtin/gc.c:1615
+#: builtin/gc.c:2019
 msgid "git maintenance <subcommand> [<options>]"
 msgstr "git maintenance <Unterbefehl> [<Optionen>]"
 
-#: builtin/gc.c:1634
+#: builtin/gc.c:2038
 #, c-format
 msgid "invalid subcommand: %s"
 msgstr "ungültiger Unterbefehl: %s"
@@ -15620,12 +15930,12 @@
 msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr "git grep [<Optionen>] [-e] <Muster> [<Commit>...] [[--] <Pfad>...]"
 
-#: builtin/grep.c:225
+#: builtin/grep.c:223
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep: Fehler beim Erzeugen eines Thread: %s"
 
-#: builtin/grep.c:279
+#: builtin/grep.c:277
 #, c-format
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "ungültige Anzahl von Threads (%d) für %s angegeben"
@@ -15634,266 +15944,266 @@
 #. variable for tweaking threads, currently
 #. grep.threads
 #.
-#: builtin/grep.c:287 builtin/index-pack.c:1576 builtin/index-pack.c:1766
-#: builtin/pack-objects.c:2936
+#: builtin/grep.c:285 builtin/index-pack.c:1589 builtin/index-pack.c:1808
+#: builtin/pack-objects.c:2944
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "keine Unterstützung von Threads, '%s' wird ignoriert"
 
-#: builtin/grep.c:475 builtin/grep.c:600 builtin/grep.c:640
+#: builtin/grep.c:473 builtin/grep.c:601 builtin/grep.c:641
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "konnte \"Tree\"-Objekt (%s) nicht lesen"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:656
 #, 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:736
+#: builtin/grep.c:737
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "Schalter '%c' erwartet einen numerischen Wert"
 
-#: builtin/grep.c:835
+#: builtin/grep.c:836
 msgid "search in index instead of in the work tree"
-msgstr "im Index anstatt im Arbeitsverzeichnis suchen"
+msgstr "im Index statt im Arbeitsverzeichnis suchen"
 
-#: builtin/grep.c:837
+#: builtin/grep.c:838
 msgid "find in contents not managed by git"
 msgstr "auch in Inhalten finden, die nicht von Git verwaltet werden"
 
-#: builtin/grep.c:839
+#: builtin/grep.c:840
 msgid "search in both tracked and untracked files"
 msgstr "in versionierten und unversionierten Dateien suchen"
 
-#: builtin/grep.c:841
+#: builtin/grep.c:842
 msgid "ignore files specified via '.gitignore'"
 msgstr "Dateien, die über '.gitignore' angegeben sind, ignorieren"
 
-#: builtin/grep.c:843
+#: builtin/grep.c:844
 msgid "recursively search in each submodule"
 msgstr "rekursive Suche in jedem Submodul"
 
-#: builtin/grep.c:846
+#: builtin/grep.c:847
 msgid "show non-matching lines"
 msgstr "Zeilen ohne Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:848
+#: builtin/grep.c:849
 msgid "case insensitive matching"
 msgstr "Übereinstimmungen unabhängig von Groß- und Kleinschreibung finden"
 
-#: builtin/grep.c:850
+#: builtin/grep.c:851
 msgid "match patterns only at word boundaries"
 msgstr "nur ganze Wörter suchen"
 
-#: builtin/grep.c:852
+#: builtin/grep.c:853
 msgid "process binary files as text"
 msgstr "binäre Dateien als Text verarbeiten"
 
-#: builtin/grep.c:854
+#: builtin/grep.c:855
 msgid "don't match patterns in binary files"
 msgstr "keine Muster in Binärdateien finden"
 
-#: builtin/grep.c:857
+#: builtin/grep.c:858
 msgid "process binary files with textconv filters"
 msgstr "binäre Dateien mit \"textconv\"-Filtern verarbeiten"
 
-#: builtin/grep.c:859
+#: builtin/grep.c:860
 msgid "search in subdirectories (default)"
 msgstr "in Unterverzeichnissen suchen (Standard)"
 
-#: builtin/grep.c:861
+#: builtin/grep.c:862
 msgid "descend at most <depth> levels"
 msgstr "höchstens <Tiefe> Ebenen durchlaufen"
 
-#: builtin/grep.c:865
+#: builtin/grep.c:866
 msgid "use extended POSIX regular expressions"
 msgstr "erweiterte reguläre Ausdrücke aus POSIX verwenden"
 
-#: builtin/grep.c:868
+#: builtin/grep.c:869
 msgid "use basic POSIX regular expressions (default)"
 msgstr "grundlegende reguläre Ausdrücke aus POSIX verwenden (Standard)"
 
-#: builtin/grep.c:871
+#: builtin/grep.c:872
 msgid "interpret patterns as fixed strings"
 msgstr "Muster als feste Zeichenketten interpretieren"
 
-#: builtin/grep.c:874
+#: builtin/grep.c:875
 msgid "use Perl-compatible regular expressions"
 msgstr "Perl-kompatible reguläre Ausdrücke verwenden"
 
-#: builtin/grep.c:877
+#: builtin/grep.c:878
 msgid "show line numbers"
 msgstr "Zeilennummern anzeigen"
 
-#: builtin/grep.c:878
+#: builtin/grep.c:879
 msgid "show column number of first match"
 msgstr "Nummer der Spalte des ersten Treffers anzeigen"
 
-#: builtin/grep.c:879
+#: builtin/grep.c:880
 msgid "don't show filenames"
 msgstr "keine Dateinamen anzeigen"
 
-#: builtin/grep.c:880
+#: builtin/grep.c:881
 msgid "show filenames"
 msgstr "Dateinamen anzeigen"
 
-#: builtin/grep.c:882
+#: builtin/grep.c:883
 msgid "show filenames relative to top directory"
 msgstr "Dateinamen relativ zum Projektverzeichnis anzeigen"
 
-#: builtin/grep.c:884
+#: builtin/grep.c:885
 msgid "show only filenames instead of matching lines"
 msgstr "nur Dateinamen anzeigen anstatt übereinstimmende Zeilen"
 
-#: builtin/grep.c:886
+#: builtin/grep.c:887
 msgid "synonym for --files-with-matches"
 msgstr "Synonym für --files-with-matches"
 
-#: builtin/grep.c:889
+#: builtin/grep.c:890
 msgid "show only the names of files without match"
 msgstr "nur die Dateinamen ohne Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:891
+#: builtin/grep.c:892
 msgid "print NUL after filenames"
 msgstr "NUL-Zeichen nach Dateinamen ausgeben"
 
-#: builtin/grep.c:894
+#: builtin/grep.c:895
 msgid "show only matching parts of a line"
 msgstr "nur übereinstimmende Teile der Zeile anzeigen"
 
-#: builtin/grep.c:896
+#: builtin/grep.c:897
 msgid "show the number of matches instead of matching lines"
 msgstr "anstatt der Zeilen, die Anzahl der übereinstimmenden Zeilen anzeigen"
 
-#: builtin/grep.c:897
+#: builtin/grep.c:898
 msgid "highlight matches"
 msgstr "Übereinstimmungen hervorheben"
 
-#: builtin/grep.c:899
+#: builtin/grep.c:900
 msgid "print empty line between matches from different files"
 msgstr ""
 "eine Leerzeile zwischen Übereinstimmungen in verschiedenen Dateien ausgeben"
 
-#: builtin/grep.c:901
+#: builtin/grep.c:902
 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:904
+#: builtin/grep.c:905
 msgid "show <n> context lines before and after matches"
 msgstr "<n> Zeilen vor und nach den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:907
+#: builtin/grep.c:908
 msgid "show <n> context lines before matches"
 msgstr "<n> Zeilen vor den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:909
+#: builtin/grep.c:910
 msgid "show <n> context lines after matches"
 msgstr "<n> Zeilen nach den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:911
+#: builtin/grep.c:912
 msgid "use <n> worker threads"
 msgstr "<n> Threads benutzen"
 
-#: builtin/grep.c:912
+#: builtin/grep.c:913
 msgid "shortcut for -C NUM"
 msgstr "Kurzform für -C NUM"
 
-#: builtin/grep.c:915
+#: builtin/grep.c:916
 msgid "show a line with the function name before matches"
 msgstr "eine Zeile mit dem Funktionsnamen vor Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:917
+#: builtin/grep.c:918
 msgid "show the surrounding function"
 msgstr "die umgebende Funktion anzeigen"
 
-#: builtin/grep.c:920
+#: builtin/grep.c:921
 msgid "read patterns from file"
 msgstr "Muster von einer Datei lesen"
 
-#: builtin/grep.c:922
+#: builtin/grep.c:923
 msgid "match <pattern>"
 msgstr "<Muster> finden"
 
-#: builtin/grep.c:924
+#: builtin/grep.c:925
 msgid "combine patterns specified with -e"
 msgstr "Muster kombinieren, die mit -e angegeben wurden"
 
-#: builtin/grep.c:936
+#: builtin/grep.c:937
 msgid "indicate hit with exit status without output"
 msgstr "Übereinstimmungen nur durch Beendigungsstatus anzeigen"
 
-#: builtin/grep.c:938
+#: builtin/grep.c:939
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "nur Übereinstimmungen von Dateien anzeigen, die allen Mustern entsprechen"
 
-#: builtin/grep.c:940
-msgid "show parse tree for grep expression"
-msgstr "geparstes Verzeichnis für \"grep\"-Ausdruck anzeigen"
-
-#: builtin/grep.c:944
+#: builtin/grep.c:942
 msgid "pager"
 msgstr "Anzeigeprogramm"
 
-#: builtin/grep.c:944
+#: builtin/grep.c:942
 msgid "show matching files in the pager"
 msgstr "Dateien mit Übereinstimmungen im Anzeigeprogramm anzeigen"
 
-#: builtin/grep.c:948
+#: builtin/grep.c:946
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "den Aufruf von grep(1) erlauben (von dieser Programmversion ignoriert)"
 
-#: builtin/grep.c:1014
+#: builtin/grep.c:1012
 msgid "no pattern given"
 msgstr "Kein Muster angegeben."
 
-#: builtin/grep.c:1050
+#: builtin/grep.c:1048
 msgid "--no-index or --untracked cannot be used with revs"
 msgstr "--no-index oder --untracked können nicht mit Commits verwendet werden"
 
-#: builtin/grep.c:1058
+#: builtin/grep.c:1056
 #, c-format
 msgid "unable to resolve revision: %s"
 msgstr "Konnte Commit nicht auflösen: %s"
 
-#: builtin/grep.c:1088
+#: builtin/grep.c:1086
 msgid "--untracked not supported with --recurse-submodules"
 msgstr "--untracked zusammen mit --recurse-submodules wird nicht unterstützt"
 
-#: builtin/grep.c:1092
+#: builtin/grep.c:1090
 msgid "invalid option combination, ignoring --threads"
 msgstr "Ungültige Kombination von Optionen, --threads wird ignoriert."
 
-#: builtin/grep.c:1095 builtin/pack-objects.c:3655
+#: builtin/grep.c:1093 builtin/pack-objects.c:3672
 msgid "no threads support, ignoring --threads"
 msgstr "Keine Unterstützung für Threads, --threads wird ignoriert."
 
-#: builtin/grep.c:1098 builtin/index-pack.c:1573 builtin/pack-objects.c:2933
+#: builtin/grep.c:1096 builtin/index-pack.c:1586 builtin/pack-objects.c:2941
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "ungültige Anzahl von Threads angegeben (%d)"
 
-#: builtin/grep.c:1132
+#: builtin/grep.c:1130
 msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
-"Die Option --open-files-in-pager kann nur innerhalb des "
-"Arbeitsverzeichnisses verwendet werden."
+"--open-files-in-pager kann nur innerhalb des Arbeitsverzeichnisses verwendet "
+"werden"
 
-#: builtin/grep.c:1158
+#: builtin/grep.c:1156
 msgid "--cached or --untracked cannot be used with --no-index"
-msgstr "--cached und --untracked können nicht mit --no-index verwendet werden."
+msgstr "--cached und --untracked können nicht mit --no-index verwendet werden"
 
-#: builtin/grep.c:1164
+#: builtin/grep.c:1159
+msgid "--untracked cannot be used with --cached"
+msgstr "--untracked kann nicht mit --cached verwendet werden"
+
+#: builtin/grep.c:1165
 msgid "--[no-]exclude-standard cannot be used for tracked contents"
 msgstr ""
 "--[no-]exclude-standard kann nicht mit versionierten Inhalten verwendet "
-"werden."
+"werden"
 
-#: builtin/grep.c:1172
+#: builtin/grep.c:1173
 msgid "both --cached and trees are given"
 msgstr "--cached und \"Tree\"-Objekte angegeben"
 
@@ -16026,12 +16336,12 @@
 msgid "no info viewer handled the request"
 msgstr "kein Informations-Betrachter konnte mit dieser Anfrage umgehen"
 
-#: builtin/help.c:520 builtin/help.c:531 git.c:337
+#: builtin/help.c:520 builtin/help.c:531 git.c:340
 #, c-format
 msgid "'%s' is aliased to '%s'"
 msgstr "Für '%s' wurde der Alias '%s' angelegt."
 
-#: builtin/help.c:534 git.c:369
+#: builtin/help.c:534 git.c:372
 #, c-format
 msgid "bad alias.%s string: %s"
 msgstr "Ungültiger alias.%s String: %s"
@@ -16079,7 +16389,7 @@
 msgid "used more bytes than were available"
 msgstr "verwendete mehr Bytes als verfügbar waren"
 
-#: builtin/index-pack.c:324 builtin/pack-objects.c:619
+#: builtin/index-pack.c:324 builtin/pack-objects.c:624
 msgid "pack too large for current definition of off_t"
 msgstr "Paket ist zu groß für die aktuelle Definition von off_t"
 
@@ -16087,7 +16397,7 @@
 msgid "pack exceeds maximum allowed size"
 msgstr "Paket überschreitet die maximal erlaubte Größe"
 
-#: builtin/index-pack.c:342 builtin/repack.c:286
+#: builtin/index-pack.c:342
 #, c-format
 msgid "unable to create '%s'"
 msgstr "konnte '%s' nicht erstellen"
@@ -16213,7 +16523,7 @@
 msgid "Resolving deltas"
 msgstr "Löse Unterschiede auf"
 
-#: builtin/index-pack.c:1249 builtin/pack-objects.c:2697
+#: builtin/index-pack.c:1249 builtin/pack-objects.c:2707
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "kann Thread nicht erzeugen: %s"
@@ -16251,10 +16561,10 @@
 msgid "local object %s is corrupt"
 msgstr "lokales Objekt %s ist beschädigt"
 
-#: builtin/index-pack.c:1444
+#: builtin/index-pack.c:1445
 #, c-format
-msgid "packfile name '%s' does not end with '.pack'"
-msgstr "Name der Paketdatei '%s' endet nicht mit '.pack'"
+msgid "packfile name '%s' does not end with '.%s'"
+msgstr "Name der Paketdatei '%s' endet nicht mit '.%s'"
 
 #: builtin/index-pack.c:1469
 #, c-format
@@ -16266,79 +16576,83 @@
 msgid "cannot close written %s file '%s'"
 msgstr "Kann eben geschriebene %s Datei '%s' nicht schließen."
 
-#: builtin/index-pack.c:1501
+#: builtin/index-pack.c:1503
 msgid "error while closing pack file"
 msgstr "Fehler beim Schließen der Paketdatei"
 
-#: builtin/index-pack.c:1515
+#: builtin/index-pack.c:1517
 msgid "cannot store pack file"
 msgstr "Kann Paketdatei nicht speichern"
 
-#: builtin/index-pack.c:1523
+#: builtin/index-pack.c:1525
 msgid "cannot store index file"
 msgstr "Kann Indexdatei nicht speichern"
 
-#: builtin/index-pack.c:1567 builtin/pack-objects.c:2944
+#: builtin/index-pack.c:1534
+msgid "cannot store reverse index file"
+msgstr "kann Reverse-Index-Datei nicht speichern"
+
+#: builtin/index-pack.c:1580 builtin/pack-objects.c:2952
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "\"pack.indexversion=%<PRIu32>\" ist ungültig"
 
-#: builtin/index-pack.c:1631
+#: builtin/index-pack.c:1650
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Kann existierende Paketdatei '%s' nicht öffnen"
 
-#: builtin/index-pack.c:1633
+#: builtin/index-pack.c:1652
 #, 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:1681
+#: builtin/index-pack.c:1700
 #, 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:1688
+#: builtin/index-pack.c:1707
 #, 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:1728
+#: builtin/index-pack.c:1765
 msgid "Cannot come back to cwd"
 msgstr "Kann nicht zurück zum Arbeitsverzeichnis wechseln"
 
-#: builtin/index-pack.c:1777 builtin/index-pack.c:1780
-#: builtin/index-pack.c:1796 builtin/index-pack.c:1800
+#: builtin/index-pack.c:1819 builtin/index-pack.c:1822
+#: builtin/index-pack.c:1838 builtin/index-pack.c:1842
 #, c-format
 msgid "bad %s"
 msgstr "%s ist ungültig"
 
-#: builtin/index-pack.c:1806 builtin/init-db.c:392 builtin/init-db.c:625
+#: builtin/index-pack.c:1848 builtin/init-db.c:392 builtin/init-db.c:625
 #, c-format
 msgid "unknown hash algorithm '%s'"
 msgstr "unbekannter Hash-Algorithmus '%s'"
 
-#: builtin/index-pack.c:1821
+#: builtin/index-pack.c:1867
 msgid "--fix-thin cannot be used without --stdin"
-msgstr "Die Option --fix-thin kann nicht ohne --stdin verwendet werden."
+msgstr "--fix-thin kann nicht ohne --stdin verwendet werden"
 
-#: builtin/index-pack.c:1823
+#: builtin/index-pack.c:1869
 msgid "--stdin requires a git repository"
 msgstr "--stdin erfordert ein Git-Repository"
 
-#: builtin/index-pack.c:1825
+#: builtin/index-pack.c:1871
 msgid "--object-format cannot be used with --stdin"
-msgstr "Die Option --object-format kann nicht mit --stdin verwendet werden."
+msgstr "--object-format kann nicht mit --stdin verwendet werden"
 
-#: builtin/index-pack.c:1831
+#: builtin/index-pack.c:1886
 msgid "--verify with no packfile name given"
-msgstr "Die Option --verify wurde ohne Namen der Paketdatei angegeben."
+msgstr "--verify wurde ohne Namen der Paketdatei angegeben"
 
-#: builtin/index-pack.c:1892 builtin/unpack-objects.c:582
+#: builtin/index-pack.c:1956 builtin/unpack-objects.c:582
 msgid "fsck error in pack objects"
 msgstr "fsck Fehler beim Packen von Objekten"
 
@@ -16549,139 +16863,137 @@
 
 #: builtin/interpret-trailers.c:123
 msgid "--trailer with --only-input does not make sense"
-msgstr ""
-"Die Optionen --trailer und --only-input können nicht gemeinsam verwendet "
-"werden."
+msgstr "--trailer und --only-input können nicht gemeinsam verwendet werden"
 
 #: builtin/interpret-trailers.c:133
 msgid "no input file given for in-place editing"
 msgstr "keine Datei zur direkten Bearbeitung angegeben"
 
-#: builtin/log.c:58
+#: builtin/log.c:59
 msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
 msgstr "git log [<Optionen>] [<Commitbereich>] [[--] <Pfad>...]"
 
-#: builtin/log.c:59
+#: builtin/log.c:60
 msgid "git show [<options>] <object>..."
 msgstr "git show [<Optionen>] <Objekt>..."
 
-#: builtin/log.c:112
+#: builtin/log.c:113
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "Ungültige Option für --decorate: %s"
 
-#: builtin/log.c:179
+#: builtin/log.c:180
 msgid "show source"
 msgstr "Quelle anzeigen"
 
-#: builtin/log.c:180
-msgid "Use mail map file"
+#: builtin/log.c:181
+msgid "use mail map file"
 msgstr "\"mailmap\"-Datei verwenden"
 
-#: builtin/log.c:183
+#: builtin/log.c:184
 msgid "only decorate refs that match <pattern>"
 msgstr "\"decorate\" nur bei Referenzen anwenden, die <Muster> entsprechen"
 
-#: builtin/log.c:185
+#: builtin/log.c:186
 msgid "do not decorate refs that match <pattern>"
 msgstr "\"decorate\" nicht bei Referenzen anwenden, die <Muster> entsprechen"
 
-#: builtin/log.c:186
+#: builtin/log.c:187
 msgid "decorate options"
 msgstr "decorate-Optionen"
 
-#: builtin/log.c:189
+#: builtin/log.c:190
 msgid ""
-"Trace the evolution of line range <start>,<end> or function :<funcname> in "
+"trace the evolution of line range <start>,<end> or function :<funcname> in "
 "<file>"
 msgstr ""
 "Entwicklung der Zeilen vom Bereich <Start>,<Ende> oder Funktion :"
 "<Funktionsname> in <Datei> verfolgen"
 
-#: builtin/log.c:212
+#: builtin/log.c:213
 msgid "-L<range>:<file> cannot be used with pathspec"
 msgstr "-L<Bereich>:<Datei> kann nicht mit Pfadspezifikation verwendet werden"
 
-#: builtin/log.c:302
+#: builtin/log.c:303
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "letzte Ausgabe: %d %s\n"
 
-#: builtin/log.c:564
+#: builtin/log.c:566
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: ungültige Datei"
 
-#: builtin/log.c:579 builtin/log.c:674
+#: builtin/log.c:581 builtin/log.c:671
 #, c-format
 msgid "could not read object %s"
 msgstr "Konnte Objekt %s nicht lesen."
 
-#: builtin/log.c:699
+#: builtin/log.c:696
 #, c-format
 msgid "unknown type: %d"
 msgstr "Unbekannter Typ: %d"
 
-#: builtin/log.c:848
+#: builtin/log.c:841
 #, c-format
 msgid "%s: invalid cover from description mode"
 msgstr ""
 "%s: Ungültiger Modus für Erstellung des Deckblattes aus der Beschreibung"
 
-#: builtin/log.c:855
+#: builtin/log.c:848
 msgid "format.headers without value"
 msgstr "format.headers ohne Wert"
 
-#: builtin/log.c:984
+#: builtin/log.c:977
 #, c-format
 msgid "cannot open patch file %s"
 msgstr "Kann Patch-Datei %s nicht öffnen"
 
-#: builtin/log.c:1001
+#: builtin/log.c:994
 msgid "need exactly one range"
 msgstr "Brauche genau einen Commit-Bereich."
 
-#: builtin/log.c:1011
+#: builtin/log.c:1004
 msgid "not a range"
 msgstr "Kein Commit-Bereich."
 
-#: builtin/log.c:1175
+#: builtin/log.c:1168
 msgid "cover letter needs email format"
 msgstr "Anschreiben benötigt E-Mail-Format"
 
-#: builtin/log.c:1181
+#: builtin/log.c:1174
 msgid "failed to create cover-letter file"
 msgstr "Fehler beim Erstellen der Datei für das Anschreiben."
 
-#: builtin/log.c:1262
+#: builtin/log.c:1261
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "ungültiges in-reply-to: %s"
 
-#: builtin/log.c:1289
+#: builtin/log.c:1288
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<Optionen>] [<seit> | <Commitbereich>]"
 
-#: builtin/log.c:1347
+#: builtin/log.c:1346
 msgid "two output directories?"
 msgstr "Zwei Ausgabeverzeichnisse?"
 
-#: builtin/log.c:1498 builtin/log.c:2318 builtin/log.c:2320 builtin/log.c:2332
+#: builtin/log.c:1497 builtin/log.c:2317 builtin/log.c:2319 builtin/log.c:2331
 #, c-format
 msgid "unknown commit %s"
 msgstr "Unbekannter Commit %s"
 
-#: builtin/log.c:1509 builtin/replace.c:58 builtin/replace.c:207
+#: builtin/log.c:1508 builtin/replace.c:58 builtin/replace.c:207
 #: builtin/replace.c:210
 #, c-format
 msgid "failed to resolve '%s' as a valid ref"
 msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
 
-#: builtin/log.c:1518
+#: builtin/log.c:1517
 msgid "could not find exact merge base"
 msgstr "Konnte keine exakte Merge-Basis finden."
 
-#: builtin/log.c:1528
+#: builtin/log.c:1527
 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"
@@ -16692,291 +17004,291 @@
 "'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:1551
+#: builtin/log.c:1550
 msgid "failed to find exact merge base"
 msgstr "Fehler beim Finden einer exakten Merge-Basis."
 
-#: builtin/log.c:1568
+#: builtin/log.c:1567
 msgid "base commit should be the ancestor of revision list"
 msgstr "Basis-Commit sollte der Vorgänger der Revisionsliste sein."
 
-#: builtin/log.c:1578
+#: builtin/log.c:1577
 msgid "base commit shouldn't be in revision list"
 msgstr "Basis-Commit sollte nicht in der Revisionsliste enthalten sein."
 
-#: builtin/log.c:1636
+#: builtin/log.c:1635
 msgid "cannot get patch id"
 msgstr "kann Patch-Id nicht lesen"
 
-#: builtin/log.c:1693
+#: builtin/log.c:1692
 msgid "failed to infer range-diff origin of current series"
 msgstr "Fehler beim Ableiten des range-diff Ursprungs der aktuellen Serie"
 
-#: builtin/log.c:1695
+#: builtin/log.c:1694
 #, c-format
 msgid "using '%s' as range-diff origin of current series"
 msgstr "nutze '%s' als range-diff Ursprung der aktuellen Serie"
 
-#: builtin/log.c:1739
+#: builtin/log.c:1738
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "[PATCH n/m] auch mit einzelnem Patch verwenden"
 
-#: builtin/log.c:1742
+#: builtin/log.c:1741
 msgid "use [PATCH] even with multiple patches"
 msgstr "[PATCH] auch mit mehreren Patches verwenden"
 
-#: builtin/log.c:1746
+#: builtin/log.c:1745
 msgid "print patches to standard out"
 msgstr "Ausgabe der Patches in Standard-Ausgabe"
 
-#: builtin/log.c:1748
+#: builtin/log.c:1747
 msgid "generate a cover letter"
 msgstr "ein Deckblatt erzeugen"
 
-#: builtin/log.c:1750
+#: builtin/log.c:1749
 msgid "use simple number sequence for output file names"
 msgstr "einfache Nummernfolge für die Namen der Ausgabedateien verwenden"
 
-#: builtin/log.c:1751
+#: builtin/log.c:1750
 msgid "sfx"
 msgstr "Dateiendung"
 
-#: builtin/log.c:1752
+#: builtin/log.c:1751
 msgid "use <sfx> instead of '.patch'"
-msgstr "<Dateiendung> anstatt '.patch' verwenden"
+msgstr "<Dateiendung> statt '.patch' verwenden"
 
-#: builtin/log.c:1754
+#: builtin/log.c:1753
 msgid "start numbering patches at <n> instead of 1"
-msgstr "die Nummerierung der Patches bei <n> anstatt bei 1 beginnen"
+msgstr "die Nummerierung der Patches bei <n> statt bei 1 beginnen"
 
-#: builtin/log.c:1756
+#: builtin/log.c:1755
 msgid "mark the series as Nth re-roll"
 msgstr "die Serie als n-te Fassung kennzeichnen"
 
-#: builtin/log.c:1758
+#: builtin/log.c:1757
 msgid "max length of output filename"
 msgstr "maximale Länge des Dateinamens für die Ausgabe"
 
-#: builtin/log.c:1760
-msgid "Use [RFC PATCH] instead of [PATCH]"
-msgstr "[RFC PATCH] anstatt [PATCH] verwenden"
+#: builtin/log.c:1759
+msgid "use [RFC PATCH] instead of [PATCH]"
+msgstr "[RFC PATCH] statt [PATCH] verwenden"
 
-#: builtin/log.c:1763
+#: builtin/log.c:1762
 msgid "cover-from-description-mode"
 msgstr "Modus für Erstellung des Deckblattes aus der Beschreibung"
 
-#: builtin/log.c:1764
+#: builtin/log.c:1763
 msgid "generate parts of a cover letter based on a branch's description"
 msgstr ""
 "Erzeuge Teile des Deckblattes basierend auf der Beschreibung des Branches"
 
-#: builtin/log.c:1766
-msgid "Use [<prefix>] instead of [PATCH]"
-msgstr "Nutze [<Präfix>] statt [PATCH]"
+#: builtin/log.c:1765
+msgid "use [<prefix>] instead of [PATCH]"
+msgstr "nutze [<Präfix>] statt [PATCH]"
 
-#: builtin/log.c:1769
+#: builtin/log.c:1768
 msgid "store resulting files in <dir>"
 msgstr "erzeugte Dateien in <Verzeichnis> speichern"
 
-#: builtin/log.c:1772
+#: builtin/log.c:1771
 msgid "don't strip/add [PATCH]"
 msgstr "[PATCH] nicht entfernen/hinzufügen"
 
-#: builtin/log.c:1775
+#: builtin/log.c:1774
 msgid "don't output binary diffs"
 msgstr "keine binären Unterschiede ausgeben"
 
-#: builtin/log.c:1777
+#: builtin/log.c:1776
 msgid "output all-zero hash in From header"
 msgstr "Hash mit Nullen in \"From\"-Header ausgeben"
 
-#: builtin/log.c:1779
+#: builtin/log.c:1778
 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:1781
+#: builtin/log.c:1780
 msgid "show patch format instead of default (patch + stat)"
 msgstr "Patchformat anstatt des Standards anzeigen (Patch + Zusammenfassung)"
 
-#: builtin/log.c:1783
+#: builtin/log.c:1782
 msgid "Messaging"
 msgstr "E-Mail-Einstellungen"
 
-#: builtin/log.c:1784
+#: builtin/log.c:1783
 msgid "header"
 msgstr "Header"
 
-#: builtin/log.c:1785
+#: builtin/log.c:1784
 msgid "add email header"
 msgstr "E-Mail-Header hinzufügen"
 
-#: builtin/log.c:1786 builtin/log.c:1787
+#: builtin/log.c:1785 builtin/log.c:1786
 msgid "email"
 msgstr "E-Mail"
 
-#: builtin/log.c:1786
+#: builtin/log.c:1785
 msgid "add To: header"
 msgstr "\"To:\"-Header hinzufügen"
 
-#: builtin/log.c:1787
+#: builtin/log.c:1786
 msgid "add Cc: header"
 msgstr "\"Cc:\"-Header hinzufügen"
 
-#: builtin/log.c:1788
+#: builtin/log.c:1787
 msgid "ident"
 msgstr "Ident"
 
-#: builtin/log.c:1789
+#: builtin/log.c:1788
 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:1791
+#: builtin/log.c:1790
 msgid "message-id"
 msgstr "message-id"
 
-#: builtin/log.c:1792
+#: builtin/log.c:1791
 msgid "make first mail a reply to <message-id>"
 msgstr "aus erster E-Mail eine Antwort zu <message-id> machen"
 
-#: builtin/log.c:1793 builtin/log.c:1796
+#: builtin/log.c:1792 builtin/log.c:1795
 msgid "boundary"
 msgstr "Grenze"
 
-#: builtin/log.c:1794
+#: builtin/log.c:1793
 msgid "attach the patch"
 msgstr "den Patch anhängen"
 
-#: builtin/log.c:1797
+#: builtin/log.c:1796
 msgid "inline the patch"
 msgstr "den Patch direkt in die Nachricht einfügen"
 
-#: builtin/log.c:1801
+#: builtin/log.c:1800
 msgid "enable message threading, styles: shallow, deep"
 msgstr "Nachrichtenverkettung aktivieren, Stile: shallow, deep"
 
-#: builtin/log.c:1803
+#: builtin/log.c:1802
 msgid "signature"
 msgstr "Signatur"
 
-#: builtin/log.c:1804
+#: builtin/log.c:1803
 msgid "add a signature"
 msgstr "eine Signatur hinzufügen"
 
-#: builtin/log.c:1805
+#: builtin/log.c:1804
 msgid "base-commit"
 msgstr "Basis-Commit"
 
-#: builtin/log.c:1806
+#: builtin/log.c:1805
 msgid "add prerequisite tree info to the patch series"
 msgstr "erforderliche Revisions-Informationen der Patch-Serie hinzufügen"
 
-#: builtin/log.c:1809
+#: builtin/log.c:1808
 msgid "add a signature from a file"
 msgstr "eine Signatur aus einer Datei hinzufügen"
 
-#: builtin/log.c:1810
+#: builtin/log.c:1809
 msgid "don't print the patch filenames"
 msgstr "keine Dateinamen der Patches anzeigen"
 
-#: builtin/log.c:1812
+#: builtin/log.c:1811
 msgid "show progress while generating patches"
 msgstr "Forschrittsanzeige während der Erzeugung der Patches"
 
-#: builtin/log.c:1814
+#: builtin/log.c:1813
 msgid "show changes against <rev> in cover letter or single patch"
 msgstr ""
 "Änderungen gegenüber <Commit> im Deckblatt oder einzelnem Patch anzeigen"
 
-#: builtin/log.c:1817
+#: builtin/log.c:1816
 msgid "show changes against <refspec> in cover letter or single patch"
 msgstr ""
 "Änderungen gegenüber <Refspec> im Deckblatt oder einzelnem Patch anzeigen"
 
-#: builtin/log.c:1819
+#: builtin/log.c:1818
 msgid "percentage by which creation is weighted"
 msgstr "Prozentsatz mit welchem Erzeugung gewichtet wird"
 
-#: builtin/log.c:1905
+#: builtin/log.c:1904
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "Ungültige Identifikationszeile: %s"
 
-#: builtin/log.c:1920
+#: builtin/log.c:1919
 msgid "-n and -k are mutually exclusive"
 msgstr "-n und -k schließen sich gegenseitig aus"
 
-#: builtin/log.c:1922
+#: builtin/log.c:1921
 msgid "--subject-prefix/--rfc and -k are mutually exclusive"
 msgstr "--subject-prefix/--rfc und -k schließen sich gegenseitig aus"
 
-#: builtin/log.c:1930
+#: builtin/log.c:1929
 msgid "--name-only does not make sense"
-msgstr "die Option --name-only kann nicht verwendet werden"
+msgstr "--name-only kann nicht verwendet werden"
 
-#: builtin/log.c:1932
+#: builtin/log.c:1931
 msgid "--name-status does not make sense"
-msgstr "die Option --name-status kann nicht verwendet werden"
+msgstr "--name-status kann nicht verwendet werden"
 
-#: builtin/log.c:1934
+#: builtin/log.c:1933
 msgid "--check does not make sense"
-msgstr "die Option --check kann nicht verwendet werden"
+msgstr "--check kann nicht verwendet werden"
 
-#: builtin/log.c:1956
+#: builtin/log.c:1955
 msgid "--stdout, --output, and --output-directory are mutually exclusive"
 msgstr ""
 "--stdout, --output und --output-directory schließen sich gegenseitig aus"
 
-#: builtin/log.c:2079
+#: builtin/log.c:2078
 msgid "--interdiff requires --cover-letter or single patch"
 msgstr "--interdiff erfordert --cover-letter oder einzelnen Patch"
 
-#: builtin/log.c:2083
+#: builtin/log.c:2082
 msgid "Interdiff:"
 msgstr "Interdiff:"
 
-#: builtin/log.c:2084
+#: builtin/log.c:2083
 #, c-format
 msgid "Interdiff against v%d:"
 msgstr "Interdiff gegen v%d:"
 
-#: builtin/log.c:2090
+#: builtin/log.c:2089
 msgid "--creation-factor requires --range-diff"
 msgstr "--creation-factor erfordert --range-diff"
 
-#: builtin/log.c:2094
+#: builtin/log.c:2093
 msgid "--range-diff requires --cover-letter or single patch"
 msgstr "--range-diff erfordert --cover-letter oder einzelnen Patch."
 
-#: builtin/log.c:2102
+#: builtin/log.c:2101
 msgid "Range-diff:"
 msgstr "Range-Diff:"
 
-#: builtin/log.c:2103
+#: builtin/log.c:2102
 #, c-format
 msgid "Range-diff against v%d:"
 msgstr "Range-Diff gegen v%d:"
 
-#: builtin/log.c:2114
+#: builtin/log.c:2113
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "Konnte Signatur-Datei '%s' nicht lesen"
 
-#: builtin/log.c:2150
+#: builtin/log.c:2149
 msgid "Generating patches"
 msgstr "Erzeuge Patches"
 
-#: builtin/log.c:2194
+#: builtin/log.c:2193
 msgid "failed to create output files"
 msgstr "Fehler beim Erstellen der Ausgabedateien."
 
-#: builtin/log.c:2253
+#: builtin/log.c:2252
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<Upstream> [<Branch> [<Limit>]]]"
 
-#: builtin/log.c:2307
+#: builtin/log.c:2306
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -16984,115 +17296,119 @@
 "Konnte gefolgten Remote-Branch nicht finden, bitte geben Sie <Upstream> "
 "manuell an.\n"
 
-#: builtin/ls-files.c:471
+#: builtin/ls-files.c:486
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<Optionen>] [<Datei>...]"
 
-#: builtin/ls-files.c:527
+#: builtin/ls-files.c:542
 msgid "identify the file status with tags"
 msgstr "den Dateistatus mit Tags anzeigen"
 
-#: builtin/ls-files.c:529
+#: builtin/ls-files.c:544
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr ""
 "Kleinbuchstaben für Dateien mit 'assume unchanged' Markierung verwenden"
 
-#: builtin/ls-files.c:531
+#: builtin/ls-files.c:546
 msgid "use lowercase letters for 'fsmonitor clean' files"
 msgstr "Kleinbuchstaben für 'fsmonitor clean' Dateien verwenden"
 
-#: builtin/ls-files.c:533
+#: builtin/ls-files.c:548
 msgid "show cached files in the output (default)"
 msgstr "zwischengespeicherte Dateien in der Ausgabe anzeigen (Standard)"
 
-#: builtin/ls-files.c:535
+#: builtin/ls-files.c:550
 msgid "show deleted files in the output"
 msgstr "entfernte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:537
+#: builtin/ls-files.c:552
 msgid "show modified files in the output"
 msgstr "geänderte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:539
+#: builtin/ls-files.c:554
 msgid "show other files in the output"
 msgstr "sonstige Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:541
+#: builtin/ls-files.c:556
 msgid "show ignored files in the output"
 msgstr "ignorierte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:544
+#: builtin/ls-files.c:559
 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:546
+#: builtin/ls-files.c:561
 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:548
+#: builtin/ls-files.c:563
 msgid "show 'other' directories' names only"
 msgstr "nur Namen von 'sonstigen' Verzeichnissen anzeigen"
 
-#: builtin/ls-files.c:550
+#: builtin/ls-files.c:565
 msgid "show line endings of files"
 msgstr "Zeilenenden von Dateien anzeigen"
 
-#: builtin/ls-files.c:552
+#: builtin/ls-files.c:567
 msgid "don't show empty directories"
 msgstr "keine leeren Verzeichnisse anzeigen"
 
-#: builtin/ls-files.c:555
+#: builtin/ls-files.c:570
 msgid "show unmerged files in the output"
 msgstr "nicht zusammengeführte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:557
+#: builtin/ls-files.c:572
 msgid "show resolve-undo information"
 msgstr "'resolve-undo' Informationen anzeigen"
 
-#: builtin/ls-files.c:559
+#: builtin/ls-files.c:574
 msgid "skip files matching pattern"
 msgstr "Dateien auslassen, die einem Muster entsprechen"
 
-#: builtin/ls-files.c:562
+#: builtin/ls-files.c:577
 msgid "exclude patterns are read from <file>"
 msgstr "Muster, gelesen von <Datei>, ausschließen"
 
-#: builtin/ls-files.c:565
+#: builtin/ls-files.c:580
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "zusätzliche pro-Verzeichnis Auschlussmuster aus <Datei> auslesen"
 
-#: builtin/ls-files.c:567
+#: builtin/ls-files.c:582
 msgid "add the standard git exclusions"
 msgstr "die standardmäßigen Git-Ausschlüsse hinzufügen"
 
-#: builtin/ls-files.c:571
+#: builtin/ls-files.c:586
 msgid "make the output relative to the project top directory"
 msgstr "Ausgabe relativ zum Projektverzeichnis"
 
-#: builtin/ls-files.c:574
+#: builtin/ls-files.c:589
 msgid "recurse through submodules"
 msgstr "Rekursion in Submodulen durchführen"
 
-#: builtin/ls-files.c:576
+#: builtin/ls-files.c:591
 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:577
+#: builtin/ls-files.c:592
 msgid "tree-ish"
 msgstr "Commit-Referenz"
 
-#: builtin/ls-files.c:578
+#: builtin/ls-files.c:593
 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:580
+#: builtin/ls-files.c:595
 msgid "show debugging data"
 msgstr "Ausgaben zur Fehlersuche anzeigen"
 
+#: builtin/ls-files.c:597
+msgid "suppress duplicate entries"
+msgstr "doppelte Einträge unterdrücken"
+
 #: builtin/ls-remote.c:9
 msgid ""
 "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
@@ -17103,41 +17419,41 @@
 "                     [-q | --quiet] [--exit-code] [--get-url]\n"
 "                     [--symref] [<Repository> [<Referenzen>...]]"
 
-#: builtin/ls-remote.c:59
+#: builtin/ls-remote.c:60
 msgid "do not print remote URL"
 msgstr "URL des Remote-Repositories nicht ausgeben"
 
-#: builtin/ls-remote.c:60 builtin/ls-remote.c:62 builtin/rebase.c:1398
+#: builtin/ls-remote.c:61 builtin/ls-remote.c:63 builtin/rebase.c:1404
 msgid "exec"
 msgstr "Programm"
 
-#: builtin/ls-remote.c:61 builtin/ls-remote.c:63
+#: builtin/ls-remote.c:62 builtin/ls-remote.c:64
 msgid "path of git-upload-pack on the remote host"
 msgstr "Pfad zu \"git-upload-pack\" auf der Gegenseite"
 
-#: builtin/ls-remote.c:65
+#: builtin/ls-remote.c:66
 msgid "limit to tags"
 msgstr "auf Tags einschränken"
 
-#: builtin/ls-remote.c:66
+#: builtin/ls-remote.c:67
 msgid "limit to heads"
 msgstr "auf Branches einschränken"
 
-#: builtin/ls-remote.c:67
+#: builtin/ls-remote.c:68
 msgid "do not show peeled tags"
 msgstr "keine Tags anzeigen, die andere Tags enthalten"
 
-#: builtin/ls-remote.c:69
+#: builtin/ls-remote.c:70
 msgid "take url.<base>.insteadOf into account"
 msgstr "url.<Basis>.insteadOf berücksichtigen"
 
-#: builtin/ls-remote.c:72
+#: builtin/ls-remote.c:73
 msgid "exit with exit code 2 if no matching refs are found"
 msgstr ""
 "mit Exit-Code 2 beenden, wenn keine übereinstimmenden Referenzen\n"
 "gefunden wurden"
 
-#: builtin/ls-remote.c:75
+#: builtin/ls-remote.c:76
 msgid "show underlying ref in addition to the object pointed by it"
 msgstr "zusätzlich zum Objekt die darauf verweisenden Referenzen anzeigen"
 
@@ -17295,194 +17611,194 @@
 msgid "Merging %s with %s\n"
 msgstr "Führe %s mit %s zusammen\n"
 
-#: builtin/merge.c:57
+#: builtin/merge.c:58
 msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<Optionen>] [<Commit>...]"
 
-#: builtin/merge.c:58
+#: builtin/merge.c:59
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:59
+#: builtin/merge.c:60
 msgid "git merge --continue"
 msgstr "git merge --continue"
 
-#: builtin/merge.c:122
+#: builtin/merge.c:123
 msgid "switch `m' requires a value"
 msgstr "Schalter 'm' erfordert einen Wert."
 
-#: builtin/merge.c:145
+#: builtin/merge.c:146
 #, c-format
 msgid "option `%s' requires a value"
 msgstr "Option `%s' erfordert einen Wert."
 
-#: builtin/merge.c:198
+#: builtin/merge.c:199
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Konnte Merge-Strategie '%s' nicht finden.\n"
 
-#: builtin/merge.c:199
+#: builtin/merge.c:200
 #, c-format
 msgid "Available strategies are:"
 msgstr "Verfügbare Strategien sind:"
 
-#: builtin/merge.c:204
+#: builtin/merge.c:205
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Verfügbare benutzerdefinierte Strategien sind:"
 
-#: builtin/merge.c:255 builtin/pull.c:133
+#: builtin/merge.c:256 builtin/pull.c:133
 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:258 builtin/pull.c:136
+#: builtin/merge.c:259 builtin/pull.c:136
 msgid "show a diffstat at the end of the merge"
 msgstr "eine Zusammenfassung der Unterschiede am Schluss des Merges anzeigen"
 
-#: builtin/merge.c:259 builtin/pull.c:139
+#: builtin/merge.c:260 builtin/pull.c:139
 msgid "(synonym to --stat)"
 msgstr "(Synonym für --stat)"
 
-#: builtin/merge.c:261 builtin/pull.c:142
+#: builtin/merge.c:262 builtin/pull.c:142
 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:264 builtin/pull.c:148
+#: builtin/merge.c:265 builtin/pull.c:148
 msgid "create a single commit instead of doing a merge"
-msgstr "einen einzelnen Commit anstatt eines Merges erzeugen"
+msgstr "einen einzelnen Commit erzeugen statt einen Merge durchzuführen"
 
-#: builtin/merge.c:266 builtin/pull.c:151
+#: builtin/merge.c:267 builtin/pull.c:151
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "einen Commit durchführen, wenn der Merge erfolgreich war (Standard)"
 
-#: builtin/merge.c:268 builtin/pull.c:154
+#: builtin/merge.c:269 builtin/pull.c:154
 msgid "edit message before committing"
 msgstr "Bearbeitung der Beschreibung vor dem Commit"
 
-#: builtin/merge.c:270
+#: builtin/merge.c:271
 msgid "allow fast-forward (default)"
 msgstr "Vorspulen erlauben (Standard)"
 
-#: builtin/merge.c:272 builtin/pull.c:161
+#: builtin/merge.c:273 builtin/pull.c:161
 msgid "abort if fast-forward is not possible"
 msgstr "abbrechen, wenn kein Vorspulen möglich ist"
 
-#: builtin/merge.c:276 builtin/pull.c:164
+#: builtin/merge.c:277 builtin/pull.c:164
 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:277 builtin/notes.c:787 builtin/pull.c:168
-#: builtin/rebase.c:539 builtin/rebase.c:1412 builtin/revert.c:114
+#: builtin/merge.c:278 builtin/notes.c:787 builtin/pull.c:168
+#: builtin/rebase.c:541 builtin/rebase.c:1418 builtin/revert.c:114
 msgid "strategy"
 msgstr "Strategie"
 
-#: builtin/merge.c:278 builtin/pull.c:169
+#: builtin/merge.c:279 builtin/pull.c:169
 msgid "merge strategy to use"
 msgstr "zu verwendende Merge-Strategie"
 
-#: builtin/merge.c:279 builtin/pull.c:172
+#: builtin/merge.c:280 builtin/pull.c:172
 msgid "option=value"
 msgstr "Option=Wert"
 
-#: builtin/merge.c:280 builtin/pull.c:173
+#: builtin/merge.c:281 builtin/pull.c:173
 msgid "option for selected merge strategy"
 msgstr "Option für ausgewählte Merge-Strategie"
 
-#: builtin/merge.c:282
+#: builtin/merge.c:283
 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:289
+#: builtin/merge.c:290
 msgid "abort the current in-progress merge"
 msgstr "den sich im Gange befindlichen Merge abbrechen"
 
-#: builtin/merge.c:291
+#: builtin/merge.c:292
 msgid "--abort but leave index and working tree alone"
 msgstr "--abort, aber Index und Arbeitsverzeichnis unverändert lassen"
 
-#: builtin/merge.c:293
+#: builtin/merge.c:294
 msgid "continue the current in-progress merge"
 msgstr "den sich im Gange befindlichen Merge fortsetzen"
 
-#: builtin/merge.c:295 builtin/pull.c:180
+#: builtin/merge.c:296 builtin/pull.c:180
 msgid "allow merging unrelated histories"
 msgstr "erlaube das Zusammenführen von nicht zusammenhängenden Historien"
 
-#: builtin/merge.c:302
+#: builtin/merge.c:303
 msgid "bypass pre-merge-commit and commit-msg hooks"
 msgstr "Hooks pre-merge-commit und commit-msg umgehen"
 
-#: builtin/merge.c:319
+#: builtin/merge.c:320
 msgid "could not run stash."
 msgstr "Konnte \"stash\" nicht ausführen."
 
-#: builtin/merge.c:324
+#: builtin/merge.c:325
 msgid "stash failed"
 msgstr "\"stash\" fehlgeschlagen"
 
-#: builtin/merge.c:329
+#: builtin/merge.c:330
 #, c-format
 msgid "not a valid object: %s"
 msgstr "kein gültiges Objekt: %s"
 
-#: builtin/merge.c:351 builtin/merge.c:368
+#: builtin/merge.c:352 builtin/merge.c:369
 msgid "read-tree failed"
 msgstr "read-tree fehlgeschlagen"
 
-#: builtin/merge.c:398
+#: builtin/merge.c:399
 msgid " (nothing to squash)"
 msgstr " (nichts zu quetschen)"
 
-#: builtin/merge.c:409
+#: builtin/merge.c:410
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Quetsche Commit -- HEAD wird nicht aktualisiert\n"
 
-#: builtin/merge.c:459
+#: builtin/merge.c:460
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "Keine Merge-Commit-Beschreibung -- HEAD wird nicht aktualisiert\n"
 
-#: builtin/merge.c:510
+#: builtin/merge.c:511
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' zeigt auf keinen Commit"
 
-#: builtin/merge.c:597
+#: builtin/merge.c:598
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Ungültiger branch.%s.mergeoptions String: %s"
 
-#: builtin/merge.c:723
+#: builtin/merge.c:724
 msgid "Not handling anything other than two heads merge."
 msgstr "Es wird nur der Merge von zwei Branches behandelt."
 
-#: builtin/merge.c:736
+#: builtin/merge.c:737
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Unbekannte Option für merge-recursive: -X%s"
 
-#: builtin/merge.c:755 t/helper/test-fast-rebase.c:209
+#: builtin/merge.c:756 t/helper/test-fast-rebase.c:209
 #, c-format
 msgid "unable to write %s"
 msgstr "konnte %s nicht schreiben"
 
-#: builtin/merge.c:807
+#: builtin/merge.c:808
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "konnte nicht von '%s' lesen"
 
-#: builtin/merge.c:816
+#: builtin/merge.c:817
 #, 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:822
+#: builtin/merge.c:823
 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"
@@ -17493,11 +17809,11 @@
 "Upstream-Branch mit einem Thema-Branch zusammenführt.\n"
 "\n"
 
-#: builtin/merge.c:827
+#: builtin/merge.c:828
 msgid "An empty message aborts the commit.\n"
 msgstr "Eine leere Commit-Beschreibung bricht den Commit ab.\n"
 
-#: builtin/merge.c:830
+#: builtin/merge.c:831
 #, c-format
 msgid ""
 "Lines starting with '%c' will be ignored, and an empty message aborts\n"
@@ -17506,75 +17822,75 @@
 "Zeilen, die mit '%c' beginnen, werden ignoriert,\n"
 "und eine leere Beschreibung bricht den Commit ab.\n"
 
-#: builtin/merge.c:883
+#: builtin/merge.c:884
 msgid "Empty commit message."
 msgstr "Leere Commit-Beschreibung"
 
-#: builtin/merge.c:898
+#: builtin/merge.c:899
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Wunderbar.\n"
 
-#: builtin/merge.c:959
+#: builtin/merge.c:960
 #, 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:998
+#: builtin/merge.c:999
 msgid "No current branch."
 msgstr "Sie befinden sich auf keinem Branch."
 
-#: builtin/merge.c:1000
+#: builtin/merge.c:1001
 msgid "No remote for the current branch."
 msgstr "Kein Remote-Repository für den aktuellen Branch."
 
-#: builtin/merge.c:1002
+#: builtin/merge.c:1003
 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:1007
+#: builtin/merge.c:1008
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Kein Remote-Tracking-Branch für %s von %s"
 
-#: builtin/merge.c:1064
+#: builtin/merge.c:1065
 #, c-format
 msgid "Bad value '%s' in environment '%s'"
 msgstr "Fehlerhafter Wert '%s' in Umgebungsvariable '%s'"
 
-#: builtin/merge.c:1167
+#: builtin/merge.c:1168
 #, 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:1201
+#: builtin/merge.c:1202
 msgid "not something we can merge"
 msgstr "nichts was wir zusammenführen können"
 
-#: builtin/merge.c:1311
+#: builtin/merge.c:1312
 msgid "--abort expects no arguments"
 msgstr "--abort akzeptiert keine Argumente"
 
-#: builtin/merge.c:1315
+#: builtin/merge.c:1316
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Es gibt keinen Merge abzubrechen (MERGE_HEAD fehlt)"
 
-#: builtin/merge.c:1333
+#: builtin/merge.c:1334
 msgid "--quit expects no arguments"
 msgstr "--quit erwartet keine Argumente"
 
-#: builtin/merge.c:1346
+#: builtin/merge.c:1347
 msgid "--continue expects no arguments"
 msgstr "--continue erwartet keine Argumente"
 
-#: builtin/merge.c:1350
+#: builtin/merge.c:1351
 msgid "There is no merge in progress (MERGE_HEAD missing)."
 msgstr "Es ist kein Merge im Gange (MERGE_HEAD fehlt)."
 
-#: builtin/merge.c:1366
+#: builtin/merge.c:1367
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -17582,7 +17898,7 @@
 "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert).\n"
 "Bitte committen Sie Ihre Änderungen, bevor Sie den Merge ausführen."
 
-#: builtin/merge.c:1373
+#: builtin/merge.c:1374
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -17590,105 +17906,147 @@
 "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:1376
+#: builtin/merge.c:1377
 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:1390
+#: builtin/merge.c:1391
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Sie können --squash nicht mit --no-ff kombinieren."
 
-#: builtin/merge.c:1392
+#: builtin/merge.c:1393
 msgid "You cannot combine --squash with --commit."
 msgstr "Sie können --squash nicht mit --commit kombinieren."
 
-#: builtin/merge.c:1408
+#: builtin/merge.c:1409
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Kein Commit angegeben und merge.defaultToUpstream ist nicht gesetzt."
 
-#: builtin/merge.c:1425
+#: builtin/merge.c:1426
 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:1427
+#: builtin/merge.c:1428
 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:1432
+#: builtin/merge.c:1433
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - nichts was wir zusammenführen können"
 
-#: builtin/merge.c:1434
+#: builtin/merge.c:1435
 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:1515
+#: builtin/merge.c:1516
 msgid "refusing to merge unrelated histories"
 msgstr "Verweigere den Merge von nicht zusammenhängenden Historien."
 
-#: builtin/merge.c:1524
+#: builtin/merge.c:1525
 msgid "Already up to date."
 msgstr "Bereits aktuell."
 
-#: builtin/merge.c:1534
+#: builtin/merge.c:1535
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Aktualisiere %s..%s\n"
 
-#: builtin/merge.c:1580
+#: builtin/merge.c:1581
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Probiere wirklich trivialen \"in-index\"-Merge ...\n"
 
-#: builtin/merge.c:1587
+#: builtin/merge.c:1588
 #, c-format
 msgid "Nope.\n"
 msgstr "Nein.\n"
 
-#: builtin/merge.c:1612
+#: builtin/merge.c:1613
 msgid "Already up to date. Yeeah!"
 msgstr "Bereits aktuell."
 
-#: builtin/merge.c:1618
+#: builtin/merge.c:1619
 msgid "Not possible to fast-forward, aborting."
 msgstr "Vorspulen nicht möglich, breche ab."
 
-#: builtin/merge.c:1646 builtin/merge.c:1711
+#: builtin/merge.c:1647 builtin/merge.c:1712
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Rücklauf des Verzeichnisses bis zum Ursprung ...\n"
 
-#: builtin/merge.c:1650
+#: builtin/merge.c:1651
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Probiere Merge-Strategie %s ...\n"
 
-#: builtin/merge.c:1702
+#: builtin/merge.c:1703
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Keine Merge-Strategie behandelt diesen Merge.\n"
 
-#: builtin/merge.c:1704
+#: builtin/merge.c:1705
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Merge mit Strategie %s fehlgeschlagen.\n"
 
-#: builtin/merge.c:1713
+#: builtin/merge.c:1714
 #, 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:1727
+#: builtin/merge.c:1728
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
 "Automatischer Merge abgeschlossen; halte, wie gewünscht, vor dem Commit an\n"
 
+#: builtin/mktag.c:10
+msgid "git mktag"
+msgstr "git mktag"
+
+#: builtin/mktag.c:30
+#, c-format
+msgid "warning: tag input does not pass fsck: %s"
+msgstr "Warnung: Tag-Eingabe ungültig für fsck: %s"
+
+#: builtin/mktag.c:41
+#, c-format
+msgid "error: tag input does not pass fsck: %s"
+msgstr "Fehler: Tag-Eingabe ungültig für fsck: %s"
+
+#: builtin/mktag.c:44
+#, c-format
+msgid "%d (FSCK_IGNORE?) should never trigger this callback"
+msgstr "%d (FSCK_IGNORE?) sollte diesen Aufruf niemals auslösen"
+
+#: builtin/mktag.c:59
+#, c-format
+msgid "could not read tagged object '%s'"
+msgstr "konnte getaggtes Objekt '%s' nicht lesen"
+
+#: builtin/mktag.c:62
+#, c-format
+msgid "object '%s' tagged as '%s', but is a '%s' type"
+msgstr "Objekt '%s' als '%s' getaggt, aber ist ein '%s' Typ"
+
+#: builtin/mktag.c:99
+msgid "tag on stdin did not pass our strict fsck check"
+msgstr ""
+"Tag von der Standardeingabe für unsere strenge Überprüfung bei fsck ungültig"
+
+#: builtin/mktag.c:102
+msgid "tag on stdin did not refer to a valid object"
+msgstr "Tag von der Standard-Eingabe verweiste nicht auf gültiges Objekt"
+
+#: builtin/mktag.c:105 builtin/tag.c:232
+msgid "unable to write tag file"
+msgstr "konnte Tag-Datei nicht schreiben"
+
 #: builtin/mktree.c:66
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -17726,7 +18084,10 @@
 "Während des Umpackens, sammle Paket-Dateien von geringerer Größe in "
 "einenStapel, welcher größer ist als diese Größe"
 
-#: builtin/multi-pack-index.c:50 builtin/prune-packed.c:25
+#: builtin/multi-pack-index.c:50 builtin/notes.c:376 builtin/notes.c:431
+#: builtin/notes.c:509 builtin/notes.c:521 builtin/notes.c:598
+#: builtin/notes.c:665 builtin/notes.c:815 builtin/notes.c:963
+#: builtin/notes.c:985 builtin/prune-packed.c:25 builtin/tag.c:575
 msgid "too many arguments"
 msgstr "Zu viele Argumente."
 
@@ -17833,7 +18194,7 @@
 msgid "Renaming %s to %s\n"
 msgstr "Benenne %s nach %s um\n"
 
-#: builtin/mv.c:280 builtin/remote.c:785 builtin/repack.c:484
+#: builtin/mv.c:280 builtin/remote.c:785 builtin/repack.c:483
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "Umbenennung von '%s' fehlgeschlagen"
@@ -18026,7 +18387,7 @@
 msgid "the note contents have been left in %s"
 msgstr "Die Notiz-Inhalte wurden in %s belassen."
 
-#: builtin/notes.c:242 builtin/tag.c:533
+#: builtin/notes.c:242 builtin/tag.c:565
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "konnte '%s' nicht öffnen oder lesen"
@@ -18068,12 +18429,6 @@
 "Ausführung von %s auf Notizen in %s (außerhalb von refs/notes/) "
 "zurückgewiesen"
 
-#: builtin/notes.c:376 builtin/notes.c:431 builtin/notes.c:509
-#: builtin/notes.c:521 builtin/notes.c:598 builtin/notes.c:665
-#: builtin/notes.c:815 builtin/notes.c:963 builtin/notes.c:985
-msgid "too many parameters"
-msgstr "zu viele Parameter"
-
 #: builtin/notes.c:389 builtin/notes.c:678
 #, c-format
 msgid "no note found for object %s."
@@ -18133,8 +18488,8 @@
 "stdin)"
 
 #: builtin/notes.c:517
-msgid "too few parameters"
-msgstr "zu wenig Parameter"
+msgid "too few arguments"
+msgstr "zu wenige Argumente"
 
 #: builtin/notes.c:538
 #, c-format
@@ -18266,7 +18621,7 @@
 "commit',\n"
 "oder brechen Sie den Merge mit 'git notes merge --abort' ab.\n"
 
-#: builtin/notes.c:897 builtin/tag.c:546
+#: builtin/notes.c:897 builtin/tag.c:578
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
@@ -18284,7 +18639,7 @@
 msgid "read object names from the standard input"
 msgstr "Objektnamen von der Standard-Eingabe lesen"
 
-#: builtin/notes.c:954 builtin/prune.c:132 builtin/worktree.c:220
+#: builtin/notes.c:954 builtin/prune.c:132 builtin/worktree.c:148
 msgid "do not remove, show only"
 msgstr "nicht löschen, nur anzeigen"
 
@@ -18300,7 +18655,7 @@
 msgid "use notes from <notes-ref>"
 msgstr "Notizen von <Notiz-Referenz> verwenden"
 
-#: builtin/notes.c:1034 builtin/stash.c:1604
+#: builtin/notes.c:1034 builtin/stash.c:1671
 #, c-format
 msgid "unknown subcommand: %s"
 msgstr "Unbekannter Unterbefehl: %s"
@@ -18319,106 +18674,120 @@
 "git pack-objects [<Optionen>...] <Basis-Name> [< <Referenzliste> | < "
 "<Objektliste>]"
 
-#: builtin/pack-objects.c:443
+#: builtin/pack-objects.c:440
+#, c-format
+msgid ""
+"write_reuse_object: could not locate %s, expected at offset %<PRIuMAX> in "
+"pack %s"
+msgstr ""
+"write_reuse_object: konnte %s nicht finden, erwartet bei Offset %<PRIuMAX> "
+"in Paket %s"
+
+#: builtin/pack-objects.c:448
 #, c-format
 msgid "bad packed object CRC for %s"
 msgstr "Ungültiges CRC für gepacktes Objekt %s."
 
-#: builtin/pack-objects.c:454
+#: builtin/pack-objects.c:459
 #, c-format
 msgid "corrupt packed object for %s"
 msgstr "Fehlerhaftes gepacktes Objekt für %s."
 
-#: builtin/pack-objects.c:585
+#: builtin/pack-objects.c:590
 #, c-format
 msgid "recursive delta detected for object %s"
 msgstr "Rekursiver Unterschied für Objekt %s festgestellt."
 
-#: builtin/pack-objects.c:796
+#: builtin/pack-objects.c:801
 #, c-format
 msgid "ordered %u objects, expected %<PRIu32>"
 msgstr "%u Objekte geordnet, %<PRIu32> erwartet."
 
-#: builtin/pack-objects.c:1004
+#: builtin/pack-objects.c:896
+#, c-format
+msgid "expected object at offset %<PRIuMAX> in pack %s"
+msgstr "Objekt beim Offset %<PRIuMAX> in Paket %s erwartet"
+
+#: builtin/pack-objects.c:1015
 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:1017
+#: builtin/pack-objects.c:1028
 msgid "Writing objects"
 msgstr "Schreibe Objekte"
 
-#: builtin/pack-objects.c:1078 builtin/update-index.c:90
+#: builtin/pack-objects.c:1089 builtin/update-index.c:90
 #, c-format
 msgid "failed to stat %s"
 msgstr "Konnte '%s' nicht lesen"
 
-#: builtin/pack-objects.c:1131
+#: builtin/pack-objects.c:1141
 #, c-format
 msgid "wrote %<PRIu32> objects while expecting %<PRIu32>"
 msgstr "Schrieb %<PRIu32> Objekte während %<PRIu32> erwartet waren."
 
-#: builtin/pack-objects.c:1348
+#: builtin/pack-objects.c:1358
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 "Deaktiviere Schreiben der Bitmap, da einige Objekte nicht in eine Pack-"
 "Datei\n"
 "geschrieben wurden."
 
-#: builtin/pack-objects.c:1796
+#: builtin/pack-objects.c:1806
 #, c-format
 msgid "delta base offset overflow in pack for %s"
 msgstr "\"delta base offset\" Überlauf in Paket für %s"
 
-#: builtin/pack-objects.c:1805
+#: builtin/pack-objects.c:1815
 #, c-format
 msgid "delta base offset out of bound for %s"
 msgstr "\"delta base offset\" liegt außerhalb des gültigen Bereichs für %s"
 
-#: builtin/pack-objects.c:2086
+#: builtin/pack-objects.c:2096
 msgid "Counting objects"
 msgstr "Zähle Objekte"
 
-#: builtin/pack-objects.c:2231
+#: builtin/pack-objects.c:2241
 #, c-format
 msgid "unable to parse object header of %s"
 msgstr "Konnte Kopfbereich von Objekt '%s' nicht parsen."
 
-#: builtin/pack-objects.c:2301 builtin/pack-objects.c:2317
-#: builtin/pack-objects.c:2327
+#: builtin/pack-objects.c:2311 builtin/pack-objects.c:2327
+#: builtin/pack-objects.c:2337
 #, c-format
 msgid "object %s cannot be read"
 msgstr "Objekt %s kann nicht gelesen werden."
 
-#: builtin/pack-objects.c:2304 builtin/pack-objects.c:2331
+#: builtin/pack-objects.c:2314 builtin/pack-objects.c:2341
 #, c-format
 msgid "object %s inconsistent object length (%<PRIuMAX> vs %<PRIuMAX>)"
 msgstr "Inkonsistente Objektlänge bei Objekt %s (%<PRIuMAX> vs %<PRIuMAX>)"
 
-#: builtin/pack-objects.c:2341
+#: builtin/pack-objects.c:2351
 msgid "suboptimal pack - out of memory"
 msgstr "ungünstiges Packet - Speicher voll"
 
-#: builtin/pack-objects.c:2656
+#: builtin/pack-objects.c:2666
 #, c-format
 msgid "Delta compression using up to %d threads"
 msgstr "Delta-Kompression verwendet bis zu %d Threads."
 
-#: builtin/pack-objects.c:2795
+#: builtin/pack-objects.c:2805
 #, c-format
 msgid "unable to pack objects reachable from tag %s"
 msgstr "Konnte keine Objekte packen, die von Tag %s erreichbar sind."
 
-#: builtin/pack-objects.c:2883
+#: builtin/pack-objects.c:2891
 msgid "Compressing objects"
 msgstr "Komprimiere Objekte"
 
-#: builtin/pack-objects.c:2889
+#: builtin/pack-objects.c:2897
 msgid "inconsistency with delta count"
 msgstr "Inkonsistenz mit der Anzahl von Deltas"
 
-#: builtin/pack-objects.c:2961
+#: builtin/pack-objects.c:2976
 #, c-format
 msgid ""
 "value of uploadpack.blobpackfileuri must be of the form '<object-hash> <pack-"
@@ -18427,7 +18796,7 @@
 "Wert für uploadpack.blobpackfileuri muss in der Form '<Objekt-Hash> <Pack-"
 "Hash> <URI>' vorliegen ('%s' erhalten)"
 
-#: builtin/pack-objects.c:2964
+#: builtin/pack-objects.c:2979
 #, c-format
 msgid ""
 "object already configured in another uploadpack.blobpackfileuri (got '%s')"
@@ -18435,7 +18804,7 @@
 "Objekt bereits in einem anderen uploadpack.blobpackfileuri konfiguriert "
 "('%s' erhalten)"
 
-#: builtin/pack-objects.c:2993
+#: builtin/pack-objects.c:3008
 #, c-format
 msgid ""
 "expected edge object ID, got garbage:\n"
@@ -18444,7 +18813,7 @@
 "erwartete Randobjekt-ID, erhielt nutzlose Daten:\n"
 " %s"
 
-#: builtin/pack-objects.c:2999
+#: builtin/pack-objects.c:3014
 #, c-format
 msgid ""
 "expected object ID, got garbage:\n"
@@ -18453,250 +18822,250 @@
 "erwartete Objekt-ID, erhielt nutzlose Daten:\n"
 " %s"
 
-#: builtin/pack-objects.c:3097
+#: builtin/pack-objects.c:3112
 msgid "invalid value for --missing"
 msgstr "ungültiger Wert für --missing"
 
-#: builtin/pack-objects.c:3156 builtin/pack-objects.c:3264
+#: builtin/pack-objects.c:3171 builtin/pack-objects.c:3279
 msgid "cannot open pack index"
 msgstr "kann Paketindex nicht öffnen"
 
-#: builtin/pack-objects.c:3187
+#: builtin/pack-objects.c:3202
 #, c-format
 msgid "loose object at %s could not be examined"
 msgstr "loses Objekt bei %s konnte nicht untersucht werden"
 
-#: builtin/pack-objects.c:3272
+#: builtin/pack-objects.c:3287
 msgid "unable to force loose object"
 msgstr "konnte loses Objekt nicht erzwingen"
 
-#: builtin/pack-objects.c:3365
+#: builtin/pack-objects.c:3380
 #, c-format
 msgid "not a rev '%s'"
 msgstr "'%s' ist kein Commit"
 
-#: builtin/pack-objects.c:3368
+#: builtin/pack-objects.c:3383
 #, c-format
 msgid "bad revision '%s'"
 msgstr "ungültiger Commit '%s'"
 
-#: builtin/pack-objects.c:3393
+#: builtin/pack-objects.c:3408
 msgid "unable to add recent objects"
 msgstr "konnte neuere Objekte nicht hinzufügen"
 
-#: builtin/pack-objects.c:3446
+#: builtin/pack-objects.c:3461
 #, c-format
 msgid "unsupported index version %s"
 msgstr "nicht unterstützte Index-Version %s"
 
-#: builtin/pack-objects.c:3450
+#: builtin/pack-objects.c:3465
 #, c-format
 msgid "bad index version '%s'"
 msgstr "ungültige Index-Version '%s'"
 
-#: builtin/pack-objects.c:3488
+#: builtin/pack-objects.c:3503
 msgid "<version>[,<offset>]"
 msgstr "<Version>[,<Offset>]"
 
-#: builtin/pack-objects.c:3489
+#: builtin/pack-objects.c:3504
 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:3492
+#: builtin/pack-objects.c:3507
 msgid "maximum size of each output pack file"
 msgstr "maximale Größe für jede ausgegebene Paketdatei"
 
-#: builtin/pack-objects.c:3494
+#: builtin/pack-objects.c:3509
 msgid "ignore borrowed objects from alternate object store"
 msgstr "geliehene Objekte von alternativem Objektspeicher ignorieren"
 
-#: builtin/pack-objects.c:3496
+#: builtin/pack-objects.c:3511
 msgid "ignore packed objects"
 msgstr "gepackte Objekte ignorieren"
 
-#: builtin/pack-objects.c:3498
+#: builtin/pack-objects.c:3513
 msgid "limit pack window by objects"
 msgstr "Paketfenster durch Objekte begrenzen"
 
-#: builtin/pack-objects.c:3500
+#: builtin/pack-objects.c:3515
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 "Paketfenster, zusätzlich zur Objektbegrenzung, durch Speicher begrenzen"
 
-#: builtin/pack-objects.c:3502
+#: builtin/pack-objects.c:3517
 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:3504
+#: builtin/pack-objects.c:3519
 msgid "reuse existing deltas"
 msgstr "existierende Unterschiede wiederverwenden"
 
-#: builtin/pack-objects.c:3506
+#: builtin/pack-objects.c:3521
 msgid "reuse existing objects"
 msgstr "existierende Objekte wiederverwenden"
 
-#: builtin/pack-objects.c:3508
+#: builtin/pack-objects.c:3523
 msgid "use OFS_DELTA objects"
 msgstr "OFS_DELTA Objekte verwenden"
 
-#: builtin/pack-objects.c:3510
+#: builtin/pack-objects.c:3525
 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:3512
+#: builtin/pack-objects.c:3527
 msgid "do not create an empty pack output"
 msgstr "keine leeren Pakete erzeugen"
 
-#: builtin/pack-objects.c:3514
+#: builtin/pack-objects.c:3529
 msgid "read revision arguments from standard input"
 msgstr "Argumente bezüglich Commits von der Standard-Eingabe lesen"
 
-#: builtin/pack-objects.c:3516
+#: builtin/pack-objects.c:3531
 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:3519
+#: builtin/pack-objects.c:3534
 msgid "include objects reachable from any reference"
 msgstr "Objekte einschließen, die von jeder Referenz erreichbar sind"
 
-#: builtin/pack-objects.c:3522
+#: builtin/pack-objects.c:3537
 msgid "include objects referred by reflog entries"
 msgstr ""
 "Objekte einschließen, die von Einträgen des Reflogs referenziert werden"
 
-#: builtin/pack-objects.c:3525
+#: builtin/pack-objects.c:3540
 msgid "include objects referred to by the index"
 msgstr "Objekte einschließen, die vom Index referenziert werden"
 
-#: builtin/pack-objects.c:3528
+#: builtin/pack-objects.c:3543
 msgid "output pack to stdout"
 msgstr "Paket in die Standard-Ausgabe schreiben"
 
-#: builtin/pack-objects.c:3530
+#: builtin/pack-objects.c:3545
 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:3532
+#: builtin/pack-objects.c:3547
 msgid "keep unreachable objects"
 msgstr "nicht erreichbare Objekte behalten"
 
-#: builtin/pack-objects.c:3534
+#: builtin/pack-objects.c:3549
 msgid "pack loose unreachable objects"
 msgstr "nicht erreichbare lose Objekte packen"
 
-#: builtin/pack-objects.c:3536
+#: builtin/pack-objects.c:3551
 msgid "unpack unreachable objects newer than <time>"
 msgstr "nicht erreichbare Objekte entpacken, die neuer als <Zeit> sind"
 
-#: builtin/pack-objects.c:3539
+#: builtin/pack-objects.c:3554
 msgid "use the sparse reachability algorithm"
 msgstr "den \"sparse\" Algorithmus zur Bestimmung der Erreichbarkeit benutzen"
 
-#: builtin/pack-objects.c:3541
+#: builtin/pack-objects.c:3556
 msgid "create thin packs"
 msgstr "dünnere Pakete erzeugen"
 
-#: builtin/pack-objects.c:3543
+#: builtin/pack-objects.c:3558
 msgid "create packs suitable for shallow fetches"
 msgstr ""
 "Pakete geeignet für Abholung mit unvollständiger Historie (shallow) erzeugen"
 
-#: builtin/pack-objects.c:3545
+#: builtin/pack-objects.c:3560
 msgid "ignore packs that have companion .keep file"
 msgstr "Pakete ignorieren, die .keep Dateien haben"
 
-#: builtin/pack-objects.c:3547
+#: builtin/pack-objects.c:3562
 msgid "ignore this pack"
 msgstr "dieses Paket ignorieren"
 
-#: builtin/pack-objects.c:3549
+#: builtin/pack-objects.c:3564
 msgid "pack compression level"
 msgstr "Komprimierungsgrad für Paketierung"
 
-#: builtin/pack-objects.c:3551
+#: builtin/pack-objects.c:3566
 msgid "do not hide commits by grafts"
 msgstr "keine künstlichen Vorgänger-Commits (\"grafts\") verbergen"
 
-#: builtin/pack-objects.c:3553
+#: builtin/pack-objects.c:3568
 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:3555
+#: builtin/pack-objects.c:3570
 msgid "write a bitmap index together with the pack index"
 msgstr "Bitmap-Index zusammen mit Pack-Index schreiben"
 
-#: builtin/pack-objects.c:3559
+#: builtin/pack-objects.c:3574
 msgid "write a bitmap index if possible"
 msgstr "Bitmap-Index schreiben, wenn möglich"
 
-#: builtin/pack-objects.c:3563
+#: builtin/pack-objects.c:3578
 msgid "handling for missing objects"
 msgstr "Behandlung für fehlende Objekte"
 
-#: builtin/pack-objects.c:3566
+#: builtin/pack-objects.c:3581
 msgid "do not pack objects in promisor packfiles"
 msgstr ""
 "keine Objekte aus Packdateien von partiell geklonten Remote-Repositories "
 "packen"
 
-#: builtin/pack-objects.c:3568
+#: builtin/pack-objects.c:3583
 msgid "respect islands during delta compression"
 msgstr "Delta-Islands bei Delta-Kompression beachten"
 
-#: builtin/pack-objects.c:3570
+#: builtin/pack-objects.c:3585
 msgid "protocol"
 msgstr "Protokoll"
 
-#: builtin/pack-objects.c:3571
+#: builtin/pack-objects.c:3586
 msgid "exclude any configured uploadpack.blobpackfileuri with this protocol"
 msgstr ""
 "jegliche konfigurierte uploadpack.blobpackfileuri für dieses Protkoll "
 "ausschließen"
 
-#: builtin/pack-objects.c:3600
+#: builtin/pack-objects.c:3617
 #, c-format
 msgid "delta chain depth %d is too deep, forcing %d"
 msgstr "Tiefe für Verkettung von Unterschieden %d ist zu tief, erzwinge %d"
 
-#: builtin/pack-objects.c:3605
+#: builtin/pack-objects.c:3622
 #, c-format
 msgid "pack.deltaCacheLimit is too high, forcing %d"
 msgstr "pack.deltaCacheLimit ist zu hoch, erzwinge %d"
 
-#: builtin/pack-objects.c:3659
+#: builtin/pack-objects.c:3676
 msgid "--max-pack-size cannot be used to build a pack for transfer"
 msgstr ""
 "--max-pack-size kann nicht für die Erstellung eines Pakets für eine "
 "Übertragung\n"
 "benutzt werden."
 
-#: builtin/pack-objects.c:3661
+#: builtin/pack-objects.c:3678
 msgid "minimum pack size limit is 1 MiB"
 msgstr "Minimales Limit für die Paketgröße ist 1 MiB."
 
-#: builtin/pack-objects.c:3666
+#: builtin/pack-objects.c:3683
 msgid "--thin cannot be used to build an indexable pack"
 msgstr ""
 "--thin kann nicht benutzt werden, um ein indizierbares Paket zu erstellen."
 
-#: builtin/pack-objects.c:3669
+#: builtin/pack-objects.c:3686
 msgid "--keep-unreachable and --unpack-unreachable are incompatible"
 msgstr "--keep-unreachable und --unpack-unreachable sind inkompatibel"
 
-#: builtin/pack-objects.c:3675
+#: builtin/pack-objects.c:3692
 msgid "cannot use --filter without --stdout"
 msgstr "Kann --filter nicht ohne --stdout benutzen."
 
-#: builtin/pack-objects.c:3735
+#: builtin/pack-objects.c:3752
 msgid "Enumerating objects"
 msgstr "Objekte aufzählen"
 
-#: builtin/pack-objects.c:3766
+#: builtin/pack-objects.c:3783
 #, c-format
 msgid ""
 "Total %<PRIu32> (delta %<PRIu32>), reused %<PRIu32> (delta %<PRIu32>), pack-"
@@ -18705,6 +19074,21 @@
 "Gesamt %<PRIu32> (Delta %<PRIu32>), Wiederverwendet %<PRIu32> (Delta "
 "%<PRIu32>), Pack wiederverwendet %<PRIu32>"
 
+#: builtin/pack-redundant.c:601
+msgid ""
+"'git pack-redundant' is nominated for removal.\n"
+"If you still use this command, please add an extra\n"
+"option, '--i-still-use-this', on the command line\n"
+"and let us know you still use it by sending an e-mail\n"
+"to <git@vger.kernel.org>.  Thanks.\n"
+msgstr ""
+"'git pack-redundant' ist für die Entfernung vorgesehen.\n"
+"Wenn Sie diesen Befehl weiterhin verwenden, fügen Sie\n"
+"bitte eine zusätzliche Option '--i-still-use-this' in\n"
+"der Befehlszeile hinzu und lassen Sie uns wissen, dass\n"
+"Sie es immer noch verwenden, indem Sie eine E-Mail an\n"
+"<git@vger.kernel.org> senden. Danke.\n"
+
 #: builtin/pack-refs.c:8
 msgid "git pack-refs [<options>]"
 msgstr "git pack-refs [<Optionen>]"
@@ -18764,7 +19148,7 @@
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "Integration von Änderungen durch Rebase statt Merge"
 
-#: builtin/pull.c:158 builtin/rebase.c:490 builtin/revert.c:126
+#: builtin/pull.c:158 builtin/rebase.c:492 builtin/revert.c:126
 msgid "allow fast-forward"
 msgstr "Vorspulen erlauben"
 
@@ -18789,7 +19173,100 @@
 msgid "Invalid value for pull.ff: %s"
 msgstr "Ungültiger Wert für pull.ff: %s"
 
-#: builtin/pull.c:348
+#: builtin/pull.c:445
+msgid ""
+"There is no candidate for rebasing against among the refs that you just "
+"fetched."
+msgstr ""
+"Es gibt keinen Kandidaten für Rebase innerhalb der Referenzen, die eben "
+"angefordert wurden."
+
+#: builtin/pull.c:447
+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:448
+msgid ""
+"Generally this means that you provided a wildcard refspec which had no\n"
+"matches on the remote end."
+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:451
+#, 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 ""
+"Sie führten \"pull\" von Remote-Repository '%s' aus, ohne einen\n"
+"Branch anzugeben. Da das nicht das konfigurierte Standard-Remote-\n"
+"Repository für den aktuellen Branch ist, müssen Sie einen Branch auf\n"
+"der Befehlszeile angeben."
+
+#: builtin/pull.c:456 builtin/rebase.c:1253
+msgid "You are not currently on a branch."
+msgstr "Im Moment auf keinem Branch."
+
+#: builtin/pull.c:458 builtin/pull.c:473
+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:460 builtin/pull.c:475
+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:461 builtin/pull.c:476
+msgid "See git-pull(1) for details."
+msgstr "Siehe git-pull(1) für weitere Details."
+
+#: builtin/pull.c:463 builtin/pull.c:469 builtin/pull.c:478
+#: builtin/rebase.c:1259
+msgid "<remote>"
+msgstr "<Remote-Repository>"
+
+#: builtin/pull.c:463 builtin/pull.c:478 builtin/pull.c:483
+msgid "<branch>"
+msgstr "<Branch>"
+
+#: builtin/pull.c:471 builtin/rebase.c:1251
+msgid "There is no tracking information for the current branch."
+msgstr "Es gibt keine Tracking-Informationen für den aktuellen Branch."
+
+#: builtin/pull.c:480
+msgid ""
+"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:"
+
+#: builtin/pull.c:485
+#, c-format
+msgid ""
+"Your configuration specifies to merge with the ref '%s'\n"
+"from the remote, but no such ref was fetched."
+msgstr ""
+"Ihre Konfiguration gibt an, den Merge mit Referenz '%s'\n"
+"des Remote-Repositories durchzuführen, aber diese Referenz\n"
+"wurde nicht angefordert."
+
+#: builtin/pull.c:596
+#, c-format
+msgid "unable to access commit %s"
+msgstr "Konnte nicht auf Commit '%s' zugreifen."
+
+#: builtin/pull.c:902
+msgid "ignoring --verify-signatures for rebase"
+msgstr "Ignoriere --verify-signatures für Rebase"
+
+#: builtin/pull.c:930
 msgid ""
 "Pulling without specifying how to reconcile divergent branches is\n"
 "discouraged. You can squelch this message by running one of the following\n"
@@ -18819,114 +19296,21 @@
 "Option --rebase, --no-rebase oder --ff-only auf der Kommandozeile nutzen,\n"
 "um das konfigurierte Standardverhalten pro Aufruf zu überschreiben.\n"
 
-#: builtin/pull.c:458
-msgid ""
-"There is no candidate for rebasing against among the refs that you just "
-"fetched."
-msgstr ""
-"Es gibt keinen Kandidaten für Rebase innerhalb der Referenzen, die eben "
-"angefordert wurden."
-
-#: builtin/pull.c:460
-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:461
-msgid ""
-"Generally this means that you provided a wildcard refspec which had no\n"
-"matches on the remote end."
-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:464
-#, 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 ""
-"Sie führten \"pull\" von Remote-Repository '%s' aus, ohne einen\n"
-"Branch anzugeben. Da das nicht das konfigurierte Standard-Remote-\n"
-"Repository für den aktuellen Branch ist, müssen Sie einen Branch auf\n"
-"der Befehlszeile angeben."
-
-#: builtin/pull.c:469 builtin/rebase.c:1246
-msgid "You are not currently on a branch."
-msgstr "Im Moment auf keinem Branch."
-
-#: builtin/pull.c:471 builtin/pull.c:486
-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:473 builtin/pull.c:488
-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:474 builtin/pull.c:489
-msgid "See git-pull(1) for details."
-msgstr "Siehe git-pull(1) für weitere Details."
-
-#: builtin/pull.c:476 builtin/pull.c:482 builtin/pull.c:491
-#: builtin/rebase.c:1252
-msgid "<remote>"
-msgstr "<Remote-Repository>"
-
-#: builtin/pull.c:476 builtin/pull.c:491 builtin/pull.c:496
-msgid "<branch>"
-msgstr "<Branch>"
-
-#: builtin/pull.c:484 builtin/rebase.c:1244
-msgid "There is no tracking information for the current branch."
-msgstr "Es gibt keine Tracking-Informationen für den aktuellen Branch."
-
-#: builtin/pull.c:493
-msgid ""
-"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:"
-
-#: builtin/pull.c:498
-#, c-format
-msgid ""
-"Your configuration specifies to merge with the ref '%s'\n"
-"from the remote, but no such ref was fetched."
-msgstr ""
-"Ihre Konfiguration gibt an, den Merge mit Referenz '%s'\n"
-"des Remote-Repositories durchzuführen, aber diese Referenz\n"
-"wurde nicht angefordert."
-
-#: builtin/pull.c:609
-#, c-format
-msgid "unable to access commit %s"
-msgstr "Konnte nicht auf Commit '%s' zugreifen."
-
-#: builtin/pull.c:915
-msgid "ignoring --verify-signatures for rebase"
-msgstr "Ignoriere --verify-signatures für Rebase"
-
-#: builtin/pull.c:972
+#: builtin/pull.c:991
 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:976
+#: builtin/pull.c:995
 msgid "pull with rebase"
 msgstr "Pull mit Rebase"
 
-#: builtin/pull.c:977
+#: builtin/pull.c:996
 msgid "please commit or stash them."
 msgstr "Bitte committen Sie die Änderungen oder benutzen Sie \"stash\"."
 
-#: builtin/pull.c:1002
+#: builtin/pull.c:1021
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -18936,7 +19320,7 @@
 "\"fetch\" aktualisierte die Spitze des aktuellen Branches.\n"
 "Spule Ihr Arbeitsverzeichnis von Commit %s vor."
 
-#: builtin/pull.c:1008
+#: builtin/pull.c:1027
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -18953,15 +19337,15 @@
 "$ git reset --hard\n"
 "zur Wiederherstellung aus."
 
-#: builtin/pull.c:1023
+#: builtin/pull.c:1042
 msgid "Cannot merge multiple branches into empty head."
 msgstr "Kann nicht mehrere Branches in einen leeren Branch zusammenführen."
 
-#: builtin/pull.c:1027
+#: builtin/pull.c:1046
 msgid "Cannot rebase onto multiple branches."
 msgstr "Kann Rebase nicht auf mehrere Branches ausführen."
 
-#: builtin/pull.c:1041
+#: builtin/pull.c:1067
 msgid "cannot rebase with locally recorded submodule modifications"
 msgstr ""
 "Kann Rebase nicht mit lokal aufgezeichneten Änderungen in Submodulen "
@@ -18977,7 +19361,7 @@
 
 #: builtin/push.c:119
 msgid "--delete only accepts plain target ref names"
-msgstr "Die Option --delete akzeptiert nur reine Referenznamen als Ziel."
+msgstr "--delete akzeptiert nur reine Referenznamen als Ziel"
 
 #: builtin/push.c:164
 msgid ""
@@ -19227,11 +19611,11 @@
 
 #: builtin/push.c:601
 msgid "--delete is incompatible with --all, --mirror and --tags"
-msgstr "Die Option --delete ist inkompatibel mit --all, --mirror und --tags."
+msgstr "--delete ist inkompatibel mit --all, --mirror und --tags"
 
 #: builtin/push.c:603
 msgid "--delete doesn't make sense without any refs"
-msgstr "Die Option --delete kann nur mit Referenzen verwendet werden."
+msgstr "--delete kann nur mit Referenzen verwendet werden"
 
 #: builtin/push.c:623
 #, c-format
@@ -19262,68 +19646,76 @@
 
 #: builtin/push.c:639
 msgid "--all and --tags are incompatible"
-msgstr "Die Optionen --all und --tags sind inkompatibel."
+msgstr "--all und --tags sind inkompatibel"
 
 #: builtin/push.c:641
 msgid "--all can't be combined with refspecs"
-msgstr "Die Option --all kann nicht mit Refspecs kombiniert werden."
+msgstr "--all kann nicht mit Refspecs kombiniert werden"
 
 #: builtin/push.c:645
 msgid "--mirror and --tags are incompatible"
-msgstr "Die Optionen --mirror und --tags sind inkompatibel."
+msgstr "--mirror und --tags sind inkompatibel"
 
 #: builtin/push.c:647
 msgid "--mirror can't be combined with refspecs"
-msgstr "Die Option --mirror kann nicht mit Refspecs kombiniert werden."
+msgstr "--mirror kann nicht mit Refspecs kombiniert werden"
 
 #: builtin/push.c:650
 msgid "--all and --mirror are incompatible"
-msgstr "Die Optionen --all und --mirror sind inkompatibel."
+msgstr "--all und --mirror sind inkompatibel"
 
 #: builtin/push.c:657
 msgid "push options must not have new line characters"
 msgstr "Push-Optionen dürfen keine Zeilenvorschubzeichen haben"
 
-#: builtin/range-diff.c:8
+#: builtin/range-diff.c:9
 msgid "git range-diff [<options>] <old-base>..<old-tip> <new-base>..<new-tip>"
 msgstr ""
 "git range-diff [<Optionen>] <alte-Basis>..<alte-Spitze> <neue-Basis>..<neue-"
 "Spitze>"
 
-#: builtin/range-diff.c:9
+#: builtin/range-diff.c:10
 msgid "git range-diff [<options>] <old-tip>...<new-tip>"
 msgstr "git range-diff [<Optionen>] <alte-Spitze>...<neue-Spitze>"
 
-#: builtin/range-diff.c:10
+#: builtin/range-diff.c:11
 msgid "git range-diff [<options>] <base> <old-tip> <new-tip>"
 msgstr "git range-diff [<Optionen>] <Basis> <alte-Spitze> <neue-Spitze>"
 
-#: builtin/range-diff.c:22
+#: builtin/range-diff.c:28
 msgid "Percentage by which creation is weighted"
 msgstr "Prozentsatz mit welchem Erzeugung gewichtet wird"
 
-#: builtin/range-diff.c:24
+#: builtin/range-diff.c:30
 msgid "use simple diff colors"
 msgstr "einfache Diff-Farben benutzen"
 
-#: builtin/range-diff.c:26
+#: builtin/range-diff.c:32
 msgid "notes"
 msgstr "Notizen"
 
-#: builtin/range-diff.c:26
+#: builtin/range-diff.c:32
 msgid "passed to 'git log'"
 msgstr "an 'git log' übergeben"
 
-#: builtin/range-diff.c:50 builtin/range-diff.c:54
-#, c-format
-msgid "no .. in range: '%s'"
-msgstr "Kein .. im Bereich: '%s'"
+#: builtin/range-diff.c:35
+msgid "only emit output related to the first range"
+msgstr "nur Ausgaben anzeigen, die sich auf den ersten Bereich beziehen"
 
-#: builtin/range-diff.c:64
+#: builtin/range-diff.c:37
+msgid "only emit output related to the second range"
+msgstr "nur Ausgaben anzeigen, die sich auf den zweiten Bereich beziehen"
+
+#: builtin/range-diff.c:60 builtin/range-diff.c:64
+#, c-format
+msgid "not a commit range: '%s'"
+msgstr "kein Commit-Bereich: '%s'"
+
+#: builtin/range-diff.c:74
 msgid "single arg format must be symmetric range"
 msgstr "Format mit einfachem Argument muss symmetrischer Bereich sein."
 
-#: builtin/range-diff.c:79
+#: builtin/range-diff.c:89
 msgid "need two commit ranges"
 msgstr "Benötige zwei Commit-Bereiche."
 
@@ -19429,194 +19821,194 @@
 msgid "git rebase --continue | --abort | --skip | --edit-todo"
 msgstr "git rebase --continue | --abort | --skip | --edit-todo"
 
-#: builtin/rebase.c:193 builtin/rebase.c:217 builtin/rebase.c:244
+#: builtin/rebase.c:195 builtin/rebase.c:219 builtin/rebase.c:246
 #, c-format
 msgid "unusable todo list: '%s'"
 msgstr "Unbenutzbare TODO-Liste: '%s'"
 
-#: builtin/rebase.c:310
+#: builtin/rebase.c:312
 #, c-format
 msgid "could not create temporary %s"
 msgstr "Konnte temporäres Verzeichnis '%s' nicht erstellen."
 
-#: builtin/rebase.c:316
+#: builtin/rebase.c:318
 msgid "could not mark as interactive"
 msgstr "Markierung auf interaktiven Rebase fehlgeschlagen."
 
-#: builtin/rebase.c:369
+#: builtin/rebase.c:371
 msgid "could not generate todo list"
 msgstr "Konnte TODO-Liste nicht erzeugen."
 
-#: builtin/rebase.c:411
+#: builtin/rebase.c:413
 msgid "a base commit must be provided with --upstream or --onto"
 msgstr "Ein Basis-Commit muss mit --upstream oder --onto angegeben werden."
 
-#: builtin/rebase.c:480
+#: builtin/rebase.c:482
 msgid "git rebase--interactive [<options>]"
 msgstr "git rebase--interactive [<Optionen>]"
 
-#: builtin/rebase.c:493 builtin/rebase.c:1388
+#: builtin/rebase.c:495 builtin/rebase.c:1394
 msgid "keep commits which start empty"
 msgstr "behalte Commits, die leer beginnen"
 
-#: builtin/rebase.c:497 builtin/revert.c:128
+#: builtin/rebase.c:499 builtin/revert.c:128
 msgid "allow commits with empty messages"
 msgstr "Commits mit leerer Beschreibung erlauben"
 
-#: builtin/rebase.c:499
+#: builtin/rebase.c:501
 msgid "rebase merge commits"
 msgstr "Rebase auf Merge-Commits ausführen"
 
-#: builtin/rebase.c:501
+#: builtin/rebase.c:503
 msgid "keep original branch points of cousins"
 msgstr "originale Branch-Punkte der Cousins behalten"
 
-#: builtin/rebase.c:503
+#: builtin/rebase.c:505
 msgid "move commits that begin with squash!/fixup!"
 msgstr "Commits verschieben, die mit squash!/fixup! beginnen"
 
-#: builtin/rebase.c:504
+#: builtin/rebase.c:506
 msgid "sign commits"
 msgstr "Commits signieren"
 
-#: builtin/rebase.c:506 builtin/rebase.c:1327
+#: builtin/rebase.c:508 builtin/rebase.c:1333
 msgid "display a diffstat of what changed upstream"
 msgstr ""
 "Zusammenfassung der Unterschiede gegenüber dem Upstream-Branch anzeigen"
 
-#: builtin/rebase.c:508
+#: builtin/rebase.c:510
 msgid "continue rebase"
 msgstr "Rebase fortsetzen"
 
-#: builtin/rebase.c:510
+#: builtin/rebase.c:512
 msgid "skip commit"
 msgstr "Commit auslassen"
 
-#: builtin/rebase.c:511
+#: builtin/rebase.c:513
 msgid "edit the todo list"
 msgstr "die TODO-Liste bearbeiten"
 
-#: builtin/rebase.c:513
+#: builtin/rebase.c:515
 msgid "show the current patch"
 msgstr "den aktuellen Patch anzeigen"
 
-#: builtin/rebase.c:516
+#: builtin/rebase.c:518
 msgid "shorten commit ids in the todo list"
 msgstr "Commit-IDs in der TODO-Liste verkürzen"
 
-#: builtin/rebase.c:518
+#: builtin/rebase.c:520
 msgid "expand commit ids in the todo list"
 msgstr "Commit-IDs in der TODO-Liste erweitern"
 
-#: builtin/rebase.c:520
+#: builtin/rebase.c:522
 msgid "check the todo list"
 msgstr "die TODO-Liste prüfen"
 
-#: builtin/rebase.c:522
+#: builtin/rebase.c:524
 msgid "rearrange fixup/squash lines"
 msgstr "fixup/squash-Zeilen umordnen"
 
-#: builtin/rebase.c:524
+#: builtin/rebase.c:526
 msgid "insert exec commands in todo list"
 msgstr "\"exec\"-Befehle in TODO-Liste einfügen"
 
-#: builtin/rebase.c:525
+#: builtin/rebase.c:527
 msgid "onto"
 msgstr "auf"
 
-#: builtin/rebase.c:528
+#: builtin/rebase.c:530
 msgid "restrict-revision"
 msgstr "Begrenzungscommit"
 
-#: builtin/rebase.c:528
+#: builtin/rebase.c:530
 msgid "restrict revision"
 msgstr "Begrenzungscommit"
 
-#: builtin/rebase.c:530
+#: builtin/rebase.c:532
 msgid "squash-onto"
 msgstr "squash-onto"
 
-#: builtin/rebase.c:531
+#: builtin/rebase.c:533
 msgid "squash onto"
 msgstr "squash onto"
 
-#: builtin/rebase.c:533
+#: builtin/rebase.c:535
 msgid "the upstream commit"
 msgstr "der Upstream-Commit"
 
-#: builtin/rebase.c:535
+#: builtin/rebase.c:537
 msgid "head-name"
 msgstr "head-Name"
 
-#: builtin/rebase.c:535
+#: builtin/rebase.c:537
 msgid "head name"
 msgstr "head-Name"
 
-#: builtin/rebase.c:540
+#: builtin/rebase.c:542
 msgid "rebase strategy"
 msgstr "Rebase-Strategie"
 
-#: builtin/rebase.c:541
+#: builtin/rebase.c:543
 msgid "strategy-opts"
 msgstr "Strategie-Optionen"
 
-#: builtin/rebase.c:542
+#: builtin/rebase.c:544
 msgid "strategy options"
 msgstr "Strategie-Optionen"
 
-#: builtin/rebase.c:543
+#: builtin/rebase.c:545
 msgid "switch-to"
 msgstr "wechseln zu"
 
-#: builtin/rebase.c:544
+#: builtin/rebase.c:546
 msgid "the branch or commit to checkout"
 msgstr "der Branch oder Commit zum Auschecken"
 
-#: builtin/rebase.c:545
+#: builtin/rebase.c:547
 msgid "onto-name"
 msgstr "onto-Name"
 
-#: builtin/rebase.c:545
+#: builtin/rebase.c:547
 msgid "onto name"
 msgstr "onto-Name"
 
-#: builtin/rebase.c:546
+#: builtin/rebase.c:548
 msgid "cmd"
 msgstr "Befehl"
 
-#: builtin/rebase.c:546
+#: builtin/rebase.c:548
 msgid "the command to run"
 msgstr "auszuführender Befehl"
 
-#: builtin/rebase.c:549 builtin/rebase.c:1421
+#: builtin/rebase.c:551 builtin/rebase.c:1427
 msgid "automatically re-schedule any `exec` that fails"
 msgstr "jeden fehlgeschlagenen `exec`-Befehl neu ansetzen"
 
-#: builtin/rebase.c:565
+#: builtin/rebase.c:567
 msgid "--[no-]rebase-cousins has no effect without --rebase-merges"
 msgstr "--[no-]rebase-cousins hat ohne --rebase-merges keine Auswirkung"
 
-#: builtin/rebase.c:581
+#: builtin/rebase.c:583
 #, c-format
 msgid "%s requires the merge backend"
 msgstr "%s erfordert das Merge-Backend"
 
-#: builtin/rebase.c:624
+#: builtin/rebase.c:626
 #, c-format
 msgid "could not get 'onto': '%s'"
 msgstr "Konnte 'onto' nicht bestimmen: '%s'"
 
-#: builtin/rebase.c:641
+#: builtin/rebase.c:643
 #, c-format
 msgid "invalid orig-head: '%s'"
 msgstr "Ungültiges orig-head: '%s'"
 
-#: builtin/rebase.c:666
+#: builtin/rebase.c:668
 #, c-format
 msgid "ignoring invalid allow_rerere_autoupdate: '%s'"
 msgstr "Ignoriere ungültiges allow_rerere_autoupdate: '%s'"
 
-#: builtin/rebase.c:811 git-rebase--preserve-merges.sh:81
+#: builtin/rebase.c:813 git-rebase--preserve-merges.sh:81
 msgid ""
 "Resolve all conflicts manually, mark them as resolved with\n"
 "\"git add/rm <conflicted_files>\", then run \"git rebase --continue\".\n"
@@ -19632,7 +20024,7 @@
 "Um abzubrechen und zurück zum Zustand vor \"git rebase\" zu gelangen,\n"
 "führen Sie \"git rebase --abort\" aus."
 
-#: builtin/rebase.c:894
+#: builtin/rebase.c:896
 #, c-format
 msgid ""
 "\n"
@@ -19652,7 +20044,7 @@
 "Infolge dessen kann Git auf diesen Revisionen Rebase nicht\n"
 "ausführen."
 
-#: builtin/rebase.c:1220
+#: builtin/rebase.c:1227
 #, c-format
 msgid ""
 "unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and \"ask"
@@ -19661,7 +20053,7 @@
 "nicht erkannter leerer Typ '%s'; Gültige Werte sind \"drop\", \"keep\", und "
 "\"ask\"."
 
-#: builtin/rebase.c:1238
+#: builtin/rebase.c:1245
 #, c-format
 msgid ""
 "%s\n"
@@ -19679,7 +20071,7 @@
 "    git rebase '<Branch>'\n"
 "\n"
 
-#: builtin/rebase.c:1254
+#: builtin/rebase.c:1261
 #, c-format
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:\n"
@@ -19693,154 +20085,152 @@
 "    git branch --set-upstream-to=%s/<Branch> %s\n"
 "\n"
 
-#: builtin/rebase.c:1284
+#: builtin/rebase.c:1291
 msgid "exec commands cannot contain newlines"
 msgstr "\"exec\"-Befehle können keine neuen Zeilen enthalten"
 
-#: builtin/rebase.c:1288
+#: builtin/rebase.c:1295
 msgid "empty exec command"
 msgstr "Leerer \"exec\"-Befehl."
 
-#: builtin/rebase.c:1318
+#: builtin/rebase.c:1324
 msgid "rebase onto given branch instead of upstream"
 msgstr "Rebase auf angegebenen Branch anstelle des Upstream-Branches ausführen"
 
-#: builtin/rebase.c:1320
+#: builtin/rebase.c:1326
 msgid "use the merge-base of upstream and branch as the current base"
 msgstr "Nutze die Merge-Basis von Upstream und Branch als die aktuelle Basis"
 
-#: builtin/rebase.c:1322
+#: builtin/rebase.c:1328
 msgid "allow pre-rebase hook to run"
 msgstr "Ausführung des pre-rebase-Hooks erlauben"
 
-#: builtin/rebase.c:1324
+#: builtin/rebase.c:1330
 msgid "be quiet. implies --no-stat"
 msgstr "weniger Ausgaben (impliziert --no-stat)"
 
-#: builtin/rebase.c:1330
+#: builtin/rebase.c:1336
 msgid "do not show diffstat of what changed upstream"
 msgstr ""
 "Zusammenfassung der Unterschiede gegenüber dem Upstream-Branch verbergen"
 
-#: builtin/rebase.c:1333
+#: builtin/rebase.c:1339
 msgid "add a Signed-off-by trailer to each commit"
 msgstr "eine Signed-off-by Zeile zu jedem Commit hinzufügen"
 
-#: builtin/rebase.c:1336
+#: builtin/rebase.c:1342
 msgid "make committer date match author date"
 msgstr "Datum des Commit-Erstellers soll mit Datum des Autors übereinstimmen"
 
-#: builtin/rebase.c:1338
+#: builtin/rebase.c:1344
 msgid "ignore author date and use current date"
 msgstr "ignoriere Autor-Datum und nutze aktuelles Datum"
 
-#: builtin/rebase.c:1340
+#: builtin/rebase.c:1346
 msgid "synonym of --reset-author-date"
 msgstr "Synonym für --reset-author-date"
 
-#: builtin/rebase.c:1342 builtin/rebase.c:1346
+#: builtin/rebase.c:1348 builtin/rebase.c:1352
 msgid "passed to 'git apply'"
 msgstr "an 'git apply' übergeben"
 
-#: builtin/rebase.c:1344
+#: builtin/rebase.c:1350
 msgid "ignore changes in whitespace"
 msgstr "Whitespace-Änderungen ignorieren"
 
-#: builtin/rebase.c:1348 builtin/rebase.c:1351
+#: builtin/rebase.c:1354 builtin/rebase.c:1357
 msgid "cherry-pick all commits, even if unchanged"
 msgstr ""
 "Cherry-Pick auf alle Commits ausführen, auch wenn diese unverändert sind"
 
-#: builtin/rebase.c:1353
+#: builtin/rebase.c:1359
 msgid "continue"
 msgstr "fortsetzen"
 
-#: builtin/rebase.c:1356
+#: builtin/rebase.c:1362
 msgid "skip current patch and continue"
 msgstr "den aktuellen Patch auslassen und fortfahren"
 
-#: builtin/rebase.c:1358
+#: builtin/rebase.c:1364
 msgid "abort and check out the original branch"
 msgstr "abbrechen und den ursprünglichen Branch auschecken"
 
-#: builtin/rebase.c:1361
+#: builtin/rebase.c:1367
 msgid "abort but keep HEAD where it is"
 msgstr "abbrechen, aber HEAD an aktueller Stelle belassen"
 
-#: builtin/rebase.c:1362
+#: builtin/rebase.c:1368
 msgid "edit the todo list during an interactive rebase"
 msgstr "TODO-Liste während eines interaktiven Rebase bearbeiten"
 
-#: builtin/rebase.c:1365
+#: builtin/rebase.c:1371
 msgid "show the patch file being applied or merged"
 msgstr "den Patch, der gerade angewendet oder zusammengeführt wird, anzeigen"
 
-#: builtin/rebase.c:1368
+#: builtin/rebase.c:1374
 msgid "use apply strategies to rebase"
 msgstr "Strategien von 'git am' bei Rebase verwenden"
 
-#: builtin/rebase.c:1372
+#: builtin/rebase.c:1378
 msgid "use merging strategies to rebase"
 msgstr "Merge-Strategien beim Rebase verwenden"
 
-#: builtin/rebase.c:1376
+#: builtin/rebase.c:1382
 msgid "let the user edit the list of commits to rebase"
 msgstr "den Benutzer die Liste der Commits für den Rebase bearbeiten lassen"
 
-#: builtin/rebase.c:1380
+#: builtin/rebase.c:1386
 msgid "(DEPRECATED) try to recreate merges instead of ignoring them"
-msgstr ""
-"(VERALTET) Versuche, Merges wiederherzustellen anstatt sie zu ignorieren"
+msgstr "(VERALTET) Versuche, Merges wiederherzustellen statt sie zu ignorieren"
 
-#: builtin/rebase.c:1385
+#: builtin/rebase.c:1391
 msgid "how to handle commits that become empty"
 msgstr "wie sollen Commits behandelt werden, die leer werden"
 
-#: builtin/rebase.c:1392
+#: builtin/rebase.c:1398
 msgid "move commits that begin with squash!/fixup! under -i"
 msgstr "bei -i Commits verschieben, die mit squash!/fixup! beginnen"
 
-#: builtin/rebase.c:1399
+#: builtin/rebase.c:1405
 msgid "add exec lines after each commit of the editable list"
 msgstr "exec-Zeilen nach jedem Commit der editierbaren Liste hinzufügen"
 
-#: builtin/rebase.c:1403
+#: builtin/rebase.c:1409
 msgid "allow rebasing commits with empty messages"
 msgstr "Rebase von Commits mit leerer Beschreibung erlauben"
 
-#: builtin/rebase.c:1407
+#: builtin/rebase.c:1413
 msgid "try to rebase merges instead of skipping them"
-msgstr ""
-"versuchen, Rebase mit Merges auszuführen, anstatt diese zu überspringen"
+msgstr "versuchen, Rebase mit Merges auszuführen, statt diese zu überspringen"
 
-#: builtin/rebase.c:1410
+#: builtin/rebase.c:1416
 msgid "use 'merge-base --fork-point' to refine upstream"
 msgstr ""
 "'git merge-base --fork-point' benutzen, um Upstream-Branch zu bestimmen"
 
-#: builtin/rebase.c:1412
+#: builtin/rebase.c:1418
 msgid "use the given merge strategy"
 msgstr "angegebene Merge-Strategie verwenden"
 
-#: builtin/rebase.c:1414 builtin/revert.c:115
+#: builtin/rebase.c:1420 builtin/revert.c:115
 msgid "option"
 msgstr "Option"
 
-#: builtin/rebase.c:1415
+#: builtin/rebase.c:1421
 msgid "pass the argument through to the merge strategy"
 msgstr "Argument zur Merge-Strategie durchreichen"
 
-#: builtin/rebase.c:1418
+#: builtin/rebase.c:1424
 msgid "rebase all reachable commits up to the root(s)"
 msgstr "Rebase auf alle erreichbaren Commits bis zum Root-Commit ausführen"
 
-#: builtin/rebase.c:1423
+#: builtin/rebase.c:1429
 msgid "apply all changes, even those already present upstream"
 msgstr ""
 "alle Änderungen anwenden, auch jene, die bereits im Upstream-Branch "
 "vorhanden sind"
 
-#: builtin/rebase.c:1440
+#: builtin/rebase.c:1446
 msgid ""
 "the rebase.useBuiltin support has been removed!\n"
 "See its entry in 'git help config' for details."
@@ -19848,44 +20238,44 @@
 "Die Unterstützung für rebase.useBuiltin wurde entfernt!\n"
 "Siehe dessen Eintrag in 'git help config' für Details."
 
-#: builtin/rebase.c:1446
+#: builtin/rebase.c:1452
 msgid "It looks like 'git am' is in progress. Cannot rebase."
 msgstr "'git-am' scheint im Gange zu sein. Kann Rebase nicht durchführen."
 
-#: builtin/rebase.c:1487
+#: builtin/rebase.c:1493
 msgid ""
 "git rebase --preserve-merges is deprecated. Use --rebase-merges instead."
 msgstr ""
 "'git rebase --preserve-merges' ist veraltet. Benutzen Sie stattdessen '--"
 "rebase-merges'."
 
-#: builtin/rebase.c:1492
+#: builtin/rebase.c:1498
 msgid "cannot combine '--keep-base' with '--onto'"
 msgstr "'--keep-base' kann nicht mit '--onto' kombiniert werden"
 
-#: builtin/rebase.c:1494
+#: builtin/rebase.c:1500
 msgid "cannot combine '--keep-base' with '--root'"
 msgstr "'--keep-base' kann nicht mit '--root' kombiniert werden"
 
-#: builtin/rebase.c:1498
+#: builtin/rebase.c:1504
 msgid "cannot combine '--root' with '--fork-point'"
 msgstr "'--root' kann nicht mit '--fork-point' kombiniert werden"
 
-#: builtin/rebase.c:1501
+#: builtin/rebase.c:1507
 msgid "No rebase in progress?"
 msgstr "Kein Rebase im Gange?"
 
-#: builtin/rebase.c:1505
+#: builtin/rebase.c:1511
 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."
 
-#: builtin/rebase.c:1528 t/helper/test-fast-rebase.c:123
+#: builtin/rebase.c:1534 t/helper/test-fast-rebase.c:123
 msgid "Cannot read HEAD"
 msgstr "Kann HEAD nicht lesen"
 
-#: builtin/rebase.c:1540
+#: builtin/rebase.c:1546
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -19893,16 +20283,16 @@
 "Sie müssen alle Merge-Konflikte editieren und diese dann\n"
 "mittels \"git add\" als aufgelöst markieren"
 
-#: builtin/rebase.c:1559
+#: builtin/rebase.c:1565
 msgid "could not discard worktree changes"
 msgstr "Konnte Änderungen im Arbeitsverzeichnis nicht verwerfen."
 
-#: builtin/rebase.c:1578
+#: builtin/rebase.c:1584
 #, c-format
 msgid "could not move back to %s"
 msgstr "Konnte nicht zu %s zurückgehen."
 
-#: builtin/rebase.c:1624
+#: builtin/rebase.c:1630
 #, c-format
 msgid ""
 "It seems that there is already a %s directory, and\n"
@@ -19923,138 +20313,138 @@
 "und führen Sie diesen Befehl nochmal aus. Es wird angehalten, falls noch\n"
 "etwas Schützenswertes vorhanden ist.\n"
 
-#: builtin/rebase.c:1652
+#: builtin/rebase.c:1658
 msgid "switch `C' expects a numerical value"
 msgstr "Schalter `C' erwartet einen numerischen Wert."
 
-#: builtin/rebase.c:1694
+#: builtin/rebase.c:1700
 #, c-format
 msgid "Unknown mode: %s"
 msgstr "Unbekannter Modus: %s"
 
-#: builtin/rebase.c:1733
+#: builtin/rebase.c:1739
 msgid "--strategy requires --merge or --interactive"
 msgstr "--strategy erfordert --merge oder --interactive"
 
-#: builtin/rebase.c:1763
+#: builtin/rebase.c:1769
 msgid "cannot combine apply options with merge options"
 msgstr ""
 "Optionen für \"am\" können nicht mit Optionen für \"merge\" kombiniert "
 "werden."
 
-#: builtin/rebase.c:1776
+#: builtin/rebase.c:1782
 #, c-format
 msgid "Unknown rebase backend: %s"
 msgstr "Unbekanntes Rebase-Backend: %s"
 
-#: builtin/rebase.c:1806
+#: builtin/rebase.c:1812
 msgid "--reschedule-failed-exec requires --exec or --interactive"
 msgstr "--reschedule-failed-exec erfordert --exec oder --interactive"
 
-#: builtin/rebase.c:1826
+#: builtin/rebase.c:1832
 msgid "cannot combine '--preserve-merges' with '--rebase-merges'"
 msgstr ""
 "'--preserve-merges' kann nicht mit '--rebase-merges' kombiniert werden."
 
-#: builtin/rebase.c:1830
+#: builtin/rebase.c:1836
 msgid ""
 "error: cannot combine '--preserve-merges' with '--reschedule-failed-exec'"
 msgstr ""
 "Fehler: '--preserve-merges' kann nicht mit '--reschedule-failed-exec' "
 "kombiniert werden."
 
-#: builtin/rebase.c:1854
+#: builtin/rebase.c:1860
 #, c-format
 msgid "invalid upstream '%s'"
 msgstr "Ungültiger Upstream '%s'"
 
-#: builtin/rebase.c:1860
+#: builtin/rebase.c:1866
 msgid "Could not create new root commit"
 msgstr "Konnte neuen Root-Commit nicht erstellen."
 
-#: builtin/rebase.c:1886
+#: builtin/rebase.c:1892
 #, c-format
 msgid "'%s': need exactly one merge base with branch"
 msgstr "'%s': benötige genau eine Merge-Basis mit dem Branch"
 
-#: builtin/rebase.c:1889
+#: builtin/rebase.c:1895
 #, c-format
 msgid "'%s': need exactly one merge base"
 msgstr "'%s': benötige genau eine Merge-Basis"
 
-#: builtin/rebase.c:1897
+#: builtin/rebase.c:1903
 #, c-format
 msgid "Does not point to a valid commit '%s'"
 msgstr "'%s' zeigt auf keinen gültigen Commit."
 
-#: builtin/rebase.c:1923
+#: builtin/rebase.c:1931
 #, c-format
 msgid "fatal: no such branch/commit '%s'"
 msgstr "fatal: Branch/Commit '%s' nicht gefunden"
 
-#: builtin/rebase.c:1931 builtin/submodule--helper.c:40
+#: builtin/rebase.c:1939 builtin/submodule--helper.c:40
 #: builtin/submodule--helper.c:2414
 #, c-format
 msgid "No such ref: %s"
 msgstr "Referenz nicht gefunden: %s"
 
-#: builtin/rebase.c:1942
+#: builtin/rebase.c:1950
 msgid "Could not resolve HEAD to a revision"
 msgstr "Konnte HEAD zu keinem Commit auflösen."
 
-#: builtin/rebase.c:1963
+#: builtin/rebase.c:1971
 msgid "Please commit or stash them."
 msgstr "Bitte committen Sie die Änderungen oder benutzen Sie \"stash\"."
 
-#: builtin/rebase.c:1999
+#: builtin/rebase.c:2007
 #, c-format
 msgid "could not switch to %s"
 msgstr "Konnte nicht zu %s wechseln."
 
-#: builtin/rebase.c:2010
+#: builtin/rebase.c:2018
 msgid "HEAD is up to date."
 msgstr "HEAD ist aktuell."
 
-#: builtin/rebase.c:2012
+#: builtin/rebase.c:2020
 #, c-format
 msgid "Current branch %s is up to date.\n"
 msgstr "Aktueller Branch %s ist auf dem neuesten Stand.\n"
 
-#: builtin/rebase.c:2020
+#: builtin/rebase.c:2028
 msgid "HEAD is up to date, rebase forced."
 msgstr "HEAD ist aktuell, Rebase erzwungen."
 
-#: builtin/rebase.c:2022
+#: builtin/rebase.c:2030
 #, c-format
 msgid "Current branch %s is up to date, rebase forced.\n"
 msgstr "Aktueller Branch %s ist auf dem neuesten Stand, Rebase erzwungen.\n"
 
-#: builtin/rebase.c:2030
+#: builtin/rebase.c:2038
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Der \"pre-rebase hook\" hat den Rebase zurückgewiesen."
 
-#: builtin/rebase.c:2037
+#: builtin/rebase.c:2045
 #, c-format
 msgid "Changes to %s:\n"
 msgstr "Änderungen zu %s:\n"
 
-#: builtin/rebase.c:2040
+#: builtin/rebase.c:2048
 #, c-format
 msgid "Changes from %s to %s:\n"
 msgstr "Änderungen von %s zu %s:\n"
 
-#: builtin/rebase.c:2065
+#: builtin/rebase.c:2073
 #, c-format
 msgid "First, rewinding head to replay your work on top of it...\n"
 msgstr ""
 "Zunächst wird der Branch zurückgespult, um Ihre Änderungen darauf neu "
 "anzuwenden...\n"
 
-#: builtin/rebase.c:2074
+#: builtin/rebase.c:2082
 msgid "Could not detach HEAD"
 msgstr "Konnte HEAD nicht loslösen."
 
-#: builtin/rebase.c:2083
+#: builtin/rebase.c:2091
 #, c-format
 msgid "Fast-forwarded %s to %s.\n"
 msgstr "Spule %s vor zu %s.\n"
@@ -20151,36 +20541,36 @@
 msgid "'%s' is not a valid timestamp"
 msgstr "'%s' ist kein gültiger Zeitstempel"
 
-#: builtin/reflog.c:606
+#: builtin/reflog.c:609
 #, c-format
 msgid "Marking reachable objects..."
 msgstr "Markiere nicht erreichbare Objekte..."
 
-#: builtin/reflog.c:644
+#: builtin/reflog.c:647
 #, c-format
 msgid "%s points nowhere!"
 msgstr "%s zeigt auf nichts!"
 
-#: builtin/reflog.c:696
+#: builtin/reflog.c:699
 msgid "no reflog specified to delete"
 msgstr "Kein Reflog zum Löschen angegeben."
 
-#: builtin/reflog.c:705
+#: builtin/reflog.c:708
 #, c-format
 msgid "not a reflog: %s"
 msgstr "Kein Reflog: %s"
 
-#: builtin/reflog.c:710
+#: builtin/reflog.c:713
 #, c-format
 msgid "no reflog for '%s'"
 msgstr "Kein Reflog für '%s'."
 
-#: builtin/reflog.c:756
+#: builtin/reflog.c:759
 #, c-format
 msgid "invalid ref format: %s"
 msgstr "Ungültiges Format für Referenzen: %s"
 
-#: builtin/reflog.c:765
+#: builtin/reflog.c:768
 msgid "git reflog [ show | expire | delete | exists ]"
 msgstr "git reflog [ show | expire | delete | exists ]"
 
@@ -20313,19 +20703,18 @@
 #: builtin/remote.c:186
 msgid "specifying a master branch makes no sense with --mirror"
 msgstr ""
-"Die Option --mirror kann nicht mit der Angabe eines Hauptbranches verwendet "
-"werden."
+"--mirror kann nicht mit der Angabe eines Hauptbranches verwendet werden"
 
 #: builtin/remote.c:188
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr ""
-"Die Angabe von zu folgenden Branches kann nur mit dem Anfordern von "
-"Spiegelarchiven verwendet werden."
+"die Angabe von zu folgenden Branches kann nur mit dem Anfordern von "
+"Spiegelarchiven verwendet werden"
 
 #: builtin/remote.c:195 builtin/remote.c:700
 #, c-format
 msgid "remote %s already exists."
-msgstr "externes Repository %s existiert bereits"
+msgstr "externes Repository %s existiert bereits."
 
 #: builtin/remote.c:240
 #, c-format
@@ -20364,7 +20753,7 @@
 #: builtin/remote.c:691 builtin/remote.c:836 builtin/remote.c:946
 #, c-format
 msgid "No such remote: '%s'"
-msgstr "Kein solches Remote-Repository: '%s'"
+msgstr "Remote-Repository nicht gefunden: '%s'"
 
 #: builtin/remote.c:710
 #, c-format
@@ -20651,7 +21040,7 @@
 #: builtin/remote.c:1521 builtin/remote.c:1577 builtin/remote.c:1647
 #, c-format
 msgid "No such remote '%s'"
-msgstr "Kein solches Remote-Repository '%s'"
+msgstr "Remote-Repository '%s' nicht gefunden"
 
 #: builtin/remote.c:1539
 msgid "add branch"
@@ -20688,8 +21077,7 @@
 
 #: builtin/remote.c:1632
 msgid "--add --delete doesn't make sense"
-msgstr ""
-"Die Optionen --add und --delete können nicht gemeinsam verwendet werden."
+msgstr "--add und --delete können nicht gemeinsam verwendet werden"
 
 #: builtin/remote.c:1673
 #, c-format
@@ -20699,17 +21087,17 @@
 #: builtin/remote.c:1681
 #, c-format
 msgid "No such URL found: %s"
-msgstr "Keine solche URL gefunden: %s"
+msgstr "URL nicht gefunden: %s"
 
 #: builtin/remote.c:1683
 msgid "Will not delete all non-push URLs"
 msgstr "Werde keine URLs entfernen, die nicht für \"push\" bestimmt sind"
 
-#: builtin/repack.c:25
+#: builtin/repack.c:26
 msgid "git repack [<options>]"
 msgstr "git repack [<Optionen>]"
 
-#: builtin/repack.c:30
+#: builtin/repack.c:31
 msgid ""
 "Incremental repacks are incompatible with bitmap indexes.  Use\n"
 "--no-write-bitmap-index or disable the pack.writebitmaps configuration."
@@ -20718,124 +21106,124 @@
 "--no-write-bitmap-index oder deaktivieren Sie die pack.writebitmaps\n"
 "Konfiguration."
 
-#: builtin/repack.c:197
+#: builtin/repack.c:198
 msgid "could not start pack-objects to repack promisor objects"
 msgstr ""
 "Konnte 'pack-objects' für das Neupacken von Objekten aus partiell geklonten\n"
 "Remote-Repositories nicht starten."
 
-#: builtin/repack.c:268 builtin/repack.c:447
+#: builtin/repack.c:270 builtin/repack.c:446
 msgid "repack: Expecting full hex object ID lines only from pack-objects."
 msgstr ""
 "repack: Erwarte Zeilen mit vollständiger Hex-Objekt-ID nur von pack-objects."
 
-#: builtin/repack.c:295
+#: builtin/repack.c:294
 msgid "could not finish pack-objects to repack promisor objects"
 msgstr ""
 "Konnte 'pack-objects' für das Neupacken von Objekten aus partiell geklonten\n"
 "Remote-Repositories nicht abschließen."
 
-#: builtin/repack.c:323
+#: builtin/repack.c:322
 msgid "pack everything in a single pack"
 msgstr "alles in eine einzige Pack-Datei packen"
 
-#: builtin/repack.c:325
+#: builtin/repack.c:324
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "genau wie -a, unerreichbare Objekte werden aber nicht gelöscht"
 
-#: builtin/repack.c:328
+#: builtin/repack.c:327
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "redundante Pakete entfernen und \"git-prune-packed\" ausführen"
 
-#: builtin/repack.c:330
+#: builtin/repack.c:329
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "--no-reuse-delta an git-pack-objects übergeben"
 
-#: builtin/repack.c:332
+#: builtin/repack.c:331
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "--no-reuse-object an git-pack-objects übergeben"
 
-#: builtin/repack.c:334
+#: builtin/repack.c:333
 msgid "do not run git-update-server-info"
 msgstr "git-update-server-info nicht ausführen"
 
-#: builtin/repack.c:337
+#: builtin/repack.c:336
 msgid "pass --local to git-pack-objects"
 msgstr "--local an git-pack-objects übergeben"
 
-#: builtin/repack.c:339
+#: builtin/repack.c:338
 msgid "write bitmap index"
 msgstr "Bitmap-Index schreiben"
 
-#: builtin/repack.c:341
+#: builtin/repack.c:340
 msgid "pass --delta-islands to git-pack-objects"
 msgstr "--delta-islands an git-pack-objects übergeben"
 
-#: builtin/repack.c:342
+#: builtin/repack.c:341
 msgid "approxidate"
 msgstr "Datumsangabe"
 
-#: builtin/repack.c:343
+#: builtin/repack.c:342
 msgid "with -A, do not loosen objects older than this"
 msgstr "mit -A, keine Objekte älter als dieses Datum löschen"
 
-#: builtin/repack.c:345
+#: builtin/repack.c:344
 msgid "with -a, repack unreachable objects"
 msgstr "mit -a, nicht erreichbare Objekte neu packen"
 
-#: builtin/repack.c:347
+#: builtin/repack.c:346
 msgid "size of the window used for delta compression"
 msgstr "Größe des Fensters für die Delta-Kompression"
 
-#: builtin/repack.c:348 builtin/repack.c:354
+#: builtin/repack.c:347 builtin/repack.c:353
 msgid "bytes"
 msgstr "Bytes"
 
-#: builtin/repack.c:349
+#: builtin/repack.c:348
 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"
+"gleiches wie oben, aber die Speichergröße statt der Anzahl der Einträge "
+"limitieren"
 
-#: builtin/repack.c:351
+#: builtin/repack.c:350
 msgid "limits the maximum delta depth"
 msgstr "die maximale Delta-Tiefe limitieren"
 
-#: builtin/repack.c:353
+#: builtin/repack.c:352
 msgid "limits the maximum number of threads"
 msgstr "maximale Anzahl von Threads limitieren"
 
-#: builtin/repack.c:355
+#: builtin/repack.c:354
 msgid "maximum size of each packfile"
 msgstr "maximale Größe für jede Paketdatei"
 
-#: builtin/repack.c:357
+#: builtin/repack.c:356
 msgid "repack objects in packs marked with .keep"
 msgstr ""
 "Objekte umpacken, die sich in mit .keep markierten Pack-Dateien befinden"
 
-#: builtin/repack.c:359
+#: builtin/repack.c:358
 msgid "do not repack this pack"
 msgstr "dieses Paket nicht neu packen"
 
-#: builtin/repack.c:369
+#: builtin/repack.c:368
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "kann Pack-Dateien in precious-objects Repository nicht löschen"
 
-#: builtin/repack.c:373
+#: builtin/repack.c:372
 msgid "--keep-unreachable and -A are incompatible"
 msgstr "--keep-unreachable und -A sind inkompatibel"
 
-#: builtin/repack.c:456
+#: builtin/repack.c:455
 msgid "Nothing new to pack."
 msgstr "Nichts Neues zum Packen."
 
-#: builtin/repack.c:486
+#: builtin/repack.c:485
 #, c-format
 msgid "missing required file: %s"
 msgstr "benötigte Datei fehlt: %s"
 
-#: builtin/repack.c:488
+#: builtin/repack.c:487
 #, c-format
 msgid "could not unlink: %s"
 msgstr "konnte nicht löschen: %s"
@@ -20986,7 +21374,7 @@
 "instead of --graft"
 msgstr ""
 "Der ursprüngliche Commit '%s' enthält Merge-Tag '%s', der verworfen\n"
-"wird; benutzen Sie --edit anstatt --graft"
+"wird; benutzen Sie --edit statt --graft"
 
 #: builtin/replace.c:469
 #, c-format
@@ -21170,8 +21558,8 @@
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr "Kann keinen '%s'-Reset durchführen, während ein Merge im Gange ist."
 
-#: builtin/reset.c:295 builtin/stash.c:520 builtin/stash.c:594
-#: builtin/stash.c:618
+#: builtin/reset.c:295 builtin/stash.c:587 builtin/stash.c:661
+#: builtin/stash.c:685
 msgid "be quiet, only report errors"
 msgstr "weniger Ausgaben, nur Fehler melden"
 
@@ -21256,20 +21644,20 @@
 msgid "Could not write new index file."
 msgstr "Konnte neue Index-Datei nicht schreiben."
 
-#: builtin/rev-list.c:499
+#: builtin/rev-list.c:534
 msgid "cannot combine --exclude-promisor-objects and --missing"
 msgstr ""
 "--exclude-promisor-objects und --missing können nicht kombiniert werden."
 
-#: builtin/rev-list.c:560
+#: builtin/rev-list.c:595
 msgid "object filtering requires --objects"
 msgstr "Das Filtern von Objekten erfordert --objects."
 
-#: builtin/rev-list.c:610
+#: builtin/rev-list.c:651
 msgid "rev-list does not support display of notes"
 msgstr "rev-list unterstützt keine Anzeige von Notizen"
 
-#: builtin/rev-list.c:615
+#: builtin/rev-list.c:656
 msgid "marked counting is incompatible with --objects"
 msgstr "markiertes Zählen ist inkompatibel mit der Option --objects"
 
@@ -21518,53 +21906,53 @@
 msgid "git log --pretty=short | git shortlog [<options>]"
 msgstr "git log --pretty=short | git shortlog [<Optionen>]"
 
-#: builtin/shortlog.c:135
+#: builtin/shortlog.c:123
 msgid "using multiple --group options with stdin is not supported"
 msgstr "mehrere Optionen --group mit Standard-Eingabe wird nicht unterstützt"
 
-#: builtin/shortlog.c:145
+#: builtin/shortlog.c:133
 msgid "using --group=trailer with stdin is not supported"
 msgstr ""
 "Nutzung von --group=trailer mit Standard-Eingabe wird nicht unterstützt"
 
-#: builtin/shortlog.c:335
+#: builtin/shortlog.c:323
 #, c-format
 msgid "unknown group type: %s"
 msgstr "unbekannter Gruppen-Typ: %s"
 
-#: builtin/shortlog.c:363
-msgid "Group by committer rather than author"
-msgstr "über Commit-Ersteller anstatt Autor gruppieren"
+#: builtin/shortlog.c:351
+msgid "group by committer rather than author"
+msgstr "nach Commit-Ersteller statt Autor gruppieren"
 
-#: builtin/shortlog.c:366
+#: builtin/shortlog.c:354
 msgid "sort output according to the number of commits per author"
 msgstr "die Ausgabe entsprechend der Anzahl von Commits pro Autor sortieren"
 
-#: builtin/shortlog.c:368
-msgid "Suppress commit descriptions, only provides commit count"
+#: builtin/shortlog.c:356
+msgid "suppress commit descriptions, only provides commit count"
 msgstr "Commit-Beschreibungen unterdrücken, nur Anzahl der Commits liefern"
 
-#: builtin/shortlog.c:370
-msgid "Show the email address of each author"
-msgstr "die E-Mail-Adresse von jedem Autor anzeigen"
+#: builtin/shortlog.c:358
+msgid "show the email address of each author"
+msgstr "die E-Mail-Adresse jedes Autors anzeigen"
 
-#: builtin/shortlog.c:371
+#: builtin/shortlog.c:359
 msgid "<w>[,<i1>[,<i2>]]"
 msgstr "<w>[,<i1>[,<i2>]]"
 
-#: builtin/shortlog.c:372
-msgid "Linewrap output"
+#: builtin/shortlog.c:360
+msgid "linewrap output"
 msgstr "Ausgabe mit Zeilenumbrüchen"
 
-#: builtin/shortlog.c:374
+#: builtin/shortlog.c:362
 msgid "field"
 msgstr "Feld"
 
-#: builtin/shortlog.c:375
-msgid "Group by field"
-msgstr "Gruppieren über Feld"
+#: builtin/shortlog.c:363
+msgid "group by field"
+msgstr "Gruppieren nach Feld"
 
-#: builtin/shortlog.c:403
+#: builtin/shortlog.c:391
 msgid "too many arguments given outside repository"
 msgstr "zu viele Argumente außerhalb des Repositories angegeben"
 
@@ -21674,14 +22062,14 @@
 
 #: builtin/show-branch.c:738
 msgid "--reflog option needs one branch name"
-msgstr "Die Option --reflog benötigt einen Branchnamen."
+msgstr "die Option --reflog benötigt einen Branchnamen"
 
 #: builtin/show-branch.c:741
 #, 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"
+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:745
 #, c-format
@@ -21765,76 +22153,76 @@
 msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>"
 msgstr "git sparse-checkout (init|list|set|add|reapply|disable) <Optionen>"
 
-#: builtin/sparse-checkout.c:50
+#: builtin/sparse-checkout.c:45
 msgid "git sparse-checkout list"
 msgstr "git sparse-checkout list"
 
-#: builtin/sparse-checkout.c:76
+#: builtin/sparse-checkout.c:71
 msgid "this worktree is not sparse (sparse-checkout file may not exist)"
 msgstr ""
 "dieses Arbeitsverzeichnis ist nicht partiell (Datei für partieller Checkout "
 "existiert eventuell nicht)"
 
-#: builtin/sparse-checkout.c:228
+#: builtin/sparse-checkout.c:223
 msgid "failed to create directory for sparse-checkout file"
 msgstr ""
 "Fehler beim Erstellen eines Verzeichnisses für Datei eines partiellen "
 "Checkouts"
 
-#: builtin/sparse-checkout.c:269
+#: builtin/sparse-checkout.c:264
 msgid "unable to upgrade repository format to enable worktreeConfig"
 msgstr ""
 "Repository-Format konnte nicht erweitert werden, um worktreeConfig zu "
 "aktivieren"
 
-#: builtin/sparse-checkout.c:271
+#: builtin/sparse-checkout.c:266
 msgid "failed to set extensions.worktreeConfig setting"
 msgstr "Einstellung für extensions.worktreeConfig konnte nicht gesetzt werden"
 
-#: builtin/sparse-checkout.c:288
+#: builtin/sparse-checkout.c:283
 msgid "git sparse-checkout init [--cone]"
 msgstr "git sparse-checkout init [--cone]"
 
-#: builtin/sparse-checkout.c:307
+#: builtin/sparse-checkout.c:302
 msgid "initialize the sparse-checkout in cone mode"
 msgstr "initialisiere den partiellen Checkout im Cone-Modus"
 
-#: builtin/sparse-checkout.c:344
+#: builtin/sparse-checkout.c:339
 #, c-format
 msgid "failed to open '%s'"
 msgstr "Fehler beim Öffnen von '%s'"
 
-#: builtin/sparse-checkout.c:401
+#: builtin/sparse-checkout.c:396
 #, c-format
 msgid "could not normalize path %s"
 msgstr "konnte Pfad '%s' nicht normalisieren"
 
-#: builtin/sparse-checkout.c:413
+#: builtin/sparse-checkout.c:408
 msgid "git sparse-checkout (set|add) (--stdin | <patterns>)"
 msgstr "git sparse-checkout (set|add) (--stdin | <Muster>)"
 
-#: builtin/sparse-checkout.c:438
+#: builtin/sparse-checkout.c:433
 #, c-format
 msgid "unable to unquote C-style string '%s'"
 msgstr "konnte Anführungszeichen von C-Style Zeichenkette '%s' nicht entfernen"
 
-#: builtin/sparse-checkout.c:492 builtin/sparse-checkout.c:516
+#: builtin/sparse-checkout.c:487 builtin/sparse-checkout.c:511
 msgid "unable to load existing sparse-checkout patterns"
 msgstr "konnte die existierenden Muster des partiellen Checkouts nicht laden"
 
-#: builtin/sparse-checkout.c:561
+#: builtin/sparse-checkout.c:556
 msgid "read patterns from standard in"
 msgstr "Muster von der Standard-Eingabe lesen"
 
-#: builtin/sparse-checkout.c:576
+#: builtin/sparse-checkout.c:571
 msgid "git sparse-checkout reapply"
 msgstr "git sparse-checkout reapply"
 
-#: builtin/sparse-checkout.c:595
+#: builtin/sparse-checkout.c:590
 msgid "git sparse-checkout disable"
 msgstr "git sparse-checkout disable"
 
-#: builtin/sparse-checkout.c:623
+#: builtin/sparse-checkout.c:618
 msgid "error while refreshing working directory"
 msgstr "Fehler während der Aktualisierung des Arbeitsverzeichnisses."
 
@@ -21924,156 +22312,168 @@
 msgstr "'%s' ist kein gültiger Referenzname."
 
 #: builtin/stash.c:225
-msgid "git stash clear with parameters is unimplemented"
+msgid "git stash clear with arguments is unimplemented"
 msgstr "git stash clear mit Parametern ist nicht implementiert"
 
-#: builtin/stash.c:404
+#: builtin/stash.c:429
+#, c-format
+msgid ""
+"WARNING: Untracked file in way of tracked file!  Renaming\n"
+"            %s -> %s\n"
+"         to make room.\n"
+msgstr ""
+"WARNUNG: Nicht versionierte Datei im Weg von versionierter Datei! "
+"Umbenennung\n"
+"            %s -> %s\n"
+"         um Platz zu schaffen.\n"
+
+#: builtin/stash.c:490
 msgid "cannot apply a stash in the middle of a merge"
 msgstr "Kann Stash nicht anwenden, solange ein Merge im Gange ist"
 
-#: builtin/stash.c:415
+#: builtin/stash.c:501
 #, c-format
 msgid "could not generate diff %s^!."
 msgstr "Konnte keinen Diff erzeugen %s^!."
 
-#: builtin/stash.c:422
+#: builtin/stash.c:508
 msgid "conflicts in index. Try without --index."
 msgstr "Konflikte im Index. Versuchen Sie es ohne --index."
 
-#: builtin/stash.c:428
+#: builtin/stash.c:514
 msgid "could not save index tree"
 msgstr "Konnte Index-Verzeichnis nicht speichern"
 
-#: builtin/stash.c:437
+#: builtin/stash.c:523
 msgid "could not restore untracked files from stash"
 msgstr "Konnte unversionierte Dateien vom Stash nicht wiederherstellen."
 
-#: builtin/stash.c:451
+#: builtin/stash.c:537
 #, c-format
 msgid "Merging %s with %s"
 msgstr "Führe %s mit %s zusammen"
 
-#: builtin/stash.c:461
+#: builtin/stash.c:547
 msgid "Index was not unstashed."
 msgstr "Index wurde nicht aus dem Stash zurückgeladen."
 
-#: builtin/stash.c:522 builtin/stash.c:620
+#: builtin/stash.c:589 builtin/stash.c:687
 msgid "attempt to recreate the index"
 msgstr "Versuche Index wiederherzustellen."
 
-#: builtin/stash.c:566
+#: builtin/stash.c:633
 #, c-format
 msgid "Dropped %s (%s)"
 msgstr "%s (%s) gelöscht"
 
-#: builtin/stash.c:569
+#: builtin/stash.c:636
 #, c-format
 msgid "%s: Could not drop stash entry"
 msgstr "%s: Konnte Stash-Eintrag nicht löschen"
 
-#: builtin/stash.c:582
+#: builtin/stash.c:649
 #, c-format
 msgid "'%s' is not a stash reference"
 msgstr "'%s' ist keine Stash-Referenz"
 
-#: builtin/stash.c:632
+#: builtin/stash.c:699
 msgid "The stash entry is kept in case you need it again."
 msgstr ""
 "Der Stash-Eintrag wird für den Fall behalten, dass Sie diesen nochmal "
 "benötigen."
 
-#: builtin/stash.c:655
+#: builtin/stash.c:722
 msgid "No branch name specified"
 msgstr "Kein Branchname spezifiziert"
 
-#: builtin/stash.c:799 builtin/stash.c:836
+#: builtin/stash.c:866 builtin/stash.c:903
 #, c-format
 msgid "Cannot update %s with %s"
 msgstr "Kann nicht %s mit %s aktualisieren."
 
-#: builtin/stash.c:817 builtin/stash.c:1471 builtin/stash.c:1536
+#: builtin/stash.c:884 builtin/stash.c:1538 builtin/stash.c:1603
 msgid "stash message"
 msgstr "Stash-Beschreibung"
 
-#: builtin/stash.c:827
+#: builtin/stash.c:894
 msgid "\"git stash store\" requires one <commit> argument"
 msgstr "\"git stash store\" erwartet ein Argument <Commit>"
 
-#: builtin/stash.c:1042
+#: builtin/stash.c:1109
 msgid "No changes selected"
 msgstr "Keine Änderungen ausgewählt"
 
-#: builtin/stash.c:1142
+#: builtin/stash.c:1209
 msgid "You do not have the initial commit yet"
 msgstr "Sie haben bisher noch keinen initialen Commit"
 
-#: builtin/stash.c:1169
+#: builtin/stash.c:1236
 msgid "Cannot save the current index state"
 msgstr "Kann den aktuellen Zustand des Index nicht speichern"
 
-#: builtin/stash.c:1178
+#: builtin/stash.c:1245
 msgid "Cannot save the untracked files"
 msgstr "Kann die unversionierten Dateien nicht speichern"
 
-#: builtin/stash.c:1189 builtin/stash.c:1198
+#: builtin/stash.c:1256 builtin/stash.c:1265
 msgid "Cannot save the current worktree state"
 msgstr "Kann den aktuellen Zustand des Arbeitsverzeichnisses nicht speichern"
 
-#: builtin/stash.c:1226
+#: builtin/stash.c:1293
 msgid "Cannot record working tree state"
 msgstr "Kann Zustand des Arbeitsverzeichnisses nicht aufzeichnen"
 
-#: builtin/stash.c:1275
+#: builtin/stash.c:1342
 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"
 
-#: builtin/stash.c:1291
+#: builtin/stash.c:1358
 msgid "Did you forget to 'git add'?"
 msgstr "Haben Sie vielleicht 'git add' vergessen?"
 
-#: builtin/stash.c:1306
+#: builtin/stash.c:1373
 msgid "No local changes to save"
 msgstr "Keine lokalen Änderungen zum Speichern"
 
-#: builtin/stash.c:1313
+#: builtin/stash.c:1380
 msgid "Cannot initialize stash"
 msgstr "Kann \"stash\" nicht initialisieren"
 
-#: builtin/stash.c:1328
+#: builtin/stash.c:1395
 msgid "Cannot save the current status"
 msgstr "Kann den aktuellen Status nicht speichern"
 
-#: builtin/stash.c:1333
+#: builtin/stash.c:1400
 #, c-format
 msgid "Saved working directory and index state %s"
 msgstr "Arbeitsverzeichnis und Index-Status %s gespeichert."
 
-#: builtin/stash.c:1423
+#: builtin/stash.c:1490
 msgid "Cannot remove worktree changes"
 msgstr "Kann Änderungen im Arbeitsverzeichnis nicht löschen"
 
-#: builtin/stash.c:1462 builtin/stash.c:1527
+#: builtin/stash.c:1529 builtin/stash.c:1594
 msgid "keep index"
 msgstr "behalte Index"
 
-#: builtin/stash.c:1464 builtin/stash.c:1529
+#: builtin/stash.c:1531 builtin/stash.c:1596
 msgid "stash in patch mode"
 msgstr "Stash in Patch-Modus"
 
-#: builtin/stash.c:1465 builtin/stash.c:1530
+#: builtin/stash.c:1532 builtin/stash.c:1597
 msgid "quiet mode"
 msgstr "weniger Ausgaben"
 
-#: builtin/stash.c:1467 builtin/stash.c:1532
+#: builtin/stash.c:1534 builtin/stash.c:1599
 msgid "include untracked files in stash"
 msgstr "unversionierte Dateien in Stash einbeziehen"
 
-#: builtin/stash.c:1469 builtin/stash.c:1534
+#: builtin/stash.c:1536 builtin/stash.c:1601
 msgid "include ignore files"
 msgstr "ignorierte Dateien einbeziehen"
 
-#: builtin/stash.c:1569
+#: builtin/stash.c:1636
 msgid ""
 "the stash.useBuiltin support has been removed!\n"
 "See its entry in 'git help config' for details."
@@ -22154,13 +22554,12 @@
 "."
 
 #: builtin/submodule--helper.c:565
-msgid "Suppress output of entering each submodule command"
-msgstr ""
-"Ausgaben beim Betreten und der Befehlsausführung in einem Submodul "
-"unterdrücken"
+msgid "suppress output of entering each submodule command"
+msgstr "Ausgaben beim Betreten eines Submodul-Befehls unterdrücken"
 
-#: builtin/submodule--helper.c:567 builtin/submodule--helper.c:1487
-msgid "Recurse into nested submodules"
+#: builtin/submodule--helper.c:567 builtin/submodule--helper.c:888
+#: builtin/submodule--helper.c:1487
+msgid "recurse into nested submodules"
 msgstr "Rekursion in verschachtelte Submodule durchführen"
 
 #: builtin/submodule--helper.c:572
@@ -22200,7 +22599,7 @@
 "Konfiguration."
 
 #: builtin/submodule--helper.c:709
-msgid "Suppress output for initializing a submodule"
+msgid "suppress output for initializing a submodule"
 msgstr "Ausgaben bei Initialisierung eines Submoduls unterdrücken"
 
 #: builtin/submodule--helper.c:714
@@ -22223,19 +22622,15 @@
 msgstr "Fehler bei Rekursion in Submodul '%s'."
 
 #: builtin/submodule--helper.c:886 builtin/submodule--helper.c:1623
-msgid "Suppress submodule status output"
-msgstr "Ausgabe über Submodul-Status unterdrücken"
+msgid "suppress submodule status output"
+msgstr "Ausgabe des Submodul-Status unterdrücken"
 
 #: builtin/submodule--helper.c:887
 msgid ""
-"Use commit stored in the index instead of the one stored in the submodule "
+"use commit stored in the index instead of the one stored in the submodule "
 "HEAD"
 msgstr ""
-"Benutze den Commit, der im Index gespeichert ist, statt den im Submodul HEAD"
-
-#: builtin/submodule--helper.c:888
-msgid "recurse into nested submodules"
-msgstr "Rekursion in verschachtelte Submodule durchführen"
+"den Commit benutzen, der im Index gespeichert ist, statt den im Submodul HEAD"
 
 #: builtin/submodule--helper.c:893
 msgid "git submodule status [--quiet] [--cached] [--recursive] [<path>...]"
@@ -22321,7 +22716,7 @@
 msgstr "Fehler beim Aktualisieren des Remote-Repositories für Submodul '%s'"
 
 #: builtin/submodule--helper.c:1485
-msgid "Suppress output of synchronizing submodule url"
+msgid "suppress output of synchronizing submodule url"
 msgstr "Ausgaben bei der Synchronisierung der Submodul-URLs unterdrücken"
 
 #: builtin/submodule--helper.c:1492
@@ -22368,13 +22763,13 @@
 msgstr "Submodul '%s' (%s) für Pfad '%s' ausgetragen.\n"
 
 #: builtin/submodule--helper.c:1624
-msgid "Remove submodule working trees even if they contain local changes"
+msgid "remove submodule working trees even if they contain local changes"
 msgstr ""
 "Arbeitsverzeichnisse von Submodulen löschen, auch wenn lokale Änderungen "
 "vorliegen"
 
 #: builtin/submodule--helper.c:1625
-msgid "Unregister all submodules"
+msgid "unregister all submodules"
 msgstr "alle Submodule austragen"
 
 #: builtin/submodule--helper.c:1630
@@ -22527,11 +22922,10 @@
 msgstr "rebase, merge, checkout oder none"
 
 #: builtin/submodule--helper.c:2340
-msgid "Create a shallow clone truncated to the specified number of revisions"
+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."
+"einen Klon mit unvollständiger Historie (shallow) erstellen, abgeschnitten "
+"bei der angegebenen Anzahl von Commits"
 
 #: builtin/submodule--helper.c:2343
 msgid "parallel jobs"
@@ -22605,7 +22999,7 @@
 "Arbeitsverzeichnis befindet."
 
 #: builtin/submodule--helper.c:2681
-msgid "Suppress output for setting url of a submodule"
+msgid "suppress output for setting url of a submodule"
 msgstr "Ausgaben beim Setzen der URL eines Submoduls unterdrücken"
 
 #: builtin/submodule--helper.c:2685
@@ -22638,7 +23032,7 @@
 msgid "--branch and --default are mutually exclusive"
 msgstr "--branch und --default schließen sich gegenseitig aus"
 
-#: builtin/submodule--helper.c:2792 git.c:438 git.c:711
+#: builtin/submodule--helper.c:2792 git.c:441 git.c:714
 #, c-format
 msgid "%s doesn't support --super-prefix"
 msgstr "%s unterstützt kein --super-prefix"
@@ -22710,12 +23104,12 @@
 msgid "tag '%s' not found."
 msgstr "Tag '%s' nicht gefunden."
 
-#: builtin/tag.c:105
+#: builtin/tag.c:124
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Tag '%s' gelöscht (war %s)\n"
 
-#: builtin/tag.c:135
+#: builtin/tag.c:159
 #, c-format
 msgid ""
 "\n"
@@ -22728,7 +23122,7 @@
 "  %s\n"
 "ein. Zeilen, die mit '%c' beginnen, werden ignoriert.\n"
 
-#: builtin/tag.c:139
+#: builtin/tag.c:163
 #, c-format
 msgid ""
 "\n"
@@ -22743,15 +23137,11 @@
 "ein. Zeilen, die mit '%c' beginnen, werden behalten; Sie dürfen diese\n"
 "selbst entfernen wenn Sie möchten.\n"
 
-#: builtin/tag.c:198
+#: builtin/tag.c:230
 msgid "unable to sign the tag"
 msgstr "konnte Tag nicht signieren"
 
-#: builtin/tag.c:200
-msgid "unable to write tag file"
-msgstr "konnte Tag-Datei nicht schreiben"
-
-#: builtin/tag.c:216
+#: builtin/tag.c:248
 #, c-format
 msgid ""
 "You have created a nested tag. The object referred to by your new tag is\n"
@@ -22765,138 +23155,134 @@
 "\n"
 "\tgit tag -f %s %s^{}"
 
-#: builtin/tag.c:232
+#: builtin/tag.c:264
 msgid "bad object type."
 msgstr "ungültiger Objekt-Typ"
 
-#: builtin/tag.c:285
+#: builtin/tag.c:317
 msgid "no tag message?"
 msgstr "keine Tag-Beschreibung?"
 
-#: builtin/tag.c:292
+#: builtin/tag.c:324
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Die Tag-Beschreibung wurde in %s gelassen\n"
 
-#: builtin/tag.c:403
+#: builtin/tag.c:435
 msgid "list tag names"
 msgstr "Tagnamen auflisten"
 
-#: builtin/tag.c:405
+#: builtin/tag.c:437
 msgid "print <n> lines of each tag message"
 msgstr "<n> Zeilen jeder Tag-Beschreibung anzeigen"
 
-#: builtin/tag.c:407
+#: builtin/tag.c:439
 msgid "delete tags"
 msgstr "Tags löschen"
 
-#: builtin/tag.c:408
+#: builtin/tag.c:440
 msgid "verify tags"
 msgstr "Tags überprüfen"
 
-#: builtin/tag.c:410
+#: builtin/tag.c:442
 msgid "Tag creation options"
 msgstr "Optionen für Erstellung von Tags"
 
-#: builtin/tag.c:412
+#: builtin/tag.c:444
 msgid "annotated tag, needs a message"
 msgstr "annotiertes Tag, benötigt eine Beschreibung"
 
-#: builtin/tag.c:414
+#: builtin/tag.c:446
 msgid "tag message"
 msgstr "Tag-Beschreibung"
 
-#: builtin/tag.c:416
+#: builtin/tag.c:448
 msgid "force edit of tag message"
 msgstr "Bearbeitung der Tag-Beschreibung erzwingen"
 
-#: builtin/tag.c:417
+#: builtin/tag.c:449
 msgid "annotated and GPG-signed tag"
 msgstr "annotiertes und GPG-signiertes Tag"
 
-#: builtin/tag.c:420
+#: builtin/tag.c:452
 msgid "use another key to sign the tag"
 msgstr "einen anderen Schlüssel verwenden, um das Tag zu signieren"
 
-#: builtin/tag.c:421
+#: builtin/tag.c:453
 msgid "replace the tag if exists"
 msgstr "das Tag ersetzen, wenn es existiert"
 
-#: builtin/tag.c:422 builtin/update-ref.c:505
+#: builtin/tag.c:454 builtin/update-ref.c:505
 msgid "create a reflog"
 msgstr "Reflog erstellen"
 
-#: builtin/tag.c:424
+#: builtin/tag.c:456
 msgid "Tag listing options"
 msgstr "Optionen für Auflistung der Tags"
 
-#: builtin/tag.c:425
+#: builtin/tag.c:457
 msgid "show tag list in columns"
 msgstr "Liste der Tags in Spalten anzeigen"
 
-#: builtin/tag.c:426 builtin/tag.c:428
+#: builtin/tag.c:458 builtin/tag.c:460
 msgid "print only tags that contain the commit"
 msgstr "nur Tags ausgeben, die diesen Commit beinhalten"
 
-#: builtin/tag.c:427 builtin/tag.c:429
+#: builtin/tag.c:459 builtin/tag.c:461
 msgid "print only tags that don't contain the commit"
 msgstr "nur Tags ausgeben, die diesen Commit nicht enthalten"
 
-#: builtin/tag.c:430
+#: builtin/tag.c:462
 msgid "print only tags that are merged"
 msgstr "nur Tags ausgeben, die gemerged wurden"
 
-#: builtin/tag.c:431
+#: builtin/tag.c:463
 msgid "print only tags that are not merged"
 msgstr "nur Tags ausgeben, die nicht gemerged wurden"
 
-#: builtin/tag.c:435
+#: builtin/tag.c:467
 msgid "print only tags of the object"
 msgstr "nur Tags von dem Objekt ausgeben"
 
-#: builtin/tag.c:483
+#: builtin/tag.c:515
 msgid "--column and -n are incompatible"
 msgstr "--column und -n sind inkompatibel"
 
-#: builtin/tag.c:505
+#: builtin/tag.c:537
 msgid "-n option is only allowed in list mode"
-msgstr "Die Option -n ist nur im Listenmodus erlaubt."
+msgstr "die Option -n ist nur im Listenmodus erlaubt"
 
-#: builtin/tag.c:507
+#: builtin/tag.c:539
 msgid "--contains option is only allowed in list mode"
-msgstr "Die Option --contains ist nur im Listenmodus erlaubt."
+msgstr "--contains ist nur im Listenmodus erlaubt"
 
-#: builtin/tag.c:509
+#: builtin/tag.c:541
 msgid "--no-contains option is only allowed in list mode"
-msgstr "Die Option --no-contains ist nur im Listenmodus erlaubt."
+msgstr "--no-contains ist nur im Listenmodus erlaubt"
 
-#: builtin/tag.c:511
+#: builtin/tag.c:543
 msgid "--points-at option is only allowed in list mode"
-msgstr "Die Option --points-at ist nur im Listenmodus erlaubt."
+msgstr "--points-at ist nur im Listenmodus erlaubt"
 
-#: builtin/tag.c:513
+#: builtin/tag.c:545
 msgid "--merged and --no-merged options are only allowed in list mode"
-msgstr "Die Optionen --merged und --no-merged sind nur im Listenmodus erlaubt."
+msgstr "--merged und --no-merged sind nur im Listenmodus erlaubt"
 
-#: builtin/tag.c:524
+#: builtin/tag.c:556
 msgid "only one -F or -m option is allowed."
 msgstr "nur eine -F oder -m Option ist erlaubt."
 
-#: builtin/tag.c:543
-msgid "too many params"
-msgstr "zu viele Parameter"
-
-#: builtin/tag.c:549
+#: builtin/tag.c:581
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' ist kein gültiger Tagname."
 
-#: builtin/tag.c:554
+#: builtin/tag.c:586
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "Tag '%s' existiert bereits"
 
-#: builtin/tag.c:585
+#: builtin/tag.c:617
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Tag '%s' aktualisiert (war %s)\n"
@@ -23122,24 +23508,24 @@
 "core.splitIndex is set to false; remove or change it, if you really want to "
 "enable split index"
 msgstr ""
-"core.splitIndex ist auf 'false' gesetzt. Entfernen oder ändern Sie dies,\n"
-"wenn sie wirklich das Splitting des Index aktivieren möchten."
+"core.splitIndex ist auf 'false' gesetzt; entfernen oder ändern Sie dies,\n"
+"wenn sie wirklich das Splitting des Index aktivieren möchten"
 
 #: builtin/update-index.c:1182
 msgid ""
 "core.splitIndex is set to true; remove or change it, if you really want to "
 "disable split index"
 msgstr ""
-"core.splitIndex ist auf 'true' gesetzt. Entfernen oder ändern Sie dies,\n"
-"wenn Sie wirklich das Splitting des Index deaktivieren möchten."
+"core.splitIndex ist auf 'true' gesetzt; entfernen oder ändern Sie dies,\n"
+"wenn Sie wirklich das Splitting des Index deaktivieren möchten"
 
 #: builtin/update-index.c:1194
 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."
+"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:1198
 msgid "Untracked cache disabled"
@@ -23150,9 +23536,9 @@
 "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 "
+"core.untrackedCache ist auf 'false' gesetzt; entfernen oder ändern Sie "
 "dies,\n"
-"wenn sie wirklich den Cache für unversionierte Dateien aktivieren möchten."
+"wenn sie wirklich den Cache für unversionierte Dateien aktivieren möchten"
 
 #: builtin/update-index.c:1210
 #, c-format
@@ -23162,9 +23548,9 @@
 #: builtin/update-index.c:1218
 msgid "core.fsmonitor is unset; set it if you really want to enable fsmonitor"
 msgstr ""
-"core.fsmonitor nicht gesetzt. Setzen Sie es, wenn Sie den Dateisystem-"
+"core.fsmonitor nicht gesetzt; setzen Sie es, wenn Sie den Dateisystem-"
 "Monitor\n"
-"wirklich aktivieren möchten."
+"wirklich aktivieren möchten"
 
 #: builtin/update-index.c:1222
 msgid "fsmonitor enabled"
@@ -23174,7 +23560,7 @@
 msgid ""
 "core.fsmonitor is set; remove it if you really want to disable fsmonitor"
 msgstr ""
-"core.fsmonitor ist gesetzt. Löschen Sie es, wenn Sie den Dateisystem-"
+"core.fsmonitor ist gesetzt; löschen Sie es, wenn Sie den Dateisystem-"
 "Monitor\n"
 "wirklich deaktivieren möchten."
 
@@ -23273,89 +23659,63 @@
 msgid "print tag contents"
 msgstr "Tag-Inhalte ausgeben"
 
-#: builtin/worktree.c:17
+#: builtin/worktree.c:18
 msgid "git worktree add [<options>] <path> [<commit-ish>]"
 msgstr "git worktree add [<Optionen>] <Pfad> [<Commit-Angabe>]"
 
-#: builtin/worktree.c:18
+#: builtin/worktree.c:19
 msgid "git worktree list [<options>]"
 msgstr "git worktree list [<Optionen>]"
 
-#: builtin/worktree.c:19
+#: builtin/worktree.c:20
 msgid "git worktree lock [<options>] <path>"
 msgstr "git worktree lock [<Optionen>] <Pfad>"
 
-#: builtin/worktree.c:20
+#: builtin/worktree.c:21
 msgid "git worktree move <worktree> <new-path>"
 msgstr "git worktree move <Arbeitsverzeichnis> <neuer-Pfad>"
 
-#: builtin/worktree.c:21
+#: builtin/worktree.c:22
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<Optionen>]"
 
-#: builtin/worktree.c:22
+#: builtin/worktree.c:23
 msgid "git worktree remove [<options>] <worktree>"
 msgstr "git worktree remove [<Optionen>] <Arbeitsverzeichnis>"
 
-#: builtin/worktree.c:23
+#: builtin/worktree.c:24
 msgid "git worktree unlock <path>"
 msgstr "git worktree unlock <Pfad>"
 
-#: builtin/worktree.c:60 builtin/worktree.c:973
+#: builtin/worktree.c:61 builtin/worktree.c:933
 #, c-format
 msgid "failed to delete '%s'"
 msgstr "Fehler beim Löschen von '%s'"
 
-#: builtin/worktree.c:85
-msgid "not a valid directory"
-msgstr "kein gültiges Verzeichnis"
-
-#: builtin/worktree.c:91
-msgid "gitdir file does not exist"
-msgstr "gitdir-Datei existiert nicht"
-
-#: builtin/worktree.c:96 builtin/worktree.c:105
-#, c-format
-msgid "unable to read gitdir file (%s)"
-msgstr "konnte gitdir-Datei nicht lesen (%s)"
-
-#: builtin/worktree.c:115
-#, c-format
-msgid "short read (expected %<PRIuMAX> bytes, read %<PRIuMAX>)"
-msgstr "read() zu kurz (%<PRIuMAX> Bytes erwartet, %<PRIuMAX> gelesen)"
-
-#: builtin/worktree.c:123
-msgid "invalid gitdir file"
-msgstr "ungültige gitdir-Datei"
-
-#: builtin/worktree.c:131
-msgid "gitdir file points to non-existent location"
-msgstr "gitdir-Datei verweist auf nicht existierenden Ort"
-
-#: builtin/worktree.c:146
+#: builtin/worktree.c:74
 #, c-format
 msgid "Removing %s/%s: %s"
 msgstr "Entferne %s/%s: %s"
 
-#: builtin/worktree.c:221
+#: builtin/worktree.c:149
 msgid "report pruned working trees"
 msgstr "entfernte Arbeitsverzeichnisse ausgeben"
 
-#: builtin/worktree.c:223
+#: builtin/worktree.c:151
 msgid "expire working trees older than <time>"
 msgstr "Arbeitsverzeichnisse älter als <Zeit> verfallen lassen"
 
-#: builtin/worktree.c:293
+#: builtin/worktree.c:221
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' existiert bereits"
 
-#: builtin/worktree.c:302
+#: builtin/worktree.c:230
 #, c-format
 msgid "unusable worktree destination '%s'"
 msgstr "nicht nutzbares Ziel des Arbeitsverzeichnisses '%s'"
 
-#: builtin/worktree.c:307
+#: builtin/worktree.c:235
 #, c-format
 msgid ""
 "'%s' is a missing but locked worktree;\n"
@@ -23365,7 +23725,7 @@
 "Benutzen Sie '%s -f -f' zum Überschreiben, oder 'unlock' und 'prune'\n"
 "oder 'remove' zum Löschen."
 
-#: builtin/worktree.c:309
+#: builtin/worktree.c:237
 #, c-format
 msgid ""
 "'%s' is a missing but already registered worktree;\n"
@@ -23375,124 +23735,137 @@
 "Benutzen Sie '%s -f' zum Überschreiben, oder 'prune' oder 'remove' zum\n"
 "Löschen."
 
-#: builtin/worktree.c:360
+#: builtin/worktree.c:288
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: builtin/worktree.c:494 builtin/worktree.c:500
+#: builtin/worktree.c:422 builtin/worktree.c:428
 #, c-format
 msgid "Preparing worktree (new branch '%s')"
 msgstr "Bereite Arbeitsverzeichnis vor (neuer Branch '%s')"
 
-#: builtin/worktree.c:496
+#: builtin/worktree.c:424
 #, c-format
 msgid "Preparing worktree (resetting branch '%s'; was at %s)"
 msgstr "Bereite Arbeitsverzeichnis vor (setze Branch '%s' um; war bei %s)"
 
-#: builtin/worktree.c:505
+#: builtin/worktree.c:433
 #, c-format
 msgid "Preparing worktree (checking out '%s')"
 msgstr "Bereite Arbeitsverzeichnis vor (checke '%s' aus)"
 
-#: builtin/worktree.c:511
+#: builtin/worktree.c:439
 #, c-format
 msgid "Preparing worktree (detached HEAD %s)"
 msgstr "Bereite Arbeitsverzeichnis vor (losgelöster HEAD %s)"
 
-#: builtin/worktree.c:552
+#: builtin/worktree.c:480
 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:555
+#: builtin/worktree.c:483
 msgid "create a new branch"
 msgstr "neuen Branch erstellen"
 
-#: builtin/worktree.c:557
+#: builtin/worktree.c:485
 msgid "create or reset a branch"
 msgstr "Branch erstellen oder umsetzen"
 
-#: builtin/worktree.c:559
+#: builtin/worktree.c:487
 msgid "populate the new working tree"
 msgstr "das neue Arbeitsverzeichnis auschecken"
 
-#: builtin/worktree.c:560
+#: builtin/worktree.c:488
 msgid "keep the new working tree locked"
 msgstr "das neue Arbeitsverzeichnis gesperrt lassen"
 
-#: builtin/worktree.c:563
+#: builtin/worktree.c:491
 msgid "set up tracking mode (see git-branch(1))"
 msgstr "Modus zum Folgen von Branches einstellen (siehe git-branch(1))"
 
-#: builtin/worktree.c:566
+#: builtin/worktree.c:494
 msgid "try to match the new branch name with a remote-tracking branch"
 msgstr ""
 "versuchen, eine Übereinstimmung des Branch-Namens mit einem\n"
 "Remote-Tracking-Branch herzustellen"
 
-#: builtin/worktree.c:574
+#: builtin/worktree.c:502
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B und --detach schließen sich gegenseitig aus"
 
-#: builtin/worktree.c:635
+#: builtin/worktree.c:563
 msgid "--[no-]track can only be used if a new branch is created"
 msgstr ""
 "--[no]-track kann nur verwendet werden, wenn ein neuer Branch erstellt wird."
 
-#: builtin/worktree.c:758
+#: builtin/worktree.c:680
+msgid "show extended annotations and reasons, if available"
+msgstr "erweiterte Anmerkungen und Gründe anzeigen, falls vorhanden"
+
+#: builtin/worktree.c:682
+msgid "add 'prunable' annotation to worktrees older than <time>"
+msgstr ""
+"'prunable'-Anmerkung zu Arbeitsverzeichnissen älter als <Zeit> hinzufügen"
+
+#: builtin/worktree.c:691
+msgid "--verbose and --porcelain are mutually exclusive"
+msgstr "--verbose und --porcelain schließen sich gegenseitig aus"
+
+#: builtin/worktree.c:718
 msgid "reason for locking"
 msgstr "Sperrgrund"
 
-#: builtin/worktree.c:770 builtin/worktree.c:803 builtin/worktree.c:877
-#: builtin/worktree.c:1001
+#: builtin/worktree.c:730 builtin/worktree.c:763 builtin/worktree.c:837
+#: builtin/worktree.c:961
 #, c-format
 msgid "'%s' is not a working tree"
 msgstr "'%s' ist kein Arbeitsverzeichnis"
 
-#: builtin/worktree.c:772 builtin/worktree.c:805
+#: builtin/worktree.c:732 builtin/worktree.c:765
 msgid "The main working tree cannot be locked or unlocked"
 msgstr "Das Hauptarbeitsverzeichnis kann nicht gesperrt oder entsperrt werden."
 
-#: builtin/worktree.c:777
+#: builtin/worktree.c:737
 #, c-format
 msgid "'%s' is already locked, reason: %s"
 msgstr "'%s' ist bereits gesperrt, Grund: %s"
 
-#: builtin/worktree.c:779
+#: builtin/worktree.c:739
 #, c-format
 msgid "'%s' is already locked"
 msgstr "'%s' ist bereits gesperrt"
 
-#: builtin/worktree.c:807
+#: builtin/worktree.c:767
 #, c-format
 msgid "'%s' is not locked"
 msgstr "'%s' ist nicht gesperrt"
 
-#: builtin/worktree.c:848
+#: builtin/worktree.c:808
 msgid "working trees containing submodules cannot be moved or removed"
 msgstr ""
 "Arbeitsverzeichnisse, die Submodule enthalten, können nicht verschoben oder\n"
 "entfernt werden."
 
-#: builtin/worktree.c:856
+#: builtin/worktree.c:816
 msgid "force move even if worktree is dirty or locked"
 msgstr ""
 "Verschieben erzwingen, auch wenn das Arbeitsverzeichnis geändert oder "
 "gesperrt ist"
 
-#: builtin/worktree.c:879 builtin/worktree.c:1003
+#: builtin/worktree.c:839 builtin/worktree.c:963
 #, c-format
 msgid "'%s' is a main working tree"
 msgstr "'%s' ist ein Hauptarbeitsverzeichnis"
 
-#: builtin/worktree.c:884
+#: builtin/worktree.c:844
 #, c-format
 msgid "could not figure out destination name from '%s'"
 msgstr "Konnte Zielname aus '%s' nicht bestimmen."
 
-#: builtin/worktree.c:897
+#: builtin/worktree.c:857
 #, c-format
 msgid ""
 "cannot move a locked working tree, lock reason: %s\n"
@@ -23502,7 +23875,7 @@
 "Benutzen Sie 'move -f -f' zum Überschreiben oder entsperren Sie zuerst\n"
 "das Arbeitsverzeichnis."
 
-#: builtin/worktree.c:899
+#: builtin/worktree.c:859
 msgid ""
 "cannot move a locked working tree;\n"
 "use 'move -f -f' to override or unlock first"
@@ -23511,40 +23884,40 @@
 "Benutzen Sie 'move -f -f' zum Überschreiben oder entsperren Sie zuerst\n"
 "das Arbeitsverzeichnis."
 
-#: builtin/worktree.c:902
+#: builtin/worktree.c:862
 #, c-format
 msgid "validation failed, cannot move working tree: %s"
 msgstr "Validierung fehlgeschlagen, kann Arbeitszeichnis nicht verschieben: %s"
 
-#: builtin/worktree.c:907
+#: builtin/worktree.c:867
 #, c-format
 msgid "failed to move '%s' to '%s'"
 msgstr "Fehler beim Verschieben von '%s' nach '%s'"
 
-#: builtin/worktree.c:953
+#: builtin/worktree.c:913
 #, c-format
 msgid "failed to run 'git status' on '%s'"
 msgstr "Fehler beim Ausführen von 'git status' auf '%s'"
 
-#: builtin/worktree.c:957
+#: builtin/worktree.c:917
 #, c-format
 msgid "'%s' contains modified or untracked files, use --force to delete it"
 msgstr ""
 "'%s' enthält geänderte oder nicht versionierte Dateien, benutzen Sie --force "
 "zum Löschen"
 
-#: builtin/worktree.c:962
+#: builtin/worktree.c:922
 #, c-format
 msgid "failed to run 'git status' on '%s', code %d"
 msgstr "Fehler beim Ausführen von 'git status' auf '%s'. Code: %d"
 
-#: builtin/worktree.c:985
+#: builtin/worktree.c:945
 msgid "force removal even if worktree is dirty or locked"
 msgstr ""
 "Löschen erzwingen, auch wenn das Arbeitsverzeichnis geändert oder gesperrt "
 "ist"
 
-#: builtin/worktree.c:1008
+#: builtin/worktree.c:968
 #, c-format
 msgid ""
 "cannot remove a locked working tree, lock reason: %s\n"
@@ -23554,7 +23927,7 @@
 "Benutzen Sie 'remove -f -f' zum Überschreiben oder entsperren Sie zuerst\n"
 "das Arbeitsverzeichnis."
 
-#: builtin/worktree.c:1010
+#: builtin/worktree.c:970
 msgid ""
 "cannot remove a locked working tree;\n"
 "use 'remove -f -f' to override or unlock first"
@@ -23563,17 +23936,17 @@
 "Benutzen Sie 'remove -f -f' zum Überschreiben oder entsperren Sie zuerst\n"
 "das Arbeitsverzeichnis."
 
-#: builtin/worktree.c:1013
+#: builtin/worktree.c:973
 #, c-format
 msgid "validation failed, cannot remove working tree: %s"
 msgstr "Validierung fehlgeschlagen, kann Arbeitsverzeichnis nicht löschen: %s"
 
-#: builtin/worktree.c:1037
+#: builtin/worktree.c:997
 #, c-format
 msgid "repair: %s: %s"
 msgstr "repariere: %s: %s"
 
-#: builtin/worktree.c:1040
+#: builtin/worktree.c:1000
 #, c-format
 msgid "error: %s: %s"
 msgstr "Fehler: %s: %s"
@@ -23594,15 +23967,23 @@
 msgid "only useful for debugging"
 msgstr "nur nützlich für Fehlersuche"
 
-#: http-fetch.c:114
+#: http-fetch.c:118
 #, c-format
 msgid "argument to --packfile must be a valid hash (got '%s')"
 msgstr "Argument für --packfile muss ein gültiger Hash sein ('%s' erhalten)"
 
-#: http-fetch.c:122
+#: http-fetch.c:128
 msgid "not a git repository"
 msgstr "kein Git-Repository"
 
+#: http-fetch.c:134
+msgid "--packfile requires --index-pack-args"
+msgstr "--packfile benötigt --index-pack-args"
+
+#: http-fetch.c:143
+msgid "--index-pack-args can only be used with --packfile"
+msgstr "--index-pack-args kann nur mit --packfile benutzt werden"
+
 #: t/helper/test-fast-rebase.c:141
 msgid "unhandled options"
 msgstr "unbehandelte Optionen"
@@ -23635,6 +24016,7 @@
 "           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--"
 "bare]\n"
 "           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]\n"
+"           [--super-prefix=<path>] [--config-env=<name>=<envvar>]\n"
 "           <command> [<args>]"
 msgstr ""
 "git [--version] [--help] [-C <Pfad>] [-c <Name>=<Wert>]\n"
@@ -23642,9 +24024,10 @@
 "           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--"
 "bare]\n"
 "           [--git-dir=<Pfad>] [--work-tree=<Pfad>] [--namespace=<Name>]\n"
+"           [--super-prefix=<Pfad>] [--config-env=<Name>=<Variable>]\n"
 "           <Befehl> [<Argumente>]"
 
-#: git.c:35
+#: git.c:36
 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"
@@ -23657,47 +24040,47 @@
 "Konzept zu erfahren.\n"
 "Benutzen Sie 'git help git' für einen Überblick des Systems."
 
-#: git.c:187
+#: git.c:188
 #, c-format
 msgid "no directory given for --git-dir\n"
 msgstr "Kein Verzeichnis für --git-dir angegeben.\n"
 
-#: git.c:201
+#: git.c:202
 #, c-format
 msgid "no namespace given for --namespace\n"
 msgstr "Kein Namespace für --namespace angegeben.\n"
 
-#: git.c:215
+#: git.c:216
 #, c-format
 msgid "no directory given for --work-tree\n"
 msgstr "Kein Verzeichnis für --work-tree angegeben.\n"
 
-#: git.c:229
+#: git.c:230
 #, c-format
 msgid "no prefix given for --super-prefix\n"
 msgstr "Kein Präfix für --super-prefix angegeben.\n"
 
-#: git.c:251
+#: git.c:252
 #, c-format
 msgid "-c expects a configuration string\n"
 msgstr "-c erwartet einen Konfigurationsstring.\n"
 
-#: git.c:289
+#: git.c:292
 #, c-format
 msgid "no directory given for -C\n"
 msgstr "Kein Verzeichnis für -C angegeben.\n"
 
-#: git.c:315
+#: git.c:318
 #, c-format
 msgid "unknown option: %s\n"
 msgstr "Unbekannte Option: %s\n"
 
-#: git.c:364
+#: git.c:367
 #, c-format
 msgid "while expanding alias '%s': '%s'"
 msgstr "beim Erweitern von Alias '%s': '%s'"
 
-#: git.c:373
+#: git.c:376
 #, c-format
 msgid ""
 "alias '%s' changes environment variables.\n"
@@ -23706,39 +24089,39 @@
 "Alias '%s' ändert Umgebungsvariablen.\n"
 "Sie können '!git' im Alias benutzen, um dies zu tun."
 
-#: git.c:380
+#: git.c:383
 #, c-format
 msgid "empty alias for %s"
 msgstr "leerer Alias für %s"
 
-#: git.c:383
+#: git.c:386
 #, c-format
 msgid "recursive alias: %s"
 msgstr "rekursiver Alias: %s"
 
-#: git.c:465
+#: git.c:468
 msgid "write failure on standard output"
 msgstr "Fehler beim Schreiben in die Standard-Ausgabe."
 
-#: git.c:467
+#: git.c:470
 msgid "unknown write failure on standard output"
 msgstr "Unbekannter Fehler beim Schreiben in die Standard-Ausgabe."
 
-#: git.c:469
+#: git.c:472
 msgid "close failed on standard output"
 msgstr "Fehler beim Schließen der Standard-Ausgabe."
 
-#: git.c:820
+#: git.c:823
 #, c-format
 msgid "alias loop detected: expansion of '%s' does not terminate:%s"
 msgstr "Alias-Schleife erkannt: Erweiterung von '%s' schließt nicht ab:%s"
 
-#: git.c:870
+#: git.c:873
 #, c-format
 msgid "cannot handle %s as a builtin"
 msgstr "Kann %s nicht als eingebauten Befehl behandeln."
 
-#: git.c:883
+#: git.c:886
 #, c-format
 msgid ""
 "usage: %s\n"
@@ -23747,12 +24130,12 @@
 "Verwendung: %s\n"
 "\n"
 
-#: git.c:903
+#: git.c:906
 #, c-format
 msgid "expansion of alias '%s' failed; '%s' is not a git command\n"
-msgstr "Erweiterung von Alias '%s' fehlgeschlagen; '%s' ist kein Git-Befehl.\n"
+msgstr "Erweiterung von Alias '%s' fehlgeschlagen; '%s' ist kein Git-Befehl\n"
 
-#: git.c:915
+#: git.c:918
 #, c-format
 msgid "failed to run command '%s': %s\n"
 msgstr "Fehler beim Ausführen von Befehl '%s': %s\n"
@@ -23819,17 +24202,17 @@
 
 #: remote-curl.c:408
 msgid "invalid server response; expected service, got flush packet"
-msgstr "Ungültige Antwort des Servers. Service erwartet, Flush-Paket bekommen"
+msgstr "ungültige Antwort des Servers; Service erwartet, Flush-Paket bekommen"
 
 #: remote-curl.c:439
 #, c-format
 msgid "invalid server response; got '%s'"
-msgstr "Ungültige Serverantwort; '%s' bekommen"
+msgstr "ungültige Serverantwort; '%s' bekommen"
 
 #: remote-curl.c:499
 #, c-format
 msgid "repository '%s' not found"
-msgstr "Repository '%s' nicht gefunden."
+msgstr "Repository '%s' nicht gefunden"
 
 #: remote-curl.c:503
 #, c-format
@@ -23992,11 +24375,11 @@
 msgstr ""
 "Mit der Option --pathspec-from-file sind Pfade durch NUL-Zeichen getrennt"
 
-#: ref-filter.h:96
+#: ref-filter.h:99
 msgid "key"
 msgstr "Schüssel"
 
-#: ref-filter.h:96
+#: ref-filter.h:99
 msgid "field name to sort on"
 msgstr "sortiere nach diesem Feld"
 
@@ -24005,14 +24388,6 @@
 msgstr ""
 "Index, wenn möglich, mit wiederverwendeter Konfliktauflösung aktualisieren"
 
-#: wt-status.h:80
-msgid "HEAD detached at "
-msgstr "HEAD losgelöst bei "
-
-#: wt-status.h:81
-msgid "HEAD detached from "
-msgstr "HEAD losgelöst von "
-
 #: command-list.h:50
 msgid "Add file contents to the index"
 msgstr "Dateiinhalte zum Commit vormerken"
@@ -24365,8 +24740,8 @@
 msgstr "multi-pack-indexes schreiben und überprüfen"
 
 #: command-list.h:132
-msgid "Creates a tag object"
-msgstr "ein Tag-Objekt erstellen"
+msgid "Creates a tag object with extra validation"
+msgstr "Erstellt ein Tag-Objekt mit zusätzlicher Validierung"
 
 #: command-list.h:133
 msgid "Build a tree-object from ls-tree formatted text"
@@ -24683,69 +25058,55 @@
 msgstr "Spezifikation von bewusst ignorierten, unversionierten Dateien"
 
 #: command-list.h:209
+msgid "Map author/committer names and/or E-Mail addresses"
+msgstr "Autor/Commit-Ersteller und/oder E-Mail-Adressen zuordnen"
+
+#: command-list.h:210
 msgid "Defining submodule properties"
 msgstr "Definition von Submodul-Eigenschaften"
 
-#: command-list.h:210
+#: command-list.h:211
 msgid "Git namespaces"
 msgstr "Git Namensbereiche"
 
-#: command-list.h:211
+#: command-list.h:212
 msgid "Helper programs to interact with remote repositories"
 msgstr "Hilfsprogramme zur Interaktion mit Remote-Repositories"
 
-#: command-list.h:212
+#: command-list.h:213
 msgid "Git Repository Layout"
 msgstr "Git Repository Aufbau"
 
-#: command-list.h:213
+#: command-list.h:214
 msgid "Specifying revisions and ranges for Git"
 msgstr "Spezifikation von Commits und Bereichen für Git"
 
-#: command-list.h:214
+#: command-list.h:215
 msgid "Mounting one repository inside another"
 msgstr "Einbinden eines Repositories in ein anderes"
 
-#: command-list.h:215
+#: command-list.h:216
 msgid "A tutorial introduction to Git: part two"
 msgstr "eine einführende Anleitung zu Git: Teil zwei"
 
-#: command-list.h:216
+#: command-list.h:217
 msgid "A tutorial introduction to Git"
 msgstr "eine einführende Anleitung zu Git"
 
-#: command-list.h:217
+#: command-list.h:218
 msgid "An overview of recommended workflows with Git"
 msgstr "Eine Übersicht über empfohlene Arbeitsabläufe mit Git"
 
-#: git-bisect.sh:48
-#, sh-format
-msgid "Bad rev input: $arg"
-msgstr "Ungültige Referenz-Eingabe: $arg"
-
-#: git-bisect.sh:82
-msgid "No logfile given"
-msgstr "Keine Log-Datei gegeben"
-
-#: git-bisect.sh:83
-#, sh-format
-msgid "cannot read $file for replaying"
-msgstr "kann $file nicht für das Abspielen lesen"
-
-#: git-bisect.sh:105
-msgid "?? what are you talking about?"
-msgstr "?? Was reden Sie da?"
-
-#: git-bisect.sh:115
+#: git-bisect.sh:68
 msgid "bisect run failed: no command provided."
 msgstr "'bisect run' fehlgeschlagen: kein Befehl angegeben."
 
-#: git-bisect.sh:120
+#: git-bisect.sh:73
 #, sh-format
 msgid "running $command"
 msgstr "führe $command aus"
 
-#: git-bisect.sh:127
+#: git-bisect.sh:80
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -24754,11 +25115,11 @@
 "'bisect run' fehlgeschlagen:\n"
 "Exit-Code $res von '$command' ist < 0 oder >= 128"
 
-#: git-bisect.sh:152
+#: git-bisect.sh:105
 msgid "bisect run cannot continue any more"
 msgstr "'bisect run' kann nicht mehr fortgesetzt werden"
 
-#: git-bisect.sh:158
+#: git-bisect.sh:111
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -24767,14 +25128,10 @@
 "'bisect run' fehlgeschlagen:\n"
 "'bisect-state $state' wurde mit Fehlerwert $res beendet"
 
-#: git-bisect.sh:165
+#: git-bisect.sh:118
 msgid "bisect run success"
 msgstr "'bisect run' erfolgreich ausgeführt"
 
-#: git-bisect.sh:173
-msgid "We are not bisecting."
-msgstr "Keine binäre Suche im Gange."
-
 #: git-merge-octopus.sh:46
 msgid ""
 "Error: Your local changes to the following files would be overwritten by "
@@ -25842,7 +26199,7 @@
 "\n"
 "    * \"./%s\" angeben, wenn Sie eine Datei meinen, oder\n"
 "    * die Option --format-patch angeben, wenn Sie einen Commit-Bereich "
-"meinen\n"
+"meinen.\n"
 
 #: git-send-email.perl:678
 #, perl-format
@@ -25856,7 +26213,7 @@
 "warning: no patches were sent\n"
 msgstr ""
 "fatal: %s: %s\n"
-"Warnung: Es wurden keine Patches versendet.\n"
+"Warnung: Es wurden keine Patches versendet\n"
 
 #: git-send-email.perl:713
 msgid ""
@@ -25865,7 +26222,7 @@
 "\n"
 msgstr ""
 "\n"
-"keine Patch-Dateien angegeben!\n"
+"Keine Patch-Dateien angegeben!\n"
 "\n"
 
 #: git-send-email.perl:726
diff --git a/po/es.po b/po/es.po
index 41a72ca..dc895bf 100644
--- a/po/es.po
+++ b/po/es.po
@@ -7,8 +7,8 @@
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2020-07-10 09:53+0800\n"
-"PO-Revision-Date: 2020-07-26 10:11-0500\n"
+"POT-Creation-Date: 2021-03-04 22:41+0800\n"
+"PO-Revision-Date: 2021-03-07 18:29-0500\n"
 "Last-Translator: christopher.diaz.riv@gmail.com\n"
 "Language-Team: CodeLabora <codelabora@gmail.com>\n"
 "Language: es\n"
@@ -16,235 +16,235 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.3\n"
+"X-Generator: Poedit 2.4.1\n"
 
-#: add-interactive.c:368
+#: add-interactive.c:376
 #, c-format
 msgid "Huh (%s)?"
 msgstr "¿Ahh (%s)?"
 
-#: add-interactive.c:521 add-interactive.c:822 reset.c:65 sequencer.c:3142
-#: sequencer.c:3581 sequencer.c:3723 builtin/rebase.c:1518
-#: builtin/rebase.c:1919
+#: add-interactive.c:529 add-interactive.c:830 reset.c:65 sequencer.c:3292
+#: sequencer.c:3743 sequencer.c:3898 builtin/rebase.c:1538
+#: builtin/rebase.c:1963
 msgid "could not read index"
 msgstr "no se pudo leer índice"
 
-#: add-interactive.c:576 git-add--interactive.perl:269
+#: add-interactive.c:584 git-add--interactive.perl:269
 #: git-add--interactive.perl:294
 msgid "binary"
 msgstr "binario"
 
-#: add-interactive.c:634 git-add--interactive.perl:278
+#: add-interactive.c:642 git-add--interactive.perl:278
 #: git-add--interactive.perl:332
 msgid "nothing"
 msgstr "nada"
 
-#: add-interactive.c:635 git-add--interactive.perl:314
+#: add-interactive.c:643 git-add--interactive.perl:314
 #: git-add--interactive.perl:329
 msgid "unchanged"
 msgstr "sin cambios"
 
-#: add-interactive.c:672 git-add--interactive.perl:643
+#: add-interactive.c:680 git-add--interactive.perl:641
 msgid "Update"
 msgstr "Actualizar"
 
-#: add-interactive.c:689 add-interactive.c:877
+#: add-interactive.c:697 add-interactive.c:885
 #, c-format
 msgid "could not stage '%s'"
 msgstr "no se pudo poner en stage '%s'"
 
-#: add-interactive.c:695 add-interactive.c:884 reset.c:89 sequencer.c:3336
+#: add-interactive.c:703 add-interactive.c:892 reset.c:89 sequencer.c:3486
 msgid "could not write index"
 msgstr "no se pudo escribir índice"
 
-#: add-interactive.c:698 git-add--interactive.perl:628
+#: add-interactive.c:706 git-add--interactive.perl:626
 #, c-format, perl-format
 msgid "updated %d path\n"
 msgid_plural "updated %d paths\n"
 msgstr[0] "actualizada %d ruta\n"
 msgstr[1] "actualizadas %d rutas\n"
 
-#: add-interactive.c:716 git-add--interactive.perl:678
+#: add-interactive.c:724 git-add--interactive.perl:676
 #, c-format, perl-format
 msgid "note: %s is untracked now.\n"
 msgstr "nota: %s no es rastreado ahora.\n"
 
-#: add-interactive.c:721 apply.c:4110 builtin/checkout.c:294
+#: add-interactive.c:729 apply.c:4125 builtin/checkout.c:295
 #: builtin/reset.c:145
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "make_cache_entry falló para la ruta '%s'"
 
-#: add-interactive.c:751 git-add--interactive.perl:655
+#: add-interactive.c:759 git-add--interactive.perl:653
 msgid "Revert"
 msgstr "Revertir"
 
-#: add-interactive.c:767
+#: add-interactive.c:775
 msgid "Could not parse HEAD^{tree}"
-msgstr "no se pudo analizar HEAD^{tree}"
+msgstr "No se pudo analizar HEAD^{tree}"
 
-#: add-interactive.c:805 git-add--interactive.perl:631
+#: add-interactive.c:813 git-add--interactive.perl:629
 #, c-format, perl-format
 msgid "reverted %d path\n"
 msgid_plural "reverted %d paths\n"
 msgstr[0] "revertida %d ruta\n"
 msgstr[1] "revertidas %d rutas\n"
 
-#: add-interactive.c:856 git-add--interactive.perl:695
+#: add-interactive.c:864 git-add--interactive.perl:693
 #, c-format
 msgid "No untracked files.\n"
 msgstr "No hay archivos sin rastrear.\n"
 
-#: add-interactive.c:860 git-add--interactive.perl:689
+#: add-interactive.c:868 git-add--interactive.perl:687
 msgid "Add untracked"
 msgstr "Agregar no rastreados"
 
-#: add-interactive.c:887 git-add--interactive.perl:625
+#: add-interactive.c:895 git-add--interactive.perl:623
 #, c-format, perl-format
 msgid "added %d path\n"
 msgid_plural "added %d paths\n"
 msgstr[0] "agregada %d ruta\n"
 msgstr[1] "agregadas %d rutas\n"
 
-#: add-interactive.c:917
+#: add-interactive.c:925
 #, c-format
 msgid "ignoring unmerged: %s"
 msgstr "ignorando lo no fusionado: %s"
 
-#: add-interactive.c:929 add-patch.c:1691 git-add--interactive.perl:1368
+#: add-interactive.c:937 add-patch.c:1751 git-add--interactive.perl:1369
 #, c-format
 msgid "Only binary files changed.\n"
 msgstr "Solo cambiaron archivos binarios.\n"
 
-#: add-interactive.c:931 add-patch.c:1689 git-add--interactive.perl:1370
+#: add-interactive.c:939 add-patch.c:1749 git-add--interactive.perl:1371
 #, c-format
 msgid "No changes.\n"
 msgstr "Sin cambios.\n"
 
-#: add-interactive.c:935 git-add--interactive.perl:1378
+#: add-interactive.c:943 git-add--interactive.perl:1379
 msgid "Patch update"
 msgstr "Actualización del parche"
 
-#: add-interactive.c:974 git-add--interactive.perl:1771
+#: add-interactive.c:982 git-add--interactive.perl:1792
 msgid "Review diff"
 msgstr "Revisión de  diff"
 
-#: add-interactive.c:1002
+#: add-interactive.c:1010
 msgid "show paths with changes"
 msgstr "mostrar rutas con cambios"
 
-#: add-interactive.c:1004
+#: add-interactive.c:1012
 msgid "add working tree state to the staged set of changes"
 msgstr "agregar estado del árbol de trabajo al conjunto de cambios en stage"
 
-#: add-interactive.c:1006
+#: add-interactive.c:1014
 msgid "revert staged set of changes back to the HEAD version"
 msgstr "revertir conjunto de cambios en stage a la versión de HEAD"
 
-#: add-interactive.c:1008
+#: add-interactive.c:1016
 msgid "pick hunks and update selectively"
 msgstr "elegir hunks y actualizar de forma selectiva"
 
-#: add-interactive.c:1010
+#: add-interactive.c:1018
 msgid "view diff between HEAD and index"
 msgstr "ver diff entre HEAD e index"
 
-#: add-interactive.c:1012
+#: add-interactive.c:1020
 msgid "add contents of untracked files to the staged set of changes"
 msgstr ""
 "agregar contenidos de archivos sin rastrear al conjunto de cambios de stage"
 
-#: add-interactive.c:1020 add-interactive.c:1069
+#: add-interactive.c:1028 add-interactive.c:1077
 msgid "Prompt help:"
 msgstr "Mostrar ayuda:"
 
-#: add-interactive.c:1022
+#: add-interactive.c:1030
 msgid "select a single item"
 msgstr "selecciona un único objeto"
 
-#: add-interactive.c:1024
+#: add-interactive.c:1032
 msgid "select a range of items"
 msgstr "selecciona un rango de objetos"
 
-#: add-interactive.c:1026
+#: add-interactive.c:1034
 msgid "select multiple ranges"
 msgstr "selecciona multiples rangos"
 
-#: add-interactive.c:1028 add-interactive.c:1073
+#: add-interactive.c:1036 add-interactive.c:1081
 msgid "select item based on unique prefix"
 msgstr "seleccionar objeto basado en prefijo único"
 
-#: add-interactive.c:1030
+#: add-interactive.c:1038
 msgid "unselect specified items"
 msgstr "quitar objetos especificados"
 
-#: add-interactive.c:1032
+#: add-interactive.c:1040
 msgid "choose all items"
 msgstr "escoger todos los objetos"
 
-#: add-interactive.c:1034
+#: add-interactive.c:1042
 msgid "(empty) finish selecting"
 msgstr "(vacío) finalizar selección"
 
-#: add-interactive.c:1071
+#: add-interactive.c:1079
 msgid "select a numbered item"
 msgstr "selecciona un objeto numerado"
 
-#: add-interactive.c:1075
+#: add-interactive.c:1083
 msgid "(empty) select nothing"
 msgstr "(vacío) selecciona nada"
 
-#: add-interactive.c:1083 builtin/clean.c:816 git-add--interactive.perl:1868
+#: add-interactive.c:1091 builtin/clean.c:816 git-add--interactive.perl:1896
 msgid "*** Commands ***"
 msgstr "*** Comandos ***"
 
-#: add-interactive.c:1084 builtin/clean.c:817 git-add--interactive.perl:1865
+#: add-interactive.c:1092 builtin/clean.c:817 git-add--interactive.perl:1893
 msgid "What now"
 msgstr "Ahora que"
 
-#: add-interactive.c:1136 git-add--interactive.perl:213
+#: add-interactive.c:1144 git-add--interactive.perl:213
 msgid "staged"
 msgstr "rastreado"
 
-#: add-interactive.c:1136 git-add--interactive.perl:213
+#: add-interactive.c:1144 git-add--interactive.perl:213
 msgid "unstaged"
 msgstr "no rastreado"
 
-#: add-interactive.c:1136 apply.c:4967 apply.c:4970 builtin/am.c:2250
-#: builtin/am.c:2253 builtin/clone.c:123 builtin/fetch.c:145
-#: builtin/merge.c:276 builtin/pull.c:190 builtin/submodule--helper.c:409
-#: builtin/submodule--helper.c:1394 builtin/submodule--helper.c:1397
-#: builtin/submodule--helper.c:1902 builtin/submodule--helper.c:1905
-#: builtin/submodule--helper.c:2148 bugreport.c:135
+#: add-interactive.c:1144 apply.c:4987 apply.c:4990 builtin/am.c:2257
+#: builtin/am.c:2260 builtin/bugreport.c:134 builtin/clone.c:124
+#: builtin/fetch.c:150 builtin/merge.c:285 builtin/pull.c:190
+#: builtin/submodule--helper.c:409 builtin/submodule--helper.c:1818
+#: builtin/submodule--helper.c:1821 builtin/submodule--helper.c:2326
+#: builtin/submodule--helper.c:2329 builtin/submodule--helper.c:2572
 #: git-add--interactive.perl:213
 msgid "path"
 msgstr "ruta"
 
-#: add-interactive.c:1143
+#: add-interactive.c:1151
 msgid "could not refresh index"
 msgstr "no se pudo refrescar el index"
 
-#: add-interactive.c:1157 builtin/clean.c:781 git-add--interactive.perl:1782
+#: add-interactive.c:1165 builtin/clean.c:781 git-add--interactive.perl:1803
 #, c-format
 msgid "Bye.\n"
 msgstr "Adiós.\n"
 
-#: add-patch.c:34 git-add--interactive.perl:1430
+#: add-patch.c:34 git-add--interactive.perl:1431
 #, c-format, perl-format
 msgid "Stage mode change [y,n,q,a,d%s,?]? "
 msgstr "¿Cambio de modo de stage [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:35 git-add--interactive.perl:1431
+#: add-patch.c:35 git-add--interactive.perl:1432
 #, c-format, perl-format
 msgid "Stage deletion [y,n,q,a,d%s,?]? "
 msgstr "¿Aplicar stage al borrado [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:36 git-add--interactive.perl:1432
+#: add-patch.c:36 git-add--interactive.perl:1433
 #, c-format, perl-format
 msgid "Stage addition [y,n,q,a,d%s,?]? "
 msgstr "¿Agregar al stage [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:37 git-add--interactive.perl:1433
+#: add-patch.c:37 git-add--interactive.perl:1434
 #, c-format, perl-format
 msgid "Stage this hunk [y,n,q,a,d%s,?]? "
 msgstr "¿Aplicar stage a este hunk [y,n,q,a,d%s,?]? "
@@ -272,22 +272,22 @@
 "d - no aplicar stage a este hunk o a ninguno de los posteriores en este "
 "archivo\n"
 
-#: add-patch.c:56 git-add--interactive.perl:1436
+#: add-patch.c:56 git-add--interactive.perl:1437
 #, c-format, perl-format
 msgid "Stash mode change [y,n,q,a,d%s,?]? "
 msgstr "¿Aplicar stash al cambio de modo [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:57 git-add--interactive.perl:1437
+#: add-patch.c:57 git-add--interactive.perl:1438
 #, c-format, perl-format
 msgid "Stash deletion [y,n,q,a,d%s,?]? "
 msgstr "¿Aplicar stash al borrado [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:58 git-add--interactive.perl:1438
+#: add-patch.c:58 git-add--interactive.perl:1439
 #, c-format, perl-format
 msgid "Stash addition [y,n,q,a,d%s,?]? "
 msgstr "¿Agregar al stash [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:59 git-add--interactive.perl:1439
+#: add-patch.c:59 git-add--interactive.perl:1440
 #, c-format, perl-format
 msgid "Stash this hunk [y,n,q,a,d%s,?]? "
 msgstr "¿Aplicar stash a este hunk [y,n,q,a,d%s,?]? "
@@ -314,22 +314,22 @@
 "a - aplicar stash a este hunk y a todos los posteriores en el archivo\n"
 "d - no aplicar stash a este hunk o ninguno de los posteriores en el archivo\n"
 
-#: add-patch.c:80 git-add--interactive.perl:1442
+#: add-patch.c:80 git-add--interactive.perl:1443
 #, c-format, perl-format
 msgid "Unstage mode change [y,n,q,a,d%s,?]? "
 msgstr "¿Sacar cambio de modo del stage [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:81 git-add--interactive.perl:1443
+#: add-patch.c:81 git-add--interactive.perl:1444
 #, c-format, perl-format
 msgid "Unstage deletion [y,n,q,a,d%s,?]? "
 msgstr "¿Sacar borrado del stage [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:82 git-add--interactive.perl:1444
+#: add-patch.c:82 git-add--interactive.perl:1445
 #, c-format, perl-format
 msgid "Unstage addition [y,n,q,a,d%s,?]? "
 msgstr "¿Quitar adición al stage [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:83 git-add--interactive.perl:1445
+#: add-patch.c:83 git-add--interactive.perl:1446
 #, c-format, perl-format
 msgid "Unstage this hunk [y,n,q,a,d%s,?]? "
 msgstr "¿Sacar este hunk del stage [y,n,q,a,d%s,?]? "
@@ -357,22 +357,22 @@
 "d - no sacar del area de stage este hunk o ninguno de los posteriores en el "
 "archivo\n"
 
-#: add-patch.c:103 git-add--interactive.perl:1448
+#: add-patch.c:103 git-add--interactive.perl:1449
 #, c-format, perl-format
 msgid "Apply mode change to index [y,n,q,a,d%s,?]? "
 msgstr "¿Aplicar cambio de modo al índice [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:104 git-add--interactive.perl:1449
+#: add-patch.c:104 git-add--interactive.perl:1450
 #, c-format, perl-format
 msgid "Apply deletion to index [y,n,q,a,d%s,?]? "
 msgstr "¿Aplicar borrado al índice [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:105 git-add--interactive.perl:1450
+#: add-patch.c:105 git-add--interactive.perl:1451
 #, c-format, perl-format
 msgid "Apply addition to index [y,n,q,a,d%s,?]? "
 msgstr "¿Aplicar adición al índice [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:106 git-add--interactive.perl:1451
+#: add-patch.c:106 git-add--interactive.perl:1452
 #, c-format, perl-format
 msgid "Apply this hunk to index [y,n,q,a,d%s,?]? "
 msgstr "¿Aplicar este hunk al índice [y,n,q,a,d%s,?]? "
@@ -399,26 +399,26 @@
 "a - aplicar este hunk y todos los posteriores en el archivo\n"
 "d - no aplicar este hunko ninguno de los posteriores en el archivo\n"
 
-#: add-patch.c:126 git-add--interactive.perl:1454
-#: git-add--interactive.perl:1472
+#: add-patch.c:126 git-add--interactive.perl:1455
+#: git-add--interactive.perl:1473
 #, c-format, perl-format
 msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? "
 msgstr "¿Descartar cambio de modo del árbol de trabajo [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:127 git-add--interactive.perl:1455
-#: git-add--interactive.perl:1473
+#: add-patch.c:127 git-add--interactive.perl:1456
+#: git-add--interactive.perl:1474
 #, c-format, perl-format
 msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? "
 msgstr "¿Descartar borrado del árbol de trabajo [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:128 git-add--interactive.perl:1456
-#: git-add--interactive.perl:1474
+#: add-patch.c:128 git-add--interactive.perl:1457
+#: git-add--interactive.perl:1475
 #, c-format, perl-format
 msgid "Discard addition from worktree [y,n,q,a,d%s,?]? "
 msgstr "¿Descartar adición del árbol de trabajo [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:129 git-add--interactive.perl:1457
-#: git-add--interactive.perl:1475
+#: add-patch.c:129 git-add--interactive.perl:1458
+#: git-add--interactive.perl:1476
 #, c-format, perl-format
 msgid "Discard this hunk from worktree [y,n,q,a,d%s,?]? "
 msgstr "¿Descartar este hunk del árbol de trabajo [y,n,q,a,d%s,?]? "
@@ -445,23 +445,23 @@
 "a - descartar este hunk y todos los posteriores en este archivo\n"
 "d - no descartar este hunk o ninguno de los posteriores en el archivo\n"
 
-#: add-patch.c:149 add-patch.c:194 git-add--interactive.perl:1460
+#: add-patch.c:149 add-patch.c:194 git-add--interactive.perl:1461
 #, c-format, perl-format
 msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
 msgstr ""
 "¿Descartar cambio de modo del índice y el árbol de trabajo [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:150 add-patch.c:195 git-add--interactive.perl:1461
+#: add-patch.c:150 add-patch.c:195 git-add--interactive.perl:1462
 #, c-format, perl-format
 msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
 msgstr "¿Descartar borrado del índice y el árbol de trabajo [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:151 add-patch.c:196 git-add--interactive.perl:1462
+#: add-patch.c:151 add-patch.c:196 git-add--interactive.perl:1463
 #, c-format, perl-format
 msgid "Discard addition from index and worktree [y,n,q,a,d%s,?]? "
 msgstr "¿Descartar adición del índice y el árbol de trabajo [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:152 add-patch.c:197 git-add--interactive.perl:1463
+#: add-patch.c:152 add-patch.c:197 git-add--interactive.perl:1464
 #, c-format, perl-format
 msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "
 msgstr ""
@@ -481,24 +481,24 @@
 "a - descartar este hunk y todos los posteriores en este archivo\n"
 "d - no descartar este hunk o ninguno posterior en el archivo\n"
 
-#: add-patch.c:171 add-patch.c:216 git-add--interactive.perl:1466
+#: add-patch.c:171 add-patch.c:216 git-add--interactive.perl:1467
 #, c-format, perl-format
 msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
 msgstr ""
 "¿Aplicar cambio de modo para el índice y el árbol de trabajo [y,n,q,a,d"
 "%s,?]? "
 
-#: add-patch.c:172 add-patch.c:217 git-add--interactive.perl:1467
+#: add-patch.c:172 add-patch.c:217 git-add--interactive.perl:1468
 #, c-format, perl-format
 msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
 msgstr "¿Aplicar borrado al índice y al árbol de trabajo [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:173 add-patch.c:218 git-add--interactive.perl:1468
+#: add-patch.c:173 add-patch.c:218 git-add--interactive.perl:1469
 #, c-format, perl-format
 msgid "Apply addition to index and worktree [y,n,q,a,d%s,?]? "
 msgstr "¿Aplicar adición al índice y al árbol de trabajo [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:174 add-patch.c:219 git-add--interactive.perl:1469
+#: add-patch.c:174 add-patch.c:219 git-add--interactive.perl:1470
 #, c-format, perl-format
 msgid "Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "
 msgstr "¿Aplicar este hunk al índice y árbol de trabajo [y,n,q,a,d,/%s,?]? "
@@ -531,34 +531,34 @@
 "a - aplicar este hunk y todos los posteriores en el archivo\n"
 "d - no aplicar este hunk o ninguno de los siguientes en este archivo\n"
 
-#: add-patch.c:328
+#: add-patch.c:342
 #, c-format
 msgid "could not parse hunk header '%.*s'"
 msgstr "no se puede analizar hunk header '%.*s'"
 
-#: add-patch.c:347 add-patch.c:351
+#: add-patch.c:361 add-patch.c:365
 #, c-format
 msgid "could not parse colored hunk header '%.*s'"
 msgstr "no se puede analizar hunk header '%.*s'"
 
-#: add-patch.c:405
+#: add-patch.c:419
 msgid "could not parse diff"
 msgstr "no se puede analizar diff"
 
-#: add-patch.c:424
+#: add-patch.c:438
 msgid "could not parse colored diff"
 msgstr "no se pudo analizar diff a colores"
 
-#: add-patch.c:438
+#: add-patch.c:452
 #, c-format
 msgid "failed to run '%s'"
 msgstr "falló al ejecutar '%s'"
 
-#: add-patch.c:602
+#: add-patch.c:611
 msgid "mismatched output from interactive.diffFilter"
 msgstr "output de interactive.diffFilter no concuerda"
 
-#: add-patch.c:603
+#: add-patch.c:612
 msgid ""
 "Your filter must maintain a one-to-one correspondence\n"
 "between its input and output lines."
@@ -566,7 +566,7 @@
 "Tu filtro tiene que mantener correspondencia de uno a uno\n"
 "entre las líneas de entrada y salida."
 
-#: add-patch.c:776
+#: add-patch.c:790
 #, c-format
 msgid ""
 "expected context line #%d in\n"
@@ -575,7 +575,7 @@
 "se esperaba línea de contexto #%d en\n"
 "%.*s"
 
-#: add-patch.c:791
+#: add-patch.c:805
 #, c-format
 msgid ""
 "hunks do not overlap:\n"
@@ -588,11 +588,11 @@
 "\tno acaba con:\n"
 "%.*s"
 
-#: add-patch.c:1067 git-add--interactive.perl:1114
+#: add-patch.c:1081 git-add--interactive.perl:1115
 msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
 msgstr "Modo de edición manual de hunk -- vea abajo para una guía rápida.\n"
 
-#: add-patch.c:1071
+#: add-patch.c:1085
 #, c-format
 msgid ""
 "---\n"
@@ -606,7 +606,7 @@
 "Lineas comenzando con  %c serán eliminadas.\n"
 
 #. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
-#: add-patch.c:1085 git-add--interactive.perl:1128
+#: add-patch.c:1099 git-add--interactive.perl:1129
 msgid ""
 "If it does not apply cleanly, you will be given an opportunity to\n"
 "edit again.  If all lines of the hunk are removed, then the edit is\n"
@@ -616,11 +616,11 @@
 "editar nuevamente. Si todas las líneas del hunk son eliminadas, entonces \n"
 "la edición es abortada y el hunk queda sin cambios.\n"
 
-#: add-patch.c:1118
+#: add-patch.c:1132
 msgid "could not parse hunk header"
 msgstr "no se puede analizar hunk header"
 
-#: add-patch.c:1163
+#: add-patch.c:1177
 msgid "'git apply --cached' failed"
 msgstr "falló 'git apply --cached'"
 
@@ -636,26 +636,26 @@
 #. Consider translating (saying "no" discards!) as
 #. (saying "n" for "no" discards!) if the translation
 #. of the word "no" does not start with n.
-#: add-patch.c:1232 git-add--interactive.perl:1241
+#: add-patch.c:1246 git-add--interactive.perl:1242
 msgid ""
 "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
 msgstr ""
 "Tu hunk editado no aplica. ¿Editar nuevamente (¡decir \"no\" descarta!) [y/"
 "n]? "
 
-#: add-patch.c:1275
+#: add-patch.c:1289
 msgid "The selected hunks do not apply to the index!"
 msgstr "¡Los hunks seleccionados no aplican al índice!"
 
-#: add-patch.c:1276 git-add--interactive.perl:1345
+#: add-patch.c:1290 git-add--interactive.perl:1346
 msgid "Apply them to the worktree anyway? "
 msgstr "¿Aplicarlos al árbol de trabajo de todas maneras? "
 
-#: add-patch.c:1283 git-add--interactive.perl:1348
+#: add-patch.c:1297 git-add--interactive.perl:1349
 msgid "Nothing was applied.\n"
 msgstr "Nada fue aplicado.\n"
 
-#: add-patch.c:1340
+#: add-patch.c:1354
 msgid ""
 "j - leave this hunk undecided, see next undecided hunk\n"
 "J - leave this hunk undecided, see next hunk\n"
@@ -677,73 +677,73 @@
 "e - editar manualmente el hunk actual\n"
 "? - imprimir ayuda\n"
 
-#: add-patch.c:1463 add-patch.c:1473
+#: add-patch.c:1516 add-patch.c:1526
 msgid "No previous hunk"
 msgstr "No el anterior hunk"
 
-#: add-patch.c:1468 add-patch.c:1478
+#: add-patch.c:1521 add-patch.c:1531
 msgid "No next hunk"
 msgstr "No el siguiente hunk"
 
-#: add-patch.c:1484
+#: add-patch.c:1537
 msgid "No other hunks to goto"
 msgstr "No hay más pedazos para el ir"
 
-#: add-patch.c:1495 git-add--interactive.perl:1594
+#: add-patch.c:1548 git-add--interactive.perl:1606
 msgid "go to which hunk (<ret> to see more)? "
 msgstr "¿a que hunk ir (<enter> para ver más)? "
 
-#: add-patch.c:1496 git-add--interactive.perl:1596
+#: add-patch.c:1549 git-add--interactive.perl:1608
 msgid "go to which hunk? "
 msgstr "¿a que hunk ir? "
 
-#: add-patch.c:1507
+#: add-patch.c:1560
 #, c-format
 msgid "Invalid number: '%s'"
 msgstr "Numero inválido: '%s'"
 
-#: add-patch.c:1512
+#: add-patch.c:1565
 #, c-format
 msgid "Sorry, only %d hunk available."
 msgid_plural "Sorry, only %d hunks available."
 msgstr[0] "Lo siento, solo %d hunk disponible."
 msgstr[1] "Lo siento, solo %d hunks disponibles."
 
-#: add-patch.c:1521
+#: add-patch.c:1574
 msgid "No other hunks to search"
 msgstr "No hay más pedazos para buscar"
 
-#: add-patch.c:1527 git-add--interactive.perl:1640
+#: add-patch.c:1580 git-add--interactive.perl:1661
 msgid "search for regex? "
 msgstr "¿buscar para regexp? "
 
-#: add-patch.c:1542
+#: add-patch.c:1595
 #, c-format
 msgid "Malformed search regexp %s: %s"
 msgstr "Regexp para la búsqueda mal formado %s: %s"
 
-#: add-patch.c:1559
+#: add-patch.c:1612
 msgid "No hunk matches the given pattern"
-msgstr "No hay hunks que concuerden con el patrón entregado."
+msgstr "No hay hunks que concuerden con el patrón entregado"
 
-#: add-patch.c:1566
+#: add-patch.c:1619
 msgid "Sorry, cannot split this hunk"
 msgstr "Perdón, no se puede dividir este pedazo"
 
-#: add-patch.c:1570
+#: add-patch.c:1623
 #, c-format
 msgid "Split into %d hunks."
 msgstr "Cortar en %d hunk."
 
-#: add-patch.c:1574
+#: add-patch.c:1627
 msgid "Sorry, cannot edit this hunk"
 msgstr "Perdón, no se puede editar este pedazo"
 
-#: add-patch.c:1625
+#: add-patch.c:1679
 msgid "'git apply' failed"
 msgstr "falló 'git apply'"
 
-#: advice.c:140
+#: advice.c:143
 #, c-format
 msgid ""
 "\n"
@@ -752,38 +752,38 @@
 "\n"
 "Desactivar este mensaje con \"git config advice.%s false\""
 
-#: advice.c:156
+#: advice.c:159
 #, c-format
 msgid "%shint: %.*s%s\n"
 msgstr "%sayuda: %.*s%s\n"
 
-#: advice.c:247
+#: advice.c:250
 msgid "Cherry-picking is not possible because you have unmerged files."
 msgstr ""
 "No es posible ejecutar cherry-picking porque tienes archivos sin fusionar."
 
-#: advice.c:249
+#: advice.c:252
 msgid "Committing is not possible because you have unmerged files."
 msgstr "No es posible realizar un commit porque tienes archivos sin fusionar."
 
-#: advice.c:251
+#: advice.c:254
 msgid "Merging is not possible because you have unmerged files."
 msgstr "No es posible hacer merge porque tienes archivos sin fusionar."
 
-#: advice.c:253
+#: advice.c:256
 msgid "Pulling is not possible because you have unmerged files."
 msgstr "No es posible hacer pull porque tienes archivos sin fusionar."
 
-#: advice.c:255
+#: advice.c:258
 msgid "Reverting is not possible because you have unmerged files."
 msgstr "No es posible revertir porque tienes archivos sin fusionar."
 
-#: advice.c:257
+#: advice.c:260
 #, c-format
 msgid "It is not possible to %s because you have unmerged files."
 msgstr "No es posible %s porque tienes archivos sin fusionar."
 
-#: advice.c:265
+#: advice.c:268
 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."
@@ -791,23 +791,23 @@
 "Corrígelos en el árbol de trabajo y entonces usa 'git add/rm <archivo>',\n"
 "como sea apropiado, para marcar la resolución y realizar un commit."
 
-#: advice.c:273
+#: advice.c:276
 msgid "Exiting because of an unresolved conflict."
 msgstr "Saliendo porque existe un conflicto sin resolver."
 
-#: advice.c:278 builtin/merge.c:1353
+#: advice.c:281 builtin/merge.c:1370
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "No has concluido tu fusión (MERGE_HEAD existe)."
 
-#: advice.c:280
+#: advice.c:283
 msgid "Please, commit your changes before merging."
 msgstr "Por favor, realiza un commit antes de fusionar."
 
-#: advice.c:281
+#: advice.c:284
 msgid "Exiting because of unfinished merge."
 msgstr "Saliendo por una fusión inconclusa."
 
-#: advice.c:287
+#: advice.c:290
 #, c-format
 msgid ""
 "Note: switching to '%s'.\n"
@@ -1107,7 +1107,8 @@
 msgid "cannot checkout %s"
 msgstr "no se puede hacer checkout a %s"
 
-#: apply.c:3405 apply.c:3416 apply.c:3462 midx.c:61 setup.c:308
+#: apply.c:3405 apply.c:3416 apply.c:3462 midx.c:86 pack-revindex.c:213
+#: setup.c:308
 #, c-format
 msgid "failed to read %s"
 msgstr "no se pudo leer %s"
@@ -1127,7 +1128,7 @@
 msgid "%s: does not exist in index"
 msgstr "%s: no existe en el índice"
 
-#: apply.c:3537 apply.c:3708
+#: apply.c:3537 apply.c:3708 apply.c:3952
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s: no concuerda con el índice"
@@ -1177,182 +1178,182 @@
 msgid "%s has type %o, expected %o"
 msgstr "%s tiene tipo %o, se esperaba %o"
 
-#: apply.c:3878 apply.c:3880 read-cache.c:830 read-cache.c:856
-#: read-cache.c:1325
+#: apply.c:3892 apply.c:3894 read-cache.c:832 read-cache.c:858
+#: read-cache.c:1313
 #, c-format
 msgid "invalid path '%s'"
 msgstr "ruta inválida '%s'"
 
-#: apply.c:3936
+#: apply.c:3950
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s: ya existe en el índice"
 
-#: apply.c:3939
+#: apply.c:3954
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s: ya existe en el directorio de trabajo"
 
-#: apply.c:3959
+#: apply.c:3974
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "nuevo modo (%o) de %s no concuerda con el viejo modo (%o)"
 
-#: apply.c:3964
+#: apply.c:3979
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr "nuevo modo (%o) de %s no concuerda con el viejo modo (%o) de %s"
 
-#: apply.c:3984
+#: apply.c:3999
 #, c-format
 msgid "affected file '%s' is beyond a symbolic link"
 msgstr "archivo afectado '%s' está tras un enlace simbólico"
 
-#: apply.c:3988
+#: apply.c:4003
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s: el parche no aplica"
 
-#: apply.c:4003
+#: apply.c:4018
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Revisando el parche %s..."
 
-#: apply.c:4095
+#: apply.c:4110
 #, c-format
 msgid "sha1 information is lacking or useless for submodule %s"
 msgstr "falta información del sha1 o es inútil para el submódulo %s"
 
-#: apply.c:4102
+#: apply.c:4117
 #, c-format
 msgid "mode change for %s, which is not in current HEAD"
 msgstr "modo cambiado para %s, el cual no se encuentra en el HEAD actual"
 
-#: apply.c:4105
+#: apply.c:4120
 #, c-format
 msgid "sha1 information is lacking or useless (%s)."
 msgstr "falta información sha1 o es inútil (%s)."
 
-#: apply.c:4114
+#: apply.c:4129
 #, c-format
 msgid "could not add %s to temporary index"
 msgstr "no se pudo añadir %s al índice temporal"
 
-#: apply.c:4124
+#: apply.c:4139
 #, c-format
 msgid "could not write temporary index to %s"
 msgstr "no se pudo escribir un índice temporal para %s"
 
-#: apply.c:4262
+#: apply.c:4277
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "no se puede eliminar %s del índice"
 
-#: apply.c:4296
+#: apply.c:4311
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "parche corrupto para el submódulo %s"
 
-#: apply.c:4302
+#: apply.c:4317
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "no es posible establecer el archivo recién creado '%s'"
 
-#: apply.c:4310
+#: apply.c:4325
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr ""
 "no es posible crear una copia de seguridad para el archivo recién creado %s"
 
-#: apply.c:4316 apply.c:4461
+#: apply.c:4331 apply.c:4476
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "no es posible agregar una entrada en el cache para %s"
 
-#: apply.c:4359
+#: apply.c:4374 builtin/bisect--helper.c:523
 #, c-format
 msgid "failed to write to '%s'"
 msgstr "falló escribir para '%s'"
 
-#: apply.c:4363
+#: apply.c:4378
 #, c-format
 msgid "closing file '%s'"
 msgstr "cerrando archivo '%s'"
 
-#: apply.c:4433
+#: apply.c:4448
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "no es posible escribir el archivo '%s' modo %o"
 
-#: apply.c:4531
+#: apply.c:4546
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Parche %s aplicado limpiamente."
 
-#: apply.c:4539
+#: apply.c:4554
 msgid "internal error"
 msgstr "error interno"
 
-#: apply.c:4542
+#: apply.c:4557
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] "Aplicando parche %%s con %d rechazo..."
 msgstr[1] "Aplicando parche %%s con %d rechazos..."
 
-#: apply.c:4553
+#: apply.c:4568
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "truncando el nombre de archivo .rej a %.*s.rej"
 
-#: apply.c:4561 builtin/fetch.c:902 builtin/fetch.c:1195
+#: apply.c:4576 builtin/fetch.c:933 builtin/fetch.c:1334
 #, c-format
 msgid "cannot open %s"
 msgstr "no se puede abrir %s"
 
-#: apply.c:4575
+#: apply.c:4590
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "Hunk #%d aplicado limpiamente."
 
-#: apply.c:4579
+#: apply.c:4594
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "Hunk #%d rechazado."
 
-#: apply.c:4698
+#: apply.c:4718
 #, c-format
 msgid "Skipped patch '%s'."
 msgstr "Parche '%s' saltado."
 
-#: apply.c:4706
+#: apply.c:4726
 msgid "unrecognized input"
 msgstr "input no reconocido"
 
-#: apply.c:4726
+#: apply.c:4746
 msgid "unable to read index file"
 msgstr "no es posible leer el archivo índice"
 
-#: apply.c:4883
+#: apply.c:4903
 #, c-format
 msgid "can't open patch '%s': %s"
 msgstr "no se puede abrir el parche '%s': %s"
 
-#: apply.c:4910
+#: apply.c:4930
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "%d error de espacios en blanco aplastado"
 msgstr[1] "%d errores de espacios en blanco aplastados"
 
-#: apply.c:4916 apply.c:4931
+#: apply.c:4936 apply.c:4951
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
 msgstr[0] "%d línea agrega errores de espacios en blanco."
 msgstr[1] "%d líneas agregan errores de espacios en blanco."
 
-#: apply.c:4924
+#: apply.c:4944
 #, c-format
 msgid "%d line applied after fixing whitespace errors."
 msgid_plural "%d lines applied after fixing whitespace errors."
@@ -1361,185 +1362,180 @@
 msgstr[1] ""
 "%d líneas aplicadas después de arreglar los errores de espacios en blanco."
 
-#: apply.c:4940 builtin/add.c:612 builtin/mv.c:301 builtin/rm.c:406
+#: apply.c:4960 builtin/add.c:626 builtin/mv.c:304 builtin/rm.c:406
 msgid "Unable to write new index file"
 msgstr "No es posible escribir el archivo índice"
 
-#: apply.c:4968
+#: apply.c:4988
 msgid "don't apply changes matching the given path"
 msgstr "no aplicar cambios que concuerden con la ruta suministrada"
 
-#: apply.c:4971
+#: apply.c:4991
 msgid "apply changes matching the given path"
 msgstr "aplicar cambios que concuerden con la ruta suministrada"
 
-#: apply.c:4973 builtin/am.c:2259
+#: apply.c:4993 builtin/am.c:2266
 msgid "num"
 msgstr "num"
 
-#: apply.c:4974
+#: apply.c:4994
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "eliminar <num> slashes iniciales de las rutas diff tradicionales"
 
-#: apply.c:4977
+#: apply.c:4997
 msgid "ignore additions made by the patch"
 msgstr "ignorar adiciones hechas por el parche"
 
-#: apply.c:4979
+#: apply.c:4999
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr "en lugar de aplicar el parche, mostrar diffstat para la entrada"
 
-#: apply.c:4983
+#: apply.c:5003
 msgid "show number of added and deleted lines in decimal notation"
 msgstr "mostrar el numero de líneas agregadas y eliminadas en notación decimal"
 
-#: apply.c:4985
+#: apply.c:5005
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "en lugar de aplicar el parche, mostrar un resumen para la entrada"
 
-#: apply.c:4987
+#: apply.c:5007
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "en lugar de aplicar el parche, ver si el parche es aplicable"
 
-#: apply.c:4989
+#: apply.c:5009
 msgid "make sure the patch is applicable to the current index"
 msgstr "asegurar que el parche es aplicable al índice actual"
 
-#: apply.c:4991
+#: apply.c:5011
 msgid "mark new files with `git add --intent-to-add`"
 msgstr "marca los nuevos archivos con `git add --intent-to-add`"
 
-#: apply.c:4993
+#: apply.c:5013
 msgid "apply a patch without touching the working tree"
 msgstr "aplicar un parche sin tocar el árbol de trabajo"
 
-#: apply.c:4995
+#: apply.c:5015
 msgid "accept a patch that touches outside the working area"
 msgstr "aceptar un parche que toca fuera del área de trabajo"
 
-#: apply.c:4998
+#: apply.c:5018
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr "también aplicar el parche ( usar con --stat/--summary/--check"
 
-#: apply.c:5000
+#: apply.c:5020
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "intentar merge de tres-vías si el parche no aplica"
 
-#: apply.c:5002
+#: apply.c:5022
 msgid "build a temporary index based on embedded index information"
 msgstr ""
 "construir un índice temporal basado en la información del índice incrustado"
 
-#: apply.c:5005 builtin/checkout-index.c:173 builtin/ls-files.c:525
+#: apply.c:5025 builtin/checkout-index.c:195 builtin/ls-files.c:540
 msgid "paths are separated with NUL character"
 msgstr "rutas están separadas con un carácter NULL"
 
-#: apply.c:5007
+#: apply.c:5027
 msgid "ensure at least <n> lines of context match"
 msgstr "asegurar que al menos concuerden <n> líneas del contexto concuerden"
 
-#: apply.c:5008 builtin/am.c:2238 builtin/interpret-trailers.c:98
+#: apply.c:5028 builtin/am.c:2245 builtin/interpret-trailers.c:98
 #: builtin/interpret-trailers.c:100 builtin/interpret-trailers.c:102
-#: builtin/pack-objects.c:3530 builtin/rebase.c:1332
+#: builtin/pack-objects.c:3577 builtin/rebase.c:1352
 msgid "action"
 msgstr "acción"
 
-#: apply.c:5009
+#: apply.c:5029
 msgid "detect new or modified lines that have whitespace errors"
 msgstr ""
 "detectar líneas nuevas o modificadas que contienen errores de espacios en "
 "blanco"
 
-#: apply.c:5012 apply.c:5015
+#: apply.c:5032 apply.c:5035
 msgid "ignore changes in whitespace when finding context"
 msgstr ""
 "ignorar cambios en los espacios en blanco cuando se encuentra el contexto"
 
-#: apply.c:5018
+#: apply.c:5038
 msgid "apply the patch in reverse"
 msgstr "aplicar el parche en reversa"
 
-#: apply.c:5020
+#: apply.c:5040
 msgid "don't expect at least one line of context"
 msgstr "no espera al menos una línea del contexto"
 
-#: apply.c:5022
+#: apply.c:5042
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "dejar los hunks rechazados en los archivos *.rej correspontientes"
 
-#: apply.c:5024
+#: apply.c:5044
 msgid "allow overlapping hunks"
 msgstr "permitir solapamiento de hunks"
 
-#: apply.c:5025 builtin/add.c:323 builtin/check-ignore.c:22
-#: builtin/commit.c:1366 builtin/count-objects.c:98 builtin/fsck.c:775
-#: builtin/log.c:2186 builtin/mv.c:123 builtin/read-tree.c:128
+#: apply.c:5045 builtin/add.c:337 builtin/check-ignore.c:22
+#: builtin/commit.c:1364 builtin/count-objects.c:98 builtin/fsck.c:757
+#: builtin/log.c:2286 builtin/mv.c:123 builtin/read-tree.c:128
 msgid "be verbose"
 msgstr "ser verboso"
 
-#: apply.c:5027
+#: apply.c:5047
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr ""
 "tolerar nuevas líneas faltantes detectadas incorrectamente al final del "
 "archivo"
 
-#: apply.c:5030
+#: apply.c:5050
 msgid "do not trust the line counts in the hunk headers"
 msgstr "no confiar en el conteo de líneas en los headers del hunk"
 
-#: apply.c:5032 builtin/am.c:2247
+#: apply.c:5052 builtin/am.c:2254
 msgid "root"
 msgstr "raíz"
 
-#: apply.c:5033
+#: apply.c:5053
 msgid "prepend <root> to all filenames"
 msgstr "anteponer <root> a todos los nombres de archivos"
 
-#: archive-tar.c:125 archive-zip.c:351
+#: archive-tar.c:125 archive-zip.c:345
 #, c-format
 msgid "cannot stream blob %s"
 msgstr "no se puede transmitir el blob %s"
 
-#: archive-tar.c:266 archive-zip.c:369
+#: archive-tar.c:265 archive-zip.c:358
 #, c-format
 msgid "unsupported file mode: 0%o (SHA1: %s)"
 msgstr "modo de archivo no soportado: 0%o (SHA1: %s)"
 
-#: archive-tar.c:293 archive-zip.c:359
-#, c-format
-msgid "cannot read %s"
-msgstr "no se puede leer %s"
-
-#: archive-tar.c:465
+#: archive-tar.c:450
 #, c-format
 msgid "unable to start '%s' filter"
 msgstr "no se puede comenzar filtro '%s'"
 
-#: archive-tar.c:468
+#: archive-tar.c:453
 msgid "unable to redirect descriptor"
 msgstr "incapaz de redirigir descriptor"
 
-#: archive-tar.c:475
+#: archive-tar.c:460
 #, c-format
 msgid "'%s' filter reported error"
 msgstr "filtro '%s' reportó un error"
 
-#: archive-zip.c:319
+#: archive-zip.c:318
 #, c-format
 msgid "path is not valid UTF-8: %s"
 msgstr "ruta no válida UTF-8: %s"
 
-#: archive-zip.c:323
+#: archive-zip.c:322
 #, c-format
 msgid "path too long (%d chars, SHA1: %s): %s"
 msgstr "ruta muy larga (%d chars, SHA1: %s): %s"
 
-#: archive-zip.c:480 builtin/pack-objects.c:243 builtin/pack-objects.c:246
+#: archive-zip.c:469 builtin/pack-objects.c:244 builtin/pack-objects.c:247
 #, c-format
 msgid "deflate error (%d)"
 msgstr "error al desinflar (%d)"
 
-#: archive-zip.c:615
+#: archive-zip.c:603
 #, c-format
 msgid "timestamp too large for this system: %<PRIuMAX>"
 msgstr "timestamp muy largo para este sistema: %<PRIuMAX>"
@@ -1563,134 +1559,156 @@
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <repo> [--exec <comando>] --list"
 
-#: archive.c:377 builtin/add.c:181 builtin/add.c:588 builtin/rm.c:315
+#: archive.c:192
+#, c-format
+msgid "cannot read %s"
+msgstr "no se puede leer %s"
+
+#: archive.c:345 sequencer.c:459 sequencer.c:1744 sequencer.c:2894
+#: sequencer.c:3335 sequencer.c:3444 builtin/am.c:249 builtin/commit.c:786
+#: builtin/merge.c:1139
+#, c-format
+msgid "could not read '%s'"
+msgstr "no se pudo leer '%s'"
+
+#: archive.c:430 builtin/add.c:189 builtin/add.c:602 builtin/rm.c:315
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "ruta especificada '%s' no concordó con ninguna carpeta"
 
-#: archive.c:401
+#: archive.c:454
 #, c-format
 msgid "no such ref: %.*s"
 msgstr "no existe el ref: %.*s"
 
-#: archive.c:407
+#: archive.c:460
 #, c-format
 msgid "not a valid object name: %s"
 msgstr "nombre de objeto no válido: %s"
 
-#: archive.c:420
+#: archive.c:473
 #, c-format
 msgid "not a tree object: %s"
 msgstr "no es un objeto tree: %s"
 
-#: archive.c:432
+#: archive.c:485
 msgid "current working directory is untracked"
 msgstr "directorio de trabajo actual no rastreado"
 
-#: archive.c:464
+#: archive.c:526
+#, c-format
+msgid "File not found: %s"
+msgstr "Archivo no encontrado: %s"
+
+#: archive.c:528
+#, c-format
+msgid "Not a regular file: %s"
+msgstr "No es un archivo regular: %s"
+
+#: archive.c:555
 msgid "fmt"
 msgstr "fmt"
 
-#: archive.c:464
+#: archive.c:555
 msgid "archive format"
 msgstr "formato del archivo"
 
-#: archive.c:465 builtin/log.c:1674
+#: archive.c:556 builtin/log.c:1764
 msgid "prefix"
 msgstr "prefijo"
 
-#: archive.c:466
+#: archive.c:557
 msgid "prepend prefix to each pathname in the archive"
 msgstr "anteponer prefijo a cada ruta en el archivo"
 
-#: archive.c:467 builtin/blame.c:861 builtin/blame.c:865 builtin/blame.c:866
-#: builtin/commit-tree.c:117 builtin/config.c:130 builtin/fast-export.c:1208
-#: builtin/fast-export.c:1210 builtin/fast-export.c:1214 builtin/grep.c:907
-#: builtin/hash-object.c:105 builtin/ls-files.c:561 builtin/ls-files.c:564
-#: builtin/notes.c:412 builtin/notes.c:578 builtin/read-tree.c:123
-#: parse-options.h:190
+#: archive.c:558 archive.c:561 builtin/blame.c:884 builtin/blame.c:888
+#: builtin/blame.c:889 builtin/commit-tree.c:117 builtin/config.c:135
+#: builtin/fast-export.c:1207 builtin/fast-export.c:1209
+#: builtin/fast-export.c:1213 builtin/grep.c:920 builtin/hash-object.c:105
+#: builtin/ls-files.c:576 builtin/ls-files.c:579 builtin/notes.c:412
+#: builtin/notes.c:578 builtin/read-tree.c:123 parse-options.h:190
 msgid "file"
 msgstr "carpeta"
 
-#: archive.c:468 builtin/archive.c:90
+#: archive.c:559
+msgid "add untracked file to archive"
+msgstr "incluir archivos sin seguimiento al archivo"
+
+#: archive.c:562 builtin/archive.c:90
 msgid "write the archive to this file"
 msgstr "escribe el archivo en esta carpeta"
 
-#: archive.c:470
+#: archive.c:564
 msgid "read .gitattributes in working directory"
 msgstr "leer .gitattributes en el directorio de trabajo"
 
-#: archive.c:471
+#: archive.c:565
 msgid "report archived files on stderr"
 msgstr "reportar archivos archivados por stderr"
 
-#: archive.c:472
-msgid "store only"
-msgstr "solo guardar"
+#: archive.c:567
+msgid "set compression level"
+msgstr "configurar nivel de compresión"
 
-#: archive.c:473
-msgid "compress faster"
-msgstr "comprimir más rápido"
-
-#: archive.c:481
-msgid "compress better"
-msgstr "comprimir mejor"
-
-#: archive.c:484
+#: archive.c:570
 msgid "list supported archive formats"
 msgstr "listar los formatos de carpeta soportados"
 
-#: archive.c:486 builtin/archive.c:91 builtin/clone.c:113 builtin/clone.c:116
-#: builtin/submodule--helper.c:1406 builtin/submodule--helper.c:1911
+#: archive.c:572 builtin/archive.c:91 builtin/clone.c:114 builtin/clone.c:117
+#: builtin/submodule--helper.c:1830 builtin/submodule--helper.c:2335
 msgid "repo"
 msgstr "repo"
 
-#: archive.c:487 builtin/archive.c:92
+#: archive.c:573 builtin/archive.c:92
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "obtener la carpeta del repositorio remoto <repo>"
 
-#: archive.c:488 builtin/archive.c:93 builtin/difftool.c:715
+#: archive.c:574 builtin/archive.c:93 builtin/difftool.c:714
 #: builtin/notes.c:498
 msgid "command"
 msgstr "comando"
 
-#: archive.c:489 builtin/archive.c:94
+#: archive.c:575 builtin/archive.c:94
 msgid "path to the remote git-upload-archive command"
 msgstr "ruta para el comando git-upload-archivo remoto"
 
-#: archive.c:496
+#: archive.c:582
 msgid "Unexpected option --remote"
 msgstr "Opción inesperada --remote"
 
-#: archive.c:498
+#: archive.c:584
 msgid "Option --exec can only be used together with --remote"
 msgstr "Opción --exec solo puede ser utilizada con --remote"
 
-#: archive.c:500
+#: archive.c:586
 msgid "Unexpected option --output"
 msgstr "Opción inesperada --output"
 
-#: archive.c:522
+#: archive.c:588
+msgid "Options --add-file and --remote cannot be used together"
+msgstr "Opciones --add-file y --remote no pueden ser usadas juntas"
+
+#: archive.c:610
 #, c-format
 msgid "Unknown archive format '%s'"
 msgstr "Formato de carpeta desconocido '%s'"
 
-#: archive.c:529
+#: archive.c:619
 #, c-format
 msgid "Argument not supported for format '%s': -%d"
 msgstr "Argumento no soportado para formato '%s': -%d"
 
-#: attr.c:212
+#: attr.c:202
 #, c-format
 msgid "%.*s is not a valid attribute name"
 msgstr "%.*s no es un nombre de atributo válido"
 
-#: attr.c:369
+#: attr.c:359
 #, c-format
 msgid "%s not allowed: %s:%d"
 msgstr "%s no permitido: %s:%d"
 
-#: attr.c:409
+#: attr.c:399
 msgid ""
 "Negative patterns are ignored in git attributes\n"
 "Use '\\!' for literal leading exclamation."
@@ -1698,22 +1716,22 @@
 "Los patrones negativos son ignorados en los atributos de git\n"
 "Usa '\\!' para comenzar literalmente con exclamación."
 
-#: bisect.c:468
+#: bisect.c:489
 #, c-format
 msgid "Badly quoted content in file '%s': %s"
 msgstr "Revisa las comillas en el archivo '%s': %s"
 
-#: bisect.c:678
+#: bisect.c:699
 #, c-format
 msgid "We cannot bisect more!\n"
 msgstr "¡No podemos biseccionar más!\n"
 
-#: bisect.c:745
+#: bisect.c:766
 #, c-format
 msgid "Not a valid commit name %s"
 msgstr "No es un nombre de commit válido %s"
 
-#: bisect.c:770
+#: bisect.c:791
 #, c-format
 msgid ""
 "The merge base %s is bad.\n"
@@ -1722,7 +1740,7 @@
 "La base de fisión %s está mal.\n"
 "Esto quiere decir que el bug ha sido arreglado entre %s y [%s].\n"
 
-#: bisect.c:775
+#: bisect.c:796
 #, c-format
 msgid ""
 "The merge base %s is new.\n"
@@ -1731,7 +1749,7 @@
 "La base de fisión %s es nueva.\n"
 "Esta propiedad ha cambiado entre %s y [%s].\n"
 
-#: bisect.c:780
+#: bisect.c:801
 #, c-format
 msgid ""
 "The merge base %s is %s.\n"
@@ -1740,7 +1758,7 @@
 "La base de fisión %s es %s.\n"
 "Esto quiere decir que el primer '%s' commit está entre %s y [%s].\n"
 
-#: bisect.c:788
+#: bisect.c:809
 #, c-format
 msgid ""
 "Some %s revs are not ancestors of the %s rev.\n"
@@ -1751,7 +1769,7 @@
 "git bisect no puede trabajar bien en este caso.\n"
 "¿Tal vez confundiste la revisión %s y %s?\n"
 
-#: bisect.c:801
+#: bisect.c:822
 #, c-format
 msgid ""
 "the merge base between %s and [%s] must be skipped.\n"
@@ -1762,45 +1780,45 @@
 "Así que no podemos estar seguros que el primer %s commit está entre%s y %s.\n"
 "Vamos a continuar de todas maneras."
 
-#: bisect.c:840
+#: bisect.c:861
 #, c-format
 msgid "Bisecting: a merge base must be tested\n"
 msgstr "Biseccionando: una base de fisión debe ser probada\n"
 
-#: bisect.c:890
+#: bisect.c:911
 #, c-format
 msgid "a %s revision is needed"
 msgstr "una %s revisión es necesaria"
 
-#: bisect.c:920 builtin/notes.c:177 builtin/tag.c:255
+#: bisect.c:941 builtin/notes.c:177 builtin/tag.c:287
 #, c-format
 msgid "could not create file '%s'"
 msgstr "no se pudo crear el archivo '%s'"
 
-#: bisect.c:966 builtin/merge.c:151
+#: bisect.c:987 builtin/merge.c:153
 #, c-format
 msgid "could not read file '%s'"
 msgstr "no se pudo leer el archivo '%s'"
 
-#: bisect.c:997
+#: bisect.c:1027
 msgid "reading bisect refs failed"
 msgstr "falló leer las refs de bisect"
 
-#: bisect.c:1019
+#: bisect.c:1057
 #, c-format
 msgid "%s was both %s and %s\n"
 msgstr "%s fue tanto %s como %s\n"
 
-#: bisect.c:1028
+#: bisect.c:1066
 #, c-format
 msgid ""
 "No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
+"Maybe you started with bad path arguments?\n"
 msgstr ""
 "No se encontró commit que se pueda probar.\n"
 "¿Quizás iniciaste con parámetros de rutas incorrectos?\n"
 
-#: bisect.c:1057
+#: bisect.c:1095
 #, c-format
 msgid "(roughly %d step)"
 msgid_plural "(roughly %d steps)"
@@ -1810,7 +1828,7 @@
 #. TRANSLATORS: the last %s will be replaced with "(roughly %d
 #. steps)" translation.
 #.
-#: bisect.c:1063
+#: bisect.c:1101
 #, 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"
@@ -1830,11 +1848,11 @@
 msgstr ""
 "--reverse y --first-parent juntos requieren especificar el último commit"
 
-#: blame.c:2821 bundle.c:187 ref-filter.c:2200 remote.c:1924 sequencer.c:2018
-#: sequencer.c:4466 submodule.c:847 builtin/commit.c:1047 builtin/log.c:405
-#: builtin/log.c:1012 builtin/log.c:1541 builtin/log.c:1945 builtin/log.c:2235
-#: builtin/merge.c:415 builtin/pack-objects.c:3348 builtin/pack-objects.c:3363
-#: builtin/shortlog.c:192
+#: blame.c:2821 bundle.c:213 ref-filter.c:2206 remote.c:2041 sequencer.c:2146
+#: sequencer.c:4641 submodule.c:856 builtin/commit.c:1045 builtin/log.c:411
+#: builtin/log.c:1016 builtin/log.c:1624 builtin/log.c:2045 builtin/log.c:2335
+#: builtin/merge.c:424 builtin/pack-objects.c:3395 builtin/pack-objects.c:3410
+#: builtin/shortlog.c:255
 msgid "revision walk setup failed"
 msgstr "falló la configuración del camino de revisión"
 
@@ -2004,366 +2022,384 @@
 msgid "HEAD of working tree %s is not updated"
 msgstr "HEAD del árbol de trabajo %s no está actualizada"
 
-#: bundle.c:47
+#: bundle.c:41
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' no se ve como un archivo bundle v2"
+msgid "unrecognized bundle hash algorithm: %s"
+msgstr "algoritmo bundle hash desconocido %s"
 
-#: bundle.c:69
-msgid "unknown hash algorithm length"
-msgstr "largo del algoritmo hash desconocido"
+#: bundle.c:45
+#, c-format
+msgid "unknown capability '%s'"
+msgstr "capacidad desconocida '%s'"
 
-#: bundle.c:84
+#: bundle.c:71
+#, c-format
+msgid "'%s' does not look like a v2 or v3 bundle file"
+msgstr "'%s' no se ve como un archivo bundle v2 o v3"
+
+#: bundle.c:110
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr "header no reconocido %s%s (%d)"
 
-#: bundle.c:110 rerere.c:480 rerere.c:690 sequencer.c:2270 sequencer.c:3034
+#: bundle.c:136 rerere.c:464 rerere.c:674 sequencer.c:2398 sequencer.c:3184
 #: builtin/commit.c:814
 #, c-format
 msgid "could not open '%s'"
 msgstr "no se pudo abrir '%s'"
 
-#: bundle.c:163
+#: bundle.c:189
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Al repositorio le falta estos commits prerrequisito:"
 
-#: bundle.c:166
+#: bundle.c:192
 msgid "need a repository to verify a bundle"
 msgstr "se necesita un repositorio para verificar un bundle"
 
-#: bundle.c:217
+#: bundle.c:243
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
 msgstr[0] "El bundle contiene esta referencia:"
 msgstr[1] "El bundle contiene estas %d referencias:"
 
-#: bundle.c:224
+#: bundle.c:250
 msgid "The bundle records a complete history."
 msgstr "El bundle registra una historia completa."
 
-#: bundle.c:226
+#: bundle.c:252
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
 msgstr[0] "El bundle requiere esta referencia:"
 msgstr[1] "El bundle requiere estas %d referencias:"
 
-#: bundle.c:293
+#: bundle.c:319
 msgid "unable to dup bundle descriptor"
 msgstr "incapaz de duplicar bundle descriptor"
 
-#: bundle.c:300
+#: bundle.c:326
 msgid "Could not spawn pack-objects"
 msgstr "No se pudo crear los pack-objetcts"
 
-#: bundle.c:311
+#: bundle.c:337
 msgid "pack-objects died"
 msgstr "pack-objects murió"
 
-#: bundle.c:353
-msgid "rev-list died"
-msgstr "rev-list murió"
-
-#: bundle.c:402
+#: bundle.c:386
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "referencia '%s' es excluida por las opciones de rev-list"
 
-#: bundle.c:481 builtin/log.c:208 builtin/log.c:1834 builtin/shortlog.c:306
+#: bundle.c:490
+#, c-format
+msgid "unsupported bundle version %d"
+msgstr "versión de bundle no soportada %d"
+
+#: bundle.c:492
+#, c-format
+msgid "cannot write bundle version %d with algorithm %s"
+msgstr "no se puede escribir la versión de paquete %d con el algoritmo %s"
+
+#: bundle.c:510 builtin/log.c:210 builtin/log.c:1926 builtin/shortlog.c:396
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "argumento no reconocido: %s"
 
-#: bundle.c:489
+#: bundle.c:539
 msgid "Refusing to create empty bundle."
 msgstr "Rechazando crear un bundle vacío."
 
-#: bundle.c:499
+#: bundle.c:549
 #, c-format
 msgid "cannot create '%s'"
 msgstr "no se puede crear '%s'"
 
-#: bundle.c:524
+#: bundle.c:574
 msgid "index-pack died"
 msgstr "index-pack murió"
 
+#: chunk-format.c:113
+msgid "terminating chunk id appears earlier than expected"
+msgstr "terminando porque el id del chunk aparece antes de lo esperado"
+
+#: chunk-format.c:122
+#, c-format
+msgid "improper chunk offset(s) %<PRIx64> and %<PRIx64>"
+msgstr "offset para chunk incorrecto %<PRIx64> y %<PRIx64>"
+
+#: chunk-format.c:129
+#, c-format
+msgid "duplicate chunk ID %<PRIx32> found"
+msgstr "se encontró ID de chuck %<PRIx32> duplicado"
+
+#: chunk-format.c:143
+#, c-format
+msgid "final chunk has non-zero id %<PRIx32>"
+msgstr "chunk final tiene un id distinto de cero %<PRIx32>"
+
 #: color.c:329
 #, c-format
 msgid "invalid color value: %.*s"
 msgstr "color inválido: %.*s"
 
-#: commit-graph.c:238
+#: commit-graph.c:197 midx.c:46
+msgid "invalid hash version"
+msgstr "versión de hash inválida"
+
+#: commit-graph.c:255
 msgid "commit-graph file is too small"
 msgstr "archivo commit-graph es muy pequeño"
 
-#: commit-graph.c:303
+#: commit-graph.c:348
 #, c-format
 msgid "commit-graph signature %X does not match signature %X"
 msgstr "firma %X en commit-graph no concuerda con firma %X"
 
-#: commit-graph.c:310
+#: commit-graph.c:355
 #, c-format
 msgid "commit-graph version %X does not match version %X"
 msgstr "versión de commit-graph %X no concuerda con versión %X"
 
-#: commit-graph.c:317
+#: commit-graph.c:362
 #, c-format
 msgid "commit-graph hash version %X does not match version %X"
 msgstr "versión de hash de commit-graph %X no concuerda con versión %X"
 
-#: commit-graph.c:339
-msgid "commit-graph chunk lookup table entry missing; file may be incomplete"
-msgstr ""
-"falta tabla de lookup del chunk en commit-graph; el archivo puede estar "
-"incompleto"
-
-#: commit-graph.c:349
+#: commit-graph.c:379
 #, c-format
-msgid "commit-graph improper chunk offset %08x%08x"
-msgstr "offset del chunk de commit-graph inapropiado %08x%08x"
+msgid "commit-graph file is too small to hold %u chunks"
+msgstr "commit-graph file es demasiado pequeño para almacenar %u chunks"
 
-#: commit-graph.c:417
-#, c-format
-msgid "commit-graph chunk id %08x appears multiple times"
-msgstr "id de chunk de commit-graph %08x parece tener múltiples tiempos"
-
-#: commit-graph.c:491
+#: commit-graph.c:472
 msgid "commit-graph has no base graphs chunk"
 msgstr "commit-graph no tiene una chunk base de graphs"
 
-#: commit-graph.c:501
+#: commit-graph.c:482
 msgid "commit-graph chain does not match"
 msgstr "cadena commit-graph no concuerda"
 
-#: commit-graph.c:549
+#: commit-graph.c:530
 #, c-format
 msgid "invalid commit-graph chain: line '%s' not a hash"
 msgstr "cadena de commit-graph inválida: línea '%s' no es un hash"
 
-#: commit-graph.c:573
+#: commit-graph.c:554
 msgid "unable to find all commit-graph files"
 msgstr "no es posible encontrar los archivos commit-graph"
 
-#: commit-graph.c:706 commit-graph.c:770
+#: commit-graph.c:735 commit-graph.c:772
 msgid "invalid commit position. commit-graph is likely corrupt"
 msgstr "posición de commit inválida. commit-graph está probablemente corrupto"
 
-#: commit-graph.c:727
+#: commit-graph.c:756
 #, c-format
 msgid "could not find commit %s"
 msgstr "no se pudo encontrar commit %s"
 
-#: commit-graph.c:1009 builtin/am.c:1292
+#: commit-graph.c:789
+msgid "commit-graph requires overflow generation data but has none"
+msgstr ""
+"commit-graph requiere datos de generación de desbordamiento pero no tiene "
+"ninguno"
+
+#: commit-graph.c:1065 builtin/am.c:1292
 #, c-format
 msgid "unable to parse commit %s"
 msgstr "no es posible analizar el commit %s"
 
-#: commit-graph.c:1157
-msgid "Writing changed paths Bloom filters index"
-msgstr "Escribiendo cambios de ruta del índice de filtros Bloom"
-
-#: commit-graph.c:1182
-msgid "Writing changed paths Bloom filters data"
-msgstr "Escribiendo cambios de ruta de datos de filtros Bloom"
-
-#: commit-graph.c:1221 builtin/pack-objects.c:2832
+#: commit-graph.c:1327 builtin/pack-objects.c:2872
 #, c-format
 msgid "unable to get type of object %s"
 msgstr "incapaz de obtener el tipo de objeto: %s"
 
-#: commit-graph.c:1257
+#: commit-graph.c:1358
 msgid "Loading known commits in commit graph"
 msgstr "Cargando commits conocidos en commit graph"
 
-#: commit-graph.c:1274
+#: commit-graph.c:1375
 msgid "Expanding reachable commits in commit graph"
 msgstr "Expandiendo commits alcanzables en commit graph"
 
-#: commit-graph.c:1294
+#: commit-graph.c:1395
 msgid "Clearing commit marks in commit graph"
 msgstr "Limpiando marcas de commits en commit graph"
 
-#: commit-graph.c:1313
+#: commit-graph.c:1414
+msgid "Computing commit graph topological levels"
+msgstr "Calculando niveles topológicos de commit graph"
+
+#: commit-graph.c:1467
 msgid "Computing commit graph generation numbers"
 msgstr "Calculando números de generación de commit graph"
 
-#: commit-graph.c:1367
+#: commit-graph.c:1548
 msgid "Computing commit changed paths Bloom filters"
 msgstr "Calculando números de generación de commit graph"
 
-#: commit-graph.c:1423
+#: commit-graph.c:1625
 msgid "Collecting referenced commits"
 msgstr "Recolectando commits referenciados"
 
-#: commit-graph.c:1447
+#: commit-graph.c:1650
 #, c-format
 msgid "Finding commits for commit graph in %d pack"
 msgid_plural "Finding commits for commit graph in %d packs"
 msgstr[0] "Encontrando commits para commit graph en %d pack"
 msgstr[1] "Encontrando commits para commit graph en %d packs"
 
-#: commit-graph.c:1460
+#: commit-graph.c:1663
 #, c-format
 msgid "error adding pack %s"
 msgstr "error agregando pack %s"
 
-#: commit-graph.c:1464
+#: commit-graph.c:1667
 #, c-format
 msgid "error opening index for %s"
 msgstr "error abriendo index para %s"
 
-#: commit-graph.c:1503
+#: commit-graph.c:1704
 msgid "Finding commits for commit graph among packed objects"
 msgstr "Encontrando commits para commit graph entre los objetos empaquetados"
 
-#: commit-graph.c:1518
-msgid "Counting distinct commits in commit graph"
-msgstr "Contando commits distintos en commit graph"
-
-#: commit-graph.c:1550
+#: commit-graph.c:1722
 msgid "Finding extra edges in commit graph"
 msgstr "Encontrando esquinas extra en commit graph"
 
-#: commit-graph.c:1599
+#: commit-graph.c:1771
 msgid "failed to write correct number of base graph ids"
 msgstr "falló al escribir el número correcto de ids de base graph"
 
-#: commit-graph.c:1633 midx.c:812
+#: commit-graph.c:1802 midx.c:794
 #, c-format
 msgid "unable to create leading directories of %s"
 msgstr "no se pudo crear directorios principales para %s"
 
-#: commit-graph.c:1646
+#: commit-graph.c:1815
 msgid "unable to create temporary graph layer"
 msgstr "no es posible crear un una capa de gráfico temporal"
 
-#: commit-graph.c:1651
+#: commit-graph.c:1820
 #, c-format
 msgid "unable to adjust shared permissions for '%s'"
 msgstr "no se pudo poner permisos a '%s'"
 
-#: commit-graph.c:1728
+#: commit-graph.c:1879
 #, c-format
 msgid "Writing out commit graph in %d pass"
 msgid_plural "Writing out commit graph in %d passes"
 msgstr[0] "Escribiendo commit graph en %d paso"
 msgstr[1] "Escribiendo commit graph en %d pasos"
 
-#: commit-graph.c:1773
+#: commit-graph.c:1915
 msgid "unable to open commit-graph chain file"
 msgstr "no se pudo abrir la cadena de archivos commit-graph"
 
-#: commit-graph.c:1789
+#: commit-graph.c:1931
 msgid "failed to rename base commit-graph file"
 msgstr "no se pudo renombrar el archivo base commit-graph"
 
-#: commit-graph.c:1809
+#: commit-graph.c:1951
 msgid "failed to rename temporary commit-graph file"
 msgstr "falló al renombrar el archivo temporal commit-graph"
 
-#: commit-graph.c:1935
+#: commit-graph.c:2084
 msgid "Scanning merged commits"
 msgstr "Escaneando commits fusionados"
 
-#: commit-graph.c:1946
-#, c-format
-msgid "unexpected duplicate commit id %s"
-msgstr "id de commit duplicado inesperado %s"
-
-#: commit-graph.c:1969
+#: commit-graph.c:2128
 msgid "Merging commit-graph"
 msgstr "Fusionando commit-graph"
 
-#: commit-graph.c:2156
-#, c-format
-msgid "the commit graph format cannot write %d commits"
-msgstr "el formato de gráficos de commit no pudede escribir %d commits"
+#: commit-graph.c:2235
+msgid "attempting to write a commit-graph, but 'core.commitGraph' is disabled"
+msgstr ""
+"intentando escribir un commit-graph, pero 'core.commitGraph' está "
+"deshabilitado"
 
-#: commit-graph.c:2167
+#: commit-graph.c:2342
 msgid "too many commits to write graph"
 msgstr "demasiados commits para escribir el gráfico"
 
-#: commit-graph.c:2260
+#: commit-graph.c:2440
 msgid "the commit-graph file has incorrect checksum and is likely corrupt"
 msgstr ""
 "el archivo de commit-graph tiene checksums incorrectos y probablemente está "
 "corrupto"
 
-#: commit-graph.c:2270
+#: commit-graph.c:2450
 #, c-format
 msgid "commit-graph has incorrect OID order: %s then %s"
 msgstr "commit-graph tiene un orden de OID incorrecto: %s luego %s"
 
-#: commit-graph.c:2280 commit-graph.c:2295
+#: commit-graph.c:2460 commit-graph.c:2475
 #, c-format
 msgid "commit-graph has incorrect fanout value: fanout[%d] = %u != %u"
 msgstr "commit-graph tiene un valor fanout incorrecto: fanout[%d] = %u != %u"
 
-#: commit-graph.c:2287
+#: commit-graph.c:2467
 #, c-format
 msgid "failed to parse commit %s from commit-graph"
 msgstr "falló al analizar commit %s para commit-graph"
 
-#: commit-graph.c:2305
+#: commit-graph.c:2485
 msgid "Verifying commits in commit graph"
 msgstr "Verificando commits en commit graph"
 
-#: commit-graph.c:2320
+#: commit-graph.c:2500
 #, c-format
 msgid "failed to parse commit %s from object database for commit-graph"
 msgstr ""
 "falló al analizar el commit %s de la base de datos de objetos para commit-"
 "graph"
 
-#: commit-graph.c:2327
+#: commit-graph.c:2507
 #, c-format
 msgid "root tree OID for commit %s in commit-graph is %s != %s"
 msgstr "árbol raíz OID para commit %s en commit-graph es %s != %s"
 
-#: commit-graph.c:2337
+#: commit-graph.c:2517
 #, c-format
 msgid "commit-graph parent list for commit %s is too long"
 msgstr "lista padre de commit-graph para commit %s es muy larga"
 
-#: commit-graph.c:2346
+#: commit-graph.c:2526
 #, c-format
 msgid "commit-graph parent for %s is %s != %s"
 msgstr "padre de commit-graph para %s es %s != %s"
 
-#: commit-graph.c:2360
+#: commit-graph.c:2540
 #, c-format
 msgid "commit-graph parent list for commit %s terminates early"
 msgstr "lista padre de commit-graph para commit %s termina antes"
 
-#: commit-graph.c:2365
+#: commit-graph.c:2545
 #, c-format
 msgid ""
 "commit-graph has generation number zero for commit %s, but non-zero elsewhere"
 msgstr ""
 "commit-graph ha generado número cero para %s, pero no-cero para los demás"
 
-#: commit-graph.c:2369
+#: commit-graph.c:2549
 #, c-format
 msgid ""
 "commit-graph has non-zero generation number for commit %s, but zero elsewhere"
 msgstr ""
 "commit-graph tiene generación no-cero para %s, pero cero para los demás"
 
-#: commit-graph.c:2385
+#: commit-graph.c:2566
 #, c-format
-msgid "commit-graph generation for commit %s is %u != %u"
-msgstr "generación commit-graph para commit %s es %u != %u"
+msgid "commit-graph generation for commit %s is %<PRIuMAX> < %<PRIuMAX>"
+msgstr "generación commit-graph para commit %s es %<PRIuMAX> < %<PRIuMAX>"
 
-#: commit-graph.c:2391
+#: commit-graph.c:2572
 #, c-format
 msgid "commit date for commit %s in commit-graph is %<PRIuMAX> != %<PRIuMAX>"
 msgstr ""
 "fecha de commit para commit %s en commit-graph es %<PRIuMAX> != %<PRIuMAX>"
 
-#: commit.c:52 sequencer.c:2739 builtin/am.c:359 builtin/am.c:403
-#: builtin/am.c:1371 builtin/am.c:2013 builtin/replace.c:457
+#: commit.c:52 sequencer.c:2887 builtin/am.c:359 builtin/am.c:403
+#: builtin/am.c:1371 builtin/am.c:2018 builtin/replace.c:457
 #, c-format
 msgid "could not parse %s"
 msgstr "no se puede analizar %s"
@@ -2393,27 +2429,27 @@
 "Apapa este mensaje ejecutando\n"
 "\"git config advice.graftFileDeprecated false\""
 
-#: commit.c:1172
+#: commit.c:1223
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "Commit %s tiene una firma GPG no confiable, pretendidamente por %s."
 
-#: commit.c:1176
+#: commit.c:1227
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "Commit %s tiene una mala firma GPG pretendidamente por %s."
 
-#: commit.c:1179
+#: commit.c:1230
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Commit %s no tiene una firma GPG."
 
-#: commit.c:1182
+#: commit.c:1233
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "El Commit %s tiene una buena firma GPG por %s\n"
 
-#: commit.c:1436
+#: commit.c:1487
 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"
@@ -2428,7 +2464,7 @@
 msgid "memory exhausted"
 msgstr "memoria agotada"
 
-#: config.c:125
+#: config.c:126
 #, c-format
 msgid ""
 "exceeded maximum include depth (%d) while including\n"
@@ -2443,293 +2479,337 @@
 "\t%s\n"
 "Esto puede ser causado por inclusiones circulares."
 
-#: config.c:141
+#: config.c:142
 #, c-format
 msgid "could not expand include path '%s'"
 msgstr "no se pudo expandir rutas de inclusión '%s'"
 
-#: config.c:152
+#: config.c:153
 msgid "relative config includes must come from files"
 msgstr "inclusiones de configuración relativas tienen que venir de archivos"
 
-#: config.c:198
+#: config.c:199
 msgid "relative config include conditionals must come from files"
 msgstr ""
 "la configuración relativa incluye condicionales que deben venir de archivos"
 
-#: config.c:378
+#: config.c:396
+#, c-format
+msgid "invalid config format: %s"
+msgstr "formato config inválido: %s"
+
+#: config.c:400
+#, c-format
+msgid "missing environment variable name for configuration '%.*s'"
+msgstr "falta el nombre de la variable de entorno para la configuración '%.*s'"
+
+#: config.c:405
+#, c-format
+msgid "missing environment variable '%s' for configuration '%.*s'"
+msgstr "Falta la variable de entorno '%s' para la configuración '%.*s'"
+
+#: config.c:442
 #, c-format
 msgid "key does not contain a section: %s"
 msgstr "llave no contiene una sección: %s"
 
-#: config.c:384
+#: config.c:448
 #, c-format
 msgid "key does not contain variable name: %s"
 msgstr "llave no contiene el nombre de variable: %s"
 
-#: config.c:408 sequencer.c:2456
+#: config.c:472 sequencer.c:2588
 #, c-format
 msgid "invalid key: %s"
 msgstr "llave inválida: %s"
 
-#: config.c:414
+#: config.c:478
 #, c-format
 msgid "invalid key (newline): %s"
 msgstr "llave inválida (nueva línea): %s"
 
-#: config.c:450 config.c:462
+#: config.c:511
+msgid "empty config key"
+msgstr "clave de config vacía"
+
+#: config.c:529 config.c:541
 #, c-format
 msgid "bogus config parameter: %s"
 msgstr "parámetro de configuración malogrado: %s"
 
-#: config.c:497
+#: config.c:555 config.c:572 config.c:579 config.c:588
 #, c-format
 msgid "bogus format in %s"
 msgstr "formato malogrado en %s"
 
-#: config.c:836
+#: config.c:622
+#, c-format
+msgid "bogus count in %s"
+msgstr "conteo malogrado en %s"
+
+#: config.c:626
+#, c-format
+msgid "too many entries in %s"
+msgstr "demasiadas entradas en %s"
+
+#: config.c:636
+#, c-format
+msgid "missing config key %s"
+msgstr "llave de configuración faltante %s"
+
+#: config.c:644
+#, c-format
+msgid "missing config value %s"
+msgstr "valor de config faltante para %s"
+
+#: config.c:995
 #, c-format
 msgid "bad config line %d in blob %s"
 msgstr "mala línea de config %d en el blob %s"
 
-#: config.c:840
+#: config.c:999
 #, c-format
 msgid "bad config line %d in file %s"
 msgstr "mala línea de config %d en el archivo %s"
 
-#: config.c:844
+#: config.c:1003
 #, c-format
 msgid "bad config line %d in standard input"
 msgstr "mala línea de config %d en la entrada standard"
 
-#: config.c:848
+#: config.c:1007
 #, c-format
 msgid "bad config line %d in submodule-blob %s"
 msgstr "mala línea de config %d en el submódulo-blob %s"
 
-#: config.c:852
+#: config.c:1011
 #, c-format
 msgid "bad config line %d in command line %s"
 msgstr "mala línea de config %d en la línea de comando %s"
 
-#: config.c:856
+#: config.c:1015
 #, c-format
 msgid "bad config line %d in %s"
 msgstr "mala línea de config %d en %s"
 
-#: config.c:993
+#: config.c:1152
 msgid "out of range"
 msgstr "fuera de rango"
 
-#: config.c:993
+#: config.c:1152
 msgid "invalid unit"
 msgstr "unidad inválida"
 
-#: config.c:994
+#: config.c:1153
 #, c-format
 msgid "bad numeric config value '%s' for '%s': %s"
 msgstr "mal valor de config numérica '%s' para '%s': %s"
 
-#: config.c:1013
+#: config.c:1163
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
 msgstr "mal valor de config numérica '%s' para '%s' en el blob %s: %s"
 
-#: config.c:1016
+#: config.c:1166
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in file %s: %s"
 msgstr "mal valor de config numérica '%s' para '%s' en el archivo %s: %s"
 
-#: config.c:1019
+#: config.c:1169
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in standard input: %s"
 msgstr "mal valor de config numérica '%s' para '%s' en la entrada standard: %s"
 
-#: config.c:1022
+#: config.c:1172
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
 msgstr ""
 "mal valor de config numérica '%s' para '%s' en el submódulo-blob %s: %s"
 
-#: config.c:1025
+#: config.c:1175
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
 msgstr ""
 "mal valor de config numérica '%s' para '%s' en la línea de comando %s: %s"
 
-#: config.c:1028
+#: config.c:1178
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in %s: %s"
 msgstr "mal valor de config numérica '%s' para '%s' en %s: %s"
 
-#: config.c:1123
+#: config.c:1194
+#, c-format
+msgid "bad boolean config value '%s' for '%s'"
+msgstr "mal valor de config booleana '%s' para '%s'"
+
+#: config.c:1289
 #, c-format
 msgid "failed to expand user dir in: '%s'"
 msgstr "falló al expandir el directorio de usuario en: '%s'"
 
-#: config.c:1132
+#: config.c:1298
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
 msgstr "'%s' para '%s' no es una marca de tiempo válida"
 
-#: config.c:1223
+#: config.c:1391
 #, c-format
 msgid "abbrev length out of range: %d"
 msgstr "largo de abreviatura fuera de rango: %d"
 
-#: config.c:1237 config.c:1248
+#: config.c:1405 config.c:1416
 #, c-format
 msgid "bad zlib compression level %d"
 msgstr "nivel de compresión de zlib erróneo %d"
 
-#: config.c:1340
+#: config.c:1508
 msgid "core.commentChar should only be one character"
 msgstr "core.commentChar debería tener solo un caracter"
 
-#: config.c:1373
+#: config.c:1541
 #, c-format
 msgid "invalid mode for object creation: %s"
 msgstr "modo inválido de creación de objetos: %s"
 
-#: config.c:1445
+#: config.c:1613
 #, c-format
 msgid "malformed value for %s"
 msgstr "valor malformado para %s"
 
-#: config.c:1471
+#: config.c:1639
 #, c-format
 msgid "malformed value for %s: %s"
 msgstr "valor malformado para %s: %s"
 
-#: config.c:1472
+#: config.c:1640
 msgid "must be one of nothing, matching, simple, upstream or current"
 msgstr "debe ser uno de nothing, matching, simple, upstream o current"
 
-#: config.c:1533 builtin/pack-objects.c:3617
+#: config.c:1701 builtin/pack-objects.c:3666
 #, c-format
 msgid "bad pack compression level %d"
 msgstr "nivel de compresión de pack erróneo %d"
 
-#: config.c:1655
+#: config.c:1823
 #, c-format
 msgid "unable to load config blob object '%s'"
 msgstr "incapaz de cargar configuración de objeto blob '%s'"
 
-#: config.c:1658
+#: config.c:1826
 #, c-format
 msgid "reference '%s' does not point to a blob"
 msgstr "referencia '%s' no apunta a un blob"
 
-#: config.c:1675
+#: config.c:1843
 #, c-format
 msgid "unable to resolve config blob '%s'"
 msgstr "no se posible resolver configuración de blob '%s'"
 
-#: config.c:1705
+#: config.c:1873
 #, c-format
 msgid "failed to parse %s"
 msgstr "no se pudo analizar %s"
 
-#: config.c:1759
+#: config.c:1927
 msgid "unable to parse command-line config"
 msgstr "no es posible analizar la configuración de la línea de comando"
 
-#: config.c:2113
+#: config.c:2290
 msgid "unknown error occurred while reading the configuration files"
 msgstr ""
 "error desconocido ocurrió mientras se leían los archivos de configuración"
 
-#: config.c:2283
+#: config.c:2464
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "Inválido %s: '%s'"
 
-#: config.c:2328
+#: config.c:2509
 #, c-format
 msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
 msgstr "valor splitIndex.maxPercentChange '%d' debe estar entre 0 y 100"
 
-#: config.c:2374
+#: config.c:2555
 #, c-format
 msgid "unable to parse '%s' from command-line config"
 msgstr "no es posible analizar '%s' de la configuración de la línea de comando"
 
-#: config.c:2376
+#: config.c:2557
 #, c-format
 msgid "bad config variable '%s' in file '%s' at line %d"
 msgstr "mala variable de config '%s' en el archivo '%s' en la línea %d"
 
-#: config.c:2457
+#: config.c:2641
 #, c-format
 msgid "invalid section name '%s'"
 msgstr "nombre de sección inválido '%s'"
 
-#: config.c:2489
+#: config.c:2673
 #, c-format
 msgid "%s has multiple values"
 msgstr "%s tiene múltiples valores"
 
-#: config.c:2518
+#: config.c:2702
 #, c-format
 msgid "failed to write new configuration file %s"
 msgstr "falló al escribir nuevo archivo de configuración %s"
 
-#: config.c:2770 config.c:3094
+#: config.c:2954 config.c:3280
 #, c-format
 msgid "could not lock config file %s"
 msgstr "no se pudo bloquear archivo de configuración %s"
 
-#: config.c:2781
+#: config.c:2965
 #, c-format
 msgid "opening %s"
 msgstr "abriendo %s"
 
-#: config.c:2816 builtin/config.c:344
+#: config.c:3002 builtin/config.c:361
 #, c-format
 msgid "invalid pattern: %s"
 msgstr "patrón inválido: %s"
 
-#: config.c:2841
+#: config.c:3027
 #, c-format
 msgid "invalid config file %s"
 msgstr "archivo de configuración inválido: %s"
 
-#: config.c:2854 config.c:3107
+#: config.c:3040 config.c:3293
 #, c-format
 msgid "fstat on %s failed"
 msgstr "fstat en %s falló"
 
-#: config.c:2865
+#: config.c:3051
 #, c-format
 msgid "unable to mmap '%s'"
 msgstr "no es posible hacer mmap '%s'"
 
-#: config.c:2874 config.c:3112
+#: config.c:3060 config.c:3298
 #, c-format
 msgid "chmod on %s failed"
 msgstr "chmod en %s falló"
 
-#: config.c:2959 config.c:3209
+#: config.c:3145 config.c:3395
 #, c-format
 msgid "could not write config file %s"
 msgstr "no se pudo escribir el archivo de configuración %s"
 
-#: config.c:2993
+#: config.c:3179
 #, c-format
 msgid "could not set '%s' to '%s'"
 msgstr "no se pudo configurar '%s' a '%s'"
 
-#: config.c:2995 builtin/remote.c:655 builtin/remote.c:849 builtin/remote.c:857
+#: config.c:3181 builtin/remote.c:657 builtin/remote.c:855 builtin/remote.c:863
 #, c-format
 msgid "could not unset '%s'"
 msgstr "no se pudo desactivar '%s'"
 
-#: config.c:3085
+#: config.c:3271
 #, c-format
 msgid "invalid section name: %s"
 msgstr "sección de nombre inválida: %s"
 
-#: config.c:3252
+#: config.c:3438
 #, c-format
 msgid "missing value for '%s'"
 msgstr "valor faltante para '%s'"
@@ -2791,45 +2871,45 @@
 msgid "protocol error: unexpected '%s'"
 msgstr "error de protocolo: '%s' inesperado"
 
-#: connect.c:473
+#: connect.c:497
 #, c-format
 msgid "unknown object format '%s' specified by server"
 msgstr "formato de objeto desconocido '%s' ha sido provisto por el servidor"
 
-#: connect.c:500
+#: connect.c:526
 #, c-format
 msgid "invalid ls-refs response: %s"
 msgstr "respuesta de referencias ls-refs inválida: %s"
 
-#: connect.c:504
+#: connect.c:530
 msgid "expected flush after ref listing"
 msgstr "flush esperado tras listado de refs"
 
-#: connect.c:507
+#: connect.c:533
 msgid "expected response end packet after ref listing"
 msgstr "se esperaba un paquete final luego del ref listing"
 
-#: connect.c:640
+#: connect.c:666
 #, c-format
 msgid "protocol '%s' is not supported"
 msgstr "protocolo '%s' no es soportado"
 
-#: connect.c:691
+#: connect.c:717
 msgid "unable to set SO_KEEPALIVE on socket"
 msgstr "no es posible configurar SO_KEEPALIVE en el socket"
 
-#: connect.c:731 connect.c:794
+#: connect.c:757 connect.c:820
 #, c-format
 msgid "Looking up %s ... "
 msgstr "Revisando %s... "
 
-#: connect.c:735
+#: connect.c:761
 #, c-format
 msgid "unable to look up %s (port %s) (%s)"
 msgstr "no se puede revisar %s (puerto %s) (%s)"
 
 #. TRANSLATORS: this is the end of "Looking up %s ... "
-#: connect.c:739 connect.c:810
+#: connect.c:765 connect.c:836
 #, c-format
 msgid ""
 "done.\n"
@@ -2838,7 +2918,7 @@
 "hecho.\n"
 "Conectando a %s (puerto %s) ... "
 
-#: connect.c:761 connect.c:838
+#: connect.c:787 connect.c:864
 #, c-format
 msgid ""
 "unable to connect to %s:\n"
@@ -2848,74 +2928,78 @@
 "%s"
 
 #. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
-#: connect.c:767 connect.c:844
+#: connect.c:793 connect.c:870
 msgid "done."
 msgstr "hecho."
 
-#: connect.c:798
+#: connect.c:824
 #, c-format
 msgid "unable to look up %s (%s)"
 msgstr "no es posible revisar %s (%s)"
 
-#: connect.c:804
+#: connect.c:830
 #, c-format
 msgid "unknown port %s"
 msgstr "puerto desconocido %s"
 
-#: connect.c:941 connect.c:1271
+#: connect.c:967 connect.c:1299
 #, c-format
 msgid "strange hostname '%s' blocked"
 msgstr "hostname extraño '%s' bloqueado"
 
-#: connect.c:943
+#: connect.c:969
 #, c-format
 msgid "strange port '%s' blocked"
 msgstr "puerto extraño '%s' bloqueado"
 
-#: connect.c:953
+#: connect.c:979
 #, c-format
 msgid "cannot start proxy %s"
 msgstr "no se puede comenzar proxy %s"
 
-#: connect.c:1024
+#: connect.c:1050
 msgid "no path specified; see 'git help pull' for valid url syntax"
 msgstr ""
 "no hay ruta especificada; vea 'git help pull' para sintaxis de url válidas"
 
-#: connect.c:1219
+#: connect.c:1190
+msgid "newline is forbidden in git:// hosts and repo paths"
+msgstr "la nueva línea está prohibida en git://hosts y rutas de repositorio"
+
+#: connect.c:1247
 msgid "ssh variant 'simple' does not support -4"
 msgstr "variante 'simple' de ssh no soporta -4"
 
-#: connect.c:1231
+#: connect.c:1259
 msgid "ssh variant 'simple' does not support -6"
 msgstr "variante 'simple' de ssh no soporta -6"
 
-#: connect.c:1248
+#: connect.c:1276
 msgid "ssh variant 'simple' does not support setting port"
 msgstr "variante ssh 'simple' no soporta configurar puerto"
 
-#: connect.c:1360
+#: connect.c:1388
 #, c-format
 msgid "strange pathname '%s' blocked"
 msgstr "ruta extraña '%s' bloqueada"
 
-#: connect.c:1407
+#: connect.c:1436
 msgid "unable to fork"
 msgstr "no es posible hacer fork"
 
-#: connected.c:109 builtin/fsck.c:209 builtin/prune.c:45
+#: connected.c:108 builtin/fsck.c:191 builtin/prune.c:45
 msgid "Checking connectivity"
 msgstr "Verificando conectividad"
 
-#: connected.c:121
+#: connected.c:120
 msgid "Could not run 'git rev-list'"
 msgstr "No se pudo correr 'git rev-list'"
 
-#: connected.c:141
+#: connected.c:144
 msgid "failed write to rev-list"
 msgstr "falló escribir a rev-list"
 
-#: connected.c:148
+#: connected.c:149
 msgid "failed to close rev-list's stdin"
 msgstr "falló al cerrar la entrada standard de rev-list"
 
@@ -2990,40 +3074,40 @@
 msgid "encoding '%s' from %s to %s and back is not the same"
 msgstr "codificación '%s' de %s a %s y de vuelta no son iguales"
 
-#: convert.c:668
+#: convert.c:665
 #, c-format
 msgid "cannot fork to run external filter '%s'"
 msgstr "no se puede hacer fork para ejecutar filtros externos '%s'"
 
-#: convert.c:688
+#: convert.c:685
 #, c-format
 msgid "cannot feed the input to external filter '%s'"
 msgstr "no se pueden alimentar de input a los filtros externos '%s'"
 
-#: convert.c:695
+#: convert.c:692
 #, c-format
 msgid "external filter '%s' failed %d"
 msgstr "filtro externo '%s' falló %d"
 
-#: convert.c:730 convert.c:733
+#: convert.c:727 convert.c:730
 #, c-format
 msgid "read from external filter '%s' failed"
 msgstr "lectura de filtro externo '%s' falló"
 
-#: convert.c:736 convert.c:791
+#: convert.c:733 convert.c:788
 #, c-format
 msgid "external filter '%s' failed"
 msgstr "filtro externo '%s' falló"
 
-#: convert.c:840
+#: convert.c:837
 msgid "unexpected filter type"
 msgstr "tipo de filtro inesperado"
 
-#: convert.c:851
+#: convert.c:848
 msgid "path name too long for external filter"
 msgstr "nombre de ruta muy largo para filtro externo"
 
-#: convert.c:943
+#: convert.c:940
 #, c-format
 msgid ""
 "external filter '%s' is not available anymore although not all paths have "
@@ -3032,16 +3116,16 @@
 "filtro externo '%s' ya no está disponible aunque no todas las rutas han sido "
 "filtradas"
 
-#: convert.c:1243
+#: convert.c:1240
 msgid "true/false are no valid working-tree-encodings"
 msgstr "true/false no son working-tree-encodings válidos"
 
-#: convert.c:1431 convert.c:1465
+#: convert.c:1428 convert.c:1462
 #, c-format
 msgid "%s: clean filter '%s' failed"
 msgstr "%s: falló al limpiar filtro '%s'"
 
-#: convert.c:1511
+#: convert.c:1508
 #, c-format
 msgid "%s: smudge filter %s failed"
 msgstr "%s: filtro smudge %s falló"
@@ -3059,17 +3143,17 @@
 msgid "refusing to work with credential missing protocol field"
 msgstr "rehusando trabajar con credenciales faltantes en el campo protocolo"
 
-#: credential.c:396
+#: credential.c:394
 #, c-format
 msgid "url contains a newline in its %s component: %s"
 msgstr "url contiene un espace de línea en su componente %s: %s"
 
-#: credential.c:440
+#: credential.c:438
 #, c-format
 msgid "url has no scheme: %s"
 msgstr "url no tiene scheme: %s"
 
-#: credential.c:513
+#: credential.c:511
 #, c-format
 msgid "credential url cannot be parsed: %s"
 msgstr "url credencial no puede ser analizada: %s"
@@ -3166,6 +3250,31 @@
 msgid "Marked %d islands, done.\n"
 msgstr "%d islas marcadas, listo.\n"
 
+#: diff-merges.c:70
+#, c-format
+msgid "unknown value for --diff-merges: %s"
+msgstr "valor desconocido para --diff-merges: %s"
+
+#: diff-lib.c:534
+msgid "--merge-base does not work with ranges"
+msgstr "--merge-base no funciona con rangos"
+
+#: diff-lib.c:536
+msgid "--merge-base only works with commits"
+msgstr "--merge-base solo funciona con confirmaciones"
+
+#: diff-lib.c:553
+msgid "unable to get HEAD"
+msgstr "no es posible obtener HEAD"
+
+#: diff-lib.c:560
+msgid "no merge base found"
+msgstr "no se encontró base de fusión"
+
+#: diff-lib.c:562
+msgid "multiple merge bases found"
+msgstr "múltiples bases de fusión encontradas"
+
 #: diff-no-index.c:238
 msgid "git diff --no-index [<options>] <path> <path>"
 msgstr "git diff --no-index [<opciones>] <path> <path>"
@@ -3229,35 +3338,35 @@
 "Errores en la variable de config 'diff.dirstat' encontrados:\n"
 "%s"
 
-#: diff.c:4243
+#: diff.c:4276
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "diff externo murió, deteniendo en %s"
 
-#: diff.c:4589
+#: diff.c:4628
 msgid "--name-only, --name-status, --check and -s are mutually exclusive"
 msgstr "--name-only, --name-status, --check y -s son mutuamente exclusivas"
 
-#: diff.c:4592
+#: diff.c:4631
 msgid "-G, -S and --find-object are mutually exclusive"
 msgstr "-G, -S y --find-object son mutuamente exclusivas"
 
-#: diff.c:4670
+#: diff.c:4710
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow requiere exactamente un pathspec"
 
-#: diff.c:4718
+#: diff.c:4758
 #, c-format
 msgid "invalid --stat value: %s"
 msgstr "valor --stat inválido: %s"
 
-#: diff.c:4723 diff.c:4728 diff.c:4733 diff.c:4738 diff.c:5250
-#: parse-options.c:197 parse-options.c:201
+#: diff.c:4763 diff.c:4768 diff.c:4773 diff.c:4778 diff.c:5306
+#: parse-options.c:197 parse-options.c:201 builtin/commit-graph.c:180
 #, c-format
 msgid "%s expects a numerical value"
 msgstr "%s espera un valor numérico"
 
-#: diff.c:4755
+#: diff.c:4795
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -3266,42 +3375,42 @@
 "Falló al analizar parámetro de opción --dirstat/-X:\n"
 "%s"
 
-#: diff.c:4840
+#: diff.c:4880
 #, c-format
 msgid "unknown change class '%c' in --diff-filter=%s"
 msgstr "cambio de clase desconocido '%c' en --diff-filter=%s"
 
-#: diff.c:4864
+#: diff.c:4904
 #, c-format
 msgid "unknown value after ws-error-highlight=%.*s"
 msgstr "valor desconocido luego de ws-error-highlight=%.*s"
 
-#: diff.c:4878
+#: diff.c:4918
 #, c-format
 msgid "unable to resolve '%s'"
 msgstr "no se puede resolver '%s'"
 
-#: diff.c:4928 diff.c:4934
+#: diff.c:4968 diff.c:4974
 #, c-format
 msgid "%s expects <n>/<m> form"
 msgstr "%s espera forma <n>/<m>"
 
-#: diff.c:4946
+#: diff.c:4986
 #, c-format
 msgid "%s expects a character, got '%s'"
 msgstr "%s esperaba un char, se obtuvo '%s'"
 
-#: diff.c:4967
+#: diff.c:5007
 #, c-format
 msgid "bad --color-moved argument: %s"
 msgstr "mal argumento --color-moved: %s"
 
-#: diff.c:4986
+#: diff.c:5026
 #, c-format
 msgid "invalid mode '%s' in --color-moved-ws"
 msgstr "modo inválido '%s' en --color-moved-ws"
 
-#: diff.c:5026
+#: diff.c:5066
 msgid ""
 "option diff-algorithm accepts \"myers\", \"minimal\", \"patience\" and "
 "\"histogram\""
@@ -3309,154 +3418,159 @@
 "opción diff-algorithm acepta \"myers\", \"minimal\", \"patience\" e "
 "\"histogram\""
 
-#: diff.c:5062 diff.c:5082
+#: diff.c:5102 diff.c:5122
 #, c-format
 msgid "invalid argument to %s"
 msgstr "argumento inválido para %s"
 
-#: diff.c:5219
+#: diff.c:5226
+#, c-format
+msgid "invalid regex given to -I: '%s'"
+msgstr "regex inválido para -I: '%s'"
+
+#: diff.c:5275
 #, c-format
 msgid "failed to parse --submodule option parameter: '%s'"
 msgstr "falló al analizar parámetro de opción --submodule: '%s'"
 
-#: diff.c:5275
+#: diff.c:5331
 #, c-format
 msgid "bad --word-diff argument: %s"
 msgstr "mal argumento --word-diff: %s"
 
-#: diff.c:5298
+#: diff.c:5367
 msgid "Diff output format options"
 msgstr "Opciones de formato de salida para diff"
 
-#: diff.c:5300 diff.c:5306
+#: diff.c:5369 diff.c:5375
 msgid "generate patch"
 msgstr "generar parche"
 
-#: diff.c:5303 builtin/log.c:177
+#: diff.c:5372 builtin/log.c:179
 msgid "suppress diff output"
 msgstr "suprimir salida de diff"
 
-#: diff.c:5308 diff.c:5422 diff.c:5429
+#: diff.c:5377 diff.c:5491 diff.c:5498
 msgid "<n>"
 msgstr "<n>"
 
-#: diff.c:5309 diff.c:5312
+#: diff.c:5378 diff.c:5381
 msgid "generate diffs with <n> lines context"
 msgstr "genera diffs con <n> líneas de contexto"
 
-#: diff.c:5314
+#: diff.c:5383
 msgid "generate the diff in raw format"
 msgstr "genera el diff en formato raw"
 
-#: diff.c:5317
+#: diff.c:5386
 msgid "synonym for '-p --raw'"
 msgstr "sinónimo para '-p --stat'"
 
-#: diff.c:5321
+#: diff.c:5390
 msgid "synonym for '-p --stat'"
 msgstr "sinónimo para '-p --stat'"
 
-#: diff.c:5325
+#: diff.c:5394
 msgid "machine friendly --stat"
 msgstr "--stat amigable para máquina"
 
-#: diff.c:5328
+#: diff.c:5397
 msgid "output only the last line of --stat"
 msgstr "mostrar solo la última línea para --stat"
 
-#: diff.c:5330 diff.c:5338
+#: diff.c:5399 diff.c:5407
 msgid "<param1,param2>..."
 msgstr "<param1,param2>..."
 
-#: diff.c:5331
+#: diff.c:5400
 msgid ""
 "output the distribution of relative amount of changes for each sub-directory"
 msgstr ""
 "muestra la distribución de cantidades de cambios relativa para cada "
 "subdirectorio"
 
-#: diff.c:5335
+#: diff.c:5404
 msgid "synonym for --dirstat=cumulative"
 msgstr "sinónimo para --dirstat=cumulative"
 
-#: diff.c:5339
+#: diff.c:5408
 msgid "synonym for --dirstat=files,param1,param2..."
 msgstr "sinonimo para --dirstat=archivos,param1,param2..."
 
-#: diff.c:5343
+#: diff.c:5412
 msgid "warn if changes introduce conflict markers or whitespace errors"
 msgstr ""
 "advierte si cambios introducen conflictos de markers o errores de espacios "
 "en blanco"
 
-#: diff.c:5346
+#: diff.c:5415
 msgid "condensed summary such as creations, renames and mode changes"
 msgstr ""
 "resumen condensado de creaciones, cambios de nombres y cambios de modos"
 
-#: diff.c:5349
+#: diff.c:5418
 msgid "show only names of changed files"
 msgstr "mostrar solo nombres de archivos cambiados"
 
-#: diff.c:5352
+#: diff.c:5421
 msgid "show only names and status of changed files"
 msgstr "mostrar solo nombres y estados de archivos cambiados"
 
-#: diff.c:5354
+#: diff.c:5423
 msgid "<width>[,<name-width>[,<count>]]"
 msgstr "<ancho>[,<nombre-ancho>[,<cantidad>]]"
 
-#: diff.c:5355
+#: diff.c:5424
 msgid "generate diffstat"
 msgstr "generar diffstat"
 
-#: diff.c:5357 diff.c:5360 diff.c:5363
+#: diff.c:5426 diff.c:5429 diff.c:5432
 msgid "<width>"
 msgstr "<ancho>"
 
-#: diff.c:5358
+#: diff.c:5427
 msgid "generate diffstat with a given width"
 msgstr "genera diffstat con un ancho dado"
 
-#: diff.c:5361
+#: diff.c:5430
 msgid "generate diffstat with a given name width"
 msgstr "genera diffstat con un nombre de ancho dado"
 
-#: diff.c:5364
+#: diff.c:5433
 msgid "generate diffstat with a given graph width"
 msgstr "genera diffstat con un ancho de graph dado"
 
-#: diff.c:5366
+#: diff.c:5435
 msgid "<count>"
 msgstr "<cantidad>"
 
-#: diff.c:5367
+#: diff.c:5436
 msgid "generate diffstat with limited lines"
 msgstr "genera diffstat con líneas limitadas"
 
-#: diff.c:5370
+#: diff.c:5439
 msgid "generate compact summary in diffstat"
 msgstr "genera un resumen compacto de diffstat"
 
-#: diff.c:5373
+#: diff.c:5442
 msgid "output a binary diff that can be applied"
 msgstr "muestra un diff binario que puede ser aplicado"
 
-#: diff.c:5376
+#: diff.c:5445
 msgid "show full pre- and post-image object names on the \"index\" lines"
 msgstr ""
 "mostrar todo un pre- y post-image de nombres de objetos en las líneas \"index"
 "\""
 
-#: diff.c:5378
+#: diff.c:5447
 msgid "show colored diff"
 msgstr "mostrar diff colorido"
 
-#: diff.c:5379
+#: diff.c:5448
 msgid "<kind>"
 msgstr "<tipo>"
 
-#: diff.c:5380
+#: diff.c:5449
 msgid ""
 "highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
 "diff"
@@ -3464,7 +3578,7 @@
 "resaltar errores de espacios en blanco en las líneas 'context', 'old' o "
 "'new' del diff"
 
-#: diff.c:5383
+#: diff.c:5452
 msgid ""
 "do not munge pathnames and use NULs as output field terminators in --raw or "
 "--numstat"
@@ -3472,89 +3586,89 @@
 "no consolidar los pathnames y usar NULs como terminadores de campos en --raw "
 "o --numstat"
 
-#: diff.c:5386 diff.c:5389 diff.c:5392 diff.c:5498
+#: diff.c:5455 diff.c:5458 diff.c:5461 diff.c:5570
 msgid "<prefix>"
 msgstr "<prefijo>"
 
-#: diff.c:5387
+#: diff.c:5456
 msgid "show the given source prefix instead of \"a/\""
 msgstr "mostrar el prefijo de fuente dado en lugar de \"a/\""
 
-#: diff.c:5390
+#: diff.c:5459
 msgid "show the given destination prefix instead of \"b/\""
 msgstr "mostrar el prefijo de destino en lugar de \"b/\""
 
-#: diff.c:5393
+#: diff.c:5462
 msgid "prepend an additional prefix to every line of output"
 msgstr "anteponer un prefijo adicional a cada línea mostrada"
 
-#: diff.c:5396
+#: diff.c:5465
 msgid "do not show any source or destination prefix"
 msgstr "no mostrar ningún prefijo de fuente o destino"
 
-#: diff.c:5399
+#: diff.c:5468
 msgid "show context between diff hunks up to the specified number of lines"
 msgstr ""
 "muestra el contexto entre hunks de diff hasta el número especificado de "
 "líneas"
 
-#: diff.c:5403 diff.c:5408 diff.c:5413
+#: diff.c:5472 diff.c:5477 diff.c:5482
 msgid "<char>"
 msgstr "<char>"
 
-#: diff.c:5404
+#: diff.c:5473
 msgid "specify the character to indicate a new line instead of '+'"
 msgstr "especifica el char para indicar una nueva línea en lugar de '+'"
 
-#: diff.c:5409
+#: diff.c:5478
 msgid "specify the character to indicate an old line instead of '-'"
 msgstr "especifica el char para indicar una línea vieja en lugar de '-'"
 
-#: diff.c:5414
+#: diff.c:5483
 msgid "specify the character to indicate a context instead of ' '"
 msgstr "especifica el char para indicar un contexto en lugar de ' '"
 
-#: diff.c:5417
+#: diff.c:5486
 msgid "Diff rename options"
 msgstr "Opciones de diff rename"
 
-#: diff.c:5418
+#: diff.c:5487
 msgid "<n>[/<m>]"
 msgstr "<n>[/<m>]"
 
-#: diff.c:5419
+#: diff.c:5488
 msgid "break complete rewrite changes into pairs of delete and create"
 msgstr "descomponer los cambios de reescritura en pares de borrar y crear"
 
-#: diff.c:5423
+#: diff.c:5492
 msgid "detect renames"
 msgstr "detectar renombrados"
 
-#: diff.c:5427
+#: diff.c:5496
 msgid "omit the preimage for deletes"
 msgstr "omite la preimage para borrados"
 
-#: diff.c:5430
+#: diff.c:5499
 msgid "detect copies"
 msgstr "detectar copias"
 
-#: diff.c:5434
+#: diff.c:5503
 msgid "use unmodified files as source to find copies"
 msgstr "usa archivos no modificados como fuente para encontrar copias"
 
-#: diff.c:5436
+#: diff.c:5505
 msgid "disable rename detection"
 msgstr "deshabilita detección de renombres"
 
-#: diff.c:5439
+#: diff.c:5508
 msgid "use empty blobs as rename source"
 msgstr "usa blobs vacíos como fuente de renombre"
 
-#: diff.c:5441
+#: diff.c:5510
 msgid "continue listing the history of a file beyond renames"
 msgstr "continua listando el historial de un archivo más allá de renombres"
 
-#: diff.c:5444
+#: diff.c:5513
 msgid ""
 "prevent rename/copy detection if the number of rename/copy targets exceeds "
 "given limit"
@@ -3562,155 +3676,159 @@
 "previene detección de renombre/copias si el número de objetivos para "
 "renombres/copias excede el límite dado"
 
-#: diff.c:5446
+#: diff.c:5515
 msgid "Diff algorithm options"
 msgstr "Opciones de algoritmos de diff"
 
-#: diff.c:5448
+#: diff.c:5517
 msgid "produce the smallest possible diff"
 msgstr "produce el diff más pequeño posible"
 
-#: diff.c:5451
+#: diff.c:5520
 msgid "ignore whitespace when comparing lines"
 msgstr "ignorar espacios en blanco cuando comparando líneas"
 
-#: diff.c:5454
+#: diff.c:5523
 msgid "ignore changes in amount of whitespace"
 msgstr "ignorar cambios en la cantidad de líneas en blanco"
 
-#: diff.c:5457
+#: diff.c:5526
 msgid "ignore changes in whitespace at EOL"
 msgstr "ignorar cambios en espacios en blanco en EOL"
 
-#: diff.c:5460
+#: diff.c:5529
 msgid "ignore carrier-return at the end of line"
 msgstr "ignora carrier-return al final de la línea"
 
-#: diff.c:5463
+#: diff.c:5532
 msgid "ignore changes whose lines are all blank"
 msgstr "ignora cambios cuyas líneas son todas en blanco"
 
-#: diff.c:5466
+#: diff.c:5534 diff.c:5556 diff.c:5559 diff.c:5604
+msgid "<regex>"
+msgstr "<regex>"
+
+#: diff.c:5535
+msgid "ignore changes whose all lines match <regex>"
+msgstr "ignora cambios cuyas líneas concuerdan con <regex>"
+
+#: diff.c:5538
 msgid "heuristic to shift diff hunk boundaries for easy reading"
 msgstr "heurística para cambiar los límites de hunk para una fácil lectura"
 
-#: diff.c:5469
+#: diff.c:5541
 msgid "generate diff using the \"patience diff\" algorithm"
 msgstr "genera un diff usando algoritmo \"patience diff\""
 
-#: diff.c:5473
+#: diff.c:5545
 msgid "generate diff using the \"histogram diff\" algorithm"
 msgstr "genera un diff usando algoritmo \"histogram diff\""
 
-#: diff.c:5475
+#: diff.c:5547
 msgid "<algorithm>"
 msgstr "<algoritmo>"
 
-#: diff.c:5476
+#: diff.c:5548
 msgid "choose a diff algorithm"
 msgstr "escoge un algoritmo para diff"
 
-#: diff.c:5478
+#: diff.c:5550
 msgid "<text>"
 msgstr "<texto>"
 
-#: diff.c:5479
+#: diff.c:5551
 msgid "generate diff using the \"anchored diff\" algorithm"
 msgstr "genera un diff usando algoritmo \"anchored diff\""
 
-#: diff.c:5481 diff.c:5490 diff.c:5493
+#: diff.c:5553 diff.c:5562 diff.c:5565
 msgid "<mode>"
 msgstr "<modo>"
 
-#: diff.c:5482
+#: diff.c:5554
 msgid "show word diff, using <mode> to delimit changed words"
 msgstr ""
 "muestra diff por palabras usando <modo> para delimitar las palabras cambiadas"
 
-#: diff.c:5484 diff.c:5487 diff.c:5532
-msgid "<regex>"
-msgstr "<regex>"
-
-#: diff.c:5485
+#: diff.c:5557
 msgid "use <regex> to decide what a word is"
 msgstr "usa <regex> para decidir que palabra es"
 
-#: diff.c:5488
+#: diff.c:5560
 msgid "equivalent to --word-diff=color --word-diff-regex=<regex>"
 msgstr "equivalente a --word-diff=color --word-diff-regex=<regex>"
 
-#: diff.c:5491
+#: diff.c:5563
 msgid "moved lines of code are colored differently"
 msgstr "líneas movidas de código están coloreadas diferente"
 
-#: diff.c:5494
+#: diff.c:5566
 msgid "how white spaces are ignored in --color-moved"
 msgstr "como espacios en blanco son ignorados en --color-moved"
 
-#: diff.c:5497
+#: diff.c:5569
 msgid "Other diff options"
 msgstr "Otras opciones de diff"
 
-#: diff.c:5499
+#: diff.c:5571
 msgid "when run from subdir, exclude changes outside and show relative paths"
 msgstr ""
 "cuando ejecutado desde un subdir, excluye cambios del exterior y muestra "
 "paths relativos"
 
-#: diff.c:5503
+#: diff.c:5575
 msgid "treat all files as text"
 msgstr "tratar todos los archivos como texto"
 
-#: diff.c:5505
+#: diff.c:5577
 msgid "swap two inputs, reverse the diff"
 msgstr "cambia dos inputs, invierte el diff"
 
-#: diff.c:5507
+#: diff.c:5579
 msgid "exit with 1 if there were differences, 0 otherwise"
 msgstr "termina con 1 si hubieron diferencias, de lo contrario con 0"
 
-#: diff.c:5509
+#: diff.c:5581
 msgid "disable all output of the program"
 msgstr "deshabilita todo el output del programa"
 
-#: diff.c:5511
+#: diff.c:5583
 msgid "allow an external diff helper to be executed"
 msgstr "permite la ejecución de un diff helper externo"
 
-#: diff.c:5513
+#: diff.c:5585
 msgid "run external text conversion filters when comparing binary files"
 msgstr ""
 "ejecuta filtros de conversión de texto externos cuando comparando binarios"
 
-#: diff.c:5515
+#: diff.c:5587
 msgid "<when>"
 msgstr "<cuando>"
 
-#: diff.c:5516
+#: diff.c:5588
 msgid "ignore changes to submodules in the diff generation"
 msgstr "ignorar cambios a submódulos en la generación de diff"
 
-#: diff.c:5519
+#: diff.c:5591
 msgid "<format>"
 msgstr "<formato>"
 
-#: diff.c:5520
+#: diff.c:5592
 msgid "specify how differences in submodules are shown"
 msgstr "especifica como son mostradas las diferencias en submódulos"
 
-#: diff.c:5524
+#: diff.c:5596
 msgid "hide 'git add -N' entries from the index"
 msgstr "ocultar entradas 'git add -N' del index"
 
-#: diff.c:5527
+#: diff.c:5599
 msgid "treat 'git add -N' entries as real in the index"
 msgstr "trata entradas 'git add -N' como reales en el index"
 
-#: diff.c:5529
+#: diff.c:5601
 msgid "<string>"
 msgstr "<string>"
 
-#: diff.c:5530
+#: diff.c:5602
 msgid ""
 "look for differences that change the number of occurrences of the specified "
 "string"
@@ -3718,7 +3836,7 @@
 "busca por diferencias que cambien el número de ocurrencias para el string "
 "especificado"
 
-#: diff.c:5533
+#: diff.c:5605
 msgid ""
 "look for differences that change the number of occurrences of the specified "
 "regex"
@@ -3726,23 +3844,35 @@
 "busca por diferencias que cambien el número de ocurrencias para el regex "
 "especificado"
 
-#: diff.c:5536
+#: diff.c:5608
 msgid "show all changes in the changeset with -S or -G"
 msgstr "mostrar todos los cambios en el changeset con -S o -G"
 
-#: diff.c:5539
+#: diff.c:5611
 msgid "treat <string> in -S as extended POSIX regular expression"
 msgstr "tratar <string> en -S como una expresión regular extendida de POSIX"
 
-#: diff.c:5542
+#: diff.c:5614
 msgid "control the order in which files appear in the output"
 msgstr "controlar el orden en el que los archivos aparecen en la salida"
 
-#: diff.c:5543
+#: diff.c:5615 diff.c:5618
+msgid "<path>"
+msgstr "<ruta>"
+
+#: diff.c:5616
+msgid "show the change in the specified path first"
+msgstr "mostrar el cambio en la ruta especificada primero"
+
+#: diff.c:5619
+msgid "skip the output to the specified path"
+msgstr "saltar el output de la ruta especificada"
+
+#: diff.c:5621
 msgid "<object-id>"
 msgstr "<id-objeto>"
 
-#: diff.c:5544
+#: diff.c:5622
 msgid ""
 "look for differences that change the number of occurrences of the specified "
 "object"
@@ -3750,33 +3880,33 @@
 "busca por diferencias que cambien el número de ocurrencias para el objeto "
 "especificado"
 
-#: diff.c:5546
+#: diff.c:5624
 msgid "[(A|C|D|M|R|T|U|X|B)...[*]]"
 msgstr "[(A|C|D|M|R|T|U|X|B)...[*]]"
 
-#: diff.c:5547
+#: diff.c:5625
 msgid "select files by diff type"
 msgstr "selecciona archivos por tipo de diff"
 
-#: diff.c:5549
+#: diff.c:5627
 msgid "<file>"
 msgstr "<archivo>"
 
-#: diff.c:5550
+#: diff.c:5628
 msgid "Output to a specific file"
 msgstr "Output a un archivo específico"
 
-#: diff.c:6205
+#: diff.c:6285
 msgid "inexact rename detection was skipped due to too many files."
 msgstr ""
 "detección de cambio de nombre inexacta fue saltada por haber muchos archivos."
 
-#: diff.c:6208
+#: diff.c:6288
 msgid "only found copies from modified paths due to too many files."
 msgstr ""
 "solo se encontraron copias de rutas modificadas por haber muchos archivos."
 
-#: diff.c:6211
+#: diff.c:6291
 #, c-format
 msgid ""
 "you may want to set your %s variable to at least %d and retry the command."
@@ -3789,65 +3919,70 @@
 msgid "failed to read orderfile '%s'"
 msgstr "falló al leer orden de archivos '%s'"
 
-#: diffcore-rename.c:592
+#: diffcore-rename.c:786
 msgid "Performing inexact rename detection"
 msgstr "Realizando una detección de cambios de nombre inexacta"
 
-#: dir.c:573
+#: diffcore-rotate.c:29
+#, c-format
+msgid "No such path '%s' in the diff"
+msgstr "No hay ruta '%s' en el diff"
+
+#: dir.c:578
 #, c-format
 msgid "pathspec '%s' did not match any file(s) known to git"
 msgstr ""
 "ruta especificada '%s' no concordó con ningún archivo(s) conocido por git"
 
-#: dir.c:713 dir.c:742 dir.c:755
+#: dir.c:718 dir.c:747 dir.c:760
 #, c-format
 msgid "unrecognized pattern: '%s'"
 msgstr "patrón desconocido: '%s'"
 
-#: dir.c:772 dir.c:786
+#: dir.c:777 dir.c:791
 #, c-format
 msgid "unrecognized negative pattern: '%s'"
 msgstr "patrón negativo no reconocido: '%s'"
 
-#: dir.c:804
+#: dir.c:809
 #, c-format
 msgid "your sparse-checkout file may have issues: pattern '%s' is repeated"
 msgstr ""
 "tu archivo sparse-checkout tal vez tenga errores: patrón '%s' está repetido"
 
-#: dir.c:814
+#: dir.c:819
 msgid "disabling cone pattern matching"
 msgstr "deshabilitar coincidencia de patrónes cono"
 
-#: dir.c:1191
+#: dir.c:1198
 #, c-format
 msgid "cannot use %s as an exclude file"
 msgstr "no se puede usar %s como archivo de exclusión"
 
-#: dir.c:2296
+#: dir.c:2305
 #, c-format
 msgid "could not open directory '%s'"
 msgstr "no se pudo abrir el directorio '%s'"
 
-#: dir.c:2596
+#: dir.c:2605
 msgid "failed to get kernel name and information"
 msgstr "falló al conseguir la información y nombre del kernel"
 
-#: dir.c:2720
+#: dir.c:2729
 msgid "untracked cache is disabled on this system or location"
 msgstr "untracked cache está desactivado en este sistema o ubicación"
 
-#: dir.c:3502
+#: dir.c:3534
 #, c-format
 msgid "index file corrupt in repo %s"
 msgstr "archivo índice corrompido en repositorio %s"
 
-#: dir.c:3547 dir.c:3552
+#: dir.c:3579 dir.c:3584
 #, c-format
 msgid "could not create directories for %s"
 msgstr "no se pudo crear directorios para %s"
 
-#: dir.c:3581
+#: dir.c:3613
 #, c-format
 msgid "could not migrate git directory from '%s' to '%s'"
 msgstr "no se pudo migrar el directorio git de '%s' a '%s'"
@@ -3866,12 +4001,12 @@
 msgid "could not stat file '%s'"
 msgstr "no se pudo establecer el archivo '%s'"
 
-#: environment.c:150
+#: environment.c:152
 #, c-format
 msgid "bad git namespace path \"%s\""
 msgstr "ruta de namespace de git mala \"%s\""
 
-#: environment.c:337
+#: environment.c:335
 #, c-format
 msgid "could not set GIT_DIR to '%s'"
 msgstr "no se pudo configurar GIT_DIR a '%s'"
@@ -3881,260 +4016,264 @@
 msgid "too many args to run %s"
 msgstr "demasiados argumentos para correr %s"
 
-#: fetch-pack.c:152
+#: fetch-pack.c:177
 msgid "git fetch-pack: expected shallow list"
 msgstr "git fetch-pack: lista poco profunda esperada"
 
-#: fetch-pack.c:155
+#: fetch-pack.c:180
 msgid "git fetch-pack: expected a flush packet after shallow list"
 msgstr ""
 "git fetch-pack: se esperaba un flush packet luego de la lista superficial"
 
-#: fetch-pack.c:166
+#: fetch-pack.c:191
 msgid "git fetch-pack: expected ACK/NAK, got a flush packet"
 msgstr "git fetch-pack: se esperaba ACK/NAK, se obtuvo un flush packet"
 
-#: fetch-pack.c:186
+#: fetch-pack.c:211
 #, c-format
 msgid "git fetch-pack: expected ACK/NAK, got '%s'"
 msgstr "git fetch-pack: se esperaba ACK/NAK, se obtuvo '%s'"
 
-#: fetch-pack.c:197
+#: fetch-pack.c:222
 msgid "unable to write to remote"
 msgstr "no se puede escribir al remoto"
 
-#: fetch-pack.c:259
+#: fetch-pack.c:283
 msgid "--stateless-rpc requires multi_ack_detailed"
 msgstr "--stateless-rpc requiere multi_ack_detailed"
 
-#: fetch-pack.c:358 fetch-pack.c:1408
+#: fetch-pack.c:378 fetch-pack.c:1457
 #, c-format
 msgid "invalid shallow line: %s"
 msgstr "línea poco profunda inválida: %s"
 
-#: fetch-pack.c:364 fetch-pack.c:1414
+#: fetch-pack.c:384 fetch-pack.c:1463
 #, c-format
 msgid "invalid unshallow line: %s"
 msgstr "línea superficial inválida: %s"
 
-#: fetch-pack.c:366 fetch-pack.c:1416
+#: fetch-pack.c:386 fetch-pack.c:1465
 #, c-format
 msgid "object not found: %s"
 msgstr "objeto no encontrado: %s"
 
-#: fetch-pack.c:369 fetch-pack.c:1419
+#: fetch-pack.c:389 fetch-pack.c:1468
 #, c-format
 msgid "error in object: %s"
 msgstr "error en objeto: %s"
 
-#: fetch-pack.c:371 fetch-pack.c:1421
+#: fetch-pack.c:391 fetch-pack.c:1470
 #, c-format
 msgid "no shallow found: %s"
 msgstr "superficie no encontrada: %s"
 
-#: fetch-pack.c:374 fetch-pack.c:1425
+#: fetch-pack.c:394 fetch-pack.c:1474
 #, c-format
 msgid "expected shallow/unshallow, got %s"
 msgstr "se esperaba shallow/unshallow, se obtuvo %s"
 
-#: fetch-pack.c:416
+#: fetch-pack.c:434
 #, c-format
 msgid "got %s %d %s"
 msgstr "se obtuvo %s %d %s"
 
-#: fetch-pack.c:433
+#: fetch-pack.c:451
 #, c-format
 msgid "invalid commit %s"
 msgstr "commit inválido %s"
 
-#: fetch-pack.c:464
+#: fetch-pack.c:482
 msgid "giving up"
 msgstr "rindiéndose"
 
-#: fetch-pack.c:477 progress.c:336
+#: fetch-pack.c:495 progress.c:339
 msgid "done"
 msgstr "listo"
 
-#: fetch-pack.c:489
+#: fetch-pack.c:507
 #, c-format
 msgid "got %s (%d) %s"
 msgstr "se obtuvo %s (%d) %s"
 
-#: fetch-pack.c:535
+#: fetch-pack.c:543
 #, c-format
 msgid "Marking %s as complete"
 msgstr "Marcando %s como completa"
 
-#: fetch-pack.c:756
+#: fetch-pack.c:758
 #, c-format
 msgid "already have %s (%s)"
 msgstr "ya se tiene %s (%s)"
 
-#: fetch-pack.c:821
+#: fetch-pack.c:844
 msgid "fetch-pack: unable to fork off sideband demultiplexer"
 msgstr "fetch-pack: no se puede extraer un demultiplexor de banda lateral"
 
-#: fetch-pack.c:829
+#: fetch-pack.c:852
 msgid "protocol error: bad pack header"
 msgstr "error de protocolo: paquete de header erróneo"
 
-#: fetch-pack.c:910
+#: fetch-pack.c:946
 #, c-format
 msgid "fetch-pack: unable to fork off %s"
 msgstr "fetch-pack: no se puede quitar %s"
 
-#: fetch-pack.c:927
+#: fetch-pack.c:952
+msgid "fetch-pack: invalid index-pack output"
+msgstr "fetch-pack: salida de paquete de índice no válida"
+
+#: fetch-pack.c:969
 #, c-format
 msgid "%s failed"
 msgstr "%s falló"
 
-#: fetch-pack.c:929
+#: fetch-pack.c:971
 msgid "error in sideband demultiplexer"
 msgstr "error en demultiplexor de banda lateral"
 
-#: fetch-pack.c:976
+#: fetch-pack.c:1031
 #, c-format
 msgid "Server version is %.*s"
 msgstr "Versión de servidor es %.*s"
 
-#: fetch-pack.c:981 fetch-pack.c:987 fetch-pack.c:990 fetch-pack.c:996
-#: fetch-pack.c:1000 fetch-pack.c:1004 fetch-pack.c:1008 fetch-pack.c:1012
-#: fetch-pack.c:1016 fetch-pack.c:1020 fetch-pack.c:1024 fetch-pack.c:1028
-#: fetch-pack.c:1034 fetch-pack.c:1040 fetch-pack.c:1045 fetch-pack.c:1050
+#: fetch-pack.c:1039 fetch-pack.c:1045 fetch-pack.c:1048 fetch-pack.c:1054
+#: fetch-pack.c:1058 fetch-pack.c:1062 fetch-pack.c:1066 fetch-pack.c:1070
+#: fetch-pack.c:1074 fetch-pack.c:1078 fetch-pack.c:1082 fetch-pack.c:1086
+#: fetch-pack.c:1092 fetch-pack.c:1098 fetch-pack.c:1103 fetch-pack.c:1108
 #, c-format
 msgid "Server supports %s"
 msgstr "El servidor soporta %s"
 
-#: fetch-pack.c:983
+#: fetch-pack.c:1041
 msgid "Server does not support shallow clients"
 msgstr "El servidor no soporta clientes superficiales"
 
-#: fetch-pack.c:1043
+#: fetch-pack.c:1101
 msgid "Server does not support --shallow-since"
 msgstr "El servidor no soporta --shalow-since"
 
-#: fetch-pack.c:1048
+#: fetch-pack.c:1106
 msgid "Server does not support --shallow-exclude"
 msgstr "El servidor no soporta --shalow-exclude"
 
-#: fetch-pack.c:1052
+#: fetch-pack.c:1110
 msgid "Server does not support --deepen"
 msgstr "El servidor no soporta --deepen"
 
-#: fetch-pack.c:1054
+#: fetch-pack.c:1112
 msgid "Server does not support this repository's object format"
 msgstr "El servidor no soporta el formato de objetos de este repositorio"
 
-#: fetch-pack.c:1071
+#: fetch-pack.c:1125
 msgid "no common commits"
 msgstr "no hay commits comunes"
 
-#: fetch-pack.c:1083 fetch-pack.c:1639
+#: fetch-pack.c:1138 fetch-pack.c:1682
 msgid "git fetch-pack: fetch failed."
 msgstr "git fetch-pack: fetch falló."
 
-#: fetch-pack.c:1211
+#: fetch-pack.c:1265
 #, c-format
 msgid "mismatched algorithms: client %s; server %s"
 msgstr "algoritmos no compatibles: cliente %s; servidor %s"
 
-#: fetch-pack.c:1215
+#: fetch-pack.c:1269
 #, c-format
 msgid "the server does not support algorithm '%s'"
 msgstr "servidor no soporta el algoritmo '%s'"
 
-#: fetch-pack.c:1235
+#: fetch-pack.c:1289
 msgid "Server does not support shallow requests"
 msgstr "El servidor no soporta peticiones superficiales"
 
-#: fetch-pack.c:1242
+#: fetch-pack.c:1296
 msgid "Server supports filter"
 msgstr "El servidor soporta filtro"
 
-#: fetch-pack.c:1286
+#: fetch-pack.c:1335
 msgid "unable to write request to remote"
 msgstr "no se puede escribir request al remoto"
 
-#: fetch-pack.c:1304
+#: fetch-pack.c:1353
 #, c-format
 msgid "error reading section header '%s'"
 msgstr "error leyendo sección header '%s'"
 
-#: fetch-pack.c:1310
+#: fetch-pack.c:1359
 #, c-format
 msgid "expected '%s', received '%s'"
 msgstr "se esperaba '%s', se recibió '%s'"
 
-#: fetch-pack.c:1371
+#: fetch-pack.c:1420
 #, c-format
 msgid "unexpected acknowledgment line: '%s'"
 msgstr "línea de confirmación inesperada: '%s'"
 
-#: fetch-pack.c:1376
+#: fetch-pack.c:1425
 #, c-format
 msgid "error processing acks: %d"
 msgstr "error procesando acks: %d"
 
-#: fetch-pack.c:1386
+#: fetch-pack.c:1435
 msgid "expected packfile to be sent after 'ready'"
 msgstr "espere que el packfile sea mandado luego del 'listo'"
 
-#: fetch-pack.c:1388
+#: fetch-pack.c:1437
 msgid "expected no other sections to be sent after no 'ready'"
 msgstr "espere que ninguna otra sección sea enviada luego del 'listo'"
 
-#: fetch-pack.c:1430
+#: fetch-pack.c:1479
 #, c-format
 msgid "error processing shallow info: %d"
 msgstr "error procesando información superficial: %d"
 
-#: fetch-pack.c:1477
+#: fetch-pack.c:1526
 #, c-format
 msgid "expected wanted-ref, got '%s'"
 msgstr "se esperaba wanted-ref, se obtuvo '%s'"
 
-#: fetch-pack.c:1482
+#: fetch-pack.c:1531
 #, c-format
 msgid "unexpected wanted-ref: '%s'"
 msgstr "wanted-ref inesperado: '%s'"
 
-#: fetch-pack.c:1487
+#: fetch-pack.c:1536
 #, c-format
 msgid "error processing wanted refs: %d"
 msgstr "error procesando refs deseadas: %d"
 
-#: fetch-pack.c:1517
+#: fetch-pack.c:1566
 msgid "git fetch-pack: expected response end packet"
 msgstr "git fetch-pack: se espera un paquete final de respuesta"
 
-#: fetch-pack.c:1921
+#: fetch-pack.c:1960
 msgid "no matching remote head"
 msgstr "no concuerda el head remoto"
 
-#: fetch-pack.c:1944 builtin/clone.c:692
+#: fetch-pack.c:1983 builtin/clone.c:693
 msgid "remote did not send all necessary objects"
 msgstr "remoto no mando todos los objetos necesarios"
 
-#: fetch-pack.c:1971
+#: fetch-pack.c:2010
 #, c-format
 msgid "no such remote ref %s"
 msgstr "no existe ref remota %s"
 
-#: fetch-pack.c:1974
+#: fetch-pack.c:2013
 #, c-format
 msgid "Server does not allow request for unadvertised object %s"
 msgstr "El servidor no permite solicitudes de objetos inadvertidos %s"
 
-#: gpg-interface.c:272
+#: gpg-interface.c:273
 msgid "could not create temporary file"
 msgstr "no se pudo crear archivo temporal"
 
-#: gpg-interface.c:275
+#: gpg-interface.c:276
 #, c-format
 msgid "failed writing detached signature to '%s'"
 msgstr "falló al escribir la firma separada para '%s'"
 
-#: gpg-interface.c:457
+#: gpg-interface.c:470
 msgid "gpg failed to sign the data"
 msgstr "gpg falló al firmar la data"
 
@@ -4143,7 +4282,7 @@
 msgid "ignore invalid color '%.*s' in log.graphColors"
 msgstr "ignora color inválido '%.*s' en log.graphColors"
 
-#: grep.c:668
+#: grep.c:543
 msgid ""
 "given pattern contains NULL byte (via -f <file>). This is only supported "
 "with -P under PCRE v2"
@@ -4151,18 +4290,18 @@
 "el patrón provisto contiene bytes NULL (via -f <archivo>). Esto solo es "
 "soportado con -P bajo PCRE v2"
 
-#: grep.c:2128
+#: grep.c:1906
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "'%s': no es posible leer %s"
 
-#: grep.c:2145 setup.c:176 builtin/clone.c:411 builtin/diff.c:89
+#: grep.c:1923 setup.c:176 builtin/clone.c:412 builtin/diff.c:90
 #: builtin/rm.c:135
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "falló al marcar '%s'"
 
-#: grep.c:2156
+#: grep.c:1934
 #, c-format
 msgid "'%s': short read"
 msgstr "'%s': lectura corta"
@@ -4219,41 +4358,41 @@
 msgid "Low-level Commands / Internal Helpers"
 msgstr "Comandos de bajo nivel / Auxiliares internos"
 
-#: help.c:298
+#: help.c:300
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "comandos disponibles de git en '%s'"
 
-#: help.c:305
+#: help.c:307
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "comandos disponibles de git desde otro lugar en tu $PATH"
 
-#: help.c:314
+#: help.c:316
 msgid "These are common Git commands used in various situations:"
 msgstr "Estos son comandos comunes de Git usados en varias situaciones:"
 
-#: help.c:363 git.c:99
+#: help.c:365 git.c:100
 #, c-format
 msgid "unsupported command listing type '%s'"
 msgstr "comando de listado de tipos no soportado '%s'"
 
-#: help.c:403
-msgid "The common Git guides are:"
-msgstr "Las guías comunes de Git son:"
+#: help.c:405
+msgid "The Git concept guides are:"
+msgstr "Las guías de conceptos de Git son:"
 
-#: help.c:427
+#: help.c:429
 msgid "See 'git help <command>' to read about a specific subcommand"
 msgstr "Vea 'git help <comando>' para leer sobre los subcomandos específicos"
 
-#: help.c:432
+#: help.c:434
 msgid "External commands"
 msgstr "Comandos externos"
 
-#: help.c:447
+#: help.c:449
 msgid "Command aliases"
 msgstr "Aliases de comando"
 
-#: help.c:511
+#: help.c:527
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -4262,31 +4401,31 @@
 "'%s' parece ser un comando de git, pero no hemos\n"
 "podido ejecutarlo. ¿Tal vez git-%s se ha roto?"
 
-#: help.c:570
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "Oh oh. Tu sistema no reporta ningún comando de Git."
-
-#: help.c:592
-#, c-format
-msgid "WARNING: You called a Git command named '%s', which does not exist."
-msgstr "PELIGRO: Has llamado a un comando de Git '%s', el cual no existe."
-
-#: help.c:597
-#, c-format
-msgid "Continuing under the assumption that you meant '%s'."
-msgstr "Continuando asumiendo que quisiste decir '%s'."
-
-#: help.c:602
-#, c-format
-msgid "Continuing in %0.1f seconds, assuming that you meant '%s'."
-msgstr "Continuando en %0.1f segundos, asumiendo que tu dijiste '%s'."
-
-#: help.c:610
+#: help.c:543 help.c:631
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: '%s'no es un comando de git. Mira 'git --help'."
 
-#: help.c:614
+#: help.c:591
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "Oh oh. Tu sistema no reporta ningún comando de Git."
+
+#: help.c:613
+#, c-format
+msgid "WARNING: You called a Git command named '%s', which does not exist."
+msgstr "PELIGRO: Has llamado a un comando de Git '%s', el cual no existe."
+
+#: help.c:618
+#, c-format
+msgid "Continuing under the assumption that you meant '%s'."
+msgstr "Continuando asumiendo que quisiste decir '%s'."
+
+#: help.c:623
+#, c-format
+msgid "Continuing in %0.1f seconds, assuming that you meant '%s'."
+msgstr "Continuando en %0.1f segundos, asumiendo que tu dijiste '%s'."
+
+#: help.c:635
 msgid ""
 "\n"
 "The most similar command is"
@@ -4300,16 +4439,16 @@
 "\n"
 "Los comandos más similares son"
 
-#: help.c:654
+#: help.c:675
 msgid "git version [<options>]"
 msgstr "git versión [<opciones>]"
 
-#: help.c:709
+#: help.c:730
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s - %s"
 
-#: help.c:713
+#: help.c:734
 msgid ""
 "\n"
 "Did you mean this?"
@@ -4323,7 +4462,15 @@
 "\n"
 "¿Quisiste decir alguno de estos?"
 
-#: ident.c:349
+#: ident.c:353
+msgid "Author identity unknown\n"
+msgstr "Identidad del autor desconocido\n"
+
+#: ident.c:356
+msgid "Committer identity unknown\n"
+msgstr "Se desconoce la identidad del autor\n"
+
+#: ident.c:362
 msgid ""
 "\n"
 "*** Please tell me who you are.\n"
@@ -4349,66 +4496,66 @@
 "Omite --global para configurar tu identidad solo en este repositorio.\n"
 "\n"
 
-#: ident.c:379
+#: ident.c:397
 msgid "no email was given and auto-detection is disabled"
 msgstr "no se entrego ningún email y la detección automática está desactivada"
 
-#: ident.c:384
+#: ident.c:402
 #, c-format
 msgid "unable to auto-detect email address (got '%s')"
 msgstr "no es posible auto-detectar la dirección de correo (se obtuvo '%s')"
 
-#: ident.c:401
+#: ident.c:419
 msgid "no name was given and auto-detection is disabled"
 msgstr "no se entrego ningún nombre y la detección automática está desactivada"
 
-#: ident.c:407
+#: ident.c:425
 #, c-format
 msgid "unable to auto-detect name (got '%s')"
 msgstr "no es posible auto-detectar el nombre (se obtuvo '%s')"
 
-#: ident.c:415
+#: ident.c:433
 #, c-format
 msgid "empty ident name (for <%s>) not allowed"
 msgstr "no se puede tener un nombre vacío (para <%s>)"
 
-#: ident.c:421
+#: ident.c:439
 #, c-format
 msgid "name consists only of disallowed characters: %s"
 msgstr "el nombre consiste solo de caracteres no permitidos: %s"
 
-#: ident.c:436 builtin/commit.c:634
+#: ident.c:454 builtin/commit.c:634
 #, c-format
 msgid "invalid date format: %s"
 msgstr "formato de fecha inválido: %s"
 
-#: list-objects-filter-options.c:58
+#: list-objects-filter-options.c:81
 msgid "expected 'tree:<depth>'"
 msgstr "se esperaba 'tree:<depth>'"
 
-#: list-objects-filter-options.c:73
+#: list-objects-filter-options.c:96
 msgid "sparse:path filters support has been dropped"
 msgstr "soporte para filtros sparse:path ha sido discontinuado"
 
-#: list-objects-filter-options.c:86
+#: list-objects-filter-options.c:109
 #, c-format
 msgid "invalid filter-spec '%s'"
 msgstr "filtro -spec inválido '%s'"
 
-#: list-objects-filter-options.c:102
+#: list-objects-filter-options.c:125
 #, c-format
 msgid "must escape char in sub-filter-spec: '%c'"
 msgstr "tienes que escapar el caracter en sub-filter-spec: '%c'"
 
-#: list-objects-filter-options.c:144
+#: list-objects-filter-options.c:167
 msgid "expected something after combine:"
 msgstr "se espera algo luego de combine:"
 
-#: list-objects-filter-options.c:226
+#: list-objects-filter-options.c:249
 msgid "multiple filter-specs cannot be combined"
 msgstr "no se pueden combinar múltiples tipos de especificaciones de filtro"
 
-#: list-objects-filter-options.c:330
+#: list-objects-filter-options.c:361
 msgid "unable to upgrade repository format to support partial clone"
 msgstr ""
 "no es posible actualizar el formato del repositorio para soportar clonado "
@@ -4464,10 +4611,266 @@
 msgid "Unable to create '%s.lock': %s"
 msgstr "No se pudo crear '%s.lock': %s"
 
-#: ls-refs.c:109
+#: ls-refs.c:37
+#, c-format
+msgid "invalid value '%s' for lsrefs.unborn"
+msgstr "valor inválido '%s' para lsrefs.unborn"
+
+#: ls-refs.c:167
 msgid "expected flush after ls-refs arguments"
 msgstr "se esperaba un flush luego de argumentos ls-refs"
 
+#: merge-ort.c:888 merge-recursive.c:1191
+#, c-format
+msgid "Failed to merge submodule %s (not checked out)"
+msgstr "Falló al fusionar el submódulo %s (no revisado)"
+
+#: merge-ort.c:897 merge-recursive.c:1198
+#, c-format
+msgid "Failed to merge submodule %s (commits not present)"
+msgstr "Falló al fusionar el submódulo %s (commits no presentes)"
+
+#: merge-ort.c:906 merge-recursive.c:1205
+#, c-format
+msgid "Failed to merge submodule %s (commits don't follow merge-base)"
+msgstr "Falló el fusionar submódulo %s (commits no siguen la fusión base)"
+
+#: merge-ort.c:916 merge-ort.c:923
+#, c-format
+msgid "Note: Fast-forwarding submodule %s to %s"
+msgstr "Nota: Fast-forward de submódulo %s a %s"
+
+#: merge-ort.c:944
+#, c-format
+msgid "Failed to merge submodule %s"
+msgstr "falló al fusionar el submódulo %s"
+
+#: merge-ort.c:951
+#, c-format
+msgid ""
+"Failed to merge submodule %s, but a possible merge resolution exists:\n"
+"%s\n"
+msgstr ""
+"Falló al fusionar el submódulo %s, pero existen posibles soluciones de "
+"fusión:\n"
+"%s\n"
+
+#: merge-ort.c:955 merge-recursive.c:1259
+#, c-format
+msgid ""
+"If this is correct simply add it to the index for example\n"
+"by using:\n"
+"\n"
+"  git update-index --cacheinfo 160000 %s \"%s\"\n"
+"\n"
+"which will accept this suggestion.\n"
+msgstr ""
+"Si esto es correcto simplemente agrégalo al índice por ejemplo\n"
+"usando:\n"
+"\n"
+"  git update-index --cacheinfo 160000 %s \"%s\"\n"
+"\n"
+"el cual aceptará esta sugerencia.\n"
+
+#: merge-ort.c:968
+#, c-format
+msgid ""
+"Failed to merge submodule %s, but multiple possible merges exist:\n"
+"%s"
+msgstr ""
+"Falló al fusionar el submódulo %s, pero existen múltipes fusiones posibles:\n"
+"%s"
+
+#: merge-ort.c:1127 merge-recursive.c:1341
+msgid "Failed to execute internal merge"
+msgstr "Falló al ejecutar la fusión interna"
+
+#: merge-ort.c:1132 merge-recursive.c:1346
+#, c-format
+msgid "Unable to add %s to database"
+msgstr "No es posible agregar %s a la base de datos"
+
+#: merge-ort.c:1139 merge-recursive.c:1378
+#, c-format
+msgid "Auto-merging %s"
+msgstr "Auto-fusionando %s"
+
+#: merge-ort.c:1278 merge-recursive.c:2100
+#, c-format
+msgid ""
+"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
+"implicit directory rename(s) putting the following path(s) there: %s."
+msgstr ""
+"CONFLICTO (cambio de nombre de directorio implícito): Archivo/directorio "
+"existente en %s se interpone con el cambio de nombres implícito, poniendo "
+"la(s) siguiente(s) ruta(s) aquí: %s."
+
+#: merge-ort.c:1288 merge-recursive.c:2110
+#, c-format
+msgid ""
+"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
+"implicit directory renames tried to put these paths there: %s"
+msgstr ""
+"CONFLICTO (cambio de nombre implícito): No se puede mapear más de una ruta "
+"para %s; cambio de nombre implícito intentó poner estas rutas: %s"
+
+#: merge-ort.c:1471
+#, c-format
+msgid ""
+"CONFLICT (directory rename split): Unclear where to rename %s to; it was "
+"renamed to multiple other directories, with no destination getting a "
+"majority of the files."
+msgstr ""
+"CONFLICTO (división de cambio de nombre de directorio): No está claro dónde "
+"cambiar el nombre de %s; se le cambió el nombre a varios otros directorios, "
+"sin que ningún destino obtenga la mayoría de los archivos."
+
+#: merge-ort.c:1637 merge-recursive.c:2447
+#, c-format
+msgid ""
+"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
+"renamed."
+msgstr ""
+"PELIGRO: Evitando aplicar %s -> %s renombrado a %s, porque %s mismo fue "
+"renombrado."
+
+#: merge-ort.c:1781 merge-recursive.c:3215
+#, c-format
+msgid ""
+"Path updated: %s added in %s inside a directory that was renamed in %s; "
+"moving it to %s."
+msgstr ""
+"Path actualizado: %s agregado en %s dentro de un directorio que fue "
+"renombrado en %s; moviéndolo a %s."
+
+#: merge-ort.c:1788 merge-recursive.c:3222
+#, c-format
+msgid ""
+"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
+"%s; moving it to %s."
+msgstr ""
+"Path actualizado: %s renombrado a %s en %s, dentro de un directorio que fue "
+"renombrado en %s; moviéndolo a %s."
+
+#: merge-ort.c:1801 merge-recursive.c:3218
+#, c-format
+msgid ""
+"CONFLICT (file location): %s added in %s inside a directory that was renamed "
+"in %s, suggesting it should perhaps be moved to %s."
+msgstr ""
+"CONFLICTO (ubicación de archivo): %s agregado en %s dentro de un directorio "
+"que fue renombrado en %s, sugerimos que debería ser movido a %s."
+
+#: merge-ort.c:1809 merge-recursive.c:3225
+#, c-format
+msgid ""
+"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
+"was renamed in %s, suggesting it should perhaps be moved to %s."
+msgstr ""
+"CONFLICTO (ubicación de archivo): %s renombrado a %s en %s, dentro de un "
+"directorio que fue renombrado en %s, sugiriendo que tal vez debería ser "
+"movido a %s."
+
+#: merge-ort.c:1952
+#, c-format
+msgid "CONFLICT (rename/rename): %s renamed to %s in %s and to %s in %s."
+msgstr ""
+"CONFLICTO (renombrar / renombrar): %s renombrado a %s en %s y %s en %s."
+
+#: merge-ort.c:2047
+#, c-format
+msgid ""
+"CONFLICT (rename involved in collision): rename of %s -> %s has content "
+"conflicts AND collides with another path; this may result in nested conflict "
+"markers."
+msgstr ""
+"CONFLICTO (cambio de nombre involucrado en colisión): cambio de nombre de%s -"
+">%s tiene conflictos de contenido Y colisiona con otra ruta; esto puede "
+"resultar en marcadores de conflicto anidados."
+
+#: merge-ort.c:2066 merge-ort.c:2090
+#, c-format
+msgid "CONFLICT (rename/delete): %s renamed to %s in %s, but deleted in %s."
+msgstr ""
+"CONFLICTO (renombrar / eliminar): %s renombrado a %s en %s, pero eliminado "
+"en %s."
+
+#: merge-ort.c:2735
+#, c-format
+msgid ""
+"CONFLICT (file/directory): directory in the way of %s from %s; moving it to "
+"%s instead."
+msgstr ""
+"CONFLICTO (archivo / directorio): directorio en el camino de%s de%s; "
+"moviéndolo a%s en su lugar."
+
+#: merge-ort.c:2808
+#, c-format
+msgid ""
+"CONFLICT (distinct types): %s had different types on each side; renamed %s "
+"of them so each can be recorded somewhere."
+msgstr ""
+"CONFLICTO (tipos distintos):%s tenía tipos diferentes en cada lado; "
+"renombrado%s de ellos para que cada uno pueda ser grabado en algún lugar."
+
+#: merge-ort.c:2812
+msgid "both"
+msgstr "ambos"
+
+#: merge-ort.c:2812
+msgid "one"
+msgstr "uno"
+
+#: merge-ort.c:2907 merge-recursive.c:3052
+msgid "content"
+msgstr "contenido"
+
+#: merge-ort.c:2909 merge-recursive.c:3056
+msgid "add/add"
+msgstr "agregar/agregar"
+
+#: merge-ort.c:2911 merge-recursive.c:3101
+msgid "submodule"
+msgstr "submódulo"
+
+#: merge-ort.c:2913 merge-recursive.c:3102
+#, c-format
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "CONFLICTO (%s): Conflicto de fusión en %s"
+
+#: merge-ort.c:2938
+#, c-format
+msgid ""
+"CONFLICT (modify/delete): %s deleted in %s and modified in %s.  Version %s "
+"of %s left in tree."
+msgstr ""
+"CONFLICTO (modificar / eliminar): %s eliminado en %s y modificado en %s. "
+"Versión %s de %s restante en el árbol."
+
+#. TRANSLATORS: The %s arguments are: 1) tree hash of a merge
+#. base, and 2-3) the trees for the two trees we're merging.
+#.
+#: merge-ort.c:3406
+#, c-format
+msgid "collecting merge info failed for trees %s, %s, %s"
+msgstr ""
+"La recopilación de información de fusión falló para los árboles %s, %s, %s"
+
+#: merge-ort-wrappers.c:13 merge-recursive.c:3661
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"  %s"
+msgstr ""
+"Los cambios locales de los siguientes archivos serán sobreescritos por "
+"merge:\n"
+"  %s"
+
+#: merge-ort-wrappers.c:33 merge-recursive.c:3436
+#, c-format
+msgid "Already up to date!"
+msgstr "¡Ya está actualizado!"
+
 #: merge-recursive.c:356
 msgid "(bad commit)\n"
 msgstr "(commit erróneo)\n"
@@ -4526,21 +4929,6 @@
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "no se que hacer con %06o %s '%s'"
 
-#: merge-recursive.c:1191
-#, c-format
-msgid "Failed to merge submodule %s (not checked out)"
-msgstr "Falló al fusionar el submódulo %s (no revisado)"
-
-#: merge-recursive.c:1198
-#, c-format
-msgid "Failed to merge submodule %s (commits not present)"
-msgstr "Falló al fusionar el submódulo %s (commits no presentes)"
-
-#: merge-recursive.c:1205
-#, c-format
-msgid "Failed to merge submodule %s (commits don't follow merge-base)"
-msgstr "Falló el fusionar submódulo %s (commits no siguen la fusión base)"
-
 #: merge-recursive.c:1213 merge-recursive.c:1225
 #, c-format
 msgid "Fast-forwarding submodule %s to the following commit:"
@@ -4566,42 +4954,11 @@
 msgid "Found a possible merge resolution for the submodule:\n"
 msgstr "Se encontró una posible solución de fusión para el submódulo:\n"
 
-#: merge-recursive.c:1259
-#, c-format
-msgid ""
-"If this is correct simply add it to the index for example\n"
-"by using:\n"
-"\n"
-"  git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"which will accept this suggestion.\n"
-msgstr ""
-"Si esto es correcto simplemente agrégalo al índice por ejemplo\n"
-"usando:\n"
-"\n"
-"  git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"el cual aceptará esta sugerencia.\n"
-
 #: merge-recursive.c:1268
 #, c-format
 msgid "Failed to merge submodule %s (multiple merges found)"
 msgstr "Falló al fusionar el submódulo %s (fusiones múltiples encontradas)"
 
-#: merge-recursive.c:1341
-msgid "Failed to execute internal merge"
-msgstr "Falló al ejecutar la fusión interna"
-
-#: merge-recursive.c:1346
-#, c-format
-msgid "Unable to add %s to database"
-msgstr "No es posible agregar %s a la base de datos"
-
-#: merge-recursive.c:1378
-#, c-format
-msgid "Auto-merging %s"
-msgstr "Auto-fusionando %s"
-
 #: merge-recursive.c:1402
 #, c-format
 msgid "Error: Refusing to lose untracked file at %s; writing to %s instead."
@@ -4713,25 +5070,6 @@
 "colocar %s porque el directorio %s fue renombrado a otros múltiples "
 "directorios, sin ningún que contenga la mayoría de archivos."
 
-#: merge-recursive.c:2100
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
-"implicit directory rename(s) putting the following path(s) there: %s."
-msgstr ""
-"CONFLICTO (cambio de nombre de directorio implícito): Archivo/directorio "
-"existente en %s se interpone con el cambio de nombres implícito, poniendo "
-"la(s) siguiente(s) ruta(s) aquí: %s."
-
-#: merge-recursive.c:2110
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
-"implicit directory renames tried to put these paths there: %s"
-msgstr ""
-"CONFLICTO (cambio de nombre implícito): No se puede mapear más de una ruta "
-"para %s; cambio de nombre implícito intentó poner estas rutas: %s"
-
 #: merge-recursive.c:2202
 #, c-format
 msgid ""
@@ -4741,15 +5079,6 @@
 "CONFLICTO (renombrar/renombrar): Renombrar directorio %s->%s en %s. "
 "Renombrar directorio %s->%s en %s"
 
-#: merge-recursive.c:2447
-#, c-format
-msgid ""
-"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
-"renamed."
-msgstr ""
-"PELIGRO: Evitando aplicar %s -> %s renombrado a %s, porque %s mismo fue "
-"renombrado."
-
 #: merge-recursive.c:2973
 #, c-format
 msgid "cannot read object %s"
@@ -4768,70 +5097,16 @@
 msgid "modified"
 msgstr "modificado"
 
-#: merge-recursive.c:3052
-msgid "content"
-msgstr "contenido"
-
-#: merge-recursive.c:3056
-msgid "add/add"
-msgstr "agregar/agregar"
-
 #: merge-recursive.c:3079
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Saltado %s (fusionado como existente)"
 
-#: merge-recursive.c:3101 git-submodule.sh:959
-msgid "submodule"
-msgstr "submódulo"
-
-#: merge-recursive.c:3102
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "CONFLICTO (%s): Conflicto de fusión en %s"
-
 #: merge-recursive.c:3132
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Agregando más bien como %s"
 
-#: merge-recursive.c:3215
-#, c-format
-msgid ""
-"Path updated: %s added in %s inside a directory that was renamed in %s; "
-"moving it to %s."
-msgstr ""
-"Path actualizado: %s agregado en %s dentro de un directorio que fue "
-"renombrado en %s; moviéndolo a %s."
-
-#: merge-recursive.c:3218
-#, c-format
-msgid ""
-"CONFLICT (file location): %s added in %s inside a directory that was renamed "
-"in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-"CONFLICTO (ubicación de archivo): %s agregado en %s dentro de un directorio "
-"que fue renombrado en %s, sugerimos que debería ser movido a %s."
-
-#: merge-recursive.c:3222
-#, c-format
-msgid ""
-"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
-"%s; moving it to %s."
-msgstr ""
-"Path actualizado: %s renombrado a %s en %s, dentro de un directorio que fue "
-"renombrado en %s; moviéndolo a %s."
-
-#: merge-recursive.c:3225
-#, c-format
-msgid ""
-"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
-"was renamed in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-"CONFLICTO (ubicación de archivo): %s renombrado a %s en %s, dentro de un "
-"directorio que fue renombrado en %s, sugiriendo que tal vez debería ser "
-"movido a %s."
-
 #: merge-recursive.c:3339
 #, c-format
 msgid "Removing %s"
@@ -4862,46 +5137,33 @@
 msgid "CONFLICT (add/add): Merge conflict in %s"
 msgstr "CONFLICTO (add/add): Conflicto de merge en %s"
 
-#: merge-recursive.c:3436
-msgid "Already up to date!"
-msgstr "¡Ya está actualizado!"
-
 #: merge-recursive.c:3445
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "falló la fusión de los árboles %s y %s"
 
-#: merge-recursive.c:3549
+#: merge-recursive.c:3539
 msgid "Merging:"
 msgstr "Fusionando:"
 
-#: merge-recursive.c:3562
+#: merge-recursive.c:3552
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "se encontró %u ancestro común:"
 msgstr[1] "se encontraron %u ancestros comunes:"
 
-#: merge-recursive.c:3612
+#: merge-recursive.c:3602
 msgid "merge returned no commit"
 msgstr "la fusión no devolvió ningún commit"
 
-#: merge-recursive.c:3671
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"  %s"
-msgstr ""
-"Los cambios locales de los siguientes archivos serán sobreescritos por "
-"merge:\n"
-"  %s"
-
-#: merge-recursive.c:3768
+#: merge-recursive.c:3758
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "No se pudo analizar el objeto '%s'"
 
-#: merge-recursive.c:3786 builtin/merge.c:705 builtin/merge.c:885
+#: merge-recursive.c:3776 builtin/merge.c:712 builtin/merge.c:896
+#: builtin/stash.c:471
 msgid "Unable to write index."
 msgstr "Incapaz de escribir el índice."
 
@@ -4909,187 +5171,181 @@
 msgid "failed to read the cache"
 msgstr "falló al leer la cache"
 
-#: merge.c:108 rerere.c:720 builtin/am.c:1878 builtin/am.c:1912
-#: builtin/checkout.c:559 builtin/checkout.c:822 builtin/clone.c:816
+#: merge.c:109 rerere.c:704 builtin/am.c:1883 builtin/am.c:1917
+#: builtin/checkout.c:575 builtin/checkout.c:828 builtin/clone.c:817
 #: builtin/stash.c:265
 msgid "unable to write new index file"
 msgstr "no es posible escribir el archivo índice"
 
-#: midx.c:68
+#: midx.c:62
+msgid "multi-pack-index OID fanout is of the wrong size"
+msgstr ""
+"El abanico de OID de índice de paquetes múltiples es del tamaño incorrecto"
+
+#: midx.c:93
 #, c-format
 msgid "multi-pack-index file %s is too small"
 msgstr "archivo multi-pack-index %s es muy pequeño"
 
-#: midx.c:84
+#: midx.c:109
 #, c-format
 msgid "multi-pack-index signature 0x%08x does not match signature 0x%08x"
 msgstr "firma de multi-pack-index 0x%08x no concuerda con firma 0x%08x"
 
-#: midx.c:89
+#: midx.c:114
 #, c-format
 msgid "multi-pack-index version %d not recognized"
 msgstr "versión %d de multi-pack-index no reconocida"
 
-#: midx.c:94
+#: midx.c:119
 #, c-format
-msgid "hash version %u does not match"
-msgstr "versión de hash %u no concuerda"
-
-#: midx.c:108
-msgid "invalid chunk offset (too large)"
-msgstr "offset inválido del conjunto (muy grande)"
-
-#: midx.c:132
-msgid "terminating multi-pack-index chunk id appears earlier than expected"
+msgid "multi-pack-index hash version %u does not match version %u"
 msgstr ""
-"terminando multi-pack-index porque el id del conjunto aparece antes de lo "
-"esperado"
+"La versión de hash de índice de paquetes múltiples %u no coincide con la "
+"versión %u"
 
-#: midx.c:145
+#: midx.c:136
 msgid "multi-pack-index missing required pack-name chunk"
 msgstr "multi-pack-index le falta el conjunto pack-name requerido"
 
-#: midx.c:147
+#: midx.c:138
 msgid "multi-pack-index missing required OID fanout chunk"
 msgstr "multi-pack-index le falta el conjunto OID fanout requerido"
 
-#: midx.c:149
+#: midx.c:140
 msgid "multi-pack-index missing required OID lookup chunk"
 msgstr "multi-pack-index le falta el conjunto OID fanout requerido"
 
-#: midx.c:151
+#: midx.c:142
 msgid "multi-pack-index missing required object offsets chunk"
 msgstr "multi-pack-index le falta el conjunto de offset del objeto requerido"
 
-#: midx.c:165
+#: midx.c:158
 #, c-format
 msgid "multi-pack-index pack names out of order: '%s' before '%s'"
 msgstr "multi-pack-index nombres de paquete fuera de orden:'%s' antes '%s'"
 
-#: midx.c:208
+#: midx.c:202
 #, c-format
 msgid "bad pack-int-id: %u (%u total packs)"
 msgstr "mal pack-int-id: %u (%u paquetes totales)"
 
-#: midx.c:258
+#: midx.c:252
 msgid "multi-pack-index stores a 64-bit offset, but off_t is too small"
 msgstr "multi-pack-index guarda un offset de 64-bit, pero off_t es muy pequeño"
 
-#: midx.c:286
-msgid "error preparing packfile from multi-pack-index"
-msgstr "error preparando packfile de multi-pack-index"
-
-#: midx.c:470
+#: midx.c:467
 #, c-format
 msgid "failed to add packfile '%s'"
 msgstr "falló al agregar packfile '%s'"
 
-#: midx.c:476
+#: midx.c:473
 #, c-format
 msgid "failed to open pack-index '%s'"
 msgstr "falló al abrir pack-index '%s'"
 
-#: midx.c:536
+#: midx.c:533
 #, c-format
 msgid "failed to locate object %d in packfile"
 msgstr "falló al ubicar objeto %d en packfile"
 
-#: midx.c:840
+#: midx.c:821
 msgid "Adding packfiles to multi-pack-index"
 msgstr "Agregando packfiles a multi-pack-index"
 
-#: midx.c:873
+#: midx.c:855
 #, c-format
 msgid "did not see pack-file %s to drop"
 msgstr "no se vió pack-file %s caer"
 
-#: midx.c:925
+#: midx.c:904
 msgid "no pack files to index."
 msgstr "no hay archivos pack para indexar."
 
-#: midx.c:977
-msgid "Writing chunks to multi-pack-index"
-msgstr "Escribiendo chunks a multi-pack-index"
-
-#: midx.c:1056
+#: midx.c:965
 #, c-format
 msgid "failed to clear multi-pack-index at %s"
 msgstr "falló al limpiar multi-pack-index en %s"
 
-#: midx.c:1112
+#: midx.c:1021
+msgid "multi-pack-index file exists, but failed to parse"
+msgstr ""
+"El archivo de índice de paquetes múltiples existe, pero no se pudo analizar"
+
+#: midx.c:1029
 msgid "Looking for referenced packfiles"
 msgstr "Buscando por packfiles referidos"
 
-#: midx.c:1127
+#: midx.c:1044
 #, c-format
 msgid ""
 "oid fanout out of order: fanout[%d] = %<PRIx32> > %<PRIx32> = fanout[%d]"
 msgstr ""
 "oid fanout fuera de orden: fanout[%d] = %<PRIx32> > %<PRIx32> = fanout[%d]"
 
-#: midx.c:1132
+#: midx.c:1049
 msgid "the midx contains no oid"
 msgstr "el midx no contiene oid"
 
-#: midx.c:1141
+#: midx.c:1058
 msgid "Verifying OID order in multi-pack-index"
 msgstr "Verificando orden de OID en multi-pack-index"
 
-#: midx.c:1150
+#: midx.c:1067
 #, c-format
 msgid "oid lookup out of order: oid[%d] = %s >= %s = oid[%d]"
 msgstr "oid lookup fuera de orden: oid[%d] = %s >= %s = oid[%d]"
 
-#: midx.c:1170
+#: midx.c:1087
 msgid "Sorting objects by packfile"
 msgstr "Ordenando objetos por packfile"
 
-#: midx.c:1177
+#: midx.c:1094
 msgid "Verifying object offsets"
 msgstr "Verificando offsets de objetos"
 
-#: midx.c:1193
+#: midx.c:1110
 #, c-format
 msgid "failed to load pack entry for oid[%d] = %s"
 msgstr "fallo al cargar entrada pack para oid[%d] = %s"
 
-#: midx.c:1199
+#: midx.c:1116
 #, c-format
 msgid "failed to load pack-index for packfile %s"
 msgstr "falló al cargar el pack-index para packfile %s"
 
-#: midx.c:1208
+#: midx.c:1125
 #, c-format
 msgid "incorrect object offset for oid[%d] = %s: %<PRIx64> != %<PRIx64>"
 msgstr "offset para objeto incorrecto oid[%d] = %s: %<PRIx64> != %<PRIx64>"
 
-#: midx.c:1233
+#: midx.c:1150
 msgid "Counting referenced objects"
 msgstr "Contando objetos no referenciados"
 
-#: midx.c:1243
+#: midx.c:1160
 msgid "Finding and deleting unreferenced packfiles"
 msgstr "Encontrando y borrando packfiles sin referencias"
 
-#: midx.c:1433
+#: midx.c:1351
 msgid "could not start pack-objects"
 msgstr "no se pudo empezar los pack-objetcts"
 
-#: midx.c:1452
+#: midx.c:1371
 msgid "could not finish pack-objects"
 msgstr "no se pudo finalizar pack-objetcts"
 
-#: name-hash.c:537
+#: name-hash.c:538
 #, c-format
 msgid "unable to create lazy_dir thread: %s"
 msgstr "no es posible crear hilo lazy_dir: %s"
 
-#: name-hash.c:559
+#: name-hash.c:560
 #, c-format
 msgid "unable to create lazy_name thread: %s"
 msgstr "no es posible crear hilo lazy_name: %s"
 
-#: name-hash.c:565
+#: name-hash.c:566
 #, c-format
 msgid "unable to join lazy_name thread: %s"
 msgstr "no es posible unir hilo lazy_name: %s"
@@ -5136,6 +5392,363 @@
 msgid "Bad %s value: '%s'"
 msgstr "Valor erróneo para %s: '%s'"
 
+#: object-file.c:480
+#, c-format
+msgid "object directory %s does not exist; check .git/objects/info/alternates"
+msgstr "objeto directorio %s no existe; revisa .git/objects/info/alternates"
+
+#: object-file.c:531
+#, c-format
+msgid "unable to normalize alternate object path: %s"
+msgstr "incapaz de normalizar la ruta de objeto alterno: %s"
+
+#: object-file.c:603
+#, c-format
+msgid "%s: ignoring alternate object stores, nesting too deep"
+msgstr "%s: ignorando espacios de objetos alternos, anidado muy profundo"
+
+#: object-file.c:610
+#, c-format
+msgid "unable to normalize object directory: %s"
+msgstr "incapaz de normalizar directorio de objeto: %s"
+
+#: object-file.c:653
+msgid "unable to fdopen alternates lockfile"
+msgstr "no es posible hacer fdopen en lockfile alternos"
+
+#: object-file.c:671
+msgid "unable to read alternates file"
+msgstr "no es posible leer archivos alternos"
+
+#: object-file.c:678
+msgid "unable to move new alternates file into place"
+msgstr "no es posible mover archivos alternos en el lugar"
+
+#: object-file.c:713
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "ruta '%s' no existe"
+
+#: object-file.c:734
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr ""
+"repositorio de referencia '%s' como un checkout vinculado no es soportado "
+"todavía."
+
+#: object-file.c:740
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "repositorio de referencia '%s' no es un repositorio local."
+
+#: object-file.c:746
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "repositorio de referencia '%s' es superficial (shallow)"
+
+#: object-file.c:754
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "repositorio de referencia '% s' está injertado"
+
+#: object-file.c:814
+#, c-format
+msgid "invalid line while parsing alternate refs: %s"
+msgstr "línea inválida mientras se analizaban refs alternas: %s"
+
+#: object-file.c:964
+#, c-format
+msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
+msgstr "intentando usar mmap %<PRIuMAX> sobre límite %<PRIuMAX>"
+
+#: object-file.c:985
+msgid "mmap failed"
+msgstr "mmap falló"
+
+#: object-file.c:1149
+#, c-format
+msgid "object file %s is empty"
+msgstr "archivo de objeto %s está vacío"
+
+#: object-file.c:1284 object-file.c:2477
+#, c-format
+msgid "corrupt loose object '%s'"
+msgstr "objeto perdido corrupto '%s'"
+
+#: object-file.c:1286 object-file.c:2481
+#, c-format
+msgid "garbage at end of loose object '%s'"
+msgstr "basura al final del objeto perdido '%s'"
+
+#: object-file.c:1328
+msgid "invalid object type"
+msgstr "tipo de objeto inválido"
+
+#: object-file.c:1412
+#, c-format
+msgid "unable to unpack %s header with --allow-unknown-type"
+msgstr "no es posible desempacar header %s con --allow-unknown-type"
+
+#: object-file.c:1415
+#, c-format
+msgid "unable to unpack %s header"
+msgstr "incapaz de desempaquetar header %s"
+
+#: object-file.c:1421
+#, c-format
+msgid "unable to parse %s header with --allow-unknown-type"
+msgstr "no es posible analizar header %s con --allow-unknown-type"
+
+#: object-file.c:1424
+#, c-format
+msgid "unable to parse %s header"
+msgstr "incapaz de analizar header %s"
+
+#: object-file.c:1651
+#, c-format
+msgid "failed to read object %s"
+msgstr "falló al leer objeto %s"
+
+#: object-file.c:1655
+#, c-format
+msgid "replacement %s not found for %s"
+msgstr "reemplazo %s no encontrado para %s"
+
+#: object-file.c:1659
+#, c-format
+msgid "loose object %s (stored in %s) is corrupt"
+msgstr "objeto perdido %s (guardado en %s) está corrompido"
+
+#: object-file.c:1663
+#, c-format
+msgid "packed object %s (stored in %s) is corrupt"
+msgstr "paquete de objeto %s (guardado en %s) está corrompido"
+
+#: object-file.c:1768
+#, c-format
+msgid "unable to write file %s"
+msgstr "no es posible escribir archivo %s"
+
+#: object-file.c:1775
+#, c-format
+msgid "unable to set permission to '%s'"
+msgstr "no se pudo poner permisos a '%s'"
+
+#: object-file.c:1782
+msgid "file write error"
+msgstr "falló de escritura"
+
+#: object-file.c:1802
+msgid "error when closing loose object file"
+msgstr "error cerrando el archivo de objeto suelto"
+
+#: object-file.c:1867
+#, c-format
+msgid "insufficient permission for adding an object to repository database %s"
+msgstr ""
+"permisos insuficientes para agregar un objeto a la base de datos del "
+"repositorio %s"
+
+#: object-file.c:1869
+msgid "unable to create temporary file"
+msgstr "no es posible crear un archivo temporal"
+
+#: object-file.c:1893
+msgid "unable to write loose object file"
+msgstr "no es posible escribir el archivo de objeto suelto"
+
+#: object-file.c:1899
+#, c-format
+msgid "unable to deflate new object %s (%d)"
+msgstr "no es posible desinflar el objeto nuevo %s (%d)"
+
+#: object-file.c:1903
+#, c-format
+msgid "deflateEnd on object %s failed (%d)"
+msgstr "deflateEnd en objeto %s falló (%d)"
+
+#: object-file.c:1907
+#, c-format
+msgid "confused by unstable object source data for %s"
+msgstr "confundido por fuente de data de objetos inestable para %s"
+
+#: object-file.c:1917 builtin/pack-objects.c:1097
+#, c-format
+msgid "failed utime() on %s"
+msgstr "falló utime() en %s"
+
+#: object-file.c:1994
+#, c-format
+msgid "cannot read object for %s"
+msgstr "no se pudo leer el objeto para %s"
+
+#: object-file.c:2045
+msgid "corrupt commit"
+msgstr "commit corrupto"
+
+#: object-file.c:2053
+msgid "corrupt tag"
+msgstr "tag corrupto"
+
+#: object-file.c:2153
+#, c-format
+msgid "read error while indexing %s"
+msgstr "error leyendo al indexar %s"
+
+#: object-file.c:2156
+#, c-format
+msgid "short read while indexing %s"
+msgstr "lectura corta al indexar %s"
+
+#: object-file.c:2229 object-file.c:2239
+#, c-format
+msgid "%s: failed to insert into database"
+msgstr "%s: falló al insertar en la base de datos"
+
+#: object-file.c:2245
+#, c-format
+msgid "%s: unsupported file type"
+msgstr "%s: tipo de archivo no soportado"
+
+#: object-file.c:2269
+#, c-format
+msgid "%s is not a valid object"
+msgstr "%s no es objeto válido"
+
+#: object-file.c:2271
+#, c-format
+msgid "%s is not a valid '%s' object"
+msgstr "%s no es un objeto '%s' válido"
+
+#: object-file.c:2298 builtin/index-pack.c:192
+#, c-format
+msgid "unable to open %s"
+msgstr "no es posible abrir %s"
+
+#: object-file.c:2488 object-file.c:2541
+#, c-format
+msgid "hash mismatch for %s (expected %s)"
+msgstr "hash no concuerda para %s (se esperaba %s)"
+
+#: object-file.c:2512
+#, c-format
+msgid "unable to mmap %s"
+msgstr "no es posible hacer mmap a %s"
+
+#: object-file.c:2517
+#, c-format
+msgid "unable to unpack header of %s"
+msgstr "incapaz de desempaquetar header de %s"
+
+#: object-file.c:2523
+#, c-format
+msgid "unable to parse header of %s"
+msgstr "incapaz de analizar header de %s"
+
+#: object-file.c:2534
+#, c-format
+msgid "unable to unpack contents of %s"
+msgstr "no es posible desempaquetar contenidos de %s"
+
+#: object-name.c:486
+#, c-format
+msgid "short object ID %s is ambiguous"
+msgstr "El ID de objeto corto %s es ambiguo"
+
+#: object-name.c:497
+msgid "The candidates are:"
+msgstr "Los candidatos son:"
+
+#: object-name.c:796
+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 switch -c $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 normalmente nunca crea una ref que termine con 40 caracteres hex\n"
+"porque esto sería ignorado cuando solo se especifiquen 40-hex. Estas refs\n"
+"tal vez sean creadas por error. Por ejemplo,\n"
+"\n"
+"  git switch -c $br $(git rev-parse ...)\n"
+"\n"
+"donde \"$br\" está de alguna manera vacía y una ref de 40-hex es creada. Por "
+"favor\n"
+"examina estas refs y tal vez bórralas. Silencia este mensaje \n"
+"ejecutando \"git config advice.objectNameWarning false\""
+
+#: object-name.c:916
+#, c-format
+msgid "log for '%.*s' only goes back to %s"
+msgstr "log para '%.*s' solo va hasta %s"
+
+#: object-name.c:924
+#, c-format
+msgid "log for '%.*s' only has %d entries"
+msgstr "log para '%.*s' solo tiene %d entradas"
+
+#: object-name.c:1702
+#, c-format
+msgid "path '%s' exists on disk, but not in '%.*s'"
+msgstr "la ruta '%s' existe en disco, pero no en '%.*s'"
+
+#: object-name.c:1708
+#, c-format
+msgid ""
+"path '%s' exists, but not '%s'\n"
+"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
+msgstr ""
+"ruta '%s' existe, pero no '%s'\n"
+"ayuda: ¿Quisiste decir '%.*s:%s' o '%.*s:./%s'?"
+
+#: object-name.c:1717
+#, c-format
+msgid "path '%s' does not exist in '%.*s'"
+msgstr "ruta '%s' no existe en '%.*s'"
+
+#: object-name.c:1745
+#, c-format
+msgid ""
+"path '%s' is in the index, but not at stage %d\n"
+"hint: Did you mean ':%d:%s'?"
+msgstr ""
+"ruta '%s' está en el index, pero no en stage %d\n"
+"ayuda:¿Quisiste decir: '%d:%s'?"
+
+#: object-name.c:1761
+#, c-format
+msgid ""
+"path '%s' is in the index, but not '%s'\n"
+"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
+msgstr ""
+"ruta '%s' está en el index, pero no '%s'\n"
+"ayuda:¿Quisiste decir ':%d:%s' o ':%d:./%s'?"
+
+#: object-name.c:1769
+#, c-format
+msgid "path '%s' exists on disk, but not in the index"
+msgstr "ruta '%s' existe en el disco, pero no en el index"
+
+#: object-name.c:1771
+#, c-format
+msgid "path '%s' does not exist (neither on disk nor in the index)"
+msgstr "ruta '%s' no existe (ni en disco ni en el index)"
+
+#: object-name.c:1784
+msgid "relative path syntax can't be used outside working tree"
+msgstr ""
+"la sintaxis de ruta relativa no se puede usar fuera del directorio de trabajo"
+
+#: object-name.c:1922
+#, c-format
+msgid "invalid object name '%.*s'."
+msgstr "nombre de objeto no válido: '%.*s'."
+
 #: object.c:53
 #, c-format
 msgid "invalid object type \"%s\""
@@ -5161,22 +5774,71 @@
 msgid "hash mismatch %s"
 msgstr "hash no concuerda %s"
 
-#: pack-bitmap.c:815 pack-bitmap.c:821 builtin/pack-objects.c:2184
+#: pack-bitmap.c:843 pack-bitmap.c:849 builtin/pack-objects.c:2226
 #, c-format
 msgid "unable to get size of %s"
 msgstr "no se pudo obtener el tamaño de %s"
 
-#: packfile.c:630
+#: pack-bitmap.c:1489 builtin/rev-list.c:92
+#, c-format
+msgid "unable to get disk usage of %s"
+msgstr "no se puede obtener el uso de disco de %s"
+
+#: pack-revindex.c:220
+#, c-format
+msgid "reverse-index file %s is too small"
+msgstr "El archivo de índice inverso %s es demasiado pequeño"
+
+#: pack-revindex.c:225
+#, c-format
+msgid "reverse-index file %s is corrupt"
+msgstr "El archivo de índice inverso %s está dañado"
+
+#: pack-revindex.c:233
+#, c-format
+msgid "reverse-index file %s has unknown signature"
+msgstr "El archivo de índice inverso %s tiene una firma desconocida"
+
+#: pack-revindex.c:237
+#, c-format
+msgid "reverse-index file %s has unsupported version %<PRIu32>"
+msgstr "archivo reverse-index %s tiene una versión no soportada %<PRIu32>"
+
+#: pack-revindex.c:242
+#, c-format
+msgid "reverse-index file %s has unsupported hash id %<PRIu32>"
+msgstr "archivo reverse-index %s tiene un id de hash no soportado %<PRIu32>"
+
+#: pack-write.c:236
+msgid "cannot both write and verify reverse index"
+msgstr "no puede escribir y verificar el índice inverso"
+
+#: pack-write.c:257
+#, c-format
+msgid "could not stat: %s"
+msgstr "no se pudo estad: %s"
+
+#: pack-write.c:269
+#, c-format
+msgid "failed to make %s readable"
+msgstr "no pudo hacer %s legible"
+
+#: pack-write.c:508
+#, c-format
+msgid "could not write '%s' promisor file"
+msgstr "no se pudo escribir el archivo promisor '%s'"
+
+#: packfile.c:625
 msgid "offset before end of packfile (broken .idx?)"
 msgstr "offset antes del final del paquete (broken .idx?)"
 
-#: packfile.c:1900
+#: packfile.c:1934
 #, c-format
 msgid "offset before start of pack index for %s (corrupt index?)"
 msgstr ""
 "offset antes del comienzo del índice del paquete para %s (¿índice corrupto?)"
 
-#: packfile.c:1904
+#: packfile.c:1938
 #, c-format
 msgid "offset beyond end of pack index for %s (truncated index?)"
 msgstr ""
@@ -5197,7 +5859,7 @@
 msgid "option `%s' expects \"always\", \"auto\", or \"never\""
 msgstr "opción `%s' puede usar \"always\", \"auto\", o \"never\""
 
-#: parse-options-cb.c:130 parse-options-cb.c:147
+#: parse-options-cb.c:132 parse-options-cb.c:149
 #, c-format
 msgid "malformed object name '%s'"
 msgstr "nombre de objeto mal formado '%s'"
@@ -5242,31 +5904,31 @@
 msgid "did you mean `--%s` (with two dashes)?"
 msgstr "¿quisiste decir `--%s` (con dos guiones)?"
 
-#: parse-options.c:663 parse-options.c:963
+#: parse-options.c:666 parse-options.c:971
 #, c-format
 msgid "alias of --%s"
 msgstr "alias de --%s"
 
-#: parse-options.c:854
+#: parse-options.c:862
 #, c-format
 msgid "unknown option `%s'"
 msgstr "opción `%s' desconocida"
 
-#: parse-options.c:856
+#: parse-options.c:864
 #, c-format
 msgid "unknown switch `%c'"
 msgstr "switch desconocido `%c'"
 
-#: parse-options.c:858
+#: parse-options.c:866
 #, c-format
 msgid "unknown non-ascii option in string: `%s'"
 msgstr "opción desconocida en string no ascii: `%s'"
 
-#: parse-options.c:882
+#: parse-options.c:890
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:901
+#: parse-options.c:909
 #, c-format
 msgid "usage: %s"
 msgstr "uso: %s"
@@ -5274,17 +5936,17 @@
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation.
 #.
-#: parse-options.c:907
+#: parse-options.c:915
 #, c-format
 msgid "   or: %s"
 msgstr "   o: %s"
 
-#: parse-options.c:910
+#: parse-options.c:918
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:949
+#: parse-options.c:957
 msgid "-NUM"
 msgstr "-NUM"
 
@@ -5423,29 +6085,37 @@
 msgid "protocol error: bad line length %d"
 msgstr "error de protocolo: mal largo de línea %d"
 
-#: pkt-line.c:373
+#: pkt-line.c:373 sideband.c:165
 #, c-format
 msgid "remote error: %s"
 msgstr "error remoto: %s"
 
-#: preload-index.c:119
+#: preload-index.c:125
 msgid "Refreshing index"
 msgstr "Refrescando index"
 
-#: preload-index.c:138
+#: preload-index.c:144
 #, c-format
 msgid "unable to create threaded lstat: %s"
 msgstr "no es posible crear lstat hilado: %s"
 
-#: pretty.c:982
+#: pretty.c:984
 msgid "unable to parse --pretty format"
 msgstr "incapaz de analizar el formato --pretty"
 
-#: promisor-remote.c:23
-msgid "Remote with no URL"
-msgstr "Remoto sin URL"
+#: promisor-remote.c:30
+msgid "promisor-remote: unable to fork off fetch subprocess"
+msgstr "promisor-remote: no se puede bifurcar el subproceso de recuperación"
 
-#: promisor-remote.c:58
+#: promisor-remote.c:35 promisor-remote.c:37
+msgid "promisor-remote: could not write to fetch subprocess"
+msgstr "proiso-remote: no se pudo escribir para recuperar el subproceso"
+
+#: promisor-remote.c:41
+msgid "promisor-remote: could not close stdin to fetch subprocess"
+msgstr "promisor-remote: no se pudo cerrar stdin para recuperar el subproceso"
+
+#: promisor-remote.c:53
 #, c-format
 msgid "promisor remote name cannot begin with '/': %s"
 msgstr "nombre remoto promisor no puede comenzar con '/': %s"
@@ -5454,20 +6124,20 @@
 msgid "Removing duplicate objects"
 msgstr "Removiendo objetos duplicados"
 
-#: range-diff.c:77
+#: range-diff.c:78
 msgid "could not start `log`"
 msgstr "no se pudo comenzar `log`"
 
-#: range-diff.c:79
+#: range-diff.c:80
 msgid "could not read `log` output"
 msgstr "no se pudo leer output de `log`"
 
-#: range-diff.c:98 sequencer.c:5143
+#: range-diff.c:101 sequencer.c:5318
 #, c-format
 msgid "could not parse commit '%s'"
 msgstr "no se pudo analizar commit '%s'"
 
-#: range-diff.c:112
+#: range-diff.c:115
 #, c-format
 msgid ""
 "could not parse first line of `log` output: did not start with 'commit ': "
@@ -5476,65 +6146,69 @@
 "no se pudo leer la primera línea de salida `log`: no comienza con 'commit ': "
 "'%s'"
 
-#: range-diff.c:137
+#: range-diff.c:140
 #, c-format
 msgid "could not parse git header '%.*s'"
 msgstr "no se puede analizar git header '%.*s'"
 
-#: range-diff.c:301
+#: range-diff.c:306
 msgid "failed to generate diff"
 msgstr "falló al generar diff"
 
-#: range-diff.c:534 range-diff.c:536
+#: range-diff.c:558
+msgid "--left-only and --right-only are mutually exclusive"
+msgstr "--left-only y --right-only son mutuamente exclusivas"
+
+#: range-diff.c:561 range-diff.c:563
 #, c-format
 msgid "could not parse log for '%s'"
 msgstr "no se pudo leer el log para '%s'"
 
-#: read-cache.c:680
+#: read-cache.c:682
 #, c-format
 msgid "will not add file alias '%s' ('%s' already exists in index)"
 msgstr "no agregará alias de archivo '%s' ('%s' ya existe en el index)"
 
-#: read-cache.c:696
+#: read-cache.c:698
 msgid "cannot create an empty blob in the object database"
 msgstr "no se puede crear un blob vacío en la base de datos de objetos"
 
-#: read-cache.c:718
+#: read-cache.c:720
 #, c-format
 msgid "%s: can only add regular files, symbolic links or git-directories"
 msgstr ""
 "%s: solo puede agregar archivos regulares, symbolic links o git-directories"
 
-#: read-cache.c:723
+#: read-cache.c:725
 #, c-format
 msgid "'%s' does not have a commit checked out"
 msgstr "'%s' no tiene un commit checked out"
 
-#: read-cache.c:775
+#: read-cache.c:777
 #, c-format
 msgid "unable to index file '%s'"
 msgstr "no es posible indexar archivo '%s'"
 
-#: read-cache.c:794
+#: read-cache.c:796
 #, c-format
 msgid "unable to add '%s' to index"
 msgstr "no es posible agregar '%s' al index"
 
-#: read-cache.c:805
+#: read-cache.c:807
 #, c-format
 msgid "unable to stat '%s'"
 msgstr "incapaz de correr stat en '%s'"
 
-#: read-cache.c:1330
+#: read-cache.c:1318
 #, c-format
 msgid "'%s' appears as both a file and as a directory"
 msgstr "'%s' parece ser un directorio y un archivo a la vez"
 
-#: read-cache.c:1536
+#: read-cache.c:1532
 msgid "Refresh index"
 msgstr "Refrescar index"
 
-#: read-cache.c:1651
+#: read-cache.c:1657
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -5543,7 +6217,7 @@
 "index.version configurado, pero el valor no es válido.\n"
 "Usando versión %i"
 
-#: read-cache.c:1661
+#: read-cache.c:1667
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -5552,139 +6226,139 @@
 "GIT_INDEX_VERSION configurado, pero el valor no es válido.\n"
 "Usando versión %i"
 
-#: read-cache.c:1717
+#: read-cache.c:1723
 #, c-format
 msgid "bad signature 0x%08x"
 msgstr "mala firma 0x%08x"
 
-#: read-cache.c:1720
+#: read-cache.c:1726
 #, c-format
 msgid "bad index version %d"
 msgstr "mala versión del índice %d"
 
-#: read-cache.c:1729
+#: read-cache.c:1735
 msgid "bad index file sha1 signature"
 msgstr "mala firma sha1 del archivo index"
 
-#: read-cache.c:1759
+#: read-cache.c:1765
 #, c-format
 msgid "index uses %.4s extension, which we do not understand"
 msgstr "index usa %.4s extensiones, cosa que no entendemos"
 
-#: read-cache.c:1761
+#: read-cache.c:1767
 #, c-format
 msgid "ignoring %.4s extension"
 msgstr "ignorando extensión %.4s"
 
-#: read-cache.c:1798
+#: read-cache.c:1804
 #, c-format
 msgid "unknown index entry format 0x%08x"
 msgstr "formato de index desconocido 0x%08x"
 
-#: read-cache.c:1814
+#: read-cache.c:1820
 #, c-format
 msgid "malformed name field in the index, near path '%s'"
 msgstr "campo nombre malformado en el index, cerca a ruta '%s'"
 
-#: read-cache.c:1871
+#: read-cache.c:1877
 msgid "unordered stage entries in index"
 msgstr "entradas en stage desordenadas en index"
 
-#: read-cache.c:1874
+#: read-cache.c:1880
 #, c-format
 msgid "multiple stage entries for merged file '%s'"
 msgstr "múltiples entradas extrañas para archivo fusionado '%s'"
 
-#: read-cache.c:1877
+#: read-cache.c:1883
 #, c-format
 msgid "unordered stage entries for '%s'"
 msgstr "entradas de stage desordenadas para '%s'"
 
-#: read-cache.c:1983 read-cache.c:2271 rerere.c:565 rerere.c:599 rerere.c:1111
-#: submodule.c:1619 builtin/add.c:532 builtin/check-ignore.c:181
-#: builtin/checkout.c:488 builtin/checkout.c:674 builtin/clean.c:991
-#: builtin/commit.c:364 builtin/diff-tree.c:121 builtin/grep.c:507
-#: builtin/mv.c:145 builtin/reset.c:247 builtin/rm.c:290
+#: read-cache.c:1989 read-cache.c:2280 rerere.c:549 rerere.c:583 rerere.c:1095
+#: submodule.c:1634 builtin/add.c:546 builtin/check-ignore.c:181
+#: builtin/checkout.c:504 builtin/checkout.c:690 builtin/clean.c:991
+#: builtin/commit.c:364 builtin/diff-tree.c:122 builtin/grep.c:505
+#: builtin/mv.c:146 builtin/reset.c:247 builtin/rm.c:290
 #: builtin/submodule--helper.c:332
 msgid "index file corrupt"
 msgstr "archivo índice corrompido"
 
-#: read-cache.c:2124
+#: read-cache.c:2133
 #, c-format
 msgid "unable to create load_cache_entries thread: %s"
 msgstr "no es posible crear hilo load_cache_entries: %s"
 
-#: read-cache.c:2137
+#: read-cache.c:2146
 #, c-format
 msgid "unable to join load_cache_entries thread: %s"
 msgstr "no es posible unir hilo load_cache_entires: %s"
 
-#: read-cache.c:2170
+#: read-cache.c:2179
 #, c-format
 msgid "%s: index file open failed"
 msgstr "%s: falló al abrir el archivo index"
 
-#: read-cache.c:2174
+#: read-cache.c:2183
 #, c-format
 msgid "%s: cannot stat the open index"
 msgstr "%s: no se puede hacer stat del index abierto"
 
-#: read-cache.c:2178
+#: read-cache.c:2187
 #, c-format
 msgid "%s: index file smaller than expected"
 msgstr "%s: archivo index más pequeño de lo esperado"
 
-#: read-cache.c:2182
+#: read-cache.c:2191
 #, c-format
 msgid "%s: unable to map index file"
 msgstr "%s: no se pudo mapear el archivo index"
 
-#: read-cache.c:2224
+#: read-cache.c:2233
 #, c-format
 msgid "unable to create load_index_extensions thread: %s"
 msgstr "no es posible crear hilo load_index_extensions: %s"
 
-#: read-cache.c:2251
+#: read-cache.c:2260
 #, c-format
 msgid "unable to join load_index_extensions thread: %s"
 msgstr "no es posible unir hilo load_index_extensions: %s"
 
-#: read-cache.c:2283
+#: read-cache.c:2292
 #, c-format
 msgid "could not freshen shared index '%s'"
 msgstr "no se pudo refrescar el index compartido '%s'"
 
-#: read-cache.c:2330
+#: read-cache.c:2339
 #, c-format
 msgid "broken index, expect %s in %s, got %s"
 msgstr "index roto, se esperaba %s en %s, se obtuvo %s"
 
-#: read-cache.c:3026 strbuf.c:1171 wrapper.c:630 builtin/merge.c:1130
+#: read-cache.c:3035 strbuf.c:1171 wrapper.c:633 builtin/merge.c:1141
 #, c-format
 msgid "could not close '%s'"
 msgstr "no se pudo cerrar '%s'"
 
-#: read-cache.c:3129 sequencer.c:2355 sequencer.c:4066
+#: read-cache.c:3138 sequencer.c:2487 sequencer.c:4239
 #, c-format
 msgid "could not stat '%s'"
 msgstr "no se pudo definir '%s'"
 
-#: read-cache.c:3142
+#: read-cache.c:3151
 #, c-format
 msgid "unable to open git dir: %s"
 msgstr "no es posible abrir el directorio de git: %s"
 
-#: read-cache.c:3154
+#: read-cache.c:3163
 #, c-format
 msgid "unable to unlink: %s"
 msgstr "no es posible eliminar el vinculo: %s"
 
-#: read-cache.c:3179
+#: read-cache.c:3188
 #, c-format
 msgid "cannot fix permission bits on '%s'"
 msgstr "no se pudo arreglar bits de permisos en '%s'"
 
-#: read-cache.c:3328
+#: read-cache.c:3337
 #, c-format
 msgid "%s: cannot drop to stage #0"
 msgstr "%s: no se puede eliminar a stage #0"
@@ -5755,7 +6429,7 @@
 msgstr[0] "Rebase %s en %s (%d comando)"
 msgstr[1] "Rebase %s en %s (%d comandos)"
 
-#: rebase-interactive.c:72 git-rebase--preserve-merges.sh:228
+#: rebase-interactive.c:72 git-rebase--preserve-merges.sh:218
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
@@ -5763,7 +6437,7 @@
 "\n"
 "No eliminar ninguna línea. Usa 'drop' explícitamente para borrar un commit \n"
 
-#: rebase-interactive.c:75 git-rebase--preserve-merges.sh:232
+#: rebase-interactive.c:75 git-rebase--preserve-merges.sh:222
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
@@ -5771,7 +6445,7 @@
 "\n"
 "Si eliminas una línea aquí EL COMMIT SE PERDERÁ.\n"
 
-#: rebase-interactive.c:81 git-rebase--preserve-merges.sh:871
+#: rebase-interactive.c:81 git-rebase--preserve-merges.sh:861
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
@@ -5785,7 +6459,7 @@
 "    git rebase --continue\n"
 "\n"
 
-#: rebase-interactive.c:86 git-rebase--preserve-merges.sh:948
+#: rebase-interactive.c:86 git-rebase--preserve-merges.sh:938
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
@@ -5795,14 +6469,14 @@
 "Como sea, si quieres borrar todo, el rebase será abortado.\n"
 "\n"
 
-#: rebase-interactive.c:110 rerere.c:485 rerere.c:692 sequencer.c:3463
-#: sequencer.c:3489 sequencer.c:5248 builtin/fsck.c:347 builtin/rebase.c:258
+#: rebase-interactive.c:110 rerere.c:469 rerere.c:676 sequencer.c:3615
+#: sequencer.c:3641 sequencer.c:5424 builtin/fsck.c:329 builtin/rebase.c:272
 #, c-format
 msgid "could not write '%s'"
 msgstr "no se pudo escribir '%s'"
 
-#: rebase-interactive.c:116 builtin/rebase.c:190 builtin/rebase.c:216
-#: builtin/rebase.c:240
+#: rebase-interactive.c:116 builtin/rebase.c:204 builtin/rebase.c:230
+#: builtin/rebase.c:254
 #, c-format
 msgid "could not write '%s'."
 msgstr "no se pudo escribir '%s'."
@@ -5834,14 +6508,14 @@
 "Los posibles comportamientos son: ignore,warn,error.\n"
 "\n"
 
-#: rebase-interactive.c:233 rebase-interactive.c:238 sequencer.c:2274
-#: builtin/rebase.c:176 builtin/rebase.c:201 builtin/rebase.c:227
-#: builtin/rebase.c:252
+#: rebase-interactive.c:233 rebase-interactive.c:238 sequencer.c:2402
+#: builtin/rebase.c:190 builtin/rebase.c:215 builtin/rebase.c:241
+#: builtin/rebase.c:266
 #, c-format
 msgid "could not read '%s'."
 msgstr "no se puede leer '%s'."
 
-#: ref-filter.c:42 wt-status.c:1977
+#: ref-filter.c:42 wt-status.c:1975
 msgid "gone"
 msgstr "desaparecido"
 
@@ -5860,238 +6534,248 @@
 msgid "ahead %d, behind %d"
 msgstr "delante %d, detrás %d"
 
-#: ref-filter.c:165
+#: ref-filter.c:175
 #, c-format
 msgid "expected format: %%(color:<color>)"
 msgstr "formato esperado: %%(color:<color>)"
 
-#: ref-filter.c:167
+#: ref-filter.c:177
 #, c-format
 msgid "unrecognized color: %%(color:%s)"
 msgstr "color no reconocido: %%(color:%s)"
 
-#: ref-filter.c:189
+#: ref-filter.c:199
 #, c-format
 msgid "Integer value expected refname:lstrip=%s"
 msgstr "Valor entero esperado refname:lstrip=%s"
 
-#: ref-filter.c:193
+#: ref-filter.c:203
 #, c-format
 msgid "Integer value expected refname:rstrip=%s"
 msgstr "Valor entero esperado refname:rstrip=%s"
 
-#: ref-filter.c:195
+#: ref-filter.c:205
 #, c-format
 msgid "unrecognized %%(%s) argument: %s"
 msgstr "argumento: %s no reconocido %%(%s)"
 
-#: ref-filter.c:250
+#: ref-filter.c:260
 #, c-format
 msgid "%%(objecttype) does not take arguments"
 msgstr "%%(objecttype) no toma ningún argumento"
 
-#: ref-filter.c:272
+#: ref-filter.c:282
 #, c-format
 msgid "unrecognized %%(objectsize) argument: %s"
 msgstr "%%(objectsize) no reconocido argumento: %s"
 
-#: ref-filter.c:280
+#: ref-filter.c:290
 #, c-format
 msgid "%%(deltabase) does not take arguments"
 msgstr "%%(deltabase) no toma argumentos"
 
-#: ref-filter.c:292
+#: ref-filter.c:302
 #, c-format
 msgid "%%(body) does not take arguments"
 msgstr "%%(body) no toma ningún argumento"
 
-#: ref-filter.c:301
+#: ref-filter.c:315
 #, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) no toma ningún argumento"
+msgid "unrecognized %%(subject) argument: %s"
+msgstr "argumento %%(sujeto) no reconocido: %s"
 
-#: ref-filter.c:323
+#: ref-filter.c:334
+#, c-format
+msgid "expected %%(trailers:key=<value>)"
+msgstr "se esperaba %%(trailers:key=<value>)"
+
+#: ref-filter.c:336
 #, c-format
 msgid "unknown %%(trailers) argument: %s"
 msgstr "%%(trailers) desconocidos, argumento: %s"
 
-#: ref-filter.c:352
+#: ref-filter.c:367
 #, c-format
 msgid "positive value expected contents:lines=%s"
 msgstr "valor positivo esperado contents:lines=%s"
 
-#: ref-filter.c:354
+#: ref-filter.c:369
 #, c-format
 msgid "unrecognized %%(contents) argument: %s"
 msgstr "argumento %s no reconocido %%(contents)"
 
-#: ref-filter.c:369
+#: ref-filter.c:384
 #, c-format
-msgid "positive value expected objectname:short=%s"
-msgstr "valor positivo esperado objectname:short=%s"
+msgid "positive value expected '%s' in %%(%s)"
+msgstr "valor positivo esperado '%s' en %% (%s)"
 
-#: ref-filter.c:373
+#: ref-filter.c:388
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "argumento: %s no reconocido %%(objectname)"
+msgid "unrecognized argument '%s' in %%(%s)"
+msgstr "argumento no reconocido:'%s' en %%(%s)"
 
-#: ref-filter.c:403
+#: ref-filter.c:402
+#, c-format
+msgid "unrecognized email option: %s"
+msgstr "opción de email desconocida: %s"
+
+#: ref-filter.c:432
 #, c-format
 msgid "expected format: %%(align:<width>,<position>)"
 msgstr "formato esperado: %%(align:<ancho>,<posición>)"
 
-#: ref-filter.c:415
+#: ref-filter.c:444
 #, c-format
 msgid "unrecognized position:%s"
 msgstr "posición desconocida: %s"
 
-#: ref-filter.c:422
+#: ref-filter.c:451
 #, c-format
 msgid "unrecognized width:%s"
 msgstr "ancho desconocido: %s"
 
-#: ref-filter.c:431
+#: ref-filter.c:460
 #, c-format
 msgid "unrecognized %%(align) argument: %s"
 msgstr "argumento no reconocido para %%(align): %s"
 
-#: ref-filter.c:439
+#: ref-filter.c:468
 #, c-format
 msgid "positive width expected with the %%(align) atom"
 msgstr "se esperaba un ancho positivo con el átomo %%(align)"
 
-#: ref-filter.c:457
+#: ref-filter.c:486
 #, c-format
 msgid "unrecognized %%(if) argument: %s"
 msgstr "argumento: %s no reconocido %%(if)"
 
-#: ref-filter.c:559
+#: ref-filter.c:588
 #, c-format
 msgid "malformed field name: %.*s"
 msgstr "nombre mal formado de campo: %.*s"
 
-#: ref-filter.c:586
+#: ref-filter.c:615
 #, c-format
 msgid "unknown field name: %.*s"
 msgstr "nombre de campo desconocido: %.*s"
 
-#: ref-filter.c:590
+#: ref-filter.c:619
 #, c-format
 msgid ""
 "not a git repository, but the field '%.*s' requires access to object data"
 msgstr ""
 "no es un repositorio git, pero el campo '%.*s' requiere acceso al objeto data"
 
-#: ref-filter.c:714
+#: ref-filter.c:743
 #, c-format
 msgid "format: %%(if) atom used without a %%(then) atom"
 msgstr "formato: átomo %%(if) usado sin un átomo %%(then)"
 
-#: ref-filter.c:777
+#: ref-filter.c:806
 #, c-format
 msgid "format: %%(then) atom used without an %%(if) atom"
 msgstr "formato: átomo %%(then) usado sin átomo %%(if)"
 
-#: ref-filter.c:779
+#: ref-filter.c:808
 #, c-format
 msgid "format: %%(then) atom used more than once"
 msgstr "formato: átomo %%(then) usado más de una vez"
 
-#: ref-filter.c:781
+#: ref-filter.c:810
 #, c-format
 msgid "format: %%(then) atom used after %%(else)"
 msgstr "formato: átomo %%(then) usado después de %%(else)"
 
-#: ref-filter.c:809
+#: ref-filter.c:838
 #, c-format
 msgid "format: %%(else) atom used without an %%(if) atom"
 msgstr "formato: átomo %%(else) usado sin un átomo %%(if)"
 
-#: ref-filter.c:811
+#: ref-filter.c:840
 #, c-format
 msgid "format: %%(else) atom used without a %%(then) atom"
 msgstr "formato: átomo %%(else) usado sin un átomo %%(then)"
 
-#: ref-filter.c:813
+#: ref-filter.c:842
 #, c-format
 msgid "format: %%(else) atom used more than once"
 msgstr "formato: átomo %%(else) usado más de una vez"
 
-#: ref-filter.c:828
+#: ref-filter.c:857
 #, c-format
 msgid "format: %%(end) atom used without corresponding atom"
 msgstr "formato: átomo %%(end) usado sin átomo correspondiente"
 
-#: ref-filter.c:885
+#: ref-filter.c:914
 #, c-format
 msgid "malformed format string %s"
 msgstr "formato de cadena mal formado %s"
 
-#: ref-filter.c:1486
+#: ref-filter.c:1555
 #, c-format
-msgid "no branch, rebasing %s"
-msgstr "no hay rama, rebasando %s"
+msgid "(no branch, rebasing %s)"
+msgstr "(no hay rama, rebasando %s)"
 
-#: ref-filter.c:1489
+#: ref-filter.c:1558
 #, c-format
-msgid "no branch, rebasing detached HEAD %s"
-msgstr "(o hay rama, rebasando con HEAD desacoplado %s"
+msgid "(no branch, rebasing detached HEAD %s)"
+msgstr "(no una rama, rebasando con HEAD desacoplado %s)"
 
-#: ref-filter.c:1492
+#: ref-filter.c:1561
 #, c-format
-msgid "no branch, bisect started on %s"
-msgstr "no hay rama, comenzando biseccón en  %s"
+msgid "(no branch, bisect started on %s)"
+msgstr "(no hay rama, comenzando biseccón en %s)"
 
-#: ref-filter.c:1502
-msgid "no branch"
-msgstr "sin rama"
+#: ref-filter.c:1565
+#, c-format
+msgid "(HEAD detached at %s)"
+msgstr "(HEAD desacoplado en %s)"
 
-#: ref-filter.c:1538 ref-filter.c:1747
+#: ref-filter.c:1568
+#, c-format
+msgid "(HEAD detached from %s)"
+msgstr "(HEAD desacoplado de %s)"
+
+#: ref-filter.c:1571
+msgid "(no branch)"
+msgstr "(sin rama)"
+
+#: ref-filter.c:1603 ref-filter.c:1812
 #, c-format
 msgid "missing object %s for %s"
 msgstr "falta objeto %s para %s"
 
-#: ref-filter.c:1548
+#: ref-filter.c:1613
 #, c-format
 msgid "parse_object_buffer failed on %s for %s"
 msgstr "parse_object_buffer falló en %s para %s"
 
-#: ref-filter.c:2001
+#: ref-filter.c:1996
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "objeto mal formado en '%s'"
 
-#: ref-filter.c:2090
+#: ref-filter.c:2085
 #, c-format
 msgid "ignoring ref with broken name %s"
 msgstr "ignorando referencia con nombre roto %s"
 
-#: ref-filter.c:2095 refs.c:657
+#: ref-filter.c:2090 refs.c:676
 #, c-format
 msgid "ignoring broken ref %s"
 msgstr "ignorando referencia rota %s"
 
-#: ref-filter.c:2395
+#: ref-filter.c:2430
 #, c-format
 msgid "format: %%(end) atom missing"
 msgstr "formato: falta átomo %%(end)"
 
-#: ref-filter.c:2495
-#, c-format
-msgid "option `%s' is incompatible with --merged"
-msgstr "opción `%s' es incompatible con --merged"
-
-#: ref-filter.c:2498
-#, c-format
-msgid "option `%s' is incompatible with --no-merged"
-msgstr "opción `%s' es incompatible con --no-merged"
-
-#: ref-filter.c:2508
+#: ref-filter.c:2529
 #, c-format
 msgid "malformed object name %s"
 msgstr "nombre de objeto mal formado %s"
 
-#: ref-filter.c:2513
+#: ref-filter.c:2534
 #, c-format
 msgid "option `%s' must point to a commit"
 msgstr "opción '%s' debe apuntar a un commit"
@@ -6101,172 +6785,163 @@
 msgid "%s does not point to a valid object!"
 msgstr "¡%s no apunta a ningún objeto válido!"
 
-#: refs.c:572
+#: refs.c:566
+#, c-format
+msgid ""
+"Using '%s' as the name for the initial branch. This default branch name\n"
+"is subject to change. To configure the initial branch name to use in all\n"
+"of your new repositories, which will suppress this warning, call:\n"
+"\n"
+"\tgit config --global init.defaultBranch <name>\n"
+"\n"
+"Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
+"'development'. The just-created branch can be renamed via this command:\n"
+"\n"
+"\tgit branch -m <name>\n"
+msgstr ""
+"Usando '%s' como el nombre de la rama inicial. Este nombre de rama "
+"predeterminado\n"
+"está sujeto a cambios. Para configurar el nombre de la rama inicial para "
+"usar en todos\n"
+"de sus nuevos repositorios, que suprimirán esta advertencia, llame a:\n"
+"\n"
+"\tgit config --global init.defaultBranch <nombre>\n"
+"\n"
+"Los nombres comúnmente elegidos en lugar de 'maestro' son 'principal', "
+"'troncal' y\n"
+"'desarrollo'. Se puede cambiar el nombre de la rama recién creada mediante "
+"este comando:\n"
+"\n"
+"\tgit branch -m <nombre>\n"
+
+#: refs.c:588
 #, c-format
 msgid "could not retrieve `%s`"
 msgstr "no se pudo recibir `%s`"
 
-#: refs.c:579
+#: refs.c:598
 #, c-format
 msgid "invalid branch name: %s = %s"
-msgstr "Nombre de rama inválido: %s = %s"
+msgstr "nombre de rama inválido: %s = %s"
 
-#: refs.c:655
+#: refs.c:674
 #, c-format
 msgid "ignoring dangling symref %s"
 msgstr "ignorando referencia rota %s"
 
-#: refs.c:792
-#, c-format
-msgid "could not open '%s' for writing: %s"
-msgstr "no se pudo abrir '%s' para escritura: %s"
-
-#: refs.c:802 refs.c:853
-#, c-format
-msgid "could not read ref '%s'"
-msgstr "no se pudo leer la referencia '%s'"
-
-#: refs.c:808
-#, c-format
-msgid "ref '%s' already exists"
-msgstr "ref '%s' ya existe"
-
-#: refs.c:813
-#, c-format
-msgid "unexpected object ID when writing '%s'"
-msgstr "ID de objecto inesperado al escribir '%s'"
-
-#: refs.c:821 sequencer.c:408 sequencer.c:2721 sequencer.c:2925
-#: sequencer.c:2939 sequencer.c:3195 sequencer.c:5159 strbuf.c:1168
-#: wrapper.c:628
-#, c-format
-msgid "could not write to '%s'"
-msgstr "no se pudo escribir en '%s'"
-
-#: refs.c:848 strbuf.c:1166 wrapper.c:196 wrapper.c:366 builtin/am.c:719
-#: builtin/rebase.c:852
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr "no se pudo abrir '%s' para escritura"
-
-#: refs.c:855
-#, c-format
-msgid "unexpected object ID when deleting '%s'"
-msgstr "ID de objecto inesperado al borrar '%s'"
-
-#: refs.c:986
+#: refs.c:922
 #, c-format
 msgid "log for ref %s has gap after %s"
 msgstr "log de ref %s tiene un vacío tras %s"
 
-#: refs.c:992
+#: refs.c:929
 #, c-format
 msgid "log for ref %s unexpectedly ended on %s"
 msgstr "log de ref %s finalizado inesperadamente en %s"
 
-#: refs.c:1051
+#: refs.c:994
 #, c-format
 msgid "log for %s is empty"
 msgstr "log de %s está vacío"
 
-#: refs.c:1143
+#: refs.c:1086
 #, c-format
 msgid "refusing to update ref with bad name '%s'"
 msgstr "rehusando actualizar ref con mal nombre '%s'"
 
-#: refs.c:1219
+#: refs.c:1157
 #, c-format
 msgid "update_ref failed for ref '%s': %s"
 msgstr "update_ref falló para ref '%s': %s"
 
-#: refs.c:2011
+#: refs.c:2051
 #, c-format
 msgid "multiple updates for ref '%s' not allowed"
 msgstr "múltiples actualizaciones para ref '%s' no permitidas"
 
-#: refs.c:2098
+#: refs.c:2131
 msgid "ref updates forbidden inside quarantine environment"
 msgstr "actualizaciones de ref prohibidas dentro de ambiente de cuarentena"
 
-#: refs.c:2109
+#: refs.c:2142
 msgid "ref updates aborted by hook"
 msgstr "ref update abortado por el hook"
 
-#: refs.c:2209 refs.c:2239
+#: refs.c:2242 refs.c:2272
 #, c-format
 msgid "'%s' exists; cannot create '%s'"
 msgstr "'%s' existe; no se puede crear '%s'"
 
-#: refs.c:2215 refs.c:2250
+#: refs.c:2248 refs.c:2283
 #, c-format
 msgid "cannot process '%s' and '%s' at the same time"
 msgstr "no se puede procesar '%s' y '%s' al mismo tiempo"
 
-#: refs/files-backend.c:1233
+#: refs/files-backend.c:1228
 #, c-format
 msgid "could not remove reference %s"
 msgstr "no se pudo eliminar la referencia %s"
 
-#: refs/files-backend.c:1247 refs/packed-backend.c:1541
-#: refs/packed-backend.c:1551
+#: refs/files-backend.c:1242 refs/packed-backend.c:1542
+#: refs/packed-backend.c:1552
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "no se pudo eliminar la referencia %s: %s"
 
-#: refs/files-backend.c:1250 refs/packed-backend.c:1554
+#: refs/files-backend.c:1245 refs/packed-backend.c:1555
 #, c-format
 msgid "could not delete references: %s"
 msgstr "no se pudo eliminar la referencia: %s"
 
-#: refspec.c:137
+#: refspec.c:170
 #, c-format
 msgid "invalid refspec '%s'"
 msgstr "refspec inválido: '%s'"
 
-#: remote.c:355
+#: remote.c:351
 #, c-format
 msgid "config remote shorthand cannot begin with '/': %s"
 msgstr "config remote shorthand no puede comenzar con '/': %s"
 
-#: remote.c:403
+#: remote.c:399
 msgid "more than one receivepack given, using the first"
 msgstr "más de un receivepack dado, usando el primero"
 
-#: remote.c:411
+#: remote.c:407
 msgid "more than one uploadpack given, using the first"
 msgstr "más de un uploadpack dado, usando el primero"
 
-#: remote.c:594
+#: remote.c:590
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "No se pueden traer ambos %s y %s a %s"
 
-#: remote.c:598
+#: remote.c:594
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s por lo general hace seguimiento a %s, no a %s"
 
-#: remote.c:602
+#: remote.c:598
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s hace seguimiento tanto a %s como a %s"
 
-#: remote.c:670
+#: remote.c:666
 #, c-format
 msgid "key '%s' of pattern had no '*'"
 msgstr "llave '%s' de patrón no tuvo '*'"
 
-#: remote.c:680
+#: remote.c:676
 #, c-format
 msgid "value '%s' of pattern has no '*'"
 msgstr "valor '%s' del patrón no tiene '*'"
 
-#: remote.c:986
+#: remote.c:1083
 #, c-format
 msgid "src refspec %s does not match any"
 msgstr "src refsoec %s: no concuerda con ninguno"
 
-#: remote.c:991
+#: remote.c:1088
 #, c-format
 msgid "src refspec %s matches more than one"
 msgstr "src refspec %s concuerda con más de uno"
@@ -6275,7 +6950,7 @@
 #. <remote> <src>:<dst>" push, and "being pushed ('%s')" is
 #. the <src>.
 #.
-#: remote.c:1006
+#: remote.c:1103
 #, c-format
 msgid ""
 "The destination you provided is not a full refname (i.e.,\n"
@@ -6299,7 +6974,7 @@
 "Ninguno funcionó así que nos dimos por vencidos. Tienes que especificar el "
 "full ref."
 
-#: remote.c:1026
+#: remote.c:1123
 #, c-format
 msgid ""
 "The <src> part of the refspec is a commit object.\n"
@@ -6310,7 +6985,7 @@
 "¿Quisiste crear un branch nuevo mediante un push a\n"
 "'%s:refs/heads/%s'?"
 
-#: remote.c:1031
+#: remote.c:1128
 #, c-format
 msgid ""
 "The <src> part of the refspec is a tag object.\n"
@@ -6321,7 +6996,7 @@
 "Did you mean to create a new tag by pushing to\n"
 "'%s:refs/tags/%s'?"
 
-#: remote.c:1036
+#: remote.c:1133
 #, c-format
 msgid ""
 "The <src> part of the refspec is a tree object.\n"
@@ -6332,7 +7007,7 @@
 "¿Quisiste crear un tag nuevo mediante un push a\n"
 "'%s:refs/heads/%s'?"
 
-#: remote.c:1041
+#: remote.c:1138
 #, c-format
 msgid ""
 "The <src> part of the refspec is a blob object.\n"
@@ -6343,115 +7018,115 @@
 "¿Quisiste crear un tag nuevo mediante un push a\n"
 "'%s:refs/heads/%s'?"
 
-#: remote.c:1077
+#: remote.c:1174
 #, c-format
 msgid "%s cannot be resolved to branch"
 msgstr "%s no puede ser resolver a un branch"
 
-#: remote.c:1088
+#: remote.c:1185
 #, c-format
 msgid "unable to delete '%s': remote ref does not exist"
 msgstr "no es posible borrar '%s': ref remoto no existe"
 
-#: remote.c:1100
+#: remote.c:1197
 #, c-format
 msgid "dst refspec %s matches more than one"
 msgstr "dst refspec %s concuerda con más de uno"
 
-#: remote.c:1107
+#: remote.c:1204
 #, c-format
 msgid "dst ref %s receives from more than one src"
 msgstr "dst ref %s recibe de más de un src"
 
-#: remote.c:1610 remote.c:1711
+#: remote.c:1724 remote.c:1825
 msgid "HEAD does not point to a branch"
 msgstr "HEAD no apunta a ninguna rama"
 
-#: remote.c:1619
+#: remote.c:1733
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "no existe tal rama: '%s'"
 
-#: remote.c:1622
+#: remote.c:1736
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "no se ha configurado upstream para la rama '%s'"
 
-#: remote.c:1628
+#: remote.c:1742
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "la rama '%s' de upstream no es guardad como rama de rastreo remoto"
 
-#: remote.c:1643
+#: remote.c:1757
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
 "destino de push '%s' en el remoto '%s' no tiene una rama de rastreo local"
 
-#: remote.c:1655
+#: remote.c:1769
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "la rama '%s' no tiene remoto para enviar"
 
-#: remote.c:1665
+#: remote.c:1779
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "refspecs del push para '%s' no incluyen '%s'"
 
-#: remote.c:1678
+#: remote.c:1792
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "push no tiene destino (push.default es 'nada')"
 
-#: remote.c:1700
+#: remote.c:1814
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "no se puede resolver push 'simple' para un destino único"
 
-#: remote.c:1826
+#: remote.c:1943
 #, c-format
 msgid "couldn't find remote ref %s"
 msgstr "no se puedo encontrar ref remota %s"
 
-#: remote.c:1839
+#: remote.c:1956
 #, c-format
 msgid "* Ignoring funny ref '%s' locally"
 msgstr "* Ignorando ref graciosa '%s' localmente"
 
-#: remote.c:2002
+#: remote.c:2119
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "Tu rama está basada en '%s', pero upstream ha desaparecido.\n"
 
-#: remote.c:2006
+#: remote.c:2123
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (usa \"git branch --unset-upstream\" para arreglar)\n"
 
-#: remote.c:2009
+#: remote.c:2126
 #, c-format
 msgid "Your branch is up to date with '%s'.\n"
 msgstr "Tu rama está actualizada con '%s'.\n"
 
-#: remote.c:2013
+#: remote.c:2130
 #, c-format
 msgid "Your branch and '%s' refer to different commits.\n"
 msgstr "Tu rama y '%s' refieren a commits diferentes.\n"
 
-#: remote.c:2016
+#: remote.c:2133
 #, c-format
 msgid "  (use \"%s\" for details)\n"
 msgstr "  (usa \"%s\" para detalles)\n"
 
-#: remote.c:2020
+#: remote.c:2137
 #, 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] "Tu rama está adelantada a '%s' por %d commit.\n"
 msgstr[1] "Tu rama está adelantada a '%s' por %d commits.\n"
 
-#: remote.c:2026
+#: remote.c:2143
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (usa \"git push\" para publicar tus commits locales)\n"
 
-#: remote.c:2029
+#: remote.c:2146
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -6461,11 +7136,11 @@
 msgstr[1] ""
 "Tu rama está detrás de '%s' por %d commits, y puede ser avanzada rápido.\n"
 
-#: remote.c:2037
+#: remote.c:2154
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (usa \"git pull\" para actualizar tu rama local)\n"
 
-#: remote.c:2040
+#: remote.c:2157
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -6480,11 +7155,11 @@
 "Tu rama y '%s' han divergido,\n"
 "y tienen %d y %d commits diferentes cada una respectivamente.\n"
 
-#: remote.c:2050
+#: remote.c:2167
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (usa \"git pull\" para fusionar la rama remota en la tuya)\n"
 
-#: remote.c:2241
+#: remote.c:2359
 #, c-format
 msgid "cannot parse expected object name '%s'"
 msgstr "no se puede leer el nombre de objeto '%s'"
@@ -6504,101 +7179,96 @@
 msgid "replace depth too high for object %s"
 msgstr "remplazar profundiad muy elevada para objeto %s"
 
-#: repository.c:94 builtin/init-db.c:188
-#, c-format
-msgid "The hash algorithm %s is not supported in this build."
-msgstr "El algoritmo hash %s no está soportado en este build."
-
-#: rerere.c:217 rerere.c:226 rerere.c:229
+#: rerere.c:201 rerere.c:210 rerere.c:213
 msgid "corrupt MERGE_RR"
 msgstr "MERGE_RR corrupto"
 
-#: rerere.c:264 rerere.c:269
+#: rerere.c:248 rerere.c:253
 msgid "unable to write rerere record"
 msgstr "incapaz de escribir entrada rerere"
 
-#: rerere.c:495
+#: rerere.c:479
 #, c-format
 msgid "there were errors while writing '%s' (%s)"
 msgstr "hubieron errores mientras se escribía '%s' (%s)"
 
-#: rerere.c:498
+#: rerere.c:482
 #, c-format
 msgid "failed to flush '%s'"
 msgstr "falló al hacer flush '%s'"
 
-#: rerere.c:503 rerere.c:1039
+#: rerere.c:487 rerere.c:1023
 #, c-format
 msgid "could not parse conflict hunks in '%s'"
 msgstr "no se pudo analizar hunks en conflicto en '%s'"
 
-#: rerere.c:684
+#: rerere.c:668
 #, c-format
 msgid "failed utime() on '%s'"
 msgstr "falló utime() en '%s'"
 
-#: rerere.c:694
+#: rerere.c:678
 #, c-format
 msgid "writing '%s' failed"
 msgstr "escribiendo '%s' falló"
 
-#: rerere.c:714
+#: rerere.c:698
 #, c-format
 msgid "Staged '%s' using previous resolution."
 msgstr "'%s' puesto en stage usando resolución previa."
 
-#: rerere.c:753
+#: rerere.c:737
 #, c-format
 msgid "Recorded resolution for '%s'."
 msgstr "Resolución guardada para '%s'."
 
-#: rerere.c:788
+#: rerere.c:772
 #, c-format
 msgid "Resolved '%s' using previous resolution."
 msgstr "'%s' resuelto usando resolución previa."
 
-#: rerere.c:803
+#: rerere.c:787
 #, c-format
 msgid "cannot unlink stray '%s'"
 msgstr "no se puede desvincular stray '%s'"
 
-#: rerere.c:807
+#: rerere.c:791
 #, c-format
 msgid "Recorded preimage for '%s'"
 msgstr "Resolución precargada para '%s'"
 
-#: rerere.c:881 submodule.c:2078 builtin/log.c:1891
-#: builtin/submodule--helper.c:1454 builtin/submodule--helper.c:1466
+#: rerere.c:865 submodule.c:2088 builtin/log.c:1991
+#: builtin/submodule--helper.c:1878 builtin/submodule--helper.c:1890
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "no se pudo crear el directorio '%s'"
 
-#: rerere.c:1057
+#: rerere.c:1041
 #, c-format
 msgid "failed to update conflicted state in '%s'"
 msgstr "falló al actualizar estado conflictivo en '%s'"
 
-#: rerere.c:1068 rerere.c:1075
+#: rerere.c:1052 rerere.c:1059
 #, c-format
 msgid "no remembered resolution for '%s'"
 msgstr "resolución para '%s' no recordada"
 
-#: rerere.c:1077
+#: rerere.c:1061
 #, c-format
 msgid "cannot unlink '%s'"
 msgstr "no se puede desvincular '%s'"
 
-#: rerere.c:1087
+#: rerere.c:1071
 #, c-format
 msgid "Updated preimage for '%s'"
 msgstr "Actualizada preimagen para '%s'"
 
-#: rerere.c:1096
+#: rerere.c:1080
 #, c-format
 msgid "Forgot resolution for '%s'\n"
 msgstr "Se olvidó resolución para '%s'\n"
 
-#: rerere.c:1199
+#: rerere.c:1191
 msgid "unable to open rr-cache directory"
 msgstr "no es posible abrir directorio rr-cache"
 
@@ -6606,38 +7276,38 @@
 msgid "could not determine HEAD revision"
 msgstr "no se pudo determinar revisión HEAD"
 
-#: reset.c:70 reset.c:76 sequencer.c:3318
+#: reset.c:70 reset.c:76 sequencer.c:3468
 #, c-format
 msgid "failed to find tree of %s"
 msgstr "falló al encontrar árbol de %s"
 
-#: revision.c:2661
+#: revision.c:2338
+msgid "--unpacked=<packfile> no longer supported"
+msgstr "--unpacked=<packfile>  ya no es soportado"
+
+#: revision.c:2668
 msgid "your current branch appears to be broken"
 msgstr "tu rama actual parece estar rota"
 
-#: revision.c:2664
+#: revision.c:2671
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "tu rama actual '%s' no tiene ningún commit todavía"
 
-#: revision.c:2873
-msgid "--first-parent is incompatible with --bisect"
-msgstr "--first-parent es incompatible con --bisect"
-
 #: revision.c:2877
 msgid "-L does not yet support diff formats besides -p and -s"
 msgstr "-L no soporta todavía formatos de diff fuera de -p y -s"
 
-#: run-command.c:763
+#: run-command.c:767
 msgid "open /dev/null failed"
 msgstr "falló al abrir /dev/null"
 
-#: run-command.c:1269
+#: run-command.c:1274
 #, c-format
 msgid "cannot create async thread: %s"
 msgstr "no es posible crear hilo async: %s"
 
-#: run-command.c:1333
+#: run-command.c:1338
 #, c-format
 msgid ""
 "The '%s' hook was ignored because it's not set as executable.\n"
@@ -6647,34 +7317,34 @@
 "Puedes desactivar esta advertencias con `git config advice.ignoredHook "
 "false`."
 
-#: send-pack.c:145
+#: send-pack.c:146
 msgid "unexpected flush packet while reading remote unpack status"
 msgstr ""
 "flush packet inesperado mientras se leía estatus de desempaquetado remoto"
 
-#: send-pack.c:147
+#: send-pack.c:148
 #, c-format
 msgid "unable to parse remote unpack status: %s"
 msgstr "no es posible analizar el estado de desempaquetado remoto: %s"
 
-#: send-pack.c:149
+#: send-pack.c:150
 #, c-format
 msgid "remote unpack failed: %s"
 msgstr "desempaquetado remoto falló: %s"
 
-#: send-pack.c:308
+#: send-pack.c:374
 msgid "failed to sign the push certificate"
 msgstr "falló al firmar el certificado de push"
 
-#: send-pack.c:394
+#: send-pack.c:467
 msgid "the receiving end does not support this repository's hash algorithm"
 msgstr "el destino no soporta el algoritmo de hash de este repositorio"
 
-#: send-pack.c:403
+#: send-pack.c:476
 msgid "the receiving end does not support --signed push"
 msgstr "el final receptor no soporta --signed push"
 
-#: send-pack.c:405
+#: send-pack.c:478
 msgid ""
 "not sending a push certificate since the receiving end does not support --"
 "signed push"
@@ -6682,47 +7352,47 @@
 "no se manda un certificado de push ya que el destino no soporta push firmado "
 "(--signed )"
 
-#: send-pack.c:417
+#: send-pack.c:490
 msgid "the receiving end does not support --atomic push"
 msgstr "el destino no soporta push atómicos (--atomic)"
 
-#: send-pack.c:422
+#: send-pack.c:495
 msgid "the receiving end does not support push options"
 msgstr "el destino no soporta opciones de push"
 
-#: sequencer.c:192
+#: sequencer.c:195
 #, c-format
 msgid "invalid commit message cleanup mode '%s'"
 msgstr "mensaje de commit inválido, modo cleanup '%s'"
 
-#: sequencer.c:297
+#: sequencer.c:323
 #, c-format
 msgid "could not delete '%s'"
 msgstr "no se pudo borrar '%s'"
 
-#: sequencer.c:316 builtin/rebase.c:743 builtin/rebase.c:1582 builtin/rm.c:385
+#: sequencer.c:343 builtin/rebase.c:757 builtin/rebase.c:1602 builtin/rm.c:385
 #, c-format
 msgid "could not remove '%s'"
 msgstr "no se pudo eliminar'%s'"
 
-#: sequencer.c:326
+#: sequencer.c:353
 msgid "revert"
 msgstr "revertir"
 
-#: sequencer.c:328
+#: sequencer.c:355
 msgid "cherry-pick"
 msgstr "cherry-pick"
 
-#: sequencer.c:330
+#: sequencer.c:357
 msgid "rebase"
 msgstr "rebase"
 
-#: sequencer.c:332
+#: sequencer.c:359
 #, c-format
 msgid "unknown action: %d"
 msgstr "acción desconocida: %d"
 
-#: sequencer.c:390
+#: sequencer.c:418
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
@@ -6730,7 +7400,7 @@
 "después de resolver los conflictos, marca las rutas corregidas\n"
 "con 'git add <rutas>' o 'git rm <rutas>'"
 
-#: sequencer.c:393
+#: sequencer.c:421
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'\n"
@@ -6740,43 +7410,43 @@
 "con 'git add <rutas>' o 'git rm <rutas>'\n"
 "y haz un commit del resultado con 'git commit'"
 
-#: sequencer.c:406 sequencer.c:2921
+#: sequencer.c:434 sequencer.c:3070
 #, c-format
 msgid "could not lock '%s'"
 msgstr "no se pudo bloquear '%s'"
 
-#: sequencer.c:413
+#: sequencer.c:436 sequencer.c:2869 sequencer.c:3074 sequencer.c:3088
+#: sequencer.c:3345 sequencer.c:5334 strbuf.c:1168 wrapper.c:631
+#, c-format
+msgid "could not write to '%s'"
+msgstr "no se pudo escribir en '%s'"
+
+#: sequencer.c:441
 #, c-format
 msgid "could not write eol to '%s'"
 msgstr "no se pudo escribir EOL en '%s'"
 
-#: sequencer.c:418 sequencer.c:2726 sequencer.c:2927 sequencer.c:2941
-#: sequencer.c:3203
+#: sequencer.c:446 sequencer.c:2874 sequencer.c:3076 sequencer.c:3090
+#: sequencer.c:3353
 #, c-format
 msgid "failed to finalize '%s'"
 msgstr "falló al finalizar '%s'"
 
-#: sequencer.c:431 sequencer.c:1620 sequencer.c:2746 sequencer.c:3185
-#: sequencer.c:3294 builtin/am.c:249 builtin/commit.c:786 builtin/merge.c:1128
-#, c-format
-msgid "could not read '%s'"
-msgstr "no se pudo leer '%s'"
-
-#: sequencer.c:457
+#: sequencer.c:485
 #, c-format
 msgid "your local changes would be overwritten by %s."
 msgstr "tus cambios locales serán sobreescritos por %s."
 
-#: sequencer.c:461
+#: sequencer.c:489
 msgid "commit your changes or stash them to proceed."
 msgstr "realiza un commit con tus cambios o aplica un stash para proceder."
 
-#: sequencer.c:493
+#: sequencer.c:521
 #, c-format
 msgid "%s: fast-forward"
 msgstr "%s: avance rápido"
 
-#: sequencer.c:532 builtin/tag.c:566
+#: sequencer.c:560 builtin/tag.c:598
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Modo cleanup inválido %s"
@@ -6784,65 +7454,65 @@
 #. TRANSLATORS: %s will be "revert", "cherry-pick" or
 #. "rebase".
 #.
-#: sequencer.c:626
+#: sequencer.c:670
 #, c-format
 msgid "%s: Unable to write new index file"
 msgstr "%s: Incapaz de escribir el nuevo archivo índice"
 
-#: sequencer.c:643
+#: sequencer.c:684
 msgid "unable to update cache tree"
 msgstr "no es posible actualizar el árbol de la caché"
 
-#: sequencer.c:657
+#: sequencer.c:698
 msgid "could not resolve HEAD commit"
 msgstr "no se pudo resolver el commit de HEAD"
 
-#: sequencer.c:737
+#: sequencer.c:778
 #, c-format
 msgid "no key present in '%.*s'"
 msgstr "no hay llave presente en '%.*s'"
 
-#: sequencer.c:748
+#: sequencer.c:789
 #, c-format
 msgid "unable to dequote value of '%s'"
 msgstr "no es posible dequote para '%s'"
 
-#: sequencer.c:785 wrapper.c:198 wrapper.c:368 builtin/am.c:710
-#: builtin/am.c:802 builtin/merge.c:1125 builtin/rebase.c:896
+#: sequencer.c:826 wrapper.c:201 wrapper.c:371 builtin/am.c:710
+#: builtin/am.c:802 builtin/merge.c:1136 builtin/rebase.c:910
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "no se pudo abrir '%s' para lectura"
 
-#: sequencer.c:795
+#: sequencer.c:836
 msgid "'GIT_AUTHOR_NAME' already given"
 msgstr "'GIT_AUTHOR_NAME' ya proporcionado"
 
-#: sequencer.c:800
+#: sequencer.c:841
 msgid "'GIT_AUTHOR_EMAIL' already given"
 msgstr "'GIT_AUTHOR_EMAIL' ya proporcionado"
 
-#: sequencer.c:805
+#: sequencer.c:846
 msgid "'GIT_AUTHOR_DATE' already given"
 msgstr "'GIT_AUTHOR_DATE' ya proporcionado"
 
-#: sequencer.c:809
+#: sequencer.c:850
 #, c-format
 msgid "unknown variable '%s'"
 msgstr "variable desconocida '%s'"
 
-#: sequencer.c:814
+#: sequencer.c:855
 msgid "missing 'GIT_AUTHOR_NAME'"
 msgstr "falta 'GIT_AUTHOR_NAME'"
 
-#: sequencer.c:816
+#: sequencer.c:857
 msgid "missing 'GIT_AUTHOR_EMAIL'"
 msgstr "falta 'GIT_AUTHOR_EMAIL'"
 
-#: sequencer.c:818
+#: sequencer.c:859
 msgid "missing 'GIT_AUTHOR_DATE'"
 msgstr "falta 'GIT_AUTHOR_DATE'"
 
-#: sequencer.c:867
+#: sequencer.c:924
 #, c-format
 msgid ""
 "you have staged changes in your working tree\n"
@@ -6872,11 +7542,11 @@
 "\n"
 "  git rebase --continue\n"
 
-#: sequencer.c:1141
+#: sequencer.c:1211
 msgid "'prepare-commit-msg' hook failed"
 msgstr "hook 'prepare-commit-msg' falló"
 
-#: sequencer.c:1147
+#: sequencer.c:1217
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -6903,7 +7573,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: sequencer.c:1160
+#: sequencer.c:1230
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -6927,329 +7597,338 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: sequencer.c:1202
+#: sequencer.c:1272
 msgid "couldn't look up newly created commit"
 msgstr "no se pudo revisar el commit recién creado"
 
-#: sequencer.c:1204
+#: sequencer.c:1274
 msgid "could not parse newly created commit"
 msgstr "no se pudo analizar el commit recién creado"
 
-#: sequencer.c:1250
+#: sequencer.c:1320
 msgid "unable to resolve HEAD after creating commit"
 msgstr "no se pudo resolver HEAD tras crear el commit"
 
-#: sequencer.c:1252
+#: sequencer.c:1322
 msgid "detached HEAD"
 msgstr "HEAD desacoplado"
 
-#: sequencer.c:1256
+#: sequencer.c:1326
 msgid " (root-commit)"
 msgstr " (commit-raíz)"
 
-#: sequencer.c:1277
+#: sequencer.c:1347
 msgid "could not parse HEAD"
 msgstr "no se pudo analizar HEAD"
 
-#: sequencer.c:1279
+#: sequencer.c:1349
 #, c-format
 msgid "HEAD %s is not a commit!"
 msgstr "¡HEAD %s no es un commit!"
 
-#: sequencer.c:1283 sequencer.c:1357 builtin/commit.c:1579
+#: sequencer.c:1353 sequencer.c:1431 builtin/commit.c:1577
 msgid "could not parse HEAD commit"
 msgstr "no se pudo analizar el commit de HEAD"
 
-#: sequencer.c:1335 sequencer.c:1980
+#: sequencer.c:1409 sequencer.c:2108
 msgid "unable to parse commit author"
 msgstr "no es posible analizar el autor del commit"
 
-#: sequencer.c:1346 builtin/am.c:1566 builtin/merge.c:695
+#: sequencer.c:1420 builtin/am.c:1566 builtin/merge.c:702
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree falló al escribir el árbol"
 
-#: sequencer.c:1379 sequencer.c:1450
+#: sequencer.c:1453 sequencer.c:1573
 #, c-format
 msgid "unable to read commit message from '%s'"
 msgstr "no se puede leer el mensaje del commit de '%s'"
 
-#: sequencer.c:1406 builtin/am.c:1588 builtin/commit.c:1680 builtin/merge.c:894
-#: builtin/merge.c:919
+#: sequencer.c:1484 sequencer.c:1516
+#, c-format
+msgid "invalid author identity '%s'"
+msgstr "identidad de autor inválida '%s'"
+
+#: sequencer.c:1490
+msgid "corrupt author: missing date information"
+msgstr "autor corrupto: falta información"
+
+#: sequencer.c:1529 builtin/am.c:1593 builtin/commit.c:1678 builtin/merge.c:905
+#: builtin/merge.c:930 t/helper/test-fast-rebase.c:78
 msgid "failed to write commit object"
 msgstr "falló al escribir el objeto commit"
 
-#: sequencer.c:1433 sequencer.c:4118
+#: sequencer.c:1556 sequencer.c:4291 t/helper/test-fast-rebase.c:198
 #, c-format
 msgid "could not update %s"
 msgstr "no se puede actualizar %s"
 
-#: sequencer.c:1481
+#: sequencer.c:1605
 #, c-format
 msgid "could not parse commit %s"
 msgstr "no se pudo analizar commit %s"
 
-#: sequencer.c:1486
+#: sequencer.c:1610
 #, c-format
 msgid "could not parse parent commit %s"
 msgstr "no se pudo analizar el commit padre %s"
 
-#: sequencer.c:1569 sequencer.c:1680
+#: sequencer.c:1693 sequencer.c:1804
 #, c-format
 msgid "unknown command: %d"
 msgstr "comando desconocido: %d"
 
-#: sequencer.c:1627 sequencer.c:1652
+#: sequencer.c:1751 sequencer.c:1776
 #, c-format
 msgid "This is a combination of %d commits."
 msgstr "Esta es una combinación de %d commits."
 
-#: sequencer.c:1637
+#: sequencer.c:1761
 msgid "need a HEAD to fixup"
 msgstr "se necesita un HEAD para arreglar"
 
-#: sequencer.c:1639 sequencer.c:3230
+#: sequencer.c:1763 sequencer.c:3380
 msgid "could not read HEAD"
 msgstr "no se pudo leer HEAD"
 
-#: sequencer.c:1641
+#: sequencer.c:1765
 msgid "could not read HEAD's commit message"
 msgstr "no se pudo leer el mensaje de commit de HEAD"
 
-#: sequencer.c:1647
+#: sequencer.c:1771
 #, c-format
 msgid "cannot write '%s'"
 msgstr "no se puede escribir '%s'"
 
-#: sequencer.c:1654 git-rebase--preserve-merges.sh:496
+#: sequencer.c:1778 git-rebase--preserve-merges.sh:486
 msgid "This is the 1st commit message:"
 msgstr "Este es el mensaje del 1er commit:"
 
-#: sequencer.c:1662
+#: sequencer.c:1786
 #, c-format
 msgid "could not read commit message of %s"
 msgstr "no se puede leer el mensaje del commit de %s"
 
-#: sequencer.c:1669
+#: sequencer.c:1793
 #, c-format
 msgid "This is the commit message #%d:"
 msgstr "Este es el mensaje del commit #%d:"
 
-#: sequencer.c:1675
+#: sequencer.c:1799
 #, c-format
 msgid "The commit message #%d will be skipped:"
 msgstr "El mensaje del commit #%d será saltado:"
 
-#: sequencer.c:1763
+#: sequencer.c:1887
 msgid "your index file is unmerged."
 msgstr "tu archivo índice no está fusionado."
 
-#: sequencer.c:1770
+#: sequencer.c:1894
 msgid "cannot fixup root commit"
 msgstr "no se puede arreglar el commit raíz"
 
-#: sequencer.c:1789
+#: sequencer.c:1913
 #, c-format
 msgid "commit %s is a merge but no -m option was given."
 msgstr "el commit %s es una fusión pero no se proporcionó la opción -m."
 
-#: sequencer.c:1797 sequencer.c:1805
+#: sequencer.c:1921 sequencer.c:1929
 #, c-format
 msgid "commit %s does not have parent %d"
 msgstr "el commit %s no tiene un padre %d"
 
-#: sequencer.c:1811
+#: sequencer.c:1935
 #, c-format
 msgid "cannot get commit message for %s"
 msgstr "no se puede obtener el mensaje de commit para %s"
 
 #. TRANSLATORS: The first %s will be a "todo" command like
 #. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:1830
+#: sequencer.c:1954
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s: no se puede analizar el commit padre %s"
 
-#: sequencer.c:1895
+#: sequencer.c:2019
 #, c-format
 msgid "could not rename '%s' to '%s'"
 msgstr "no se puede renombrar '%s' a '%s'"
 
-#: sequencer.c:1952
+#: sequencer.c:2079
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "no se pudo revertir %s... %s"
 
-#: sequencer.c:1953
+#: sequencer.c:2080
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "no se pudo aplicar %s... %s"
 
-#: sequencer.c:1972
+#: sequencer.c:2100
 #, c-format
 msgid "dropping %s %s -- patch contents already upstream\n"
 msgstr "botando $%s %s -- contenidos del parche ya están en upstream\n"
 
-#: sequencer.c:2030
+#: sequencer.c:2158
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: falló al leer el índice"
 
-#: sequencer.c:2037
+#: sequencer.c:2165
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: falló al refrescar el índice"
 
-#: sequencer.c:2114
+#: sequencer.c:2242
 #, c-format
 msgid "%s does not accept arguments: '%s'"
 msgstr "%s no acepta los argumentos: '%s'"
 
-#: sequencer.c:2123
+#: sequencer.c:2251
 #, c-format
 msgid "missing arguments for %s"
 msgstr "faltan argumentos para para %s"
 
-#: sequencer.c:2154
+#: sequencer.c:2282
 #, c-format
 msgid "could not parse '%s'"
 msgstr "no se puede analizar '%s'"
 
-#: sequencer.c:2215
+#: sequencer.c:2343
 #, c-format
 msgid "invalid line %d: %.*s"
 msgstr "línea inválida %d: %.*s"
 
-#: sequencer.c:2226
+#: sequencer.c:2354
 #, c-format
 msgid "cannot '%s' without a previous commit"
 msgstr "no se puede  '%s' sin un commit previo"
 
-#: sequencer.c:2310
+#: sequencer.c:2440
 msgid "cancelling a cherry picking in progress"
 msgstr "cancelando cherry-pick en progreso"
 
-#: sequencer.c:2317
+#: sequencer.c:2449
 msgid "cancelling a revert in progress"
 msgstr "cancelando revert en progreso"
 
-#: sequencer.c:2361
+#: sequencer.c:2493
 msgid "please fix this using 'git rebase --edit-todo'."
 msgstr "por favor arregle esto usando 'git rebase --edit-todo'."
 
-#: sequencer.c:2363
+#: sequencer.c:2495
 #, c-format
 msgid "unusable instruction sheet: '%s'"
 msgstr "hoja de instrucciones inutilizable: '%s'"
 
-#: sequencer.c:2368
+#: sequencer.c:2500
 msgid "no commits parsed."
 msgstr "ningún commit analizado."
 
-#: sequencer.c:2379
+#: sequencer.c:2511
 msgid "cannot cherry-pick during a revert."
 msgstr "no se puede realizar cherry-pick durante un revert."
 
-#: sequencer.c:2381
+#: sequencer.c:2513
 msgid "cannot revert during a cherry-pick."
 msgstr "no se puede realizar un revert durante un cherry-pick."
 
-#: sequencer.c:2459
+#: sequencer.c:2591
 #, c-format
 msgid "invalid value for %s: %s"
 msgstr "valor inválido para %s: %s"
 
-#: sequencer.c:2556
+#: sequencer.c:2698
 msgid "unusable squash-onto"
 msgstr "squash-onto inservible"
 
-#: sequencer.c:2576
+#: sequencer.c:2718
 #, c-format
 msgid "malformed options sheet: '%s'"
 msgstr "hoja de opciones mal formada: '%s'"
 
-#: sequencer.c:2664 sequencer.c:4469
+#: sequencer.c:2811 sequencer.c:4644
 msgid "empty commit set passed"
 msgstr "conjunto de commits vacío entregado"
 
-#: sequencer.c:2680
+#: sequencer.c:2828
 msgid "revert is already in progress"
 msgstr "revert ya está en progreso"
 
-#: sequencer.c:2682
+#: sequencer.c:2830
 #, c-format
 msgid "try \"git revert (--continue | %s--abort | --quit)\""
 msgstr "intenta \"git revert (--continue | --quit | %s --abort)\""
 
-#: sequencer.c:2685
+#: sequencer.c:2833
 msgid "cherry-pick is already in progress"
 msgstr "cherry-pick ya está en progreso"
 
-#: sequencer.c:2687
+#: sequencer.c:2835
 #, c-format
 msgid "try \"git cherry-pick (--continue | %s--abort | --quit)\""
 msgstr "intenta \"git cherry-pick (--continue | --quit | %s --abort)\""
 
-#: sequencer.c:2701
+#: sequencer.c:2849
 #, c-format
 msgid "could not create sequencer directory '%s'"
 msgstr "no se pudo crear un directorio secuenciador '%s'"
 
-#: sequencer.c:2716
+#: sequencer.c:2864
 msgid "could not lock HEAD"
 msgstr "no se pudo bloquear HEAD"
 
-#: sequencer.c:2776 sequencer.c:4206
+#: sequencer.c:2924 sequencer.c:4379
 msgid "no cherry-pick or revert in progress"
 msgstr "ningún cherry-pick o revert en progreso"
 
-#: sequencer.c:2778 sequencer.c:2789
+#: sequencer.c:2926 sequencer.c:2937
 msgid "cannot resolve HEAD"
 msgstr "no se puede resolver HEAD"
 
-#: sequencer.c:2780 sequencer.c:2824
+#: sequencer.c:2928 sequencer.c:2972
 msgid "cannot abort from a branch yet to be born"
 msgstr "no se puede abortar de una rama por nacer"
 
-#: sequencer.c:2810 builtin/grep.c:744
+#: sequencer.c:2958 builtin/grep.c:757
 #, c-format
 msgid "cannot open '%s'"
 msgstr "no se puede abrir '%s'"
 
-#: sequencer.c:2812
+#: sequencer.c:2960
 #, c-format
 msgid "cannot read '%s': %s"
 msgstr "no se puede leer '%s': %s"
 
-#: sequencer.c:2813
+#: sequencer.c:2961
 msgid "unexpected end of file"
 msgstr "final de archivo inesperado"
 
-#: sequencer.c:2819
+#: sequencer.c:2967
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr "archivo HEAD de pre-cherry-pick guardado '%s' está corrupto"
 
-#: sequencer.c:2830
+#: sequencer.c:2978
 msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
 msgstr "Parece que se ha movido HEAD. No se hace rebobinado, ¡revisa tu HEAD!"
 
-#: sequencer.c:2871
+#: sequencer.c:3019
 msgid "no revert in progress"
 msgstr "no hay revert en progreso"
 
-#: sequencer.c:2879
+#: sequencer.c:3028
 msgid "no cherry-pick in progress"
 msgstr "ningún cherry-pick en progreso"
 
-#: sequencer.c:2889
+#: sequencer.c:3038
 msgid "failed to skip the commit"
 msgstr "falló al escribir el commit"
 
-#: sequencer.c:2896
+#: sequencer.c:3045
 msgid "there is nothing to skip"
 msgstr "no hay nada que saltar"
 
-#: sequencer.c:2899
+#: sequencer.c:3048
 #, c-format
 msgid ""
 "have you committed already?\n"
@@ -7258,16 +7937,16 @@
 "¿ya has hecho el commit?\n"
 "intenta \"git %s --continue\""
 
-#: sequencer.c:3060 sequencer.c:4098
+#: sequencer.c:3210 sequencer.c:4271
 msgid "cannot read HEAD"
 msgstr "no se puede leer HEAD"
 
-#: sequencer.c:3077
+#: sequencer.c:3227
 #, c-format
 msgid "unable to copy '%s' to '%s'"
 msgstr "no se pudo copiar '%s' a '%s'"
 
-#: sequencer.c:3085
+#: sequencer.c:3235
 #, c-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -7286,27 +7965,27 @@
 "\n"
 "\tgit rebase --continue\n"
 
-#: sequencer.c:3095
+#: sequencer.c:3245
 #, c-format
 msgid "Could not apply %s... %.*s"
 msgstr "No se pudo aplicar %s... %.*s"
 
-#: sequencer.c:3102
+#: sequencer.c:3252
 #, c-format
 msgid "Could not merge %.*s"
 msgstr "No se pudo fusionar %.*s"
 
-#: sequencer.c:3116 sequencer.c:3120 builtin/difftool.c:641
+#: sequencer.c:3266 sequencer.c:3270 builtin/difftool.c:640
 #, c-format
 msgid "could not copy '%s' to '%s'"
 msgstr "no se pudo copiar '%s' a '%s'"
 
-#: sequencer.c:3132
+#: sequencer.c:3282
 #, c-format
 msgid "Executing: %s\n"
 msgstr "Ejecutando: %s\n"
 
-#: sequencer.c:3147
+#: sequencer.c:3297
 #, c-format
 msgid ""
 "execution failed: %s\n"
@@ -7321,11 +8000,11 @@
 "  git rebase --continue\n"
 "\n"
 
-#: sequencer.c:3153
+#: sequencer.c:3303
 msgid "and made changes to the index and/or the working tree\n"
 msgstr "y se hicieron cambios al índice y/o árbol de trabajo\n"
 
-#: sequencer.c:3159
+#: sequencer.c:3309
 #, c-format
 msgid ""
 "execution succeeded: %s\n"
@@ -7342,90 +8021,90 @@
 "  git rebase --continue\n"
 "\n"
 
-#: sequencer.c:3220
+#: sequencer.c:3370
 #, c-format
 msgid "illegal label name: '%.*s'"
 msgstr "nombre de label ilegal: '%.*s'"
 
-#: sequencer.c:3274
+#: sequencer.c:3424
 msgid "writing fake root commit"
 msgstr "escribiendo commit raíz falso"
 
-#: sequencer.c:3279
+#: sequencer.c:3429
 msgid "writing squash-onto"
 msgstr "escribiendo squash-onto"
 
-#: sequencer.c:3363
+#: sequencer.c:3513
 #, c-format
 msgid "could not resolve '%s'"
 msgstr "no se pudo resolver '%s'"
 
-#: sequencer.c:3394
+#: sequencer.c:3546
 msgid "cannot merge without a current revision"
 msgstr "no se puede fusionar sin una versión actual"
 
-#: sequencer.c:3416
+#: sequencer.c:3568
 #, c-format
 msgid "unable to parse '%.*s'"
 msgstr "no se puede analizar '%.*s'"
 
-#: sequencer.c:3425
+#: sequencer.c:3577
 #, c-format
 msgid "nothing to merge: '%.*s'"
 msgstr "nada para fusionar: '%.*s'"
 
-#: sequencer.c:3437
+#: sequencer.c:3589
 msgid "octopus merge cannot be executed on top of a [new root]"
 msgstr "fusión octopus no puede ser ejecutada en la punta de un [nuevo root]"
 
-#: sequencer.c:3453
+#: sequencer.c:3605
 #, c-format
 msgid "could not get commit message of '%s'"
 msgstr "no se puede leer el mensaje del commit '%s'"
 
-#: sequencer.c:3613
+#: sequencer.c:3788
 #, c-format
 msgid "could not even attempt to merge '%.*s'"
 msgstr "no se pudo intentar fusionar '%.*s'"
 
-#: sequencer.c:3629
+#: sequencer.c:3804
 msgid "merge: Unable to write new index file"
 msgstr "fusión: No se puede escribir el nuevo archivo índice"
 
-#: sequencer.c:3703
+#: sequencer.c:3878
 msgid "Cannot autostash"
 msgstr "No se puede ejecutar autostash"
 
-#: sequencer.c:3706
+#: sequencer.c:3881
 #, c-format
 msgid "Unexpected stash response: '%s'"
 msgstr "Respuesta de stash inesperada: '%s'"
 
-#: sequencer.c:3712
+#: sequencer.c:3887
 #, c-format
 msgid "Could not create directory for '%s'"
 msgstr "No se pudo crear el directorio para '%s'"
 
-#: sequencer.c:3715
+#: sequencer.c:3890
 #, c-format
 msgid "Created autostash: %s\n"
 msgstr "Autostash creado: %s\n"
 
-#: sequencer.c:3719
+#: sequencer.c:3894
 msgid "could not reset --hard"
 msgstr "no se pudo reset --hard"
 
-#: sequencer.c:3744
+#: sequencer.c:3919
 #, c-format
 msgid "Applied autostash.\n"
 msgstr "Autostash aplicado.\n"
 
-#: sequencer.c:3756
+#: sequencer.c:3931
 #, c-format
 msgid "cannot store %s"
 msgstr "no se puede guardar %s"
 
-#: sequencer.c:3759
+#: sequencer.c:3934
 #, c-format
 msgid ""
 "%s\n"
@@ -7437,34 +8116,29 @@
 "Puedes ejecutar \"git stash pop\" o \"git stash drop\" en cualquier "
 "momento.\n"
 
-#: sequencer.c:3764
+#: sequencer.c:3939
 msgid "Applying autostash resulted in conflicts."
 msgstr "Apicar autostash resultó en conflictos."
 
-#: sequencer.c:3765
+#: sequencer.c:3940
 msgid "Autostash exists; creating a new stash entry."
 msgstr "Autostash existe; creando una nueva entrada stash."
 
-#: sequencer.c:3857
-#, c-format
-msgid "%s: not a valid OID"
-msgstr "%s no es OID válido"
-
-#: sequencer.c:3862 git-rebase--preserve-merges.sh:779
+#: sequencer.c:4033 git-rebase--preserve-merges.sh:769
 msgid "could not detach HEAD"
 msgstr "no se puede desacoplar HEAD"
 
-#: sequencer.c:3877
+#: sequencer.c:4048
 #, c-format
 msgid "Stopped at HEAD\n"
 msgstr "Detenido en HEAD\n"
 
-#: sequencer.c:3879
+#: sequencer.c:4050
 #, c-format
 msgid "Stopped at %s\n"
 msgstr "Detenido en %s\n"
 
-#: sequencer.c:3887
+#: sequencer.c:4058
 #, c-format
 msgid ""
 "Could not execute the todo command\n"
@@ -7485,58 +8159,58 @@
 "    git rebase --edit-todo\n"
 "    git rebase --continue\n"
 
-#: sequencer.c:3931
+#: sequencer.c:4104
 #, c-format
 msgid "Rebasing (%d/%d)%s"
 msgstr "Aplicando rebase (%d/%d)%s"
 
-#: sequencer.c:3976
+#: sequencer.c:4149
 #, c-format
 msgid "Stopped at %s...  %.*s\n"
 msgstr "Detenido en %s...  %.*s\n"
 
-#: sequencer.c:4047
+#: sequencer.c:4220
 #, c-format
 msgid "unknown command %d"
 msgstr "comando desconocido %d"
 
-#: sequencer.c:4106
+#: sequencer.c:4279
 msgid "could not read orig-head"
 msgstr "no se puede leer orig-head"
 
-#: sequencer.c:4111
+#: sequencer.c:4284
 msgid "could not read 'onto'"
 msgstr "no se puede leer 'onto'"
 
-#: sequencer.c:4125
+#: sequencer.c:4298
 #, c-format
 msgid "could not update HEAD to %s"
 msgstr "no se puede actualizar HEAD a %s"
 
-#: sequencer.c:4185
+#: sequencer.c:4358
 #, c-format
 msgid "Successfully rebased and updated %s.\n"
 msgstr "Rebase aplicado satisfactoriamente y actualizado %s.\n"
 
-#: sequencer.c:4218
+#: sequencer.c:4391
 msgid "cannot rebase: You have unstaged changes."
 msgstr "no se puede realizar rebase: Tienes cambios fuera del área de stage."
 
-#: sequencer.c:4227
+#: sequencer.c:4400
 msgid "cannot amend non-existing commit"
 msgstr "no se puede arreglar un commit no existente"
 
-#: sequencer.c:4229
+#: sequencer.c:4402
 #, c-format
 msgid "invalid file: '%s'"
 msgstr "archivo inválido: '%s'"
 
-#: sequencer.c:4231
+#: sequencer.c:4404
 #, c-format
 msgid "invalid contents: '%s'"
 msgstr "contenido inválido: '%s'"
 
-#: sequencer.c:4234
+#: sequencer.c:4407
 msgid ""
 "\n"
 "You have uncommitted changes in your working tree. Please, commit them\n"
@@ -7547,50 +8221,50 @@
 "un commit con estos\n"
 "primero y luego ejecuta 'git rebase --continue' de nuevo."
 
-#: sequencer.c:4270 sequencer.c:4309
+#: sequencer.c:4443 sequencer.c:4482
 #, c-format
 msgid "could not write file: '%s'"
 msgstr "no se pudo escribir el archivo: '%s'"
 
-#: sequencer.c:4324
+#: sequencer.c:4498
 msgid "could not remove CHERRY_PICK_HEAD"
 msgstr "no se puede eliminar CHERRY_PICK_HEAD"
 
-#: sequencer.c:4331
+#: sequencer.c:4505
 msgid "could not commit staged changes."
 msgstr "no se pudo realizar el commit con los cambios en el área de stage."
 
-#: sequencer.c:4446
+#: sequencer.c:4621
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s: no se puede aplicar cherry-pick a un %s"
 
-#: sequencer.c:4450
+#: sequencer.c:4625
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s: revisión errónea"
 
-#: sequencer.c:4485
+#: sequencer.c:4660
 msgid "can't revert as initial commit"
 msgstr "no se puede revertir como commit inicial"
 
-#: sequencer.c:4962
+#: sequencer.c:5137
 msgid "make_script: unhandled options"
 msgstr "make_script: opciones desconocidas"
 
-#: sequencer.c:4965
+#: sequencer.c:5140
 msgid "make_script: error preparing revisions"
 msgstr "make_script: error preparando revisiones"
 
-#: sequencer.c:5206 sequencer.c:5223
+#: sequencer.c:5382 sequencer.c:5399
 msgid "nothing to do"
 msgstr "nada que hacer"
 
-#: sequencer.c:5242
+#: sequencer.c:5418
 msgid "could not skip unnecessary pick commands"
 msgstr "no se pudo saltar los comandos pick innecesarios"
 
-#: sequencer.c:5336
+#: sequencer.c:5512
 msgid "the script was already rearranged."
 msgstr "este script ya fue reorganizado."
 
@@ -7647,85 +8321,89 @@
 msgid "this operation must be run in a work tree"
 msgstr "esta operación debe ser realizada en un árbol de trabajo"
 
-#: setup.c:604
+#: setup.c:661
 #, c-format
 msgid "Expected git repo version <= %d, found %d"
 msgstr "Se esperaba versión de git repo  <= %d, encontrada %d"
 
-#: setup.c:612
+#: setup.c:669
 msgid "unknown repository extensions found:"
 msgstr "se encontró extensión de repositorio desconocida:"
 
-#: setup.c:631
+#: setup.c:681
+msgid "repo version is 0, but v1-only extensions found:"
+msgstr "versión de repo es 0, pero extensión v1-only encontrada:"
+
+#: setup.c:700
 #, c-format
 msgid "error opening '%s'"
 msgstr "error abriendo '%s'"
 
-#: setup.c:633
+#: setup.c:702
 #, c-format
 msgid "too large to be a .git file: '%s'"
 msgstr "muy grande para ser un archivo .git: '%s'"
 
-#: setup.c:635
+#: setup.c:704
 #, c-format
 msgid "error reading %s"
 msgstr "error leyendo %s"
 
-#: setup.c:637
+#: setup.c:706
 #, c-format
 msgid "invalid gitfile format: %s"
 msgstr "formato gitfile inválido: %s"
 
-#: setup.c:639
+#: setup.c:708
 #, c-format
 msgid "no path in gitfile: %s"
 msgstr "no hay ruta en gitfile: %s"
 
-#: setup.c:641
+#: setup.c:710
 #, c-format
 msgid "not a git repository: %s"
 msgstr "no es un repositorio git: %s"
 
-#: setup.c:743
+#: setup.c:812
 #, c-format
 msgid "'$%s' too big"
 msgstr "'$%s' muy grande"
 
-#: setup.c:757
+#: setup.c:826
 #, c-format
 msgid "not a git repository: '%s'"
 msgstr "no es un repositorio git: '%s'"
 
-#: setup.c:786 setup.c:788 setup.c:819
+#: setup.c:855 setup.c:857 setup.c:888
 #, c-format
 msgid "cannot chdir to '%s'"
 msgstr "no se puede aplicar chdir a '%s'"
 
-#: setup.c:791 setup.c:847 setup.c:857 setup.c:896 setup.c:904
+#: setup.c:860 setup.c:916 setup.c:926 setup.c:965 setup.c:973
 msgid "cannot come back to cwd"
 msgstr "no se puede volver a cwd"
 
-#: setup.c:918
+#: setup.c:987
 #, c-format
 msgid "failed to stat '%*s%s%s'"
 msgstr "falló al determinar '%*s%s%s'"
 
-#: setup.c:1156
+#: setup.c:1225
 msgid "Unable to read current working directory"
 msgstr "Incapaz de leer el directorio de trabajo actual"
 
-#: setup.c:1165 setup.c:1171
+#: setup.c:1234 setup.c:1240
 #, c-format
 msgid "cannot change to '%s'"
 msgstr "no se puede cambiar a '%s'"
 
-#: setup.c:1176
+#: setup.c:1245
 #, c-format
 msgid "not a git repository (or any of the parent directories): %s"
 msgstr ""
 "no es un repositorio git (ni ninguno de los directorios superiores): %s"
 
-#: setup.c:1182
+#: setup.c:1251
 #, c-format
 msgid ""
 "not a git repository (or any parent up to mount point %s)\n"
@@ -7735,7 +8413,7 @@
 "Parando en el límite del sistema de archivos "
 "(GIT_DISCOVERY_ACROSS_FILESYSTEM no establecido)."
 
-#: setup.c:1293
+#: setup.c:1362
 #, c-format
 msgid ""
 "problem with core.sharedRepository filemode value (0%.3o).\n"
@@ -7744,375 +8422,18 @@
 "problema con el valor del modo de archivo core.sharedRepository (0%.3o).\n"
 "El dueño de los archivos tiene que tener permisos de lectura y escritura."
 
-#: setup.c:1340
+#: setup.c:1409
 msgid "open /dev/null or dup failed"
 msgstr "falló al abrir /dev/null o dup"
 
-#: setup.c:1355
+#: setup.c:1424
 msgid "fork failed"
 msgstr "falló fork"
 
-#: setup.c:1360
+#: setup.c:1429
 msgid "setsid failed"
 msgstr "falló setsid"
 
-#: sha1-file.c:470
-#, c-format
-msgid "object directory %s does not exist; check .git/objects/info/alternates"
-msgstr "objeto directorio %s no existe; revisa .git/objects/info/alternates"
-
-#: sha1-file.c:521
-#, c-format
-msgid "unable to normalize alternate object path: %s"
-msgstr "incapaz de normalizar la ruta de objeto alterno: %s"
-
-#: sha1-file.c:593
-#, c-format
-msgid "%s: ignoring alternate object stores, nesting too deep"
-msgstr "%s: ignorando espacios de objetos alternos, anidado muy profundo"
-
-#: sha1-file.c:600
-#, c-format
-msgid "unable to normalize object directory: %s"
-msgstr "incapaz de normalizar directorio de objeto: %s"
-
-#: sha1-file.c:643
-msgid "unable to fdopen alternates lockfile"
-msgstr "no es posible hacer fdopen en lockfile alternos"
-
-#: sha1-file.c:661
-msgid "unable to read alternates file"
-msgstr "no es posible leer archivos alternos"
-
-#: sha1-file.c:668
-msgid "unable to move new alternates file into place"
-msgstr "no es posible mover archivos alternos en el lugar"
-
-#: sha1-file.c:703
-#, c-format
-msgid "path '%s' does not exist"
-msgstr "ruta '%s' no existe"
-
-#: sha1-file.c:724
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-"repositorio de referencia '%s' como un checkout vinculado no es soportado "
-"todavía."
-
-#: sha1-file.c:730
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "repositorio de referencia '%s' no es un repositorio local."
-
-#: sha1-file.c:736
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "repositorio de referencia '%s' es superficial (shallow)"
-
-#: sha1-file.c:744
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "repositorio de referencia '% s' está injertado"
-
-#: sha1-file.c:804
-#, c-format
-msgid "invalid line while parsing alternate refs: %s"
-msgstr "línea inválida mientras se analizaban refs alternas: %s"
-
-#: sha1-file.c:954
-#, c-format
-msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
-msgstr "intentando usar mmap %<PRIuMAX> sobre límite %<PRIuMAX>"
-
-#: sha1-file.c:975
-msgid "mmap failed"
-msgstr "mmap falló"
-
-#: sha1-file.c:1139
-#, c-format
-msgid "object file %s is empty"
-msgstr "archivo de objeto %s está vacío"
-
-#: sha1-file.c:1274 sha1-file.c:2454
-#, c-format
-msgid "corrupt loose object '%s'"
-msgstr "objeto perdido corrupto '%s'"
-
-#: sha1-file.c:1276 sha1-file.c:2458
-#, c-format
-msgid "garbage at end of loose object '%s'"
-msgstr "basura al final del objeto perdido '%s'"
-
-#: sha1-file.c:1318
-msgid "invalid object type"
-msgstr "tipo de objeto inválido"
-
-#: sha1-file.c:1402
-#, c-format
-msgid "unable to unpack %s header with --allow-unknown-type"
-msgstr "no es posible desempacar header %s con --allow-unknown-type"
-
-#: sha1-file.c:1405
-#, c-format
-msgid "unable to unpack %s header"
-msgstr "incapaz de desempaquetar header %s"
-
-#: sha1-file.c:1411
-#, c-format
-msgid "unable to parse %s header with --allow-unknown-type"
-msgstr "no es posible analizar header %s con --allow-unknown-type"
-
-#: sha1-file.c:1414
-#, c-format
-msgid "unable to parse %s header"
-msgstr "incapaz de analizar header %s"
-
-#: sha1-file.c:1640
-#, c-format
-msgid "failed to read object %s"
-msgstr "falló al leer objeto %s"
-
-#: sha1-file.c:1644
-#, c-format
-msgid "replacement %s not found for %s"
-msgstr "reemplazo %s no encontrado para %s"
-
-#: sha1-file.c:1648
-#, c-format
-msgid "loose object %s (stored in %s) is corrupt"
-msgstr "objeto perdido %s (guardado en %s) está corrompido"
-
-#: sha1-file.c:1652
-#, c-format
-msgid "packed object %s (stored in %s) is corrupt"
-msgstr "paquete de objeto %s (guardado en %s) está corrompido"
-
-#: sha1-file.c:1757
-#, c-format
-msgid "unable to write file %s"
-msgstr "no es posible escribir archivo %s"
-
-#: sha1-file.c:1764
-#, c-format
-msgid "unable to set permission to '%s'"
-msgstr "no se pudo poner permisos a '%s'"
-
-#: sha1-file.c:1771
-msgid "file write error"
-msgstr "falló de escritura"
-
-#: sha1-file.c:1791
-msgid "error when closing loose object file"
-msgstr "error cerrando el archivo de objeto suelto"
-
-#: sha1-file.c:1856
-#, c-format
-msgid "insufficient permission for adding an object to repository database %s"
-msgstr ""
-"permisos insuficientes para agregar un objeto a la base de datos del "
-"repositorio %s"
-
-#: sha1-file.c:1858
-msgid "unable to create temporary file"
-msgstr "no es posible crear un archivo temporal"
-
-#: sha1-file.c:1882
-msgid "unable to write loose object file"
-msgstr "no es posible escribir el archivo de objeto suelto"
-
-#: sha1-file.c:1888
-#, c-format
-msgid "unable to deflate new object %s (%d)"
-msgstr "no es posible desinflar el objeto nuevo %s (%d)"
-
-#: sha1-file.c:1892
-#, c-format
-msgid "deflateEnd on object %s failed (%d)"
-msgstr "deflateEnd en objeto %s falló (%d)"
-
-#: sha1-file.c:1896
-#, c-format
-msgid "confused by unstable object source data for %s"
-msgstr "confundido por fuente de data de objetos inestable para %s"
-
-#: sha1-file.c:1906 builtin/pack-objects.c:1085
-#, c-format
-msgid "failed utime() on %s"
-msgstr "falló utime() en %s"
-
-#: sha1-file.c:1983
-#, c-format
-msgid "cannot read object for %s"
-msgstr "no se pudo leer el objeto para %s"
-
-#: sha1-file.c:2022
-msgid "corrupt commit"
-msgstr "commit corrupto"
-
-#: sha1-file.c:2030
-msgid "corrupt tag"
-msgstr "tag corrupto"
-
-#: sha1-file.c:2130
-#, c-format
-msgid "read error while indexing %s"
-msgstr "error leyendo al indexar %s"
-
-#: sha1-file.c:2133
-#, c-format
-msgid "short read while indexing %s"
-msgstr "lectura corta al indexar %s"
-
-#: sha1-file.c:2206 sha1-file.c:2216
-#, c-format
-msgid "%s: failed to insert into database"
-msgstr "%s: falló al insertar en la base de datos"
-
-#: sha1-file.c:2222
-#, c-format
-msgid "%s: unsupported file type"
-msgstr "%s: tipo de archivo no soportado"
-
-#: sha1-file.c:2246
-#, c-format
-msgid "%s is not a valid object"
-msgstr "%s no es objeto válido"
-
-#: sha1-file.c:2248
-#, c-format
-msgid "%s is not a valid '%s' object"
-msgstr "%s no es un objeto '%s' válido"
-
-#: sha1-file.c:2275 builtin/index-pack.c:155
-#, c-format
-msgid "unable to open %s"
-msgstr "no es posible abrir %s"
-
-#: sha1-file.c:2465 sha1-file.c:2518
-#, c-format
-msgid "hash mismatch for %s (expected %s)"
-msgstr "hash no concuerda para %s (se esperaba %s)"
-
-#: sha1-file.c:2489
-#, c-format
-msgid "unable to mmap %s"
-msgstr "no es posible hacer mmap a %s"
-
-#: sha1-file.c:2494
-#, c-format
-msgid "unable to unpack header of %s"
-msgstr "incapaz de desempaquetar header de %s"
-
-#: sha1-file.c:2500
-#, c-format
-msgid "unable to parse header of %s"
-msgstr "incapaz de analizar header de %s"
-
-#: sha1-file.c:2511
-#, c-format
-msgid "unable to unpack contents of %s"
-msgstr "no es posible desempaquetar contenidos de %s"
-
-#: sha1-name.c:486
-#, c-format
-msgid "short SHA1 %s is ambiguous"
-msgstr "SHA1 %s corto es ambiguo"
-
-#: sha1-name.c:497
-msgid "The candidates are:"
-msgstr "Los candidatos son:"
-
-#: sha1-name.c:796
-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 switch -c $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 normalmente nunca crea una ref que termine con 40 caracteres hex\n"
-"porque esto sería ignorado cuando solo se especifiquen 40-hex. Estas refs\n"
-"tal vez sean creadas por error. Por ejemplo,\n"
-"\n"
-"  git switch -c $br $(git rev-parse ...)\n"
-"\n"
-"donde \"$br\" está de alguna manera vacía y una ref de 40-hex es creada. Por "
-"favor\n"
-"examina estas refs y tal vez bórralas. Silencia este mensaje \n"
-"ejecutando \"git config advice.objectNameWarning false\""
-
-#: sha1-name.c:916
-#, c-format
-msgid "log for '%.*s' only goes back to %s"
-msgstr "log para '%.*s' solo va hasta %s"
-
-#: sha1-name.c:924
-#, c-format
-msgid "log for '%.*s' only has %d entries"
-msgstr "log para '%.*s' solo tiene %d entradas"
-
-#: sha1-name.c:1689
-#, c-format
-msgid "path '%s' exists on disk, but not in '%.*s'"
-msgstr "la ruta '%s' existe en disco, pero no en '%.*s'"
-
-#: sha1-name.c:1695
-#, c-format
-msgid ""
-"path '%s' exists, but not '%s'\n"
-"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
-msgstr ""
-"ruta '%s' existe, pero no '%s'\n"
-"ayuda: ¿Quisiste decir '%.*s:%s' o '%.*s:./%s'?"
-
-#: sha1-name.c:1704
-#, c-format
-msgid "path '%s' does not exist in '%.*s'"
-msgstr "ruta '%s' no existe en '%.*s'"
-
-#: sha1-name.c:1732
-#, c-format
-msgid ""
-"path '%s' is in the index, but not at stage %d\n"
-"hint: Did you mean ':%d:%s'?"
-msgstr ""
-"ruta '%s' está en el index, pero no en stage %d\n"
-"ayuda:¿Quisiste decir: '%d:%s'?"
-
-#: sha1-name.c:1748
-#, c-format
-msgid ""
-"path '%s' is in the index, but not '%s'\n"
-"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
-msgstr ""
-"ruta '%s' está en el index, pero no '%s'\n"
-"ayuda:¿Quisiste decir ':%d:%s' o ':%d:./%s'?"
-
-#: sha1-name.c:1756
-#, c-format
-msgid "path '%s' exists on disk, but not in the index"
-msgstr "ruta '%s' existe en el disco, pero no en el index"
-
-#: sha1-name.c:1758
-#, c-format
-msgid "path '%s' does not exist (neither on disk nor in the index)"
-msgstr "ruta '%s' no existe (ni en disco ni en el index)"
-
-#: sha1-name.c:1771
-msgid "relative path syntax can't be used outside working tree"
-msgstr ""
-"la sintaxis de ruta relativa no se puede usar fuera del directorio de trabajo"
-
-#: sha1-name.c:1909
-#, c-format
-msgid "invalid object name '%.*s'."
-msgstr "nombre de objeto no válido: '%.*s'."
-
 #. TRANSLATORS: IEC 80000-13:2008 gibibyte
 #: strbuf.c:848
 #, c-format
@@ -8165,6 +8486,12 @@
 msgstr[0] "%u bytes/s"
 msgstr[1] "%u bytes/s"
 
+#: strbuf.c:1166 wrapper.c:199 wrapper.c:369 builtin/am.c:719
+#: builtin/rebase.c:866
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "no se pudo abrir '%s' para escritura"
+
 #: strbuf.c:1175
 #, c-format
 msgid "could not edit '%s'"
@@ -8225,12 +8552,12 @@
 msgid "Pathspec '%s' is in submodule '%.*s'"
 msgstr "El patrón de ruta '%s' está en el submódulo '%.*s'"
 
-#: submodule.c:434
+#: submodule.c:435
 #, c-format
 msgid "bad --ignore-submodules argument: %s"
 msgstr "mal argumento --ignore-submodules: %s"
 
-#: submodule.c:815
+#: submodule.c:817
 #, c-format
 msgid ""
 "Submodule in commit %s at path: '%s' collides with a submodule named the "
@@ -8239,50 +8566,50 @@
 "Submódulo en el commit %s en ruta: '%s' colisiona con un submódulo llamado "
 "igual. Saltandolo."
 
-#: submodule.c:910
+#: submodule.c:920
 #, c-format
 msgid "submodule entry '%s' (%s) is a %s, not a commit"
 msgstr "entrada de submódulo '%s' (%s) es un %s, no un commit"
 
-#: submodule.c:995
+#: submodule.c:1005
 #, c-format
 msgid ""
 "Could not run 'git rev-list <commits> --not --remotes -n 1' command in "
 "submodule %s"
 msgstr ""
-"no se pudo ejecutar comando 'git rev-list <commits> --not --remotes -n 1' en "
+"No se pudo ejecutar comando 'git rev-list <commits> --not --remotes -n 1' en "
 "el submódulo %s"
 
-#: submodule.c:1118
+#: submodule.c:1128
 #, c-format
 msgid "process for submodule '%s' failed"
 msgstr "proceso para submódulo '%s' falló"
 
-#: submodule.c:1147 builtin/branch.c:678 builtin/submodule--helper.c:2045
+#: submodule.c:1157 builtin/branch.c:689 builtin/submodule--helper.c:2469
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Falló al resolver HEAD como un ref válido."
 
-#: submodule.c:1158
+#: submodule.c:1168
 #, c-format
 msgid "Pushing submodule '%s'\n"
 msgstr "Empujando submódulo '%s'\n"
 
-#: submodule.c:1161
+#: submodule.c:1171
 #, c-format
 msgid "Unable to push submodule '%s'\n"
 msgstr "No es posible hacer push al submódulo '%s'\n"
 
-#: submodule.c:1453
+#: submodule.c:1463
 #, c-format
 msgid "Fetching submodule %s%s\n"
 msgstr "Haciendo fetch al submódulo %s%s\n"
 
-#: submodule.c:1483
+#: submodule.c:1497
 #, c-format
 msgid "Could not access submodule '%s'\n"
 msgstr "No pudo acceder al submódulo '%s'\n"
 
-#: submodule.c:1637
+#: submodule.c:1652
 #, c-format
 msgid ""
 "Errors during submodule fetch:\n"
@@ -8291,61 +8618,61 @@
 "Errores durante el fetch del submódulo:\n"
 "%s"
 
-#: submodule.c:1662
+#: submodule.c:1677
 #, c-format
 msgid "'%s' not recognized as a git repository"
 msgstr "'%s' no reconocido como un repositorio git"
 
-#: submodule.c:1679
+#: submodule.c:1694
 #, c-format
 msgid "Could not run 'git status --porcelain=2' in submodule %s"
 msgstr "No se pudo ejecutar 'git status --procelain=2' en el submódulo %s"
 
-#: submodule.c:1720
+#: submodule.c:1735
 #, c-format
 msgid "'git status --porcelain=2' failed in submodule %s"
 msgstr "'git status --procelain=2' falló en el submódulo %s"
 
-#: submodule.c:1800
+#: submodule.c:1810
 #, c-format
 msgid "could not start 'git status' in submodule '%s'"
 msgstr "no se pudo comenzar 'git status' en el submódulo '%s'"
 
-#: submodule.c:1813
+#: submodule.c:1823
 #, c-format
 msgid "could not run 'git status' in submodule '%s'"
 msgstr "no se pudo ejecutar 'git status' en el submódulo '%s'"
 
-#: submodule.c:1828
+#: submodule.c:1838
 #, c-format
 msgid "Could not unset core.worktree setting in submodule '%s'"
 msgstr "No se pudo quitar configuración core.worktree en submódulo '%s'"
 
-#: submodule.c:1855 submodule.c:2165
+#: submodule.c:1865 submodule.c:2175
 #, c-format
 msgid "could not recurse into submodule '%s'"
 msgstr "no pudo recursar en el submódulo '%s'"
 
-#: submodule.c:1876
+#: submodule.c:1886
 msgid "could not reset submodule index"
 msgstr "no se pudo reiniciar el index del submódulo"
 
-#: submodule.c:1918
+#: submodule.c:1928
 #, c-format
 msgid "submodule '%s' has dirty index"
 msgstr "submódulo '%s' tiene un índice corrupto"
 
-#: submodule.c:1970
+#: submodule.c:1980
 #, c-format
 msgid "Submodule '%s' could not be updated."
 msgstr "Submódulo '%s' no pudo ser actualizado."
 
-#: submodule.c:2038
+#: submodule.c:2048
 #, c-format
 msgid "submodule git dir '%s' is inside git dir '%.*s'"
 msgstr "submódulo git dir '%s' esta dentro de git dir '%.*s'"
 
-#: submodule.c:2059
+#: submodule.c:2069
 #, c-format
 msgid ""
 "relocate_gitdir for submodule '%s' with more than one worktree not supported"
@@ -8353,17 +8680,17 @@
 "relocate_gitdir para el submódulo '%s' con más de un árbol de trabajo no "
 "soportado"
 
-#: submodule.c:2071 submodule.c:2130
+#: submodule.c:2081 submodule.c:2140
 #, c-format
 msgid "could not lookup name for submodule '%s'"
 msgstr "no se pudo resolver el nombre para el submódulo '%s'"
 
-#: submodule.c:2075
+#: submodule.c:2085
 #, c-format
 msgid "refusing to move '%s' into an existing git dir"
 msgstr "rechazando mover '%s' dentro de un directorio git existente"
 
-#: submodule.c:2082
+#: submodule.c:2092
 #, c-format
 msgid ""
 "Migrating git directory of '%s%s' from\n"
@@ -8374,65 +8701,65 @@
 "'%s' hacia\n"
 "'%s'\n"
 
-#: submodule.c:2210
+#: submodule.c:2220
 msgid "could not start ls-files in .."
 msgstr "no se pudo comenzar ls-files en .."
 
-#: submodule.c:2250
+#: submodule.c:2260
 #, c-format
 msgid "ls-tree returned unexpected return code %d"
 msgstr "ls-tree devolvió un código %d inesperado"
 
-#: trailer.c:238
+#: trailer.c:236
 #, c-format
 msgid "running trailer command '%s' failed"
 msgstr "ejecución del comando de remolque '%s' falló"
 
-#: trailer.c:485 trailer.c:490 trailer.c:495 trailer.c:549 trailer.c:553
-#: trailer.c:557
+#: trailer.c:483 trailer.c:488 trailer.c:493 trailer.c:547 trailer.c:551
+#: trailer.c:555
 #, c-format
 msgid "unknown value '%s' for key '%s'"
 msgstr "valor '%s' desconocido para la clave '%s'"
 
-#: trailer.c:539 trailer.c:544 builtin/remote.c:298 builtin/remote.c:323
+#: trailer.c:537 trailer.c:542 builtin/remote.c:299 builtin/remote.c:324
 #, c-format
 msgid "more than one %s"
 msgstr "más de un %s"
 
-#: trailer.c:730
+#: trailer.c:728
 #, c-format
 msgid "empty trailer token in trailer '%.*s'"
 msgstr "token de remolque vacío en el trailer '%.*s'"
 
-#: trailer.c:750
+#: trailer.c:748
 #, c-format
 msgid "could not read input file '%s'"
 msgstr "no se pudo leer el archivo de entrada '%s'"
 
-#: trailer.c:753
+#: trailer.c:751 builtin/mktag.c:91
 msgid "could not read from stdin"
 msgstr "no se pudo leer desde stdin"
 
-#: trailer.c:1011 wrapper.c:673
+#: trailer.c:1009 wrapper.c:676
 #, c-format
 msgid "could not stat %s"
 msgstr "no se pudo definir %s"
 
-#: trailer.c:1013
+#: trailer.c:1011
 #, c-format
 msgid "file %s is not a regular file"
 msgstr "el archivo %s no es un archivo regular"
 
-#: trailer.c:1015
+#: trailer.c:1013
 #, c-format
 msgid "file %s is not writable by user"
 msgstr "el archivo %s no puede ser escrito por el usuario"
 
-#: trailer.c:1027
+#: trailer.c:1025
 msgid "could not open temporary file"
 msgstr "no se pudo abrir el archivo temporal"
 
-#: trailer.c:1067
+#: trailer.c:1065
 #, c-format
 msgid "could not rename temporary file to %s"
 msgstr "no se pudo renombrar el archivo temporal a %s"
@@ -8481,7 +8808,7 @@
 msgid "error while running fast-import"
 msgstr "error al ejecutar fast-import"
 
-#: transport-helper.c:549 transport-helper.c:1156
+#: transport-helper.c:549 transport-helper.c:1237
 #, c-format
 msgid "could not read ref %s"
 msgstr "no se pudo leer la referencia %s"
@@ -8499,7 +8826,7 @@
 msgid "invalid remote service path"
 msgstr "ruta de servicio remoto inválida"
 
-#: transport-helper.c:661 transport.c:1347
+#: transport-helper.c:661 transport.c:1447
 msgid "operation not supported by protocol"
 msgstr "operación no soportada por protocolo"
 
@@ -8508,59 +8835,68 @@
 msgid "can't connect to subservice %s"
 msgstr "no se puede conectar al subservicio %s"
 
-#: transport-helper.c:740
+#: transport-helper.c:745
+msgid "'option' without a matching 'ok/error' directive"
+msgstr "'opción' sin una directiva correspondiente 'ok/error'"
+
+#: transport-helper.c:788
 #, c-format
 msgid "expected ok/error, helper said '%s'"
 msgstr "se esperaba ok/error, helper dijo '%s'"
 
-#: transport-helper.c:793
+#: transport-helper.c:845
 #, c-format
 msgid "helper reported unexpected status of %s"
 msgstr "helper reportó estado inesperado de %s"
 
-#: transport-helper.c:854
+#: transport-helper.c:928
 #, c-format
 msgid "helper %s does not support dry-run"
 msgstr "helper %s no soporta dry-run"
 
-#: transport-helper.c:857
+#: transport-helper.c:931
 #, c-format
 msgid "helper %s does not support --signed"
 msgstr "helper %s no soporta --signed"
 
-#: transport-helper.c:860
+#: transport-helper.c:934
 #, c-format
 msgid "helper %s does not support --signed=if-asked"
 msgstr "helper %s no soporta --signed=if-asked"
 
-#: transport-helper.c:865
+#: transport-helper.c:939
 #, c-format
 msgid "helper %s does not support --atomic"
 msgstr "helper %s no soporta --atomic"
 
-#: transport-helper.c:871
+#: transport-helper.c:943
+#, c-format
+msgid "helper %s does not support --%s"
+msgstr "helper %s no soporta --%s"
+
+#: transport-helper.c:950
 #, c-format
 msgid "helper %s does not support 'push-option'"
 msgstr "helper %s no soporta 'push-option'"
 
-#: transport-helper.c:970
+#: transport-helper.c:1050
 msgid "remote-helper doesn't support push; refspec needed"
 msgstr "remote-helper no soporta push; se necesita refspec"
 
-#: transport-helper.c:975
+#: transport-helper.c:1055
 #, c-format
 msgid "helper %s does not support 'force'"
 msgstr "helper %s no soporta 'force'"
 
-#: transport-helper.c:1022
+#: transport-helper.c:1102
 msgid "couldn't run fast-export"
 msgstr "no se pudo ejecutar fast-export"
 
-#: transport-helper.c:1027
+#: transport-helper.c:1107
 msgid "error while running fast-export"
 msgstr "error al ejecutar fast-export"
 
-#: transport-helper.c:1052
+#: transport-helper.c:1132
 #, c-format
 msgid ""
 "No refs in common and none specified; doing nothing.\n"
@@ -8569,52 +8905,52 @@
 "No hay refs comunes y ninguno especificado; no se hace nada.\n"
 "Tal vez deberías especificar un branch.\n"
 
-#: transport-helper.c:1133
+#: transport-helper.c:1214
 #, c-format
 msgid "unsupported object format '%s'"
 msgstr "formado de objeto no soportado '%s'"
 
-#: transport-helper.c:1142
+#: transport-helper.c:1223
 #, c-format
 msgid "malformed response in ref list: %s"
 msgstr "respuesta malformada en lista de refs: %s"
 
-#: transport-helper.c:1294
+#: transport-helper.c:1375
 #, c-format
 msgid "read(%s) failed"
 msgstr "leer(%s) falló"
 
-#: transport-helper.c:1321
+#: transport-helper.c:1402
 #, c-format
 msgid "write(%s) failed"
 msgstr "escribir(%s) falló"
 
-#: transport-helper.c:1370
+#: transport-helper.c:1451
 #, c-format
 msgid "%s thread failed"
 msgstr "hilo %s falló"
 
-#: transport-helper.c:1374
+#: transport-helper.c:1455
 #, c-format
 msgid "%s thread failed to join: %s"
 msgstr "hilo %s falló al unirse: %s"
 
-#: transport-helper.c:1393 transport-helper.c:1397
+#: transport-helper.c:1474 transport-helper.c:1478
 #, c-format
 msgid "can't start thread for copying data: %s"
 msgstr "no se puede iniciar el hilo para copiar data: %s"
 
-#: transport-helper.c:1434
+#: transport-helper.c:1515
 #, c-format
 msgid "%s process failed to wait"
 msgstr "proceso %s falló al esperar"
 
-#: transport-helper.c:1438
+#: transport-helper.c:1519
 #, c-format
 msgid "%s process failed"
 msgstr "proceso %s falló"
 
-#: transport-helper.c:1456 transport-helper.c:1465
+#: transport-helper.c:1537 transport-helper.c:1546
 msgid "can't start thread for copying data"
 msgstr "no se puede iniciar hilo para copiar data"
 
@@ -8633,37 +8969,37 @@
 msgid "transport: invalid depth option '%s'"
 msgstr "transport: opción inválida '%s'"
 
-#: transport.c:272
+#: transport.c:269
 msgid "see protocol.version in 'git help config' for more details"
 msgstr "ver protocol.version en 'git help config' para más información"
 
-#: transport.c:273
+#: transport.c:270
 msgid "server options require protocol version 2 or later"
 msgstr "opciones del servidor requieren protocolo versión 2 o posterior"
 
-#: transport.c:631
+#: transport.c:727
 msgid "could not parse transport.color.* config"
 msgstr "no se pudo analizar valor de configuración transport.color.*"
 
-#: transport.c:704
+#: transport.c:802
 msgid "support for protocol v2 not implemented yet"
 msgstr "soporte para protocolo v2 no implementado todavía"
 
-#: transport.c:838
+#: transport.c:936
 #, c-format
 msgid "unknown value for config '%s': %s"
 msgstr "valor desconocido para configuración '%s': %s"
 
-#: transport.c:904
+#: transport.c:1002
 #, c-format
 msgid "transport '%s' not allowed"
 msgstr "transporte '%s' no permitido"
 
-#: transport.c:957
+#: transport.c:1055
 msgid "git-over-rsync is no longer supported"
 msgstr "git-over-rsync ya no es soportado"
 
-#: transport.c:1059
+#: transport.c:1157
 #, c-format
 msgid ""
 "The following submodule paths contain changes that can\n"
@@ -8672,7 +9008,7 @@
 "La siguiente ruta de submódulo contiene cambios que no\n"
 "pueden ser encontrados en ningún remoto:\n"
 
-#: transport.c:1063
+#: transport.c:1161
 #, c-format
 msgid ""
 "\n"
@@ -8699,27 +9035,27 @@
 "para hacer un push al remoto.\n"
 "\n"
 
-#: transport.c:1071
+#: transport.c:1169
 msgid "Aborting."
 msgstr "Abortando."
 
-#: transport.c:1216
+#: transport.c:1316
 msgid "failed to push all needed submodules"
 msgstr "falló al hacer push a todos los submódulos necesarios"
 
-#: tree-walk.c:32
+#: tree-walk.c:33
 msgid "too-short tree object"
 msgstr "objeto de árbol muy corto"
 
-#: tree-walk.c:38
+#: tree-walk.c:39
 msgid "malformed mode in tree entry"
 msgstr "modo mal formado en la entrada de árbol"
 
-#: tree-walk.c:42
+#: tree-walk.c:43
 msgid "empty filename in tree entry"
 msgstr "nombre de archivo vacío en la entrada de árbol"
 
-#: tree-walk.c:117
+#: tree-walk.c:118
 msgid "too-short tree file"
 msgstr "archivo de árbol muy corto"
 
@@ -8992,7 +9328,7 @@
 msgid "Updating index flags"
 msgstr "Actualizando flags del index"
 
-#: upload-pack.c:1415
+#: upload-pack.c:1543
 msgid "expected flush after fetch arguments"
 msgstr "se espera flush tras argumentos fetch"
 
@@ -9029,50 +9365,118 @@
 msgid "Fetching objects"
 msgstr "Haciendo fetch a objetos"
 
-#: worktree.c:248 builtin/am.c:2098
+#: worktree.c:238 builtin/am.c:2103
 #, c-format
 msgid "failed to read '%s'"
 msgstr "falló al leer '%s'"
 
-#: worktree.c:295
+#: worktree.c:304
 #, c-format
 msgid "'%s' at main working tree is not the repository directory"
 msgstr ""
 "'%s' en el árbol de trabajo principal no es el directorio del repositorio"
 
-#: worktree.c:306
+#: worktree.c:315
 #, c-format
 msgid "'%s' file does not contain absolute path to the working tree location"
 msgstr ""
 "archivo '%s' no contiene una ruta absoluta a la ubicación del árbol de "
 "trabajo"
 
-#: worktree.c:318
+#: worktree.c:327
 #, c-format
 msgid "'%s' does not exist"
 msgstr "'%s' no existe"
 
-#: worktree.c:324
+#: worktree.c:333
 #, c-format
 msgid "'%s' is not a .git file, error code %d"
 msgstr "'%s' no es un archivo .git, código de error %d"
 
-#: worktree.c:333
+#: worktree.c:342
 #, c-format
 msgid "'%s' does not point back to '%s'"
 msgstr "'%s' no apunta de vuelta a '%s'"
 
-#: wrapper.c:194 wrapper.c:364
+#: worktree.c:608
+msgid "not a directory"
+msgstr "no es un directorio"
+
+#: worktree.c:617
+msgid ".git is not a file"
+msgstr ".git no es un archivo"
+
+#: worktree.c:619
+msgid ".git file broken"
+msgstr "archivo .git roto"
+
+#: worktree.c:621
+msgid ".git file incorrect"
+msgstr "archivo .git incorrecto"
+
+#: worktree.c:727
+msgid "not a valid path"
+msgstr "no es una ruta válida"
+
+#: worktree.c:733
+msgid "unable to locate repository; .git is not a file"
+msgstr "no es posible ubicar el repositorio; .git no es un archivo"
+
+#: worktree.c:737
+msgid "unable to locate repository; .git file does not reference a repository"
+msgstr ""
+"incapaz de localizar el repositorio; El archivo .git no hace referencia a un "
+"repositorio"
+
+#: worktree.c:741
+msgid "unable to locate repository; .git file broken"
+msgstr "no es posible ubicar el repositorio; archivo .git roto"
+
+#: worktree.c:747
+msgid "gitdir unreadable"
+msgstr "gitdir ilegible"
+
+#: worktree.c:751
+msgid "gitdir incorrect"
+msgstr "gitdir incorrecto"
+
+#: worktree.c:776
+msgid "not a valid directory"
+msgstr "no en un directorio válido"
+
+#: worktree.c:782
+msgid "gitdir file does not exist"
+msgstr "archivo gitdir no existe"
+
+#: worktree.c:787 worktree.c:796
+#, c-format
+msgid "unable to read gitdir file (%s)"
+msgstr "no es posible leer archivo gitdir (%s)"
+
+#: worktree.c:806
+#, c-format
+msgid "short read (expected %<PRIuMAX> bytes, read %<PRIuMAX>)"
+msgstr "lectura corta (se esperaba %<PRIuMAX> bytes, se leyó %<PRIuMAX>)"
+
+#: worktree.c:814
+msgid "invalid gitdir file"
+msgstr "archivo gitdir inválido"
+
+#: worktree.c:822
+msgid "gitdir file points to non-existent location"
+msgstr "archivo gitdir apunta a una ubicación inexistente"
+
+#: wrapper.c:197 wrapper.c:367
 #, c-format
 msgid "could not open '%s' for reading and writing"
 msgstr "no se pudo abrir '%s' para lectura y escritura"
 
-#: wrapper.c:395 wrapper.c:596
+#: wrapper.c:398 wrapper.c:599
 #, c-format
 msgid "unable to access '%s'"
 msgstr "no es posible acceder '%s'"
 
-#: wrapper.c:604
+#: wrapper.c:607
 msgid "unable to get current working directory"
 msgstr "no es posible obtener el directorio de trabajo actual"
 
@@ -9148,79 +9552,79 @@
 msgstr ""
 "  (usa \"git %s <archivo>...\" para incluirlo a lo que se será confirmado)"
 
-#: wt-status.c:268
+#: wt-status.c:266
 msgid "both deleted:"
 msgstr "ambos borrados:"
 
-#: wt-status.c:270
+#: wt-status.c:268
 msgid "added by us:"
 msgstr "agregado por nosotros:"
 
-#: wt-status.c:272
+#: wt-status.c:270
 msgid "deleted by them:"
 msgstr "borrados por ellos:"
 
-#: wt-status.c:274
+#: wt-status.c:272
 msgid "added by them:"
 msgstr "agregado por ellos:"
 
-#: wt-status.c:276
+#: wt-status.c:274
 msgid "deleted by us:"
 msgstr "borrado por nosotros:"
 
-#: wt-status.c:278
+#: wt-status.c:276
 msgid "both added:"
 msgstr "ambos agregados:"
 
-#: wt-status.c:280
+#: wt-status.c:278
 msgid "both modified:"
 msgstr "ambos modificados:"
 
-#: wt-status.c:290
+#: wt-status.c:288
 msgid "new file:"
 msgstr "nuevo archivo:"
 
-#: wt-status.c:292
+#: wt-status.c:290
 msgid "copied:"
 msgstr "copiado:"
 
-#: wt-status.c:294
+#: wt-status.c:292
 msgid "deleted:"
 msgstr "borrado:"
 
-#: wt-status.c:296
+#: wt-status.c:294
 msgid "modified:"
 msgstr "modificado:"
 
-#: wt-status.c:298
+#: wt-status.c:296
 msgid "renamed:"
 msgstr "renombrado:"
 
-#: wt-status.c:300
+#: wt-status.c:298
 msgid "typechange:"
 msgstr "cambio de tipo:"
 
-#: wt-status.c:302
+#: wt-status.c:300
 msgid "unknown:"
 msgstr "desconocido:"
 
-#: wt-status.c:304
+#: wt-status.c:302
 msgid "unmerged:"
 msgstr "des-fusionado:"
 
-#: wt-status.c:384
+#: wt-status.c:382
 msgid "new commits, "
 msgstr "nuevos commits, "
 
-#: wt-status.c:386
+#: wt-status.c:384
 msgid "modified content, "
 msgstr "contenido modificado, "
 
-#: wt-status.c:388
+#: wt-status.c:386
 msgid "untracked content, "
 msgstr "contenido no rastreado, "
 
-#: wt-status.c:904
+#: wt-status.c:905
 #, c-format
 msgid "Your stash currently has %d entry"
 msgid_plural "Your stash currently has %d entries"
@@ -9484,6 +9888,14 @@
 msgid "rebase in progress; onto "
 msgstr "rebase en progreso; en "
 
+#: wt-status.c:1747
+msgid "HEAD detached at "
+msgstr "HEAD desacoplada en "
+
+#: wt-status.c:1749
+msgid "HEAD detached from "
+msgstr "HEAD desacoplada de "
+
 #: wt-status.c:1752
 msgid "Not currently on any branch."
 msgstr "Actualmente no estás en ninguna rama."
@@ -9534,12 +9946,12 @@
 msgstr ""
 "sin cambios agregados al commit (usa \"git add\" y/o \"git commit -a\")\n"
 
-#: wt-status.c:1812
+#: wt-status.c:1813
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "no se agregaron cambios al commit\n"
 
-#: wt-status.c:1815
+#: wt-status.c:1817
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -9548,72 +9960,72 @@
 "no hay nada agregado al commit pero hay archivos sin seguimiento presentes "
 "(usa \"git add\" para hacerles seguimiento)\n"
 
-#: wt-status.c:1818
+#: wt-status.c:1821
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr ""
 "no hay nada agregado para confirmar, pero hay archivos sin seguimiento "
 "presentes\n"
 
-#: wt-status.c:1821
+#: wt-status.c:1825
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 "no hay nada para confirmar (crea/copia archivos y usa \"git add\" para "
 "hacerles seguimiento)\n"
 
-#: wt-status.c:1824 wt-status.c:1829
+#: wt-status.c:1829 wt-status.c:1835
 #, c-format
 msgid "nothing to commit\n"
 msgstr "nada para hacer commit\n"
 
-#: wt-status.c:1827
+#: wt-status.c:1832
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
 "nada para hacer commit (usa -u para mostrar los archivos no rastreados)\n"
 
-#: wt-status.c:1831
+#: wt-status.c:1837
 #, c-format
 msgid "nothing to commit, working tree clean\n"
 msgstr "nada para hacer commit, el árbol de trabajo está limpio\n"
 
-#: wt-status.c:1944
+#: wt-status.c:1942
 msgid "No commits yet on "
 msgstr "No hay commits todavía en "
 
-#: wt-status.c:1948
+#: wt-status.c:1946
 msgid "HEAD (no branch)"
 msgstr "HEAD (sin rama)"
 
-#: wt-status.c:1979
+#: wt-status.c:1977
 msgid "different"
 msgstr "diferente"
 
-#: wt-status.c:1981 wt-status.c:1989
+#: wt-status.c:1979 wt-status.c:1987
 msgid "behind "
 msgstr "detrás "
 
-#: wt-status.c:1984 wt-status.c:1987
+#: wt-status.c:1982 wt-status.c:1985
 msgid "ahead "
 msgstr "adelante "
 
 #. TRANSLATORS: the action is e.g. "pull with rebase"
-#: wt-status.c:2509
+#: wt-status.c:2507
 #, c-format
 msgid "cannot %s: You have unstaged changes."
 msgstr "no se puede %s: Tienes cambios sin marcar."
 
-#: wt-status.c:2515
+#: wt-status.c:2513
 msgid "additionally, your index contains uncommitted changes."
 msgstr "adicionalmente, tu índice contiene cambios que no están en un commit."
 
-#: wt-status.c:2517
+#: wt-status.c:2515
 #, c-format
 msgid "cannot %s: Your index contains uncommitted changes."
 msgstr "no se puede %s: Tu índice contiene cambios que no están en un commit."
 
-#: compat/precompose_utf8.c:58 builtin/clone.c:456
+#: compat/precompose_utf8.c:58 builtin/clone.c:457
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "falló al desvincular '%s'"
@@ -9622,128 +10034,133 @@
 msgid "git add [<options>] [--] <pathspec>..."
 msgstr "git add [<opción>] [--] <especificación-de-ruta>..."
 
-#: builtin/add.c:88
+#: builtin/add.c:58
+#, c-format
+msgid "cannot chmod %cx '%s'"
+msgstr "no se puede aplicar chmod %cx '%s'"
+
+#: builtin/add.c:96
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "diff status inesperado %c"
 
-#: builtin/add.c:93 builtin/commit.c:285
+#: builtin/add.c:101 builtin/commit.c:285
 msgid "updating files failed"
 msgstr "falló la actualización de carpetas"
 
-#: builtin/add.c:103
+#: builtin/add.c:111
 #, c-format
 msgid "remove '%s'\n"
 msgstr "eliminar '%s'\n"
 
-#: builtin/add.c:178
+#: builtin/add.c:186
 msgid "Unstaged changes after refreshing the index:"
 msgstr "Cambios fuera del área de stage tras refrescar el índice:"
 
-#: builtin/add.c:266 builtin/rev-parse.c:904
+#: builtin/add.c:280 builtin/rev-parse.c:991
 msgid "Could not read the index"
 msgstr "No se pudo leer el índice"
 
-#: builtin/add.c:277
+#: builtin/add.c:291
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "No se pudo abrir '%s' para escritura."
 
-#: builtin/add.c:281
+#: builtin/add.c:295
 msgid "Could not write patch"
 msgstr "No se puede escribir el parche"
 
-#: builtin/add.c:284
+#: builtin/add.c:298
 msgid "editing patch failed"
 msgstr "falló la edición del parche"
 
-#: builtin/add.c:287
+#: builtin/add.c:301
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "No se pudo definir '%s'"
 
-#: builtin/add.c:289
+#: builtin/add.c:303
 msgid "Empty patch. Aborted."
 msgstr "Parche vacío. Abortado."
 
-#: builtin/add.c:294
+#: builtin/add.c:308
 #, c-format
 msgid "Could not apply '%s'"
 msgstr "No se pudo aplicar '%s'"
 
-#: builtin/add.c:302
+#: builtin/add.c:316
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
 "Las siguientes rutas son ignoradas por uno de tus archivos .gitignore:\n"
 
-#: builtin/add.c:322 builtin/clean.c:904 builtin/fetch.c:164 builtin/mv.c:124
-#: builtin/prune-packed.c:14 builtin/pull.c:204 builtin/push.c:548
-#: builtin/remote.c:1421 builtin/rm.c:242 builtin/send-pack.c:165
+#: builtin/add.c:336 builtin/clean.c:904 builtin/fetch.c:169 builtin/mv.c:124
+#: builtin/prune-packed.c:14 builtin/pull.c:204 builtin/push.c:559
+#: builtin/remote.c:1427 builtin/rm.c:242 builtin/send-pack.c:190
 msgid "dry run"
 msgstr "dry run ( ejecución en seco)"
 
-#: builtin/add.c:325
+#: builtin/add.c:339
 msgid "interactive picking"
 msgstr "selección interactiva"
 
-#: builtin/add.c:326 builtin/checkout.c:1533 builtin/reset.c:308
+#: builtin/add.c:340 builtin/checkout.c:1546 builtin/reset.c:308
 msgid "select hunks interactively"
 msgstr "elegir hunks de forma interactiva"
 
-#: builtin/add.c:327
+#: builtin/add.c:341
 msgid "edit current diff and apply"
 msgstr "editar diff actual y aplicar"
 
-#: builtin/add.c:328
+#: builtin/add.c:342
 msgid "allow adding otherwise ignored files"
 msgstr "permitir agregar caso contrario ignorar archivos"
 
-#: builtin/add.c:329
+#: builtin/add.c:343
 msgid "update tracked files"
 msgstr "actualizado las carpetas rastreadas"
 
-#: builtin/add.c:330
+#: builtin/add.c:344
 msgid "renormalize EOL of tracked files (implies -u)"
 msgstr "renormalizar EOL de los archivos rastreados (implica -u)"
 
-#: builtin/add.c:331
+#: builtin/add.c:345
 msgid "record only the fact that the path will be added later"
 msgstr "grabar solo el hecho de que la ruta será agregada después"
 
-#: builtin/add.c:332
+#: builtin/add.c:346
 msgid "add changes from all tracked and untracked files"
 msgstr "agregar los cambios de todas las carpetas con y sin seguimiento"
 
-#: builtin/add.c:335
+#: builtin/add.c:349
 msgid "ignore paths removed in the working tree (same as --no-all)"
 msgstr ""
 "ignorar rutas eliminadas en el árbol de trabajo (lo mismo que --no-all)"
 
-#: builtin/add.c:337
+#: builtin/add.c:351
 msgid "don't add, only refresh the index"
 msgstr "no agregar, solo actualizar el índice"
 
-#: builtin/add.c:338
+#: builtin/add.c:352
 msgid "just skip files which cannot be added because of errors"
 msgstr "saltar las carpetas que no pueden ser agregadas a causa de errores"
 
-#: builtin/add.c:339
+#: builtin/add.c:353
 msgid "check if - even missing - files are ignored in dry run"
 msgstr "comprobar si - incluso los archivos que faltan - se ignoran en dry run"
 
-#: builtin/add.c:341 builtin/update-index.c:1004
+#: builtin/add.c:355 builtin/update-index.c:1004
 msgid "override the executable bit of the listed files"
 msgstr "sobrescribir el bit ejecutable de los archivos listados"
 
-#: builtin/add.c:343
+#: builtin/add.c:357
 msgid "warn when adding an embedded repository"
 msgstr "avisar cuando se agrega un repositorio incrustado"
 
-#: builtin/add.c:345
+#: builtin/add.c:359
 msgid "backend for `git stash -p`"
 msgstr "backend para `git stash -p`"
 
-#: builtin/add.c:363
+#: builtin/add.c:377
 #, c-format
 msgid ""
 "You've added another git repository inside your current repository.\n"
@@ -9774,12 +10191,12 @@
 "\n"
 "Vea \"git help submodule\" para más información."
 
-#: builtin/add.c:391
+#: builtin/add.c:405
 #, c-format
 msgid "adding embedded git repository: %s"
 msgstr "agregando repositorio embebido: %s"
 
-#: builtin/add.c:410
+#: builtin/add.c:424
 msgid ""
 "Use -f if you really want to add them.\n"
 "Turn this message off by running\n"
@@ -9789,47 +10206,47 @@
 "Desactiva este mensaje ejecutando\n"
 "\"git config advice.addIgnoredFile false\""
 
-#: builtin/add.c:419
+#: builtin/add.c:433
 msgid "adding files failed"
 msgstr "falló al agregar archivos"
 
-#: builtin/add.c:447 builtin/commit.c:345
+#: builtin/add.c:461 builtin/commit.c:345
 msgid "--pathspec-from-file is incompatible with --interactive/--patch"
 msgstr "--pathspec-from-file es incompatible con --interactive/--patch"
 
-#: builtin/add.c:464
+#: builtin/add.c:478
 msgid "--pathspec-from-file is incompatible with --edit"
 msgstr "--pathspec-from-file es incompatible con --edit"
 
-#: builtin/add.c:476
+#: builtin/add.c:490
 msgid "-A and -u are mutually incompatible"
 msgstr "-A y -u son mutuamente incompatibles"
 
-#: builtin/add.c:479
+#: builtin/add.c:493
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "Opción --ignore-missing solo puede ser usada junto a --dry-run"
 
-#: builtin/add.c:483
+#: builtin/add.c:497
 #, c-format
 msgid "--chmod param '%s' must be either -x or +x"
 msgstr "El parámetro '%s' para --chmod debe ser -x ó +x"
 
-#: builtin/add.c:501 builtin/checkout.c:1701 builtin/commit.c:351
-#: builtin/reset.c:328 builtin/rm.c:272 builtin/stash.c:1506
+#: builtin/add.c:515 builtin/checkout.c:1714 builtin/commit.c:351
+#: builtin/reset.c:328 builtin/rm.c:272 builtin/stash.c:1569
 msgid "--pathspec-from-file is incompatible with pathspec arguments"
 msgstr "--pathspec-from-file es incompatible con argumentos de pathspec"
 
-#: builtin/add.c:508 builtin/checkout.c:1713 builtin/commit.c:357
-#: builtin/reset.c:334 builtin/rm.c:278 builtin/stash.c:1512
+#: builtin/add.c:522 builtin/checkout.c:1726 builtin/commit.c:357
+#: builtin/reset.c:334 builtin/rm.c:278 builtin/stash.c:1575
 msgid "--pathspec-file-nul requires --pathspec-from-file"
 msgstr "--pathspec-file-nul requiere --pathspec-from-file"
 
-#: builtin/add.c:512
+#: builtin/add.c:526
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Nada especificado, nada agregado.\n"
 
-#: builtin/add.c:514
+#: builtin/add.c:528
 msgid ""
 "Maybe you wanted to say 'git add .'?\n"
 "Turn this message off by running\n"
@@ -9887,7 +10304,7 @@
 msgid "Patch format detection failed."
 msgstr "Falló al detectar el formato del parche."
 
-#: builtin/am.c:953 builtin/clone.c:409
+#: builtin/am.c:953 builtin/clone.c:410
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "falló al crear el directorio '%s'"
@@ -9963,12 +10380,12 @@
 msgid "applying to an empty history"
 msgstr "aplicando a un historial vacío"
 
-#: builtin/am.c:1621 builtin/am.c:1625
+#: builtin/am.c:1626 builtin/am.c:1630
 #, c-format
 msgid "cannot resume: %s does not exist."
 msgstr "no se puede continuar: %s no existe."
 
-#: builtin/am.c:1643
+#: builtin/am.c:1648
 msgid "Commit Body is:"
 msgstr "Cuerpo de commit es:"
 
@@ -9976,39 +10393,39 @@
 #. in your translation. The program will only accept English
 #. input at this point.
 #.
-#: builtin/am.c:1653
+#: builtin/am.c:1658
 #, c-format
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 msgstr "¿Aplicar? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 
-#: builtin/am.c:1699 builtin/commit.c:395
+#: builtin/am.c:1704 builtin/commit.c:395
 msgid "unable to write index file"
 msgstr "no es posible escribir en el archivo índice"
 
-#: builtin/am.c:1703
+#: builtin/am.c:1708
 #, c-format
 msgid "Dirty index: cannot apply patches (dirty: %s)"
 msgstr "Índice sucio: no se puede aplicar parches (sucio: %s)"
 
-#: builtin/am.c:1743 builtin/am.c:1811
+#: builtin/am.c:1748 builtin/am.c:1816
 #, c-format
 msgid "Applying: %.*s"
 msgstr "Aplicando: %.*s"
 
-#: builtin/am.c:1760
+#: builtin/am.c:1765
 msgid "No changes -- Patch already applied."
 msgstr "Sin cambios -- parche ya aplicado."
 
-#: builtin/am.c:1766
+#: builtin/am.c:1771
 #, c-format
 msgid "Patch failed at %s %.*s"
 msgstr "El parche falló en %s %.*s"
 
-#: builtin/am.c:1770
+#: builtin/am.c:1775
 msgid "Use 'git am --show-current-patch=diff' to see the failed patch"
 msgstr "Use 'git am --show-current-patch=diff' para ver el parche fallido"
 
-#: builtin/am.c:1814
+#: builtin/am.c:1819
 msgid ""
 "No changes - did you forget to use 'git add'?\n"
 "If there is nothing left to stage, chances are that something else\n"
@@ -10018,7 +10435,7 @@
 "Si no hay nada en el área de stage, las posibilidad es que algo mas\n"
 "ya haya introducido el mismo cambio; tal vez quieras omitir este parche."
 
-#: builtin/am.c:1821
+#: builtin/am.c:1826
 msgid ""
 "You still have unmerged paths in your index.\n"
 "You should 'git add' each file with resolved conflicts to mark them as "
@@ -10031,17 +10448,17 @@
 "Se puede ejecutar `git rm` en el archivo para aceptar \"borrado por ellos\" "
 "en él."
 
-#: builtin/am.c:1928 builtin/am.c:1932 builtin/am.c:1944 builtin/reset.c:347
+#: builtin/am.c:1933 builtin/am.c:1937 builtin/am.c:1949 builtin/reset.c:347
 #: builtin/reset.c:355
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "No se pudo analizar el objeto '%s'."
 
-#: builtin/am.c:1980
+#: builtin/am.c:1985
 msgid "failed to clean index"
 msgstr "falló al limpiar el índice"
 
-#: builtin/am.c:2024
+#: builtin/am.c:2029
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
@@ -10049,156 +10466,156 @@
 "Parece haber movido HEAD desde el último falló 'am'.\n"
 "No rebobinando a ORIG_HEAD"
 
-#: builtin/am.c:2131
+#: builtin/am.c:2136
 #, c-format
 msgid "Invalid value for --patch-format: %s"
 msgstr "Valor inválido para --patch-format: %s"
 
-#: builtin/am.c:2171
+#: builtin/am.c:2178
 #, c-format
 msgid "Invalid value for --show-current-patch: %s"
 msgstr "Valor inválido para --show-current-patch: %s"
 
-#: builtin/am.c:2175
+#: builtin/am.c:2182
 #, c-format
 msgid "--show-current-patch=%s is incompatible with --show-current-patch=%s"
 msgstr "--show-current-patch=%s es incompatible con --show-current-patch=%s"
 
-#: builtin/am.c:2206
+#: builtin/am.c:2213
 msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
 msgstr "git am [<opciones>] [(<mbox> | <Directorio-de-correo>)...]"
 
-#: builtin/am.c:2207
+#: builtin/am.c:2214
 msgid "git am [<options>] (--continue | --skip | --abort)"
 msgstr "git am [<opciones>] (--continue | --skip | --abort)"
 
-#: builtin/am.c:2213
+#: builtin/am.c:2220
 msgid "run interactively"
 msgstr "ejecutar de manera interactiva"
 
-#: builtin/am.c:2215
+#: builtin/am.c:2222
 msgid "historical option -- no-op"
 msgstr "opción histórica -- no-op"
 
-#: builtin/am.c:2217
+#: builtin/am.c:2224
 msgid "allow fall back on 3way merging if needed"
 msgstr "permitir retroceso en fusión de 3-vías si es necesario"
 
-#: builtin/am.c:2218 builtin/init-db.c:559 builtin/prune-packed.c:16
-#: builtin/repack.c:306 builtin/stash.c:816
+#: builtin/am.c:2225 builtin/init-db.c:560 builtin/prune-packed.c:16
+#: builtin/repack.c:334 builtin/stash.c:882
 msgid "be quiet"
 msgstr "ser silencioso"
 
-#: builtin/am.c:2220
-msgid "add a Signed-off-by line to the commit message"
+#: builtin/am.c:2227
+msgid "add a Signed-off-by trailer to the commit message"
 msgstr "agregar una línea \"Firmado-por\" al mensaje del commit"
 
-#: builtin/am.c:2223
+#: builtin/am.c:2230
 msgid "recode into utf8 (default)"
 msgstr "recodificar en utf8 (default)"
 
-#: builtin/am.c:2225
+#: builtin/am.c:2232
 msgid "pass -k flag to git-mailinfo"
 msgstr "pasar flag -k a git-mailinfo"
 
-#: builtin/am.c:2227
+#: builtin/am.c:2234
 msgid "pass -b flag to git-mailinfo"
 msgstr "pasar flag -b a git-mailinfo"
 
-#: builtin/am.c:2229
+#: builtin/am.c:2236
 msgid "pass -m flag to git-mailinfo"
 msgstr "pasar flag -m a git-mailinfo"
 
-#: builtin/am.c:2231
+#: builtin/am.c:2238
 msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr "pasar flag --keep-cr a git-mailsplit para formato mbox"
 
-#: builtin/am.c:2234
+#: builtin/am.c:2241
 msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr ""
 "no pasar flag --keep-cr a git-mailsplit independientemente de am.keepcr"
 
-#: builtin/am.c:2237
+#: builtin/am.c:2244
 msgid "strip everything before a scissors line"
 msgstr "descubrir todo antes de una línea de tijeras"
 
-#: builtin/am.c:2239 builtin/am.c:2242 builtin/am.c:2245 builtin/am.c:2248
-#: builtin/am.c:2251 builtin/am.c:2254 builtin/am.c:2257 builtin/am.c:2260
-#: builtin/am.c:2266
+#: builtin/am.c:2246 builtin/am.c:2249 builtin/am.c:2252 builtin/am.c:2255
+#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
+#: builtin/am.c:2273
 msgid "pass it through git-apply"
 msgstr "pasarlo a través de git-apply"
 
-#: builtin/am.c:2256 builtin/commit.c:1397 builtin/fmt-merge-msg.c:17
-#: builtin/fmt-merge-msg.c:20 builtin/grep.c:891 builtin/merge.c:252
+#: builtin/am.c:2263 builtin/commit.c:1395 builtin/fmt-merge-msg.c:17
+#: builtin/fmt-merge-msg.c:20 builtin/grep.c:904 builtin/merge.c:261
 #: builtin/pull.c:141 builtin/pull.c:200 builtin/pull.c:217
-#: builtin/rebase.c:1329 builtin/repack.c:317 builtin/repack.c:321
-#: builtin/repack.c:323 builtin/show-branch.c:650 builtin/show-ref.c:172
-#: builtin/tag.c:404 parse-options.h:154 parse-options.h:175
+#: builtin/rebase.c:1347 builtin/repack.c:345 builtin/repack.c:349
+#: builtin/repack.c:351 builtin/show-branch.c:650 builtin/show-ref.c:172
+#: builtin/tag.c:436 parse-options.h:154 parse-options.h:175
 #: parse-options.h:316
 msgid "n"
 msgstr "n"
 
-#: builtin/am.c:2262 builtin/branch.c:659 builtin/for-each-ref.c:38
-#: builtin/replace.c:556 builtin/tag.c:438 builtin/verify-tag.c:38
-#: bugreport.c:137
+#: builtin/am.c:2269 builtin/branch.c:670 builtin/bugreport.c:136
+#: builtin/for-each-ref.c:38 builtin/replace.c:556 builtin/tag.c:470
+#: builtin/verify-tag.c:38
 msgid "format"
 msgstr "formato"
 
-#: builtin/am.c:2263
+#: builtin/am.c:2270
 msgid "format the patch(es) are in"
 msgstr "formatear el parche(s)"
 
-#: builtin/am.c:2269
+#: builtin/am.c:2276
 msgid "override error message when patch failure occurs"
 msgstr "sobrescribir mensajes de error cuando fallos de parchado ocurran"
 
-#: builtin/am.c:2271
+#: builtin/am.c:2278
 msgid "continue applying patches after resolving a conflict"
 msgstr "continuar aplicando los parches tras resolver conflictos"
 
-#: builtin/am.c:2274
+#: builtin/am.c:2281
 msgid "synonyms for --continue"
 msgstr "sinónimos para --continue"
 
-#: builtin/am.c:2277
+#: builtin/am.c:2284
 msgid "skip the current patch"
 msgstr "saltar el parche actual"
 
-#: builtin/am.c:2280
-msgid "restore the original branch and abort the patching operation."
-msgstr "restaurar la rama original y abortar la operación de parchado."
-
-#: builtin/am.c:2283
-msgid "abort the patching operation but keep HEAD where it is."
-msgstr "abortar la operación de parchado pero mantener HEAD donde está."
-
 #: builtin/am.c:2287
+msgid "restore the original branch and abort the patching operation"
+msgstr "restaurar la rama original y abortar la operación de parcheo"
+
+#: builtin/am.c:2290
+msgid "abort the patching operation but keep HEAD where it is"
+msgstr "abortar la operación de parcheo pero mantener HEAD donde está"
+
+#: builtin/am.c:2294
 msgid "show the patch being applied"
 msgstr "muestra el parche siendo aplicado"
 
-#: builtin/am.c:2292
+#: builtin/am.c:2299
 msgid "lie about committer date"
 msgstr "mentir sobre la fecha del committer"
 
-#: builtin/am.c:2294
+#: builtin/am.c:2301
 msgid "use current timestamp for author date"
 msgstr "usar el timestamp actual para la fecha del autor"
 
-#: builtin/am.c:2296 builtin/commit-tree.c:120 builtin/commit.c:1517
-#: builtin/merge.c:289 builtin/pull.c:175 builtin/rebase.c:524
-#: builtin/rebase.c:1380 builtin/revert.c:117 builtin/tag.c:419
+#: builtin/am.c:2303 builtin/commit-tree.c:120 builtin/commit.c:1515
+#: builtin/merge.c:298 builtin/pull.c:175 builtin/rebase.c:538
+#: builtin/rebase.c:1400 builtin/revert.c:117 builtin/tag.c:451
 msgid "key-id"
 msgstr "key-id"
 
-#: builtin/am.c:2297 builtin/rebase.c:525 builtin/rebase.c:1381
+#: builtin/am.c:2304 builtin/rebase.c:539 builtin/rebase.c:1401
 msgid "GPG-sign commits"
 msgstr "Commits con firma GPG"
 
-#: builtin/am.c:2300
+#: builtin/am.c:2307
 msgid "(internal use for git-rebase)"
 msgstr "(uso interno para git-rebase)"
 
-#: builtin/am.c:2318
+#: builtin/am.c:2325
 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."
@@ -10206,16 +10623,16 @@
 "La opción -b/--binary ha estado deshabilitada por mucho tiempo, y\n"
 "será eliminada. Por favor no la use más."
 
-#: builtin/am.c:2325
+#: builtin/am.c:2332
 msgid "failed to read the index"
 msgstr "falló al leer el índice"
 
-#: builtin/am.c:2340
+#: builtin/am.c:2347
 #, c-format
 msgid "previous rebase directory %s still exists but mbox given."
 msgstr "directorio de rebase previo %s todavía existe en el mbox dado."
 
-#: builtin/am.c:2364
+#: builtin/am.c:2371
 #, c-format
 msgid ""
 "Stray %s directory found.\n"
@@ -10224,11 +10641,11 @@
 "Directorio extraviado %s encontrado.\n"
 "Use \"git am --abort\" para borrarlo."
 
-#: builtin/am.c:2370
+#: builtin/am.c:2377
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr "Operación de resolución no está en progreso, no vamos a continuar."
 
-#: builtin/am.c:2380
+#: builtin/am.c:2387
 msgid "interactive mode requires patches on the command line"
 msgstr "modo interactivo requiere parches en la línea de comando"
 
@@ -10266,43 +10683,15 @@
 msgid "git archive: expected a flush"
 msgstr "git archive: se esperaba un flush"
 
-#: builtin/bisect--helper.c:22
-msgid "git bisect--helper --next-all [--no-checkout]"
-msgstr "git bisect--helper --next-all [--no-checkout]"
-
 #: builtin/bisect--helper.c:23
-msgid "git bisect--helper --write-terms <bad_term> <good_term>"
-msgstr "git bisect--helper --write-terms <mal_término> <buen_término>"
-
-#: builtin/bisect--helper.c:24
-msgid "git bisect--helper --bisect-clean-state"
-msgstr "git bisect--helper --bisect-clean-state"
-
-#: builtin/bisect--helper.c:25
 msgid "git bisect--helper --bisect-reset [<commit>]"
 msgstr "git bisect--helper --bisect-reset [<commit>]"
 
-#: builtin/bisect--helper.c:26
-msgid ""
-"git bisect--helper --bisect-write [--no-log] <state> <revision> <good_term> "
-"<bad_term>"
-msgstr ""
-"git bisect--helper --bisect-write [--no-log] <estado> <revision> <buen_term> "
-"<mal_term>"
-
-#: builtin/bisect--helper.c:27
-msgid ""
-"git bisect--helper --bisect-check-and-set-terms <command> <good_term> "
-"<bad_term>"
-msgstr ""
-"git bisect--helper --bisect-check-and-set-terms <comando> <buen_term> "
-"<mal_term>"
-
-#: builtin/bisect--helper.c:28
+#: builtin/bisect--helper.c:24
 msgid "git bisect--helper --bisect-next-check <good_term> <bad_term> [<term>]"
 msgstr "git bisect--helper --bisect-next-check <buen_term> <mal_term> [<term>]"
 
-#: builtin/bisect--helper.c:29
+#: builtin/bisect--helper.c:25
 msgid ""
 "git bisect--helper --bisect-terms [--term-good | --term-old | --term-bad | --"
 "term-new]"
@@ -10310,48 +10699,76 @@
 "git bisect--helper --bisect-terms [--term-good | --term-old | --term-bad | --"
 "term-new]"
 
+#: builtin/bisect--helper.c:26
+msgid ""
+"git bisect--helper --bisect-start [--term-{new,bad}=<term> --term-{old,good}"
+"=<term>] [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] "
+"[<paths>...]"
+msgstr ""
+"git bisect--helper --bisect-start [--term-{new,bad}=<término> --term-{old,"
+"good}=<término>] [--no-checkout] [--first-parent] [<malo> [<bueno>...]] [--] "
+"[<rutas>...]"
+
+#: builtin/bisect--helper.c:28
+msgid "git bisect--helper --bisect-next"
+msgstr "git bisect--helper --bisect-next"
+
+#: builtin/bisect--helper.c:29
+msgid "git bisect--helper --bisect-state (bad|new) [<rev>]"
+msgstr "git bisect--helper --bisect-state (bad|new) [<rev>]"
+
 #: builtin/bisect--helper.c:30
-msgid ""
-"git bisect--helper --bisect-start [--term-{old,good}=<term> --term-{new,bad}"
-"=<term>][--no-checkout] [<bad> [<good>...]] [--] [<paths>...]"
-msgstr ""
-"git bisect--helper --bisect-start [--term-{old,good}=<término> --term-{new,"
-"bad}=<término>][--no-checkout] [<malo> [<bueno>...]] [--] [<rutas>...]"
+msgid "git bisect--helper --bisect-state (good|old) [<rev>...]"
+msgstr "git bisect--helper --bisect-state (good|old) [<rev>...]"
 
-#: builtin/bisect--helper.c:86
+#: builtin/bisect--helper.c:31
+msgid "git bisect--helper --bisect-replay <filename>"
+msgstr "git bisect--helper --bisect-replay <archivio>"
+
+#: builtin/bisect--helper.c:32
+msgid "git bisect--helper --bisect-skip [(<rev>|<range>)...]"
+msgstr "git bisect--helper --bisect-skip [(<rev>|<rango>)...]"
+
+#: builtin/bisect--helper.c:107
+#, c-format
+msgid "cannot open file '%s' in mode '%s'"
+msgstr "no se puede abrir archivo '%s' en modo '%s'"
+
+#: builtin/bisect--helper.c:114
+#, c-format
+msgid "could not write to file '%s'"
+msgstr "no se pudo escribir al archivo '%s'"
+
+#: builtin/bisect--helper.c:153
 #, c-format
 msgid "'%s' is not a valid term"
 msgstr "'%s' no es un término válido"
 
-#: builtin/bisect--helper.c:90
+#: builtin/bisect--helper.c:157
 #, c-format
 msgid "can't use the builtin command '%s' as a term"
 msgstr "no se puede usar el comando nativo '%s' como un término"
 
-#: builtin/bisect--helper.c:100
+#: builtin/bisect--helper.c:167
 #, c-format
 msgid "can't change the meaning of the term '%s'"
 msgstr "no se puede cambiar el significado del término '%s'"
 
-#: builtin/bisect--helper.c:111
+#: builtin/bisect--helper.c:177
 msgid "please use two different terms"
 msgstr "por favor use dos términos diferentes"
 
-#: builtin/bisect--helper.c:118
-msgid "could not open the file BISECT_TERMS"
-msgstr "no se pudo abrir el archivo BISECT_TERMS"
-
-#: builtin/bisect--helper.c:155
+#: builtin/bisect--helper.c:193
 #, c-format
 msgid "We are not bisecting.\n"
 msgstr "No estamos bisecando.\n"
 
-#: builtin/bisect--helper.c:163
+#: builtin/bisect--helper.c:201
 #, c-format
 msgid "'%s' is not a valid commit"
 msgstr "'%s' no es un commit válido"
 
-#: builtin/bisect--helper.c:172
+#: builtin/bisect--helper.c:210
 #, c-format
 msgid ""
 "could not check out original HEAD '%s'. Try 'git bisect reset <commit>'."
@@ -10359,27 +10776,27 @@
 "no se pudo hacer check out al HEAD original '%s'. Intenta 'git bisect reset "
 "<commit>'."
 
-#: builtin/bisect--helper.c:216
+#: builtin/bisect--helper.c:254
 #, c-format
 msgid "Bad bisect_write argument: %s"
 msgstr "Mal argumento bisect_write: %s"
 
-#: builtin/bisect--helper.c:221
+#: builtin/bisect--helper.c:259
 #, c-format
 msgid "couldn't get the oid of the rev '%s'"
 msgstr "no se puede obtener el oid de la rev '%s'"
 
-#: builtin/bisect--helper.c:233
+#: builtin/bisect--helper.c:271
 #, c-format
 msgid "couldn't open the file '%s'"
 msgstr "no se pudo abrir el archivo '%s'"
 
-#: builtin/bisect--helper.c:259
+#: builtin/bisect--helper.c:297
 #, c-format
 msgid "Invalid command: you're currently in a %s/%s bisect"
 msgstr "Comando inválido: actualmente se encuentra en un bisect %s/%s"
 
-#: builtin/bisect--helper.c:286
+#: builtin/bisect--helper.c:324
 #, c-format
 msgid ""
 "You need to give me at least one %s and %s revision.\n"
@@ -10388,7 +10805,7 @@
 "Tienes que dar al menos un %s y un %s revision.\n"
 "Se puede ver \"git bisect %s\" y \"git bisect %s\" para eso."
 
-#: builtin/bisect--helper.c:290
+#: builtin/bisect--helper.c:328
 #, c-format
 msgid ""
 "You need to start by \"git bisect start\".\n"
@@ -10399,7 +10816,7 @@
 "Después tienes que entregar al menos un %s y una revision %s.\n"
 "Puedes usar \"git bisect %s\" y \"git bisect %s\" para eso."
 
-#: builtin/bisect--helper.c:310
+#: builtin/bisect--helper.c:348
 #, c-format
 msgid "bisecting only with a %s commit"
 msgstr "haciendo bisect solo con un commit %s"
@@ -10408,15 +10825,15 @@
 #. translation. The program will only accept English input
 #. at this point.
 #.
-#: builtin/bisect--helper.c:318
+#: builtin/bisect--helper.c:356
 msgid "Are you sure [Y/n]? "
 msgstr "¿Estás seguro [Y/n]? "
 
-#: builtin/bisect--helper.c:379
+#: builtin/bisect--helper.c:417
 msgid "no terms defined"
 msgstr "no hay términos definidos"
 
-#: builtin/bisect--helper.c:382
+#: builtin/bisect--helper.c:420
 #, c-format
 msgid ""
 "Your current terms are %s for the old state\n"
@@ -10425,7 +10842,7 @@
 "Tus términos actuales son %s para el estado viejo\n"
 "y %s para el estado nuevo.\n"
 
-#: builtin/bisect--helper.c:392
+#: builtin/bisect--helper.c:430
 #, c-format
 msgid ""
 "invalid argument %s for 'git bisect terms'.\n"
@@ -10434,267 +10851,308 @@
 "argumento inválido %s para 'git bisect terms'.\n"
 "Las opciones soportadas son: --term-good|--term-old y --term-bad|--term-new."
 
-#: builtin/bisect--helper.c:460 builtin/bisect--helper.c:473
+#: builtin/bisect--helper.c:497 builtin/bisect--helper.c:1014
+msgid "revision walk setup failed\n"
+msgstr "la configuración del recorrido de revisión falló\n"
+
+#: builtin/bisect--helper.c:519
+#, c-format
+msgid "could not open '%s' for appending"
+msgstr "no se pudo abrir '%s' en modo append"
+
+#: builtin/bisect--helper.c:638 builtin/bisect--helper.c:651
 msgid "'' is not a valid term"
 msgstr "'' no es un término válido"
 
-#: builtin/bisect--helper.c:483
+#: builtin/bisect--helper.c:661
 #, c-format
 msgid "unrecognized option: '%s'"
 msgstr "opción desconocida: '%s'"
 
-#: builtin/bisect--helper.c:487
+#: builtin/bisect--helper.c:665
 #, c-format
 msgid "'%s' does not appear to be a valid revision"
 msgstr "'%s' no parece ser una revisión válida"
 
-#: builtin/bisect--helper.c:519
+#: builtin/bisect--helper.c:696
 msgid "bad HEAD - I need a HEAD"
 msgstr "mal HEAD - Necesito un HEAD"
 
-#: builtin/bisect--helper.c:534
+#: builtin/bisect--helper.c:711
 #, c-format
 msgid "checking out '%s' failed. Try 'git bisect start <valid-branch>'."
 msgstr ""
 "error al hacer checkout '%s'. Intente 'git bisect start <rama-válida>'."
 
-#: builtin/bisect--helper.c:555
+#: builtin/bisect--helper.c:732
 msgid "won't bisect on cg-seek'ed tree"
 msgstr "no se bisecará en un árbol con cg-seek"
 
-#: builtin/bisect--helper.c:558
+#: builtin/bisect--helper.c:735
 msgid "bad HEAD - strange symbolic ref"
 msgstr "mal HEAD - ref simbólico extraño"
 
-#: builtin/bisect--helper.c:582
+#: builtin/bisect--helper.c:755
 #, c-format
 msgid "invalid ref: '%s'"
 msgstr "ref inválido: '%s'"
 
-#: builtin/bisect--helper.c:638
-msgid "perform 'git bisect next'"
-msgstr "realiza 'git bisect next'"
+#: builtin/bisect--helper.c:813
+msgid "You need to start by \"git bisect start\"\n"
+msgstr "Debes iniciar con \"git bisect start\"\n"
 
-#: builtin/bisect--helper.c:640
-msgid "write the terms to .git/BISECT_TERMS"
-msgstr "escribe los términos a .git/BISECT_TERMS"
+#. TRANSLATORS: Make sure to include [Y] and [n] in your
+#. translation. The program will only accept English input
+#. at this point.
+#.
+#: builtin/bisect--helper.c:824
+msgid "Do you want me to do it for you [Y/n]? "
+msgstr "¿Quieres que lo haga por ti [Y/n]? "
 
-#: builtin/bisect--helper.c:642
-msgid "cleanup the bisection state"
-msgstr "limpiar el estado de bisección"
+#: builtin/bisect--helper.c:842
+msgid "Please call `--bisect-state` with at least one argument"
+msgstr "Llame a `--bisect-state` con al menos un argumento"
 
-#: builtin/bisect--helper.c:644
-msgid "check for expected revs"
-msgstr "revisar por revs esperados"
+#: builtin/bisect--helper.c:855
+#, c-format
+msgid "'git bisect %s' can take only one argument."
+msgstr "'git bisect %s' solo puede tomar un argumento."
 
-#: builtin/bisect--helper.c:646
+#: builtin/bisect--helper.c:867 builtin/bisect--helper.c:878
+#, c-format
+msgid "Bad rev input: %s"
+msgstr "Mala entrada rev: %s"
+
+#: builtin/bisect--helper.c:912
+msgid "We are not bisecting."
+msgstr "No estamos bisecando."
+
+#: builtin/bisect--helper.c:962
+#, c-format
+msgid "'%s'?? what are you talking about?"
+msgstr "'%s'?? ¿De qué estás hablando?"
+
+#: builtin/bisect--helper.c:974
+#, c-format
+msgid "cannot read file '%s' for replaying"
+msgstr "no se puede leer '%s' para reproducir"
+
+#: builtin/bisect--helper.c:1047
 msgid "reset the bisection state"
 msgstr "reiniciar el estado de bisect"
 
-#: builtin/bisect--helper.c:648
-msgid "write out the bisection state in BISECT_LOG"
-msgstr "escribir el estado de bisect en BISECT_LOG"
-
-#: builtin/bisect--helper.c:650
-msgid "check and set terms in a bisection state"
-msgstr "revisar y configurar los terms en el estado de bisect"
-
-#: builtin/bisect--helper.c:652
+#: builtin/bisect--helper.c:1049
 msgid "check whether bad or good terms exist"
 msgstr "revisar si existen términos malos o buenos"
 
-#: builtin/bisect--helper.c:654
+#: builtin/bisect--helper.c:1051
 msgid "print out the bisect terms"
 msgstr "imprimir los terms del bisect"
 
-#: builtin/bisect--helper.c:656
+#: builtin/bisect--helper.c:1053
 msgid "start the bisect session"
 msgstr "comenzar la sesión de bisect"
 
-#: builtin/bisect--helper.c:658
-msgid "update BISECT_HEAD instead of checking out the current commit"
-msgstr "actualiza BISECT_HEAD en lugar de revisar el commit actual"
+#: builtin/bisect--helper.c:1055
+msgid "find the next bisection commit"
+msgstr "encontrar el siguiente commit de bisección"
 
-#: builtin/bisect--helper.c:660
+#: builtin/bisect--helper.c:1057
+msgid "mark the state of ref (or refs)"
+msgstr "marcar el estado de ref (o refs)"
+
+#: builtin/bisect--helper.c:1059
+msgid "list the bisection steps so far"
+msgstr "listar los pasos de bisección hasta ahora"
+
+#: builtin/bisect--helper.c:1061
+msgid "replay the bisection process from the given file"
+msgstr "reproducir el proceso de bisección del archivo dado"
+
+#: builtin/bisect--helper.c:1063
+msgid "skip some commits for checkout"
+msgstr "saltar algunos commits para checkout"
+
+#: builtin/bisect--helper.c:1065
 msgid "no log for BISECT_WRITE"
 msgstr "no hay log para BISECT_WRITE"
 
-#: builtin/bisect--helper.c:678
-msgid "--write-terms requires two arguments"
-msgstr "--write-terms requiere dos argumentos"
-
-#: builtin/bisect--helper.c:682
-msgid "--bisect-clean-state requires no arguments"
-msgstr "--bisect-clean-state no requiere argumentos"
-
-#: builtin/bisect--helper.c:689
+#: builtin/bisect--helper.c:1080
 msgid "--bisect-reset requires either no argument or a commit"
 msgstr "--bisect-reset requiere un commit o ningún argumento"
 
-#: builtin/bisect--helper.c:693
-msgid "--bisect-write requires either 4 or 5 arguments"
-msgstr "--bisect-write requiere entre 4 o 5 argumentos"
-
-#: builtin/bisect--helper.c:699
-msgid "--check-and-set-terms requires 3 arguments"
-msgstr "--bisect-clean-state no requiere argumentos"
-
-#: builtin/bisect--helper.c:705
+#: builtin/bisect--helper.c:1085
 msgid "--bisect-next-check requires 2 or 3 arguments"
 msgstr "--bisect-next-check requiere 2 o 3 argumentos"
 
-#: builtin/bisect--helper.c:711
+#: builtin/bisect--helper.c:1091
 msgid "--bisect-terms requires 0 or 1 argument"
 msgstr "--bisect-terms requiere 0 o 1 argumentos"
 
-#: builtin/blame.c:31
+#: builtin/bisect--helper.c:1100
+msgid "--bisect-next requires 0 arguments"
+msgstr "--bisect-next requiere 0 argumentos"
+
+#: builtin/bisect--helper.c:1111
+msgid "--bisect-log requires 0 arguments"
+msgstr "--bisect-log requiere 0 argumentos"
+
+#: builtin/bisect--helper.c:1116
+msgid "no logfile given"
+msgstr "ningún logfile proporcionado"
+
+#: builtin/blame.c:32
 msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
 msgstr "git blame [<opciones>] [<opciones-rev>] [<revision>] [--] <archivo>"
 
-#: builtin/blame.c:36
+#: builtin/blame.c:37
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<rev-opts> están documentadas en git-rev-list(1)"
 
-#: builtin/blame.c:409
+#: builtin/blame.c:410
 #, c-format
 msgid "expecting a color: %s"
 msgstr "esperando un color: %s"
 
-#: builtin/blame.c:416
+#: builtin/blame.c:417
 msgid "must end with a color"
 msgstr "tiene que terminar con un color"
 
-#: builtin/blame.c:729
+#: builtin/blame.c:728
 #, c-format
 msgid "invalid color '%s' in color.blame.repeatedLines"
 msgstr "color inválido '%s' en color.blame.repeatedLines"
 
-#: builtin/blame.c:747
+#: builtin/blame.c:746
 msgid "invalid value for blame.coloring"
 msgstr "valor inválido para blame.coloring"
 
-#: builtin/blame.c:822
+#: builtin/blame.c:845
 #, c-format
 msgid "cannot find revision %s to ignore"
 msgstr "no se pudo encontrar revision %s para ignorar"
 
-#: builtin/blame.c:844
-msgid "Show blame entries as we find them, incrementally"
-msgstr "Mostrar las entradas blame como las encontramos, incrementalmente"
+#: builtin/blame.c:867
+msgid "show blame entries as we find them, incrementally"
+msgstr "mostrar las entradas blame como las encontramos, incrementalmente"
 
-#: builtin/blame.c:845
-msgid "Show blank SHA-1 for boundary commits (Default: off)"
-msgstr "Mostrar SHA-1 en blanco para commits extremos (Default: off)"
+#: builtin/blame.c:868
+msgid "do not show object names of boundary commits (Default: off)"
+msgstr "no mostrar nombres de objetos de commits extremos (Default: off)"
 
-#: builtin/blame.c:846
-msgid "Do not treat root commits as boundaries (Default: off)"
-msgstr "No tratar commits raíces como extremos (Default: off)"
+#: builtin/blame.c:869
+msgid "do not treat root commits as boundaries (Default: off)"
+msgstr "no tratar commits raíces como extremos (Default: off)"
 
-#: builtin/blame.c:847
-msgid "Show work cost statistics"
-msgstr "Mostrar estadísticas de costo de trabajo"
+#: builtin/blame.c:870
+msgid "show work cost statistics"
+msgstr "mostrar estadísticas de costo de trabajo"
 
-#: builtin/blame.c:848
-msgid "Force progress reporting"
-msgstr "Forzar el reporte de progreso"
+#: builtin/blame.c:871 builtin/checkout.c:1503 builtin/clone.c:92
+#: builtin/commit-graph.c:84 builtin/commit-graph.c:222 builtin/fetch.c:175
+#: builtin/merge.c:297 builtin/multi-pack-index.c:27 builtin/pull.c:119
+#: builtin/push.c:575 builtin/send-pack.c:198
+msgid "force progress reporting"
+msgstr "forzar el reporte de progreso"
 
-#: builtin/blame.c:849
-msgid "Show output score for blame entries"
-msgstr "Mostrar la puntuación de salida de las entradas de blame"
+#: builtin/blame.c:872
+msgid "show output score for blame entries"
+msgstr "mostrar la puntuación de salida de las entradas de blame"
 
-#: builtin/blame.c:850
-msgid "Show original filename (Default: auto)"
-msgstr "Mostrar nombre original del archivo (Default: auto)"
+#: builtin/blame.c:873
+msgid "show original filename (Default: auto)"
+msgstr "mostrar nombre original del archivo (Default: auto)"
 
-#: builtin/blame.c:851
-msgid "Show original linenumber (Default: off)"
-msgstr "Mostrar número de línea original (Default: off)"
+#: builtin/blame.c:874
+msgid "show original linenumber (Default: off)"
+msgstr "mostrar número de línea original (Default: off)"
 
-#: builtin/blame.c:852
-msgid "Show in a format designed for machine consumption"
-msgstr "Mostrar en un formato diseñado para consumo de máquina"
+#: builtin/blame.c:875
+msgid "show in a format designed for machine consumption"
+msgstr "mostrar en un formato diseñado para consumo de máquina"
 
-#: builtin/blame.c:853
-msgid "Show porcelain format with per-line commit information"
-msgstr "Mostrar en formato porcelana con información de commit por línea"
+#: builtin/blame.c:876
+msgid "show porcelain format with per-line commit information"
+msgstr "mostrar en formato porcelana con información de commit por línea"
 
-#: builtin/blame.c:854
-msgid "Use the same output mode as git-annotate (Default: off)"
-msgstr "Usar el mismo modo salida como git-annotate (Default: off)"
+#: builtin/blame.c:877
+msgid "use the same output mode as git-annotate (Default: off)"
+msgstr "usar el mismo modo salida como git-annotate (Default: off)"
 
-#: builtin/blame.c:855
-msgid "Show raw timestamp (Default: off)"
-msgstr "Mostrar timestamp en formato raw (Default: off)"
+#: builtin/blame.c:878
+msgid "show raw timestamp (Default: off)"
+msgstr "mostrar timestamp en formato raw (Default: off)"
 
-#: builtin/blame.c:856
-msgid "Show long commit SHA1 (Default: off)"
-msgstr "Mostrar SHA1 del commit en formato largo (Default: off)"
+#: builtin/blame.c:879
+msgid "show long commit SHA1 (Default: off)"
+msgstr "mostrar SHA1 del commit en formato largo (Default: off)"
 
-#: builtin/blame.c:857
-msgid "Suppress author name and timestamp (Default: off)"
-msgstr "Suprimir nombre del autor y timestamp (Default: off)"
+#: builtin/blame.c:880
+msgid "suppress author name and timestamp (Default: off)"
+msgstr "suprimir nombre del autor y timestamp (Default: off)"
 
-#: builtin/blame.c:858
-msgid "Show author email instead of name (Default: off)"
-msgstr "Mostrar en cambio el email del autor (Default: off)"
+#: builtin/blame.c:881
+msgid "show author email instead of name (Default: off)"
+msgstr "mostrar en cambio el email del autor (Default: off)"
 
-#: builtin/blame.c:859
-msgid "Ignore whitespace differences"
-msgstr "Ignorar diferencias de espacios en blanco"
+#: builtin/blame.c:882
+msgid "ignore whitespace differences"
+msgstr "ignorar diferencias de espacios en blanco"
 
-#: builtin/blame.c:860 builtin/log.c:1721
+#: builtin/blame.c:883 builtin/log.c:1812
 msgid "rev"
 msgstr "rev"
 
-#: builtin/blame.c:860
-msgid "Ignore <rev> when blaming"
-msgstr "Ignorar <rev> durante el blame"
+#: builtin/blame.c:883
+msgid "ignore <rev> when blaming"
+msgstr "ignorar <rev> durante el blame"
 
-#: builtin/blame.c:861
-msgid "Ignore revisions from <file>"
-msgstr "Ignorar revisiones de <archivo>"
+#: builtin/blame.c:884
+msgid "ignore revisions from <file>"
+msgstr "ignorar revisiones de <archivo>"
 
-#: builtin/blame.c:862
+#: builtin/blame.c:885
 msgid "color redundant metadata from previous line differently"
 msgstr "colorear metadata redundante de líneas previas de manera diferente"
 
-#: builtin/blame.c:863
+#: builtin/blame.c:886
 msgid "color lines by age"
 msgstr "colorear líneas por edad"
 
-#: builtin/blame.c:864
-msgid "Spend extra cycles to find better match"
-msgstr "Ocupo más ciclos para encontrar mejoras resultados"
+#: builtin/blame.c:887
+msgid "spend extra cycles to find better match"
+msgstr "ocupar más ciclos para encontrar mejoras resultados"
 
-#: builtin/blame.c:865
-msgid "Use revisions from <file> instead of calling git-rev-list"
-msgstr "Use revisiones desde <archivo> en lugar de llamar git-rev-list"
+#: builtin/blame.c:888
+msgid "use revisions from <file> instead of calling git-rev-list"
+msgstr "use revisiones desde <archivo> en lugar de llamar git-rev-list"
 
-#: builtin/blame.c:866
-msgid "Use <file>'s contents as the final image"
-msgstr "Usar contenido de <archivo> como imagen final"
+#: builtin/blame.c:889
+msgid "use <file>'s contents as the final image"
+msgstr "usar contenido de <archivo> como imagen final"
 
-#: builtin/blame.c:867 builtin/blame.c:868
+#: builtin/blame.c:890 builtin/blame.c:891
 msgid "score"
 msgstr "puntaje"
 
-#: builtin/blame.c:867
-msgid "Find line copies within and across files"
-msgstr "Encontrar copias de líneas entre y a través de archivos"
+#: builtin/blame.c:890
+msgid "find line copies within and across files"
+msgstr "encontrar copias de líneas entre y a través de archivos"
 
-#: builtin/blame.c:868
-msgid "Find line movements within and across files"
-msgstr "Encontrar movimientos de líneas entre y a través de archivos"
+#: builtin/blame.c:891
+msgid "find line movements within and across files"
+msgstr "encontrar movimientos de líneas entre y a través de archivos"
 
-#: builtin/blame.c:869
-msgid "n,m"
-msgstr "n,m"
+#: builtin/blame.c:892
+msgid "range"
+msgstr "rango"
 
-#: builtin/blame.c:869
-msgid "Process only line range n,m, counting from 1"
-msgstr "Procesar solo el rango de líneas n,m, contando desde 1"
+#: builtin/blame.c:893
+msgid "process only line range <start>,<end> or function :<funcname>"
+msgstr ""
+"Procesar solo el rango de líneas <inicio>,<fin> o función: <nombre-función>"
 
-#: builtin/blame.c:921
+#: builtin/blame.c:945
 msgid "--progress can't be used with --incremental or porcelain formats"
 msgstr "--progress no puede ser usado con --incremental o formatos porcelana"
 
@@ -10706,24 +11164,24 @@
 #. your language may need more or fewer display
 #. columns.
 #.
-#: builtin/blame.c:972
+#: builtin/blame.c:996
 msgid "4 years, 11 months ago"
 msgstr "hace 4 años, 11 meses"
 
-#: builtin/blame.c:1087
+#: builtin/blame.c:1112
 #, c-format
 msgid "file %s has only %lu line"
 msgid_plural "file %s has only %lu lines"
 msgstr[0] "archivo %s tiene solo %lu línea"
 msgstr[1] "archivo %s tiene solo %lu líneas"
 
-#: builtin/blame.c:1133
+#: builtin/blame.c:1157
 msgid "Blaming lines"
 msgstr "Blaming a líneas"
 
 #: builtin/branch.c:29
-msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
-msgstr "git branch [<opciones>] [-r | -a] [--merged | --no-merged]"
+msgid "git branch [<options>] [-r | -a] [--merged] [--no-merged]"
+msgstr "git branch [<opciones>] [-r | -a] [--merged] [--no-merged]"
 
 #: builtin/branch.c:30
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
@@ -10785,121 +11243,111 @@
 msgid "Update of config-file failed"
 msgstr "Falló de actualización de config-file"
 
-#: builtin/branch.c:220
+#: builtin/branch.c:223
 msgid "cannot use -a with -d"
 msgstr "no se puede usar-a con -d"
 
-#: builtin/branch.c:226
+#: builtin/branch.c:230
 msgid "Couldn't look up commit object for HEAD"
 msgstr "No se pudo revisar el objeto commit para HEAD"
 
-#: builtin/branch.c:240
+#: builtin/branch.c:244
 #, c-format
 msgid "Cannot delete branch '%s' checked out at '%s'"
 msgstr "No se puede borrar rama '%s' que cuenta con checkout en '%s'"
 
-#: builtin/branch.c:255
+#: builtin/branch.c:259
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "rama de rastreo remoto '%s' no encontrada."
 
-#: builtin/branch.c:256
+#: builtin/branch.c:260
 #, c-format
 msgid "branch '%s' not found."
 msgstr "rama '%s' no encontrada."
 
-#: builtin/branch.c:271
-#, c-format
-msgid "Error deleting remote-tracking branch '%s'"
-msgstr "Error al eliminar la rama de rastreo remota '%s'"
-
-#: builtin/branch.c:272
-#, c-format
-msgid "Error deleting branch '%s'"
-msgstr "Error al eliminar la rama '%s'"
-
-#: builtin/branch.c:279
+#: builtin/branch.c:291
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Eliminada la rama de rastreo remota %s (era %s).\n"
 
-#: builtin/branch.c:280
+#: builtin/branch.c:292
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Eliminada la rama %s (era %s)..\n"
 
-#: builtin/branch.c:429 builtin/tag.c:61
+#: builtin/branch.c:438 builtin/tag.c:61
 msgid "unable to parse format string"
 msgstr "no es posible analizar el string de formato"
 
-#: builtin/branch.c:460
+#: builtin/branch.c:469
 msgid "could not resolve HEAD"
 msgstr "no se pudo resolver HEAD"
 
-#: builtin/branch.c:466
+#: builtin/branch.c:475
 #, c-format
 msgid "HEAD (%s) points outside of refs/heads/"
 msgstr "HEAD (%s) apunta fuera de refs/heads/"
 
-#: builtin/branch.c:481
+#: builtin/branch.c:490
 #, c-format
 msgid "Branch %s is being rebased at %s"
 msgstr "Rama %s está siendo rebasada en %s"
 
-#: builtin/branch.c:485
+#: builtin/branch.c:494
 #, c-format
 msgid "Branch %s is being bisected at %s"
 msgstr "Rama %s está siendo bisecada en %s"
 
-#: builtin/branch.c:502
+#: builtin/branch.c:511
 msgid "cannot copy the current branch while not on any."
 msgstr "no se puede copiar la rama actual mientras no se está en ninguna."
 
-#: builtin/branch.c:504
+#: builtin/branch.c:513
 msgid "cannot rename the current branch while not on any."
 msgstr "no se puede renombrar la rama actual mientras no se está en ninguna."
 
-#: builtin/branch.c:515
+#: builtin/branch.c:524
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Nombre de rama inválido: '%s'"
 
-#: builtin/branch.c:542
+#: builtin/branch.c:553
 msgid "Branch rename failed"
 msgstr "Cambio de nombre de rama fallido"
 
-#: builtin/branch.c:544
+#: builtin/branch.c:555
 msgid "Branch copy failed"
 msgstr "Copiado de rama fallido"
 
-#: builtin/branch.c:548
+#: builtin/branch.c:559
 #, c-format
 msgid "Created a copy of a misnamed branch '%s'"
 msgstr "Copia creada de la rama malnombrada '%s'"
 
-#: builtin/branch.c:551
+#: builtin/branch.c:562
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Rama mal llamada '%s' renombrada"
 
-#: builtin/branch.c:557
+#: builtin/branch.c:568
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "¡Rama renombrada a %s, pero HEAD no está actualizado!"
 
-#: builtin/branch.c:566
+#: builtin/branch.c:577
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 "La rama está renombrada, pero falló la actualización del archivo de "
 "configuración"
 
-#: builtin/branch.c:568
+#: builtin/branch.c:579
 msgid "Branch is copied, but update of config-file failed"
 msgstr ""
 "La rama está copiada, pero falló la actualización del archivo de "
 "configuración"
 
-#: builtin/branch.c:584
+#: builtin/branch.c:595
 #, c-format
 msgid ""
 "Please edit the description for the branch\n"
@@ -10910,180 +11358,180 @@
 "%s\n"
 "Las líneas que comiencen con '%c' serán eliminadas.\n"
 
-#: builtin/branch.c:618
+#: builtin/branch.c:629
 msgid "Generic options"
 msgstr "Opciones genéricas"
 
-#: builtin/branch.c:620
+#: builtin/branch.c:631
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "mostrar hash y tema, dar dos veces para rama upstream"
 
-#: builtin/branch.c:621
+#: builtin/branch.c:632
 msgid "suppress informational messages"
 msgstr "suprimir mensajes informativos"
 
-#: builtin/branch.c:622
+#: builtin/branch.c:633
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "configurando modo tracking (mirar git-pull(1))"
 
-#: builtin/branch.c:624
+#: builtin/branch.c:635
 msgid "do not use"
 msgstr "no usar"
 
-#: builtin/branch.c:626 builtin/rebase.c:520
+#: builtin/branch.c:637 builtin/rebase.c:534
 msgid "upstream"
 msgstr "upstream"
 
-#: builtin/branch.c:626
+#: builtin/branch.c:637
 msgid "change the upstream info"
 msgstr "cambiar info de upstream"
 
-#: builtin/branch.c:627
+#: builtin/branch.c:638
 msgid "unset the upstream info"
 msgstr "desconfigurando la info de upstream"
 
-#: builtin/branch.c:628
+#: builtin/branch.c:639
 msgid "use colored output"
 msgstr "usar salida con colores"
 
-#: builtin/branch.c:629
+#: builtin/branch.c:640
 msgid "act on remote-tracking branches"
 msgstr "actuar en ramas de traqueo remoto"
 
-#: builtin/branch.c:631 builtin/branch.c:633
+#: builtin/branch.c:642 builtin/branch.c:644
 msgid "print only branches that contain the commit"
 msgstr "mostrar solo ramas que contienen el commit"
 
-#: builtin/branch.c:632 builtin/branch.c:634
+#: builtin/branch.c:643 builtin/branch.c:645
 msgid "print only branches that don't contain the commit"
 msgstr "mostrar solo ramas que no contienen el commit"
 
-#: builtin/branch.c:637
+#: builtin/branch.c:648
 msgid "Specific git-branch actions:"
 msgstr "Acciones específicas de git-branch:"
 
-#: builtin/branch.c:638
+#: builtin/branch.c:649
 msgid "list both remote-tracking and local branches"
 msgstr "listar ramas de remote-tracking y locales"
 
-#: builtin/branch.c:640
+#: builtin/branch.c:651
 msgid "delete fully merged branch"
 msgstr "borrar ramas totalmente fusionadas"
 
-#: builtin/branch.c:641
+#: builtin/branch.c:652
 msgid "delete branch (even if not merged)"
 msgstr "borrar rama (incluso si no está fusionada)"
 
-#: builtin/branch.c:642
+#: builtin/branch.c:653
 msgid "move/rename a branch and its reflog"
 msgstr "mover/renombrar una rama y su reflog"
 
-#: builtin/branch.c:643
+#: builtin/branch.c:654
 msgid "move/rename a branch, even if target exists"
 msgstr "mover/renombrar una rama, incluso si el destino existe"
 
-#: builtin/branch.c:644
+#: builtin/branch.c:655
 msgid "copy a branch and its reflog"
 msgstr "copiar una rama y su reflog"
 
-#: builtin/branch.c:645
+#: builtin/branch.c:656
 msgid "copy a branch, even if target exists"
 msgstr "copiar una rama, incluso si el objetivo existe"
 
-#: builtin/branch.c:646
+#: builtin/branch.c:657
 msgid "list branch names"
 msgstr "listar nombres de ramas"
 
-#: builtin/branch.c:647
+#: builtin/branch.c:658
 msgid "show current branch name"
 msgstr "muestra el nombre de branch actual"
 
-#: builtin/branch.c:648
+#: builtin/branch.c:659
 msgid "create the branch's reflog"
 msgstr "crea el reflog de la rama"
 
-#: builtin/branch.c:650
+#: builtin/branch.c:661
 msgid "edit the description for the branch"
 msgstr "edita la descripción de la rama"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:662
 msgid "force creation, move/rename, deletion"
 msgstr "fuerza la creación,movimiento/renombrado,borrado"
 
-#: builtin/branch.c:652
+#: builtin/branch.c:663
 msgid "print only branches that are merged"
 msgstr "muestra solo ramas que han sido fusionadas"
 
-#: builtin/branch.c:653
+#: builtin/branch.c:664
 msgid "print only branches that are not merged"
 msgstr "muestra solo ramas que no han sido fusionadas"
 
-#: builtin/branch.c:654
+#: builtin/branch.c:665
 msgid "list branches in columns"
 msgstr "muestra las ramas en columnas"
 
-#: builtin/branch.c:656 builtin/for-each-ref.c:42 builtin/notes.c:415
+#: builtin/branch.c:667 builtin/for-each-ref.c:42 builtin/notes.c:415
 #: builtin/notes.c:418 builtin/notes.c:581 builtin/notes.c:584
-#: builtin/tag.c:434
+#: builtin/tag.c:466
 msgid "object"
 msgstr "objeto"
 
-#: builtin/branch.c:657
+#: builtin/branch.c:668
 msgid "print only branches of the object"
 msgstr "imprimir sólo las ramas del objeto"
 
-#: builtin/branch.c:658 builtin/for-each-ref.c:48 builtin/tag.c:441
+#: builtin/branch.c:669 builtin/for-each-ref.c:48 builtin/tag.c:473
 msgid "sorting and filtering are case insensitive"
 msgstr "ordenamiento y filtrado son case-insensitive"
 
-#: builtin/branch.c:659 builtin/for-each-ref.c:38 builtin/tag.c:439
+#: builtin/branch.c:670 builtin/for-each-ref.c:38 builtin/tag.c:471
 #: builtin/verify-tag.c:38
 msgid "format to use for the output"
 msgstr "formato para usar para el output"
 
-#: builtin/branch.c:682 builtin/clone.c:789
+#: builtin/branch.c:693 builtin/clone.c:790
 msgid "HEAD not found below refs/heads!"
 msgstr "¡HEAD no encontrado abajo de refs/heads!"
 
-#: builtin/branch.c:706
+#: builtin/branch.c:717
 msgid "--column and --verbose are incompatible"
 msgstr "--column y --verbose son incompatibles"
 
-#: builtin/branch.c:721 builtin/branch.c:775 builtin/branch.c:784
+#: builtin/branch.c:732 builtin/branch.c:788 builtin/branch.c:797
 msgid "branch name required"
 msgstr "se necesita el nombre de la rama"
 
-#: builtin/branch.c:751
+#: builtin/branch.c:764
 msgid "Cannot give description to detached HEAD"
 msgstr "No se puede dar descripción al HEAD desacoplado"
 
-#: builtin/branch.c:756
+#: builtin/branch.c:769
 msgid "cannot edit description of more than one branch"
 msgstr "no se puede editar la descripción de más de una rama"
 
-#: builtin/branch.c:763
+#: builtin/branch.c:776
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Aún no hay commits en la rama '%s'."
 
-#: builtin/branch.c:766
+#: builtin/branch.c:779
 #, c-format
 msgid "No branch named '%s'."
 msgstr "No hay ninguna rama llamada '%s'."
 
-#: builtin/branch.c:781
+#: builtin/branch.c:794
 msgid "too many branches for a copy operation"
 msgstr "demasiadas ramas para una operación de copiado"
 
-#: builtin/branch.c:790
+#: builtin/branch.c:803
 msgid "too many arguments for a rename operation"
 msgstr "demasiados argumentos para una operación de renombrado"
 
-#: builtin/branch.c:795
+#: builtin/branch.c:808
 msgid "too many arguments to set new upstream"
 msgstr "demasiados argumentos para configurar un nuevo upstream"
 
-#: builtin/branch.c:799
+#: builtin/branch.c:812
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -11091,32 +11539,32 @@
 "no se pudo configurar upstream de HEAD a %s cuando este no apunta a ninguna "
 "rama."
 
-#: builtin/branch.c:802 builtin/branch.c:825
+#: builtin/branch.c:815 builtin/branch.c:838
 #, c-format
 msgid "no such branch '%s'"
 msgstr "no hay tal rama '%s'"
 
-#: builtin/branch.c:806
+#: builtin/branch.c:819
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "la rama '%s' no existe"
 
-#: builtin/branch.c:819
+#: builtin/branch.c:832
 msgid "too many arguments to unset upstream"
 msgstr "demasiados argumentos para desconfigurar upstream"
 
-#: builtin/branch.c:823
+#: builtin/branch.c:836
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "no se puede desconfigurar upstream de HEAD cuando este no apunta a ninguna "
 "rama."
 
-#: builtin/branch.c:829
+#: builtin/branch.c:842
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Rama '%s' no tiene información de upstream"
 
-#: builtin/branch.c:839
+#: builtin/branch.c:852
 msgid ""
 "The -a, and -r, options to 'git branch' do not take a branch name.\n"
 "Did you mean to use: -a|-r --list <pattern>?"
@@ -11124,7 +11572,7 @@
 "Las opciones -a, y -r, de 'git branch' no toman un nombre de rama.\n"
 "¿Quisiste usar: -a|-r --list <patrón>?"
 
-#: builtin/branch.c:843
+#: builtin/branch.c:856
 msgid ""
 "the '--set-upstream' option is no longer supported. Please use '--track' or "
 "'--set-upstream-to' instead."
@@ -11132,6 +11580,104 @@
 "la opción '--set-upstream' ya no es soportada. Considere usar '--track' o '--"
 "set-upstream-to' en cambio."
 
+#: builtin/bugreport.c:15
+msgid "git version:\n"
+msgstr "versión de git:\n"
+
+#: builtin/bugreport.c:21
+#, c-format
+msgid "uname() failed with error '%s' (%d)\n"
+msgstr "uname() falló con error '%s' (%d)\n"
+
+#: builtin/bugreport.c:31
+msgid "compiler info: "
+msgstr "información del compilador: "
+
+#: builtin/bugreport.c:34
+msgid "libc info: "
+msgstr "información de libc: "
+
+#: builtin/bugreport.c:80
+msgid "not run from a git repository - no hooks to show\n"
+msgstr "no ejecutado desde un repositorio git - no hay hooks para mostrar\n"
+
+#: builtin/bugreport.c:90
+msgid "git bugreport [-o|--output-directory <file>] [-s|--suffix <format>]"
+msgstr ""
+"git bugreport [-o|--output-directory <archivo>] [-s|--suffix <formato>]"
+
+#: builtin/bugreport.c:97
+msgid ""
+"Thank you for filling out a Git bug report!\n"
+"Please answer the following questions to help us understand your issue.\n"
+"\n"
+"What did you do before the bug happened? (Steps to reproduce your issue)\n"
+"\n"
+"What did you expect to happen? (Expected behavior)\n"
+"\n"
+"What happened instead? (Actual behavior)\n"
+"\n"
+"What's different between what you expected and what actually happened?\n"
+"\n"
+"Anything else you want to add:\n"
+"\n"
+"Please review the rest of the bug report below.\n"
+"You can delete any lines you don't wish to share.\n"
+msgstr ""
+"¡Gracias por prepara un reporte de bug de Git!\n"
+"Por favor responde las siguientes preguntas para ayudarnos a entender el "
+"problema.\n"
+"\n"
+"¿Qué hiciste antes de que sucediera el bug? (Pasos para reproducir el "
+"problema)\n"
+"\n"
+"¿Qué esperabas que sucediera? (Comportamiento esperado)\n"
+"\n"
+"¿Qué sucedio en lugar de eso? (Comportamiento real)\n"
+"\n"
+"¿Qué es diferente entre lo que esperabas y lo que pasó?\n"
+"\n"
+"Cualquier cosa que quieras agregar:\n"
+"\n"
+"Por favor revisa el resto del reporte abajo.\n"
+"Puedes borrar cualquier línea que no desees compartir.\n"
+
+#: builtin/bugreport.c:135
+msgid "specify a destination for the bugreport file"
+msgstr "especificar el destino para el archivo de reporte de bug"
+
+#: builtin/bugreport.c:137
+msgid "specify a strftime format suffix for the filename"
+msgstr "especificar el sufijo formato strftime para el nombre del archivo"
+
+#: builtin/bugreport.c:159
+#, c-format
+msgid "could not create leading directories for '%s'"
+msgstr "no se pudo crear directorios principales para '%s'"
+
+#: builtin/bugreport.c:166
+msgid "System Info"
+msgstr "Información del sistema"
+
+#: builtin/bugreport.c:169
+msgid "Enabled Hooks"
+msgstr "Activar Hooks"
+
+#: builtin/bugreport.c:176
+#, c-format
+msgid "couldn't create a new file at '%s'"
+msgstr "no se pudo crear un archivo en '%s'"
+
+#: builtin/bugreport.c:179
+#, c-format
+msgid "unable to write to %s"
+msgstr "no es posible escribir en %s"
+
+#: builtin/bugreport.c:189
+#, c-format
+msgid "Created new report at '%s'.\n"
+msgstr "Crear un nuevo reporte en '%s'.\n"
+
 #: builtin/bundle.c:15 builtin/bundle.c:23
 msgid "git bundle create [<options>] <file> <git-rev-list args>"
 msgstr "git bundle create [<opciones>] <file> <git-rev-list args>"
@@ -11148,44 +11694,48 @@
 msgid "git bundle unbundle <file> [<refname>...]"
 msgstr "git bundle unbundle <archivo> [<nombre-de-ref>...]"
 
-#: builtin/bundle.c:66 builtin/pack-objects.c:3448
+#: builtin/bundle.c:67 builtin/pack-objects.c:3495
 msgid "do not show progress meter"
 msgstr "no mostrar medidor de progreso"
 
-#: builtin/bundle.c:68 builtin/pack-objects.c:3450
+#: builtin/bundle.c:69 builtin/pack-objects.c:3497
 msgid "show progress meter"
 msgstr "mostrar medidor de progreso"
 
-#: builtin/bundle.c:70 builtin/pack-objects.c:3452
+#: builtin/bundle.c:71 builtin/pack-objects.c:3499
 msgid "show progress meter during object writing phase"
 msgstr "mostrar medidor de progreso durante la fase de escritura de objeto"
 
-#: builtin/bundle.c:73 builtin/pack-objects.c:3455
+#: builtin/bundle.c:74 builtin/pack-objects.c:3502
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "similar a --all-progress cuando medidor de progreso es mostrado"
 
-#: builtin/bundle.c:93
+#: builtin/bundle.c:76
+msgid "specify bundle format version"
+msgstr "especificar la versión del formato del paquete"
+
+#: builtin/bundle.c:96
 msgid "Need a repository to create a bundle."
 msgstr "Se necesita un repositorio para agrupar."
 
-#: builtin/bundle.c:104
+#: builtin/bundle.c:107
 msgid "do not show bundle details"
 msgstr "no mostrar detalles del bundle"
 
-#: builtin/bundle.c:119
+#: builtin/bundle.c:122
 #, c-format
 msgid "%s is okay\n"
 msgstr "%s está bien\n"
 
-#: builtin/bundle.c:160
+#: builtin/bundle.c:163
 msgid "Need a repository to unbundle."
 msgstr "Se necesita un repositorio para desagrupar."
 
-#: builtin/bundle.c:168 builtin/remote.c:1686
+#: builtin/bundle.c:171 builtin/remote.c:1700
 msgid "be verbose; must be placed before a subcommand"
 msgstr "ser verboso; tiene que ser agregado antes de un subcomando"
 
-#: builtin/bundle.c:190 builtin/remote.c:1717
+#: builtin/bundle.c:193 builtin/remote.c:1731
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Sub-comando desconocido: %s"
@@ -11238,7 +11788,7 @@
 msgid "for blob objects, run filters on object's content"
 msgstr "para objetos blob, ejecuta filters en el contenido del objeto"
 
-#: builtin/cat-file.c:648 git-submodule.sh:958
+#: builtin/cat-file.c:648
 msgid "blob"
 msgstr "blob"
 
@@ -11299,8 +11849,8 @@
 msgid "terminate input and output records by a NUL character"
 msgstr "terminar registros de entrada y salida con un carácter NUL"
 
-#: builtin/check-ignore.c:21 builtin/checkout.c:1486 builtin/gc.c:537
-#: builtin/worktree.c:561
+#: builtin/check-ignore.c:21 builtin/checkout.c:1499 builtin/gc.c:549
+#: builtin/worktree.c:489
 msgid "suppress progress reporting"
 msgstr "suprimir el reporte de progreso"
 
@@ -11353,56 +11903,56 @@
 msgid "no contacts specified"
 msgstr "contactos no especificados"
 
-#: builtin/checkout-index.c:131
+#: builtin/checkout-index.c:152
 msgid "git checkout-index [<options>] [--] [<file>...]"
 msgstr "git checkout-index [<opciones>] [--] [<archivo>...]"
 
-#: builtin/checkout-index.c:148
+#: builtin/checkout-index.c:169
 msgid "stage should be between 1 and 3 or all"
 msgstr "stage tiene que estar entre 1 y 3 o all"
 
-#: builtin/checkout-index.c:164
+#: builtin/checkout-index.c:186
 msgid "check out all files in the index"
 msgstr "revisar todos los archivos en el índice"
 
-#: builtin/checkout-index.c:165
+#: builtin/checkout-index.c:187
 msgid "force overwrite of existing files"
 msgstr "forzar sobreescritura de los archivos existentes"
 
-#: builtin/checkout-index.c:167
+#: builtin/checkout-index.c:189
 msgid "no warning for existing files and files not in index"
 msgstr ""
 "no hay advertencias para los archivos existentes y los archivos no están en "
 "el índice"
 
-#: builtin/checkout-index.c:169
+#: builtin/checkout-index.c:191
 msgid "don't checkout new files"
 msgstr "no revisar archivos nuevos"
 
-#: builtin/checkout-index.c:171
+#: builtin/checkout-index.c:193
 msgid "update stat information in the index file"
 msgstr "actualizar información de estado en el archivo índice"
 
-#: builtin/checkout-index.c:175
+#: builtin/checkout-index.c:197
 msgid "read list of paths from the standard input"
 msgstr "leer lista de rutas desde standard input"
 
-#: builtin/checkout-index.c:177
+#: builtin/checkout-index.c:199
 msgid "write the content to temporary files"
 msgstr "escribir el contenido en un archivo temporal"
 
-#: builtin/checkout-index.c:178 builtin/column.c:31
-#: builtin/submodule--helper.c:1400 builtin/submodule--helper.c:1403
-#: builtin/submodule--helper.c:1411 builtin/submodule--helper.c:1909
-#: builtin/worktree.c:754
+#: builtin/checkout-index.c:200 builtin/column.c:31
+#: builtin/submodule--helper.c:1824 builtin/submodule--helper.c:1827
+#: builtin/submodule--helper.c:1835 builtin/submodule--helper.c:2333
+#: builtin/worktree.c:717
 msgid "string"
 msgstr "string"
 
-#: builtin/checkout-index.c:179
+#: builtin/checkout-index.c:201
 msgid "when creating files, prepend <string>"
 msgstr "cuando cree archivos, anteponer <string>"
 
-#: builtin/checkout-index.c:181
+#: builtin/checkout-index.c:203
 msgid "copy out the files from named stage"
 msgstr "copiar los archivos del stage nombrado"
 
@@ -11437,83 +11987,83 @@
 msgid "path '%s' does not have all necessary versions"
 msgstr "ruta '%s' no tiene todas las versiones necesarias"
 
-#: builtin/checkout.c:256
+#: builtin/checkout.c:258
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "ruta '%s' no tiene versiones necesarias"
 
-#: builtin/checkout.c:274
+#: builtin/checkout.c:275
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "ruta '%s': no se puede fusionar"
 
-#: builtin/checkout.c:290
+#: builtin/checkout.c:291
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "Incapaz de agregar resultados de fusión a '%s'"
 
-#: builtin/checkout.c:395
+#: builtin/checkout.c:396
 #, c-format
 msgid "Recreated %d merge conflict"
 msgid_plural "Recreated %d merge conflicts"
 msgstr[0] "Recreado %d conflicto de merge"
 msgstr[1] "Recreados %d conflictos de merge"
 
-#: builtin/checkout.c:400
+#: builtin/checkout.c:401
 #, c-format
 msgid "Updated %d path from %s"
 msgid_plural "Updated %d paths from %s"
 msgstr[0] "Actualizada %d ruta para %s"
 msgstr[1] "Actualizadas %d rutas para %s"
 
-#: builtin/checkout.c:407
+#: builtin/checkout.c:408
 #, c-format
 msgid "Updated %d path from the index"
 msgid_plural "Updated %d paths from the index"
 msgstr[0] "Actualizada %d ruta desde el index"
 msgstr[1] "Actualizadas %d rutas desde el index"
 
-#: builtin/checkout.c:430 builtin/checkout.c:433 builtin/checkout.c:436
-#: builtin/checkout.c:440
+#: builtin/checkout.c:431 builtin/checkout.c:434 builtin/checkout.c:437
+#: builtin/checkout.c:441
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "'%s' no puede ser usada con rutas actualizadas"
 
-#: builtin/checkout.c:443 builtin/checkout.c:446
+#: builtin/checkout.c:444 builtin/checkout.c:447
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' no puede ser usado con %s"
 
-#: builtin/checkout.c:450
+#: builtin/checkout.c:451
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr "No se puede actualizar rutas y cambiar a la rama '%s' al mismo tiempo."
 
-#: builtin/checkout.c:454
+#: builtin/checkout.c:455
 #, c-format
 msgid "neither '%s' or '%s' is specified"
 msgstr "ni '%s' o '%s' están especificados"
 
-#: builtin/checkout.c:458
+#: builtin/checkout.c:459
 #, c-format
 msgid "'%s' must be used when '%s' is not specified"
 msgstr "'%s' tiene que ser usado cuando '%s' no es especificado"
 
-#: builtin/checkout.c:463 builtin/checkout.c:468
+#: builtin/checkout.c:464 builtin/checkout.c:469
 #, c-format
 msgid "'%s' or '%s' cannot be used with %s"
 msgstr "'%s' o '%s' no puede ser usado con %s"
 
-#: builtin/checkout.c:527 builtin/checkout.c:534
+#: builtin/checkout.c:543 builtin/checkout.c:550
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "ruta '%s' no esta fusionada"
 
-#: builtin/checkout.c:702
+#: builtin/checkout.c:718
 msgid "you need to resolve your current index first"
 msgstr "necesitas resolver tu índice actual primero"
 
-#: builtin/checkout.c:756
+#: builtin/checkout.c:772
 #, c-format
 msgid ""
 "cannot continue with staged changes in the following files:\n"
@@ -11522,50 +12072,50 @@
 "no se puede continuar con los cambios en stage en los siguientes archivos:\n"
 "%s"
 
-#: builtin/checkout.c:859
+#: builtin/checkout.c:865
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "No se puede hacer reflog para '%s': %s\n"
 
-#: builtin/checkout.c:901
+#: builtin/checkout.c:907
 msgid "HEAD is now at"
 msgstr "HEAD está ahora en"
 
-#: builtin/checkout.c:905 builtin/clone.c:720
+#: builtin/checkout.c:911 builtin/clone.c:721 t/helper/test-fast-rebase.c:202
 msgid "unable to update HEAD"
 msgstr "no es posible actualizar  HEAD"
 
-#: builtin/checkout.c:909
+#: builtin/checkout.c:915
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Reiniciar rama '%s'\n"
 
-#: builtin/checkout.c:912
+#: builtin/checkout.c:918
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Ya en '%s'\n"
 
-#: builtin/checkout.c:916
+#: builtin/checkout.c:922
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Rama reiniciada y cambiada a '%s'\n"
 
-#: builtin/checkout.c:918 builtin/checkout.c:1342
+#: builtin/checkout.c:924 builtin/checkout.c:1355
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Cambiado a nueva rama '%s'\n"
 
-#: builtin/checkout.c:920
+#: builtin/checkout.c:926
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Cambiado a rama '%s'\n"
 
-#: builtin/checkout.c:971
+#: builtin/checkout.c:977
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... y %d más.\n"
 
-#: builtin/checkout.c:977
+#: builtin/checkout.c:983
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -11588,7 +12138,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:996
+#: builtin/checkout.c:1002
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -11615,19 +12165,19 @@
 " git branch <nombre-de-rama> %s\n"
 "\n"
 
-#: builtin/checkout.c:1031
+#: builtin/checkout.c:1037
 msgid "internal error in revision walk"
 msgstr "error interno en camino de revisión"
 
-#: builtin/checkout.c:1035
+#: builtin/checkout.c:1041
 msgid "Previous HEAD position was"
 msgstr "La posición previa de HEAD era"
 
-#: builtin/checkout.c:1075 builtin/checkout.c:1337
+#: builtin/checkout.c:1081 builtin/checkout.c:1350
 msgid "You are on a branch yet to be born"
 msgstr "Estás en una rama por nacer"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1163
 #, c-format
 msgid ""
 "'%s' could be both a local file and a tracking branch.\n"
@@ -11636,7 +12186,7 @@
 "'%s' puede ser tanto un archivo local como una rama de rastreo.\n"
 "Por favor use -- (y opcionalmente --no-guess) para desambiguar"
 
-#: builtin/checkout.c:1157
+#: builtin/checkout.c:1170
 msgid ""
 "If you meant to check out a remote tracking branch on, e.g. 'origin',\n"
 "you can do so by fully qualifying the name with the --track option:\n"
@@ -11657,51 +12207,51 @@
 "de nombre <nombre> remota, como 'origin', considera configurar\n"
 "checkout.defaultRemote=origin en tu configuración."
 
-#: builtin/checkout.c:1167
+#: builtin/checkout.c:1180
 #, c-format
 msgid "'%s' matched multiple (%d) remote tracking branches"
 msgstr "'%s' concordó con multiples (%d) ramas de rastreo remoto"
 
-#: builtin/checkout.c:1233
+#: builtin/checkout.c:1246
 msgid "only one reference expected"
 msgstr "solo una referencia esperada"
 
-#: builtin/checkout.c:1250
+#: builtin/checkout.c:1263
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "solo una referencia esperada, %d entregadas."
 
-#: builtin/checkout.c:1296 builtin/worktree.c:342 builtin/worktree.c:510
+#: builtin/checkout.c:1309 builtin/worktree.c:270 builtin/worktree.c:438
 #, c-format
 msgid "invalid reference: %s"
 msgstr "referencia inválida: %s"
 
-#: builtin/checkout.c:1309 builtin/checkout.c:1675
+#: builtin/checkout.c:1322 builtin/checkout.c:1688
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "la referencia no es n árbol: %s"
 
-#: builtin/checkout.c:1356
+#: builtin/checkout.c:1369
 #, c-format
 msgid "a branch is expected, got tag '%s'"
 msgstr "se esperaba un branch, se obtuvo tag '%s'"
 
-#: builtin/checkout.c:1358
+#: builtin/checkout.c:1371
 #, c-format
 msgid "a branch is expected, got remote branch '%s'"
 msgstr "se espera una rama, se obtuvo una rama remota '%s'"
 
-#: builtin/checkout.c:1359 builtin/checkout.c:1367
+#: builtin/checkout.c:1372 builtin/checkout.c:1380
 #, c-format
 msgid "a branch is expected, got '%s'"
 msgstr "se esperaba branch, se obuto '%s'"
 
-#: builtin/checkout.c:1362
+#: builtin/checkout.c:1375
 #, c-format
 msgid "a branch is expected, got commit '%s'"
 msgstr "se espera una rama, se obtuvo commit '%s'"
 
-#: builtin/checkout.c:1378
+#: builtin/checkout.c:1391
 msgid ""
 "cannot switch branch while merging\n"
 "Consider \"git merge --quit\" or \"git worktree add\"."
@@ -11709,7 +12259,7 @@
 "no se puede cambiar de branch durante un merge\n"
 "Considera \"git merge --quit\" o \"git worktree add\"."
 
-#: builtin/checkout.c:1382
+#: builtin/checkout.c:1395
 msgid ""
 "cannot switch branch in the middle of an am session\n"
 "Consider \"git am --quit\" or \"git worktree add\"."
@@ -11717,7 +12267,7 @@
 "no se puede cambiar de branch en medio de una sesión de am\n"
 "Considera \"git am --quit\" o \"git worktree add\"."
 
-#: builtin/checkout.c:1386
+#: builtin/checkout.c:1399
 msgid ""
 "cannot switch branch while rebasing\n"
 "Consider \"git rebase --quit\" or \"git worktree add\"."
@@ -11725,7 +12275,7 @@
 "no se puede cambiar de branch durante un rebase\n"
 "Considera \"git rebase --quit\" o \"git worktree add\"."
 
-#: builtin/checkout.c:1390
+#: builtin/checkout.c:1403
 msgid ""
 "cannot switch branch while cherry-picking\n"
 "Consider \"git cherry-pick --quit\" or \"git worktree add\"."
@@ -11733,7 +12283,7 @@
 "no se puede cambiar de branch durante un cherry-pick\n"
 "Considera \"git cherry-pick --quit\" o \"git worktree add\"."
 
-#: builtin/checkout.c:1394
+#: builtin/checkout.c:1407
 msgid ""
 "cannot switch branch while reverting\n"
 "Consider \"git revert --quit\" or \"git worktree add\"."
@@ -11741,144 +12291,137 @@
 "no se puede cambiar de branch durante un revert\n"
 "Considera \"git revert --quit\" o \"git worktree add\"."
 
-#: builtin/checkout.c:1398
+#: builtin/checkout.c:1411
 msgid "you are switching branch while bisecting"
 msgstr "estás cambiando ramas durante un bisect"
 
-#: builtin/checkout.c:1405
+#: builtin/checkout.c:1418
 msgid "paths cannot be used with switching branches"
 msgstr "rutas no pueden ser usadas con cambios de rama"
 
-#: builtin/checkout.c:1408 builtin/checkout.c:1412 builtin/checkout.c:1416
+#: builtin/checkout.c:1421 builtin/checkout.c:1425 builtin/checkout.c:1429
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' no puede ser usado con cambios de ramas"
 
-#: builtin/checkout.c:1420 builtin/checkout.c:1423 builtin/checkout.c:1426
-#: builtin/checkout.c:1431 builtin/checkout.c:1436
+#: builtin/checkout.c:1433 builtin/checkout.c:1436 builtin/checkout.c:1439
+#: builtin/checkout.c:1444 builtin/checkout.c:1449
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' no puede ser usado con '%s'"
 
-#: builtin/checkout.c:1433
+#: builtin/checkout.c:1446
 #, c-format
 msgid "'%s' cannot take <start-point>"
 msgstr "'%s' no puede tomar <punto de partida>"
 
-#: builtin/checkout.c:1441
+#: builtin/checkout.c:1454
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "No se puede cambiar rama a un '%s' sin commits"
 
-#: builtin/checkout.c:1448
+#: builtin/checkout.c:1461
 msgid "missing branch or commit argument"
 msgstr "falta branch o commit como argumento"
 
-#: builtin/checkout.c:1490 builtin/clone.c:91 builtin/commit-graph.c:82
-#: builtin/commit-graph.c:189 builtin/fetch.c:168 builtin/merge.c:288
-#: builtin/multi-pack-index.c:27 builtin/pull.c:119 builtin/push.c:561
-#: builtin/send-pack.c:173
-msgid "force progress reporting"
-msgstr "forzar el reporte de progreso"
-
-#: builtin/checkout.c:1491
+#: builtin/checkout.c:1504
 msgid "perform a 3-way merge with the new branch"
 msgstr "realizar una fusión de tres vías con la rama nueva"
 
-#: builtin/checkout.c:1492 builtin/log.c:1709 parse-options.h:322
+#: builtin/checkout.c:1505 builtin/log.c:1799 parse-options.h:322
 msgid "style"
 msgstr "estilo"
 
-#: builtin/checkout.c:1493
+#: builtin/checkout.c:1506
 msgid "conflict style (merge or diff3)"
 msgstr "conflicto de estilos (merge o diff3)"
 
-#: builtin/checkout.c:1505 builtin/worktree.c:558
+#: builtin/checkout.c:1518 builtin/worktree.c:486
 msgid "detach HEAD at named commit"
 msgstr "desacoplar HEAD en el commit nombrado"
 
-#: builtin/checkout.c:1506
+#: builtin/checkout.c:1519
 msgid "set upstream info for new branch"
 msgstr "configurar info de upstream para una rama nueva"
 
-#: builtin/checkout.c:1508
+#: builtin/checkout.c:1521
 msgid "force checkout (throw away local modifications)"
 msgstr "forzar el checkout (descartar modificaciones locales)"
 
-#: builtin/checkout.c:1510
+#: builtin/checkout.c:1523
 msgid "new-branch"
 msgstr "nueva-rama"
 
-#: builtin/checkout.c:1510
+#: builtin/checkout.c:1523
 msgid "new unparented branch"
 msgstr "nueva rama no emparentada"
 
-#: builtin/checkout.c:1512 builtin/merge.c:292
+#: builtin/checkout.c:1525 builtin/merge.c:301
 msgid "update ignored files (default)"
 msgstr "actualizar archivos ignorados (default)"
 
-#: builtin/checkout.c:1515
+#: builtin/checkout.c:1528
 msgid "do not check if another worktree is holding the given ref"
 msgstr "no revise si otro árbol de trabajo contiene la ref entregada"
 
-#: builtin/checkout.c:1528
+#: builtin/checkout.c:1541
 msgid "checkout our version for unmerged files"
 msgstr "hacer checkout a  nuestra versión para archivos sin fusionar"
 
-#: builtin/checkout.c:1531
+#: builtin/checkout.c:1544
 msgid "checkout their version for unmerged files"
 msgstr "hacer checkout a su versión para los archivos sin fusionar"
 
-#: builtin/checkout.c:1535
+#: builtin/checkout.c:1548
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "no limitar pathspecs a dispersar entradas solamente"
 
-#: builtin/checkout.c:1590
+#: builtin/checkout.c:1603
 #, c-format
 msgid "-%c, -%c and --orphan are mutually exclusive"
 msgstr "-%c, -%c y --orphan son mutuamente exclusivas"
 
-#: builtin/checkout.c:1594
+#: builtin/checkout.c:1607
 msgid "-p and --overlay are mutually exclusive"
 msgstr "-p y --overlay son mutuamente exclusivas"
 
-#: builtin/checkout.c:1631
+#: builtin/checkout.c:1644
 msgid "--track needs a branch name"
 msgstr "--track necesita el nombre de una rama"
 
-#: builtin/checkout.c:1636
+#: builtin/checkout.c:1649
 #, c-format
 msgid "missing branch name; try -%c"
 msgstr "falta nombre de rama; prueba -%c"
 
-#: builtin/checkout.c:1668
+#: builtin/checkout.c:1681
 #, c-format
 msgid "could not resolve %s"
 msgstr "no se pudo resolver %s"
 
-#: builtin/checkout.c:1684
+#: builtin/checkout.c:1697
 msgid "invalid path specification"
 msgstr "especificación de ruta inválida"
 
-#: builtin/checkout.c:1691
+#: builtin/checkout.c:1704
 #, c-format
 msgid "'%s' is not a commit and a branch '%s' cannot be created from it"
 msgstr "'%s' no es un commit y una rama '%s' no puede ser creada desde este"
 
-#: builtin/checkout.c:1695
+#: builtin/checkout.c:1708
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach no toma un argumento de ruta '%s'"
 
-#: builtin/checkout.c:1704
+#: builtin/checkout.c:1717
 msgid "--pathspec-from-file is incompatible with --detach"
 msgstr "--pathspec-from-file es incompatible con --detach"
 
-#: builtin/checkout.c:1707 builtin/reset.c:325 builtin/stash.c:1503
+#: builtin/checkout.c:1720 builtin/reset.c:325 builtin/stash.c:1566
 msgid "--pathspec-from-file is incompatible with --patch"
 msgstr "--pathspec-from-file es incompatible con --patch"
 
-#: builtin/checkout.c:1718
+#: builtin/checkout.c:1733
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -11886,70 +12429,70 @@
 "git checkout: --ours/--theirs, --force y --merge son incompatibles cuando\n"
 "se revisa fuera del índice."
 
-#: builtin/checkout.c:1723
+#: builtin/checkout.c:1738
 msgid "you must specify path(s) to restore"
 msgstr "debes especificar path(s) para restaurar"
 
-#: builtin/checkout.c:1749 builtin/checkout.c:1751 builtin/checkout.c:1800
-#: builtin/checkout.c:1802 builtin/clone.c:121 builtin/remote.c:170
-#: builtin/remote.c:172 builtin/submodule--helper.c:2295 builtin/worktree.c:554
-#: builtin/worktree.c:556
+#: builtin/checkout.c:1764 builtin/checkout.c:1766 builtin/checkout.c:1815
+#: builtin/checkout.c:1817 builtin/clone.c:122 builtin/remote.c:170
+#: builtin/remote.c:172 builtin/submodule--helper.c:2719 builtin/worktree.c:482
+#: builtin/worktree.c:484
 msgid "branch"
 msgstr "rama"
 
-#: builtin/checkout.c:1750
+#: builtin/checkout.c:1765
 msgid "create and checkout a new branch"
 msgstr "crear y hacer checkout a una nueva rama"
 
-#: builtin/checkout.c:1752
+#: builtin/checkout.c:1767
 msgid "create/reset and checkout a branch"
 msgstr "crear/reiniciar y hacer checkout a una rama"
 
-#: builtin/checkout.c:1753
+#: builtin/checkout.c:1768
 msgid "create reflog for new branch"
 msgstr "crear un reflog para una nueva rama"
 
-#: builtin/checkout.c:1755
+#: builtin/checkout.c:1770
 msgid "second guess 'git checkout <no-such-branch>' (default)"
 msgstr "adivinar segunda opción 'git checkout <no-hay-tal-rama>' (default)"
 
-#: builtin/checkout.c:1756
+#: builtin/checkout.c:1771
 msgid "use overlay mode (default)"
 msgstr "usar modo overlay (default)"
 
-#: builtin/checkout.c:1801
+#: builtin/checkout.c:1816
 msgid "create and switch to a new branch"
 msgstr "crear y hacer switch a una nueva rama"
 
-#: builtin/checkout.c:1803
+#: builtin/checkout.c:1818
 msgid "create/reset and switch to a branch"
 msgstr "crear/reiniciar y hacer switch a una rama"
 
-#: builtin/checkout.c:1805
+#: builtin/checkout.c:1820
 msgid "second guess 'git switch <no-such-branch>'"
 msgstr "adivinar segunda opción 'git checkout <no-hay-tal-rama>'"
 
-#: builtin/checkout.c:1807
+#: builtin/checkout.c:1822
 msgid "throw away local modifications"
 msgstr "descartar modificaciones locales"
 
-#: builtin/checkout.c:1841
+#: builtin/checkout.c:1856
 msgid "which tree-ish to checkout from"
 msgstr "de qué árbol hacer el checkout"
 
-#: builtin/checkout.c:1843
+#: builtin/checkout.c:1858
 msgid "restore the index"
 msgstr "restaurar el index"
 
-#: builtin/checkout.c:1845
+#: builtin/checkout.c:1860
 msgid "restore the working tree (default)"
 msgstr "restaurar el árbol de trabajo (default)"
 
-#: builtin/checkout.c:1847
+#: builtin/checkout.c:1862
 msgid "ignore unmerged entries"
 msgstr "ignorar entradas no fusionadas"
 
-#: builtin/checkout.c:1848
+#: builtin/checkout.c:1863
 msgid "use overlay mode"
 msgstr "usar modo overlay"
 
@@ -11989,7 +12532,7 @@
 msgid "could not lstat %s\n"
 msgstr "no se pudo lstat %s\n"
 
-#: builtin/clean.c:302 git-add--interactive.perl:595
+#: builtin/clean.c:302 git-add--interactive.perl:593
 #, c-format
 msgid ""
 "Prompt help:\n"
@@ -12002,7 +12545,7 @@
 "foo        - selecciona un objeto basado en un prefijo único\n"
 "           - (vacío) no elegir nada\n"
 
-#: builtin/clean.c:306 git-add--interactive.perl:604
+#: builtin/clean.c:306 git-add--interactive.perl:602
 #, c-format
 msgid ""
 "Prompt help:\n"
@@ -12023,8 +12566,8 @@
 "*          - escoger todos los objetos\n"
 "           - (vacío) terminar selección\n"
 
-#: builtin/clean.c:521 git-add--interactive.perl:570
-#: git-add--interactive.perl:575
+#: builtin/clean.c:521 git-add--interactive.perl:568
+#: git-add--interactive.perl:573
 #, c-format, perl-format
 msgid "Huh (%s)?\n"
 msgstr "¿Ahh (%s)?\n"
@@ -12094,8 +12637,8 @@
 msgstr "borrar directorios completos"
 
 #: builtin/clean.c:909 builtin/describe.c:565 builtin/describe.c:567
-#: builtin/grep.c:909 builtin/log.c:182 builtin/log.c:184
-#: builtin/ls-files.c:558 builtin/name-rev.c:526 builtin/name-rev.c:528
+#: builtin/grep.c:922 builtin/log.c:184 builtin/log.c:186
+#: builtin/ls-files.c:573 builtin/name-rev.c:526 builtin/name-rev.c:528
 #: builtin/show-ref.c:179
 msgid "pattern"
 msgstr "patrón"
@@ -12136,163 +12679,163 @@
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<opciones>] [--] <repo> [<directorio>]"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:94
 msgid "don't create a checkout"
 msgstr "no crear checkout"
 
-#: builtin/clone.c:94 builtin/clone.c:96 builtin/init-db.c:554
+#: builtin/clone.c:95 builtin/clone.c:97 builtin/init-db.c:555
 msgid "create a bare repository"
 msgstr "crear un repositorio vacío"
 
-#: builtin/clone.c:98
+#: builtin/clone.c:99
 msgid "create a mirror repository (implies bare)"
 msgstr "crear un repositorio espejo (implica vacío)"
 
-#: builtin/clone.c:100
+#: builtin/clone.c:101
 msgid "to clone from a local repository"
 msgstr "clonar de un repositorio local"
 
-#: builtin/clone.c:102
+#: builtin/clone.c:103
 msgid "don't use local hardlinks, always copy"
 msgstr "no usar hardlinks, siempre copiar"
 
-#: builtin/clone.c:104
+#: builtin/clone.c:105
 msgid "setup as shared repository"
 msgstr "configurar como repositorio compartido"
 
-#: builtin/clone.c:106
+#: builtin/clone.c:107
 msgid "pathspec"
 msgstr "pathspec"
 
-#: builtin/clone.c:106
+#: builtin/clone.c:107
 msgid "initialize submodules in the clone"
 msgstr "inicializar submódulos en el clonado"
 
-#: builtin/clone.c:110
+#: builtin/clone.c:111
 msgid "number of submodules cloned in parallel"
 msgstr "numero de submódulos clonados en paralelo"
 
-#: builtin/clone.c:111 builtin/init-db.c:551
+#: builtin/clone.c:112 builtin/init-db.c:552
 msgid "template-directory"
 msgstr "directorio-template"
 
-#: builtin/clone.c:112 builtin/init-db.c:552
+#: builtin/clone.c:113 builtin/init-db.c:553
 msgid "directory from which templates will be used"
 msgstr "directorio del cual los templates serán usados"
 
-#: builtin/clone.c:114 builtin/clone.c:116 builtin/submodule--helper.c:1407
-#: builtin/submodule--helper.c:1912
+#: builtin/clone.c:115 builtin/clone.c:117 builtin/submodule--helper.c:1831
+#: builtin/submodule--helper.c:2336
 msgid "reference repository"
 msgstr "repositorio de referencia"
 
-#: builtin/clone.c:118 builtin/submodule--helper.c:1409
-#: builtin/submodule--helper.c:1914
+#: builtin/clone.c:119 builtin/submodule--helper.c:1833
+#: builtin/submodule--helper.c:2338
 msgid "use --reference only while cloning"
 msgstr "usa--reference  solamente si estás clonado"
 
-#: builtin/clone.c:119 builtin/column.c:27 builtin/init-db.c:562
-#: builtin/merge-file.c:46 builtin/pack-objects.c:3514 builtin/repack.c:329
+#: builtin/clone.c:120 builtin/column.c:27 builtin/init-db.c:563
+#: builtin/merge-file.c:46 builtin/pack-objects.c:3561 builtin/repack.c:357
 msgid "name"
 msgstr "nombre"
 
-#: builtin/clone.c:120
+#: builtin/clone.c:121
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "use <nombre> en lugar de 'origin' para rastrear upstream"
 
-#: builtin/clone.c:122
+#: builtin/clone.c:123
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "checkout <rama> en lugar de HEAD remota"
 
-#: builtin/clone.c:124
+#: builtin/clone.c:125
 msgid "path to git-upload-pack on the remote"
 msgstr "ruta para git-upload-pack en el remoto"
 
-#: builtin/clone.c:125 builtin/fetch.c:169 builtin/grep.c:848
+#: builtin/clone.c:126 builtin/fetch.c:176 builtin/grep.c:861
 #: builtin/pull.c:208
 msgid "depth"
 msgstr "profundidad"
 
-#: builtin/clone.c:126
+#: builtin/clone.c:127
 msgid "create a shallow clone of that depth"
 msgstr "crear un clon superficial para esa profundidad"
 
-#: builtin/clone.c:127 builtin/fetch.c:171 builtin/pack-objects.c:3503
+#: builtin/clone.c:128 builtin/fetch.c:178 builtin/pack-objects.c:3550
 #: builtin/pull.c:211
 msgid "time"
 msgstr "tiempo"
 
-#: builtin/clone.c:128
+#: builtin/clone.c:129
 msgid "create a shallow clone since a specific time"
 msgstr "crear un clon superficial desde el tiempo específico"
 
-#: builtin/clone.c:129 builtin/fetch.c:173 builtin/fetch.c:196
-#: builtin/pull.c:214 builtin/pull.c:239 builtin/rebase.c:1304
+#: builtin/clone.c:130 builtin/fetch.c:180 builtin/fetch.c:203
+#: builtin/pull.c:214 builtin/pull.c:239 builtin/rebase.c:1323
 msgid "revision"
 msgstr "revision"
 
-#: builtin/clone.c:130 builtin/fetch.c:174 builtin/pull.c:215
+#: builtin/clone.c:131 builtin/fetch.c:181 builtin/pull.c:215
 msgid "deepen history of shallow clone, excluding rev"
 msgstr "ahondando historia de clon superficial, excluyendo rev"
 
-#: builtin/clone.c:132 builtin/submodule--helper.c:1419
-#: builtin/submodule--helper.c:1928
+#: builtin/clone.c:133 builtin/submodule--helper.c:1843
+#: builtin/submodule--helper.c:2352
 msgid "clone only one branch, HEAD or --branch"
 msgstr "clonar solo una rama,HEAD o --branch"
 
-#: builtin/clone.c:134
+#: builtin/clone.c:135
 msgid "don't clone any tags, and make later fetches not to follow them"
 msgstr "no clonar ningún tag, y hacer que los subsiguientes fetch no los sigan"
 
-#: builtin/clone.c:136
+#: builtin/clone.c:137
 msgid "any cloned submodules will be shallow"
 msgstr "cualquier submódulo clonado será superficial"
 
-#: builtin/clone.c:137 builtin/init-db.c:560
+#: builtin/clone.c:138 builtin/init-db.c:561
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:138 builtin/init-db.c:561
+#: builtin/clone.c:139 builtin/init-db.c:562
 msgid "separate git dir from working tree"
 msgstr "separa git dir del árbol de trabajo"
 
-#: builtin/clone.c:139
+#: builtin/clone.c:140
 msgid "key=value"
 msgstr "llave=valor"
 
-#: builtin/clone.c:140
+#: builtin/clone.c:141
 msgid "set config inside the new repository"
 msgstr "configurar config dentro del nuevo repositorio"
 
-#: builtin/clone.c:142 builtin/fetch.c:191 builtin/ls-remote.c:76
-#: builtin/pull.c:230 builtin/push.c:570 builtin/send-pack.c:171
+#: builtin/clone.c:143 builtin/fetch.c:198 builtin/ls-remote.c:77
+#: builtin/pull.c:230 builtin/push.c:584 builtin/send-pack.c:196
 msgid "server-specific"
 msgstr "especifico-de-servidor"
 
-#: builtin/clone.c:142 builtin/fetch.c:191 builtin/ls-remote.c:76
-#: builtin/pull.c:231 builtin/push.c:570 builtin/send-pack.c:172
+#: builtin/clone.c:143 builtin/fetch.c:198 builtin/ls-remote.c:77
+#: builtin/pull.c:231 builtin/push.c:584 builtin/send-pack.c:197
 msgid "option to transmit"
 msgstr "opción para trasmitir"
 
-#: builtin/clone.c:143 builtin/fetch.c:192 builtin/pull.c:234
-#: builtin/push.c:571
+#: builtin/clone.c:144 builtin/fetch.c:199 builtin/pull.c:234
+#: builtin/push.c:585
 msgid "use IPv4 addresses only"
 msgstr "solo usar direcciones IPv4"
 
-#: builtin/clone.c:145 builtin/fetch.c:194 builtin/pull.c:237
-#: builtin/push.c:573
+#: builtin/clone.c:146 builtin/fetch.c:201 builtin/pull.c:237
+#: builtin/push.c:587
 msgid "use IPv6 addresses only"
 msgstr "solo usar direcciones IPv6"
 
-#: builtin/clone.c:149
+#: builtin/clone.c:150
 msgid "any cloned submodules will use their remote-tracking branch"
 msgstr "cualquier submódulo clonado usará su branch de rastreo remoto"
 
-#: builtin/clone.c:151
+#: builtin/clone.c:152
 msgid "initialize sparse-checkout file to include only files at root"
 msgstr ""
 "inicializar archivo sparse-checkout para incluir solo archivos en la raíz"
 
-#: builtin/clone.c:287
+#: builtin/clone.c:288
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -12300,42 +12843,42 @@
 "No se pudo adivinar ningún nombre de directorio.\n"
 "Por favor especifique un directorio en la línea de comando"
 
-#: builtin/clone.c:340
+#: builtin/clone.c:341
 #, c-format
 msgid "info: Could not add alternate for '%s': %s\n"
 msgstr "info: No se pudo agregar un alterno para '%s': %s\n"
 
-#: builtin/clone.c:413
+#: builtin/clone.c:414
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existe pero no es un directorio"
 
-#: builtin/clone.c:431
+#: builtin/clone.c:432
 #, c-format
 msgid "failed to start iterator over '%s'"
 msgstr "falló al iniciar el iterador sobre '%s'"
 
-#: builtin/clone.c:462
+#: builtin/clone.c:463
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "falló al crear link '%s'"
 
-#: builtin/clone.c:466
+#: builtin/clone.c:467
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "falló al copiar archivo a '%s'"
 
-#: builtin/clone.c:471
+#: builtin/clone.c:472
 #, c-format
 msgid "failed to iterate over '%s'"
 msgstr "falló al iterar sobre '%s'"
 
-#: builtin/clone.c:498
+#: builtin/clone.c:499
 #, c-format
 msgid "done.\n"
 msgstr "hecho.\n"
 
-#: builtin/clone.c:512
+#: builtin/clone.c:513
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -12345,100 +12888,105 @@
 "Puedes inspeccionar a qué se hizo checkout con 'git status'\n"
 "y volver a intentarlo con 'git restore --source=HEAD :/'\n"
 
-#: builtin/clone.c:589
+#: builtin/clone.c:590
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "No se pudo encontrar la rama remota %s para clonar."
 
-#: builtin/clone.c:708
+#: builtin/clone.c:709
 #, c-format
 msgid "unable to update %s"
 msgstr "incapaz de actualizar %s"
 
-#: builtin/clone.c:756
+#: builtin/clone.c:757
 msgid "failed to initialize sparse-checkout"
 msgstr "falló al inicializar sparse-checkout"
 
-#: builtin/clone.c:779
+#: builtin/clone.c:780
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "remoto HEAD refiere a un ref inexistente, no se puede hacer checkout.\n"
 
-#: builtin/clone.c:811
+#: builtin/clone.c:812
 msgid "unable to checkout working tree"
 msgstr "no es posible realizar checkout en el árbol de trabajo"
 
-#: builtin/clone.c:868
+#: builtin/clone.c:887
 msgid "unable to write parameters to config file"
 msgstr "no es posible escribir parámetros al archivo config"
 
-#: builtin/clone.c:931
+#: builtin/clone.c:950
 msgid "cannot repack to clean up"
 msgstr "no se puede reempaquetar para limpiar"
 
-#: builtin/clone.c:933
+#: builtin/clone.c:952
 msgid "cannot unlink temporary alternates file"
 msgstr "no se puede desvincular archivos alternos temporales"
 
-#: builtin/clone.c:971 builtin/receive-pack.c:1982
+#: builtin/clone.c:993 builtin/receive-pack.c:2493
 msgid "Too many arguments."
 msgstr "Muchos argumentos."
 
-#: builtin/clone.c:975
+#: builtin/clone.c:997
 msgid "You must specify a repository to clone."
 msgstr "Tienes que especificar un repositorio para clonar."
 
-#: builtin/clone.c:988
+#: builtin/clone.c:1010
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "Las opciones --bare y --origin %s son incompatibles."
 
-#: builtin/clone.c:991
+#: builtin/clone.c:1013
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare y --separate-git-dir son incompatibles."
 
-#: builtin/clone.c:1007
+#: builtin/clone.c:1026
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "repositorio '%s' no existe"
 
-#: builtin/clone.c:1011 builtin/fetch.c:1794
+#: builtin/clone.c:1030 builtin/fetch.c:1951
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "profundidad %s no es un numero positivo"
 
-#: builtin/clone.c:1021
+#: builtin/clone.c:1040
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "la ruta de destino '%s' ya existe y no es un directorio vacío."
 
-#: builtin/clone.c:1033
+#: builtin/clone.c:1046
+#, c-format
+msgid "repository path '%s' already exists and is not an empty directory."
+msgstr "La ruta del repositorio '%s' ya existe y no es un directorio vacío."
+
+#: builtin/clone.c:1060
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "directorio de trabajo '%s' ya existe."
 
-#: builtin/clone.c:1048 builtin/clone.c:1069 builtin/difftool.c:271
-#: builtin/log.c:1886 builtin/worktree.c:354 builtin/worktree.c:386
+#: builtin/clone.c:1075 builtin/clone.c:1096 builtin/difftool.c:271
+#: builtin/log.c:1986 builtin/worktree.c:282 builtin/worktree.c:314
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "no se pudo crear directorios principales de '%s'"
 
-#: builtin/clone.c:1053
+#: builtin/clone.c:1080
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "no se pudo crear un árbol de trabajo '%s'"
 
-#: builtin/clone.c:1073
+#: builtin/clone.c:1100
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Clonando en un repositorio vacío '%s'...\n"
 
-#: builtin/clone.c:1075
+#: builtin/clone.c:1102
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Clonando en '%s'...\n"
 
-#: builtin/clone.c:1099
+#: builtin/clone.c:1126
 msgid ""
 "clone --recursive is not compatible with both --reference and --reference-if-"
 "able"
@@ -12446,36 +12994,41 @@
 "clone --recursive no es compatible con --reference y --reference-if-able al "
 "mismo tiempo"
 
-#: builtin/clone.c:1164
+#: builtin/clone.c:1170 builtin/remote.c:200 builtin/remote.c:705
+#, c-format
+msgid "'%s' is not a valid remote name"
+msgstr "'%s' no es un nombre remoto válido"
+
+#: builtin/clone.c:1211
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth es ignorada en clonaciones locales; usa file:// más bien."
 
-#: builtin/clone.c:1166
+#: builtin/clone.c:1213
 msgid "--shallow-since is ignored in local clones; use file:// instead."
 msgstr "--shallow-since es ignorado en el clon local; use file:// ."
 
-#: builtin/clone.c:1168
+#: builtin/clone.c:1215
 msgid "--shallow-exclude is ignored in local clones; use file:// instead."
 msgstr "--shallow-exclude es ignorado en clones locales; use file://."
 
-#: builtin/clone.c:1170
+#: builtin/clone.c:1217
 msgid "--filter is ignored in local clones; use file:// instead."
 msgstr "--filter es ignorado en clones locales; usa file:// en su lugar."
 
-#: builtin/clone.c:1173
+#: builtin/clone.c:1220
 msgid "source repository is shallow, ignoring --local"
 msgstr "repositorio fuente es superficial, ignorando --local"
 
-#: builtin/clone.c:1178
+#: builtin/clone.c:1225
 msgid "--local is ignored"
 msgstr "--local es ignorado"
 
-#: builtin/clone.c:1262 builtin/clone.c:1270
+#: builtin/clone.c:1315 builtin/clone.c:1323
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Rama remota %s no encontrada en upstream %s"
 
-#: builtin/clone.c:1273
+#: builtin/clone.c:1326
 msgid "You appear to have cloned an empty repository."
 msgstr "Pareces haber clonado un repositorio sin contenido."
 
@@ -12511,102 +13064,106 @@
 msgid "--command must be the first argument"
 msgstr "--command debe ser el primer argumento"
 
-#: builtin/commit-graph.c:13 builtin/commit-graph.c:21
+#: builtin/commit-graph.c:13 builtin/commit-graph.c:22
 msgid ""
 "git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]"
 msgstr ""
 "git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]"
 
-#: builtin/commit-graph.c:14 builtin/commit-graph.c:26
+#: builtin/commit-graph.c:14 builtin/commit-graph.c:27
 msgid ""
 "git commit-graph write [--object-dir <objdir>] [--append] [--"
 "split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-"
-"paths] [--[no-]progress] <split options>"
+"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <split options>"
 msgstr ""
-"git commit-graph write [--object-dir <objeto dir>] [--append] [--"
+"git commit-graph write [--object-dir <objdir>] [--append] [--"
 "split[=<estrategia>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-"
-"paths] [--[no-]progress] <opciones de split>"
+"paths] [--[no-]max-new-filters <n>] [--[no-]progress] <opciones de split>"
 
-#: builtin/commit-graph.c:62
+#: builtin/commit-graph.c:64
 #, c-format
 msgid "could not find object directory matching %s"
 msgstr "no se pudo entoncrar el objeto directorio concordante con %s"
 
-#: builtin/commit-graph.c:78 builtin/commit-graph.c:177
-#: builtin/commit-graph.c:276 builtin/fetch.c:180 builtin/log.c:1678
+#: builtin/commit-graph.c:80 builtin/commit-graph.c:210
+#: builtin/commit-graph.c:316 builtin/fetch.c:187 builtin/log.c:1768
 msgid "dir"
 msgstr "dir"
 
-#: builtin/commit-graph.c:79 builtin/commit-graph.c:178
-#: builtin/commit-graph.c:277
-msgid "The object directory to store the graph"
-msgstr "El directorio de objetos para guardar el gráfico"
+#: builtin/commit-graph.c:81 builtin/commit-graph.c:211
+#: builtin/commit-graph.c:317
+msgid "the object directory to store the graph"
+msgstr "el directorio de objetos para guardar el gráfico"
 
-#: builtin/commit-graph.c:81
+#: builtin/commit-graph.c:83
 msgid "if the commit-graph is split, only verify the tip file"
 msgstr "si el commit-graph está cortado, solo verifica la punta del archivo"
 
-#: builtin/commit-graph.c:104
+#: builtin/commit-graph.c:106
 #, c-format
 msgid "Could not open commit-graph '%s'"
 msgstr "No se pudo abrir commit-graph '%s'"
 
-#: builtin/commit-graph.c:138
+#: builtin/commit-graph.c:142
 #, c-format
 msgid "unrecognized --split argument, %s"
 msgstr "argumento --split no reconocido, %s"
 
-#: builtin/commit-graph.c:151
+#: builtin/commit-graph.c:155
 #, c-format
 msgid "unexpected non-hex object ID: %s"
 msgstr "ID de objeto no hex inesperado :%s"
 
-#: builtin/commit-graph.c:156
+#: builtin/commit-graph.c:160
 #, c-format
 msgid "invalid object: %s"
 msgstr "no es un objeto válido: %s"
 
-#: builtin/commit-graph.c:180
+#: builtin/commit-graph.c:213
 msgid "start walk at all refs"
 msgstr "comenzar caminata en todas las refs"
 
-#: builtin/commit-graph.c:182
+#: builtin/commit-graph.c:215
 msgid "scan pack-indexes listed by stdin for commits"
 msgstr "escanear paquete de índices por stdin por commits"
 
-#: builtin/commit-graph.c:184
+#: builtin/commit-graph.c:217
 msgid "start walk at commits listed by stdin"
 msgstr "comenzar a caminar a los commits listados por stdin"
 
-#: builtin/commit-graph.c:186
+#: builtin/commit-graph.c:219
 msgid "include all commits already in the commit-graph file"
 msgstr "inclye todos los commits que ya están en el archivo commit-graph"
 
-#: builtin/commit-graph.c:188
+#: builtin/commit-graph.c:221
 msgid "enable computation for changed paths"
 msgstr "habilitar computación para rutas cambiadas"
 
-#: builtin/commit-graph.c:191
+#: builtin/commit-graph.c:224
 msgid "allow writing an incremental commit-graph file"
 msgstr "permitir escribir un archivo commit-graph incremental"
 
-#: builtin/commit-graph.c:195
+#: builtin/commit-graph.c:228
 msgid "maximum number of commits in a non-base split commit-graph"
 msgstr "máximo número de commits en un commit-graph sin base cortada"
 
-#: builtin/commit-graph.c:197
+#: builtin/commit-graph.c:230
 msgid "maximum ratio between two levels of a split commit-graph"
 msgstr "radio máximo entre dos niveles de corte de commit-graph"
 
-#: builtin/commit-graph.c:199
+#: builtin/commit-graph.c:232
 msgid "only expire files older than a given date-time"
 msgstr "expirar objetos más viejos a una fecha dada"
 
-#: builtin/commit-graph.c:215
+#: builtin/commit-graph.c:234
+msgid "maximum number of changed-path Bloom filters to compute"
+msgstr "número máximo de cambios de ruta de filtro Bloom para computar"
+
+#: builtin/commit-graph.c:255
 msgid "use at most one of --reachable, --stdin-commits, or --stdin-packs"
 msgstr "use como máximo uno de --reachable, --stdin-commits, o --stdin-packs"
 
-#: builtin/commit-graph.c:245
+#: builtin/commit-graph.c:287
 msgid "Collecting commits from input"
 msgstr "Recolectando commits del input"
 
@@ -12623,7 +13180,7 @@
 msgid "duplicate parent %s ignored"
 msgstr "padre duplicado %s ignorado"
 
-#: builtin/commit-tree.c:56 builtin/commit-tree.c:136 builtin/log.c:547
+#: builtin/commit-tree.c:56 builtin/commit-tree.c:136 builtin/log.c:557
 #, c-format
 msgid "not a valid object name %s"
 msgstr "no es un nombre de objeto válido %s"
@@ -12651,13 +13208,13 @@
 msgid "id of a parent commit object"
 msgstr "id del objeto commit padre"
 
-#: builtin/commit-tree.c:114 builtin/commit.c:1506 builtin/merge.c:273
-#: builtin/notes.c:409 builtin/notes.c:575 builtin/stash.c:1474
-#: builtin/tag.c:413
+#: builtin/commit-tree.c:114 builtin/commit.c:1504 builtin/merge.c:282
+#: builtin/notes.c:409 builtin/notes.c:575 builtin/stash.c:1537
+#: builtin/tag.c:445
 msgid "message"
 msgstr "mensaje"
 
-#: builtin/commit-tree.c:115 builtin/commit.c:1506
+#: builtin/commit-tree.c:115 builtin/commit.c:1504
 msgid "commit message"
 msgstr "mensaje del commit"
 
@@ -12665,7 +13222,7 @@
 msgid "read commit log message from file"
 msgstr "leer mensaje de commit desde un archivo"
 
-#: builtin/commit-tree.c:121 builtin/commit.c:1518 builtin/merge.c:290
+#: builtin/commit-tree.c:121 builtin/commit.c:1516 builtin/merge.c:299
 #: builtin/pull.c:176 builtin/revert.c:118
 msgid "GPG sign commit"
 msgstr "Firmar commit con GPG"
@@ -12815,12 +13372,12 @@
 "no es posible seleccionar un carácter de comentario que no es usado\n"
 "en el mensaje de commit actual"
 
-#: builtin/commit.c:717 builtin/commit.c:750 builtin/commit.c:1099
+#: builtin/commit.c:717 builtin/commit.c:750 builtin/commit.c:1097
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "no se pudo revisar el commit %s"
 
-#: builtin/commit.c:729 builtin/shortlog.c:319
+#: builtin/commit.c:729 builtin/shortlog.c:413
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(leyendo mensajes de logs desde standard input)\n"
@@ -12846,37 +13403,35 @@
 msgid "could not write commit template"
 msgstr "no se pudo escribir el template del commit"
 
-#: builtin/commit.c:852
-#, c-format
+#: builtin/commit.c:853
 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"
+"If this is not correct, please run\n"
+"\tgit update-ref -d MERGE_HEAD\n"
 "and try again.\n"
 msgstr ""
 "\n"
-"Parece que estás haciendo un commit con una fusión dentro.\n"
-"Si esto no es correcto, por favor elimina el archivo\n"
-"\t%s\n"
-"y vuelve a intentar.\n"
+"Parece que está realizando una fusión.\n"
+"Si esto no es correcto, ejecute\n"
+"\tgit update-ref -d MERGE_HEAD\n"
+"e intenta de nuevo.\n"
 
-#: builtin/commit.c:857
-#, c-format
+#: builtin/commit.c:858
 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"
+"If this is not correct, please run\n"
+"\tgit update-ref -d CHERRY_PICK_HEAD\n"
 "and try again.\n"
 msgstr ""
 "\n"
-"Parece que puedes estar haciendo un commit a un cherry-pick.\n"
-"Si esto no es correcto, por favor elimina el archivo\n"
-"\t%s\n"
-"y vuelve a intentar.\n"
+"Parece que puede estar cometiendo una selección de cerebros.\n"
+"Si esto no es correcto, ejecute\n"
+"\tgit update-ref -d CHERRY_PICK_HEAD\n"
+"e intenta de nuevo.\n"
 
-#: builtin/commit.c:870
+#: builtin/commit.c:868
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -12886,7 +13441,7 @@
 " líneas que comiencen con '%c' serán ignoradas, y un mensaje\n"
 " vacío aborta el commit.\n"
 
-#: builtin/commit.c:878
+#: builtin/commit.c:876
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -12898,147 +13453,147 @@
 " usted mismo si lo desea.\n"
 "Un mensaje vacío aborta el commit.\n"
 
-#: builtin/commit.c:895
+#: builtin/commit.c:893
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAutor:     %.*s <%.*s>"
 
-#: builtin/commit.c:903
+#: builtin/commit.c:901
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sFecha:     %s"
 
-#: builtin/commit.c:910
+#: builtin/commit.c:908
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sCommitter: %.*s <%.*s>"
 
-#: builtin/commit.c:928
+#: builtin/commit.c:926
 msgid "Cannot read index"
 msgstr "No se puede leer el índice"
 
-#: builtin/commit.c:999
+#: builtin/commit.c:997
 msgid "Error building trees"
 msgstr "Error al construir los árboles"
 
-#: builtin/commit.c:1013 builtin/tag.c:276
+#: builtin/commit.c:1011 builtin/tag.c:308
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Por favor suministra el mensaje usando las opciones -m o -F.\n"
 
-#: builtin/commit.c:1057
+#: builtin/commit.c:1055
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' no está en el formato 'Name <email>' y no concuerda con ningún "
 "autor existente"
 
-#: builtin/commit.c:1071
+#: builtin/commit.c:1069
 #, c-format
 msgid "Invalid ignored mode '%s'"
 msgstr "Modo ignorado inválido '%s'"
 
-#: builtin/commit.c:1089 builtin/commit.c:1333
+#: builtin/commit.c:1087 builtin/commit.c:1331
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Modo inválido de los archivos no rastreados '%s'"
 
-#: builtin/commit.c:1129
+#: builtin/commit.c:1127
 msgid "--long and -z are incompatible"
 msgstr "--long y -z son incompatibles"
 
-#: builtin/commit.c:1173
+#: builtin/commit.c:1171
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Usar ambos --reset-author y --author no tiene sentido"
 
-#: builtin/commit.c:1182
+#: builtin/commit.c:1180
 msgid "You have nothing to amend."
 msgstr "No tienes nada que enmendar."
 
-#: builtin/commit.c:1185
+#: builtin/commit.c:1183
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Estás en medio de una fusión -- no puedes enmendar."
 
-#: builtin/commit.c:1187
+#: builtin/commit.c:1185
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "Está en medio de un cherry-pick -- no se puede enmendar."
 
-#: builtin/commit.c:1189
+#: builtin/commit.c:1187
 msgid "You are in the middle of a rebase -- cannot amend."
 msgstr "Estás en medio de una fusión -- no puedes enmendar."
 
-#: builtin/commit.c:1192
+#: builtin/commit.c:1190
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Opciones --squash y --fixup no pueden ser usadas juntas"
 
-#: builtin/commit.c:1202
+#: builtin/commit.c:1200
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Solo uno de -c/-C/-F/--fixup puede ser usado."
 
-#: builtin/commit.c:1204
+#: builtin/commit.c:1202
 msgid "Option -m cannot be combined with -c/-C/-F."
 msgstr "La opción -m no puede ser combinada con -c/-C/-F."
 
-#: builtin/commit.c:1213
+#: builtin/commit.c:1211
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author sólo puede ser usada con -C, -c o --amend."
 
-#: builtin/commit.c:1231
+#: builtin/commit.c:1229
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Solo uno de --include/--only/--all/--interactive/--patch puede ser usado."
 
-#: builtin/commit.c:1237
+#: builtin/commit.c:1235
 #, c-format
 msgid "paths '%s ...' with -a does not make sense"
 msgstr "paths '%s ...' con -a no tiene sentido"
 
-#: builtin/commit.c:1368 builtin/commit.c:1529
+#: builtin/commit.c:1366 builtin/commit.c:1527
 msgid "show status concisely"
 msgstr "mostrar status de manera concisa"
 
-#: builtin/commit.c:1370 builtin/commit.c:1531
+#: builtin/commit.c:1368 builtin/commit.c:1529
 msgid "show branch information"
 msgstr "mostrar información de la rama"
 
-#: builtin/commit.c:1372
+#: builtin/commit.c:1370
 msgid "show stash information"
 msgstr "mostrar información del stash"
 
-#: builtin/commit.c:1374 builtin/commit.c:1533
+#: builtin/commit.c:1372 builtin/commit.c:1531
 msgid "compute full ahead/behind values"
 msgstr "calcular todos los valores delante/atrás"
 
-#: builtin/commit.c:1376
+#: builtin/commit.c:1374
 msgid "version"
 msgstr "version"
 
-#: builtin/commit.c:1376 builtin/commit.c:1535 builtin/push.c:549
-#: builtin/worktree.c:722
+#: builtin/commit.c:1374 builtin/commit.c:1533 builtin/push.c:560
+#: builtin/worktree.c:679
 msgid "machine-readable output"
 msgstr "output formato-maquina"
 
-#: builtin/commit.c:1379 builtin/commit.c:1537
+#: builtin/commit.c:1377 builtin/commit.c:1535
 msgid "show status in long format (default)"
 msgstr "mostrar status en formato largo (default)"
 
-#: builtin/commit.c:1382 builtin/commit.c:1540
+#: builtin/commit.c:1380 builtin/commit.c:1538
 msgid "terminate entries with NUL"
 msgstr "terminar entradas con NUL"
 
-#: builtin/commit.c:1384 builtin/commit.c:1388 builtin/commit.c:1543
-#: builtin/fast-export.c:1199 builtin/fast-export.c:1202
-#: builtin/fast-export.c:1205 builtin/rebase.c:1392 parse-options.h:336
+#: builtin/commit.c:1382 builtin/commit.c:1386 builtin/commit.c:1541
+#: builtin/fast-export.c:1198 builtin/fast-export.c:1201
+#: builtin/fast-export.c:1204 builtin/rebase.c:1412 parse-options.h:336
 msgid "mode"
 msgstr "modo"
 
-#: builtin/commit.c:1385 builtin/commit.c:1543
+#: builtin/commit.c:1383 builtin/commit.c:1541
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "mostrar archivos sin seguimiento, modos opcionales: all, normal, no. "
 "(Predeterminado: all)"
 
-#: builtin/commit.c:1389
+#: builtin/commit.c:1387
 msgid ""
 "show ignored files, optional modes: traditional, matching, no. (Default: "
 "traditional)"
@@ -13046,11 +13601,11 @@
 "mostrar archivos ignorados, modos opcionales: traditional, matching, no. "
 "(Predeterminado: traditional)"
 
-#: builtin/commit.c:1391 parse-options.h:192
+#: builtin/commit.c:1389 parse-options.h:192
 msgid "when"
 msgstr "cuando"
 
-#: builtin/commit.c:1392
+#: builtin/commit.c:1390
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -13058,173 +13613,173 @@
 "ignorar cambios en submódulos, opcional cuando: all,dirty,untracked. "
 "(Default: all)"
 
-#: builtin/commit.c:1394
+#: builtin/commit.c:1392
 msgid "list untracked files in columns"
 msgstr "listar en columnas los archivos sin seguimiento"
 
-#: builtin/commit.c:1395
+#: builtin/commit.c:1393
 msgid "do not detect renames"
 msgstr "no detectar renombrados"
 
-#: builtin/commit.c:1397
+#: builtin/commit.c:1395
 msgid "detect renames, optionally set similarity index"
 msgstr "detectar renombres, opcionalmente configurar similaridad de índice"
 
-#: builtin/commit.c:1417
+#: builtin/commit.c:1415
 msgid "Unsupported combination of ignored and untracked-files arguments"
 msgstr ""
 "Combinación de argumentos de archivos ignorados y no rastreados no soportada"
 
-#: builtin/commit.c:1499
+#: builtin/commit.c:1497
 msgid "suppress summary after successful commit"
 msgstr "suprime summary tras un commit exitoso"
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1498
 msgid "show diff in commit message template"
 msgstr "mostrar diff en el template del mensaje de commit"
 
-#: builtin/commit.c:1502
+#: builtin/commit.c:1500
 msgid "Commit message options"
 msgstr "Opciones para el mensaje del commit"
 
-#: builtin/commit.c:1503 builtin/merge.c:277 builtin/tag.c:415
+#: builtin/commit.c:1501 builtin/merge.c:286 builtin/tag.c:447
 msgid "read message from file"
 msgstr "leer mensaje desde un archivo"
 
-#: builtin/commit.c:1504
+#: builtin/commit.c:1502
 msgid "author"
 msgstr "autor"
 
-#: builtin/commit.c:1504
+#: builtin/commit.c:1502
 msgid "override author for commit"
 msgstr "sobrescribe el autor del commit"
 
-#: builtin/commit.c:1505 builtin/gc.c:538
+#: builtin/commit.c:1503 builtin/gc.c:550
 msgid "date"
 msgstr "fecha"
 
-#: builtin/commit.c:1505
+#: builtin/commit.c:1503
 msgid "override date for commit"
 msgstr "sobrescribe la fecha del commit"
 
-#: builtin/commit.c:1507 builtin/commit.c:1508 builtin/commit.c:1509
-#: builtin/commit.c:1510 parse-options.h:328 ref-filter.h:92
+#: builtin/commit.c:1505 builtin/commit.c:1506 builtin/commit.c:1507
+#: builtin/commit.c:1508 parse-options.h:328 ref-filter.h:90
 msgid "commit"
 msgstr "confirmar"
 
-#: builtin/commit.c:1507
+#: builtin/commit.c:1505
 msgid "reuse and edit message from specified commit"
 msgstr "reusar y editar el mensaje de un commit especifico"
 
-#: builtin/commit.c:1508
+#: builtin/commit.c:1506
 msgid "reuse message from specified commit"
 msgstr "reusar el mensaje de un commit especifico"
 
-#: builtin/commit.c:1509
+#: builtin/commit.c:1507
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "usar mensaje de formato autosquash para arreglar el commit especificado"
 
-#: builtin/commit.c:1510
+#: builtin/commit.c:1508
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "usar el mensaje de formato autosquash para realizar squash  al commit "
 "especificado"
 
-#: builtin/commit.c:1511
+#: builtin/commit.c:1509
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "el autor del commit soy yo ahora (usado con -C/-c/--amend)"
 
-#: builtin/commit.c:1512 builtin/log.c:1655 builtin/merge.c:293
+#: builtin/commit.c:1510 builtin/log.c:1743 builtin/merge.c:302
 #: builtin/pull.c:145 builtin/revert.c:110
-msgid "add Signed-off-by:"
-msgstr "agregar Signed-off-by: (firmado por)"
+msgid "add a Signed-off-by trailer"
+msgstr "agregar un firmado por al final"
 
-#: builtin/commit.c:1513
+#: builtin/commit.c:1511
 msgid "use specified template file"
 msgstr "usar archivo de template especificado"
 
-#: builtin/commit.c:1514
+#: builtin/commit.c:1512
 msgid "force edit of commit"
 msgstr "forzar la edición del commit"
 
-#: builtin/commit.c:1516
+#: builtin/commit.c:1514
 msgid "include status in commit message template"
 msgstr "incluir status en el template del mensaje de commit"
 
-#: builtin/commit.c:1521
+#: builtin/commit.c:1519
 msgid "Commit contents options"
 msgstr "Opciones para el contenido del commit"
 
-#: builtin/commit.c:1522
+#: builtin/commit.c:1520
 msgid "commit all changed files"
 msgstr "confirmar todos los archivos cambiados"
 
-#: builtin/commit.c:1523
+#: builtin/commit.c:1521
 msgid "add specified files to index for commit"
 msgstr "agregar archivos específicos al índice para confirmar"
 
-#: builtin/commit.c:1524
+#: builtin/commit.c:1522
 msgid "interactively add files"
 msgstr "agregar archivos interactivamente"
 
-#: builtin/commit.c:1525
+#: builtin/commit.c:1523
 msgid "interactively add changes"
 msgstr "agregar cambios interactivamente"
 
-#: builtin/commit.c:1526
+#: builtin/commit.c:1524
 msgid "commit only specified files"
 msgstr "sólo confirmar archivos específicos"
 
-#: builtin/commit.c:1527
+#: builtin/commit.c:1525
 msgid "bypass pre-commit and commit-msg hooks"
 msgstr "evitar los capturadores (hooks) de pre-commit y commit-msg"
 
-#: builtin/commit.c:1528
+#: builtin/commit.c:1526
 msgid "show what would be committed"
 msgstr "mostrar lo que sería incluido en el commit"
 
-#: builtin/commit.c:1541
+#: builtin/commit.c:1539
 msgid "amend previous commit"
 msgstr "enmendar commit previo"
 
-#: builtin/commit.c:1542
+#: builtin/commit.c:1540
 msgid "bypass post-rewrite hook"
 msgstr "gancho bypass post reescritura"
 
-#: builtin/commit.c:1549
+#: builtin/commit.c:1547
 msgid "ok to record an empty change"
 msgstr "ok al grabar un cambio vacío"
 
-#: builtin/commit.c:1551
+#: builtin/commit.c:1549
 msgid "ok to record a change with an empty message"
 msgstr "ok al grabar un cambio con un mensaje vacío"
 
-#: builtin/commit.c:1624
+#: builtin/commit.c:1622
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Archivo MERGE_HEAD (%s) corrupto"
 
-#: builtin/commit.c:1631
+#: builtin/commit.c:1629
 msgid "could not read MERGE_MODE"
 msgstr "no se pudo leer MERGE_MODE"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1650
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "no se pudo leer el mensaje de commit: %s"
 
-#: builtin/commit.c:1659
+#: builtin/commit.c:1657
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Abortando commit debido que el mensaje está en blanco.\n"
 
-#: builtin/commit.c:1664
+#: builtin/commit.c:1662
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Abortando commit; no se ha editado el mensaje\n"
 
-#: builtin/commit.c:1698
+#: builtin/commit.c:1696
 msgid ""
 "repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -13238,212 +13793,220 @@
 msgid "git config [<options>]"
 msgstr "git config [<opciones>]"
 
-#: builtin/config.c:104 builtin/env--helper.c:23
+#: builtin/config.c:109 builtin/env--helper.c:27
 #, c-format
 msgid "unrecognized --type argument, %s"
 msgstr "argumento --type no reconocido, %s"
 
-#: builtin/config.c:116
+#: builtin/config.c:121
 msgid "only one type at a time"
 msgstr "solo un tipo a la vez"
 
-#: builtin/config.c:125
+#: builtin/config.c:130
 msgid "Config file location"
 msgstr "Ubicación del archivo configuración"
 
-#: builtin/config.c:126
+#: builtin/config.c:131
 msgid "use global config file"
 msgstr "usar archivo de config global"
 
-#: builtin/config.c:127
+#: builtin/config.c:132
 msgid "use system config file"
 msgstr "usar archivo de config del sistema"
 
-#: builtin/config.c:128
+#: builtin/config.c:133
 msgid "use repository config file"
 msgstr "usar archivo de config del repositorio"
 
-#: builtin/config.c:129
+#: builtin/config.c:134
 msgid "use per-worktree config file"
 msgstr "usar un archivo de config por árbol de trabajo"
 
-#: builtin/config.c:130
+#: builtin/config.c:135
 msgid "use given config file"
 msgstr "usar archivo config especificado"
 
-#: builtin/config.c:131
+#: builtin/config.c:136
 msgid "blob-id"
 msgstr "blob-id"
 
-#: builtin/config.c:131
+#: builtin/config.c:136
 msgid "read config from given blob object"
 msgstr "leer config del objeto blob suministrado"
 
-#: builtin/config.c:132
+#: builtin/config.c:137
 msgid "Action"
 msgstr "Acción"
 
-#: builtin/config.c:133
-msgid "get value: name [value-regex]"
-msgstr "obtener valor: nombre [valor-regex]"
+#: builtin/config.c:138
+msgid "get value: name [value-pattern]"
+msgstr "obtener valor: nombre [patrón de valor]"
 
-#: builtin/config.c:134
-msgid "get all values: key [value-regex]"
-msgstr "obtener todos los valores: llave [valores-regex]"
+#: builtin/config.c:139
+msgid "get all values: key [value-pattern]"
+msgstr "obtener todos los valores: clave [patrón de valor]"
 
-#: builtin/config.c:135
-msgid "get values for regexp: name-regex [value-regex]"
-msgstr "obtener valores para una regexp: nombre-regex [valor-regex]"
+#: builtin/config.c:140
+msgid "get values for regexp: name-regex [value-pattern]"
+msgstr "obtener valores para regexp: name-regex [value-pattern]"
 
-#: builtin/config.c:136
+#: builtin/config.c:141
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "obtener valor especifico para el URL: sección[.var] URL"
 
-#: builtin/config.c:137
-msgid "replace all matching variables: name value [value_regex]"
+#: builtin/config.c:142
+msgid "replace all matching variables: name value [value-pattern]"
 msgstr ""
-"remplazar todas las variables que concuerden: nombre valor [valor_regex]"
+"reemplazar todas las variables coincidentes: nombre valor [valor-patrón]"
 
-#: builtin/config.c:138
+#: builtin/config.c:143
 msgid "add a new variable: name value"
 msgstr "agregar nueva variable: nombre valor"
 
-#: builtin/config.c:139
-msgid "remove a variable: name [value-regex]"
-msgstr "borrar una variable. nombre [valor-regex]"
+#: builtin/config.c:144
+msgid "remove a variable: name [value-pattern]"
+msgstr "eliminar una variable: nombre [patrón de valor]"
 
-#: builtin/config.c:140
-msgid "remove all matches: name [value-regex]"
-msgstr "borrar todas las concurrencias: nombre [valor-regex]"
+#: builtin/config.c:145
+msgid "remove all matches: name [value-pattern]"
+msgstr "eliminar todas las coincidencias: nombre [patrón de valor]"
 
-#: builtin/config.c:141
+#: builtin/config.c:146
 msgid "rename section: old-name new-name"
 msgstr "renombrar sección: nombre-viejo nombre-nuevo"
 
-#: builtin/config.c:142
+#: builtin/config.c:147
 msgid "remove a section: name"
 msgstr "borrar una sección: nombre"
 
-#: builtin/config.c:143
+#: builtin/config.c:148
 msgid "list all"
 msgstr "listar todo"
 
-#: builtin/config.c:144
+#: builtin/config.c:149
+msgid "use string equality when comparing values to 'value-pattern'"
+msgstr "use la igualdad de cadenas al comparar valores con 'patrón de valor'"
+
+#: builtin/config.c:150
 msgid "open an editor"
 msgstr "abrir el editor"
 
-#: builtin/config.c:145
+#: builtin/config.c:151
 msgid "find the color configured: slot [default]"
 msgstr "encontrar el color configurado: slot [default]"
 
-#: builtin/config.c:146
+#: builtin/config.c:152
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "encontrar las opciones del color: slot [stdout-es-tty]"
 
-#: builtin/config.c:147
+#: builtin/config.c:153
 msgid "Type"
 msgstr "Tipo"
 
-#: builtin/config.c:148 builtin/env--helper.c:38
+#: builtin/config.c:154 builtin/env--helper.c:43
 msgid "value is given this type"
 msgstr "al valor se ha dado este tipo"
 
-#: builtin/config.c:149
+#: builtin/config.c:155
 msgid "value is \"true\" or \"false\""
 msgstr "valor es \"true\" o \"false\""
 
-#: builtin/config.c:150
+#: builtin/config.c:156
 msgid "value is decimal number"
 msgstr "valor es un numero decimal"
 
-#: builtin/config.c:151
+#: builtin/config.c:157
 msgid "value is --bool or --int"
 msgstr "valor es --bool o --int"
 
-#: builtin/config.c:152
+#: builtin/config.c:158
+msgid "value is --bool or string"
+msgstr "el valor es --bool o cadena"
+
+#: builtin/config.c:159
 msgid "value is a path (file or directory name)"
 msgstr "valor es una ruta (archivo o nombre de directorio)"
 
-#: builtin/config.c:153
+#: builtin/config.c:160
 msgid "value is an expiry date"
 msgstr "valor es una fecha de expiración"
 
-#: builtin/config.c:154
+#: builtin/config.c:161
 msgid "Other"
 msgstr "Otro"
 
-#: builtin/config.c:155
+#: builtin/config.c:162
 msgid "terminate values with NUL byte"
 msgstr "terminar valores con un byte NULL"
 
-#: builtin/config.c:156
+#: builtin/config.c:163
 msgid "show variable names only"
 msgstr "mostrar solo nombres de variables"
 
-#: builtin/config.c:157
+#: builtin/config.c:164
 msgid "respect include directives on lookup"
 msgstr "respetar directivas include en la búsqueda"
 
-#: builtin/config.c:158
+#: builtin/config.c:165
 msgid "show origin of config (file, standard input, blob, command line)"
 msgstr "mostrar el origen de configuración (archivo, stdin, blob, comando)"
 
-#: builtin/config.c:159
+#: builtin/config.c:166
 msgid "show scope of config (worktree, local, global, system, command)"
 msgstr ""
 "mostrar el scope de la configuración (worktree, local, global, system, "
 "command)"
 
-#: builtin/config.c:160 builtin/env--helper.c:40
+#: builtin/config.c:167 builtin/env--helper.c:45
 msgid "value"
 msgstr "valor"
 
-#: builtin/config.c:160
+#: builtin/config.c:167
 msgid "with --get, use default value when missing entry"
 msgstr "con --get, usa el valor por defecto cuando falta una entrada"
 
-#: builtin/config.c:174
+#: builtin/config.c:181
 #, c-format
 msgid "wrong number of arguments, should be %d"
 msgstr "número de argumentos inválidos, deberían ser %d"
 
-#: builtin/config.c:176
+#: builtin/config.c:183
 #, c-format
 msgid "wrong number of arguments, should be from %d to %d"
 msgstr "número de argumentos inválidos, deberían ser de %d a %d"
 
-#: builtin/config.c:324
+#: builtin/config.c:339
 #, c-format
 msgid "invalid key pattern: %s"
 msgstr "patrón de llave inválido: %s"
 
-#: builtin/config.c:360
+#: builtin/config.c:377
 #, c-format
 msgid "failed to format default config value: %s"
 msgstr "falló al formatear el valor por defecto de configuración: %s"
 
-#: builtin/config.c:417
+#: builtin/config.c:441
 #, c-format
 msgid "cannot parse color '%s'"
 msgstr "no se analizar color '%s'"
 
-#: builtin/config.c:459
+#: builtin/config.c:483
 msgid "unable to parse default color value"
 msgstr "no es posible analizar el valor por defecto de color"
 
-#: builtin/config.c:512 builtin/config.c:768
+#: builtin/config.c:536 builtin/config.c:833
 msgid "not in a git directory"
 msgstr "no en un directorio git"
 
-#: builtin/config.c:515
+#: builtin/config.c:539
 msgid "writing to stdin is not supported"
 msgstr "escribir en stdin no está soportado"
 
-#: builtin/config.c:518
+#: builtin/config.c:542
 msgid "writing config blobs is not supported"
 msgstr "escribir blobs de configuración no está soportado"
 
-#: builtin/config.c:603
+#: builtin/config.c:627
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -13458,23 +14021,27 @@
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:627
+#: builtin/config.c:652
 msgid "only one config file at a time"
 msgstr "solo un archivo de configuración a la vez"
 
-#: builtin/config.c:632
+#: builtin/config.c:658
 msgid "--local can only be used inside a git repository"
 msgstr "--local solo puedo ser usado dentro de un repositorio"
 
-#: builtin/config.c:635
+#: builtin/config.c:660
 msgid "--blob can only be used inside a git repository"
 msgstr "--blob solo puede ser usado dentro de un repositorio"
 
-#: builtin/config.c:655
+#: builtin/config.c:662
+msgid "--worktree can only be used inside a git repository"
+msgstr "--worktree solo se puede usar dentro de un repositorio de git"
+
+#: builtin/config.c:684
 msgid "$HOME not set"
 msgstr "$HOME no está configurado"
 
-#: builtin/config.c:679
+#: builtin/config.c:708
 msgid ""
 "--worktree cannot be used with multiple working trees unless the config\n"
 "extension worktreeConfig is enabled. Please read \"CONFIGURATION FILE\"\n"
@@ -13486,52 +14053,56 @@
 "\"\n"
 "en \"git help worktree\" para más detalles"
 
-#: builtin/config.c:714
+#: builtin/config.c:743
 msgid "--get-color and variable type are incoherent"
 msgstr "--get-color y tipo de variable incoherente"
 
-#: builtin/config.c:719
+#: builtin/config.c:748
 msgid "only one action at a time"
 msgstr "solo una acción a la vez"
 
-#: builtin/config.c:732
+#: builtin/config.c:761
 msgid "--name-only is only applicable to --list or --get-regexp"
 msgstr "--name-only solo es aplicable para --list o --get-regexp"
 
-#: builtin/config.c:738
+#: builtin/config.c:767
 msgid ""
 "--show-origin is only applicable to --get, --get-all, --get-regexp, and --"
 "list"
 msgstr ""
 "--show-origin solo es aplicable para --get, --get-all, --get-regexp, y --list"
 
-#: builtin/config.c:744
+#: builtin/config.c:773
 msgid "--default is only applicable to --get"
 msgstr "--default solo es aplicable para --get"
 
-#: builtin/config.c:757
+#: builtin/config.c:806
+msgid "--fixed-value only applies with 'value-pattern'"
+msgstr "--fixed-value solo se aplica con 'value-pattern'"
+
+#: builtin/config.c:822
 #, c-format
 msgid "unable to read config file '%s'"
 msgstr "no se puede leer el archivo de configuración '%s'"
 
-#: builtin/config.c:760
+#: builtin/config.c:825
 msgid "error processing config file(s)"
 msgstr "error al procesar archivo(s) de configuración"
 
-#: builtin/config.c:770
+#: builtin/config.c:835
 msgid "editing stdin is not supported"
 msgstr "editar stdin no está soportado"
 
-#: builtin/config.c:772
+#: builtin/config.c:837
 msgid "editing blobs is not supported"
 msgstr "editar blobs no está soportado"
 
-#: builtin/config.c:786
+#: builtin/config.c:851
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "no se puede crear el archivo de configuración %s"
 
-#: builtin/config.c:799
+#: builtin/config.c:864
 #, c-format
 msgid ""
 "cannot overwrite multiple values with a single value\n"
@@ -13540,7 +14111,7 @@
 "no se puede sobrescribir múltiples valores con un único valor\n"
 "\tUse una regexp, --add o --replace-all para cambiar %s."
 
-#: builtin/config.c:873 builtin/config.c:884
+#: builtin/config.c:943 builtin/config.c:954
 #, c-format
 msgid "no such section: %s"
 msgstr "no existe la sección: %s"
@@ -13553,6 +14124,38 @@
 msgid "print sizes in human readable format"
 msgstr "mostrar tamaños en formato legible para humano"
 
+#: builtin/credential-cache--daemon.c:226
+#, 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 ""
+"Los permisos en tu directorio de socket son demasiado flojos; otros\n"
+"usuarios pueden leer sus credenciales almacenadas en caché. Considera "
+"ejecutar:\n"
+"\n"
+"\tchmod 0700 %s"
+
+#: builtin/credential-cache--daemon.c:275
+msgid "print debugging messages to stderr"
+msgstr "mostrar mensajes de debug en stderr"
+
+#: builtin/credential-cache--daemon.c:315
+msgid "credential-cache--daemon unavailable; no unix socket support"
+msgstr "credential-cache--daemon no disponible; sin soporte de socket Unix"
+
+#: builtin/credential-cache.c:154
+msgid "credential-cache unavailable; no unix socket support"
+msgstr "credential-cache no disponible; sin soporte de socket Unix"
+
+#: builtin/credential-store.c:66
+#, c-format
+msgid "unable to get credential storage lock in %d ms"
+msgstr ""
+"no se puede obtener el bloqueo de almacenamiento de credenciales en %d ms"
+
 #: builtin/describe.c:26
 msgid "git describe [<options>] [<commit-ish>...]"
 msgstr "git describe [<opciones>] [<commit-ish>...]"
@@ -13717,41 +14320,49 @@
 msgid "--broken is incompatible with commit-ishes"
 msgstr "--broken es incompatible con commit-ismos"
 
-#: builtin/diff.c:91
+#: builtin/diff-tree.c:155
+msgid "--stdin and --merge-base are mutually exclusive"
+msgstr "--stdin and --merge-baseson mutuamente exclusivas"
+
+#: builtin/diff-tree.c:157
+msgid "--merge-base only works with two commits"
+msgstr "--merge-base solo funciona con dos commits"
+
+#: builtin/diff.c:92
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s': no es un archivo regular o un enlace simbólico"
 
-#: builtin/diff.c:242
+#: builtin/diff.c:259
 #, c-format
 msgid "invalid option: %s"
 msgstr "opción inválida: %s"
 
-#: builtin/diff.c:359
+#: builtin/diff.c:376
 #, c-format
 msgid "%s...%s: no merge base"
 msgstr "%s...%s: se neceista una base de fusión"
 
-#: builtin/diff.c:469
+#: builtin/diff.c:486
 msgid "Not a git repository"
 msgstr "No es un repositorio git"
 
-#: builtin/diff.c:514
+#: builtin/diff.c:532 builtin/grep.c:682
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "objeto '%s' entregado no es válido."
 
-#: builtin/diff.c:525
+#: builtin/diff.c:543
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "más de dos blobs entregados: '%s'"
 
-#: builtin/diff.c:530
+#: builtin/diff.c:548
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "objeto no manejado '%s' entregado."
 
-#: builtin/diff.c:564
+#: builtin/diff.c:582
 #, c-format
 msgid "%s...%s: multiple merge bases, using %s"
 msgstr "%s...%s: múltiples bases de fusión, usando %s"
@@ -13780,7 +14391,7 @@
 msgid "could not read object %s for symlink %s"
 msgstr "no se pudo leer el objeto %s para el symlink %s"
 
-#: builtin/difftool.c:413
+#: builtin/difftool.c:412
 msgid ""
 "combined diff formats('-c' and '--cc') are not supported in\n"
 "directory diff mode('-d' and '--dir-diff')."
@@ -13788,54 +14399,54 @@
 "formatos combinados de diff ('-c' y '--cc') no soportados en\n"
 "modo diff para directorio('-d' y '--dir-diff')."
 
-#: builtin/difftool.c:634
+#: builtin/difftool.c:633
 #, c-format
 msgid "both files modified: '%s' and '%s'."
 msgstr "ambos archivos modificados: '%s' y '%s'."
 
-#: builtin/difftool.c:636
+#: builtin/difftool.c:635
 msgid "working tree file has been left."
 msgstr "archivo del árbol de trabajo ha sido dejado."
 
-#: builtin/difftool.c:647
+#: builtin/difftool.c:646
 #, c-format
 msgid "temporary files exist in '%s'."
 msgstr "archivo temporal existe en '%s'."
 
-#: builtin/difftool.c:648
+#: builtin/difftool.c:647
 msgid "you may want to cleanup or recover these."
 msgstr "tal vez desees limpiar o recuperar estos."
 
-#: builtin/difftool.c:697
+#: builtin/difftool.c:696
 msgid "use `diff.guitool` instead of `diff.tool`"
 msgstr "use `diff.guitool` en lugar de `diff.tool`"
 
-#: builtin/difftool.c:699
+#: builtin/difftool.c:698
 msgid "perform a full-directory diff"
 msgstr "realizar un diff de todo el directorio"
 
-#: builtin/difftool.c:701
+#: builtin/difftool.c:700
 msgid "do not prompt before launching a diff tool"
 msgstr "no mostrar antes de lanzar una herramienta de diff"
 
-#: builtin/difftool.c:706
+#: builtin/difftool.c:705
 msgid "use symlinks in dir-diff mode"
 msgstr "usar enlaces simbólicos en modo dir-diff"
 
-#: builtin/difftool.c:707
+#: builtin/difftool.c:706
 msgid "tool"
 msgstr "herramienta"
 
-#: builtin/difftool.c:708
+#: builtin/difftool.c:707
 msgid "use the specified diff tool"
 msgstr "usar la herramienta de diff especificada"
 
-#: builtin/difftool.c:710
+#: builtin/difftool.c:709
 msgid "print a list of diff tools that may be used with `--tool`"
 msgstr ""
 "mostrar una lista de herramientas de diff que pueden ser usadas con `--tool`"
 
-#: builtin/difftool.c:713
+#: builtin/difftool.c:712
 msgid ""
 "make 'git-difftool' exit when an invoked diff tool returns a non - zero exit "
 "code"
@@ -13843,31 +14454,31 @@
 "hacer que 'git-difftool' salga cuando una herramienta de diff retorne un "
 "código de salida distinto de cero"
 
-#: builtin/difftool.c:716
+#: builtin/difftool.c:715
 msgid "specify a custom command for viewing diffs"
 msgstr "especificar un comando personalizado para ver diffs"
 
-#: builtin/difftool.c:717
+#: builtin/difftool.c:716
 msgid "passed to `diff`"
 msgstr "pasado a `diff`"
 
-#: builtin/difftool.c:732
+#: builtin/difftool.c:731
 msgid "difftool requires worktree or --no-index"
 msgstr "difftool requiere un árbol de trabajo o --no-index"
 
-#: builtin/difftool.c:739
+#: builtin/difftool.c:738
 msgid "--dir-diff is incompatible with --no-index"
 msgstr "--dirty-diff es incompatible con --no-index"
 
-#: builtin/difftool.c:742
+#: builtin/difftool.c:741
 msgid "--gui, --tool and --extcmd are mutually exclusive"
 msgstr "--gui, --tool y --extcmd son mutuamente exclusivas"
 
-#: builtin/difftool.c:750
+#: builtin/difftool.c:749
 msgid "no <tool> given for --tool=<tool>"
 msgstr "no se ha proporcionado <herramienta> para --tool=<herramienta>"
 
-#: builtin/difftool.c:757
+#: builtin/difftool.c:756
 msgid "no <cmd> given for --extcmd=<cmd>"
 msgstr "no se ha entregado <comando> para --extcmd=<comando>"
 
@@ -13875,24 +14486,24 @@
 msgid "git env--helper --type=[bool|ulong] <options> <env-var>"
 msgstr "git env--helper --type=[bool|ulong] <opciones> <env-var>"
 
-#: builtin/env--helper.c:37 builtin/hash-object.c:98
+#: builtin/env--helper.c:42 builtin/hash-object.c:98
 msgid "type"
 msgstr "tipo"
 
-#: builtin/env--helper.c:41
+#: builtin/env--helper.c:46
 msgid "default for git_env_*(...) to fall back on"
 msgstr "default para git_env_*(...) es hacer fallback en"
 
-#: builtin/env--helper.c:43
+#: builtin/env--helper.c:48
 msgid "be quiet only use git_env_*() value as exit code"
 msgstr "ser silencioso solo usar valor git_env_*() como código de salida"
 
-#: builtin/env--helper.c:62
+#: builtin/env--helper.c:67
 #, c-format
 msgid "option `--default' expects a boolean value with `--type=bool`, not `%s`"
 msgstr "opción `--default' espera un valor boolean con `--type=bool`, no `%s`"
 
-#: builtin/env--helper.c:77
+#: builtin/env--helper.c:82
 #, c-format
 msgid ""
 "option `--default' expects an unsigned long value with `--type=ulong`, not `"
@@ -13910,96 +14521,127 @@
 "Error: No se puede exportar los tags anidados a menos que --mark-tags sea "
 "especificado."
 
-#: builtin/fast-export.c:1178
+#: builtin/fast-export.c:1177
 msgid "--anonymize-map token cannot be empty"
 msgstr "token --anonymize-map no puede estar vacío"
 
-#: builtin/fast-export.c:1198
+#: builtin/fast-export.c:1197
 msgid "show progress after <n> objects"
 msgstr "mostrar progreso después de <n> objetos"
 
-#: builtin/fast-export.c:1200
+#: builtin/fast-export.c:1199
 msgid "select handling of signed tags"
 msgstr "seleccionar el manejo de tags firmados"
 
-#: builtin/fast-export.c:1203
+#: builtin/fast-export.c:1202
 msgid "select handling of tags that tag filtered objects"
 msgstr "seleccionar el manejo de tags que son tags de objetos filtrados"
 
-#: builtin/fast-export.c:1206
+#: builtin/fast-export.c:1205
 msgid "select handling of commit messages in an alternate encoding"
 msgstr "seleccionar el manejo de mensajes de commit en un encoding diferente"
 
-#: builtin/fast-export.c:1209
-msgid "Dump marks to this file"
-msgstr "Volcar marcas a este archivo"
+#: builtin/fast-export.c:1208
+msgid "dump marks to this file"
+msgstr "volcar marcas a este archivo"
 
-#: builtin/fast-export.c:1211
-msgid "Import marks from this file"
-msgstr "Importar marcas de este archivo"
+#: builtin/fast-export.c:1210
+msgid "import marks from this file"
+msgstr "importar marcas de este archivo"
 
-#: builtin/fast-export.c:1215
-msgid "Import marks from this file if it exists"
-msgstr "Importar marcas de este archivo si existe"
+#: builtin/fast-export.c:1214
+msgid "import marks from this file if it exists"
+msgstr "importar marcas de este archivo si existe"
 
-#: builtin/fast-export.c:1217
-msgid "Fake a tagger when tags lack one"
-msgstr "Falsificar un tagger cuando les falta uno"
+#: builtin/fast-export.c:1216
+msgid "fake a tagger when tags lack one"
+msgstr "falsificar un tagger cuando les falta uno"
 
-#: builtin/fast-export.c:1219
-msgid "Output full tree for each commit"
-msgstr "Mostrar todo el árbol para cada commit"
+#: builtin/fast-export.c:1218
+msgid "output full tree for each commit"
+msgstr "mostrar todo el árbol para cada commit"
+
+#: builtin/fast-export.c:1220
+msgid "use the done feature to terminate the stream"
+msgstr "use el feature done para terminar el stream"
 
 #: builtin/fast-export.c:1221
-msgid "Use the done feature to terminate the stream"
-msgstr "Use el feature done para terminar el stream"
+msgid "skip output of blob data"
+msgstr "saltar el output de data blob"
 
-#: builtin/fast-export.c:1222
-msgid "Skip output of blob data"
-msgstr "Saltar el output de data blob"
-
-#: builtin/fast-export.c:1223 builtin/log.c:1724
+#: builtin/fast-export.c:1222 builtin/log.c:1815
 msgid "refspec"
 msgstr "refspec"
 
-#: builtin/fast-export.c:1224
-msgid "Apply refspec to exported refs"
-msgstr "Aplicar refspec para los refs exportados"
+#: builtin/fast-export.c:1223
+msgid "apply refspec to exported refs"
+msgstr "aplicar refspec para los refs exportados"
 
-#: builtin/fast-export.c:1225
+#: builtin/fast-export.c:1224
 msgid "anonymize output"
 msgstr "anonimizar la salida"
 
-#: builtin/fast-export.c:1226
+#: builtin/fast-export.c:1225
 msgid "from:to"
 msgstr "de:para"
 
-#: builtin/fast-export.c:1227
+#: builtin/fast-export.c:1226
 msgid "convert <from> to <to> in anonymized output"
 msgstr "convertir <de> a <para> en output anonimizado"
 
-#: builtin/fast-export.c:1230
-msgid "Reference parents which are not in fast-export stream by object id"
+#: builtin/fast-export.c:1229
+msgid "reference parents which are not in fast-export stream by object id"
 msgstr ""
-"Padres de la referencia que no estan en fast-export stream por id de objeto"
+"padres de la referencia que no estan en fast-export stream por id de objeto"
 
-#: builtin/fast-export.c:1232
-msgid "Show original object ids of blobs/commits"
-msgstr "Mostrar ids de objetos originales para blobs/commits"
+#: builtin/fast-export.c:1231
+msgid "show original object ids of blobs/commits"
+msgstr "mostrar ids de objetos originales para blobs/commits"
 
-#: builtin/fast-export.c:1234
-msgid "Label tags with mark ids"
-msgstr "Marcar tags con ids de mark"
+#: builtin/fast-export.c:1233
+msgid "label tags with mark ids"
+msgstr "marcar tags con ids de mark"
 
-#: builtin/fast-export.c:1257
+#: builtin/fast-export.c:1256
 msgid "--anonymize-map without --anonymize does not make sense"
 msgstr "--anonymize-map sin --anonymize no tiene sentido"
 
-#: builtin/fast-export.c:1272
+#: builtin/fast-export.c:1271
 msgid "Cannot pass both --import-marks and --import-marks-if-exists"
 msgstr "No se puede pasar ambos --import-marks y --import-marks-if-exists"
 
-#: builtin/fetch-pack.c:245
+#: builtin/fast-import.c:3088
+#, c-format
+msgid "Missing from marks for submodule '%s'"
+msgstr "Faltan marcas from para el submódulo '%s'"
+
+#: builtin/fast-import.c:3090
+#, c-format
+msgid "Missing to marks for submodule '%s'"
+msgstr "Faltan marcas to para el submódulo '%s'"
+
+#: builtin/fast-import.c:3225
+#, c-format
+msgid "Expected 'mark' command, got %s"
+msgstr "Se esperaba comando 'mark', se obtuvo %s"
+
+#: builtin/fast-import.c:3230
+#, c-format
+msgid "Expected 'to' command, got %s"
+msgstr "Se esperaba comando 'to', se obtuvo %s"
+
+#: builtin/fast-import.c:3322
+msgid "Expected format name:filename for submodule rewrite option"
+msgstr ""
+"Formato esperado de nombre:nombre de archivo para la opción de sobreescribir "
+"submódulo"
+
+#: builtin/fast-import.c:3377
+#, c-format
+msgid "feature '%s' forbidden in input without --allow-unsafe-features"
+msgstr "característica '%s' prohibida en input sin --allow-unsafe-features"
+
+#: builtin/fetch-pack.c:242
 #, c-format
 msgid "Lockfile created but not reported: %s"
 msgstr "Lockfile creado pero no reportado: %s"
@@ -14020,90 +14662,98 @@
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<opciones>]"
 
-#: builtin/fetch.c:117
+#: builtin/fetch.c:120
 msgid "fetch.parallel cannot be negative"
 msgstr "fetch.parallel no puede ser negativo"
 
-#: builtin/fetch.c:140 builtin/pull.c:185
+#: builtin/fetch.c:143 builtin/pull.c:185
 msgid "fetch from all remotes"
 msgstr "extraer de todos los remotos"
 
-#: builtin/fetch.c:142 builtin/pull.c:245
+#: builtin/fetch.c:145 builtin/pull.c:245
 msgid "set upstream for git pull/fetch"
 msgstr "configurar upstream para git pulll/fetch"
 
-#: builtin/fetch.c:144 builtin/pull.c:188
+#: builtin/fetch.c:147 builtin/pull.c:188
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "adjuntar a .git/FETCH_HEAD en lugar de sobrescribir"
 
-#: builtin/fetch.c:146 builtin/pull.c:191
+#: builtin/fetch.c:149
+msgid "use atomic transaction to update references"
+msgstr "usar transacción atómica para actualizar referencias"
+
+#: builtin/fetch.c:151 builtin/pull.c:191
 msgid "path to upload pack on remote end"
 msgstr "ruta para cargar el paquete al final del remoto"
 
-#: builtin/fetch.c:147
+#: builtin/fetch.c:152
 msgid "force overwrite of local reference"
 msgstr "forzar sobrescritura de referencia local"
 
-#: builtin/fetch.c:149
+#: builtin/fetch.c:154
 msgid "fetch from multiple remotes"
 msgstr "extraer de múltiples remotos"
 
-#: builtin/fetch.c:151 builtin/pull.c:195
+#: builtin/fetch.c:156 builtin/pull.c:195
 msgid "fetch all tags and associated objects"
 msgstr "extraer todos los tags y objetos asociados"
 
-#: builtin/fetch.c:153
+#: builtin/fetch.c:158
 msgid "do not fetch all tags (--no-tags)"
 msgstr "no extraer todos los tags (--no-tags)"
 
-#: builtin/fetch.c:155
+#: builtin/fetch.c:160
 msgid "number of submodules fetched in parallel"
 msgstr "número de submódulos extraídos en paralelo"
 
-#: builtin/fetch.c:157 builtin/pull.c:198
+#: builtin/fetch.c:162 builtin/pull.c:198
 msgid "prune remote-tracking branches no longer on remote"
 msgstr "limpiar ramas remotas rastreadas que ya no están en el remoto"
 
-#: builtin/fetch.c:159
+#: builtin/fetch.c:164
 msgid "prune local tags no longer on remote and clobber changed tags"
 msgstr ""
 "limpiar tags locales que no se encuentran en el remoto y eliminar tags "
 "cambiados"
 
-#: builtin/fetch.c:160 builtin/fetch.c:183 builtin/pull.c:122
+#: builtin/fetch.c:165 builtin/fetch.c:190 builtin/pull.c:122
 msgid "on-demand"
 msgstr "en demanda"
 
-#: builtin/fetch.c:161
+#: builtin/fetch.c:166
 msgid "control recursive fetching of submodules"
 msgstr "controlar extracción recursiva de submódulos"
 
-#: builtin/fetch.c:165 builtin/pull.c:206
+#: builtin/fetch.c:171
+msgid "write fetched references to the FETCH_HEAD file"
+msgstr "escribir referencias obtenidas en el archivo FETCH_HEAD"
+
+#: builtin/fetch.c:172 builtin/pull.c:206
 msgid "keep downloaded pack"
 msgstr "mantener el paquete descargado"
 
-#: builtin/fetch.c:167
+#: builtin/fetch.c:174
 msgid "allow updating of HEAD ref"
 msgstr "permitir actualizar la ref HEAD"
 
-#: builtin/fetch.c:170 builtin/fetch.c:176 builtin/pull.c:209
+#: builtin/fetch.c:177 builtin/fetch.c:183 builtin/pull.c:209
 #: builtin/pull.c:218
 msgid "deepen history of shallow clone"
 msgstr "historia profunda de un clon superficial"
 
-#: builtin/fetch.c:172 builtin/pull.c:212
+#: builtin/fetch.c:179 builtin/pull.c:212
 msgid "deepen history of shallow repository based on time"
 msgstr "historia profunda de un repositorio superficial basado en tiempo"
 
-#: builtin/fetch.c:178 builtin/pull.c:221
+#: builtin/fetch.c:185 builtin/pull.c:221
 msgid "convert to a complete repository"
 msgstr "convertir a un repositorio completo"
 
-#: builtin/fetch.c:181
+#: builtin/fetch.c:188
 msgid "prepend this to submodule path output"
 msgstr "anteponer esto a salida de la ruta del submódulo"
 
-#: builtin/fetch.c:184
+#: builtin/fetch.c:191
 msgid ""
 "default for recursive fetching of submodules (lower priority than config "
 "files)"
@@ -14111,94 +14761,98 @@
 "default para extracción recursiva de submódulos (menor prioridad que "
 "archivos de configuración)"
 
-#: builtin/fetch.c:188 builtin/pull.c:224
+#: builtin/fetch.c:195 builtin/pull.c:224
 msgid "accept refs that update .git/shallow"
 msgstr "aceptar refs que actualicen .git/shallow"
 
-#: builtin/fetch.c:189 builtin/pull.c:226
+#: builtin/fetch.c:196 builtin/pull.c:226
 msgid "refmap"
 msgstr "refmap"
 
-#: builtin/fetch.c:190 builtin/pull.c:227
+#: builtin/fetch.c:197 builtin/pull.c:227
 msgid "specify fetch refmap"
 msgstr "especificar extracción de refmap"
 
-#: builtin/fetch.c:197 builtin/pull.c:240
+#: builtin/fetch.c:204 builtin/pull.c:240
 msgid "report that we have only objects reachable from this object"
 msgstr "reporta que solo tenemos objetos alcanzables de este objeto"
 
-#: builtin/fetch.c:200
-msgid "run 'gc --auto' after fetching"
-msgstr "ejecutar 'gc --auto' tras el fetch"
+#: builtin/fetch.c:207 builtin/fetch.c:209
+msgid "run 'maintenance --auto' after fetching"
+msgstr "ejecute 'maintenance --auto' después de buscar"
 
-#: builtin/fetch.c:202 builtin/pull.c:243
+#: builtin/fetch.c:211 builtin/pull.c:243
 msgid "check for forced-updates on all updated branches"
 msgstr "verificar updates forzados en todos los branch actualizados"
 
-#: builtin/fetch.c:204
+#: builtin/fetch.c:213
 msgid "write the commit-graph after fetching"
 msgstr "escribir commit-graph luego del fetch"
 
-#: builtin/fetch.c:514
+#: builtin/fetch.c:215
+msgid "accept refspecs from stdin"
+msgstr "aceptar refspecs de stdin"
+
+#: builtin/fetch.c:526
 msgid "Couldn't find remote ref HEAD"
 msgstr "No se puedo encontrar ref remota HEAD"
 
-#: builtin/fetch.c:654
+#: builtin/fetch.c:697
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr "la configuración fetch.output contiene el valor inválido %s"
 
-#: builtin/fetch.c:752
+#: builtin/fetch.c:796
 #, c-format
 msgid "object %s not found"
 msgstr "objeto %s no encontrado"
 
-#: builtin/fetch.c:756
+#: builtin/fetch.c:800
 msgid "[up to date]"
 msgstr "[actualizado]"
 
-#: builtin/fetch.c:769 builtin/fetch.c:785 builtin/fetch.c:857
+#: builtin/fetch.c:813 builtin/fetch.c:829 builtin/fetch.c:901
 msgid "[rejected]"
 msgstr "[rechazado]"
 
-#: builtin/fetch.c:770
+#: builtin/fetch.c:814
 msgid "can't fetch in current branch"
 msgstr "no se puede traer en la rama actual"
 
-#: builtin/fetch.c:780
+#: builtin/fetch.c:824
 msgid "[tag update]"
 msgstr "[actualización de tag]"
 
-#: builtin/fetch.c:781 builtin/fetch.c:818 builtin/fetch.c:840
-#: builtin/fetch.c:852
+#: builtin/fetch.c:825 builtin/fetch.c:862 builtin/fetch.c:884
+#: builtin/fetch.c:896
 msgid "unable to update local ref"
 msgstr "no se posible actualizar el ref local"
 
-#: builtin/fetch.c:785
+#: builtin/fetch.c:829
 msgid "would clobber existing tag"
 msgstr "podría golpear tag existente"
 
-#: builtin/fetch.c:807
+#: builtin/fetch.c:851
 msgid "[new tag]"
 msgstr "[nuevo tag]"
 
-#: builtin/fetch.c:810
+#: builtin/fetch.c:854
 msgid "[new branch]"
 msgstr "[nueva rama]"
 
-#: builtin/fetch.c:813
+#: builtin/fetch.c:857
 msgid "[new ref]"
 msgstr "[nueva referencia]"
 
-#: builtin/fetch.c:852
+#: builtin/fetch.c:896
 msgid "forced update"
 msgstr "actualización forzada"
 
-#: builtin/fetch.c:857
+#: builtin/fetch.c:901
 msgid "non-fast-forward"
 msgstr "avance lento"
 
-#: builtin/fetch.c:878
+#: builtin/fetch.c:1005
 msgid ""
 "Fetch normally indicates which branches had a forced update,\n"
 "but that check has been disabled. To re-enable, use '--show-forced-updates'\n"
@@ -14209,7 +14863,7 @@
 "show-forced-updates'\n"
 "o ejecute 'git config fetch.showForcedUpdates true'."
 
-#: builtin/fetch.c:882
+#: builtin/fetch.c:1009
 #, c-format
 msgid ""
 "It took %.2f seconds to check forced updates. You can use\n"
@@ -14222,22 +14876,22 @@
 "false'\n"
 "para evitar esta validación.\n"
 
-#: builtin/fetch.c:914
+#: builtin/fetch.c:1041
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s no envió todos los objetos necesarios\n"
 
-#: builtin/fetch.c:935
+#: builtin/fetch.c:1069
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr "rechazado %s porque raíces superficiales no pueden ser actualizadas"
 
-#: builtin/fetch.c:1020 builtin/fetch.c:1158
+#: builtin/fetch.c:1146 builtin/fetch.c:1297
 #, c-format
 msgid "From %.*s\n"
 msgstr "Desde %.*s\n"
 
-#: builtin/fetch.c:1031
+#: builtin/fetch.c:1168
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -14246,56 +14900,56 @@
 "algunos refs locales no pudieron ser actualizados; intente ejecutar\n"
 " 'git remote prune %s' para eliminar cualquier rama vieja o conflictiva"
 
-#: builtin/fetch.c:1128
+#: builtin/fetch.c:1267
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s se pondrá colgado)"
 
-#: builtin/fetch.c:1129
+#: builtin/fetch.c:1268
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s se ha colgado)"
 
-#: builtin/fetch.c:1161
+#: builtin/fetch.c:1300
 msgid "[deleted]"
 msgstr "[eliminado]"
 
-#: builtin/fetch.c:1162 builtin/remote.c:1112
+#: builtin/fetch.c:1301 builtin/remote.c:1118
 msgid "(none)"
 msgstr "(nada)"
 
-#: builtin/fetch.c:1185
+#: builtin/fetch.c:1324
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "Rehusando extraer en la rama actual %s de un repositorio no vacío"
 
-#: builtin/fetch.c:1204
+#: builtin/fetch.c:1343
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Opción \"%s\" valor \"%s\" no es válido para %s"
 
-#: builtin/fetch.c:1207
+#: builtin/fetch.c:1346
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Opción \"%s\" es ignorada por %s\n"
 
-#: builtin/fetch.c:1415
+#: builtin/fetch.c:1558
 msgid "multiple branches detected, incompatible with --set-upstream"
 msgstr "múltiples ramas detectadas, incompatible con --set-upstream"
 
-#: builtin/fetch.c:1430
+#: builtin/fetch.c:1573
 msgid "not setting upstream for a remote remote-tracking branch"
 msgstr "no configurar upstream para una rama de rastreo remoto"
 
-#: builtin/fetch.c:1432
+#: builtin/fetch.c:1575
 msgid "not setting upstream for a remote tag"
 msgstr "no configurar upstream para un tag remoto"
 
-#: builtin/fetch.c:1434
+#: builtin/fetch.c:1577
 msgid "unknown branch type"
 msgstr "tipo de branch desconocido"
 
-#: builtin/fetch.c:1436
+#: builtin/fetch.c:1579
 msgid ""
 "no source branch found.\n"
 "you need to specify exactly one branch with the --set-upstream option."
@@ -14303,22 +14957,22 @@
 "no se encontró rama fuente.\n"
 "tienes que especificar exactamente una rama con la opción --set-upstream."
 
-#: builtin/fetch.c:1562 builtin/fetch.c:1625
+#: builtin/fetch.c:1708 builtin/fetch.c:1771
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Extrayendo %s\n"
 
-#: builtin/fetch.c:1572 builtin/fetch.c:1627 builtin/remote.c:101
+#: builtin/fetch.c:1718 builtin/fetch.c:1773 builtin/remote.c:101
 #, c-format
 msgid "Could not fetch %s"
 msgstr "No se pudo extraer %s"
 
-#: builtin/fetch.c:1584
+#: builtin/fetch.c:1730
 #, c-format
 msgid "could not fetch '%s' (exit code: %d)\n"
 msgstr "no se pudo hacer fetch a '%s' (código de salida: %d)\n"
 
-#: builtin/fetch.c:1687
+#: builtin/fetch.c:1834
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -14326,44 +14980,44 @@
 "No hay repositorio remoto especificado. Por favor, especifique un URL o un\n"
 "nombre remoto del cual las nuevas revisiones deben ser extraídas."
 
-#: builtin/fetch.c:1724
+#: builtin/fetch.c:1870
 msgid "You need to specify a tag name."
 msgstr "Tienes que especificar un nombre de tag."
 
-#: builtin/fetch.c:1778
+#: builtin/fetch.c:1935
 msgid "Negative depth in --deepen is not supported"
 msgstr "Profundidad negativa en --deepen no soportada"
 
-#: builtin/fetch.c:1780
+#: builtin/fetch.c:1937
 msgid "--deepen and --depth are mutually exclusive"
 msgstr "--deepen y --depth son mutuamente exclusivas"
 
-#: builtin/fetch.c:1785
+#: builtin/fetch.c:1942
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth y --unshallow no pueden ser usadas juntas"
 
-#: builtin/fetch.c:1787
+#: builtin/fetch.c:1944
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow no tiene sentido en un repositorio completo"
 
-#: builtin/fetch.c:1800
+#: builtin/fetch.c:1961
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all no toma un argumento de repositorio"
 
-#: builtin/fetch.c:1802
+#: builtin/fetch.c:1963
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all no tiene sentido con refspecs"
 
-#: builtin/fetch.c:1811
+#: builtin/fetch.c:1972
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "No existe el remoto o grupo remoto: %s"
 
-#: builtin/fetch.c:1818
+#: builtin/fetch.c:1979
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Extraer un grupo y especificar un refspecs no tiene sentido"
 
-#: builtin/fetch.c:1836
+#: builtin/fetch.c:1997
 msgid ""
 "--filter can only be used with the remote configured in extensions."
 "partialclone"
@@ -14371,6 +15025,14 @@
 "--filter solo puede ser usado con el remoto configurado en extensions."
 "partialClone"
 
+#: builtin/fetch.c:2001
+msgid "--atomic can only be used when fetching from one remote"
+msgstr "--atomic solo se puede usar cuando se busca desde un control remoto"
+
+#: builtin/fetch.c:2005
+msgid "--stdin can only be used when fetching from one remote"
+msgstr "--stdin solo se puede usar cuando se busca desde un control remoto"
+
 #: builtin/fmt-merge-msg.c:7
 msgid ""
 "git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
@@ -14406,8 +15068,8 @@
 msgstr "git for-each-ref [--points-at <objeto>]"
 
 #: builtin/for-each-ref.c:12
-msgid "git for-each-ref [(--merged | --no-merged) [<commit>]]"
-msgstr "git for-each-ref [(--merged | --no-merged) [<commit>]]"
+msgid "git for-each-ref [--merged [<commit>]] [--no-merged [<commit>]]"
+msgstr "git for-each-ref [--merged [<commit>]] [--no-merged [<commit>]]"
 
 #: builtin/for-each-ref.c:13
 msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
@@ -14433,7 +15095,7 @@
 msgid "show only <n> matched refs"
 msgstr "mostrar solo <n> refs encontradas"
 
-#: builtin/for-each-ref.c:39 builtin/tag.c:440
+#: builtin/for-each-ref.c:39 builtin/tag.c:472
 msgid "respect format colors"
 msgstr "respetar el formato de colores"
 
@@ -14457,32 +15119,48 @@
 msgid "print only refs which don't contain the commit"
 msgstr "mostrar solo refs que no contienen el commit"
 
-#: builtin/fsck.c:69 builtin/fsck.c:148 builtin/fsck.c:149
+#: builtin/for-each-repo.c:9
+msgid "git for-each-repo --config=<config> <command-args>"
+msgstr "git for-each-repo --config=<config> <argumetnos-de-comando>"
+
+#: builtin/for-each-repo.c:37
+msgid "config"
+msgstr "config"
+
+#: builtin/for-each-repo.c:38
+msgid "config key storing a list of repository paths"
+msgstr "clave de configuración que almacena una lista de rutas de repositorio"
+
+#: builtin/for-each-repo.c:46
+msgid "missing --config=<config>"
+msgstr "falta --config=<config>"
+
+#: builtin/fsck.c:69 builtin/fsck.c:130 builtin/fsck.c:131
 msgid "unknown"
 msgstr "desconocido"
 
 #. TRANSLATORS: e.g. error in tree 01bfda: <more explanation>
-#: builtin/fsck.c:101 builtin/fsck.c:121
+#: builtin/fsck.c:83 builtin/fsck.c:103
 #, c-format
 msgid "error in %s %s: %s"
 msgstr "error en %s %s: %s"
 
 #. TRANSLATORS: e.g. warning in tree 01bfda: <more explanation>
-#: builtin/fsck.c:115
+#: builtin/fsck.c:97
 #, c-format
 msgid "warning in %s %s: %s"
 msgstr "peligro en %s %s: %s"
 
-#: builtin/fsck.c:144 builtin/fsck.c:147
+#: builtin/fsck.c:126 builtin/fsck.c:129
 #, c-format
 msgid "broken link from %7s %s"
 msgstr "link roto de %7s %s"
 
-#: builtin/fsck.c:156
+#: builtin/fsck.c:138
 msgid "wrong object type in link"
 msgstr "tipo de objeto equivocado en link"
 
-#: builtin/fsck.c:172
+#: builtin/fsck.c:154
 #, c-format
 msgid ""
 "broken link from %7s %s\n"
@@ -14491,240 +15169,240 @@
 "link roto de %7s %s\n"
 "              a %7s %s"
 
-#: builtin/fsck.c:283
+#: builtin/fsck.c:265
 #, c-format
 msgid "missing %s %s"
 msgstr "faltan %s %s"
 
-#: builtin/fsck.c:310
+#: builtin/fsck.c:292
 #, c-format
 msgid "unreachable %s %s"
 msgstr "inalcanzable %s %s"
 
-#: builtin/fsck.c:330
+#: builtin/fsck.c:312
 #, c-format
 msgid "dangling %s %s"
 msgstr "actualizando %s %s"
 
-#: builtin/fsck.c:340
+#: builtin/fsck.c:322
 msgid "could not create lost-found"
 msgstr "no se pudo crear lost-found"
 
-#: builtin/fsck.c:351
+#: builtin/fsck.c:333
 #, c-format
 msgid "could not finish '%s'"
 msgstr "no se pudo finalizar '%s'"
 
-#: builtin/fsck.c:368
+#: builtin/fsck.c:350
 #, c-format
 msgid "Checking %s"
 msgstr "Revisando %s"
 
-#: builtin/fsck.c:406
+#: builtin/fsck.c:388
 #, c-format
 msgid "Checking connectivity (%d objects)"
 msgstr "Verificando conectividad (%d objetos)"
 
-#: builtin/fsck.c:425
+#: builtin/fsck.c:407
 #, c-format
 msgid "Checking %s %s"
 msgstr "Revisando %s %s"
 
-#: builtin/fsck.c:430
+#: builtin/fsck.c:412
 msgid "broken links"
 msgstr "links rotos"
 
-#: builtin/fsck.c:439
+#: builtin/fsck.c:421
 #, c-format
 msgid "root %s"
 msgstr "raíz %s"
 
-#: builtin/fsck.c:447
+#: builtin/fsck.c:429
 #, c-format
 msgid "tagged %s %s (%s) in %s"
 msgstr "tag %s %s (%s) en %s"
 
-#: builtin/fsck.c:476
+#: builtin/fsck.c:458
 #, c-format
 msgid "%s: object corrupt or missing"
 msgstr "%s: objecto corrupto o faltante"
 
-#: builtin/fsck.c:501
+#: builtin/fsck.c:483
 #, c-format
 msgid "%s: invalid reflog entry %s"
 msgstr "%s: referencia inválida %s"
 
-#: builtin/fsck.c:515
+#: builtin/fsck.c:497
 #, c-format
 msgid "Checking reflog %s->%s"
 msgstr "Revisando reflog %s->%s"
 
-#: builtin/fsck.c:549
+#: builtin/fsck.c:531
 #, c-format
 msgid "%s: invalid sha1 pointer %s"
 msgstr "%s: puntero sha1 inválido %s"
 
-#: builtin/fsck.c:556
+#: builtin/fsck.c:538
 #, c-format
 msgid "%s: not a commit"
 msgstr "%s: no es un commit"
 
-#: builtin/fsck.c:610
+#: builtin/fsck.c:592
 msgid "notice: No default references"
 msgstr "aviso: No hay referencias por defecto"
 
-#: builtin/fsck.c:625
+#: builtin/fsck.c:607
 #, c-format
 msgid "%s: object corrupt or missing: %s"
 msgstr "%s: objeto corrupto o no encontrado: %s"
 
-#: builtin/fsck.c:638
+#: builtin/fsck.c:620
 #, c-format
 msgid "%s: object could not be parsed: %s"
 msgstr "%s: no se puede analizar objeto: %s"
 
-#: builtin/fsck.c:658
+#: builtin/fsck.c:640
 #, c-format
 msgid "bad sha1 file: %s"
 msgstr "mal sha1 de archivo: %s"
 
-#: builtin/fsck.c:673
+#: builtin/fsck.c:655
 msgid "Checking object directory"
 msgstr "Revisando directorio de objetos"
 
-#: builtin/fsck.c:676
+#: builtin/fsck.c:658
 msgid "Checking object directories"
 msgstr "Revisando objetos directorios"
 
-#: builtin/fsck.c:691
+#: builtin/fsck.c:673
 #, c-format
 msgid "Checking %s link"
 msgstr "Revisando link %s"
 
-#: builtin/fsck.c:696 builtin/index-pack.c:843
+#: builtin/fsck.c:678 builtin/index-pack.c:865
 #, c-format
 msgid "invalid %s"
 msgstr "%s inválido"
 
-#: builtin/fsck.c:703
+#: builtin/fsck.c:685
 #, c-format
 msgid "%s points to something strange (%s)"
 msgstr "%s apunta a algo extraño (%s)"
 
-#: builtin/fsck.c:709
+#: builtin/fsck.c:691
 #, c-format
 msgid "%s: detached HEAD points at nothing"
 msgstr "%s: HEAD desacoplado apunta a nada"
 
-#: builtin/fsck.c:713
+#: builtin/fsck.c:695
 #, c-format
 msgid "notice: %s points to an unborn branch (%s)"
 msgstr "aviso: %s apunta a un branch no nacido (%s)"
 
-#: builtin/fsck.c:725
+#: builtin/fsck.c:707
 msgid "Checking cache tree"
 msgstr "Revisando el cache tree"
 
-#: builtin/fsck.c:730
+#: builtin/fsck.c:712
 #, c-format
 msgid "%s: invalid sha1 pointer in cache-tree"
 msgstr "%s: puntero inválido sha1 en cache-tree"
 
-#: builtin/fsck.c:739
+#: builtin/fsck.c:721
 msgid "non-tree in cache-tree"
 msgstr "non-tree en cache-tree"
 
-#: builtin/fsck.c:770
+#: builtin/fsck.c:752
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<opciones>] [<objeto>...]"
 
-#: builtin/fsck.c:776
+#: builtin/fsck.c:758
 msgid "show unreachable objects"
 msgstr "mostrar objetos ilegibles"
 
-#: builtin/fsck.c:777
+#: builtin/fsck.c:759
 msgid "show dangling objects"
 msgstr "mostrar objetos colgados"
 
-#: builtin/fsck.c:778
+#: builtin/fsck.c:760
 msgid "report tags"
 msgstr "reportar tags"
 
-#: builtin/fsck.c:779
+#: builtin/fsck.c:761
 msgid "report root nodes"
 msgstr "reportar nodos raíz"
 
-#: builtin/fsck.c:780
+#: builtin/fsck.c:762
 msgid "make index objects head nodes"
 msgstr "hacer objetos índices cabezas de nodos"
 
-#: builtin/fsck.c:781
+#: builtin/fsck.c:763
 msgid "make reflogs head nodes (default)"
 msgstr "hacer reflogs cabeza de nodos (default)"
 
-#: builtin/fsck.c:782
+#: builtin/fsck.c:764
 msgid "also consider packs and alternate objects"
 msgstr "también considerar paquetes y objetos alternos"
 
-#: builtin/fsck.c:783
+#: builtin/fsck.c:765
 msgid "check only connectivity"
 msgstr "revisar solo conectividad"
 
-#: builtin/fsck.c:784
+#: builtin/fsck.c:766 builtin/mktag.c:78
 msgid "enable more strict checking"
 msgstr "habilitar revisión más estricta"
 
-#: builtin/fsck.c:786
+#: builtin/fsck.c:768
 msgid "write dangling objects in .git/lost-found"
 msgstr "escribir objetos colgados en .git/lost-found"
 
-#: builtin/fsck.c:787 builtin/prune.c:134
+#: builtin/fsck.c:769 builtin/prune.c:134
 msgid "show progress"
 msgstr "mostrar progreso"
 
-#: builtin/fsck.c:788
+#: builtin/fsck.c:770
 msgid "show verbose names for reachable objects"
 msgstr "mostrar nombres verboso para objetos alcanzables"
 
-#: builtin/fsck.c:847 builtin/index-pack.c:225
+#: builtin/fsck.c:829 builtin/index-pack.c:261
 msgid "Checking objects"
 msgstr "Revisando objetos"
 
-#: builtin/fsck.c:875
+#: builtin/fsck.c:857
 #, c-format
 msgid "%s: object missing"
 msgstr "%s: objeto faltante"
 
-#: builtin/fsck.c:886
+#: builtin/fsck.c:868
 #, c-format
 msgid "invalid parameter: expected sha1, got '%s'"
 msgstr "parámetro inválido: sha1 esperado, se obtuvo '%s'"
 
-#: builtin/gc.c:35
+#: builtin/gc.c:39
 msgid "git gc [<options>]"
 msgstr "git gc [<opciones>]"
 
-#: builtin/gc.c:90
+#: builtin/gc.c:93
 #, c-format
 msgid "Failed to fstat %s: %s"
 msgstr "Falló el fstat %s: %s"
 
-#: builtin/gc.c:126
+#: builtin/gc.c:129
 #, c-format
 msgid "failed to parse '%s' value '%s'"
 msgstr "falló al analizar '%s' valor '%s'"
 
-#: builtin/gc.c:475 builtin/init-db.c:57
+#: builtin/gc.c:487 builtin/init-db.c:58
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "no se pudo definir '%s'"
 
-#: builtin/gc.c:484 builtin/notes.c:240 builtin/tag.c:530
+#: builtin/gc.c:496 builtin/notes.c:240 builtin/tag.c:562
 #, c-format
 msgid "cannot read '%s'"
 msgstr "no se puede leer '%s'"
 
-#: builtin/gc.c:491
+#: builtin/gc.c:503
 #, c-format
 msgid ""
 "The last gc run reported the following. Please correct the root cause\n"
@@ -14739,54 +15417,54 @@
 "\n"
 "%s"
 
-#: builtin/gc.c:539
+#: builtin/gc.c:551
 msgid "prune unreferenced objects"
 msgstr "limpiar objetos no referenciados"
 
-#: builtin/gc.c:541
+#: builtin/gc.c:553
 msgid "be more thorough (increased runtime)"
 msgstr "ser más exhaustivo (aumentar runtime)"
 
-#: builtin/gc.c:542
+#: builtin/gc.c:554
 msgid "enable auto-gc mode"
 msgstr "habilitar modo auto-gc"
 
-#: builtin/gc.c:545
+#: builtin/gc.c:557
 msgid "force running gc even if there may be another gc running"
 msgstr "forzar la ejecución de gc incluso si puede haber otro gc ejecutándose"
 
-#: builtin/gc.c:548
+#: builtin/gc.c:560
 msgid "repack all other packs except the largest pack"
 msgstr "reempaquetar todos los otros paquetes excepto el paquete más grande"
 
-#: builtin/gc.c:565
+#: builtin/gc.c:576
 #, c-format
 msgid "failed to parse gc.logexpiry value %s"
 msgstr "falló al analizar valor %s de gc.logexpirity"
 
-#: builtin/gc.c:576
+#: builtin/gc.c:587
 #, c-format
 msgid "failed to parse prune expiry value %s"
 msgstr "falló al analizar valor %s de prune expiry"
 
-#: builtin/gc.c:596
+#: builtin/gc.c:607
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 "Auto empaquetado del repositorio en segundo plano para un performance "
 "óptimo.\n"
 
-#: builtin/gc.c:598
+#: builtin/gc.c:609
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "Auto empaquetado del repositorio para performance óptimo.\n"
 
-#: builtin/gc.c:599
+#: builtin/gc.c:610
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "Vea \"git help gc\" para limpieza manual.\n"
 
-#: builtin/gc.c:639
+#: builtin/gc.c:650
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -14794,23 +15472,187 @@
 "gc ya está ejecutándose en la máquina '%s' pid %<PRIuMAX> (use --force so no "
 "es así)"
 
-#: builtin/gc.c:694
+#: builtin/gc.c:705
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
 "Hay muchos objetos sueltos inalcanzables; ejecute 'git prune' para "
 "eliminarlos."
 
+#: builtin/gc.c:715
+msgid ""
+"git maintenance run [--auto] [--[no-]quiet] [--task=<task>] [--schedule]"
+msgstr ""
+"git maintenance run [--auto] [--[no-]quiet] [--task=<task>] [--schedule]"
+
+#: builtin/gc.c:745
+msgid "--no-schedule is not allowed"
+msgstr "--no-schedule no está permitido"
+
+#: builtin/gc.c:750
+#, c-format
+msgid "unrecognized --schedule argument '%s'"
+msgstr "argumento --schedule no reconocido, '%s'"
+
+#: builtin/gc.c:869
+msgid "failed to write commit-graph"
+msgstr "no se pudo escribir el commit-graph"
+
+#: builtin/gc.c:914
+msgid "failed to fill remotes"
+msgstr "falló al borrar remotos"
+
+#: builtin/gc.c:1037
+msgid "failed to start 'git pack-objects' process"
+msgstr "no pudo iniciar el proceso 'git pack-objects'"
+
+#: builtin/gc.c:1054
+msgid "failed to finish 'git pack-objects' process"
+msgstr "no pudo finalizar el proceso 'git pack-objects'"
+
+#: builtin/gc.c:1106
+msgid "failed to write multi-pack-index"
+msgstr "no se pudo escribir el índice de paquetes múltiples"
+
+#: builtin/gc.c:1124
+msgid "'git multi-pack-index expire' failed"
+msgstr "'git multi-pack-index expire' falló"
+
+#: builtin/gc.c:1185
+msgid "'git multi-pack-index repack' failed"
+msgstr "'git multi-pack-index repack' falló"
+
+#: builtin/gc.c:1194
+msgid ""
+"skipping incremental-repack task because core.multiPackIndex is disabled"
+msgstr ""
+"omitiendo la tarea de reempaquetado incremental porque core.multiPackIndex "
+"está deshabilitado"
+
+#: builtin/gc.c:1298
+#, c-format
+msgid "lock file '%s' exists, skipping maintenance"
+msgstr "el archivo de bloqueo '%s' existe, omitiendo el mantenimiento"
+
+#: builtin/gc.c:1328
+#, c-format
+msgid "task '%s' failed"
+msgstr "tarea '%s' falló"
+
+#: builtin/gc.c:1410
+#, c-format
+msgid "'%s' is not a valid task"
+msgstr "'%s' no es una tarea válida"
+
+#: builtin/gc.c:1415
+#, c-format
+msgid "task '%s' cannot be selected multiple times"
+msgstr "tarea '%s' no puede ser seleccionada múltipes veces"
+
+#: builtin/gc.c:1430
+msgid "run tasks based on the state of the repository"
+msgstr "ejecutar tareas basadas en el estado del repositorio"
+
+#: builtin/gc.c:1431
+msgid "frequency"
+msgstr "frecuencia"
+
+#: builtin/gc.c:1432
+msgid "run tasks based on frequency"
+msgstr "ejecutar tareas basado en frecuencia"
+
+#: builtin/gc.c:1435
+msgid "do not report progress or other information over stderr"
+msgstr "no reportar progreso u otra información por medio de stderr"
+
+#: builtin/gc.c:1436
+msgid "task"
+msgstr "tarea"
+
+#: builtin/gc.c:1437
+msgid "run a specific task"
+msgstr "ruta a tarea específica"
+
+#: builtin/gc.c:1454
+msgid "use at most one of --auto and --schedule=<frequency>"
+msgstr "usar como máximo una entre --auto y --schedule=<frecuencia>"
+
+#: builtin/gc.c:1497
+msgid "failed to run 'git config'"
+msgstr "no pudo ejecutar 'git config'"
+
+#: builtin/gc.c:1562
+#, c-format
+msgid "failed to expand path '%s'"
+msgstr "falló al expandir la ruta '%s'"
+
+#: builtin/gc.c:1591
+msgid "failed to start launchctl"
+msgstr "Falló al iniciar launchctl."
+
+#: builtin/gc.c:1628
+#, c-format
+msgid "failed to create directories for '%s'"
+msgstr "falló al crear directorios para '%s'"
+
+#: builtin/gc.c:1689
+#, c-format
+msgid "failed to bootstrap service %s"
+msgstr "falló al generar el servicio %s"
+
+#: builtin/gc.c:1760
+msgid "failed to create temp xml file"
+msgstr "no se pudo crear el archivo temp xml"
+
+#: builtin/gc.c:1850
+msgid "failed to start schtasks"
+msgstr "no pudo iniciar schtasks"
+
+#: builtin/gc.c:1894
+msgid "failed to run 'crontab -l'; your system might not support 'cron'"
+msgstr ""
+"no pudo ejecutar 'crontab -l'; es posible que su sistema no soporte 'cron'"
+
+#: builtin/gc.c:1911
+msgid "failed to run 'crontab'; your system might not support 'cron'"
+msgstr ""
+"no pudo ejecutar 'crontab'; es posible que su sistema no soporte 'cron'"
+
+#: builtin/gc.c:1915
+msgid "failed to open stdin of 'crontab'"
+msgstr "no pudo abrir stdin de 'crontab'"
+
+#: builtin/gc.c:1956
+msgid "'crontab' died"
+msgstr "'crontab' murió"
+
+#: builtin/gc.c:1990
+msgid "another process is scheduling background maintenance"
+msgstr "otro proceso está programando el mantenimiento en segundo plano"
+
+#: builtin/gc.c:2009
+msgid "failed to add repo to global config"
+msgstr "no se pudo agregar el repositorio a la configuración global"
+
+#: builtin/gc.c:2019
+msgid "git maintenance <subcommand> [<options>]"
+msgstr "git maintenance <subcomando> [<opciones>]"
+
+#: builtin/gc.c:2038
+#, c-format
+msgid "invalid subcommand: %s"
+msgstr "subcomando no válido: %s"
+
 #: builtin/grep.c:30
 msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr "git grep [<opciones>] [-e] <patrón> [<rev>...] [[--] <ruta>...]"
 
-#: builtin/grep.c:225
+#: builtin/grep.c:223
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep: falló al crear el hilo: %s"
 
-#: builtin/grep.c:279
+#: builtin/grep.c:277
 #, c-format
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "número inválido de hilos especificado (%d) para %s"
@@ -14819,262 +15661,262 @@
 #. variable for tweaking threads, currently
 #. grep.threads
 #.
-#: builtin/grep.c:287 builtin/index-pack.c:1537 builtin/index-pack.c:1727
-#: builtin/pack-objects.c:2904
+#: builtin/grep.c:285 builtin/index-pack.c:1589 builtin/index-pack.c:1808
+#: builtin/pack-objects.c:2944
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "no hay soporte para hilos, ignorando %s"
 
-#: builtin/grep.c:475 builtin/grep.c:600 builtin/grep.c:640
+#: builtin/grep.c:473 builtin/grep.c:601 builtin/grep.c:641
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "no es posible leer el  árbol (%s)"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:656
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "no es posible realizar grep del objeto de tipo %s"
 
-#: builtin/grep.c:724
+#: builtin/grep.c:737
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "switch `%c' espera un valor numérico"
 
-#: builtin/grep.c:823
+#: builtin/grep.c:836
 msgid "search in index instead of in the work tree"
 msgstr "buscar en el índice en lugar del árbol de trabajo"
 
-#: builtin/grep.c:825
+#: builtin/grep.c:838
 msgid "find in contents not managed by git"
 msgstr "encontrar en contenidos no manejados por git"
 
-#: builtin/grep.c:827
+#: builtin/grep.c:840
 msgid "search in both tracked and untracked files"
 msgstr "buscar en archivos rastreados y no rastreados"
 
-#: builtin/grep.c:829
+#: builtin/grep.c:842
 msgid "ignore files specified via '.gitignore'"
 msgstr "ignorar archivos especificados via '.gitignore'"
 
-#: builtin/grep.c:831
+#: builtin/grep.c:844
 msgid "recursively search in each submodule"
 msgstr "búsqueda recursiva en cada submódulo"
 
-#: builtin/grep.c:834
+#: builtin/grep.c:847
 msgid "show non-matching lines"
 msgstr "mostrar líneas que no concuerdan"
 
-#: builtin/grep.c:836
+#: builtin/grep.c:849
 msgid "case insensitive matching"
 msgstr "búsqueda insensible a mayúsculas"
 
-#: builtin/grep.c:838
+#: builtin/grep.c:851
 msgid "match patterns only at word boundaries"
 msgstr "concordar patrón solo a los límites de las palabras"
 
-#: builtin/grep.c:840
+#: builtin/grep.c:853
 msgid "process binary files as text"
 msgstr "procesar archivos binarios como texto"
 
-#: builtin/grep.c:842
+#: builtin/grep.c:855
 msgid "don't match patterns in binary files"
 msgstr "no concordar patrones en archivos binarios"
 
-#: builtin/grep.c:845
+#: builtin/grep.c:858
 msgid "process binary files with textconv filters"
 msgstr "procesar archivos binarios con filtros textconv"
 
-#: builtin/grep.c:847
+#: builtin/grep.c:860
 msgid "search in subdirectories (default)"
 msgstr "buscar en subdirectorios (default)"
 
-#: builtin/grep.c:849
+#: builtin/grep.c:862
 msgid "descend at most <depth> levels"
 msgstr "descender como máximo <valor-de-profundiad>  niveles"
 
-#: builtin/grep.c:853
+#: builtin/grep.c:866
 msgid "use extended POSIX regular expressions"
 msgstr "usar expresiones regulares POSIX extendidas"
 
-#: builtin/grep.c:856
+#: builtin/grep.c:869
 msgid "use basic POSIX regular expressions (default)"
 msgstr "usar expresiones regulares POSIX (default)"
 
-#: builtin/grep.c:859
+#: builtin/grep.c:872
 msgid "interpret patterns as fixed strings"
 msgstr "interpretar patrones como strings arreglados"
 
-#: builtin/grep.c:862
+#: builtin/grep.c:875
 msgid "use Perl-compatible regular expressions"
 msgstr "usar expresiones regulares compatibles con Perl"
 
-#: builtin/grep.c:865
+#: builtin/grep.c:878
 msgid "show line numbers"
 msgstr "mostrar números de línea"
 
-#: builtin/grep.c:866
+#: builtin/grep.c:879
 msgid "show column number of first match"
 msgstr "mostrar el número de columna de la primer coincidencia"
 
-#: builtin/grep.c:867
+#: builtin/grep.c:880
 msgid "don't show filenames"
 msgstr "no mostrar nombres de archivo"
 
-#: builtin/grep.c:868
+#: builtin/grep.c:881
 msgid "show filenames"
 msgstr "mostrar nombres de archivo"
 
-#: builtin/grep.c:870
+#: builtin/grep.c:883
 msgid "show filenames relative to top directory"
 msgstr "mostrar nombres de archivo relativos al directorio superior"
 
-#: builtin/grep.c:872
+#: builtin/grep.c:885
 msgid "show only filenames instead of matching lines"
 msgstr "mostrar solo nombres de archivos en lugar de líneas encontradas"
 
-#: builtin/grep.c:874
+#: builtin/grep.c:887
 msgid "synonym for --files-with-matches"
 msgstr "sinónimo para --files-with-matches"
 
-#: builtin/grep.c:877
+#: builtin/grep.c:890
 msgid "show only the names of files without match"
 msgstr "mostrar solo los nombres de archivos sin coincidencias"
 
-#: builtin/grep.c:879
+#: builtin/grep.c:892
 msgid "print NUL after filenames"
 msgstr "imprimir NUL después del nombre de archivo"
 
-#: builtin/grep.c:882
+#: builtin/grep.c:895
 msgid "show only matching parts of a line"
 msgstr "mostrar solo partes que concuerdan de una línea"
 
-#: builtin/grep.c:884
+#: builtin/grep.c:897
 msgid "show the number of matches instead of matching lines"
 msgstr "mostrar el número de concordancias en lugar de las líneas concordantes"
 
-#: builtin/grep.c:885
+#: builtin/grep.c:898
 msgid "highlight matches"
 msgstr "resaltar concordancias"
 
-#: builtin/grep.c:887
+#: builtin/grep.c:900
 msgid "print empty line between matches from different files"
 msgstr "imprimir una línea vacía entre coincidencias de diferentes archivos"
 
-#: builtin/grep.c:889
+#: builtin/grep.c:902
 msgid "show filename only once above matches from same file"
 msgstr ""
 "mostrar el nombre de archivo solo una vez para concordancias en el mismo "
 "archivo"
 
-#: builtin/grep.c:892
+#: builtin/grep.c:905
 msgid "show <n> context lines before and after matches"
 msgstr "mostrar <n> líneas de contexto antes y después de la concordancia"
 
-#: builtin/grep.c:895
+#: builtin/grep.c:908
 msgid "show <n> context lines before matches"
 msgstr "mostrar <n> líneas de contexto antes de las concordancias"
 
-#: builtin/grep.c:897
+#: builtin/grep.c:910
 msgid "show <n> context lines after matches"
 msgstr "mostrar <n> líneas de context después de las concordancias"
 
-#: builtin/grep.c:899
+#: builtin/grep.c:912
 msgid "use <n> worker threads"
 msgstr "usar <n> hilos de trabajo"
 
-#: builtin/grep.c:900
+#: builtin/grep.c:913
 msgid "shortcut for -C NUM"
 msgstr "atajo para -C NUM"
 
-#: builtin/grep.c:903
+#: builtin/grep.c:916
 msgid "show a line with the function name before matches"
 msgstr ""
 "mostrar una línea con el nombre de la función antes de las concordancias"
 
-#: builtin/grep.c:905
+#: builtin/grep.c:918
 msgid "show the surrounding function"
 msgstr "mostrar la función circundante"
 
-#: builtin/grep.c:908
+#: builtin/grep.c:921
 msgid "read patterns from file"
 msgstr "leer patrones del archivo"
 
-#: builtin/grep.c:910
+#: builtin/grep.c:923
 msgid "match <pattern>"
 msgstr "concordar <patrón>"
 
-#: builtin/grep.c:912
+#: builtin/grep.c:925
 msgid "combine patterns specified with -e"
 msgstr "combinar patrones especificados con -e"
 
-#: builtin/grep.c:924
+#: builtin/grep.c:937
 msgid "indicate hit with exit status without output"
 msgstr "indicar concordancia con exit status sin output"
 
-#: builtin/grep.c:926
+#: builtin/grep.c:939
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "mostrar solo concordancias con archivos que concuerdan todos los patrones"
 
-#: builtin/grep.c:928
-msgid "show parse tree for grep expression"
-msgstr "mostrar árbol analizado para la expresión grep"
-
-#: builtin/grep.c:932
+#: builtin/grep.c:942
 msgid "pager"
 msgstr "paginador"
 
-#: builtin/grep.c:932
+#: builtin/grep.c:942
 msgid "show matching files in the pager"
 msgstr "mostrar archivos concordantes en el paginador"
 
-#: builtin/grep.c:936
+#: builtin/grep.c:946
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "permitir el llamado de grep(1) (ignorado por esta build)"
 
-#: builtin/grep.c:1003
+#: builtin/grep.c:1012
 msgid "no pattern given"
 msgstr "no se ha entregado patrón"
 
-#: builtin/grep.c:1039
+#: builtin/grep.c:1048
 msgid "--no-index or --untracked cannot be used with revs"
 msgstr "--no-index o --untracked no se puede usar con revs"
 
-#: builtin/grep.c:1047
+#: builtin/grep.c:1056
 #, c-format
 msgid "unable to resolve revision: %s"
 msgstr "no se posible resolver revisión: %s"
 
-#: builtin/grep.c:1077
+#: builtin/grep.c:1086
 msgid "--untracked not supported with --recurse-submodules"
 msgstr "--untracked no es soportada con --recurse-submodules"
 
-#: builtin/grep.c:1081
+#: builtin/grep.c:1090
 msgid "invalid option combination, ignoring --threads"
 msgstr "combinación de opciones inválida, ignorando --threads"
 
-#: builtin/grep.c:1084 builtin/pack-objects.c:3623
+#: builtin/grep.c:1093 builtin/pack-objects.c:3672
 msgid "no threads support, ignoring --threads"
 msgstr "no se soportan hilos, ignorando --threads"
 
-#: builtin/grep.c:1087 builtin/index-pack.c:1534 builtin/pack-objects.c:2901
+#: builtin/grep.c:1096 builtin/index-pack.c:1586 builtin/pack-objects.c:2941
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "número inválido de hilos especificado (%d)"
 
-#: builtin/grep.c:1121
+#: builtin/grep.c:1130
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager solo funciona en el árbol de trabajo"
 
-#: builtin/grep.c:1147
+#: builtin/grep.c:1156
 msgid "--cached or --untracked cannot be used with --no-index"
 msgstr "--cached o --untracked no pueden ser usadas con --no-index"
 
-#: builtin/grep.c:1153
+#: builtin/grep.c:1159
+msgid "--untracked cannot be used with --cached"
+msgstr "--untracked no se puede usar con --cached"
+
+#: builtin/grep.c:1165
 msgid "--[no-]exclude-standard cannot be used for tracked contents"
 msgstr "--[no-]exclude-standard no puede ser usada para contenido rastreado"
 
-#: builtin/grep.c:1161
+#: builtin/grep.c:1173
 msgid "both --cached and trees are given"
 msgstr "--cached y árboles han sido entregados"
 
@@ -15207,12 +16049,12 @@
 msgid "no info viewer handled the request"
 msgstr "ningún visor de info manejo la petición"
 
-#: builtin/help.c:520 builtin/help.c:531 git.c:337
+#: builtin/help.c:520 builtin/help.c:531 git.c:340
 #, c-format
 msgid "'%s' is aliased to '%s'"
 msgstr "'%s' tiene el alias '%s'"
 
-#: builtin/help.c:534 git.c:367
+#: builtin/help.c:534 git.c:372
 #, c-format
 msgid "bad alias.%s string: %s"
 msgstr "mal alias.%s string: %s"
@@ -15226,353 +16068,357 @@
 msgid "'git help config' for more information"
 msgstr "'git help config' para más información"
 
-#: builtin/index-pack.c:185
+#: builtin/index-pack.c:221
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "el tipo del objeto no concuerda en %s"
 
-#: builtin/index-pack.c:205
+#: builtin/index-pack.c:241
 #, c-format
 msgid "did not receive expected object %s"
 msgstr "no se recibió el objeto esperado %s"
 
-#: builtin/index-pack.c:208
+#: builtin/index-pack.c:244
 #, c-format
 msgid "object %s: expected type %s, found %s"
 msgstr "objeto %s: tipo esperado %s, encontrado %s"
 
-#: builtin/index-pack.c:258
+#: builtin/index-pack.c:294
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "no se puede llenar %d byte"
 msgstr[1] "no se pueden llenar %d bytes"
 
-#: builtin/index-pack.c:268
+#: builtin/index-pack.c:304
 msgid "early EOF"
 msgstr "EOF temprano"
 
-#: builtin/index-pack.c:269
+#: builtin/index-pack.c:305
 msgid "read error on input"
 msgstr "leer error en input"
 
-#: builtin/index-pack.c:281
+#: builtin/index-pack.c:317
 msgid "used more bytes than were available"
 msgstr "se usaron más bytes de los disponibles"
 
-#: builtin/index-pack.c:288 builtin/pack-objects.c:618
+#: builtin/index-pack.c:324 builtin/pack-objects.c:624
 msgid "pack too large for current definition of off_t"
 msgstr "paquete muy grande para la definición actual de off_t"
 
-#: builtin/index-pack.c:291 builtin/unpack-objects.c:95
+#: builtin/index-pack.c:327 builtin/unpack-objects.c:95
 msgid "pack exceeds maximum allowed size"
 msgstr "paquete excede el máximo tamaño permitido"
 
-#: builtin/index-pack.c:306 builtin/repack.c:250
+#: builtin/index-pack.c:342
 #, c-format
 msgid "unable to create '%s'"
 msgstr "no se puede crear '%s'"
 
-#: builtin/index-pack.c:312
+#: builtin/index-pack.c:348
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "no se puede abrir el archivo de paquete '%s'"
 
-#: builtin/index-pack.c:326
+#: builtin/index-pack.c:362
 msgid "pack signature mismatch"
 msgstr "firma del paquete no concuerda"
 
-#: builtin/index-pack.c:328
+#: builtin/index-pack.c:364
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "versión de paquete %<PRIu32> no soportada"
 
-#: builtin/index-pack.c:346
+#: builtin/index-pack.c:382
 #, c-format
 msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr "paquete tiene un mal objeto en el offset %<PRIuMAX>: %s"
 
-#: builtin/index-pack.c:466
+#: builtin/index-pack.c:488
 #, c-format
 msgid "inflate returned %d"
 msgstr "inflate devolvió %d"
 
-#: builtin/index-pack.c:515
+#: builtin/index-pack.c:537
 msgid "offset value overflow for delta base object"
 msgstr "valor de offset desbordado para el objeto base delta"
 
-#: builtin/index-pack.c:523
+#: builtin/index-pack.c:545
 msgid "delta base offset is out of bound"
 msgstr "offset de base delta está fuera de límites"
 
-#: builtin/index-pack.c:531
+#: builtin/index-pack.c:553
 #, c-format
 msgid "unknown object type %d"
 msgstr "tipo de objeto %d desconocido"
 
-#: builtin/index-pack.c:562
+#: builtin/index-pack.c:584
 msgid "cannot pread pack file"
 msgstr "no se puede propagar el paquete"
 
-#: builtin/index-pack.c:564
+#: builtin/index-pack.c:586
 #, c-format
 msgid "premature end of pack file, %<PRIuMAX> byte missing"
 msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
 msgstr[0] "final prematuro de archivo de paquete, %<PRIuMAX> byte faltante"
 msgstr[1] "final prematuro de archivo de paquete, %<PRIuMAX> bytes faltantes"
 
-#: builtin/index-pack.c:590
+#: builtin/index-pack.c:612
 msgid "serious inflate inconsistency"
 msgstr "inconsistencia seria en inflate"
 
-#: builtin/index-pack.c:735 builtin/index-pack.c:741 builtin/index-pack.c:765
-#: builtin/index-pack.c:804 builtin/index-pack.c:813
+#: builtin/index-pack.c:757 builtin/index-pack.c:763 builtin/index-pack.c:787
+#: builtin/index-pack.c:826 builtin/index-pack.c:835
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "¡COLISIÓN DE TIPO SHA1 ENCONTRADA CON %s !"
 
-#: builtin/index-pack.c:738 builtin/pack-objects.c:170
-#: builtin/pack-objects.c:230 builtin/pack-objects.c:325
+#: builtin/index-pack.c:760 builtin/pack-objects.c:171
+#: builtin/pack-objects.c:231 builtin/pack-objects.c:326
 #, c-format
 msgid "unable to read %s"
 msgstr "no se posible leer %s"
 
-#: builtin/index-pack.c:802
+#: builtin/index-pack.c:824
 #, c-format
 msgid "cannot read existing object info %s"
 msgstr "no se puede leer la información existente del objeto %s"
 
-#: builtin/index-pack.c:810
+#: builtin/index-pack.c:832
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "no se puede leer el objeto existente %s"
 
-#: builtin/index-pack.c:824
+#: builtin/index-pack.c:846
 #, c-format
 msgid "invalid blob object %s"
 msgstr "objeto blob %s inválido"
 
-#: builtin/index-pack.c:827 builtin/index-pack.c:846
+#: builtin/index-pack.c:849 builtin/index-pack.c:868
 msgid "fsck error in packed object"
 msgstr "error de fsck en el objeto empaquetado"
 
-#: builtin/index-pack.c:848
+#: builtin/index-pack.c:870
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "No todos los objetos hijos de %s son alcanzables"
 
-#: builtin/index-pack.c:920 builtin/index-pack.c:951
+#: builtin/index-pack.c:931 builtin/index-pack.c:978
 msgid "failed to apply delta"
 msgstr "falló al aplicar delta"
 
-#: builtin/index-pack.c:1121
+#: builtin/index-pack.c:1161
 msgid "Receiving objects"
 msgstr "Recibiendo objetos"
 
-#: builtin/index-pack.c:1121
+#: builtin/index-pack.c:1161
 msgid "Indexing objects"
 msgstr "Indexando objetos"
 
-#: builtin/index-pack.c:1155
+#: builtin/index-pack.c:1195
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "paquete está corrompido (SHA1 no concuerda)"
 
-#: builtin/index-pack.c:1160
+#: builtin/index-pack.c:1200
 msgid "cannot fstat packfile"
 msgstr "no se puede fstat al archivo de paquete"
 
-#: builtin/index-pack.c:1163
+#: builtin/index-pack.c:1203
 msgid "pack has junk at the end"
 msgstr "el paquete tiene basura al final"
 
-#: builtin/index-pack.c:1175
+#: builtin/index-pack.c:1215
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "confusión más allá de la locura en parse_pack_objects()"
 
-#: builtin/index-pack.c:1198
+#: builtin/index-pack.c:1238
 msgid "Resolving deltas"
 msgstr "Resolviendo deltas"
 
-#: builtin/index-pack.c:1208 builtin/pack-objects.c:2665
+#: builtin/index-pack.c:1249 builtin/pack-objects.c:2707
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "no es posible crear hilo: %s"
 
-#: builtin/index-pack.c:1249
+#: builtin/index-pack.c:1282
 msgid "confusion beyond insanity"
 msgstr "confusión más allá de la locura"
 
-#: builtin/index-pack.c:1255
+#: builtin/index-pack.c:1288
 #, c-format
 msgid "completed with %d local object"
 msgid_plural "completed with %d local objects"
 msgstr[0] "completado con %d objeto local"
 msgstr[1] "completado con %d objetos locales"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1300
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Tail checksum para %s inesperada (¿corrupción de disco?)"
 
-#: builtin/index-pack.c:1271
+#: builtin/index-pack.c:1304
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "paquete tiene %d delta sin resolver"
 msgstr[1] "paquete tiene %d deltas sin resolver"
 
-#: builtin/index-pack.c:1295
+#: builtin/index-pack.c:1328
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "no es posible desinflar el objeto adjunto (%d)"
 
-#: builtin/index-pack.c:1391
+#: builtin/index-pack.c:1424
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "objeto local %s está corrompido"
 
-#: builtin/index-pack.c:1405
+#: builtin/index-pack.c:1445
 #, c-format
-msgid "packfile name '%s' does not end with '.pack'"
-msgstr "nombre '%s' de archivo de paquete no termina con '.pack'"
+msgid "packfile name '%s' does not end with '.%s'"
+msgstr "el nombre del archivo de paquete '%s' no termina con '.%s'"
 
-#: builtin/index-pack.c:1430
+#: builtin/index-pack.c:1469
 #, c-format
 msgid "cannot write %s file '%s'"
 msgstr "no se puede escribir %s en el archivo '%s'"
 
-#: builtin/index-pack.c:1438
+#: builtin/index-pack.c:1477
 #, c-format
 msgid "cannot close written %s file '%s'"
 msgstr "no se puede cerrar escrito %s en archivo '%s'"
 
-#: builtin/index-pack.c:1462
+#: builtin/index-pack.c:1503
 msgid "error while closing pack file"
 msgstr "error mientras se cierra el archivo paquete"
 
-#: builtin/index-pack.c:1476
+#: builtin/index-pack.c:1517
 msgid "cannot store pack file"
 msgstr "no se puede guardar el archivo paquete"
 
-#: builtin/index-pack.c:1484
+#: builtin/index-pack.c:1525
 msgid "cannot store index file"
 msgstr "no se puede guardar el archivo índice"
 
-#: builtin/index-pack.c:1528 builtin/pack-objects.c:2912
+#: builtin/index-pack.c:1534
+msgid "cannot store reverse index file"
+msgstr "no se puede almacenar el archivo de índice inverso"
+
+#: builtin/index-pack.c:1580 builtin/pack-objects.c:2952
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "mal pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1592
+#: builtin/index-pack.c:1650
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "No se puede abrir el archivo paquete existente '%s'"
 
-#: builtin/index-pack.c:1594
+#: builtin/index-pack.c:1652
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "No se puede abrir el índice del archivo paquete para '%s'"
 
-#: builtin/index-pack.c:1642
+#: builtin/index-pack.c:1700
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "no delta: %d objeto"
 msgstr[1] "no delta: %d objetos"
 
-#: builtin/index-pack.c:1649
+#: builtin/index-pack.c:1707
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "largo de cadena = %d: %lu objeto"
 msgstr[1] "largo de cadena = %d: %lu objetos"
 
-#: builtin/index-pack.c:1689
+#: builtin/index-pack.c:1765
 msgid "Cannot come back to cwd"
 msgstr "No se puede regresar a cwd"
 
-#: builtin/index-pack.c:1738 builtin/index-pack.c:1741
-#: builtin/index-pack.c:1757 builtin/index-pack.c:1761
+#: builtin/index-pack.c:1819 builtin/index-pack.c:1822
+#: builtin/index-pack.c:1838 builtin/index-pack.c:1842
 #, c-format
 msgid "bad %s"
 msgstr "mal %s"
 
-#: builtin/index-pack.c:1767 builtin/init-db.c:392 builtin/init-db.c:621
+#: builtin/index-pack.c:1848 builtin/init-db.c:392 builtin/init-db.c:625
 #, c-format
 msgid "unknown hash algorithm '%s'"
 msgstr "algoritmo hash desconocido '%s'"
 
-#: builtin/index-pack.c:1782
+#: builtin/index-pack.c:1867
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin no puede ser usada sin --stdin"
 
-#: builtin/index-pack.c:1784
+#: builtin/index-pack.c:1869
 msgid "--stdin requires a git repository"
 msgstr "--stdin requiere un repositorio git"
 
-#: builtin/index-pack.c:1786
+#: builtin/index-pack.c:1871
 msgid "--object-format cannot be used with --stdin"
 msgstr "--object-format no se puede usar con --stdin"
 
-#: builtin/index-pack.c:1792
+#: builtin/index-pack.c:1886
 msgid "--verify with no packfile name given"
 msgstr "--verify no recibió ningún nombre de archivo de paquete"
 
-#: builtin/index-pack.c:1840 builtin/unpack-objects.c:582
+#: builtin/index-pack.c:1956 builtin/unpack-objects.c:582
 msgid "fsck error in pack objects"
 msgstr "error de fsck en objetos paquete"
 
-#: builtin/init-db.c:63
+#: builtin/init-db.c:64
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "no se pudo definir template '%s'"
 
-#: builtin/init-db.c:68
+#: builtin/init-db.c:69
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "no se puede abrir directorio '%s'"
 
-#: builtin/init-db.c:80
+#: builtin/init-db.c:81
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "no se puede leer link '%s'"
 
-#: builtin/init-db.c:82
+#: builtin/init-db.c:83
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "no se puede crear symlink '%s' '%s'"
 
-#: builtin/init-db.c:88
+#: builtin/init-db.c:89
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "no se puede copiar '%s' a '%s'"
 
-#: builtin/init-db.c:92
+#: builtin/init-db.c:93
 #, c-format
 msgid "ignoring template %s"
 msgstr "ignorando template %s"
 
-#: builtin/init-db.c:123
+#: builtin/init-db.c:124
 #, c-format
 msgid "templates not found in %s"
 msgstr "template no encontrado en %s"
 
-#: builtin/init-db.c:138
+#: builtin/init-db.c:139
 #, c-format
 msgid "not copying templates from '%s': %s"
 msgstr "no se copian templates de '%s': %s"
 
-#: builtin/init-db.c:276
+#: builtin/init-db.c:275
 #, c-format
 msgid "invalid initial branch name: '%s'"
 msgstr "nombre de rama inicial inválido: '%s'"
 
-#: builtin/init-db.c:368
+#: builtin/init-db.c:367
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "no es posible manejar el tipo de archivo %d"
 
-#: builtin/init-db.c:371
+#: builtin/init-db.c:370
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "no se puede mover %s a %s"
@@ -15586,32 +16432,32 @@
 msgid "%s already exists"
 msgstr "%s ya existe"
 
-#: builtin/init-db.c:444
+#: builtin/init-db.c:445
 #, c-format
 msgid "re-init: ignored --initial-branch=%s"
 msgstr "re-init: ignorando --initial-branch=%s"
 
-#: builtin/init-db.c:475
+#: builtin/init-db.c:476
 #, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr "Reinicializado el repositorio Git compartido existente en %s%s\n"
 
-#: builtin/init-db.c:476
+#: builtin/init-db.c:477
 #, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr "Reinicializado el repositorio Git existente en %s%s\n"
 
-#: builtin/init-db.c:480
+#: builtin/init-db.c:481
 #, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr "Inicializado repositorio Git compartido vacío en %s%s\n"
 
-#: builtin/init-db.c:481
+#: builtin/init-db.c:482
 #, c-format
 msgid "Initialized empty Git repository in %s%s\n"
 msgstr "Inicializado repositorio Git vacío en %s%s\n"
 
-#: builtin/init-db.c:530
+#: builtin/init-db.c:531
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -15619,38 +16465,42 @@
 "git init [-q | --quiet] [--bare] [--template=<directorio-template>] [--"
 "shared[=<permisos>]] [<directorio>]"
 
-#: builtin/init-db.c:556
+#: builtin/init-db.c:557
 msgid "permissions"
 msgstr "permisos"
 
-#: builtin/init-db.c:557
+#: builtin/init-db.c:558
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr ""
 "especifica que el repositorio de git será compartido entre varios usuarios"
 
-#: builtin/init-db.c:563
+#: builtin/init-db.c:564
 msgid "override the name of the initial branch"
 msgstr "sobrescribir el nombre de la rama inicial"
 
-#: builtin/init-db.c:564
+#: builtin/init-db.c:565 builtin/verify-pack.c:74
 msgid "hash"
 msgstr "hash"
 
-#: builtin/init-db.c:565 builtin/show-index.c:22
+#: builtin/init-db.c:566 builtin/show-index.c:22 builtin/verify-pack.c:75
 msgid "specify the hash algorithm to use"
 msgstr "especificar el algoritmo hash a usar"
 
-#: builtin/init-db.c:598 builtin/init-db.c:603
+#: builtin/init-db.c:573
+msgid "--separate-git-dir and --bare are mutually exclusive"
+msgstr "--separate-git-dir y --bare son mutuamente excluyentes"
+
+#: builtin/init-db.c:602 builtin/init-db.c:607
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "no se pude crear directorio %s"
 
-#: builtin/init-db.c:607
+#: builtin/init-db.c:611 builtin/init-db.c:666
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "no se puede aplicar chdir a %s"
 
-#: builtin/init-db.c:634
+#: builtin/init-db.c:638
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -15659,11 +16509,15 @@
 "%s (o --work-tree=<directorio>) no se permite sin especificar %s (o --git-"
 "dir=<directorio>)"
 
-#: builtin/init-db.c:662
+#: builtin/init-db.c:690
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "No se puede acceder al árbol de trabajo '%s'"
 
+#: builtin/init-db.c:695
+msgid "--separate-git-dir incompatible with bare repository"
+msgstr "--separate-git-dir incompatible con el repositorio desnudo"
+
 #: builtin/interpret-trailers.c:16
 msgid ""
 "git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
@@ -15728,126 +16582,130 @@
 msgid "no input file given for in-place editing"
 msgstr "no se entregó archivo de entrada para edición en lugar"
 
-#: builtin/log.c:57
+#: builtin/log.c:59
 msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
 msgstr "git log [<opciones>] [<rango-de-revisión>] [[--] <ruta>...]"
 
-#: builtin/log.c:58
+#: builtin/log.c:60
 msgid "git show [<options>] <object>..."
 msgstr "git show [<opciones>] <objeto>..."
 
-#: builtin/log.c:111
+#: builtin/log.c:113
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "opción --decorate inválida: %s"
 
-#: builtin/log.c:178
+#: builtin/log.c:180
 msgid "show source"
 msgstr "mostrar fuente"
 
-#: builtin/log.c:179
-msgid "Use mail map file"
-msgstr "Usar archivo de mapa de mail"
+#: builtin/log.c:181
+msgid "use mail map file"
+msgstr "usar archivo de mapa de mail"
 
-#: builtin/log.c:182
+#: builtin/log.c:184
 msgid "only decorate refs that match <pattern>"
 msgstr "solo decorar refs que concuerden con <patrón>"
 
-#: builtin/log.c:184
+#: builtin/log.c:186
 msgid "do not decorate refs that match <pattern>"
 msgstr "no decorar refs que concuerden con <patrón>"
 
-#: builtin/log.c:185
+#: builtin/log.c:187
 msgid "decorate options"
 msgstr "opciones de decorado"
 
-#: builtin/log.c:188
-msgid "Process line range n,m in file, counting from 1"
-msgstr "Procesar rango de líneas n,m en archivo, contando desde 1"
+#: builtin/log.c:190
+msgid ""
+"trace the evolution of line range <start>,<end> or function :<funcname> in "
+"<file>"
+msgstr ""
+"rastrear la evolución del rango de línea <inicio>, <fin> o función: <nombre-"
+"funcion> en <archivo>"
 
-#: builtin/log.c:298
+#: builtin/log.c:213
+msgid "-L<range>:<file> cannot be used with pathspec"
+msgstr "-L<rango>:<archivo> no se puede usar con pathspec"
+
+#: builtin/log.c:303
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Salida final: %d %s\n"
 
-#: builtin/log.c:556
+#: builtin/log.c:566
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: mal archivo"
 
-#: builtin/log.c:571 builtin/log.c:666
+#: builtin/log.c:581 builtin/log.c:671
 #, c-format
 msgid "could not read object %s"
 msgstr "no se pudo leer objeto %s"
 
-#: builtin/log.c:691
+#: builtin/log.c:696
 #, c-format
 msgid "unknown type: %d"
 msgstr "tipo desconocido: %d"
 
-#: builtin/log.c:835
+#: builtin/log.c:841
 #, c-format
 msgid "%s: invalid cover from description mode"
 msgstr "%s: modo cover from description inválido"
 
-#: builtin/log.c:842
+#: builtin/log.c:848
 msgid "format.headers without value"
 msgstr "formate.headers. sin valor"
 
-#: builtin/log.c:957
-msgid "name of output directory is too long"
-msgstr "nombre del directorio de salida es muy largo"
-
-#: builtin/log.c:973
+#: builtin/log.c:977
 #, c-format
 msgid "cannot open patch file %s"
 msgstr "no se puede abrir archivo patch %s"
 
-#: builtin/log.c:990
+#: builtin/log.c:994
 msgid "need exactly one range"
 msgstr "necesita exactamente un rango"
 
-#: builtin/log.c:1000
+#: builtin/log.c:1004
 msgid "not a range"
 msgstr "no es un rango"
 
-#: builtin/log.c:1164
+#: builtin/log.c:1168
 msgid "cover letter needs email format"
 msgstr "letras de portada necesita formato email"
 
-#: builtin/log.c:1170
+#: builtin/log.c:1174
 msgid "failed to create cover-letter file"
 msgstr "falló al crear los archivos cover-letter"
 
-#: builtin/log.c:1249
+#: builtin/log.c:1261
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "insano in-reply-to: %s"
 
-#: builtin/log.c:1276
+#: builtin/log.c:1288
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<opciones>] [<desde> | <rango-de-revisiones>]"
 
-#: builtin/log.c:1334
+#: builtin/log.c:1346
 msgid "two output directories?"
 msgstr "¿dos directorios de salida?"
 
-#: builtin/log.c:1445 builtin/log.c:2217 builtin/log.c:2219 builtin/log.c:2231
+#: builtin/log.c:1497 builtin/log.c:2317 builtin/log.c:2319 builtin/log.c:2331
 #, c-format
 msgid "unknown commit %s"
 msgstr "commit desconocido %s"
 
-#: builtin/log.c:1455 builtin/replace.c:58 builtin/replace.c:207
+#: builtin/log.c:1508 builtin/replace.c:58 builtin/replace.c:207
 #: builtin/replace.c:210
 #, c-format
 msgid "failed to resolve '%s' as a valid ref"
 msgstr "falló al resolver '%s' como ref válida"
 
-#: builtin/log.c:1460
+#: builtin/log.c:1517
 msgid "could not find exact merge base"
 msgstr "no se pudo encontrar una base de fusión exacta"
 
-#: builtin/log.c:1464
+#: builtin/log.c:1527
 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"
@@ -15859,281 +16717,290 @@
 "O puedes especificar un commit base mediante --base=<id-commit-base> "
 "manualmente"
 
-#: builtin/log.c:1484
+#: builtin/log.c:1550
 msgid "failed to find exact merge base"
 msgstr "falló al encontrar una base de fusión exacta"
 
-#: builtin/log.c:1495
+#: builtin/log.c:1567
 msgid "base commit should be the ancestor of revision list"
 msgstr "el commit base debe ser el ancestro de la lista de revisión"
 
-#: builtin/log.c:1499
+#: builtin/log.c:1577
 msgid "base commit shouldn't be in revision list"
 msgstr "el commit base no debe estar en la lista de revisión"
 
-#: builtin/log.c:1552
+#: builtin/log.c:1635
 msgid "cannot get patch id"
 msgstr "no se puede obtener id de patch"
 
-#: builtin/log.c:1604
-msgid "failed to infer range-diff ranges"
-msgstr "falló al inferir rangos range-diff"
+#: builtin/log.c:1692
+msgid "failed to infer range-diff origin of current series"
+msgstr "falló al inferir rangos range-diff de la serie actual"
 
-#: builtin/log.c:1650
+#: builtin/log.c:1694
+#, c-format
+msgid "using '%s' as range-diff origin of current series"
+msgstr "usando '%s' como origen de diferencia de rango de la serie actual"
+
+#: builtin/log.c:1738
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "use [PATCH n/m] incluso con un único parche"
 
-#: builtin/log.c:1653
+#: builtin/log.c:1741
 msgid "use [PATCH] even with multiple patches"
 msgstr "use [PATCH] incluso con múltiples parches"
 
-#: builtin/log.c:1657
+#: builtin/log.c:1745
 msgid "print patches to standard out"
 msgstr "mostrar parches en standard out"
 
-#: builtin/log.c:1659
+#: builtin/log.c:1747
 msgid "generate a cover letter"
 msgstr "generar letra de cover"
 
-#: builtin/log.c:1661
+#: builtin/log.c:1749
 msgid "use simple number sequence for output file names"
 msgstr ""
 "usar una secuencia simple de números para salida de nombres de archivos"
 
-#: builtin/log.c:1662
+#: builtin/log.c:1750
 msgid "sfx"
 msgstr "sfx"
 
-#: builtin/log.c:1663
+#: builtin/log.c:1751
 msgid "use <sfx> instead of '.patch'"
 msgstr "use <sfx> en lugar de '.patch'"
 
-#: builtin/log.c:1665
+#: builtin/log.c:1753
 msgid "start numbering patches at <n> instead of 1"
 msgstr "comenzar a numerar los parches desde <n> en lugar de 1"
 
-#: builtin/log.c:1667
+#: builtin/log.c:1755
 msgid "mark the series as Nth re-roll"
 msgstr "marcar las series como Nth re-roll"
 
-#: builtin/log.c:1669
-msgid "Use [RFC PATCH] instead of [PATCH]"
-msgstr "Use [RFC PATCH] en lugar de [PATCH]"
+#: builtin/log.c:1757
+msgid "max length of output filename"
+msgstr "tamaño máximo de nombre de archivo resultante"
 
-#: builtin/log.c:1672
+#: builtin/log.c:1759
+msgid "use [RFC PATCH] instead of [PATCH]"
+msgstr "use [RFC PATCH] en lugar de [PATCH]"
+
+#: builtin/log.c:1762
 msgid "cover-from-description-mode"
 msgstr "modo-cover-from-description"
 
-#: builtin/log.c:1673
+#: builtin/log.c:1763
 msgid "generate parts of a cover letter based on a branch's description"
 msgstr ""
 "genera partes de una carta de presentación basado en la descripción de la "
 "rama"
 
-#: builtin/log.c:1675
-msgid "Use [<prefix>] instead of [PATCH]"
-msgstr "Use [<prefijo>] en lugar de [PATCH]"
+#: builtin/log.c:1765
+msgid "use [<prefix>] instead of [PATCH]"
+msgstr "use [<prefijo>] en lugar de [PATCH]"
 
-#: builtin/log.c:1678
+#: builtin/log.c:1768
 msgid "store resulting files in <dir>"
 msgstr "guardar archivos resultantes en <dir>"
 
-#: builtin/log.c:1681
+#: builtin/log.c:1771
 msgid "don't strip/add [PATCH]"
 msgstr "no cortar/agregar [PATCH]"
 
-#: builtin/log.c:1684
+#: builtin/log.c:1774
 msgid "don't output binary diffs"
 msgstr "no mostrar diffs binarios"
 
-#: builtin/log.c:1686
+#: builtin/log.c:1776
 msgid "output all-zero hash in From header"
 msgstr "salida como hash de todos-ceros en la cabecera From"
 
-#: builtin/log.c:1688
+#: builtin/log.c:1778
 msgid "don't include a patch matching a commit upstream"
 msgstr "no incluya un parche que coincida con un commit en upstream"
 
-#: builtin/log.c:1690
+#: builtin/log.c:1780
 msgid "show patch format instead of default (patch + stat)"
 msgstr "mostrar formato de parche en lugar del default (parche + stat)"
 
-#: builtin/log.c:1692
+#: builtin/log.c:1782
 msgid "Messaging"
 msgstr "Mensajeando"
 
-#: builtin/log.c:1693
+#: builtin/log.c:1783
 msgid "header"
 msgstr "cabezal"
 
-#: builtin/log.c:1694
+#: builtin/log.c:1784
 msgid "add email header"
 msgstr "agregar cabecera email"
 
-#: builtin/log.c:1695 builtin/log.c:1696
+#: builtin/log.c:1785 builtin/log.c:1786
 msgid "email"
 msgstr "email"
 
-#: builtin/log.c:1695
+#: builtin/log.c:1785
 msgid "add To: header"
 msgstr "agregar cabecera To:"
 
-#: builtin/log.c:1696
+#: builtin/log.c:1786
 msgid "add Cc: header"
 msgstr "agregar cabecera Cc:"
 
-#: builtin/log.c:1697
+#: builtin/log.c:1787
 msgid "ident"
 msgstr "ident"
 
-#: builtin/log.c:1698
+#: builtin/log.c:1788
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "configurar dirección From a <ident> ( o identidad de committer si está "
 "ausente)"
 
-#: builtin/log.c:1700
+#: builtin/log.c:1790
 msgid "message-id"
 msgstr "id de mensaje"
 
-#: builtin/log.c:1701
+#: builtin/log.c:1791
 msgid "make first mail a reply to <message-id>"
 msgstr "hacer primer mail una respuesta a <id de mensaje>"
 
-#: builtin/log.c:1702 builtin/log.c:1705
+#: builtin/log.c:1792 builtin/log.c:1795
 msgid "boundary"
 msgstr "límite"
 
-#: builtin/log.c:1703
+#: builtin/log.c:1793
 msgid "attach the patch"
 msgstr "adjuntar el parche"
 
-#: builtin/log.c:1706
+#: builtin/log.c:1796
 msgid "inline the patch"
 msgstr "poner el parche en línea"
 
-#: builtin/log.c:1710
+#: builtin/log.c:1800
 msgid "enable message threading, styles: shallow, deep"
 msgstr "habilitar hilos de mensajes, estilos: superficial, profundo"
 
-#: builtin/log.c:1712
+#: builtin/log.c:1802
 msgid "signature"
 msgstr "firma"
 
-#: builtin/log.c:1713
+#: builtin/log.c:1803
 msgid "add a signature"
 msgstr "agregar una firma"
 
-#: builtin/log.c:1714
+#: builtin/log.c:1804
 msgid "base-commit"
 msgstr "commit-base"
 
-#: builtin/log.c:1715
+#: builtin/log.c:1805
 msgid "add prerequisite tree info to the patch series"
 msgstr ""
 "agregar información de árbol de requisitos previos a la serie de parches"
 
-#: builtin/log.c:1717
+#: builtin/log.c:1808
 msgid "add a signature from a file"
 msgstr "agregar una firma de un archivo"
 
-#: builtin/log.c:1718
+#: builtin/log.c:1809
 msgid "don't print the patch filenames"
 msgstr "no mostrar los nombres de archivos de los parches"
 
-#: builtin/log.c:1720
+#: builtin/log.c:1811
 msgid "show progress while generating patches"
 msgstr "mostrar medidor de progreso mientras se generan los parches"
 
-#: builtin/log.c:1722
+#: builtin/log.c:1813
 msgid "show changes against <rev> in cover letter or single patch"
 msgstr "muestra cambios contra <rev> en cover letter o en un solo parche"
 
-#: builtin/log.c:1725
+#: builtin/log.c:1816
 msgid "show changes against <refspec> in cover letter or single patch"
 msgstr "muestra cambios contra <refspec> en cover letter o en un solo parche"
 
-#: builtin/log.c:1727
+#: builtin/log.c:1818
 msgid "percentage by which creation is weighted"
 msgstr "porcentaje por el cual la creación es pesada"
 
-#: builtin/log.c:1812
+#: builtin/log.c:1904
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "línea de identificación inválida: %s"
 
-#: builtin/log.c:1827
+#: builtin/log.c:1919
 msgid "-n and -k are mutually exclusive"
 msgstr "-n y -k son mutuamente exclusivas"
 
-#: builtin/log.c:1829
+#: builtin/log.c:1921
 msgid "--subject-prefix/--rfc and -k are mutually exclusive"
 msgstr "--subject-prefix/--rfc y -k son mutuamente exclusivos"
 
-#: builtin/log.c:1837
+#: builtin/log.c:1929
 msgid "--name-only does not make sense"
 msgstr "--name-only no tiene sentido"
 
-#: builtin/log.c:1839
+#: builtin/log.c:1931
 msgid "--name-status does not make sense"
 msgstr "--name-status no tiene sentido"
 
-#: builtin/log.c:1841
+#: builtin/log.c:1933
 msgid "--check does not make sense"
 msgstr "--check no tiene sentido"
 
-#: builtin/log.c:1874
-msgid "standard output, or directory, which one?"
-msgstr "¿salida standard, o directorio, cual?"
+#: builtin/log.c:1955
+msgid "--stdout, --output, and --output-directory are mutually exclusive"
+msgstr "--stdout, --output, and --output-directory son mutuamente exclusivas"
 
-#: builtin/log.c:1978
+#: builtin/log.c:2078
 msgid "--interdiff requires --cover-letter or single patch"
 msgstr "--interdiff requiere --cover-letter o un parche único"
 
-#: builtin/log.c:1982
+#: builtin/log.c:2082
 msgid "Interdiff:"
 msgstr "Interdiff:"
 
-#: builtin/log.c:1983
+#: builtin/log.c:2083
 #, c-format
 msgid "Interdiff against v%d:"
 msgstr "Interdiff contra v%d:"
 
-#: builtin/log.c:1989
+#: builtin/log.c:2089
 msgid "--creation-factor requires --range-diff"
 msgstr "--creation-factor requiere --range-diff"
 
-#: builtin/log.c:1993
+#: builtin/log.c:2093
 msgid "--range-diff requires --cover-letter or single patch"
 msgstr "--range-diff requiere --cover-letter o parche único"
 
-#: builtin/log.c:2001
+#: builtin/log.c:2101
 msgid "Range-diff:"
 msgstr "Range-diff:"
 
-#: builtin/log.c:2002
+#: builtin/log.c:2102
 #, c-format
 msgid "Range-diff against v%d:"
 msgstr "Range-diff contra v%d:"
 
-#: builtin/log.c:2013
+#: builtin/log.c:2113
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "no se puede leer la firma del archivo '%s'"
 
-#: builtin/log.c:2049
+#: builtin/log.c:2149
 msgid "Generating patches"
 msgstr "Generando parches"
 
-#: builtin/log.c:2093
+#: builtin/log.c:2193
 msgid "failed to create output files"
 msgstr "falló al crear los archivos de salida"
 
-#: builtin/log.c:2152
+#: builtin/log.c:2252
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<upstream> [<head> [<límite>]]]"
 
-#: builtin/log.c:2206
+#: builtin/log.c:2306
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -16141,114 +17008,118 @@
 "No se pudo encontrar una rama remota rastreada, por favor especifique "
 "<upstream> manualmente.\n"
 
-#: builtin/ls-files.c:471
+#: builtin/ls-files.c:486
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<opciones>] [<archivo>...]"
 
-#: builtin/ls-files.c:527
+#: builtin/ls-files.c:542
 msgid "identify the file status with tags"
 msgstr "identifique el estado del archivo con tags"
 
-#: builtin/ls-files.c:529
+#: builtin/ls-files.c:544
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "usar letras minúsculas para archivos 'asumidos sin cambios'"
 
-#: builtin/ls-files.c:531
+#: builtin/ls-files.c:546
 msgid "use lowercase letters for 'fsmonitor clean' files"
 msgstr "usar letras minúsculas para archivos de 'fsmonitor clean'"
 
-#: builtin/ls-files.c:533
+#: builtin/ls-files.c:548
 msgid "show cached files in the output (default)"
 msgstr "mostrar archivos en caché en la salida (default)"
 
-#: builtin/ls-files.c:535
+#: builtin/ls-files.c:550
 msgid "show deleted files in the output"
 msgstr "mostrar archivos borrados en la salida"
 
-#: builtin/ls-files.c:537
+#: builtin/ls-files.c:552
 msgid "show modified files in the output"
 msgstr "mostrar archivos modificados en la salida"
 
-#: builtin/ls-files.c:539
+#: builtin/ls-files.c:554
 msgid "show other files in the output"
 msgstr "mostrar otros archivos en la salida"
 
-#: builtin/ls-files.c:541
+#: builtin/ls-files.c:556
 msgid "show ignored files in the output"
 msgstr "mostrar archivos ignorados en la salida"
 
-#: builtin/ls-files.c:544
+#: builtin/ls-files.c:559
 msgid "show staged contents' object name in the output"
 msgstr ""
 "mostrar contenido de nombres de objetos en el área de stage en la salida"
 
-#: builtin/ls-files.c:546
+#: builtin/ls-files.c:561
 msgid "show files on the filesystem that need to be removed"
 msgstr "mostrar archivos en el filesystem que necesitan ser borrados"
 
-#: builtin/ls-files.c:548
+#: builtin/ls-files.c:563
 msgid "show 'other' directories' names only"
 msgstr "mostrar solo nombres de 'directorios otros'"
 
-#: builtin/ls-files.c:550
+#: builtin/ls-files.c:565
 msgid "show line endings of files"
 msgstr "mostrar finales de línea de archivos"
 
-#: builtin/ls-files.c:552
+#: builtin/ls-files.c:567
 msgid "don't show empty directories"
 msgstr "no mostrar directorios vacíos"
 
-#: builtin/ls-files.c:555
+#: builtin/ls-files.c:570
 msgid "show unmerged files in the output"
 msgstr "mostrar archivos no fusionados en la salida"
 
-#: builtin/ls-files.c:557
+#: builtin/ls-files.c:572
 msgid "show resolve-undo information"
 msgstr "mostrar información resolver-deshacer"
 
-#: builtin/ls-files.c:559
+#: builtin/ls-files.c:574
 msgid "skip files matching pattern"
 msgstr "saltar archivos que concuerden con el patrón"
 
-#: builtin/ls-files.c:562
+#: builtin/ls-files.c:577
 msgid "exclude patterns are read from <file>"
 msgstr "excluir patrones leídos de <archivo>"
 
-#: builtin/ls-files.c:565
+#: builtin/ls-files.c:580
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr ""
 "leer patrones de exclusión de manera adicional por directorio en <archivo>"
 
-#: builtin/ls-files.c:567
+#: builtin/ls-files.c:582
 msgid "add the standard git exclusions"
 msgstr "agregar las exclusiones standard de git"
 
-#: builtin/ls-files.c:571
+#: builtin/ls-files.c:586
 msgid "make the output relative to the project top directory"
 msgstr "hacer la salida relativa al directorio principal del proyecto"
 
-#: builtin/ls-files.c:574
+#: builtin/ls-files.c:589
 msgid "recurse through submodules"
 msgstr "recurrir a través de submódulos"
 
-#: builtin/ls-files.c:576
+#: builtin/ls-files.c:591
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "si cualquier <archivo> no está en el índice, tratarlo como un error"
 
-#: builtin/ls-files.c:577
+#: builtin/ls-files.c:592
 msgid "tree-ish"
 msgstr "árbol-ismo"
 
-#: builtin/ls-files.c:578
+#: builtin/ls-files.c:593
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 "fingir que las rutas han sido borradas ya que todavía hay <árbol-ismos> "
 "presentes"
 
-#: builtin/ls-files.c:580
+#: builtin/ls-files.c:595
 msgid "show debugging data"
 msgstr "mostrar data de debug"
 
+#: builtin/ls-files.c:597
+msgid "suppress duplicate entries"
+msgstr "suprimir entradas duplicadas"
+
 #: builtin/ls-remote.c:9
 msgid ""
 "git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
@@ -16259,39 +17130,39 @@
 "                     [-q | --quiet] [--exit-code] [--get-url]\n"
 "                     [--symref] [<repositorio> [<refs>...]]"
 
-#: builtin/ls-remote.c:59
+#: builtin/ls-remote.c:60
 msgid "do not print remote URL"
 msgstr "no mostrar el URL remoto"
 
-#: builtin/ls-remote.c:60 builtin/ls-remote.c:62 builtin/rebase.c:1384
+#: builtin/ls-remote.c:61 builtin/ls-remote.c:63 builtin/rebase.c:1404
 msgid "exec"
 msgstr "ejecutar"
 
-#: builtin/ls-remote.c:61 builtin/ls-remote.c:63
+#: builtin/ls-remote.c:62 builtin/ls-remote.c:64
 msgid "path of git-upload-pack on the remote host"
 msgstr "ruta de git-upload-pack en el host remoto"
 
-#: builtin/ls-remote.c:65
+#: builtin/ls-remote.c:66
 msgid "limit to tags"
 msgstr "limitar a tags"
 
-#: builtin/ls-remote.c:66
+#: builtin/ls-remote.c:67
 msgid "limit to heads"
 msgstr "limitar a heads"
 
-#: builtin/ls-remote.c:67
+#: builtin/ls-remote.c:68
 msgid "do not show peeled tags"
 msgstr "no mostrar tags pelados"
 
-#: builtin/ls-remote.c:69
+#: builtin/ls-remote.c:70
 msgid "take url.<base>.insteadOf into account"
 msgstr "tomar url.<base>.insteadOf en cuenta"
 
-#: builtin/ls-remote.c:72
+#: builtin/ls-remote.c:73
 msgid "exit with exit code 2 if no matching refs are found"
 msgstr "salir con código de salida 2 si no se encuentran refs que concuerden"
 
-#: builtin/ls-remote.c:75
+#: builtin/ls-remote.c:76
 msgid "show underlying ref in addition to the object pointed by it"
 msgstr "mostrar ref subyacente en adición al objeto apuntado por él"
 
@@ -16448,193 +17319,193 @@
 msgid "Merging %s with %s\n"
 msgstr "Fusionando %s con %s\n"
 
-#: builtin/merge.c:56
+#: builtin/merge.c:58
 msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<opciones>] [<commit>...]"
 
-#: builtin/merge.c:57
+#: builtin/merge.c:59
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:58
+#: builtin/merge.c:60
 msgid "git merge --continue"
 msgstr "git merge --continue"
 
-#: builtin/merge.c:121
+#: builtin/merge.c:123
 msgid "switch `m' requires a value"
 msgstr "cambiar `m' requiere un valor"
 
-#: builtin/merge.c:144
+#: builtin/merge.c:146
 #, c-format
 msgid "option `%s' requires a value"
 msgstr "opción `%s' requiere un valor"
 
-#: builtin/merge.c:190
+#: builtin/merge.c:199
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "No se pudo encontrar estrategia de fusión '%s'.\n"
 
-#: builtin/merge.c:191
+#: builtin/merge.c:200
 #, c-format
 msgid "Available strategies are:"
 msgstr "Estrategias disponibles son:"
 
-#: builtin/merge.c:196
+#: builtin/merge.c:205
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Estrategias personalizadas disponibles son:"
 
-#: builtin/merge.c:247 builtin/pull.c:133
+#: builtin/merge.c:256 builtin/pull.c:133
 msgid "do not show a diffstat at the end of the merge"
 msgstr "no mostrar un diffstat al final de la fusión"
 
-#: builtin/merge.c:250 builtin/pull.c:136
+#: builtin/merge.c:259 builtin/pull.c:136
 msgid "show a diffstat at the end of the merge"
 msgstr "mostrar un diffstat al final de la fusión"
 
-#: builtin/merge.c:251 builtin/pull.c:139
+#: builtin/merge.c:260 builtin/pull.c:139
 msgid "(synonym to --stat)"
 msgstr "(sinónimo para --stat)"
 
-#: builtin/merge.c:253 builtin/pull.c:142
+#: builtin/merge.c:262 builtin/pull.c:142
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "agregar (como máximo <n>) entradas del shortlog al mensaje del commit de "
 "fusión"
 
-#: builtin/merge.c:256 builtin/pull.c:148
+#: builtin/merge.c:265 builtin/pull.c:148
 msgid "create a single commit instead of doing a merge"
 msgstr "crear un commit único en lugar de hacer una fusión"
 
-#: builtin/merge.c:258 builtin/pull.c:151
+#: builtin/merge.c:267 builtin/pull.c:151
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "realizar un commit si la fusión es exitosa (default)"
 
-#: builtin/merge.c:260 builtin/pull.c:154
+#: builtin/merge.c:269 builtin/pull.c:154
 msgid "edit message before committing"
 msgstr "editar mensaje antes de realizar commit"
 
-#: builtin/merge.c:262
+#: builtin/merge.c:271
 msgid "allow fast-forward (default)"
 msgstr "permitir fast-forwars (default)"
 
-#: builtin/merge.c:264 builtin/pull.c:161
+#: builtin/merge.c:273 builtin/pull.c:161
 msgid "abort if fast-forward is not possible"
 msgstr "abortar si fast-forward no es posible"
 
-#: builtin/merge.c:268 builtin/pull.c:164
+#: builtin/merge.c:277 builtin/pull.c:164
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "verificar que el commit nombrado tiene una firma GPG válida"
 
-#: builtin/merge.c:269 builtin/notes.c:787 builtin/pull.c:168
-#: builtin/rebase.c:527 builtin/rebase.c:1398 builtin/revert.c:114
+#: builtin/merge.c:278 builtin/notes.c:787 builtin/pull.c:168
+#: builtin/rebase.c:541 builtin/rebase.c:1418 builtin/revert.c:114
 msgid "strategy"
 msgstr "estrategia"
 
-#: builtin/merge.c:270 builtin/pull.c:169
+#: builtin/merge.c:279 builtin/pull.c:169
 msgid "merge strategy to use"
 msgstr "estrategia de fusión para usar"
 
-#: builtin/merge.c:271 builtin/pull.c:172
+#: builtin/merge.c:280 builtin/pull.c:172
 msgid "option=value"
 msgstr "opción=valor"
 
-#: builtin/merge.c:272 builtin/pull.c:173
+#: builtin/merge.c:281 builtin/pull.c:173
 msgid "option for selected merge strategy"
 msgstr "opción para la estrategia de fusión seleccionada"
 
-#: builtin/merge.c:274
+#: builtin/merge.c:283
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr "fusionar mensaje de commit (para una fusión no fast-forward)"
 
-#: builtin/merge.c:281
+#: builtin/merge.c:290
 msgid "abort the current in-progress merge"
 msgstr "abortar la fusión en progreso actual"
 
-#: builtin/merge.c:283
+#: builtin/merge.c:292
 msgid "--abort but leave index and working tree alone"
 msgstr "--abort pero deja el índice y el árbol de trabajo solos"
 
-#: builtin/merge.c:285
+#: builtin/merge.c:294
 msgid "continue the current in-progress merge"
 msgstr "continuar la fusión en progreso actual"
 
-#: builtin/merge.c:287 builtin/pull.c:180
+#: builtin/merge.c:296 builtin/pull.c:180
 msgid "allow merging unrelated histories"
 msgstr "permitir fusionar historias no relacionadas"
 
-#: builtin/merge.c:294
+#: builtin/merge.c:303
 msgid "bypass pre-merge-commit and commit-msg hooks"
 msgstr "hacer un bypass a hooks pre-merge-commit y commit-msg"
 
-#: builtin/merge.c:311
+#: builtin/merge.c:320
 msgid "could not run stash."
 msgstr "no se pudo ejecutar stash."
 
-#: builtin/merge.c:316
+#: builtin/merge.c:325
 msgid "stash failed"
 msgstr "stash falló"
 
-#: builtin/merge.c:321
+#: builtin/merge.c:330
 #, c-format
 msgid "not a valid object: %s"
 msgstr "no es un objeto válido: %s"
 
-#: builtin/merge.c:343 builtin/merge.c:360
+#: builtin/merge.c:352 builtin/merge.c:369
 msgid "read-tree failed"
 msgstr "lectura de árbol falló"
 
-#: builtin/merge.c:390
+#: builtin/merge.c:399
 msgid " (nothing to squash)"
 msgstr " (nada para hacer squash)"
 
-#: builtin/merge.c:401
+#: builtin/merge.c:410
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Commit de squash -- no actualizando HEAD\n"
 
-#: builtin/merge.c:451
+#: builtin/merge.c:460
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "No hay mensaje de fusión -- no actualizando HEAD\n"
 
-#: builtin/merge.c:502
+#: builtin/merge.c:511
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' no apunta a ningún commit"
 
-#: builtin/merge.c:589
+#: builtin/merge.c:598
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Mal string branch.%s.mergeoptions: %s"
 
-#: builtin/merge.c:716
+#: builtin/merge.c:724
 msgid "Not handling anything other than two heads merge."
 msgstr "No manejando nada más que fusión de dos heads."
 
-#: builtin/merge.c:730
+#: builtin/merge.c:737
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Opción desconocida para merge-recursive: -X%s"
 
-#: builtin/merge.c:745
+#: builtin/merge.c:756 t/helper/test-fast-rebase.c:209
 #, c-format
 msgid "unable to write %s"
 msgstr "no es posible escribir %s"
 
-#: builtin/merge.c:797
+#: builtin/merge.c:808
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "No se puedo leer de '%s'"
 
-#: builtin/merge.c:806
+#: builtin/merge.c:817
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "No se realiza commit de la fusión; use 'git commit' para completar la "
 "fusión.\n"
 
-#: builtin/merge.c:812
+#: builtin/merge.c:823
 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"
@@ -16646,11 +17517,11 @@
 "tópico.\n"
 "\n"
 
-#: builtin/merge.c:817
+#: builtin/merge.c:828
 msgid "An empty message aborts the commit.\n"
 msgstr "Un mensaje vacío aborta el commit.\n"
 
-#: builtin/merge.c:820
+#: builtin/merge.c:831
 #, c-format
 msgid ""
 "Lines starting with '%c' will be ignored, and an empty message aborts\n"
@@ -16659,74 +17530,74 @@
 "Líneas comenzando con '%c' serán ignoradas, y un mensaje vacío aborta\n"
 " el commit.\n"
 
-#: builtin/merge.c:873
+#: builtin/merge.c:884
 msgid "Empty commit message."
 msgstr "Mensaje de commit vacío."
 
-#: builtin/merge.c:888
+#: builtin/merge.c:899
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Maravilloso.\n"
 
-#: builtin/merge.c:949
+#: builtin/merge.c:960
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "Fusión automática falló; arregle los conflictos y luego realice un commit "
 "con el resultado.\n"
 
-#: builtin/merge.c:988
+#: builtin/merge.c:999
 msgid "No current branch."
 msgstr "No rama actual."
 
-#: builtin/merge.c:990
+#: builtin/merge.c:1001
 msgid "No remote for the current branch."
 msgstr "No hay remoto para la rama actual."
 
-#: builtin/merge.c:992
+#: builtin/merge.c:1003
 msgid "No default upstream defined for the current branch."
 msgstr "Por defecto, no hay un upstream  definido para la rama actual."
 
-#: builtin/merge.c:997
+#: builtin/merge.c:1008
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "No hay rama de rastreo remoto para %s de %s"
 
-#: builtin/merge.c:1054
+#: builtin/merge.c:1065
 #, c-format
 msgid "Bad value '%s' in environment '%s'"
 msgstr "Valor erróneo '%s' en el entorno '%s'"
 
-#: builtin/merge.c:1157
+#: builtin/merge.c:1168
 #, c-format
 msgid "not something we can merge in %s: %s"
 msgstr "nada que podamos fusionar en %s: %s"
 
-#: builtin/merge.c:1191
+#: builtin/merge.c:1202
 msgid "not something we can merge"
 msgstr "nada que podamos fusionar"
 
-#: builtin/merge.c:1295
+#: builtin/merge.c:1312
 msgid "--abort expects no arguments"
 msgstr "--abort no espera argumentos"
 
-#: builtin/merge.c:1299
+#: builtin/merge.c:1316
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "No hay una fusión para abortar (falta MERGE_HEAD)"
 
-#: builtin/merge.c:1317
+#: builtin/merge.c:1334
 msgid "--quit expects no arguments"
 msgstr "--quit no espera argumentos"
 
-#: builtin/merge.c:1330
+#: builtin/merge.c:1347
 msgid "--continue expects no arguments"
 msgstr "--continue no espera argumentos"
 
-#: builtin/merge.c:1334
+#: builtin/merge.c:1351
 msgid "There is no merge in progress (MERGE_HEAD missing)."
 msgstr "No hay fusión en progreso (falta MERGE_HEAD)."
 
-#: builtin/merge.c:1350
+#: builtin/merge.c:1367
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -16734,7 +17605,7 @@
 "No has concluido la fusión (existe MERGE_HEAD).\n"
 "Por favor, realiza un commit con los cambios antes de fusionar."
 
-#: builtin/merge.c:1357
+#: builtin/merge.c:1374
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -16742,102 +17613,143 @@
 "No has concluido el cherry-pick (existe CHERRY_PICK_HEAD).\n"
 "Por favor, realiza un commit con los cambios antes de fusionar."
 
-#: builtin/merge.c:1360
+#: builtin/merge.c:1377
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "No has concluido el cherry-pick (existe CHERRY_PICK_HEAD)."
 
-#: builtin/merge.c:1374
+#: builtin/merge.c:1391
 msgid "You cannot combine --squash with --no-ff."
 msgstr "No se puede combinar --squash con --no-ff."
 
-#: builtin/merge.c:1376
+#: builtin/merge.c:1393
 msgid "You cannot combine --squash with --commit."
 msgstr "No se puede combinar --squash con --commit."
 
-#: builtin/merge.c:1392
+#: builtin/merge.c:1409
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 "No hay commit especificado y merge.defaultToUpstream no está configurado."
 
-#: builtin/merge.c:1409
+#: builtin/merge.c:1426
 msgid "Squash commit into empty head not supported yet"
 msgstr "Commit aplastado dentro de un head vacío no es soportado todavía"
 
-#: builtin/merge.c:1411
+#: builtin/merge.c:1428
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "Commit no fast-forward no tiene sentido dentro de un head vacío"
 
-#: builtin/merge.c:1416
+#: builtin/merge.c:1433
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - nada que podamos fusionar"
 
-#: builtin/merge.c:1418
+#: builtin/merge.c:1435
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Solo se puede fusionar exactamente un commit en un head vacío"
 
-#: builtin/merge.c:1499
+#: builtin/merge.c:1516
 msgid "refusing to merge unrelated histories"
 msgstr "rehusando fusionar historias no relacionadas"
 
-#: builtin/merge.c:1508
+#: builtin/merge.c:1525
 msgid "Already up to date."
 msgstr "Ya está actualizado."
 
-#: builtin/merge.c:1518
+#: builtin/merge.c:1535
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Actualizando %s..%s\n"
 
-#: builtin/merge.c:1564
+#: builtin/merge.c:1581
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Intentando fusión en índice realmente trivial...\n"
 
-#: builtin/merge.c:1571
+#: builtin/merge.c:1588
 #, c-format
 msgid "Nope.\n"
 msgstr "Nop.\n"
 
-#: builtin/merge.c:1596
+#: builtin/merge.c:1613
 msgid "Already up to date. Yeeah!"
 msgstr "Ya está actualizado. ¡Oh, yeaahh!"
 
-#: builtin/merge.c:1602
+#: builtin/merge.c:1619
 msgid "Not possible to fast-forward, aborting."
 msgstr "No es posible hacer fast-forward, abortando."
 
-#: builtin/merge.c:1630 builtin/merge.c:1695
+#: builtin/merge.c:1647 builtin/merge.c:1712
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Rebobinando el árbol a original...\n"
 
-#: builtin/merge.c:1634
+#: builtin/merge.c:1651
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Intentando estrategia de fusión %s...\n"
 
-#: builtin/merge.c:1686
+#: builtin/merge.c:1703
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Ninguna estrategia de fusión manejó la fusión.\n"
 
-#: builtin/merge.c:1688
+#: builtin/merge.c:1705
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Fusionar con estrategia %s falló.\n"
 
-#: builtin/merge.c:1697
+#: builtin/merge.c:1714
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Usando el %s para preparar resolución a mano.\n"
 
-#: builtin/merge.c:1711
+#: builtin/merge.c:1728
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
 "Fusión automática fue bien; detenida antes del commit como se solicitó\n"
 
+#: builtin/mktag.c:10
+msgid "git mktag"
+msgstr "git mktag"
+
+#: builtin/mktag.c:30
+#, c-format
+msgid "warning: tag input does not pass fsck: %s"
+msgstr "peligro: información de tag no pasa fsck: %s"
+
+#: builtin/mktag.c:41
+#, c-format
+msgid "error: tag input does not pass fsck: %s"
+msgstr "error: valor de tag no pasa fsck: %s"
+
+#: builtin/mktag.c:44
+#, c-format
+msgid "%d (FSCK_IGNORE?) should never trigger this callback"
+msgstr "%d (FSCK_IGNORE?) nunca debería activar esta devolución de llamada"
+
+#: builtin/mktag.c:59
+#, c-format
+msgid "could not read tagged object '%s'"
+msgstr "no se pudo leer objeto de tag '%s'"
+
+#: builtin/mktag.c:62
+#, c-format
+msgid "object '%s' tagged as '%s', but is a '%s' type"
+msgstr "objeto '%s' es taggeado como '%s', pero es un tipo '%s'"
+
+#: builtin/mktag.c:99
+msgid "tag on stdin did not pass our strict fsck check"
+msgstr "etiqueta en stdin no pasó nuestro estricto control fsck"
+
+#: builtin/mktag.c:102
+msgid "tag on stdin did not refer to a valid object"
+msgstr "tag en stdin no se refería a un objeto válido"
+
+#: builtin/mktag.c:105 builtin/tag.c:232
+msgid "unable to write tag file"
+msgstr "incapaz de escribir el archivo de tag"
+
 #: builtin/mktree.c:66
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -16874,7 +17786,10 @@
 "durante el repack, recolectar los pack-files de tamaño menor en un batch que "
 "es más grande que este tamaño"
 
-#: builtin/multi-pack-index.c:50 builtin/prune-packed.c:25
+#: builtin/multi-pack-index.c:50 builtin/notes.c:376 builtin/notes.c:431
+#: builtin/notes.c:509 builtin/notes.c:521 builtin/notes.c:598
+#: builtin/notes.c:665 builtin/notes.c:815 builtin/notes.c:963
+#: builtin/notes.c:985 builtin/prune-packed.c:25 builtin/tag.c:575
 msgid "too many arguments"
 msgstr "muchos argumentos"
 
@@ -16915,68 +17830,72 @@
 msgid "skip move/rename errors"
 msgstr "saltar errores de mover/renombrar"
 
-#: builtin/mv.c:169
+#: builtin/mv.c:170
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "destino '%s' no es un directorio"
 
-#: builtin/mv.c:180
+#: builtin/mv.c:181
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "Revisando cambio de nombre de '%s' a '%s'\n"
 
-#: builtin/mv.c:184
+#: builtin/mv.c:185
 msgid "bad source"
 msgstr "mala fuente"
 
-#: builtin/mv.c:187
+#: builtin/mv.c:188
 msgid "can not move directory into itself"
 msgstr "no se pude mover un directorio en sí mismo"
 
-#: builtin/mv.c:190
+#: builtin/mv.c:191
 msgid "cannot move directory over file"
 msgstr "no se puede mover un directorio dentro de un archivo"
 
-#: builtin/mv.c:199
+#: builtin/mv.c:200
 msgid "source directory is empty"
 msgstr "directorio de fuente está vacío"
 
-#: builtin/mv.c:224
+#: builtin/mv.c:225
 msgid "not under version control"
 msgstr "no se encuentra bajo control de versión"
 
 #: builtin/mv.c:227
+msgid "conflicted"
+msgstr "en conflicto"
+
+#: builtin/mv.c:230
 msgid "destination exists"
 msgstr "destino existe"
 
-#: builtin/mv.c:235
+#: builtin/mv.c:238
 #, c-format
 msgid "overwriting '%s'"
 msgstr "sobrescribiendo '%s'"
 
-#: builtin/mv.c:238
+#: builtin/mv.c:241
 msgid "Cannot overwrite"
 msgstr "No se puede sobrescribir"
 
-#: builtin/mv.c:241
+#: builtin/mv.c:244
 msgid "multiple sources for the same target"
 msgstr "múltiples fuentes para el mismo objetivo"
 
-#: builtin/mv.c:243
+#: builtin/mv.c:246
 msgid "destination directory does not exist"
 msgstr "el directorio de destino no existe"
 
-#: builtin/mv.c:250
+#: builtin/mv.c:253
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, fuente=%s, destino=%s"
 
-#: builtin/mv.c:271
+#: builtin/mv.c:274
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Renombrando %s a %s\n"
 
-#: builtin/mv.c:277 builtin/remote.c:781 builtin/repack.c:520
+#: builtin/mv.c:280 builtin/remote.c:785 builtin/repack.c:483
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "renombrando '%s' falló"
@@ -16994,8 +17913,8 @@
 msgstr "git name-rev [<opciones>] --stdin"
 
 #: builtin/name-rev.c:524
-msgid "print only names (no SHA-1)"
-msgstr "imprimir sólo nombres (sin SHA-1)"
+msgid "print only ref-based names (no object names)"
+msgstr "imprimir solo nombres basados en referencias (sin nombres de objetos)"
 
 #: builtin/name-rev.c:525
 msgid "only use tags to name the commits"
@@ -17170,7 +18089,7 @@
 msgid "the note contents have been left in %s"
 msgstr "los contenidos de nota han sido dejados en %s"
 
-#: builtin/notes.c:242 builtin/tag.c:533
+#: builtin/notes.c:242 builtin/tag.c:565
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "no se pudo abrir o leer '%s'"
@@ -17210,12 +18129,6 @@
 msgid "refusing to %s notes in %s (outside of refs/notes/)"
 msgstr "rechazando %s notas en %s (fuera de refs/notes/)"
 
-#: builtin/notes.c:376 builtin/notes.c:431 builtin/notes.c:509
-#: builtin/notes.c:521 builtin/notes.c:598 builtin/notes.c:665
-#: builtin/notes.c:815 builtin/notes.c:963 builtin/notes.c:985
-msgid "too many parameters"
-msgstr "demasiados parámetros"
-
 #: builtin/notes.c:389 builtin/notes.c:678
 #, c-format
 msgid "no note found for object %s."
@@ -17273,8 +18186,8 @@
 msgstr "cargar configuración de reescritura para <comando> (implica --stdin)"
 
 #: builtin/notes.c:517
-msgid "too few parameters"
-msgstr "muy pocos parámetros"
+msgid "too few arguments"
+msgstr "muy pocos argumentos"
 
 #: builtin/notes.c:538
 #, c-format
@@ -17403,7 +18316,7 @@
 "commit con el resultado 'git notes merge --commit', o aborte la fusión con "
 "'git notes merge --abort'.\n"
 
-#: builtin/notes.c:897 builtin/tag.c:546
+#: builtin/notes.c:897 builtin/tag.c:578
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Falló al resolver '%s' como una ref válida."
@@ -17421,7 +18334,7 @@
 msgid "read object names from the standard input"
 msgstr "leer nombres de objetos de standard input"
 
-#: builtin/notes.c:954 builtin/prune.c:132 builtin/worktree.c:220
+#: builtin/notes.c:954 builtin/prune.c:132 builtin/worktree.c:148
 msgid "do not remove, show only"
 msgstr "no eliminar, solo mostrar"
 
@@ -17437,125 +18350,139 @@
 msgid "use notes from <notes-ref>"
 msgstr "usar notas desde <referencia-de-notas>"
 
-#: builtin/notes.c:1034 builtin/stash.c:1608
+#: builtin/notes.c:1034 builtin/stash.c:1671
 #, c-format
 msgid "unknown subcommand: %s"
 msgstr "subcomando desconocido: %s"
 
-#: builtin/pack-objects.c:53
+#: builtin/pack-objects.c:54
 msgid ""
 "git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr ""
 "git pack-objects --stdout [<opciones>...] [< <lista-de-ref> | < <lista-de-"
 "objetos>]"
 
-#: builtin/pack-objects.c:54
+#: builtin/pack-objects.c:55
 msgid ""
 "git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr ""
 "git pack-objects [<opciones>...] <nombre-base> [< <lista-de-refs> | < <lista-"
 "de-objetos>]"
 
-#: builtin/pack-objects.c:442
+#: builtin/pack-objects.c:440
+#, c-format
+msgid ""
+"write_reuse_object: could not locate %s, expected at offset %<PRIuMAX> in "
+"pack %s"
+msgstr ""
+"write_reuse_object: no se pudo localizar %s, se esperaba en el "
+"desplazamiento %<PRIuMAX> en el paquete %s"
+
+#: builtin/pack-objects.c:448
 #, c-format
 msgid "bad packed object CRC for %s"
 msgstr "mal paquete de objeto CRC para %s"
 
-#: builtin/pack-objects.c:453
+#: builtin/pack-objects.c:459
 #, c-format
 msgid "corrupt packed object for %s"
 msgstr "objeto empaquetado corrupto para %s"
 
-#: builtin/pack-objects.c:584
+#: builtin/pack-objects.c:590
 #, c-format
 msgid "recursive delta detected for object %s"
 msgstr "delta recursivo encontrado para objeto %s"
 
-#: builtin/pack-objects.c:795
+#: builtin/pack-objects.c:801
 #, c-format
 msgid "ordered %u objects, expected %<PRIu32>"
 msgstr "%u objetos ordenados, esperados %<PRIu32>"
 
-#: builtin/pack-objects.c:1003
+#: builtin/pack-objects.c:896
+#, c-format
+msgid "expected object at offset %<PRIuMAX> in pack %s"
+msgstr "objeto esperado en el desplazamiento %<PRIuMAX> en el paquete %s"
+
+#: builtin/pack-objects.c:1015
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr ""
 "deshabilitando escritura bitmap, paquetes son divididos debido a pack."
 "packSizeLimit"
 
-#: builtin/pack-objects.c:1016
+#: builtin/pack-objects.c:1028
 msgid "Writing objects"
 msgstr "Escribiendo objetos"
 
-#: builtin/pack-objects.c:1077 builtin/update-index.c:90
+#: builtin/pack-objects.c:1089 builtin/update-index.c:90
 #, c-format
 msgid "failed to stat %s"
 msgstr "falló al iniciar %s"
 
-#: builtin/pack-objects.c:1130
+#: builtin/pack-objects.c:1141
 #, c-format
 msgid "wrote %<PRIu32> objects while expecting %<PRIu32>"
 msgstr "%<PRIu32> objetos escritos mientras se esperaban %<PRIu32>"
 
-#: builtin/pack-objects.c:1347
+#: builtin/pack-objects.c:1358
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 "deshabilitando escritura bitmap, ya que algunos objetos no están siendo "
 "empaquetados"
 
-#: builtin/pack-objects.c:1774
+#: builtin/pack-objects.c:1806
 #, c-format
 msgid "delta base offset overflow in pack for %s"
 msgstr "overflow de offset en la base de delta en paquete para %s"
 
-#: builtin/pack-objects.c:1783
+#: builtin/pack-objects.c:1815
 #, c-format
 msgid "delta base offset out of bound for %s"
 msgstr "outbound de offset en la base de delta para %s"
 
-#: builtin/pack-objects.c:2054
+#: builtin/pack-objects.c:2096
 msgid "Counting objects"
 msgstr "Contando objetos"
 
-#: builtin/pack-objects.c:2199
+#: builtin/pack-objects.c:2241
 #, c-format
 msgid "unable to parse object header of %s"
 msgstr "incapaz de analizar header del objeto %s"
 
-#: builtin/pack-objects.c:2269 builtin/pack-objects.c:2285
-#: builtin/pack-objects.c:2295
+#: builtin/pack-objects.c:2311 builtin/pack-objects.c:2327
+#: builtin/pack-objects.c:2337
 #, c-format
 msgid "object %s cannot be read"
 msgstr "objeto %s no puede ser leído"
 
-#: builtin/pack-objects.c:2272 builtin/pack-objects.c:2299
+#: builtin/pack-objects.c:2314 builtin/pack-objects.c:2341
 #, c-format
 msgid "object %s inconsistent object length (%<PRIuMAX> vs %<PRIuMAX>)"
 msgstr ""
 "objeto %s inconsistente con el largo del objeto (%<PRIuMAX> vs %<PRIuMAX>)"
 
-#: builtin/pack-objects.c:2309
+#: builtin/pack-objects.c:2351
 msgid "suboptimal pack - out of memory"
 msgstr "suboptimal pack - fuera de memoria"
 
-#: builtin/pack-objects.c:2624
+#: builtin/pack-objects.c:2666
 #, c-format
 msgid "Delta compression using up to %d threads"
 msgstr "Compresión delta usando hasta %d hilos"
 
-#: builtin/pack-objects.c:2763
+#: builtin/pack-objects.c:2805
 #, c-format
 msgid "unable to pack objects reachable from tag %s"
 msgstr "no es posible empaquetar objetos alcanzables desde tag %s"
 
-#: builtin/pack-objects.c:2851
+#: builtin/pack-objects.c:2891
 msgid "Compressing objects"
 msgstr "Comprimiendo objetos"
 
-#: builtin/pack-objects.c:2857
+#: builtin/pack-objects.c:2897
 msgid "inconsistency with delta count"
 msgstr "inconsistencia con la cuenta de delta"
 
-#: builtin/pack-objects.c:2929
+#: builtin/pack-objects.c:2976
 #, c-format
 msgid ""
 "value of uploadpack.blobpackfileuri must be of the form '<object-hash> <pack-"
@@ -17564,7 +18491,7 @@
 "valor para uploadpack.blobpackfileuri tiene que ser de la forma '<hash-de-"
 "objeto> <hash-de-pack> <uri>' (se tuvo '%s')"
 
-#: builtin/pack-objects.c:2932
+#: builtin/pack-objects.c:2979
 #, c-format
 msgid ""
 "object already configured in another uploadpack.blobpackfileuri (got '%s')"
@@ -17572,7 +18499,7 @@
 "objeto ya está configurado en otro uploadpack.blobpackfileuri (se obtuvo "
 "'%s')"
 
-#: builtin/pack-objects.c:2961
+#: builtin/pack-objects.c:3008
 #, c-format
 msgid ""
 "expected edge object ID, got garbage:\n"
@@ -17581,7 +18508,7 @@
 "se espseraba ID de objeto al borde, se obtuvo basura:\n"
 "%s"
 
-#: builtin/pack-objects.c:2967
+#: builtin/pack-objects.c:3014
 #, c-format
 msgid ""
 "expected object ID, got garbage:\n"
@@ -17590,240 +18517,240 @@
 "se esperaba ID de objeto, se obtuvo basuta:\n"
 "%s"
 
-#: builtin/pack-objects.c:3065
+#: builtin/pack-objects.c:3112
 msgid "invalid value for --missing"
 msgstr "valor inválido para --missing"
 
-#: builtin/pack-objects.c:3124 builtin/pack-objects.c:3232
+#: builtin/pack-objects.c:3171 builtin/pack-objects.c:3279
 msgid "cannot open pack index"
 msgstr "no se puede abrir índice de paquetes"
 
-#: builtin/pack-objects.c:3155
+#: builtin/pack-objects.c:3202
 #, c-format
 msgid "loose object at %s could not be examined"
 msgstr "objeto perdido en %s no pudo ser examinado"
 
-#: builtin/pack-objects.c:3240
+#: builtin/pack-objects.c:3287
 msgid "unable to force loose object"
 msgstr "incapaz de forzar un objeto perdido"
 
-#: builtin/pack-objects.c:3333
+#: builtin/pack-objects.c:3380
 #, c-format
 msgid "not a rev '%s'"
 msgstr "no es una rev '%s'"
 
-#: builtin/pack-objects.c:3336
+#: builtin/pack-objects.c:3383
 #, c-format
 msgid "bad revision '%s'"
 msgstr "mala revisión '%s'"
 
-#: builtin/pack-objects.c:3361
+#: builtin/pack-objects.c:3408
 msgid "unable to add recent objects"
 msgstr "incapaz de añadir objetos recientes"
 
-#: builtin/pack-objects.c:3414
+#: builtin/pack-objects.c:3461
 #, c-format
 msgid "unsupported index version %s"
 msgstr "versión de índice no soportada %s"
 
-#: builtin/pack-objects.c:3418
+#: builtin/pack-objects.c:3465
 #, c-format
 msgid "bad index version '%s'"
 msgstr "mala versión del índice '%s'"
 
-#: builtin/pack-objects.c:3456
+#: builtin/pack-objects.c:3503
 msgid "<version>[,<offset>]"
 msgstr "<versión>[,<offset>]"
 
-#: builtin/pack-objects.c:3457
+#: builtin/pack-objects.c:3504
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 "escribir el índice de paquete en la versión de formato idx especificado"
 
-#: builtin/pack-objects.c:3460
+#: builtin/pack-objects.c:3507
 msgid "maximum size of each output pack file"
 msgstr "tamaño máximo de cada paquete resultante"
 
-#: builtin/pack-objects.c:3462
+#: builtin/pack-objects.c:3509
 msgid "ignore borrowed objects from alternate object store"
 msgstr "ignorar objetos prestados de otros almacenes de objetos"
 
-#: builtin/pack-objects.c:3464
+#: builtin/pack-objects.c:3511
 msgid "ignore packed objects"
 msgstr "ignorar objetos paquete"
 
-#: builtin/pack-objects.c:3466
+#: builtin/pack-objects.c:3513
 msgid "limit pack window by objects"
 msgstr "limitar ventana de paquete por objetos"
 
-#: builtin/pack-objects.c:3468
+#: builtin/pack-objects.c:3515
 msgid "limit pack window by memory in addition to object limit"
 msgstr "limitar ventana de paquete por memoria en adición a límite de objetos"
 
-#: builtin/pack-objects.c:3470
+#: builtin/pack-objects.c:3517
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "longitud máxima de cadena delta permitida en el paquete resultante"
 
-#: builtin/pack-objects.c:3472
+#: builtin/pack-objects.c:3519
 msgid "reuse existing deltas"
 msgstr "reusar deltas existentes"
 
-#: builtin/pack-objects.c:3474
+#: builtin/pack-objects.c:3521
 msgid "reuse existing objects"
 msgstr "reutilizar objetos existentes"
 
-#: builtin/pack-objects.c:3476
+#: builtin/pack-objects.c:3523
 msgid "use OFS_DELTA objects"
 msgstr "usar objetos OFS_DELTA"
 
-#: builtin/pack-objects.c:3478
+#: builtin/pack-objects.c:3525
 msgid "use threads when searching for best delta matches"
 msgstr "usar hilos cuando se busque para mejores concordancias de delta"
 
-#: builtin/pack-objects.c:3480
+#: builtin/pack-objects.c:3527
 msgid "do not create an empty pack output"
 msgstr "no crear un paquete resultante vacío"
 
-#: builtin/pack-objects.c:3482
+#: builtin/pack-objects.c:3529
 msgid "read revision arguments from standard input"
 msgstr "leer argumentos de revisión de standard input"
 
-#: builtin/pack-objects.c:3484
+#: builtin/pack-objects.c:3531
 msgid "limit the objects to those that are not yet packed"
 msgstr "limitar los objetos a aquellos que no han sido empaquetados todavía"
 
-#: builtin/pack-objects.c:3487
+#: builtin/pack-objects.c:3534
 msgid "include objects reachable from any reference"
 msgstr "incluir objetos alcanzables por cualquier referencia"
 
-#: builtin/pack-objects.c:3490
+#: builtin/pack-objects.c:3537
 msgid "include objects referred by reflog entries"
 msgstr "incluir objetos referidos por entradas de reflog"
 
-#: builtin/pack-objects.c:3493
+#: builtin/pack-objects.c:3540
 msgid "include objects referred to by the index"
 msgstr "incluir objetos referidos por el índice"
 
-#: builtin/pack-objects.c:3496
+#: builtin/pack-objects.c:3543
 msgid "output pack to stdout"
 msgstr "mostrar paquete en stdout"
 
-#: builtin/pack-objects.c:3498
+#: builtin/pack-objects.c:3545
 msgid "include tag objects that refer to objects to be packed"
 msgstr "incluir objetos tag que refieren a objetos a ser empaquetados"
 
-#: builtin/pack-objects.c:3500
+#: builtin/pack-objects.c:3547
 msgid "keep unreachable objects"
 msgstr "mantener objetos inalcanzables"
 
-#: builtin/pack-objects.c:3502
+#: builtin/pack-objects.c:3549
 msgid "pack loose unreachable objects"
 msgstr "empaquetar objetos sueltos inalcanzables"
 
-#: builtin/pack-objects.c:3504
+#: builtin/pack-objects.c:3551
 msgid "unpack unreachable objects newer than <time>"
 msgstr "desempaquetar objetos inalcanzables más nuevos que <tiempo>"
 
-#: builtin/pack-objects.c:3507
+#: builtin/pack-objects.c:3554
 msgid "use the sparse reachability algorithm"
 msgstr "usar el algoritmo sparse reachability"
 
-#: builtin/pack-objects.c:3509
+#: builtin/pack-objects.c:3556
 msgid "create thin packs"
 msgstr "crear paquetes delgados"
 
-#: builtin/pack-objects.c:3511
+#: builtin/pack-objects.c:3558
 msgid "create packs suitable for shallow fetches"
 msgstr "crear paquetes adecuados para fetches superficiales"
 
-#: builtin/pack-objects.c:3513
+#: builtin/pack-objects.c:3560
 msgid "ignore packs that have companion .keep file"
 msgstr "ignorar paquetes que tienen un archivo .keep acompañante"
 
-#: builtin/pack-objects.c:3515
+#: builtin/pack-objects.c:3562
 msgid "ignore this pack"
 msgstr "ignorar este paquete"
 
-#: builtin/pack-objects.c:3517
+#: builtin/pack-objects.c:3564
 msgid "pack compression level"
 msgstr "nivel de compresión del paquete"
 
-#: builtin/pack-objects.c:3519
+#: builtin/pack-objects.c:3566
 msgid "do not hide commits by grafts"
 msgstr "no ocultar commits por injertos"
 
-#: builtin/pack-objects.c:3521
+#: builtin/pack-objects.c:3568
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 "usar un índice bitmap si está disponible para acelerar la cuenta de objetos"
 
-#: builtin/pack-objects.c:3523
+#: builtin/pack-objects.c:3570
 msgid "write a bitmap index together with the pack index"
 msgstr "escribir un índice de bitmap junto al índice de paquete"
 
-#: builtin/pack-objects.c:3527
+#: builtin/pack-objects.c:3574
 msgid "write a bitmap index if possible"
 msgstr "escribir un índice de bitmap si es posible"
 
-#: builtin/pack-objects.c:3531
+#: builtin/pack-objects.c:3578
 msgid "handling for missing objects"
 msgstr "manejo de objetos perdidos"
 
-#: builtin/pack-objects.c:3534
+#: builtin/pack-objects.c:3581
 msgid "do not pack objects in promisor packfiles"
 msgstr "no se puede empaquetar objetos en packfiles promisores"
 
-#: builtin/pack-objects.c:3536
+#: builtin/pack-objects.c:3583
 msgid "respect islands during delta compression"
 msgstr "respetar islas durante la compresión delta"
 
-#: builtin/pack-objects.c:3538
+#: builtin/pack-objects.c:3585
 msgid "protocol"
 msgstr "protocolo"
 
-#: builtin/pack-objects.c:3539
+#: builtin/pack-objects.c:3586
 msgid "exclude any configured uploadpack.blobpackfileuri with this protocol"
 msgstr ""
 "excluyendo cualquier uploadpack.blobpackfileuri configurado con este "
 "protocolo"
 
-#: builtin/pack-objects.c:3568
+#: builtin/pack-objects.c:3617
 #, c-format
 msgid "delta chain depth %d is too deep, forcing %d"
 msgstr "profundidad de cadena de delta %d es muy profunda, forzando %d"
 
-#: builtin/pack-objects.c:3573
+#: builtin/pack-objects.c:3622
 #, c-format
 msgid "pack.deltaCacheLimit is too high, forcing %d"
 msgstr "pack.deltaCacheLimit es muy grande, forzando %d"
 
-#: builtin/pack-objects.c:3627
+#: builtin/pack-objects.c:3676
 msgid "--max-pack-size cannot be used to build a pack for transfer"
 msgstr ""
 "--max-pack-size no puede ser usado para construir un paquete para "
 "transferencia"
 
-#: builtin/pack-objects.c:3629
+#: builtin/pack-objects.c:3678
 msgid "minimum pack size limit is 1 MiB"
 msgstr "tamaño mínimo del paquete es 1 MiB"
 
-#: builtin/pack-objects.c:3634
+#: builtin/pack-objects.c:3683
 msgid "--thin cannot be used to build an indexable pack"
 msgstr "--thin no puede ser usado para construir un paquete indexable"
 
-#: builtin/pack-objects.c:3637
+#: builtin/pack-objects.c:3686
 msgid "--keep-unreachable and --unpack-unreachable are incompatible"
 msgstr "--keep-unreachable y --unpack-unreachable son incompatibles"
 
-#: builtin/pack-objects.c:3643
+#: builtin/pack-objects.c:3692
 msgid "cannot use --filter without --stdout"
 msgstr "no se puede usar--filter sin --stdout"
 
-#: builtin/pack-objects.c:3703
+#: builtin/pack-objects.c:3752
 msgid "Enumerating objects"
 msgstr "Enumerando objetos"
 
-#: builtin/pack-objects.c:3734
+#: builtin/pack-objects.c:3783
 #, c-format
 msgid ""
 "Total %<PRIu32> (delta %<PRIu32>), reused %<PRIu32> (delta %<PRIu32>), pack-"
@@ -17832,6 +18759,20 @@
 "Total %<PRIu32> (delta %<PRIu32>), reusado %<PRIu32> (delta %<PRIu32>), pack-"
 "reusado %<PRIu32>"
 
+#: builtin/pack-redundant.c:601
+msgid ""
+"'git pack-redundant' is nominated for removal.\n"
+"If you still use this command, please add an extra\n"
+"option, '--i-still-use-this', on the command line\n"
+"and let us know you still use it by sending an e-mail\n"
+"to <git@vger.kernel.org>.  Thanks.\n"
+msgstr ""
+"'git pack-redundant' está nominado para su eliminación.\n"
+"Si todavía usa este comando, agregue un extra\n"
+"opción, '--i-still-use-this', en la línea de comando\n"
+"y háganos saber que todavía lo usa enviando un correo electrónico\n"
+"a <git@vger.kernel.org>. Gracias.\n"
+
 #: builtin/pack-refs.c:8
 msgid "git pack-refs [<options>]"
 msgstr "git pack-refs [<opciones>]"
@@ -17890,7 +18831,7 @@
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "incorporar cambios por rebase en lugar de fusión"
 
-#: builtin/pull.c:158 builtin/rebase.c:478 builtin/revert.c:126
+#: builtin/pull.c:158 builtin/rebase.c:492 builtin/revert.c:126
 msgid "allow fast-forward"
 msgstr "permitir fast-forward"
 
@@ -17915,7 +18856,93 @@
 msgid "Invalid value for pull.ff: %s"
 msgstr "Valor inválido para pull.ff: %s"
 
-#: builtin/pull.c:349
+#: builtin/pull.c:445
+msgid ""
+"There is no candidate for rebasing against among the refs that you just "
+"fetched."
+msgstr "No hay candidato para rebasar entre las refs que has bajado con fetch."
+
+#: builtin/pull.c:447
+msgid ""
+"There are no candidates for merging among the refs that you just fetched."
+msgstr ""
+"No hay candidatos para fusionar entre las refs que has bajado con fetch."
+
+#: builtin/pull.c:448
+msgid ""
+"Generally this means that you provided a wildcard refspec which had no\n"
+"matches on the remote end."
+msgstr ""
+"Generalmente esto significa que has proveído un wildcard de refspec que no "
+"tiene\n"
+"concordancia en el final remoto."
+
+#: builtin/pull.c:451
+#, 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 ""
+"Se ha solicitado un pull del remoto '%s', pero no se ha especificado\n"
+"una rama. Porque este no es el remoto configurado por default\n"
+"para tu rama actual, tienes que especificar una rama en la línea de comando."
+
+#: builtin/pull.c:456 builtin/rebase.c:1253
+msgid "You are not currently on a branch."
+msgstr "No te encuentras actualmente en la rama."
+
+#: builtin/pull.c:458 builtin/pull.c:473
+msgid "Please specify which branch you want to rebase against."
+msgstr "Por favor especifica a qué rama quieres rebasar."
+
+#: builtin/pull.c:460 builtin/pull.c:475
+msgid "Please specify which branch you want to merge with."
+msgstr "Por favor especifica a qué rama quieres fusionar."
+
+#: builtin/pull.c:461 builtin/pull.c:476
+msgid "See git-pull(1) for details."
+msgstr "Ver git-pull(1) para detalles."
+
+#: builtin/pull.c:463 builtin/pull.c:469 builtin/pull.c:478
+#: builtin/rebase.c:1259
+msgid "<remote>"
+msgstr "<remoto>"
+
+#: builtin/pull.c:463 builtin/pull.c:478 builtin/pull.c:483
+msgid "<branch>"
+msgstr "<rama>"
+
+#: builtin/pull.c:471 builtin/rebase.c:1251
+msgid "There is no tracking information for the current branch."
+msgstr "No hay información de rastreo para la rama actual."
+
+#: builtin/pull.c:480
+msgid ""
+"If you wish to set tracking information for this branch you can do so with:"
+msgstr ""
+"Si deseas configurar el rastreo de información para esta rama, puedes "
+"hacerlo con:"
+
+#: builtin/pull.c:485
+#, c-format
+msgid ""
+"Your configuration specifies to merge with the ref '%s'\n"
+"from the remote, but no such ref was fetched."
+msgstr ""
+"Tu configuración especifica fusionar con la ref '%s'\n"
+"de tu remoto, pero no se pudo hacer fetch a esa ref."
+
+#: builtin/pull.c:596
+#, c-format
+msgid "unable to access commit %s"
+msgstr "no es posible acceder al commit %s"
+
+#: builtin/pull.c:902
+msgid "ignoring --verify-signatures for rebase"
+msgstr "ignorando --verify-signatures para rebase"
+
+#: builtin/pull.c:930
 msgid ""
 "Pulling without specifying how to reconcile divergent branches is\n"
 "discouraged. You can squelch this message by running one of the following\n"
@@ -17945,106 +18972,19 @@
 "por defecto en cada invocación.\n"
 "\n"
 
-#: builtin/pull.c:459
-msgid ""
-"There is no candidate for rebasing against among the refs that you just "
-"fetched."
-msgstr "No hay candidato para rebasar entre las refs que has bajado con fetch."
-
-#: builtin/pull.c:461
-msgid ""
-"There are no candidates for merging among the refs that you just fetched."
-msgstr ""
-"No hay candidatos para fusionar entre las refs que has bajado con fetch."
-
-#: builtin/pull.c:462
-msgid ""
-"Generally this means that you provided a wildcard refspec which had no\n"
-"matches on the remote end."
-msgstr ""
-"Generalmente esto significa que has proveído un wildcard de refspec que no "
-"tiene\n"
-"concordancia en el final remoto."
-
-#: builtin/pull.c:465
-#, 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 ""
-"Se ha solicitado un pull del remoto '%s', pero no se ha especificado\n"
-"una rama. Porque este no es el remoto configurado por default\n"
-"para tu rama actual, tienes que especificar una rama en la línea de comando."
-
-#: builtin/pull.c:470 builtin/rebase.c:1234 git-parse-remote.sh:73
-msgid "You are not currently on a branch."
-msgstr "No te encuentras actualmente en la rama."
-
-#: builtin/pull.c:472 builtin/pull.c:487 git-parse-remote.sh:79
-msgid "Please specify which branch you want to rebase against."
-msgstr "Por favor especifica a qué rama quieres rebasar."
-
-#: builtin/pull.c:474 builtin/pull.c:489 git-parse-remote.sh:82
-msgid "Please specify which branch you want to merge with."
-msgstr "Por favor especifica a qué rama quieres fusionar."
-
-#: builtin/pull.c:475 builtin/pull.c:490
-msgid "See git-pull(1) for details."
-msgstr "Ver git-pull(1) para detalles."
-
-#: builtin/pull.c:477 builtin/pull.c:483 builtin/pull.c:492
-#: builtin/rebase.c:1240 git-parse-remote.sh:64
-msgid "<remote>"
-msgstr "<remoto>"
-
-#: builtin/pull.c:477 builtin/pull.c:492 builtin/pull.c:497
-#: git-parse-remote.sh:65
-msgid "<branch>"
-msgstr "<rama>"
-
-#: builtin/pull.c:485 builtin/rebase.c:1232 git-parse-remote.sh:75
-msgid "There is no tracking information for the current branch."
-msgstr "No hay información de rastreo para la rama actual."
-
-#: builtin/pull.c:494 git-parse-remote.sh:95
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:"
-msgstr ""
-"Si deseas configurar el rastreo de información para esta rama, puedes "
-"hacerlo con:"
-
-#: builtin/pull.c:499
-#, c-format
-msgid ""
-"Your configuration specifies to merge with the ref '%s'\n"
-"from the remote, but no such ref was fetched."
-msgstr ""
-"Tu configuración especifica fusionar con la ref '%s'\n"
-"de tu remoto, pero no se pudo hacer fetch a esa ref."
-
-#: builtin/pull.c:610
-#, c-format
-msgid "unable to access commit %s"
-msgstr "no es posible acceder al commit %s"
-
-#: builtin/pull.c:895
-msgid "ignoring --verify-signatures for rebase"
-msgstr "ignorando --verify-signatures para rebase"
-
-#: builtin/pull.c:955
+#: builtin/pull.c:991
 msgid "Updating an unborn branch with changes added to the index."
 msgstr "Actualizando una rama no nata con cambios agregados al índice."
 
-#: builtin/pull.c:959
+#: builtin/pull.c:995
 msgid "pull with rebase"
 msgstr "pull con rebase"
 
-#: builtin/pull.c:960
+#: builtin/pull.c:996
 msgid "please commit or stash them."
 msgstr "por favor realiza un commit o un stash con ellos."
 
-#: builtin/pull.c:985
+#: builtin/pull.c:1021
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -18055,7 +18995,7 @@
 "realizando fast-forward al árbol de trabajo\n"
 "desde commit %s."
 
-#: builtin/pull.c:991
+#: builtin/pull.c:1027
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -18072,15 +19012,15 @@
 "$ git reset --hard\n"
 "para recuperar."
 
-#: builtin/pull.c:1006
+#: builtin/pull.c:1042
 msgid "Cannot merge multiple branches into empty head."
 msgstr "No se puede fusionar múltiples ramas en un head vacío."
 
-#: builtin/pull.c:1010
+#: builtin/pull.c:1046
 msgid "Cannot rebase onto multiple branches."
 msgstr "No se puede rebasar en múltiples ramas."
 
-#: builtin/pull.c:1018
+#: builtin/pull.c:1067
 msgid "cannot rebase with locally recorded submodule modifications"
 msgstr ""
 "no se puede rebasar con modificaciones de submódulos grabadas localmente"
@@ -18090,15 +19030,15 @@
 msgstr ""
 "git push [<opciones>] [<repositorio> [<especificaciones-de-referencia>...]]"
 
-#: builtin/push.c:112
+#: builtin/push.c:111
 msgid "tag shorthand without <tag>"
 msgstr "taquigrafía de tag sin <tag>"
 
-#: builtin/push.c:122
+#: builtin/push.c:119
 msgid "--delete only accepts plain target ref names"
 msgstr "--delete solo acepta como objetivos nombres de ref planos"
 
-#: builtin/push.c:168
+#: builtin/push.c:164
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -18107,7 +19047,7 @@
 "Para elegir si la opción es permanente, mira push.default en 'git help "
 "config'."
 
-#: builtin/push.c:171
+#: builtin/push.c:167
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -18132,7 +19072,7 @@
 "    git push %s HEAD\n"
 "%s"
 
-#: builtin/push.c:186
+#: builtin/push.c:182
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -18147,7 +19087,7 @@
 "\n"
 "\tgit push %s HEAD:<nombre-de-rama-remota>\n"
 
-#: builtin/push.c:200
+#: builtin/push.c:194
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -18161,12 +19101,12 @@
 "\n"
 "\tgit push --set-upstream %s %s\n"
 
-#: builtin/push.c:208
+#: builtin/push.c:202
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr "La rama actual %s tiene múltiples ramas upstream, rechazando el push."
 
-#: builtin/push.c:211
+#: builtin/push.c:205
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -18177,13 +19117,13 @@
 "la rama actual '%s', sin decirme qué poner en el push\n"
 "para actualizar en qué rama de remoto."
 
-#: builtin/push.c:270
+#: builtin/push.c:260
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "No se especificó ningún refspecs para hacer push, y push.default es \"nada\"."
 
-#: builtin/push.c:277
+#: builtin/push.c:267
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -18195,7 +19135,7 @@
 "'git pull ...') antes de hacer push de nuevo.\n"
 "Mira 'Note about fast-forwards' en 'git push --help' para más detalles."
 
-#: builtin/push.c:283
+#: builtin/push.c:273
 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"
@@ -18208,7 +19148,7 @@
 "(ejem. 'git pull ...') antes de volver a hacer push.\n"
 "Vea las 'Notes about fast-forwards' en 'git push --help' para más detalles."
 
-#: builtin/push.c:289
+#: builtin/push.c:279
 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"
@@ -18222,12 +19162,12 @@
 "remotos (ej. 'git pull ...') antes de volver a hacer push.\n"
 "Vea 'Notes about fast-forwards0 en 'git push --help' para detalles."
 
-#: builtin/push.c:296
+#: builtin/push.c:286
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 "Actualizaciones fueron rechazadas porque el tag ya existe en el remoto."
 
-#: builtin/push.c:299
+#: builtin/push.c:289
 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"
@@ -18237,99 +19177,117 @@
 "o actualizar un ref remoto para hacer que  apunte a un objeto no-commit,\n"
 "sin usar la opción '--force'.\n"
 
-#: builtin/push.c:361
+#: builtin/push.c:294
+msgid ""
+"Updates were rejected because the tip of the remote-tracking\n"
+"branch has been updated since the last checkout. You may want\n"
+"to integrate those changes locally (e.g., 'git pull ...')\n"
+"before forcing an update.\n"
+msgstr ""
+"Las actualizaciones se rechazaron porque la sugerencia del seguimiento "
+"remoto\n"
+"rama se ha actualizado desde la última vez que se realizó la compra. Es "
+"posible que desee\n"
+"para integrar esos cambios localmente (por ejemplo, 'git pull ...')\n"
+"antes de forzar una actualización.\n"
+
+#: builtin/push.c:364
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Haciendo push a %s\n"
 
-#: builtin/push.c:368
+#: builtin/push.c:371
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "falló el push de algunas referencias a '%s'"
 
-#: builtin/push.c:542
+#: builtin/push.c:553
 msgid "repository"
 msgstr "repositorio"
 
-#: builtin/push.c:543 builtin/send-pack.c:164
+#: builtin/push.c:554 builtin/send-pack.c:189
 msgid "push all refs"
 msgstr "realizar push a todas las refs"
 
-#: builtin/push.c:544 builtin/send-pack.c:166
+#: builtin/push.c:555 builtin/send-pack.c:191
 msgid "mirror all refs"
 msgstr "realizar mirror a todas las refs"
 
-#: builtin/push.c:546
+#: builtin/push.c:557
 msgid "delete refs"
 msgstr "borrar refs"
 
-#: builtin/push.c:547
+#: builtin/push.c:558
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "realizar push a tags (no puede ser usado con --all o --mirror)"
 
-#: builtin/push.c:550 builtin/send-pack.c:167
+#: builtin/push.c:561 builtin/send-pack.c:192
 msgid "force updates"
 msgstr "forzar actualizaciones"
 
-#: builtin/push.c:551 builtin/send-pack.c:179
+#: builtin/push.c:562 builtin/send-pack.c:204
 msgid "<refname>:<expect>"
 msgstr "<refname>:<expect>"
 
-#: builtin/push.c:552 builtin/send-pack.c:180
+#: builtin/push.c:563 builtin/send-pack.c:205
 msgid "require old value of ref to be at this value"
 msgstr "requiere haber valor viejo de ref en este valor"
 
-#: builtin/push.c:555
+#: builtin/push.c:566 builtin/send-pack.c:208
+msgid "require remote updates to be integrated locally"
+msgstr "requieren que las actualizaciones remotas se integren localmente"
+
+#: builtin/push.c:569
 msgid "control recursive pushing of submodules"
 msgstr "controlar push recursivo de submódulos"
 
-#: builtin/push.c:556 builtin/send-pack.c:174
+#: builtin/push.c:570 builtin/send-pack.c:199
 msgid "use thin pack"
 msgstr "usar empaquetado delgado"
 
-#: builtin/push.c:557 builtin/push.c:558 builtin/send-pack.c:161
-#: builtin/send-pack.c:162
+#: builtin/push.c:571 builtin/push.c:572 builtin/send-pack.c:186
+#: builtin/send-pack.c:187
 msgid "receive pack program"
 msgstr "recibir programa de paquete"
 
-#: builtin/push.c:559
+#: builtin/push.c:573
 msgid "set upstream for git pull/status"
 msgstr "configurar upstream para git pulll/status"
 
-#: builtin/push.c:562
+#: builtin/push.c:576
 msgid "prune locally removed refs"
 msgstr "recortando refs eliminadas localmente"
 
-#: builtin/push.c:564
+#: builtin/push.c:578
 msgid "bypass pre-push hook"
 msgstr "hacer un bypass al hook pre-push"
 
-#: builtin/push.c:565
+#: builtin/push.c:579
 msgid "push missing but relevant tags"
 msgstr "realizar push de tags faltantes pero relevantes"
 
-#: builtin/push.c:567 builtin/send-pack.c:168
+#: builtin/push.c:581 builtin/send-pack.c:193
 msgid "GPG sign the push"
 msgstr "Firmar con GPG el push"
 
-#: builtin/push.c:569 builtin/send-pack.c:175
+#: builtin/push.c:583 builtin/send-pack.c:200
 msgid "request atomic transaction on remote side"
 msgstr "solicitar transacción atómica en el lado remoto"
 
-#: builtin/push.c:587
+#: builtin/push.c:601
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete es incompatible con --all, --mirror y --tags"
 
-#: builtin/push.c:589
+#: builtin/push.c:603
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete no tiene sentido sin ninguna referencia"
 
-#: builtin/push.c:609
+#: builtin/push.c:623
 #, c-format
 msgid "bad repository '%s'"
 msgstr "mal repositorio '%s'"
 
-#: builtin/push.c:610
+#: builtin/push.c:624
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -18351,70 +19309,78 @@
 "\n"
 "    git push <nombre>\n"
 
-#: builtin/push.c:625
+#: builtin/push.c:639
 msgid "--all and --tags are incompatible"
 msgstr "--all y --tags son incompatibles"
 
-#: builtin/push.c:627
+#: builtin/push.c:641
 msgid "--all can't be combined with refspecs"
 msgstr "--all no puede ser combinada con refspecs"
 
-#: builtin/push.c:631
+#: builtin/push.c:645
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror y --tags son incompatibles"
 
-#: builtin/push.c:633
+#: builtin/push.c:647
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror no puede ser combinado con refspecs"
 
-#: builtin/push.c:636
+#: builtin/push.c:650
 msgid "--all and --mirror are incompatible"
 msgstr "--all y --mirror son incompatibles"
 
-#: builtin/push.c:640
+#: builtin/push.c:657
 msgid "push options must not have new line characters"
 msgstr "opciones de push no pueden tener caracteres de línea nueva"
 
-#: builtin/range-diff.c:8
+#: builtin/range-diff.c:9
 msgid "git range-diff [<options>] <old-base>..<old-tip> <new-base>..<new-tip>"
 msgstr ""
 "git range-diff [<opciones>] <base-vieja>..<punta-vieja> <base-nueva>..<punta-"
 "nueva>"
 
-#: builtin/range-diff.c:9
+#: builtin/range-diff.c:10
 msgid "git range-diff [<options>] <old-tip>...<new-tip>"
 msgstr "git range-diff [<opciones>] <punta-vieja>...<punta-nueva>"
 
-#: builtin/range-diff.c:10
+#: builtin/range-diff.c:11
 msgid "git range-diff [<options>] <base> <old-tip> <new-tip>"
 msgstr "git range-diff [<opciones>] <base> <punta-vieja> <punta-nueva>"
 
-#: builtin/range-diff.c:22
+#: builtin/range-diff.c:28
 msgid "Percentage by which creation is weighted"
 msgstr "Porcentaje por el cual la creación es pesada"
 
-#: builtin/range-diff.c:24
+#: builtin/range-diff.c:30
 msgid "use simple diff colors"
 msgstr "usar colores simples de diff"
 
-#: builtin/range-diff.c:26
+#: builtin/range-diff.c:32
 msgid "notes"
 msgstr "notas"
 
-#: builtin/range-diff.c:26
+#: builtin/range-diff.c:32
 msgid "passed to 'git log'"
 msgstr "pasado a 'git log'"
 
-#: builtin/range-diff.c:50 builtin/range-diff.c:54
-#, c-format
-msgid "no .. in range: '%s'"
-msgstr "no .. en rango: '%s'"
+#: builtin/range-diff.c:35
+msgid "only emit output related to the first range"
+msgstr "solo emite salida relacionada con el primer rango"
 
-#: builtin/range-diff.c:64
+#: builtin/range-diff.c:37
+msgid "only emit output related to the second range"
+msgstr "solo emite salida relacionada con el segundo rango"
+
+#: builtin/range-diff.c:60 builtin/range-diff.c:64
+#, c-format
+msgid "not a commit range: '%s'"
+msgstr "no es un rango de commit: '%s'"
+
+#: builtin/range-diff.c:74
 msgid "single arg format must be symmetric range"
 msgstr "argumento único de formato debe ser un rango simétrico"
 
-#: builtin/range-diff.c:79
+#: builtin/range-diff.c:89
 msgid "need two commit ranges"
 msgstr "se necesitan dos rangos de commits"
 
@@ -18519,193 +19485,193 @@
 msgid "git rebase --continue | --abort | --skip | --edit-todo"
 msgstr "git rebase --continue | --abort | --skip | --edit-todo"
 
-#: builtin/rebase.c:181 builtin/rebase.c:205 builtin/rebase.c:232
+#: builtin/rebase.c:195 builtin/rebase.c:219 builtin/rebase.c:246
 #, c-format
 msgid "unusable todo list: '%s'"
 msgstr "lista de pendientes inutilizable: '%s'"
 
-#: builtin/rebase.c:298
+#: builtin/rebase.c:312
 #, c-format
 msgid "could not create temporary %s"
 msgstr "no se pudo crear archivo temporal %s"
 
-#: builtin/rebase.c:304
+#: builtin/rebase.c:318
 msgid "could not mark as interactive"
 msgstr "no se pudo marcar como interactivo"
 
-#: builtin/rebase.c:358
+#: builtin/rebase.c:371
 msgid "could not generate todo list"
 msgstr "no se pudo generar lista de pendientes"
 
-#: builtin/rebase.c:399
+#: builtin/rebase.c:413
 msgid "a base commit must be provided with --upstream or --onto"
 msgstr "un commit base tiene que ser provisto con --upstream o --onto"
 
-#: builtin/rebase.c:468
+#: builtin/rebase.c:482
 msgid "git rebase--interactive [<options>]"
 msgstr "git rebase--interactive [<opciones>]"
 
-#: builtin/rebase.c:481 builtin/rebase.c:1374
+#: builtin/rebase.c:495 builtin/rebase.c:1394
 msgid "keep commits which start empty"
 msgstr "mantener commits que comienzan con vacío"
 
-#: builtin/rebase.c:485 builtin/revert.c:128
+#: builtin/rebase.c:499 builtin/revert.c:128
 msgid "allow commits with empty messages"
 msgstr "permitir commits con mensajes vacíos"
 
-#: builtin/rebase.c:487
+#: builtin/rebase.c:501
 msgid "rebase merge commits"
 msgstr "rebasando commits de fusión"
 
-#: builtin/rebase.c:489
+#: builtin/rebase.c:503
 msgid "keep original branch points of cousins"
 msgstr "mantener puntos originales de la rama de sus primos"
 
-#: builtin/rebase.c:491
+#: builtin/rebase.c:505
 msgid "move commits that begin with squash!/fixup!"
 msgstr "mover commits que comienzan con squash!/fixup!"
 
-#: builtin/rebase.c:492
+#: builtin/rebase.c:506
 msgid "sign commits"
 msgstr "firmar commits"
 
-#: builtin/rebase.c:494 builtin/rebase.c:1314
+#: builtin/rebase.c:508 builtin/rebase.c:1333
 msgid "display a diffstat of what changed upstream"
 msgstr "mostrar un diffstat de lo que cambió en upstream"
 
-#: builtin/rebase.c:496
+#: builtin/rebase.c:510
 msgid "continue rebase"
 msgstr "continuar rebase"
 
-#: builtin/rebase.c:498
+#: builtin/rebase.c:512
 msgid "skip commit"
 msgstr "saltar commit"
 
-#: builtin/rebase.c:499
+#: builtin/rebase.c:513
 msgid "edit the todo list"
 msgstr "editar la lista de pendientes"
 
-#: builtin/rebase.c:501
+#: builtin/rebase.c:515
 msgid "show the current patch"
 msgstr "mostrar el parche actual"
 
-#: builtin/rebase.c:504
+#: builtin/rebase.c:518
 msgid "shorten commit ids in the todo list"
 msgstr "ids de commits cortos en la lista de pendientes"
 
-#: builtin/rebase.c:506
+#: builtin/rebase.c:520
 msgid "expand commit ids in the todo list"
 msgstr "expandir ids de commits en la lista de pendientes"
 
-#: builtin/rebase.c:508
+#: builtin/rebase.c:522
 msgid "check the todo list"
 msgstr "revisar la lista de pendientes"
 
-#: builtin/rebase.c:510
+#: builtin/rebase.c:524
 msgid "rearrange fixup/squash lines"
 msgstr "reorganizar líneas fixup/squash"
 
-#: builtin/rebase.c:512
+#: builtin/rebase.c:526
 msgid "insert exec commands in todo list"
 msgstr "insertar comando exec en la lista de pendientes"
 
-#: builtin/rebase.c:513
+#: builtin/rebase.c:527
 msgid "onto"
 msgstr "hacia"
 
-#: builtin/rebase.c:516
+#: builtin/rebase.c:530
 msgid "restrict-revision"
 msgstr "restrict-revision"
 
-#: builtin/rebase.c:516
+#: builtin/rebase.c:530
 msgid "restrict revision"
 msgstr "restringir revision"
 
-#: builtin/rebase.c:518
+#: builtin/rebase.c:532
 msgid "squash-onto"
 msgstr "squash-onto"
 
-#: builtin/rebase.c:519
+#: builtin/rebase.c:533
 msgid "squash onto"
 msgstr "squash hacia"
 
-#: builtin/rebase.c:521
+#: builtin/rebase.c:535
 msgid "the upstream commit"
 msgstr "el commit de upstream"
 
-#: builtin/rebase.c:523
+#: builtin/rebase.c:537
 msgid "head-name"
 msgstr "head-name"
 
-#: builtin/rebase.c:523
+#: builtin/rebase.c:537
 msgid "head name"
 msgstr "nombre de head"
 
-#: builtin/rebase.c:528
+#: builtin/rebase.c:542
 msgid "rebase strategy"
 msgstr "estrategia de rebase"
 
-#: builtin/rebase.c:529
+#: builtin/rebase.c:543
 msgid "strategy-opts"
 msgstr "strategy-opts"
 
-#: builtin/rebase.c:530
+#: builtin/rebase.c:544
 msgid "strategy options"
 msgstr "opciones de estrategia"
 
-#: builtin/rebase.c:531
+#: builtin/rebase.c:545
 msgid "switch-to"
 msgstr "cambiar a"
 
-#: builtin/rebase.c:532
+#: builtin/rebase.c:546
 msgid "the branch or commit to checkout"
 msgstr "la rama o commit para hacer checkout"
 
-#: builtin/rebase.c:533
+#: builtin/rebase.c:547
 msgid "onto-name"
 msgstr "hacia-nombre"
 
-#: builtin/rebase.c:533
+#: builtin/rebase.c:547
 msgid "onto name"
 msgstr "hacia nombre"
 
-#: builtin/rebase.c:534
+#: builtin/rebase.c:548
 msgid "cmd"
 msgstr "cmd"
 
-#: builtin/rebase.c:534
+#: builtin/rebase.c:548
 msgid "the command to run"
 msgstr "el comando para ejecutar"
 
-#: builtin/rebase.c:537 builtin/rebase.c:1407
+#: builtin/rebase.c:551 builtin/rebase.c:1427
 msgid "automatically re-schedule any `exec` that fails"
 msgstr "reprogramar automaticamente cualquier `exec` que falle"
 
-#: builtin/rebase.c:553
+#: builtin/rebase.c:567
 msgid "--[no-]rebase-cousins has no effect without --rebase-merges"
 msgstr "--[no-]rebase-cousins no tiene efecto sin --rebase-merges"
 
-#: builtin/rebase.c:569
+#: builtin/rebase.c:583
 #, c-format
 msgid "%s requires the merge backend"
 msgstr "%s requiere un backend de fusión"
 
-#: builtin/rebase.c:612
+#: builtin/rebase.c:626
 #, c-format
 msgid "could not get 'onto': '%s'"
 msgstr "no se pudo conseguir 'onto': '%s'"
 
-#: builtin/rebase.c:629
+#: builtin/rebase.c:643
 #, c-format
 msgid "invalid orig-head: '%s'"
 msgstr "orig-head inválido: '%s'"
 
-#: builtin/rebase.c:654
+#: builtin/rebase.c:668
 #, c-format
 msgid "ignoring invalid allow_rerere_autoupdate: '%s'"
 msgstr "ignorando inválido allow_rerere_autoupdate: '%s'"
 
-#: builtin/rebase.c:799 git-rebase--preserve-merges.sh:81
+#: builtin/rebase.c:813 git-rebase--preserve-merges.sh:81
 msgid ""
 "Resolve all conflicts manually, mark them as resolved with\n"
 "\"git add/rm <conflicted_files>\", then run \"git rebase --continue\".\n"
@@ -18720,7 +19686,7 @@
 "Para abortar y regresar al estado previo al \"git rebase\", ejecuta \"git "
 "rebase --abort\"."
 
-#: builtin/rebase.c:882
+#: builtin/rebase.c:896
 #, c-format
 msgid ""
 "\n"
@@ -18739,7 +19705,7 @@
 "\n"
 "Como resultado, git no puede hacer rebase con ellos."
 
-#: builtin/rebase.c:1208
+#: builtin/rebase.c:1227
 #, c-format
 msgid ""
 "unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and \"ask"
@@ -18748,7 +19714,7 @@
 "tipo '%s' vacío y desconocido; valores válidos son \"drop\", \"keep\", y "
 "\"ask\"."
 
-#: builtin/rebase.c:1226
+#: builtin/rebase.c:1245
 #, c-format
 msgid ""
 "%s\n"
@@ -18765,7 +19731,7 @@
 "    git rebase '<rama>'\n"
 "\n"
 
-#: builtin/rebase.c:1242
+#: builtin/rebase.c:1261
 #, c-format
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:\n"
@@ -18778,137 +19744,149 @@
 "    git branch --set-upstream-to=%s/<rama> %s\n"
 "\n"
 
-#: builtin/rebase.c:1272
+#: builtin/rebase.c:1291
 msgid "exec commands cannot contain newlines"
 msgstr "comandos exec no pueden contener newlines"
 
-#: builtin/rebase.c:1276
+#: builtin/rebase.c:1295
 msgid "empty exec command"
 msgstr "comando exec vacío"
 
-#: builtin/rebase.c:1305
+#: builtin/rebase.c:1324
 msgid "rebase onto given branch instead of upstream"
 msgstr "haciendo rebase hacia rama dada en lugar de upstream"
 
-#: builtin/rebase.c:1307
+#: builtin/rebase.c:1326
 msgid "use the merge-base of upstream and branch as the current base"
 msgstr "usar la base de fusión de upstream y la rama como base actual"
 
-#: builtin/rebase.c:1309
+#: builtin/rebase.c:1328
 msgid "allow pre-rebase hook to run"
 msgstr "permitir ejecutar hook pre-rebase"
 
-#: builtin/rebase.c:1311
+#: builtin/rebase.c:1330
 msgid "be quiet. implies --no-stat"
 msgstr "ser silencioso implica --no-stat"
 
-#: builtin/rebase.c:1317
+#: builtin/rebase.c:1336
 msgid "do not show diffstat of what changed upstream"
 msgstr "no mostrar un diffstat de lo que cambió en upstream"
 
-#: builtin/rebase.c:1320
-msgid "add a Signed-off-by: line to each commit"
+#: builtin/rebase.c:1339
+msgid "add a Signed-off-by trailer to each commit"
 msgstr "agregar una línea \"Firmado-por\" al mensaje de cada commit"
 
-#: builtin/rebase.c:1322 builtin/rebase.c:1326 builtin/rebase.c:1328
-msgid "passed to 'git am'"
-msgstr "pasado a 'git am'"
+#: builtin/rebase.c:1342
+msgid "make committer date match author date"
+msgstr "hacer que la fecha del commit concuerde con la fecha de autoría"
 
-#: builtin/rebase.c:1330 builtin/rebase.c:1332
+#: builtin/rebase.c:1344
+msgid "ignore author date and use current date"
+msgstr "ignorar la fecha del autor y usar la fecha actual"
+
+#: builtin/rebase.c:1346
+msgid "synonym of --reset-author-date"
+msgstr "sinónimo para --reset-author-date"
+
+#: builtin/rebase.c:1348 builtin/rebase.c:1352
 msgid "passed to 'git apply'"
 msgstr "pasado a 'git-apply'"
 
-#: builtin/rebase.c:1334 builtin/rebase.c:1337
+#: builtin/rebase.c:1350
+msgid "ignore changes in whitespace"
+msgstr "ignorar cambios en espacios en blanco"
+
+#: builtin/rebase.c:1354 builtin/rebase.c:1357
 msgid "cherry-pick all commits, even if unchanged"
 msgstr "cherry-pick todos los commits, incluso si no han cambiado"
 
-#: builtin/rebase.c:1339
+#: builtin/rebase.c:1359
 msgid "continue"
 msgstr "continuar"
 
-#: builtin/rebase.c:1342
+#: builtin/rebase.c:1362
 msgid "skip current patch and continue"
 msgstr "saltar el parche y continuar"
 
-#: builtin/rebase.c:1344
+#: builtin/rebase.c:1364
 msgid "abort and check out the original branch"
 msgstr "aborta y revisa la rama original"
 
-#: builtin/rebase.c:1347
+#: builtin/rebase.c:1367
 msgid "abort but keep HEAD where it is"
 msgstr "aborta pero mantiene HEAD donde está"
 
-#: builtin/rebase.c:1348
+#: builtin/rebase.c:1368
 msgid "edit the todo list during an interactive rebase"
 msgstr "editar la lista de pendientes durante el rebase interactivo"
 
-#: builtin/rebase.c:1351
+#: builtin/rebase.c:1371
 msgid "show the patch file being applied or merged"
 msgstr "muestra el archivo parche siendo aplicado o fusionado"
 
-#: builtin/rebase.c:1354
+#: builtin/rebase.c:1374
 msgid "use apply strategies to rebase"
 msgstr "usar estrategias de apply para el rebase"
 
-#: builtin/rebase.c:1358
+#: builtin/rebase.c:1378
 msgid "use merging strategies to rebase"
 msgstr "usar estrategias de fusión para el rebase"
 
-#: builtin/rebase.c:1362
+#: builtin/rebase.c:1382
 msgid "let the user edit the list of commits to rebase"
 msgstr "permitir al usuario editar la lista de commits para rebasar"
 
-#: builtin/rebase.c:1366
+#: builtin/rebase.c:1386
 msgid "(DEPRECATED) try to recreate merges instead of ignoring them"
 msgstr "(DEPRECADO) intentar recrear merges en lugar de ignorarlos"
 
-#: builtin/rebase.c:1371
+#: builtin/rebase.c:1391
 msgid "how to handle commits that become empty"
 msgstr "como manejar commits que se vuelven vacíos"
 
-#: builtin/rebase.c:1378
+#: builtin/rebase.c:1398
 msgid "move commits that begin with squash!/fixup! under -i"
 msgstr "mover commits que comienzan con squash!/fixup! bajo -i"
 
-#: builtin/rebase.c:1385
+#: builtin/rebase.c:1405
 msgid "add exec lines after each commit of the editable list"
 msgstr "agregar líneas exec tras cada acommit de la lista editable"
 
-#: builtin/rebase.c:1389
+#: builtin/rebase.c:1409
 msgid "allow rebasing commits with empty messages"
 msgstr "permitir rebase commits con mensajes vacíos"
 
-#: builtin/rebase.c:1393
+#: builtin/rebase.c:1413
 msgid "try to rebase merges instead of skipping them"
 msgstr "intentar fusiones por rebase en lugar de saltarlas"
 
-#: builtin/rebase.c:1396
+#: builtin/rebase.c:1416
 msgid "use 'merge-base --fork-point' to refine upstream"
 msgstr "use 'merge-base --fork-point' para refinar upstream"
 
-#: builtin/rebase.c:1398
+#: builtin/rebase.c:1418
 msgid "use the given merge strategy"
 msgstr "usar la estrategia de merge dada"
 
-#: builtin/rebase.c:1400 builtin/revert.c:115
+#: builtin/rebase.c:1420 builtin/revert.c:115
 msgid "option"
 msgstr "opción"
 
-#: builtin/rebase.c:1401
+#: builtin/rebase.c:1421
 msgid "pass the argument through to the merge strategy"
 msgstr "pasar el argumento para la estrategia de fusión"
 
-#: builtin/rebase.c:1404
+#: builtin/rebase.c:1424
 msgid "rebase all reachable commits up to the root(s)"
 msgstr "hacer rebase a todos los commits alcanzables hasta la raíz(raíces)"
 
-#: builtin/rebase.c:1409
+#: builtin/rebase.c:1429
 msgid "apply all changes, even those already present upstream"
 msgstr ""
 "aplicar todos los cambios, incluso aquellos que ya están presentes en "
 "upstream"
 
-#: builtin/rebase.c:1426
+#: builtin/rebase.c:1446
 msgid ""
 "the rebase.useBuiltin support has been removed!\n"
 "See its entry in 'git help config' for details."
@@ -18916,42 +19894,42 @@
 "el soporte para rebase.useBuiltin ha sido eliminado!\n"
 "Vea su entrada en 'git help config' para detalles."
 
-#: builtin/rebase.c:1432
+#: builtin/rebase.c:1452
 msgid "It looks like 'git am' is in progress. Cannot rebase."
 msgstr "Parece que 'git am' está en progreso. No se puede rebasar."
 
-#: builtin/rebase.c:1473
+#: builtin/rebase.c:1493
 msgid ""
 "git rebase --preserve-merges is deprecated. Use --rebase-merges instead."
 msgstr ""
 "git rebase --preserve-merges está deprecado. Use --rebase-merges en su lugar."
 
-#: builtin/rebase.c:1478
+#: builtin/rebase.c:1498
 msgid "cannot combine '--keep-base' with '--onto'"
 msgstr "no se puede combinar '--keep-base' con '--onto'"
 
-#: builtin/rebase.c:1480
+#: builtin/rebase.c:1500
 msgid "cannot combine '--keep-base' with '--root'"
 msgstr "no se puede combinar '--keep-base' con '--root'"
 
-#: builtin/rebase.c:1484
+#: builtin/rebase.c:1504
 msgid "cannot combine '--root' with '--fork-point'"
 msgstr "no se puede combinar '--root' con '--fork-point'"
 
-#: builtin/rebase.c:1487
+#: builtin/rebase.c:1507
 msgid "No rebase in progress?"
 msgstr "¿No hay rebase en progreso?"
 
-#: builtin/rebase.c:1491
+#: builtin/rebase.c:1511
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "La acción --edit-todo sólo puede ser usada al rebasar interactivamente."
 
-#: builtin/rebase.c:1514
+#: builtin/rebase.c:1534 t/helper/test-fast-rebase.c:123
 msgid "Cannot read HEAD"
 msgstr "No se puede leer el HEAD"
 
-#: builtin/rebase.c:1526
+#: builtin/rebase.c:1546
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -18959,16 +19937,16 @@
 "Tienes que editar todos los conflictos de fusión y luego\n"
 "marcarlos como resueltos usando git add"
 
-#: builtin/rebase.c:1545
+#: builtin/rebase.c:1565
 msgid "could not discard worktree changes"
 msgstr "no se pudo descartar los cambios del árbol de trabajo"
 
-#: builtin/rebase.c:1564
+#: builtin/rebase.c:1584
 #, c-format
 msgid "could not move back to %s"
 msgstr "no se puede regresar a %s"
 
-#: builtin/rebase.c:1610
+#: builtin/rebase.c:1630
 #, c-format
 msgid ""
 "It seems that there is already a %s directory, and\n"
@@ -18989,135 +19967,135 @@
 "y ejecútame nuevamente. Me estoy deteniendo en caso de que tengas\n"
 "algo de valor ahí.\n"
 
-#: builtin/rebase.c:1638
+#: builtin/rebase.c:1658
 msgid "switch `C' expects a numerical value"
 msgstr "switch `C' espera un valor numérico"
 
-#: builtin/rebase.c:1680
+#: builtin/rebase.c:1700
 #, c-format
 msgid "Unknown mode: %s"
 msgstr "Modo desconocido: %s"
 
-#: builtin/rebase.c:1702
+#: builtin/rebase.c:1739
 msgid "--strategy requires --merge or --interactive"
 msgstr "--strategy requiere --merge o --interactive"
 
-#: builtin/rebase.c:1732
+#: builtin/rebase.c:1769
 msgid "cannot combine apply options with merge options"
 msgstr "no se pueden combinar opciones de apply con opciones de merge"
 
-#: builtin/rebase.c:1745
+#: builtin/rebase.c:1782
 #, c-format
 msgid "Unknown rebase backend: %s"
 msgstr "Backend de rebase desconocido: %s"
 
-#: builtin/rebase.c:1770
+#: builtin/rebase.c:1812
 msgid "--reschedule-failed-exec requires --exec or --interactive"
 msgstr "--reschedule-failed-exec requiere --exec o --interactive"
 
-#: builtin/rebase.c:1790
+#: builtin/rebase.c:1832
 msgid "cannot combine '--preserve-merges' with '--rebase-merges'"
 msgstr "no se puede combinar '--preserve-merges' con '--rebase-merges'"
 
-#: builtin/rebase.c:1794
+#: builtin/rebase.c:1836
 msgid ""
 "error: cannot combine '--preserve-merges' with '--reschedule-failed-exec'"
 msgstr ""
 "error: no se puede combinar '--preserve-merges' con '--reschedule-failed-"
 "exec'"
 
-#: builtin/rebase.c:1818
+#: builtin/rebase.c:1860
 #, c-format
 msgid "invalid upstream '%s'"
 msgstr "upstream inválido '%s'"
 
-#: builtin/rebase.c:1824
+#: builtin/rebase.c:1866
 msgid "Could not create new root commit"
 msgstr "No se pudo crear commit raíz nuevo"
 
-#: builtin/rebase.c:1850
+#: builtin/rebase.c:1892
 #, c-format
 msgid "'%s': need exactly one merge base with branch"
 msgstr "'%s': necesita exactamente una base de fusión con rama"
 
-#: builtin/rebase.c:1853
+#: builtin/rebase.c:1895
 #, c-format
 msgid "'%s': need exactly one merge base"
 msgstr "'%s': necesita exactamente una base de fusión"
 
-#: builtin/rebase.c:1861
+#: builtin/rebase.c:1903
 #, c-format
 msgid "Does not point to a valid commit '%s'"
 msgstr "No apunta a un commit válido '%s'"
 
-#: builtin/rebase.c:1887
+#: builtin/rebase.c:1931
 #, c-format
 msgid "fatal: no such branch/commit '%s'"
 msgstr "fatal: no existe la rama/commit: '%s'"
 
-#: builtin/rebase.c:1895 builtin/submodule--helper.c:40
-#: builtin/submodule--helper.c:1990
+#: builtin/rebase.c:1939 builtin/submodule--helper.c:40
+#: builtin/submodule--helper.c:2414
 #, c-format
 msgid "No such ref: %s"
 msgstr "No existe ref: %s"
 
-#: builtin/rebase.c:1906
+#: builtin/rebase.c:1950
 msgid "Could not resolve HEAD to a revision"
 msgstr "No se pudo resolver HEAD a una revisión"
 
-#: builtin/rebase.c:1927
+#: builtin/rebase.c:1971
 msgid "Please commit or stash them."
 msgstr "Por favor, confírmalos o guárdalos."
 
-#: builtin/rebase.c:1963
+#: builtin/rebase.c:2007
 #, c-format
 msgid "could not switch to %s"
 msgstr "no se pudo cambiar a %s"
 
-#: builtin/rebase.c:1974
+#: builtin/rebase.c:2018
 msgid "HEAD is up to date."
 msgstr "HEAD está actualizado."
 
-#: builtin/rebase.c:1976
+#: builtin/rebase.c:2020
 #, c-format
 msgid "Current branch %s is up to date.\n"
 msgstr "La rama actual %s está actualizada.\n"
 
-#: builtin/rebase.c:1984
+#: builtin/rebase.c:2028
 msgid "HEAD is up to date, rebase forced."
 msgstr "HEAD está actualizado, rebase forzado."
 
-#: builtin/rebase.c:1986
+#: builtin/rebase.c:2030
 #, c-format
 msgid "Current branch %s is up to date, rebase forced.\n"
 msgstr "Rama actual %s está actualizada, rebase forzado.\n"
 
-#: builtin/rebase.c:1994
+#: builtin/rebase.c:2038
 msgid "The pre-rebase hook refused to rebase."
 msgstr "El hook pre-rebase rechazó el rebase."
 
-#: builtin/rebase.c:2001
+#: builtin/rebase.c:2045
 #, c-format
 msgid "Changes to %s:\n"
 msgstr "Cambios a %s:\n"
 
-#: builtin/rebase.c:2004
+#: builtin/rebase.c:2048
 #, c-format
 msgid "Changes from %s to %s:\n"
 msgstr "Cambios desde %s a %s:\n"
 
-#: builtin/rebase.c:2029
+#: builtin/rebase.c:2073
 #, c-format
 msgid "First, rewinding head to replay your work on top of it...\n"
 msgstr ""
 "En primer lugar, rebobinando HEAD para después reproducir tus cambios encima "
 "de ésta...\n"
 
-#: builtin/rebase.c:2038
+#: builtin/rebase.c:2082
 msgid "Could not detach HEAD"
 msgstr "No se puede desacoplar HEAD"
 
-#: builtin/rebase.c:2047
+#: builtin/rebase.c:2091
 #, c-format
 msgid "Fast-forwarded %s to %s.\n"
 msgstr "Avance rápido de %s a %s.\n"
@@ -19126,7 +20104,7 @@
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <git-dir>"
 
-#: builtin/receive-pack.c:844
+#: builtin/receive-pack.c:1276
 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"
@@ -19159,7 +20137,7 @@
 "Para suprimir este mensaje y mantener el comportamiento predeterminado,\n"
 "configura 'receive.denyCurrentBranch' a 'refuse'."
 
-#: builtin/receive-pack.c:864
+#: builtin/receive-pack.c:1296
 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"
@@ -19180,11 +20158,11 @@
 "\n"
 "Para suprimir este mensaje, puedes configurarlo en 'refuse'."
 
-#: builtin/receive-pack.c:1970
+#: builtin/receive-pack.c:2481
 msgid "quiet"
 msgstr "tranquilo"
 
-#: builtin/receive-pack.c:1984
+#: builtin/receive-pack.c:2495
 msgid "You must specify a directory."
 msgstr "Se tiene que especificar un directorio."
 
@@ -19215,36 +20193,36 @@
 msgid "'%s' is not a valid timestamp"
 msgstr "'%s' no es una marca de tiempo válida"
 
-#: builtin/reflog.c:606
+#: builtin/reflog.c:609
 #, c-format
 msgid "Marking reachable objects..."
 msgstr "Marcando objectos alcanzables..."
 
-#: builtin/reflog.c:644
+#: builtin/reflog.c:647
 #, c-format
 msgid "%s points nowhere!"
 msgstr "¡%s apunta a ningún lado!"
 
-#: builtin/reflog.c:696
+#: builtin/reflog.c:699
 msgid "no reflog specified to delete"
 msgstr "no reflog especificado para borrar"
 
-#: builtin/reflog.c:705
+#: builtin/reflog.c:708
 #, c-format
 msgid "not a reflog: %s"
 msgstr "no es una reflog: %s"
 
-#: builtin/reflog.c:710
+#: builtin/reflog.c:713
 #, c-format
 msgid "no reflog for '%s'"
 msgstr "no reflog para '%s'"
 
-#: builtin/reflog.c:756
+#: builtin/reflog.c:759
 #, c-format
 msgid "invalid ref format: %s"
 msgstr "formato inválido: %s"
 
-#: builtin/reflog.c:765
+#: builtin/reflog.c:768
 msgid "git reflog [ show | expire | delete | exists ]"
 msgstr "git reflog [ show | expire | delete | exists ]"
 
@@ -19382,40 +20360,35 @@
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr "especificar ramas para rastrear solo tiene sentido con fetch mirrors"
 
-#: builtin/remote.c:195 builtin/remote.c:696
+#: builtin/remote.c:195 builtin/remote.c:700
 #, c-format
 msgid "remote %s already exists."
 msgstr "remoto %s ya existe."
 
-#: builtin/remote.c:199 builtin/remote.c:700
-#, c-format
-msgid "'%s' is not a valid remote name"
-msgstr "'%s' no es un nombre remoto válido"
-
-#: builtin/remote.c:239
+#: builtin/remote.c:240
 #, c-format
 msgid "Could not setup master '%s'"
 msgstr "No se pudo configurar master '%s'"
 
-#: builtin/remote.c:354
+#: builtin/remote.c:355
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr "No se pudo realizar el fetch al mapa para refspec %s"
 
-#: builtin/remote.c:453 builtin/remote.c:461
+#: builtin/remote.c:454 builtin/remote.c:462
 msgid "(matching)"
 msgstr "(concordando)"
 
-#: builtin/remote.c:465
+#: builtin/remote.c:466
 msgid "(delete)"
 msgstr "(eliminar)"
 
-#: builtin/remote.c:653
+#: builtin/remote.c:655
 #, c-format
 msgid "could not set '%s'"
 msgstr "no se pudo configurar '%s'"
 
-#: builtin/remote.c:658
+#: builtin/remote.c:660
 #, c-format
 msgid ""
 "The %s configuration remote.pushDefault in:\n"
@@ -19426,17 +20399,17 @@
 "\t%s:%d\n"
 "ahora nombra al remoto inexistente '%s'"
 
-#: builtin/remote.c:689 builtin/remote.c:832 builtin/remote.c:940
+#: builtin/remote.c:691 builtin/remote.c:836 builtin/remote.c:946
 #, c-format
 msgid "No such remote: '%s'"
 msgstr "No existe el remoto '%s'"
 
-#: builtin/remote.c:706
+#: builtin/remote.c:710
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "No se pudo renombrar la sección de configuración '%s' a '%s'"
 
-#: builtin/remote.c:726
+#: builtin/remote.c:730
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -19447,17 +20420,17 @@
 "\t%s\n"
 "\tPor favor actualice la configuración manualmente si es necesario."
 
-#: builtin/remote.c:766
+#: builtin/remote.c:770
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "borrando '%s' falló"
 
-#: builtin/remote.c:800
+#: builtin/remote.c:804
 #, c-format
 msgid "creating '%s' failed"
 msgstr "creando '%s' falló"
 
-#: builtin/remote.c:876
+#: builtin/remote.c:882
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -19472,118 +20445,118 @@
 "eliminadas;\n"
 "para borrarlas, use:"
 
-#: builtin/remote.c:890
+#: builtin/remote.c:896
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "No se pudo borrar la sección de configuración '%s'"
 
-#: builtin/remote.c:993
+#: builtin/remote.c:999
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " nuevo (siguiente fetch se guardará en remotes/%s)"
 
-#: builtin/remote.c:996
+#: builtin/remote.c:1002
 msgid " tracked"
 msgstr " rastreada"
 
-#: builtin/remote.c:998
+#: builtin/remote.c:1004
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " viejo ( use 'git remote prune' para eliminar)"
 
-#: builtin/remote.c:1000
+#: builtin/remote.c:1006
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:1041
+#: builtin/remote.c:1047
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "inválido branch.%s.merge; no se puede rebasar en > 1 rama"
 
-#: builtin/remote.c:1050
+#: builtin/remote.c:1056
 #, c-format
 msgid "rebases interactively onto remote %s"
 msgstr "rebasa interactivamente en remoto %s"
 
-#: builtin/remote.c:1052
+#: builtin/remote.c:1058
 #, c-format
 msgid "rebases interactively (with merges) onto remote %s"
 msgstr "rebasa interactivamente (con fusiones) en remoto %s"
 
-#: builtin/remote.c:1055
+#: builtin/remote.c:1061
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "rebasa sobre el remoto %s"
 
-#: builtin/remote.c:1059
+#: builtin/remote.c:1065
 #, c-format
 msgid " merges with remote %s"
 msgstr " se fusiona con remoto %s"
 
-#: builtin/remote.c:1062
+#: builtin/remote.c:1068
 #, c-format
 msgid "merges with remote %s"
 msgstr "fusiona con remoto %s"
 
-#: builtin/remote.c:1065
+#: builtin/remote.c:1071
 #, c-format
 msgid "%-*s    and with remote %s\n"
 msgstr "%-*s y con el remoto %s\n"
 
-#: builtin/remote.c:1108
+#: builtin/remote.c:1114
 msgid "create"
 msgstr "crear"
 
-#: builtin/remote.c:1111
+#: builtin/remote.c:1117
 msgid "delete"
 msgstr "borrar"
 
-#: builtin/remote.c:1115
+#: builtin/remote.c:1121
 msgid "up to date"
 msgstr "actualizado"
 
-#: builtin/remote.c:1118
+#: builtin/remote.c:1124
 msgid "fast-forwardable"
 msgstr "puede realizar fast-forward"
 
-#: builtin/remote.c:1121
+#: builtin/remote.c:1127
 msgid "local out of date"
 msgstr "desactualizado local"
 
-#: builtin/remote.c:1128
+#: builtin/remote.c:1134
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s fuerza a %-*s (%s)"
 
-#: builtin/remote.c:1131
+#: builtin/remote.c:1137
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s publica a %-*s (%s)"
 
-#: builtin/remote.c:1135
+#: builtin/remote.c:1141
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s fuerza a %s"
 
-#: builtin/remote.c:1138
+#: builtin/remote.c:1144
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s publica a %s"
 
-#: builtin/remote.c:1206
+#: builtin/remote.c:1212
 msgid "do not query remotes"
 msgstr "no consultar remotos"
 
-#: builtin/remote.c:1233
+#: builtin/remote.c:1239
 #, c-format
 msgid "* remote %s"
 msgstr "* remoto %s"
 
-#: builtin/remote.c:1234
+#: builtin/remote.c:1240
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL  para obtener: %s"
 
-#: builtin/remote.c:1235 builtin/remote.c:1251 builtin/remote.c:1390
+#: builtin/remote.c:1241 builtin/remote.c:1257 builtin/remote.c:1396
 msgid "(no URL)"
 msgstr "(sin URL)"
 
@@ -19591,185 +20564,185 @@
 #. with the one in " Fetch URL: %s"
 #. translation.
 #.
-#: builtin/remote.c:1249 builtin/remote.c:1251
+#: builtin/remote.c:1255 builtin/remote.c:1257
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL para publicar: %s"
 
-#: builtin/remote.c:1253 builtin/remote.c:1255 builtin/remote.c:1257
+#: builtin/remote.c:1259 builtin/remote.c:1261 builtin/remote.c:1263
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Rama HEAD: %s"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1259
 msgid "(not queried)"
 msgstr "(no consultado)"
 
-#: builtin/remote.c:1255
+#: builtin/remote.c:1261
 msgid "(unknown)"
 msgstr "(desconocido)"
 
-#: builtin/remote.c:1259
+#: builtin/remote.c:1265
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr ""
 "  HEAD en rama ( HEAD remoto es ambiguo, puede ser uno de los siguientes):\n"
 
-#: builtin/remote.c:1271
+#: builtin/remote.c:1277
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Rama remota:%s"
 msgstr[1] "  Ramas remotas:%s"
 
-#: builtin/remote.c:1274 builtin/remote.c:1300
+#: builtin/remote.c:1280 builtin/remote.c:1306
 msgid " (status not queried)"
 msgstr " (estado no consultado)"
 
-#: builtin/remote.c:1283
+#: builtin/remote.c:1289
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Rama local configurada para 'git pull':"
 msgstr[1] "  Ramas locales configuradas para 'git pull':"
 
-#: builtin/remote.c:1291
+#: builtin/remote.c:1297
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Las referencias locales serán reflejadas por 'git push'"
 
-#: builtin/remote.c:1297
+#: builtin/remote.c:1303
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Referencia local configurada para 'git push'%s:"
 msgstr[1] "  Referencias locales configuradas para 'git push'%s:"
 
-#: builtin/remote.c:1318
+#: builtin/remote.c:1324
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "configurar refs/remotes/<nombre>/HEAD de acuerdo al remoto"
 
-#: builtin/remote.c:1320
+#: builtin/remote.c:1326
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "borrar refs/remotos/<nombre>/HEAD"
 
-#: builtin/remote.c:1335
+#: builtin/remote.c:1341
 msgid "Cannot determine remote HEAD"
 msgstr "No se puede determinar el HEAD remoto"
 
-#: builtin/remote.c:1337
+#: builtin/remote.c:1343
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "Múltiples ramas HEAD remotas. Por favor escoja una explícitamente con:"
 
-#: builtin/remote.c:1347
+#: builtin/remote.c:1353
 #, c-format
 msgid "Could not delete %s"
 msgstr "No se pudo borrar %s"
 
-#: builtin/remote.c:1355
+#: builtin/remote.c:1361
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "No es un ref válido: %s"
 
-#: builtin/remote.c:1357
+#: builtin/remote.c:1363
 #, c-format
 msgid "Could not setup %s"
 msgstr "No se pudo configurar %s"
 
-#: builtin/remote.c:1375
+#: builtin/remote.c:1381
 #, c-format
 msgid " %s will become dangling!"
 msgstr " ¡%s será colgado!"
 
-#: builtin/remote.c:1376
+#: builtin/remote.c:1382
 #, c-format
 msgid " %s has become dangling!"
 msgstr " ¡%s ha sido colgado!"
 
-#: builtin/remote.c:1386
+#: builtin/remote.c:1392
 #, c-format
 msgid "Pruning %s"
 msgstr "Recortando %s"
 
-#: builtin/remote.c:1387
+#: builtin/remote.c:1393
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1403
+#: builtin/remote.c:1409
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [ejecutará prune] %s"
 
-#: builtin/remote.c:1406
+#: builtin/remote.c:1412
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [prune realizado] %s"
 
-#: builtin/remote.c:1451
+#: builtin/remote.c:1457
 msgid "prune remotes after fetching"
 msgstr "recortar remotos tras realizar fetch"
 
-#: builtin/remote.c:1514 builtin/remote.c:1568 builtin/remote.c:1636
+#: builtin/remote.c:1521 builtin/remote.c:1577 builtin/remote.c:1647
 #, c-format
 msgid "No such remote '%s'"
 msgstr "No existe el remoto '%s'"
 
-#: builtin/remote.c:1530
+#: builtin/remote.c:1539
 msgid "add branch"
 msgstr "agregar rama"
 
-#: builtin/remote.c:1537
+#: builtin/remote.c:1546
 msgid "no remote specified"
 msgstr "no hay remotos especificados"
 
-#: builtin/remote.c:1554
+#: builtin/remote.c:1563
 msgid "query push URLs rather than fetch URLs"
 msgstr "consultar URLs de push en lugar de URLs de fetch"
 
-#: builtin/remote.c:1556
+#: builtin/remote.c:1565
 msgid "return all URLs"
 msgstr "retornar todos los URLs"
 
-#: builtin/remote.c:1584
+#: builtin/remote.c:1595
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "no hay URLs configurados para remoto '%s'"
 
-#: builtin/remote.c:1610
+#: builtin/remote.c:1621
 msgid "manipulate push URLs"
 msgstr "manipular URLs de push"
 
-#: builtin/remote.c:1612
+#: builtin/remote.c:1623
 msgid "add URL"
 msgstr "agregar URL"
 
-#: builtin/remote.c:1614
+#: builtin/remote.c:1625
 msgid "delete URLs"
 msgstr "borrar URLs"
 
-#: builtin/remote.c:1621
+#: builtin/remote.c:1632
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete no tiene sentido"
 
-#: builtin/remote.c:1660
+#: builtin/remote.c:1673
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Patrón de URL viejo inválido: %s"
 
-#: builtin/remote.c:1668
+#: builtin/remote.c:1681
 #, c-format
 msgid "No such URL found: %s"
 msgstr "No se encontró URL: %s"
 
-#: builtin/remote.c:1670
+#: builtin/remote.c:1683
 msgid "Will not delete all non-push URLs"
 msgstr "No borrará todos los URLs de no-push"
 
-#: builtin/repack.c:25
+#: builtin/repack.c:26
 msgid "git repack [<options>]"
 msgstr "git repack [<opciones>]"
 
-#: builtin/repack.c:30
+#: builtin/repack.c:31
 msgid ""
 "Incremental repacks are incompatible with bitmap indexes.  Use\n"
 "--no-write-bitmap-index or disable the pack.writebitmaps configuration."
@@ -19777,137 +20750,123 @@
 "Re empaquetados incrementales son incompatibles con índices bitmap. Use \n"
 "--no-write-bitmap-index o deshabilite la configuración pack.writebitmaps."
 
-#: builtin/repack.c:193
+#: builtin/repack.c:198
 msgid "could not start pack-objects to repack promisor objects"
 msgstr "no se puede iniciar pack-objects para reempaquetar objetos promisores"
 
-#: builtin/repack.c:232 builtin/repack.c:418
+#: builtin/repack.c:270 builtin/repack.c:446
 msgid "repack: Expecting full hex object ID lines only from pack-objects."
 msgstr ""
 "repack: Esperando líneas de ID de objeto en full hex solo desde pack-objects."
 
-#: builtin/repack.c:256
+#: builtin/repack.c:294
 msgid "could not finish pack-objects to repack promisor objects"
 msgstr ""
 "no se puede finalizar pack-objects para reempaquetar objetos promisores"
 
-#: builtin/repack.c:294
+#: builtin/repack.c:322
 msgid "pack everything in a single pack"
 msgstr "empaquetar todo en un único paquete"
 
-#: builtin/repack.c:296
+#: builtin/repack.c:324
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "lo mismo que -a, y pierde objetos inaccesibles"
 
-#: builtin/repack.c:299
+#: builtin/repack.c:327
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "eliminar paquetes redundantes, y ejecutar git-prune-packed"
 
-#: builtin/repack.c:301
+#: builtin/repack.c:329
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "pasar --no-reuse-delta a git-pack-objects"
 
-#: builtin/repack.c:303
+#: builtin/repack.c:331
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "pasar --no-reuse-object a git-pack-objects"
 
-#: builtin/repack.c:305
+#: builtin/repack.c:333
 msgid "do not run git-update-server-info"
 msgstr "no ejecutar git-update-server-info"
 
-#: builtin/repack.c:308
+#: builtin/repack.c:336
 msgid "pass --local to git-pack-objects"
 msgstr "pasar --local a git-pack-objects"
 
-#: builtin/repack.c:310
+#: builtin/repack.c:338
 msgid "write bitmap index"
 msgstr "escribir un índice de bitmap"
 
-#: builtin/repack.c:312
+#: builtin/repack.c:340
 msgid "pass --delta-islands to git-pack-objects"
 msgstr "pasar --delta-islands a git-pack-objects"
 
-#: builtin/repack.c:313
+#: builtin/repack.c:341
 msgid "approxidate"
 msgstr "aproxime"
 
-#: builtin/repack.c:314
+#: builtin/repack.c:342
 msgid "with -A, do not loosen objects older than this"
 msgstr "con -A, no perder objetos más antiguos que este"
 
-#: builtin/repack.c:316
+#: builtin/repack.c:344
 msgid "with -a, repack unreachable objects"
 msgstr "con -a, re empaquetar objetos inalcanzables"
 
-#: builtin/repack.c:318
+#: builtin/repack.c:346
 msgid "size of the window used for delta compression"
 msgstr "tamaño de la ventana usado para la compresión delta"
 
-#: builtin/repack.c:319 builtin/repack.c:325
+#: builtin/repack.c:347 builtin/repack.c:353
 msgid "bytes"
 msgstr "bytes"
 
-#: builtin/repack.c:320
+#: builtin/repack.c:348
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
 "lo mismo que arriba, pero limita el tamaño de memoria en lugar de contar "
 "entradas"
 
-#: builtin/repack.c:322
+#: builtin/repack.c:350
 msgid "limits the maximum delta depth"
 msgstr "limita la profundidad máxima del delta"
 
-#: builtin/repack.c:324
+#: builtin/repack.c:352
 msgid "limits the maximum number of threads"
 msgstr "limita el número máximo de hilos"
 
-#: builtin/repack.c:326
+#: builtin/repack.c:354
 msgid "maximum size of each packfile"
 msgstr "tamaño máximo de cada paquete"
 
-#: builtin/repack.c:328
+#: builtin/repack.c:356
 msgid "repack objects in packs marked with .keep"
 msgstr "re-empaquetar objetos en paquetes marcados con .keep"
 
-#: builtin/repack.c:330
+#: builtin/repack.c:358
 msgid "do not repack this pack"
 msgstr "no reempaquetar este paquete"
 
-#: builtin/repack.c:340
+#: builtin/repack.c:368
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "no se pueden borrar paquetes en un repositorio de objetos-preciosos"
 
-#: builtin/repack.c:344
+#: builtin/repack.c:372
 msgid "--keep-unreachable and -A are incompatible"
 msgstr "--keep-unreachable y -A son incompatibles"
 
-#: builtin/repack.c:427
+#: builtin/repack.c:455
 msgid "Nothing new to pack."
 msgstr "Nada nuevo para empaquetar."
 
-#: builtin/repack.c:488
+#: builtin/repack.c:485
 #, c-format
-msgid ""
-"WARNING: Some packs in use have been renamed by\n"
-"WARNING: prefixing old- to their name, in order to\n"
-"WARNING: replace them with the new version of the\n"
-"WARNING: file.  But the operation failed, and the\n"
-"WARNING: attempt to rename them back to their\n"
-"WARNING: original names also failed.\n"
-"WARNING: Please rename them in %s manually:\n"
-msgstr ""
-"WARNING: Algunos packs en uso han sido renombrados\n"
-"WARNING: agregando el prefijo old- a sus nombres,para\n"
-"WARNING: reemplazarlos con la nueva versión del\n"
-"WARNING: archivo. Pero la operación falló, y el intento\n"
-"WARNING: de renombrarlos a sus nombres originales\n"
-"WARNING: también falló.\n"
-"WARNING: Por favor renombralos en %s manualmente:\n"
+msgid "missing required file: %s"
+msgstr "falta archivo requerido: %s"
 
-#: builtin/repack.c:536
+#: builtin/repack.c:487
 #, c-format
-msgid "failed to remove '%s'"
-msgstr "falló al eliminar'%s'"
+msgid "could not unlink: %s"
+msgstr "no se pudo desvincular: %s"
 
 #: builtin/replace.c:22
 msgid "git replace [-f] <object> <replacement>"
@@ -20237,8 +21196,8 @@
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr "No se puede realziar un reset %s  en medio de una fusión."
 
-#: builtin/reset.c:295 builtin/stash.c:520 builtin/stash.c:595
-#: builtin/stash.c:619
+#: builtin/reset.c:295 builtin/stash.c:587 builtin/stash.c:661
+#: builtin/stash.c:685
 msgid "be quiet, only report errors"
 msgstr "ser silencioso, solo reportar errores"
 
@@ -20323,19 +21282,19 @@
 msgid "Could not write new index file."
 msgstr "No se puede escribir un nuevo archivo índice."
 
-#: builtin/rev-list.c:499
+#: builtin/rev-list.c:534
 msgid "cannot combine --exclude-promisor-objects and --missing"
 msgstr "no se puede combinar --exclude-promisor-objects y --missing"
 
-#: builtin/rev-list.c:560
+#: builtin/rev-list.c:595
 msgid "object filtering requires --objects"
 msgstr "filtrado de objetos requiere --objects"
 
-#: builtin/rev-list.c:610
+#: builtin/rev-list.c:651
 msgid "rev-list does not support display of notes"
 msgstr "rev-list no soporta mostrar notas"
 
-#: builtin/rev-list.c:615
+#: builtin/rev-list.c:656
 msgid "marked counting is incompatible with --objects"
 msgstr "conteo de marcas es incompatible con --objects"
 
@@ -20448,11 +21407,11 @@
 msgid "keep redundant, empty commits"
 msgstr "mantener commits redundantes, vacíos"
 
-#: builtin/revert.c:232
+#: builtin/revert.c:239
 msgid "revert failed"
 msgstr "falló al revertir"
 
-#: builtin/revert.c:245
+#: builtin/revert.c:252
 msgid "cherry-pick failed"
 msgstr "cherry-pick falló"
 
@@ -20554,55 +21513,76 @@
 "[<ref>...]\n"
 "  --all y especificaciones <ref> explícitas son mutuamente exclusivas."
 
-#: builtin/send-pack.c:163
+#: builtin/send-pack.c:188
 msgid "remote name"
 msgstr "nombre remoto"
 
-#: builtin/send-pack.c:176
+#: builtin/send-pack.c:201
 msgid "use stateless RPC protocol"
 msgstr "usar protocolo RPC sin estado"
 
-#: builtin/send-pack.c:177
+#: builtin/send-pack.c:202
 msgid "read refs from stdin"
 msgstr "leer refs de stdin"
 
-#: builtin/send-pack.c:178
+#: builtin/send-pack.c:203
 msgid "print status from remote helper"
 msgstr "mostrar status del remote helper"
 
-#: builtin/shortlog.c:14
+#: builtin/shortlog.c:16
 msgid "git shortlog [<options>] [<revision-range>] [[--] <path>...]"
 msgstr "git shortlog [<opciones>] [<rango-de-revisión>] [[--] <ruta>...]"
 
-#: builtin/shortlog.c:15
+#: builtin/shortlog.c:17
 msgid "git log --pretty=short | git shortlog [<options>]"
 msgstr "git log --pretty=short | git shorlog [<opciones>]"
 
-#: builtin/shortlog.c:264
-msgid "Group by committer rather than author"
-msgstr "Agrupar por committer en lugar de autor"
+#: builtin/shortlog.c:123
+msgid "using multiple --group options with stdin is not supported"
+msgstr "no se admite el uso de múltiples opciones de grupo --group con stdin"
 
-#: builtin/shortlog.c:266
+#: builtin/shortlog.c:133
+msgid "using --group=trailer with stdin is not supported"
+msgstr "el uso de --group = trailer con stdin no es compatible"
+
+#: builtin/shortlog.c:323
+#, c-format
+msgid "unknown group type: %s"
+msgstr "tipo de grupo desconocido: %s"
+
+#: builtin/shortlog.c:351
+msgid "group by committer rather than author"
+msgstr "agrupar por committer en lugar de autor"
+
+#: builtin/shortlog.c:354
 msgid "sort output according to the number of commits per author"
 msgstr "ordenar salida de acuerdo al número de commits por autor"
 
-#: builtin/shortlog.c:268
-msgid "Suppress commit descriptions, only provides commit count"
-msgstr "Suprimir descripción de commits, solo proveer cuenta de commits"
+#: builtin/shortlog.c:356
+msgid "suppress commit descriptions, only provides commit count"
+msgstr "suprimir descripción de commits, solo proveer cuenta de commits"
 
-#: builtin/shortlog.c:270
-msgid "Show the email address of each author"
-msgstr "Mostrar la dirección de correo de cada autor"
+#: builtin/shortlog.c:358
+msgid "show the email address of each author"
+msgstr "mostrar la dirección de correo de cada autor"
 
-#: builtin/shortlog.c:271
+#: builtin/shortlog.c:359
 msgid "<w>[,<i1>[,<i2>]]"
 msgstr "<w>[,<i1>[,<i2>]]"
 
-#: builtin/shortlog.c:272
-msgid "Linewrap output"
-msgstr "Salida de línea"
+#: builtin/shortlog.c:360
+msgid "linewrap output"
+msgstr "salida de línea"
 
-#: builtin/shortlog.c:301
+#: builtin/shortlog.c:362
+msgid "field"
+msgstr "campo"
+
+#: builtin/shortlog.c:363
+msgid "group by field"
+msgstr "agrupar por campo"
+
+#: builtin/shortlog.c:391
 msgid "too many arguments given outside repository"
 msgstr "demasiados argumentos dados fuera del repositorio"
 
@@ -20797,62 +21777,74 @@
 msgid "git sparse-checkout (init|list|set|add|reapply|disable) <options>"
 msgstr "git sparse-checkout (init|list|set|add|reapply|disable) <opciones>"
 
-#: builtin/sparse-checkout.c:64
+#: builtin/sparse-checkout.c:45
+msgid "git sparse-checkout list"
+msgstr "git sparse-checkout list"
+
+#: builtin/sparse-checkout.c:71
 msgid "this worktree is not sparse (sparse-checkout file may not exist)"
 msgstr ""
 "este árbol de trabajo no tiene sparse (archivo sparese-checkout tal vez no "
 "existe)"
 
-#: builtin/sparse-checkout.c:216
+#: builtin/sparse-checkout.c:223
 msgid "failed to create directory for sparse-checkout file"
 msgstr "falló al crear directorio para el archivo sparse-checkout"
 
-#: builtin/sparse-checkout.c:257
+#: builtin/sparse-checkout.c:264
 msgid "unable to upgrade repository format to enable worktreeConfig"
 msgstr ""
 "no es posible actualizar el formato de repositorio para habilitar "
 "worktreeConfig"
 
-#: builtin/sparse-checkout.c:259
+#: builtin/sparse-checkout.c:266
 msgid "failed to set extensions.worktreeConfig setting"
 msgstr "falló al configurar opción extensions.worktreeConfig"
 
-#: builtin/sparse-checkout.c:276
+#: builtin/sparse-checkout.c:283
 msgid "git sparse-checkout init [--cone]"
 msgstr "git sparse-checkout init [--cone]"
 
-#: builtin/sparse-checkout.c:295
+#: builtin/sparse-checkout.c:302
 msgid "initialize the sparse-checkout in cone mode"
 msgstr "inicializa el sparse-checkout en modo cono"
 
-#: builtin/sparse-checkout.c:332
+#: builtin/sparse-checkout.c:339
 #, c-format
 msgid "failed to open '%s'"
 msgstr "falló al abrir '%s'"
 
-#: builtin/sparse-checkout.c:389
+#: builtin/sparse-checkout.c:396
 #, c-format
 msgid "could not normalize path %s"
 msgstr "no se pudo normalizar la ruta %s"
 
-#: builtin/sparse-checkout.c:401
+#: builtin/sparse-checkout.c:408
 msgid "git sparse-checkout (set|add) (--stdin | <patterns>)"
 msgstr "git sparse-checkout (set|add) (--stdin | <patrones>)"
 
-#: builtin/sparse-checkout.c:426
+#: builtin/sparse-checkout.c:433
 #, c-format
 msgid "unable to unquote C-style string '%s'"
 msgstr "no es posible dequote para la cadena de estilo C '%s'"
 
-#: builtin/sparse-checkout.c:480 builtin/sparse-checkout.c:504
+#: builtin/sparse-checkout.c:487 builtin/sparse-checkout.c:511
 msgid "unable to load existing sparse-checkout patterns"
 msgstr "no se pudo cargar patrones de sparse-checkout existentes"
 
-#: builtin/sparse-checkout.c:549
+#: builtin/sparse-checkout.c:556
 msgid "read patterns from standard in"
 msgstr "leer patrones de standard in"
 
-#: builtin/sparse-checkout.c:586
+#: builtin/sparse-checkout.c:571
+msgid "git sparse-checkout reapply"
+msgstr "git sparse-checkout reapply"
+
+#: builtin/sparse-checkout.c:590
+msgid "git sparse-checkout disable"
+msgstr "git sparse-checkout disable"
+
+#: builtin/sparse-checkout.c:618
 msgid "error while refreshing working directory"
 msgstr "error al refrescar directorio de trabajo"
 
@@ -20942,153 +21934,165 @@
 msgstr "%s no es una referencia válida"
 
 #: builtin/stash.c:225
-msgid "git stash clear with parameters is unimplemented"
-msgstr "git stash clear con parámetros no está implementado"
+msgid "git stash clear with arguments is unimplemented"
+msgstr "git stash clear con argumentos no está implementado"
 
-#: builtin/stash.c:404
+#: builtin/stash.c:429
+#, c-format
+msgid ""
+"WARNING: Untracked file in way of tracked file!  Renaming\n"
+"            %s -> %s\n"
+"         to make room.\n"
+msgstr ""
+"ADVERTENCIA: Archivo sin seguimiento en forma de archivo con seguimiento. "
+"Renombrar\n"
+"             %s ->%s\n"
+"          Para hacer espacio.\n"
+
+#: builtin/stash.c:490
 msgid "cannot apply a stash in the middle of a merge"
 msgstr "no se puede aplicar un stash en medio de un merge"
 
-#: builtin/stash.c:415
+#: builtin/stash.c:501
 #, c-format
 msgid "could not generate diff %s^!."
 msgstr "no se pudo generar diff %s^!."
 
-#: builtin/stash.c:422
-msgid "conflicts in index.Try without --index."
+#: builtin/stash.c:508
+msgid "conflicts in index. Try without --index."
 msgstr "conflictos en índice. Intente sin --index."
 
-#: builtin/stash.c:428
+#: builtin/stash.c:514
 msgid "could not save index tree"
 msgstr "no se puede guardar el índice del árbol"
 
-#: builtin/stash.c:437
+#: builtin/stash.c:523
 msgid "could not restore untracked files from stash"
 msgstr "no se pueden restaurar archivos no rastreados de la entrada stash"
 
-#: builtin/stash.c:451
+#: builtin/stash.c:537
 #, c-format
 msgid "Merging %s with %s"
 msgstr "Fusionando %s con %s"
 
-#: builtin/stash.c:461
+#: builtin/stash.c:547
 msgid "Index was not unstashed."
 msgstr "El índice no fue sacado de stash."
 
-#: builtin/stash.c:522 builtin/stash.c:621
+#: builtin/stash.c:589 builtin/stash.c:687
 msgid "attempt to recreate the index"
 msgstr "intento de recrear el index"
 
-#: builtin/stash.c:555
+#: builtin/stash.c:633
 #, c-format
 msgid "Dropped %s (%s)"
 msgstr "Botado %s (%s)"
 
-#: builtin/stash.c:558
+#: builtin/stash.c:636
 #, c-format
 msgid "%s: Could not drop stash entry"
 msgstr "%s: No se pudo borrar entrada stash"
 
-#: builtin/stash.c:583
+#: builtin/stash.c:649
 #, c-format
 msgid "'%s' is not a stash reference"
 msgstr "'%s' no es una referencia stash"
 
-#: builtin/stash.c:633
+#: builtin/stash.c:699
 msgid "The stash entry is kept in case you need it again."
 msgstr "La entrada de stash se guardó en caso de ser necesario nuevamente."
 
-#: builtin/stash.c:656
+#: builtin/stash.c:722
 msgid "No branch name specified"
 msgstr "No se especificó el nombre de la rama"
 
-#: builtin/stash.c:800 builtin/stash.c:837
+#: builtin/stash.c:866 builtin/stash.c:903
 #, c-format
 msgid "Cannot update %s with %s"
 msgstr "No se puede actualizar %s con %s"
 
-#: builtin/stash.c:818 builtin/stash.c:1475 builtin/stash.c:1540
+#: builtin/stash.c:884 builtin/stash.c:1538 builtin/stash.c:1603
 msgid "stash message"
 msgstr "mensaje de stash"
 
-#: builtin/stash.c:828
+#: builtin/stash.c:894
 msgid "\"git stash store\" requires one <commit> argument"
 msgstr "\"git stash store\" requiere un argumento <commit>"
 
-#: builtin/stash.c:1046
+#: builtin/stash.c:1109
 msgid "No changes selected"
 msgstr "Sin cambios seleccionados"
 
-#: builtin/stash.c:1146
+#: builtin/stash.c:1209
 msgid "You do not have the initial commit yet"
 msgstr "Aún no tienes un commit inicial"
 
-#: builtin/stash.c:1173
+#: builtin/stash.c:1236
 msgid "Cannot save the current index state"
 msgstr "No se puede guardar el estado actual del índice"
 
-#: builtin/stash.c:1182
+#: builtin/stash.c:1245
 msgid "Cannot save the untracked files"
 msgstr "No se pueden guardar los archivos no rastreados"
 
-#: builtin/stash.c:1193 builtin/stash.c:1202
+#: builtin/stash.c:1256 builtin/stash.c:1265
 msgid "Cannot save the current worktree state"
 msgstr "No se puede guardar el estado actual del árbol de trabajo"
 
-#: builtin/stash.c:1230
+#: builtin/stash.c:1293
 msgid "Cannot record working tree state"
 msgstr "No se puede grabar el estado del árbol de trabajo"
 
-#: builtin/stash.c:1279
+#: builtin/stash.c:1342
 msgid "Can't use --patch and --include-untracked or --all at the same time"
 msgstr "No se puede usar --patch y --include-untracked o --all al mismo tiempo"
 
-#: builtin/stash.c:1295
+#: builtin/stash.c:1358
 msgid "Did you forget to 'git add'?"
 msgstr "¿Olvidaste 'git add'?"
 
-#: builtin/stash.c:1310
+#: builtin/stash.c:1373
 msgid "No local changes to save"
 msgstr "No hay cambios locales para guardar"
 
-#: builtin/stash.c:1317
+#: builtin/stash.c:1380
 msgid "Cannot initialize stash"
 msgstr "No se puede inicializar stash"
 
-#: builtin/stash.c:1332
+#: builtin/stash.c:1395
 msgid "Cannot save the current status"
 msgstr "No se puede guardar el estado actual"
 
-#: builtin/stash.c:1337
+#: builtin/stash.c:1400
 #, c-format
 msgid "Saved working directory and index state %s"
 msgstr "Directorio de trabajo guardado y estado de índice %s"
 
-#: builtin/stash.c:1427
+#: builtin/stash.c:1490
 msgid "Cannot remove worktree changes"
 msgstr "No se pueden eliminar cambios del árbol de trabajo"
 
-#: builtin/stash.c:1466 builtin/stash.c:1531
+#: builtin/stash.c:1529 builtin/stash.c:1594
 msgid "keep index"
 msgstr "mantener index"
 
-#: builtin/stash.c:1468 builtin/stash.c:1533
+#: builtin/stash.c:1531 builtin/stash.c:1596
 msgid "stash in patch mode"
 msgstr "stash en modo patch"
 
-#: builtin/stash.c:1469 builtin/stash.c:1534
+#: builtin/stash.c:1532 builtin/stash.c:1597
 msgid "quiet mode"
 msgstr "modo tranquilo"
 
-#: builtin/stash.c:1471 builtin/stash.c:1536
+#: builtin/stash.c:1534 builtin/stash.c:1599
 msgid "include untracked files in stash"
 msgstr "incluir archivos sin seguimiento en stash"
 
-#: builtin/stash.c:1473 builtin/stash.c:1538
+#: builtin/stash.c:1536 builtin/stash.c:1601
 msgid "include ignore files"
 msgstr "incluir archivos ignorados"
 
-#: builtin/stash.c:1573
+#: builtin/stash.c:1636
 msgid ""
 "the stash.useBuiltin support has been removed!\n"
 "See its entry in 'git help config' for details."
@@ -21113,7 +22117,7 @@
 msgid "prepend comment character and space to each line"
 msgstr "anteponer carácter de comentario y espacio a cada línea"
 
-#: builtin/submodule--helper.c:47 builtin/submodule--helper.c:1999
+#: builtin/submodule--helper.c:47 builtin/submodule--helper.c:2423
 #, c-format
 msgid "Expecting a full ref name, got %s"
 msgstr "Se esperaba un nombre de ref completo, se obtuvo %s"
@@ -21127,7 +22131,7 @@
 msgid "cannot strip one component off url '%s'"
 msgstr "no se puede quitar un componente del url '%s'"
 
-#: builtin/submodule--helper.c:410 builtin/submodule--helper.c:1395
+#: builtin/submodule--helper.c:410 builtin/submodule--helper.c:1819
 msgid "alternative anchor for relative paths"
 msgstr "ancho alternativo para rutas relativas"
 
@@ -21135,8 +22139,8 @@
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<ruta>] [<ruta>...]"
 
-#: builtin/submodule--helper.c:472 builtin/submodule--helper.c:630
-#: builtin/submodule--helper.c:653
+#: builtin/submodule--helper.c:472 builtin/submodule--helper.c:629
+#: builtin/submodule--helper.c:652
 #, c-format
 msgid "No url found for submodule path '%s' in .gitmodules"
 msgstr "No se encontró url para la ruta del submódulo '%s' en .gitmodules"
@@ -21167,12 +22171,13 @@
 "."
 
 #: builtin/submodule--helper.c:565
-msgid "Suppress output of entering each submodule command"
-msgstr "Suprime la salida al inicializar cada comando de submódulo"
+msgid "suppress output of entering each submodule command"
+msgstr "suprime la salida al inicializar cada comando de submódulo"
 
-#: builtin/submodule--helper.c:567 builtin/submodule--helper.c:1063
-msgid "Recurse into nested submodules"
-msgstr "Recursar en submódulos anidados"
+#: builtin/submodule--helper.c:567 builtin/submodule--helper.c:888
+#: builtin/submodule--helper.c:1487
+msgid "recurse into nested submodules"
+msgstr "recursar en submódulos anidados"
 
 #: builtin/submodule--helper.c:572
 msgid "git submodule--helper foreach [--quiet] [--recursive] [--] <command>"
@@ -21187,105 +22192,158 @@
 "no se pudo encontrar configuración '%s'. Asumiendo que este repositorio es "
 "su propio upstream autoritativo."
 
-#: builtin/submodule--helper.c:667
+#: builtin/submodule--helper.c:666
 #, c-format
 msgid "Failed to register url for submodule path '%s'"
 msgstr "Falló al registrar el url para la ruta del submódulo '%s'"
 
-#: builtin/submodule--helper.c:671
+#: builtin/submodule--helper.c:670
 #, c-format
 msgid "Submodule '%s' (%s) registered for path '%s'\n"
 msgstr "Submódulo '%s' (%s) registrado para ruta '%s'\n"
 
-#: builtin/submodule--helper.c:681
+#: builtin/submodule--helper.c:680
 #, c-format
 msgid "warning: command update mode suggested for submodule '%s'\n"
 msgstr ""
 "peligro: modo de actualización de comandos sugerido para el submódulo '%s'\n"
 
-#: builtin/submodule--helper.c:688
+#: builtin/submodule--helper.c:687
 #, c-format
 msgid "Failed to register update mode for submodule path '%s'"
 msgstr ""
 "Error al registrar el modo de actualización para la ruta del submódulo '%s'"
 
-#: builtin/submodule--helper.c:710
-msgid "Suppress output for initializing a submodule"
-msgstr "Suprime la salida para inicializar un submódulo"
+#: builtin/submodule--helper.c:709
+msgid "suppress output for initializing a submodule"
+msgstr "suprime la salida para inicializar un submódulo"
 
-#: builtin/submodule--helper.c:715
+#: builtin/submodule--helper.c:714
 msgid "git submodule--helper init [<options>] [<path>]"
 msgstr "git submodule--helper init [<opciones>] [<path>]"
 
-#: builtin/submodule--helper.c:789 builtin/submodule--helper.c:924
+#: builtin/submodule--helper.c:787 builtin/submodule--helper.c:922
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr ""
 "no se ha encontrado mapeo de submódulos en .gitmodules para la ruta '%s'"
 
-#: builtin/submodule--helper.c:837
+#: builtin/submodule--helper.c:835
 #, c-format
 msgid "could not resolve HEAD ref inside the submodule '%s'"
 msgstr "no pudo resolver ref de HEAD dentro del submódulo '%s'"
 
-#: builtin/submodule--helper.c:864 builtin/submodule--helper.c:1033
+#: builtin/submodule--helper.c:862 builtin/submodule--helper.c:1457
 #, c-format
 msgid "failed to recurse into submodule '%s'"
 msgstr "falló al recursar en el submódulo '%s'"
 
-#: builtin/submodule--helper.c:888 builtin/submodule--helper.c:1199
-msgid "Suppress submodule status output"
-msgstr "Suprimir output del estado del submódulo"
+#: builtin/submodule--helper.c:886 builtin/submodule--helper.c:1623
+msgid "suppress submodule status output"
+msgstr "suprimir output del estado del submódulo"
 
-#: builtin/submodule--helper.c:889
+#: builtin/submodule--helper.c:887
 msgid ""
-"Use commit stored in the index instead of the one stored in the submodule "
+"use commit stored in the index instead of the one stored in the submodule "
 "HEAD"
 msgstr ""
-"Usar el commit guardado en el índice en lugar del guardado en el submódulo "
+"usar el commit guardado en el índice en lugar del guardado en el submódulo "
 "HEAD"
 
-#: builtin/submodule--helper.c:890
-msgid "recurse into nested submodules"
-msgstr "recursar en submódulos anidados"
-
-#: builtin/submodule--helper.c:895
+#: builtin/submodule--helper.c:893
 msgid "git submodule status [--quiet] [--cached] [--recursive] [<path>...]"
 msgstr "git submodule status [--quiet] [--cached] [--recursive] [<ruta>...]"
 
-#: builtin/submodule--helper.c:919
+#: builtin/submodule--helper.c:917
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <ruta>"
 
-#: builtin/submodule--helper.c:983
+#: builtin/submodule--helper.c:989
+#, c-format
+msgid "* %s %s(blob)->%s(submodule)"
+msgstr "* %s %s(blob)->%s(submodule)"
+
+#: builtin/submodule--helper.c:992
+#, c-format
+msgid "* %s %s(submodule)->%s(blob)"
+msgstr "* %s %s(submodule)->%s(blob)"
+
+#: builtin/submodule--helper.c:1005
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: builtin/submodule--helper.c:1055
+#, c-format
+msgid "couldn't hash object from '%s'"
+msgstr "no se pudo realizar hash del objeto '%s'"
+
+#: builtin/submodule--helper.c:1059
+#, c-format
+msgid "unexpected mode %o\n"
+msgstr "modo %o inesperado\n"
+
+#: builtin/submodule--helper.c:1300
+msgid "use the commit stored in the index instead of the submodule HEAD"
+msgstr ""
+"usar el commit guardado en el índice en lugar del guardado en el submódulo "
+"HEAD"
+
+#: builtin/submodule--helper.c:1302
+msgid "to compare the commit in the index with that in the submodule HEAD"
+msgstr ""
+"usar el commit guardado en el índice para comparar con el guardado en el "
+"submódulo HEAD"
+
+#: builtin/submodule--helper.c:1304
+msgid "skip submodules with 'ignore_config' value set to 'all'"
+msgstr "omitir submódulos con el valor 'ignore_config' establecido en 'all'"
+
+#: builtin/submodule--helper.c:1306
+msgid "limit the summary size"
+msgstr "limitar el tamaño de resumen"
+
+#: builtin/submodule--helper.c:1311
+msgid "git submodule--helper summary [<options>] [<commit>] [--] [<path>]"
+msgstr "git submodule--helper summary [<options>] [<commit>] [--] [<path>]"
+
+#: builtin/submodule--helper.c:1335
+msgid "could not fetch a revision for HEAD"
+msgstr "no se puede obtener la revisión para HEAD"
+
+#: builtin/submodule--helper.c:1340
+msgid "--cached and --files are mutually exclusive"
+msgstr "--cached y --files son mutuamente exclusivos"
+
+#: builtin/submodule--helper.c:1407
 #, c-format
 msgid "Synchronizing submodule url for '%s'\n"
 msgstr "Sincronizando url del submódulo para '%s'\n"
 
-#: builtin/submodule--helper.c:989
+#: builtin/submodule--helper.c:1413
 #, c-format
 msgid "failed to register url for submodule path '%s'"
 msgstr "falló al registrar el url para la ruta del submódulo '%s'"
 
-#: builtin/submodule--helper.c:1003
+#: builtin/submodule--helper.c:1427
 #, c-format
 msgid "failed to get the default remote for submodule '%s'"
 msgstr "error al conseguir el remoto por defecto para el submódulo '%s'"
 
-#: builtin/submodule--helper.c:1014
+#: builtin/submodule--helper.c:1438
 #, c-format
 msgid "failed to update remote for submodule '%s'"
 msgstr "error al actualizar el remoto para el submódulo '%s'"
 
-#: builtin/submodule--helper.c:1061
-msgid "Suppress output of synchronizing submodule url"
-msgstr "Suprime la salida del url del submódulo que se sincroniza"
+#: builtin/submodule--helper.c:1485
+msgid "suppress output of synchronizing submodule url"
+msgstr "suprime la salida del url del submódulo que se sincroniza"
 
-#: builtin/submodule--helper.c:1068
+#: builtin/submodule--helper.c:1492
 msgid "git submodule--helper sync [--quiet] [--recursive] [<path>]"
 msgstr "git submodule--helper sync [--quiet] [--recursive] [<ruta>]"
 
-#: builtin/submodule--helper.c:1122
+#: builtin/submodule--helper.c:1546
 #, c-format
 msgid ""
 "Submodule work tree '%s' contains a .git directory (use 'rm -rf' if you "
@@ -21294,7 +22352,7 @@
 "El árbol de trabajo del submódulo '%s' contiene un directorio .git (use 'rm -"
 "rf' si realmente quieres eliminarlo incluyendo todo en su historia)"
 
-#: builtin/submodule--helper.c:1134
+#: builtin/submodule--helper.c:1558
 #, c-format
 msgid ""
 "Submodule work tree '%s' contains local modifications; use '-f' to discard "
@@ -21303,46 +22361,46 @@
 "El árbol de trabajo del submódulo '%s' contiene modificaciones locales; usa "
 "'-f' para descartarlas"
 
-#: builtin/submodule--helper.c:1142
+#: builtin/submodule--helper.c:1566
 #, c-format
 msgid "Cleared directory '%s'\n"
 msgstr "Directorio '%s' limpiado\n"
 
-#: builtin/submodule--helper.c:1144
+#: builtin/submodule--helper.c:1568
 #, c-format
 msgid "Could not remove submodule work tree '%s'\n"
 msgstr "No se pudo eliminar el árbol de trabajo del submódulo '%s'\n"
 
-#: builtin/submodule--helper.c:1155
+#: builtin/submodule--helper.c:1579
 #, c-format
 msgid "could not create empty submodule directory %s"
 msgstr "no se pudo crear directorio vacío de submódulo %s"
 
-#: builtin/submodule--helper.c:1171
+#: builtin/submodule--helper.c:1595
 #, c-format
 msgid "Submodule '%s' (%s) unregistered for path '%s'\n"
 msgstr "Submódulo '%s' (%s) no registrado para ruta '%s'\n"
 
-#: builtin/submodule--helper.c:1200
-msgid "Remove submodule working trees even if they contain local changes"
+#: builtin/submodule--helper.c:1624
+msgid "remove submodule working trees even if they contain local changes"
 msgstr ""
-"Remover árboles de trabajo de submódulos incluso si contienen cambios locales"
+"remover árboles de trabajo de submódulos incluso si contienen cambios locales"
 
-#: builtin/submodule--helper.c:1201
-msgid "Unregister all submodules"
-msgstr "Quitar todos los submódulos"
+#: builtin/submodule--helper.c:1625
+msgid "unregister all submodules"
+msgstr "quitar todos los submódulos"
 
-#: builtin/submodule--helper.c:1206
+#: builtin/submodule--helper.c:1630
 msgid ""
 "git submodule deinit [--quiet] [-f | --force] [--all | [--] [<path>...]]"
 msgstr ""
 "git submodule deinit [--quiet] [-f | --force] [--all | [--] [<ruta>...]]"
 
-#: builtin/submodule--helper.c:1220
+#: builtin/submodule--helper.c:1644
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr "Usa '--all' si realmente quieres des-inicializar todos los submódulos"
 
-#: builtin/submodule--helper.c:1289
+#: builtin/submodule--helper.c:1713
 msgid ""
 "An alternate computed from a superproject's alternate is invalid.\n"
 "To allow Git to clone without an alternate in such a case, set\n"
@@ -21356,46 +22414,46 @@
 "con\n"
 "'--reference-if-able' en lugar de '--reference'."
 
-#: builtin/submodule--helper.c:1328 builtin/submodule--helper.c:1331
+#: builtin/submodule--helper.c:1752 builtin/submodule--helper.c:1755
 #, c-format
 msgid "submodule '%s' cannot add alternate: %s"
 msgstr "submódulo '%s' no puede agregar alterno: %s"
 
-#: builtin/submodule--helper.c:1367
+#: builtin/submodule--helper.c:1791
 #, c-format
 msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
 msgstr "Valor '%s' para submodule.alternateErrorStrategy no es reconocido"
 
-#: builtin/submodule--helper.c:1374
+#: builtin/submodule--helper.c:1798
 #, c-format
 msgid "Value '%s' for submodule.alternateLocation is not recognized"
 msgstr "Valor '%s' para submodule.alternateLocation no es reconocido"
 
-#: builtin/submodule--helper.c:1398
+#: builtin/submodule--helper.c:1822
 msgid "where the new submodule will be cloned to"
 msgstr "a donde el nuevo submódulo será clonado"
 
-#: builtin/submodule--helper.c:1401
+#: builtin/submodule--helper.c:1825
 msgid "name of the new submodule"
 msgstr "nombre del nuevo submódulo"
 
-#: builtin/submodule--helper.c:1404
+#: builtin/submodule--helper.c:1828
 msgid "url where to clone the submodule from"
 msgstr "url de dónde clonar el submódulo"
 
-#: builtin/submodule--helper.c:1412
+#: builtin/submodule--helper.c:1836
 msgid "depth for shallow clones"
 msgstr "profundidad para clones superficiales"
 
-#: builtin/submodule--helper.c:1415 builtin/submodule--helper.c:1924
+#: builtin/submodule--helper.c:1839 builtin/submodule--helper.c:2348
 msgid "force cloning progress"
 msgstr "forzar el proceso de clonado"
 
-#: builtin/submodule--helper.c:1417 builtin/submodule--helper.c:1926
+#: builtin/submodule--helper.c:1841 builtin/submodule--helper.c:2350
 msgid "disallow cloning into non-empty directory"
 msgstr "no permitir clonar en directorios no vacíos"
 
-#: builtin/submodule--helper.c:1424
+#: builtin/submodule--helper.c:1848
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
 "<repository>] [--name <name>] [--depth <depth>] [--single-branch] --url "
@@ -21405,104 +22463,104