Merge branch 'maint-2.6' into maint-2.7
diff --git a/.gitignore b/.gitignore
index 4fd81ba..1c2f832 100644
--- a/.gitignore
+++ b/.gitignore
@@ -155,6 +155,7 @@
 /git-status
 /git-stripspace
 /git-submodule
+/git-submodule--helper
 /git-svn
 /git-symbolic-ref
 /git-tag
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..c3bf9c6
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,91 @@
+language: c
+
+os:
+  - linux
+  - osx
+
+compiler:
+  - clang
+  - gcc
+
+addons:
+  apt:
+    packages:
+    - language-pack-is
+
+env:
+  global:
+    - P4_VERSION="15.2"
+    - GIT_LFS_VERSION="1.1.0"
+    - DEFAULT_TEST_TARGET=prove
+    - GIT_PROVE_OPTS="--timer --jobs 3"
+    - GIT_TEST_OPTS="--verbose --tee"
+    - CFLAGS="-g -O2 -Wall -Werror"
+    - GIT_TEST_CLONE_2GB=YesPlease
+    # t9810 occasionally fails on Travis CI OS X
+    # t9816 occasionally fails with "TAP out of sequence errors" on Travis CI OS X
+    - GIT_SKIP_TESTS="t9810 t9816"
+
+before_install:
+  - >
+    case "${TRAVIS_OS_NAME:-linux}" in
+    linux)
+      mkdir --parents custom/p4
+      pushd custom/p4
+        wget --quiet http://filehost.perforce.com/perforce/r$P4_VERSION/bin.linux26x86_64/p4d
+        wget --quiet http://filehost.perforce.com/perforce/r$P4_VERSION/bin.linux26x86_64/p4
+        chmod u+x p4d
+        chmod u+x p4
+        export PATH="$(pwd):$PATH"
+      popd
+      mkdir --parents custom/git-lfs
+      pushd custom/git-lfs
+        wget --quiet https://github.com/github/git-lfs/releases/download/v$GIT_LFS_VERSION/git-lfs-linux-amd64-$GIT_LFS_VERSION.tar.gz
+        tar --extract --gunzip --file "git-lfs-linux-amd64-$GIT_LFS_VERSION.tar.gz"
+        cp git-lfs-$GIT_LFS_VERSION/git-lfs .
+        export PATH="$(pwd):$PATH"
+      popd
+      ;;
+    osx)
+      brew_force_set_latest_binary_hash () {
+        FORMULA=$1
+        SHA=$(brew fetch --force $FORMULA 2>&1 | grep ^SHA256: | cut -d ' ' -f 2)
+        sed -E -i.bak "s/sha256 \"[0-9a-f]{64}\"/sha256 \"$SHA\"/g" \
+          /usr/local/Library/Taps/homebrew/homebrew-binary/$FORMULA.rb
+      }
+      brew update --quiet
+      brew tap homebrew/binary --quiet
+      brew_force_set_latest_binary_hash perforce
+      brew_force_set_latest_binary_hash perforce-server
+      brew install git-lfs perforce-server perforce gettext
+      brew link --force gettext
+      ;;
+    esac;
+    echo "$(tput setaf 6)Perforce Server Version$(tput sgr0)";
+    p4d -V | grep Rev.;
+    echo "$(tput setaf 6)Perforce Client Version$(tput sgr0)";
+    p4 -V | grep Rev.;
+    echo "$(tput setaf 6)Git-LFS Version$(tput sgr0)";
+    git-lfs version;
+
+before_script: make --jobs=2
+
+script: make --quiet test
+
+after_failure:
+  - >
+    : '<-- Click here to see detailed test output!                                                        ';
+    for TEST_EXIT in t/test-results/*.exit;
+    do
+      if [ "$(cat "$TEST_EXIT")" != "0" ];
+      then
+        TEST_OUT="${TEST_EXIT%exit}out";
+        echo "------------------------------------------------------------------------";
+        echo "$(tput setaf 1)${TEST_OUT}...$(tput sgr0)";
+        echo "------------------------------------------------------------------------";
+        cat "${TEST_OUT}";
+      fi;
+    done;
+
+notifications:
+  email: false
diff --git a/Documentation/RelNotes/2.7.0.txt b/Documentation/RelNotes/2.7.0.txt
new file mode 100644
index 0000000..563dadc
--- /dev/null
+++ b/Documentation/RelNotes/2.7.0.txt
@@ -0,0 +1,414 @@
+Git 2.7 Release Notes
+=====================
+
+Updates since v2.6
+------------------
+
+UI, Workflows & Features
+
+ * The appearance of "gitk", particularly on high DPI monitors, have
+   been improved.  "gitk" also comes with an undated translation for
+   Swedish and Japanese.
+
+ * "git remote" learned "get-url" subcommand to show the URL for a
+   given remote name used for fetching and pushing.
+
+ * There was no way to defeat a configured rebase.autostash variable
+   from the command line, as "git rebase --no-autostash" was missing.
+
+ * "git log --date=local" used to only show the normal (default)
+   format in the local timezone.  The command learned to take 'local'
+   as an instruction to use the local timezone with other formats,
+
+ * The refs used during a "git bisect" session is now per-worktree so
+   that independent bisect sessions can be done in different worktrees
+   created with "git worktree add".
+
+ * Users who are too busy to type three extra keystrokes to ask for
+   "git stash show -p" can now set stash.showPatch configuration
+   variable to true to always see the actual patch, not just the list
+   of paths affected with feel for the extent of damage via diffstat.
+
+ * "quiltimport" allows to specify the series file by honoring the
+   $QUILT_SERIES environment and also --series command line option.
+
+ * The use of 'good/bad' in "git bisect" made it confusing to use when
+   hunting for a state change that is not a regression (e.g. bugfix).
+   The command learned 'old/new' and then allows the end user to
+   say e.g. "bisect start --term-old=fast --term-new=slow" to find a
+   performance regression.
+
+ * "git interpret-trailers" can now run outside of a Git repository.
+
+ * "git p4" learned to reencode the pathname it uses to communicate
+   with the p4 depot with a new option.
+
+ * Give progress meter to "git filter-branch".
+
+ * Allow a later "!/abc/def" to override an earlier "/abc" that
+   appears in the same .gitignore file to make it easier to express
+   "everything in /abc directory is ignored, except for ...".
+
+ * Teach "git p4" to send large blobs outside the repository by
+   talking to Git LFS.
+
+ * Prepare for Git on-disk repository representation to undergo
+   backward incompatible changes by introducing a new repository
+   format version "1", with an extension mechanism.
+
+ * "git worktree" learned a "list" subcommand.
+
+ * "git clone --dissociate" learned that it can be used even when
+   "--reference" was not used at the same time.
+
+ * "git blame" learnt to take "--first-parent" and "--reverse" at the
+   same time when it makes sense.
+
+ * "git checkout" did not follow the usual "--[no-]progress"
+   convention and implemented only "--quiet" that is essentially
+   a superset of "--no-progress".  Extend the command to support the
+   usual "--[no-]progress".
+
+ * The semantics of transfer.hideRefs configuration variable have been
+   extended to work better with the ref "namespace" feature that lets
+   you throw unrelated bunches of repositories in a single physical
+   repository and virtually serve them as separate ones.
+
+ * send-email config variables whose values are pathnames now go
+   through the ~username/ expansion.
+
+ * bash completion learnt to TAB-complete recipient addresses given
+   to send-email.
+
+ * The credential-cache daemon can be told to ignore SIGHUP to work
+   around issue when running Git from inside emacs.
+
+ * "git push" learned new configuration for doing "--recurse-submodules"
+   on each push.
+
+ * "format-patch" has learned a new option to zero-out the commit
+   object name on the mbox "From " line.
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * The infrastructure to rewrite "git submodule" in C is being built
+   incrementally.  Let's polish these early parts well enough and make
+   them graduate to 'next' and 'master', so that the more involved
+   follow-up can start cooking on a solid ground.
+
+ * Some features from "git tag -l" and "git branch -l" have been made
+   available to "git for-each-ref" so that eventually the unified
+   implementation can be shared across all three.  The version merged
+   to the 'master' branch earlier had a performance regression in "tag
+   --contains", which has since been corrected.
+
+ * Because "test_when_finished" in our test framework queues the
+   clean-up tasks to be done in a shell variable, it should not be
+   used inside a subshell.  Add a mechanism to allow 'bash' to catch
+   such uses, and fix the ones that were found.
+
+ * The debugging infrastructure for pkt-line based communication has
+   been improved to mark the side-band communication specifically.
+
+ * Update "git branch" that list existing branches, using the
+   ref-filter API that is shared with "git tag" and "git
+   for-each-ref".
+
+ * The test for various line-ending conversions has been enhanced.
+
+ * A few test scripts around "git p4" have been improved for
+   portability.
+
+ * Many allocations that is manually counted (correctly) that are
+   followed by strcpy/sprintf have been replaced with a less error
+   prone constructs such as xstrfmt.
+
+ * The internal stripspace() function has been moved to where it
+   logically belongs to, i.e. strbuf API, and the command line parser
+   of "git stripspace" has been updated to use the parse_options API.
+
+ * "git am" used to spawn "git mailinfo" via run_command() API once
+   per each patch, but learned to make a direct call to mailinfo()
+   instead.
+
+ * The implementation of "git mailinfo" was refactored so that a
+   mailinfo() function can be directly called from inside a process.
+
+ * With a "debug" helper, debugging of a single "git" invocation in
+   our test scripts has become a lot easier.
+
+ * The "configure" script did not test for -lpthread correctly, which
+   upset some linkers.
+
+ * Cross completed task off of subtree project's todo list.
+
+ * Test cleanups for the subtree project.
+
+ * Clean up style in an ancient test t9300.
+
+ * Work around some test flakiness with p4d.
+
+ * Fsck did not correctly detect a NUL-truncated header in a tag.
+
+ * Use a safer behavior when we hit errors verifying remote certificates.
+
+ * Speed up filter-branch for cases where we only care about rewriting
+   commits, not tree data.
+
+ * The parse-options API has been updated to make "-h" command line
+   option work more consistently in all commands.
+
+ * "git svn rebase/mkdirs" got optimized by keeping track of empty
+   directories better.
+
+ * Fix some racy client/server tests by treating SIGPIPE the same as a
+   normal non-zero exit.
+
+ * The necessary infrastructure to build topics using the free Travis
+   CI has been added. Developers forking from this topic (and enabling
+   Travis) can do their own builds, and we can turn on auto-builds for
+   git/git (including build-status for pull requests that people
+   open).
+
+ * The write(2) emulation for Windows learned to set errno to EPIPE
+   when necessary.
+
+
+Also contains various documentation updates and code clean-ups.
+
+
+Fixes since v2.6
+----------------
+
+Unless otherwise noted, all the fixes since v2.6 in the maintenance
+track are contained in this release (see the maintenance releases'
+notes for details).
+
+ * Very small number of options take a parameter that is optional
+   (which is not a great UI element as they can only appear at the end
+   of the command line).  Add notice to documentation of each and
+   every one of them.
+
+ * "git blame --first-parent v1.0..v2.0" was not rejected but did not
+   limit the blame to commits on the first parent chain.
+
+ * "git subtree" (in contrib/) now can take whitespaces in the
+   pathnames, not only in the in-tree pathname but the name of the
+   directory that the repository is in.
+
+ * The ssh transport, just like any other transport over the network,
+   did not clear GIT_* environment variables, but it is possible to
+   use SendEnv and AcceptEnv to leak them to the remote invocation of
+   Git, which is not a good idea at all.  Explicitly clear them just
+   like we do for the local transport.
+
+ * Correct "git p4 --detect-labels" so that it does not fail to create
+   a tag that points at a commit that is also being imported.
+
+ * The Makefile always runs the library archiver with hardcoded "crs"
+   options, which was inconvenient for exotic platforms on which
+   people want to use programs with totally different set of command
+   line options.
+
+ * Customization to change the behaviour with "make -w" and "make -s"
+   in our Makefile was broken when they were used together.
+
+ * Allocation related functions and stdio are unsafe things to call
+   inside a signal handler, and indeed killing the pager can cause
+   glibc to deadlock waiting on allocation mutex as our signal handler
+   tries to free() some data structures in wait_for_pager().  Reduce
+   these unsafe calls.
+
+ * The way how --ref/--notes to specify the notes tree reference are
+   DWIMmed was not clearly documented.
+
+ * "git gc" used to barf when a symbolic ref has gone dangling
+   (e.g. the branch that used to be your upstream's default when you
+   cloned from it is now gone, and you did "fetch --prune").
+
+ * "git clone --dissociate" runs a big "git repack" process at the
+   end, and it helps to close file descriptors that are open on the
+   packs and their idx files before doing so on filesystems that
+   cannot remove a file that is still open.
+
+ * Description of the "log.follow" configuration variable in "git log"
+   documentation is now also copied to "git config" documentation.
+
+ * "git rebase -i" had a minor regression recently, which stopped
+   considering a line that begins with an indented '#' in its insn
+   sheet not a comment. Further, the code was still too picky on
+   Windows where CRLF left by the editor is turned into a trailing CR
+   on the line read via the "read" built-in command of bash.  Both of
+   these issues are now fixed.
+
+ * After "git checkout --detach", "git status" reported a fairly
+   useless "HEAD detached at HEAD", instead of saying at which exact
+   commit.
+
+ * When "git send-email" wanted to talk over Net::SMTP::SSL,
+   Net::Cmd::datasend() did not like to be fed too many bytes at the
+   same time and failed to send messages.  Send the payload one line
+   at a time to work around the problem.
+
+ * When "git am" was rewritten as a built-in, it stopped paying
+   attention to user.signingkey, which was fixed.
+
+ * It was not possible to use a repository-lookalike created by "git
+   worktree add" as a local source of "git clone".
+
+ * On a case insensitive filesystems, setting GIT_WORK_TREE variable
+   using a random cases that does not agree with what the filesystem
+   thinks confused Git that it wasn't inside the working tree.
+
+ * Performance-measurement tests did not work without an installed Git.
+
+ * A test script for the HTTP service had a timing dependent bug,
+   which was fixed.
+
+ * There were some classes of errors that "git fsck" diagnosed to its
+   standard error that did not cause it to exit with non-zero status.
+
+ * Work around "git p4" failing when the P4 depot records the contents
+   in UTF-16 without UTF-16 BOM.
+
+ * When "git gc --auto" is backgrounded, its diagnosis message is
+   lost.  Save it to a file in $GIT_DIR and show it next time the "gc
+   --auto" is run.
+
+ * The submodule code has been taught to work better with separate
+   work trees created via "git worktree add".
+
+ * "git gc" is safe to run anytime only because it has the built-in
+   grace period to protect young objects.  In order to run with no
+   grace period, the user must make sure that the repository is
+   quiescent.
+
+ * A recent "filter-branch --msg-filter" broke skipping of the commit
+   object header, which is fixed.
+
+ * The normalize_ceiling_entry() function does not muck with the end
+   of the path it accepts, and the real world callers do rely on that,
+   but a test insisted that the function drops a trailing slash.
+
+ * A test for interaction between untracked cache and sparse checkout
+   added in Git 2.5 days were flaky.
+
+ * A couple of commands still showed "[options]" in their usage string
+   to note where options should come on their command line, but we
+   spell that "[<options>]" in most places these days.
+
+ * The synopsis text and the usage string of subcommands that read
+   list of things from the standard input are often shown as if they
+   only take input from a file on a filesystem, which was misleading.
+
+ * "git am -3" had a small regression where it is aborted in its error
+   handling codepath when underlying merge-recursive failed in certain
+   ways, as it assumed that the internal call to merge-recursive will
+   never die, which is not the case (yet).
+
+ * The linkage order of libraries was wrong in places around libcurl.
+
+ * The name-hash subsystem that is used to cope with case insensitive
+   filesystems keeps track of directories and their on-filesystem
+   cases for all the paths in the index by holding a pointer to a
+   randomly chosen cache entry that is inside the directory (for its
+   ce->ce_name component).  This pointer was not updated even when the
+   cache entry was removed from the index, leading to use after free.
+   This was fixed by recording the path for each directory instead of
+   borrowing cache entries and restructuring the API somewhat.
+
+ * "git merge-file" tried to signal how many conflicts it found, which
+   obviously would not work well when there are too many of them.
+
+ * The error message from "git blame --contents --reverse" incorrectly
+   talked about "--contents --children".
+
+ * "git imap-send" did not compile well with older version of cURL library.
+
+ * Merging a branch that removes a path and another that changes the
+   mode bits on the same path should have conflicted at the path, but
+   it didn't and silently favoured the removal.
+
+ * "git --literal-pathspecs add -u/-A" without any command line
+   argument misbehaved ever since Git 2.0.
+
+ * "git daemon" uses "run_command()" without "finish_command()", so it
+   needs to release resources itself, which it forgot to do.
+
+ * "git status --branch --short" accessed beyond the constant string
+   "HEAD", which has been corrected.
+
+ * We peek objects from submodule's object store by linking it to the
+   list of alternate object databases, but the code to do so forgot to
+   correctly initialize the list.
+
+ * The code to prepare the working tree side of temporary directory
+   for the "dir-diff" feature forgot that symbolic links need not be
+   copied (or symlinked) to the temporary area, as the code already
+   special cases and overwrites them.  Besides, it was wrong to try
+   computing the object name of the target of symbolic link, which may
+   not even exist or may be a directory.
+
+ * A Range: request can be responded with a full response and when
+   asked properly libcurl knows how to strip the result down to the
+   requested range.  However, we were hand-crafting a range request
+   and it did not kick in.
+
+ * Having a leftover .idx file without corresponding .pack file in
+   the repository hurts performance; "git gc" learned to prune them.
+
+ * Apple's common crypto implementation of SHA1_Update() does not take
+   more than 4GB at a time, and we now have a compile-time workaround
+   for it.
+
+ * Produce correct "dirty" marker for shell prompts, even when we
+   are on an orphan or an unborn branch.
+
+ * A build without NO_IPv6 used to use gethostbyname() when guessing
+   user's hostname, instead of getaddrinfo() that is used in other
+   codepaths in such a build.
+
+ * The exit code of git-fsck did not reflect some types of errors
+   found in packed objects, which has been corrected.
+
+ * The helper used to iterate over loose object directories to prune
+   stale objects did not closedir() immediately when it is done with a
+   directory--a callback such as the one used for "git prune" may want
+   to do rmdir(), but it would fail on open directory on platforms
+   such as WinXP.
+
+ * "git p4" used to import Perforce CLs that touch only paths outside
+   the client spec as empty commits.  It has been corrected to ignore
+   them instead, with a new configuration git-p4.keepEmptyCommits as a
+   backward compatibility knob.
+
+ * The completion script (in contrib/) used to list "git column"
+   (which is not an end-user facing command) as one of the choices
+   (merge 160fcdb sg/completion-no-column later to maint).
+
+ * The error reporting from "git send-email", when SMTP TLS fails, has
+   been improved.
+   (merge 9d60524 jk/send-email-ssl-errors later to maint).
+
+ * When getpwuid() on the system returned NULL (e.g. the user is not
+   in the /etc/passwd file or other uid-to-name mappings), the
+   codepath to find who the user is to record it in the reflog barfed
+   and died.  Loosen the check in this codepath, which already accepts
+   questionable ident string (e.g. host part of the e-mail address is
+   obviously bogus), and in general when we operate fmt_ident() function
+   in non-strict mode.
+   (merge 92bcbb9 jk/ident-loosen-getpwuid later to maint).
+
+ * "git symbolic-ref" forgot to report a failure with its exit status.
+   (merge f91b273 jk/symbolic-ref-maint later to maint).
+
+ * History traversal with "git log --source" that starts with an
+   annotated tag failed to report the tag as "source", due to an
+   old regression in the command line parser back in v2.2 days.
+   (merge 728350b jk/pending-keep-tag-name later to maint).
+
+ * "git p4" when interacting with multiple depots at the same time
+   used to incorrectly drop changes.
+
+ * Code clean-up, minor fixes etc.
diff --git a/Documentation/RelNotes/2.7.1.txt b/Documentation/RelNotes/2.7.1.txt
new file mode 100644
index 0000000..6553d69
--- /dev/null
+++ b/Documentation/RelNotes/2.7.1.txt
@@ -0,0 +1,87 @@
+Git v2.7.1 Release Notes
+========================
+
+Fixes since v2.7
+----------------
+
+ * An earlier change in 2.5.x-era broke users' hooks and aliases by
+   exporting GIT_WORK_TREE to point at the root of the working tree,
+   interfering when they tried to use a different working tree without
+   setting GIT_WORK_TREE environment themselves.
+
+ * The "exclude_list" structure has the usual "alloc, nr" pair of
+   fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
+   to reset 'alloc' to 0 when it cleared 'nr' to discard the managed
+   array.
+
+ * "git send-email" was confused by escaped quotes stored in the alias
+   files saved by "mutt", which has been corrected.
+
+ * A few unportable C construct have been spotted by clang compiler
+   and have been fixed.
+
+ * The documentation has been updated to hint the connection between
+   the '--signoff' option and DCO.
+
+ * "git reflog" incorrectly assumed that all objects that used to be
+   at the tip of a ref must be commits, which caused it to segfault.
+
+ * The ignore mechanism saw a few regressions around untracked file
+   listing and sparse checkout selection areas in 2.7.0; the change
+   that is responsible for the regression has been reverted.
+
+ * Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR
+   (e.g. COMMIT_EDITMSG) that is meant to be left after the command is
+   done.  This however did not work well if the repository is set to
+   be shared with core.sharedRepository and the umask of the previous
+   user is tighter.  They have been made to work better by calling
+   unlink(2) and retrying after fopen(3) fails with EPERM.
+
+ * Asking gitweb for a nonexistent commit left a warning in the server
+   log.
+
+ * "git rebase", unlike all other callers of "gc --auto", did not
+   ignore the exit code from "gc --auto".
+
+ * Many codepaths that run "gc --auto" before exiting kept packfiles
+   mapped and left the file descriptors to them open, which was not
+   friendly to systems that cannot remove files that are open.  They
+   now close the packs before doing so.
+
+ * A recent optimization to filter-branch in v2.7.0 introduced a
+   regression when --prune-empty filter is used, which has been
+   corrected.
+
+ * The description for SANITY prerequisite the test suite uses has
+   been clarified both in the comment and in the implementation.
+
+ * "git tag" started listing a tag "foo" as "tags/foo" when a branch
+   named "foo" exists in the same repository; remove this unnecessary
+   disambiguation, which is a regression introduced in v2.7.0.
+
+ * The way "git svn" uses auth parameter was broken by Subversion
+   1.9.0 and later.
+
+ * The "split" subcommand of "git subtree" (in contrib/) incorrectly
+   skipped merges when it shouldn't, which was corrected.
+
+ * A few options of "git diff" did not work well when the command was
+   run from a subdirectory.
+
+ * dirname() emulation has been added, as Msys2 lacks it.
+
+ * The underlying machinery used by "ls-files -o" and other commands
+   have been taught not to create empty submodule ref cache for a
+   directory that is not a submodule.  This removes a ton of wasted
+   CPU cycles.
+
+ * Drop a few old "todo" items by deciding that the change one of them
+   suggests is not such a good idea, and doing the change the other
+   one suggested to do.
+
+ * Documentation for "git fetch --depth" has been updated for clarity.
+
+ * The command line completion learned a handful of additional options
+   and command specific syntax.
+
+Also includes a handful of documentation and test updates.
diff --git a/Documentation/RelNotes/2.7.2.txt b/Documentation/RelNotes/2.7.2.txt
new file mode 100644
index 0000000..4feef76
--- /dev/null
+++ b/Documentation/RelNotes/2.7.2.txt
@@ -0,0 +1,41 @@
+Git v2.7.2 Release Notes
+========================
+
+Fixes since v2.7.1
+------------------
+
+ * The low-level merge machinery has been taught to use CRLF line
+   termination when inserting conflict markers to merged contents that
+   are themselves CRLF line-terminated.
+
+ * "git worktree" had a broken code that attempted to auto-fix
+   possible inconsistency that results from end-users moving a
+   worktree to different places without telling Git (the original
+   repository needs to maintain backpointers to its worktrees, but
+   "mv" run by end-users who are not familiar with that fact will
+   obviously not adjust them), which actually made things worse
+   when triggered.
+
+ * "git push --force-with-lease" has been taught to report if the push
+   needed to force (or fast-forwarded).
+
+ * The emulated "yes" command used in our test scripts has been
+   tweaked not to spend too much time generating unnecessary output
+   that is not used, to help those who test on Windows where it would
+   not stop until it fills the pipe buffer due to lack of SIGPIPE.
+
+ * The vimdiff backend for "git mergetool" has been tweaked to arrange
+   and number buffers in the order that would match the expectation of
+   majority of people who read left to right, then top down and assign
+   buffers 1 2 3 4 "mentally" to local base remote merge windows based
+   on that order.
+
+ * The documentation for "git clean" has been corrected; it mentioned
+   that .git/modules/* are removed by giving two "-f", which has never
+   been the case.
+
+ * Paths that have been told the index about with "add -N" are not
+   quite yet in the index, but a few commands behaved as if they
+   already are in a harmful way.
+
+Also includes tiny documentation and test updates.
diff --git a/Documentation/RelNotes/2.7.3.txt b/Documentation/RelNotes/2.7.3.txt
new file mode 100644
index 0000000..6adf038
--- /dev/null
+++ b/Documentation/RelNotes/2.7.3.txt
@@ -0,0 +1,62 @@
+Git v2.7.3 Release Notes
+========================
+
+Fixes since v2.7.2
+------------------
+
+ * Traditionally, the tests that try commands that work on the
+   contents in the working tree were named with "worktree" in their
+   filenames, but with the recent addition of "git worktree"
+   subcommand, whose tests are also named similarly, it has become
+   harder to tell them apart.  The traditional tests have been renamed
+   to use "work-tree" instead in an attempt to differentiate them.
+
+ * Many codepaths forget to check return value from git_config_set();
+   the function is made to die() to make sure we do not proceed when
+   setting a configuration variable failed.
+
+ * Handling of errors while writing into our internal asynchronous
+   process has been made more robust, which reduces flakiness in our
+   tests.
+
+ * "git show 'HEAD:Foo[BAR]Baz'" did not interpret the argument as a
+   rev, i.e. the object named by the the pathname with wildcard
+   characters in a tree object.
+
+ * "git rev-parse --git-common-dir" used in the worktree feature
+   misbehaved when run from a subdirectory.
+
+ * The "v(iew)" subcommand of the interactive "git am -i" command was
+   broken in 2.6.0 timeframe when the command was rewritten in C.
+
+ * "git merge-tree" used to mishandle "both sides added" conflict with
+   its own "create a fake ancestor file that has the common parts of
+   what both sides have added and do a 3-way merge" logic; this has
+   been updated to use the usual "3-way merge with an empty blob as
+   the fake common ancestor file" approach used in the rest of the
+   system.
+
+ * The memory ownership rule of fill_textconv() API, which was a bit
+   tricky, has been documented a bit better.
+
+ * The documentation did not clearly state that the 'simple' mode is
+   now the default for "git push" when push.default configuration is
+   not set.
+
+ * Recent versions of GNU grep are pickier when their input contains
+   arbitrary binary data, which some of our tests uses.  Rewrite the
+   tests to sidestep the problem.
+
+ * A helper function "git submodule" uses since v2.7.0 to list the
+   modules that match the pathspec argument given to its subcommands
+   (e.g. "submodule add <repo> <path>") has been fixed.
+
+ * "git config section.var value" to set a value in per-repository
+   configuration file failed when it was run outside any repository,
+   but didn't say the reason correctly.
+
+ * The code to read the pack data using the offsets stored in the pack
+   idx file has been made more carefully check the validity of the
+   data in the idx.
+
+Also includes documentation and test updates.
diff --git a/Documentation/RelNotes/2.7.4.txt b/Documentation/RelNotes/2.7.4.txt
new file mode 100644
index 0000000..883ae89
--- /dev/null
+++ b/Documentation/RelNotes/2.7.4.txt
@@ -0,0 +1,11 @@
+Git v2.7.4 Release Notes
+========================
+
+Fixes since v2.7.3
+------------------
+
+ * Bugfix patches were backported from the 'master' front to plug heap
+   corruption holes, to catch integer overflow in the computation of
+   pathname lengths, and to get rid of the name_path API.  Both of
+   these would have resulted in writing over an under-allocated buffer
+   when formulating pathnames while tree traversal.
diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt
index a09969b..760eab7 100644
--- a/Documentation/blame-options.txt
+++ b/Documentation/blame-options.txt
@@ -63,11 +63,10 @@
 	`-` to make the command read from the standard input).
 
 --date <format>::
-	The value is one of the following alternatives:
-	{relative,local,default,iso,rfc,short}. If --date is not
+	Specifies the format used to output dates. If --date is not
 	provided, the value of the blame.date config variable is
 	used. If the blame.date config variable is also not set, the
-	iso format is used. For more information, See the discussion
+	iso format is used. For supported values, see the discussion
 	of the --date option at linkgit:git-log[1].
 
 -M|<num>|::
diff --git a/Documentation/config.txt b/Documentation/config.txt
index fec0dea..f617886 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1122,6 +1122,9 @@
 	example.com. See linkgit:gitcredentials[7] for details on how URLs are
 	matched.
 
+credentialCache.ignoreSIGHUP::
+	Tell git-credential-cache--daemon to ignore SIGHUP, instead of quitting.
+
 include::diff-config.txt[]
 
 difftool.<tool>.path::
@@ -1829,9 +1832,7 @@
 log.date::
 	Set the default date-time mode for the 'log' command.
 	Setting a value for log.date is similar to using 'git log''s
-	`--date` option.  Possible values are `relative`, `local`,
-	`default`, `iso`, `rfc`, and `short`; see linkgit:git-log[1]
-	for details.
+	`--date` option.  See linkgit:git-log[1] for details.
 
 log.decorate::
 	Print out the ref names of any commits that are shown by the log
@@ -2228,6 +2229,20 @@
 	override a value from a lower-priority config file. An explicit
 	command-line flag always overrides this config option.
 
+push.recurseSubmodules::
+	Make sure all submodule commits used by the revisions to be pushed
+	are available on a remote-tracking branch. If the value is 'check'
+	then Git will verify that all submodule commits that changed in the
+	revisions to be pushed are available on at least one remote of the
+	submodule. If any commits are missing, the push will be aborted and
+	exit with non-zero status. If the value is 'on-demand' then all
+	submodules that changed in the revisions to be pushed will be
+	pushed. If on-demand was not able to push all necessary revisions
+	it will also be aborted and exit with non-zero status. If the value
+	is 'no' then default behavior of ignoring submodules when pushing
+	is retained. You may override this configuration at time of push by
+	specifying '--recurse-submodules=check|on-demand|no'.
+
 rebase.stat::
 	Whether to show a diffstat of what changed upstream since the last
 	rebase. False by default.
@@ -2593,6 +2608,16 @@
 	submodule summary' command, which shows a similar output but does
 	not honor these settings.
 
+stash.showPatch::
+	If this is set to true, the `git stash show` command without an
+	option will show the stash in patch form.  Defaults to false.
+	See description of 'show' command in linkgit:git-stash[1].
+
+stash.showStat::
+	If this is set to true, the `git stash show` command without an
+	option will show diffstat of the stash.  Defaults to true.
+	See description of 'show' command in linkgit:git-stash[1].
+
 submodule.<name>.path::
 submodule.<name>.url::
 	The path within this project and URL for a submodule. These
@@ -2665,6 +2690,15 @@
 explicitly exposing it, even if an earlier entry marked it as hidden.
 If you have multiple hideRefs values, later entries override earlier ones
 (and entries in more-specific config files override less-specific ones).
++
+If a namespace is in use, the namespace prefix is stripped from each
+reference before it is matched against `transfer.hiderefs` patterns.
+For example, if `refs/heads/master` is specified in `transfer.hideRefs` and
+the current namespace is `foo`, then `refs/namespaces/foo/refs/heads/master`
+is omitted from the advertisements but `refs/heads/master` and
+`refs/namespaces/bar/refs/heads/master` are still advertised as so-called
+"have" lines. In order to match refs before stripping, add a `^` in front of
+the ref name. If you combine `!` and `^`, `!` must be specified first.
 
 transfer.unpackLimit::
 	When `fetch.unpackLimit` or `receive.unpackLimit` are
diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
index 45583d8..78cd265 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.txt
@@ -8,10 +8,11 @@
 	option old data in `.git/FETCH_HEAD` will be overwritten.
 
 --depth=<depth>::
-	Deepen or shorten the history of a 'shallow' repository created by
-	`git clone` with `--depth=<depth>` option (see linkgit:git-clone[1])
-	to the specified number of commits from the tip of each remote
-	branch history. Tags for the deepened commits are not fetched.
+	Limit fetching to the specified number of commits from the tip of
+	each remote branch history. If fetching to a 'shallow' repository
+	created by `git clone` with `--depth=<depth>` option (see
+	linkgit:git-clone[1]), deepen or shorten the history to the specified
+	number of commits. Tags for the deepened commits are not fetched.
 
 --unshallow::
 	If the source repository is complete, convert a shallow
diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt
index fe5282f..6a96a66 100644
--- a/Documentation/git-add.txt
+++ b/Documentation/git-add.txt
@@ -24,7 +24,7 @@
 
 The "index" holds a snapshot of the content of the working tree, and it
 is this snapshot that is taken as the contents of the next commit.  Thus
-after making any changes to the working directory, and before running
+after making any changes to the working tree, and before running
 the commit command, you must use the `add` command to add any new or
 modified files to the index.
 
diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt
index 452c1fe..13cdd7f 100644
--- a/Documentation/git-am.txt
+++ b/Documentation/git-am.txt
@@ -35,6 +35,7 @@
 --signoff::
 	Add a `Signed-off-by:` line to the commit message, using
 	the committer identity of yourself.
+	See the signoff option in linkgit:git-commit[1] for more information.
 
 -k::
 --keep::
diff --git a/Documentation/git-bisect.txt b/Documentation/git-bisect.txt
index 1b7a97b..7e79aae 100644
--- a/Documentation/git-bisect.txt
+++ b/Documentation/git-bisect.txt
@@ -16,9 +16,11 @@
 The command takes various subcommands, and different options depending
 on the subcommand:
 
- git bisect start [--no-checkout] [<bad> [<good>...]] [--] [<paths>...]
- git bisect bad [<rev>]
- git bisect good [<rev>...]
+ git bisect start [--term-{old,good}=<term> --term-{new,bad}=<term>]
+		  [--no-checkout] [<bad> [<good>...]] [--] [<paths>...]
+ git bisect (bad|new) [<rev>]
+ git bisect (good|old) [<rev>...]
+ git bisect terms [--term-good | --term-bad]
  git bisect skip [(<rev>|<range>)...]
  git bisect reset [<commit>]
  git bisect visualize
@@ -36,6 +38,13 @@
 down the range until it finds the exact commit that introduced the
 change.
 
+In fact, `git bisect` can be used to find the commit that changed
+*any* property of your project; e.g., the commit that fixed a bug, or
+the commit that caused a benchmark's performance to improve. To
+support this more general usage, the terms "old" and "new" can be used
+in place of "good" and "bad", or you can choose your own terms. See
+section "Alternate terms" below for more information.
+
 Basic bisect commands: start, bad, good
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -111,6 +120,79 @@
 current bisection commit and avoid switching commits at all.
 
 
+Alternate terms
+~~~~~~~~~~~~~~~
+
+Sometimes you are not looking for the commit that introduced a
+breakage, but rather for a commit that caused a change between some
+other "old" state and "new" state. For example, you might be looking
+for the commit that introduced a particular fix. Or you might be
+looking for the first commit in which the source-code filenames were
+finally all converted to your company's naming standard. Or whatever.
+
+In such cases it can be very confusing to use the terms "good" and
+"bad" to refer to "the state before the change" and "the state after
+the change". So instead, you can use the terms "old" and "new",
+respectively, in place of "good" and "bad". (But note that you cannot
+mix "good" and "bad" with "old" and "new" in a single session.)
+
+In this more general usage, you provide `git bisect` with a "new"
+commit has some property and an "old" commit that doesn't have that
+property. Each time `git bisect` checks out a commit, you test if that
+commit has the property. If it does, mark the commit as "new";
+otherwise, mark it as "old". When the bisection is done, `git bisect`
+will report which commit introduced the property.
+
+To use "old" and "new" instead of "good" and bad, you must run `git
+bisect start` without commits as argument and then run the following
+commands to add the commits:
+
+------------------------------------------------
+git bisect old [<rev>]
+------------------------------------------------
+
+to indicate that a commit was before the sought change, or
+
+------------------------------------------------
+git bisect new [<rev>...]
+------------------------------------------------
+
+to indicate that it was after.
+
+To get a reminder of the currently used terms, use
+
+------------------------------------------------
+git bisect terms
+------------------------------------------------
+
+You can get just the old (respectively new) term with `git bisect term
+--term-old` or `git bisect term --term-good`.
+
+If you would like to use your own terms instead of "bad"/"good" or
+"new"/"old", you can choose any names you like (except existing bisect
+subcommands like `reset`, `start`, ...) by starting the
+bisection using
+
+------------------------------------------------
+git bisect start --term-old <term-old> --term-new <term-new>
+------------------------------------------------
+
+For example, if you are looking for a commit that introduced a
+performance regression, you might use
+
+------------------------------------------------
+git bisect start --term-old fast --term-new slow
+------------------------------------------------
+
+Or if you are looking for the commit that fixed a bug, you might use
+
+------------------------------------------------
+git bisect start --term-new fixed --term-old broken
+------------------------------------------------
+
+Then, use `git bisect <term-old>` and `git bisect <term-new>` instead
+of `git bisect good` and `git bisect bad` to mark commits.
+
 Bisect visualize
 ~~~~~~~~~~~~~~~~
 
@@ -387,6 +469,21 @@
 has at least one parent whose reachable graph is fully traversable in the sense
 required by 'git pack objects'.
 
+* Look for a fix instead of a regression in the code
++
+------------
+$ git bisect start
+$ git bisect new HEAD    # current commit is marked as new
+$ git bisect old HEAD~10 # the tenth commit from now is marked as old
+------------
++
+or:
+------------
+$ git bisect start --term-old broken --term-new fixed
+$ git bisect fixed
+$ git bisect broken HEAD~10
+------------
+
 Getting help
 ~~~~~~~~~~~~
 
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt
index bbbade4..4a7037f 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.txt
@@ -11,7 +11,8 @@
 'git branch' [--color[=<when>] | --no-color] [-r | -a]
 	[--list] [-v [--abbrev=<length> | --no-abbrev]]
 	[--column[=<options>] | --no-column]
-	[(--merged | --no-merged | --contains) [<commit>]] [<pattern>...]
+	[(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
+	[--points-at <object>] [<pattern>...]
 'git branch' [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
 'git branch' (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
 'git branch' --unset-upstream [<branchname>]
@@ -231,6 +232,19 @@
 	The new name for an existing branch. The same restrictions as for
 	<branchname> apply.
 
+--sort=<key>::
+	Sort based on the key given. Prefix `-` to sort in descending
+	order of the value. You may use the --sort=<key> option
+	multiple times, in which case the last key becomes the primary
+	key. The keys supported are the same as those in `git
+	for-each-ref`. Sort order defaults to sorting based on the
+	full refname (including `refs/...` prefix). This lists
+	detached HEAD (if present) first, then local branches and
+	finally remote-tracking branches.
+
+
+--points-at <object>::
+	Only list branches of the given object.
 
 Examples
 --------
diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
index e269fb1..5e5273e 100644
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@ -107,6 +107,12 @@
 --quiet::
 	Quiet, suppress feedback messages.
 
+--[no-]progress::
+	Progress status is reported on the standard error stream
+	by default when it is attached to a terminal, unless `--quiet`
+	is specified. This flag enables progress reporting even if not
+	attached to a terminal, regardless of `--quiet`.
+
 -f::
 --force::
 	When switching branches, proceed even if the index or the
diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt
index 77da29a..6154e57 100644
--- a/Documentation/git-cherry-pick.txt
+++ b/Documentation/git-cherry-pick.txt
@@ -100,6 +100,7 @@
 -s::
 --signoff::
 	Add Signed-off-by line at the end of the commit message.
+	See the signoff option in linkgit:git-commit[1] for more information.
 
 -S[<keyid>]::
 --gpg-sign[=<keyid>]::
diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt
index 641681f..51a7e26 100644
--- a/Documentation/git-clean.txt
+++ b/Documentation/git-clean.txt
@@ -37,9 +37,7 @@
 	to false, 'git clean' will refuse to delete files or directories
 	unless given -f, -n or -i. Git will refuse to delete directories
 	with .git sub directory or file unless a second -f
-	is given. This affects also git submodules where the storage area
-	of the removed submodule under .git/modules/ is not removed until
-	-f is given twice.
+	is given.
 
 -i::
 --interactive::
diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt
index f1f2a3f..789b668 100644
--- a/Documentation/git-clone.txt
+++ b/Documentation/git-clone.txt
@@ -104,8 +104,13 @@
 --dissociate::
 	Borrow the objects from reference repositories specified
 	with the `--reference` options only to reduce network
-	transfer and stop borrowing from them after a clone is made
-	by making necessary local copies of borrowed objects.
+	transfer, and stop borrowing from them after a clone is made
+	by making necessary local copies of borrowed objects.  This
+	option can also be used when cloning locally from a
+	repository that already borrows objects from another
+	repository--the new repository will borrow objects from the
+	same repository, and this option can be used to stop the
+	borrowing.
 
 --quiet::
 -q::
@@ -185,15 +190,14 @@
 
 --depth <depth>::
 	Create a 'shallow' clone with a history truncated to the
-	specified number of revisions.
+	specified number of commits. Implies `--single-branch` unless
+	`--no-single-branch` is given to fetch the histories near the
+	tips of all branches.
 
 --[no-]single-branch::
 	Clone only the history leading to the tip of a single branch,
 	either specified by the `--branch` option or the primary
-	branch remote's `HEAD` points at. When creating a shallow
-	clone with the `--depth` option, this is the default, unless
-	`--no-single-branch` is given to fetch the histories near the
-	tips of all branches.
+	branch remote's `HEAD` points at.
 	Further fetches into the resulting repository will only update the
 	remote-tracking branch for the branch this option was used for the
 	initial cloning.  If the HEAD at the remote did not point at any
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index 7f34a5b..9ec6b3c 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.txt
@@ -154,7 +154,11 @@
 -s::
 --signoff::
 	Add Signed-off-by line by the committer at the end of the commit
-	log message.
+	log message.  The meaning of a signoff depends on the project,
+	but it typically certifies that committer has
+	the rights to submit this work under the same license and
+	agrees to a Developer Certificate of Origin
+	(see http://developercertificate.org/ for more information).
 
 -n::
 --no-verify::
diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
index 7f8d9a5..2e3e96f 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -10,6 +10,8 @@
 [verse]
 'git for-each-ref' [--count=<count>] [--shell|--perl|--python|--tcl]
 		   [(--sort=<key>)...] [--format=<format>] [<pattern>...]
+		   [--points-at <object>] [(--merged | --no-merged) [<object>]]
+		   [--contains [<object>]]
 
 DESCRIPTION
 -----------
@@ -62,6 +64,20 @@
 	the specified host language.  This is meant to produce
 	a scriptlet that can directly be `eval`ed.
 
+--points-at <object>::
+	Only list refs which points at the given object.
+
+--merged [<object>]::
+	Only list refs whose tips are reachable from the
+	specified commit (HEAD if not specified).
+
+--no-merged [<object>]::
+	Only list refs whose tips are not reachable from the
+	specified commit (HEAD if not specified).
+
+--contains [<object>]::
+	Only list tags which contain the specified commit (HEAD if not
+	specified).
 
 FIELD NAMES
 -----------
@@ -76,7 +92,11 @@
 	The name of the ref (the part after $GIT_DIR/).
 	For a non-ambiguous short name of the ref append `:short`.
 	The option core.warnAmbiguousRefs is used to select the strict
-	abbreviation mode.
+	abbreviation mode. If `strip=<N>` is appended, strips `<N>`
+	slash-separated path components from the front of the refname
+	(e.g., `%(refname:strip=2)` turns `refs/tags/foo` into `foo`.
+	`<N>` must be a positive integer.  If a displayed ref has fewer
+	components than `<N>`, the command aborts with an error.
 
 objecttype::
 	The type of the object (`blob`, `tree`, `commit`, `tag`).
@@ -111,10 +131,26 @@
 	Change output color.  Followed by `:<colorname>`, where names
 	are described in `color.branch.*`.
 
+align::
+	Left-, middle-, or right-align the content between
+	%(align:...) and %(end). The "align:" is followed by `<width>`
+	and `<position>` in any order separated by a comma, where the
+	`<position>` is either left, right or middle, default being
+	left and `<width>` is the total length of the content with
+	alignment. If the contents length is more than the width then
+	no alignment is performed. If used with '--quote' everything
+	in between %(align:...) and %(end) is quoted, but if nested
+	then only the topmost level performs quoting.
+
 In addition to the above, for commit and tag objects, the header
 field names (`tree`, `parent`, `object`, `type`, and `tag`) can
 be used to specify the value in the header field.
 
+For commit and tag objects, the special `creatordate` and `creator`
+fields will correspond to the appropriate date or name-email-date tuple
+from the `committer` or `tagger` fields depending on the object type.
+These are intended for working on a mix of annotated and lightweight tags.
+
 Fields that have name-email-date tuple as its value (`author`,
 `committer`, and `tagger`) can be suffixed with `name`, `email`,
 and `date` to extract the named component.
@@ -123,20 +159,23 @@
 Its first line is `contents:subject`, where subject is the concatenation
 of all lines of the commit message up to the first blank line.  The next
 line is 'contents:body', where body is all of the lines after the first
-blank line.  Finally, the optional GPG signature is `contents:signature`.
+blank line.  The optional GPG signature is `contents:signature`.  The
+first `N` lines of the message is obtained using `contents:lines=N`.
 
-For sorting purposes, fields with numeric values sort in numeric
-order (`objectsize`, `authordate`, `committerdate`, `taggerdate`).
+For sorting purposes, fields with numeric values sort in numeric order
+(`objectsize`, `authordate`, `committerdate`, `creatordate`, `taggerdate`).
 All other fields are used to sort in their byte-value order.
 
+There is also an option to sort by versions, this can be done by using
+the fieldname `version:refname` or its alias `v:refname`.
+
 In any case, a field name that refers to a field inapplicable to
 the object referred by the ref does not cause an error.  It
 returns an empty string instead.
 
 As a special case for the date-type fields, you may specify a format for
-the date by adding one of `:default`, `:relative`, `:short`, `:local`,
-`:iso8601`, `:rfc2822` or `:raw` to the end of the fieldname; e.g.
-`%(taggerdate:relative)`.
+the date by adding `:` followed by date format name (see the
+values the `--date` option to linkgit::git-rev-list[1] takes).
 
 
 EXAMPLES
diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt
index 4035649..b149e09 100644
--- a/Documentation/git-format-patch.txt
+++ b/Documentation/git-format-patch.txt
@@ -109,6 +109,7 @@
 --signoff::
 	Add `Signed-off-by:` line to the commit message, using
 	the committer identity of yourself.
+	See the signoff option in linkgit:git-commit[1] for more information.
 
 --stdout::
 	Print all commits to the standard output in mbox format,
@@ -256,6 +257,10 @@
 	using this option cannot be applied properly, but they are
 	still useful for code review.
 
+--zero-commit::
+  Output an all-zero hash in each patch's From header instead
+  of the hash of the commit.
+
 --root::
 	Treat the revision argument as a <revision range>, even if it
 	is just a single commit (that would normally be treated as a
diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt
index b3e768e..738cfde 100644
--- a/Documentation/git-p4.txt
+++ b/Documentation/git-p4.txt
@@ -510,6 +510,45 @@
 	option '--use-client-spec'.  See the "CLIENT SPEC" section above.
 	This variable is a boolean, not the name of a p4 client.
 
+git-p4.pathEncoding::
+	Perforce keeps the encoding of a path as given by the originating OS.
+	Git expects paths encoded as UTF-8. Use this config to tell git-p4
+	what encoding Perforce had used for the paths. This encoding is used
+	to transcode the paths to UTF-8. As an example, Perforce on Windows
+	often uses “cp1252” to encode path names.
+
+git-p4.largeFileSystem::
+	Specify the system that is used for large (binary) files. Please note
+	that large file systems do not support the 'git p4 submit' command.
+	Only Git LFS [1] is implemented right now. Download
+	and install the Git LFS command line extension to use this option
+	and configure it like this:
++
+-------------
+git config       git-p4.largeFileSystem GitLFS
+-------------
++
+	[1] https://git-lfs.github.com/
+
+git-p4.largeFileExtensions::
+	All files matching a file extension in the list will be processed
+	by the large file system. Do not prefix the extensions with '.'.
+
+git-p4.largeFileThreshold::
+	All files with an uncompressed size exceeding the threshold will be
+	processed by the large file system. By default the threshold is
+	defined in bytes. Add the suffix k, m, or g to change the unit.
+
+git-p4.largeFileCompressedThreshold::
+	All files with a compressed size exceeding the threshold will be
+	processed by the large file system. This option might slow down
+	your clone/sync process. By default the threshold is defined in
+	bytes. Add the suffix k, m, or g to change the unit.
+
+git-p4.largeFilePush::
+	Boolean variable which defines if large files are automatically
+	pushed to a server.
+
 git-p4.keepEmptyCommits::
 	A changelist that contains only excluded files will be imported
 	as an empty commit if this boolean option is set to true.
diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt
index 85a4d7d..af521f8 100644
--- a/Documentation/git-push.txt
+++ b/Documentation/git-push.txt
@@ -37,6 +37,13 @@
 and if it is not found, honors `push.default` configuration to decide
 what to push (See linkgit:git-config[1] for the meaning of `push.default`).
 
+When neither the command-line nor the configuration specify what to
+push, the default behavior is used, which corresponds to the `simple`
+value for `push.default`: the current branch is pushed to the
+corresponding upstream branch, but as a safety measure, the push is
+aborted if the upstream branch does not have the same name as the
+local one.
+
 
 OPTIONS[[OPTIONS]]
 ------------------
@@ -257,16 +264,20 @@
 	is specified. This flag forces progress status even if the
 	standard error stream is not directed to a terminal.
 
---recurse-submodules=check|on-demand::
-	Make sure all submodule commits used by the revisions to be
-	pushed are available on a remote-tracking branch. If 'check' is
-	used Git will verify that all submodule commits that changed in
-	the revisions to be pushed are available on at least one remote
-	of the submodule. If any commits are missing the push will be
-	aborted and exit with non-zero status. If 'on-demand' is used
-	all submodules that changed in the revisions to be pushed will
-	be pushed. If on-demand was not able to push all necessary
-	revisions it will also be aborted and exit with non-zero status.
+--no-recurse-submodules::
+--recurse-submodules=check|on-demand|no::
+	May be used to make sure all submodule commits used by the
+	revisions to be pushed are available on a remote-tracking branch.
+	If 'check' is used Git will verify that all submodule commits that
+	changed in the revisions to be pushed are available on at least one
+	remote of the submodule. If any commits are missing the push will
+	be aborted and exit with non-zero status. If 'on-demand' is used
+	all submodules that changed in the revisions to be pushed will be
+	pushed. If on-demand was not able to push all necessary revisions
+	it will also be aborted and exit with non-zero status. A value of
+	'no' or using '--no-recurse-submodules' can be used to override the
+	push.recurseSubmodules configuration variable when no submodule
+	recursion is required.
 
 --[no-]verify::
 	Toggle the pre-push hook (see linkgit:githooks[5]).  The
diff --git a/Documentation/git-quiltimport.txt b/Documentation/git-quiltimport.txt
index d64388c..ff633b0 100644
--- a/Documentation/git-quiltimport.txt
+++ b/Documentation/git-quiltimport.txt
@@ -10,6 +10,7 @@
 --------
 [verse]
 'git quiltimport' [--dry-run | -n] [--author <author>] [--patches <dir>]
+		[--series <file>]
 
 
 DESCRIPTION
@@ -42,13 +43,19 @@
 	information can be found in the patch description.
 
 --patches <dir>::
-	The directory to find the quilt patches and the
-	quilt series file.
+	The directory to find the quilt patches.
 +
 The default for the patch directory is patches
 or the value of the $QUILT_PATCHES environment
 variable.
 
+--series <file>::
+	The quilt series file.
++
+The default for the series file is <patches>/series
+or the value of the $QUILT_SERIES environment
+variable.
+
 GIT
 ---
 Part of the linkgit:git[1] suite
diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt
index 8bd22af..1d7ecea 100644
--- a/Documentation/git-remote.txt
+++ b/Documentation/git-remote.txt
@@ -15,6 +15,7 @@
 'git remote remove' <name>
 'git remote set-head' <name> (-a | --auto | -d | --delete | <branch>)
 'git remote set-branches' [--add] <name> <branch>...
+'git remote get-url' [--push] [--all] <name>
 'git remote set-url' [--push] <name> <newurl> [<oldurl>]
 'git remote set-url --add' [--push] <name> <newurl>
 'git remote set-url --delete' [--push] <name> <url>
@@ -131,6 +132,15 @@
 With `--add`, instead of replacing the list of currently tracked
 branches, adds to that list.
 
+'get-url'::
+
+Retrieves the URLs for a remote. Configurations for `insteadOf` and
+`pushInsteadOf` are expanded here. By default, only the first URL is listed.
++
+With '--push', push URLs are queried rather than fetch URLs.
++
+With '--all', all URLs for the remote will be listed.
+
 'set-url'::
 
 Changes URLs for the remote. Sets first URL for remote <name> that matches
diff --git a/Documentation/git-rev-list.txt b/Documentation/git-rev-list.txt
index 7b49c85..ef22f17 100644
--- a/Documentation/git-rev-list.txt
+++ b/Documentation/git-rev-list.txt
@@ -45,7 +45,7 @@
 	     [ --regexp-ignore-case | -i ]
 	     [ --extended-regexp | -E ]
 	     [ --fixed-strings | -F ]
-	     [ --date=(local|relative|default|iso|iso-strict|rfc|short) ]
+	     [ --date=<format>]
 	     [ [ --objects | --objects-edge | --objects-edge-aggressive ]
 	       [ --unpacked ] ]
 	     [ --pretty | --header ]
diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt
index b15139f..573616a 100644
--- a/Documentation/git-revert.txt
+++ b/Documentation/git-revert.txt
@@ -89,6 +89,7 @@
 -s::
 --signoff::
 	Add Signed-off-by line at the end of the commit message.
+	See the signoff option in linkgit:git-commit[1] for more information.
 
 --strategy=<strategy>::
 	Use the given merge strategy.  Should only be used once.
diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt
index b9134d2..771a7b5 100644
--- a/Documentation/git-send-email.txt
+++ b/Documentation/git-send-email.txt
@@ -10,6 +10,7 @@
 --------
 [verse]
 'git send-email' [options] <file|directory|rev-list options>...
+'git send-email' --dump-aliases
 
 
 DESCRIPTION
@@ -387,6 +388,16 @@
 	Send emails even if safety checks would prevent it.
 
 
+Information
+~~~~~~~~~~~
+
+--dump-aliases::
+	Instead of the normal operation, dump the shorthand alias names from
+	the configured alias file(s), one per line in alphabetical order. Note,
+	this only includes the alias name and not its expanded email addresses.
+	See 'sendemail.aliasesfile' for more information about aliases.
+
+
 CONFIGURATION
 -------------
 
diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt
index 375213f..92df596 100644
--- a/Documentation/git-stash.txt
+++ b/Documentation/git-stash.txt
@@ -95,6 +95,8 @@
 	shows the latest one. By default, the command shows the diffstat, but
 	it will accept any format known to 'git diff' (e.g., `git stash show
 	-p stash@{1}` to view the second most recent stash in patch form).
+	You can use stash.showStat and/or stash.showPatch config variables
+	to change the default behavior.
 
 pop [--index] [-q|--quiet] [<stash>]::
 
diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index 08b4dfb..abab481 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -13,7 +13,8 @@
 	<tagname> [<commit> | <object>]
 'git tag' -d <tagname>...
 'git tag' [-n[<num>]] -l [--contains <commit>] [--points-at <object>]
-	[--column[=<options>] | --no-column] [--create-reflog] [<pattern>...]
+	[--column[=<options>] | --no-column] [--create-reflog] [--sort=<key>]
+	[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]
 'git tag' -v <tagname>...
 
 DESCRIPTION
@@ -94,14 +95,16 @@
 	using fnmatch(3)).  Multiple patterns may be given; if any of
 	them matches, the tag is shown.
 
---sort=<type>::
-	Sort in a specific order. Supported type is "refname"
-	(lexicographic order), "version:refname" or "v:refname" (tag
+--sort=<key>::
+	Sort based on the key given.  Prefix `-` to sort in
+	descending order of the value. You may use the --sort=<key> option
+	multiple times, in which case the last key becomes the primary
+	key. Also supports "version:refname" or "v:refname" (tag
 	names are treated as versions). The "version:refname" sort
 	order can also be affected by the
-	"versionsort.prereleaseSuffix" configuration variable. Prepend
-	"-" to reverse sort order. When this option is not given, the
-	sort order defaults to the value configured for the 'tag.sort'
+	"versionsort.prereleaseSuffix" configuration variable.
+	The keys supported are the same as those in `git for-each-ref`.
+	Sort order defaults to the value configured for the 'tag.sort'
 	variable if it exists, or lexicographic order otherwise. See
 	linkgit:git-config[1].
 
@@ -156,6 +159,16 @@
 	The object that the new tag will refer to, usually a commit.
 	Defaults to HEAD.
 
+<format>::
+	A string that interpolates `%(fieldname)` from the object
+	pointed at by a ref being shown.  The format is the same as
+	that of linkgit:git-for-each-ref[1].  When unspecified,
+	defaults to `%(refname:strip=2)`.
+
+--[no-]merged [<commit>]::
+	Only list tags whose tips are reachable, or not reachable
+	if '--no-merged' is used, from the specified commit ('HEAD'
+	if not specified).
 
 CONFIGURATION
 -------------
diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
index fb68156..62c76c1 100644
--- a/Documentation/git-worktree.txt
+++ b/Documentation/git-worktree.txt
@@ -11,6 +11,7 @@
 [verse]
 'git worktree add' [-f] [--detach] [-b <new-branch>] <path> [<branch>]
 'git worktree prune' [-n] [-v] [--expire <expire>]
+'git worktree list' [--porcelain]
 
 DESCRIPTION
 -----------
@@ -31,11 +32,9 @@
 `git worktree prune` in the main or any linked working tree to
 clean up any stale administrative files.
 
-If you move a linked working tree to another file system, or
-within a file system that does not support hard links, you need to run
-at least one git command inside the linked working tree
-(e.g. `git status`) in order to update its administrative files in the
-repository so that they do not get automatically pruned.
+If you move a linked working tree, you need to manually update the
+administrative files so that they do not get pruned automatically. See
+section "DETAILS" for more information.
 
 If a linked working tree is stored on a portable device or network share
 which is not always mounted, you can prevent its administrative files from
@@ -59,6 +58,13 @@
 
 Prune working tree information in $GIT_DIR/worktrees.
 
+list::
+
+List details of each worktree.  The main worktree is listed first, followed by
+each of the linked worktrees.  The output details include if the worktree is
+bare, the revision currently checked out, and the branch currently checked out
+(or 'detached HEAD' if none).
+
 OPTIONS
 -------
 
@@ -86,6 +92,11 @@
 	With `prune`, do not remove anything; just report what it would
 	remove.
 
+--porcelain::
+	With `list`, output in an easy-to-parse format for scripts.
+	This format will remain stable across Git versions and regardless of user
+	configuration.  See below for details.
+
 -v::
 --verbose::
 	With `prune`, report all removals.
@@ -124,6 +135,13 @@
 $GIT_DIR or $GIT_COMMON_DIR when you need to directly access something
 inside $GIT_DIR. Use `git rev-parse --git-path` to get the final path.
 
+If you move a linked working tree, you need to update the 'gitdir' file
+in the entry's directory. For example, if a linked working tree is moved
+to `/newpath/test-next` and its `.git` file points to
+`/path/main/.git/worktrees/test-next`, then update
+`/path/main/.git/worktrees/test-next/gitdir` to reference `/newpath/test-next`
+instead.
+
 To prevent a $GIT_DIR/worktrees entry from being pruned (which
 can be useful in some situations, such as when the
 entry's working tree is stored on a portable device), add a file named
@@ -134,6 +152,41 @@
 `test-next` entry from being pruned.  See
 linkgit:gitrepository-layout[5] for details.
 
+LIST OUTPUT FORMAT
+------------------
+The worktree list command has two output formats.  The default format shows the
+details on a single line with columns.  For example:
+
+------------
+S git worktree list
+/path/to/bare-source            (bare)
+/path/to/linked-worktree        abcd1234 [master]
+/path/to/other-linked-worktree  1234abc  (detached HEAD)
+------------
+
+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 only present if and only
+if the value is true.  An empty line indicates the end of a worktree.  For
+example:
+
+------------
+S git worktree list --porcelain
+worktree /path/to/bare-source
+bare
+
+worktree /path/to/linked-worktree
+HEAD abcd1234abcd1234abcd1234abcd1234abcd1234
+branch refs/heads/master
+
+worktree /path/to/other-linked-worktree
+HEAD 1234abc1234abc1234abc1234abc1234abc1234a
+detached
+
+------------
+
 EXAMPLES
 --------
 You are in the middle of a refactoring session and your boss comes in and
@@ -167,7 +220,6 @@
 - `remove` to remove a linked working tree and its administrative files (and
   warn if the working tree is dirty)
 - `mv` to move or rename a working tree and update its administrative files
-- `list` to list linked working trees
 - `lock` to prevent automatic pruning of administrative files (for instance,
   for a working tree on a portable device)
 
diff --git a/Documentation/git.txt b/Documentation/git.txt
index 64ac7b2..4b324c8 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -43,6 +43,14 @@
 branch of the `git.git` repository.
 Documentation for older releases are available here:
 
+* link:v2.7.3/git.html[documentation for release 2.7.3]
+
+* release notes for
+  link:RelNotes/2.7.3.txt[2.7.3],
+  link:RelNotes/2.7.2.txt[2.7.2],
+  link:RelNotes/2.7.1.txt[2.7.1],
+  link:RelNotes/2.7.0.txt[2.7].
+
 * link:v2.6.7/git.html[documentation for release 2.6.7]
 
 * release notes for
diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
index 7ba0ac9..a2f59b1 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.txt
@@ -397,7 +397,7 @@
 'extra-info'.
 
 The hook always runs after the automatic note copying (see
-"notes.rewrite.<command>" in linkgit:git-config.txt[1]) has happened, and
+"notes.rewrite.<command>" in linkgit:git-config[1]) has happened, and
 thus has access to these notes.
 
 The following command-specific comments apply:
diff --git a/Documentation/glossary-content.txt b/Documentation/glossary-content.txt
index 8c6478b..cafc284 100644
--- a/Documentation/glossary-content.txt
+++ b/Documentation/glossary-content.txt
@@ -413,8 +413,9 @@
 
 [[def_per_worktree_ref]]per-worktree ref::
 	Refs that are per-<<def_working_tree,worktree>>, rather than
-	global.  This is presently only <<def_HEAD,HEAD>>, but might
-	later include other unusual refs.
+	global.  This is presently only <<def_HEAD,HEAD>> and any refs
+	that start with `refs/bisect/`, but might later include other
+	unusual refs.
 
 [[def_pseudoref]]pseudoref::
 	Pseudorefs are a class of files under `$GIT_DIR` which behave
@@ -530,6 +531,11 @@
 	"Secure Hash Algorithm 1"; a cryptographic hash function.
 	In the context of Git used as a synonym for <<def_object_name,object name>>.
 
+[[def_shallow_clone]]shallow clone::
+	Mostly a synonym to <<def_shallow_repository,shallow repository>>
+	but the phrase makes it more explicit that it was created by
+	running `git clone --depth=...` command.
+
 [[def_shallow_repository]]shallow repository::
 	A shallow <<def_repository,repository>> has an incomplete
 	history some of whose <<def_commit,commits>> have <<def_parent,parents>> cauterized away (in other
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index f1c5220..4f009d4 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -701,15 +701,19 @@
 --relative-date::
 	Synonym for `--date=relative`.
 
---date=(relative|local|default|iso|iso-strict|rfc|short|raw)::
+--date=<format>::
 	Only takes effect for dates shown in human-readable format, such
 	as when using `--pretty`. `log.date` config variable sets a default
-	value for the log command's `--date` option.
+	value for the log command's `--date` option. By default, dates
+	are shown in the original time zone (either committer's or
+	author's). If `-local` is appended to the format (e.g.,
+	`iso-local`), the user's local time zone is used instead.
 +
 `--date=relative` shows dates relative to the current time,
-e.g. ``2 hours ago''.
+e.g. ``2 hours ago''. The `-local` option cannot be used with
+`--raw` or `--relative`.
 +
-`--date=local` shows timestamps in user's local time zone.
+`--date=local` is an alias for `--date=default-local`.
 +
 `--date=iso` (or `--date=iso8601`) shows timestamps in a ISO 8601-like format.
 The differences to the strict ISO 8601 format are:
@@ -732,10 +736,15 @@
 `--date=format:...` feeds the format `...` to your system `strftime`.
 Use `--date=format:%c` to show the date in your system locale's
 preferred format.  See the `strftime` manual for a complete list of
-format placeholders.
+format placeholders. When using `-local`, the correct syntax is
+`--date=format-local:...`.
 +
-`--date=default` shows timestamps in the original time zone
-(either committer's or author's).
+`--date=default` is the default format, and is similar to
+`--date=rfc2822`, with a few exceptions:
+
+	- there is no comma after the day-of-week
+
+	- the time zone is omitted when the local time zone is used
 
 ifdef::git-rev-list[]
 --header::
diff --git a/Documentation/technical/api-argv-array.txt b/Documentation/technical/api-argv-array.txt
index 8076172..cfc0630 100644
--- a/Documentation/technical/api-argv-array.txt
+++ b/Documentation/technical/api-argv-array.txt
@@ -56,3 +56,10 @@
 `argv_array_clear`::
 	Free all memory associated with the array and return it to the
 	initial, empty state.
+
+`argv_array_detach`::
+	Disconnect the `argv` member from the `argv_array` struct and
+	return it. The caller is responsible for freeing the memory used
+	by the array, and by the strings it references. After detaching,
+	the `argv_array` is in a reinitialized state and can be pushed
+	into again.
diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt
index 1c790ac..ec6bacf 100644
--- a/Documentation/user-manual.txt
+++ b/Documentation/user-manual.txt
@@ -2125,8 +2125,37 @@
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 The gitweb cgi script provides users an easy way to browse your
-project's files and history without having to install Git; see the file
-gitweb/INSTALL in the Git source tree for instructions on setting it up.
+project's revisions, file contents and logs without having to install
+Git. Features like RSS/Atom feeds and blame/annotation details may
+optionally be enabled.
+
+The linkgit:git-instaweb[1] command provides a simple way to start
+browsing the repository using gitweb. The default server when using
+instaweb is lighttpd.
+
+See the file gitweb/INSTALL in the Git source tree and
+linkgit:gitweb[1] for instructions on details setting up a permament
+installation with a CGI or Perl capable server.
+
+[[how-to-get-a-git-repository-with-minimal-history]]
+How to get a Git repository with minimal history
+------------------------------------------------
+
+A <<def_shallow_clone,shallow clone>>, with its truncated
+history, is useful when one is interested only in recent history
+of a project and getting full history from the upstream is
+expensive.
+
+A <<def_shallow_clone,shallow clone>> is created by specifying
+the linkgit:git-clone[1] `--depth` switch. The depth can later be
+changed with the linkgit:git-fetch[1] `--depth` switch, or full
+history restored with `--unshallow`.
+
+Merging inside a <<def_shallow_clone,shallow clone>> will work as long
+as a merge base is in the recent history.
+Otherwise, it will be like merging unrelated histories and may
+have to result in huge conflicts.  This limitation may make such
+a repository unsuitable to be used in merge based workflows.
 
 [[sharing-development-examples]]
 Examples
@@ -4636,23 +4665,15 @@
 Scan man pages to see if any assume more background than this manual
 provides.
 
-Simplify beginning by suggesting disconnected head instead of
-temporary branch creation?
-
 Add more good examples.  Entire sections of just cookbook examples
 might be a good idea; maybe make an "advanced examples" section a
 standard end-of-chapter section?
 
 Include cross-references to the glossary, where appropriate.
 
-Document shallow clones?  See draft 1.5.0 release notes for some
-documentation.
-
 Add a section on working with other version control systems, including
 CVS, Subversion, and just imports of series of release tarballs.
 
-More details on gitweb?
-
 Write a chapter on using plumbing and writing scripts.
 
 Alternates, clone -reference, etc.
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 9b279fd..0305065 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v2.6.7
+DEF_VER=v2.7.4
 
 LF='
 '
diff --git a/Makefile b/Makefile
index 37e2d9e..fd19b54 100644
--- a/Makefile
+++ b/Makefile
@@ -77,8 +77,6 @@
 # Define HAVE_PATHS_H if you have paths.h and want to use the default PATH
 # it specifies.
 #
-# Define NO_D_INO_IN_DIRENT if you don't have d_ino in your struct dirent.
-#
 # Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
 # d_type in struct dirent (Cygwin 1.5, fixed in Cygwin 1.7).
 #
@@ -737,6 +735,7 @@
 LIB_OBJS += ll-merge.o
 LIB_OBJS += lockfile.o
 LIB_OBJS += log-tree.o
+LIB_OBJS += mailinfo.o
 LIB_OBJS += mailmap.o
 LIB_OBJS += match-trees.o
 LIB_OBJS += merge.o
@@ -773,6 +772,7 @@
 LIB_OBJS += read-cache.o
 LIB_OBJS += reflog-walk.o
 LIB_OBJS += refs.o
+LIB_OBJS += refs/files-backend.o
 LIB_OBJS += ref-filter.o
 LIB_OBJS += remote.o
 LIB_OBJS += replace_object.o
@@ -818,6 +818,7 @@
 LIB_OBJS += versioncmp.o
 LIB_OBJS += walker.o
 LIB_OBJS += wildmatch.o
+LIB_OBJS += worktree.o
 LIB_OBJS += wrapper.o
 LIB_OBJS += write_or_die.o
 LIB_OBJS += ws.o
@@ -913,6 +914,7 @@
 BUILTIN_OBJS += builtin/show-branch.o
 BUILTIN_OBJS += builtin/show-ref.o
 BUILTIN_OBJS += builtin/stripspace.o
+BUILTIN_OBJS += builtin/submodule--helper.o
 BUILTIN_OBJS += builtin/symbolic-ref.o
 BUILTIN_OBJS += builtin/tag.o
 BUILTIN_OBJS += builtin/unpack-file.o
@@ -1172,9 +1174,6 @@
 ifdef NO_D_TYPE_IN_DIRENT
 	BASIC_CFLAGS += -DNO_D_TYPE_IN_DIRENT
 endif
-ifdef NO_D_INO_IN_DIRENT
-	BASIC_CFLAGS += -DNO_D_INO_IN_DIRENT
-endif
 ifdef NO_GECOS_IN_PWENT
 	BASIC_CFLAGS += -DNO_GECOS_IN_PWENT
 endif
@@ -2434,7 +2433,7 @@
 	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
 
 clean: profile-clean coverage-clean
-	$(RM) *.o *.res block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o
+	$(RM) *.o *.res refs/*.o block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o
 	$(RM) xdiff/*.o vcs-svn/*.o ewah/*.o builtin/*.o
 	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
 	$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
diff --git a/RelNotes b/RelNotes
index 9158b66..c66ca68 120000
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.6.7.txt
\ No newline at end of file
+Documentation/RelNotes/2.7.4.txt
\ No newline at end of file
diff --git a/alias.c b/alias.c
index a11229d..3b90397 100644
--- a/alias.c
+++ b/alias.c
@@ -23,7 +23,7 @@
 	int src, dst, count = 0, size = 16;
 	char quoted = 0;
 
-	*argv = xmalloc(sizeof(**argv) * size);
+	ALLOC_ARRAY(*argv, size);
 
 	/* split alias_string */
 	(*argv)[count++] = cmdline;
diff --git a/archive-tar.c b/archive-tar.c
index 0d1e6bd..cb99df2 100644
--- a/archive-tar.c
+++ b/archive-tar.c
@@ -167,21 +167,21 @@
 			   struct ustar_header *header,
 			   unsigned int mode, unsigned long size)
 {
-	sprintf(header->mode, "%07o", mode & 07777);
-	sprintf(header->size, "%011lo", S_ISREG(mode) ? size : 0);
-	sprintf(header->mtime, "%011lo", (unsigned long) args->time);
+	xsnprintf(header->mode, sizeof(header->mode), "%07o", mode & 07777);
+	xsnprintf(header->size, sizeof(header->size), "%011lo", S_ISREG(mode) ? size : 0);
+	xsnprintf(header->mtime, sizeof(header->mtime), "%011lo", (unsigned long) args->time);
 
-	sprintf(header->uid, "%07o", 0);
-	sprintf(header->gid, "%07o", 0);
+	xsnprintf(header->uid, sizeof(header->uid), "%07o", 0);
+	xsnprintf(header->gid, sizeof(header->gid), "%07o", 0);
 	strlcpy(header->uname, "root", sizeof(header->uname));
 	strlcpy(header->gname, "root", sizeof(header->gname));
-	sprintf(header->devmajor, "%07o", 0);
-	sprintf(header->devminor, "%07o", 0);
+	xsnprintf(header->devmajor, sizeof(header->devmajor), "%07o", 0);
+	xsnprintf(header->devminor, sizeof(header->devminor), "%07o", 0);
 
 	memcpy(header->magic, "ustar", 6);
 	memcpy(header->version, "00", 2);
 
-	sprintf(header->chksum, "%07o", ustar_header_chksum(header));
+	xsnprintf(header->chksum, sizeof(header->chksum), "%07o", ustar_header_chksum(header));
 }
 
 static int write_extended_header(struct archiver_args *args,
@@ -193,7 +193,7 @@
 	memset(&header, 0, sizeof(header));
 	*header.typeflag = TYPEFLAG_EXT_HEADER;
 	mode = 0100666;
-	sprintf(header.name, "%s.paxheader", sha1_to_hex(sha1));
+	xsnprintf(header.name, sizeof(header.name), "%s.paxheader", sha1_to_hex(sha1));
 	prepare_header(args, &header, mode, size);
 	write_blocked(&header, sizeof(header));
 	write_blocked(buffer, size);
@@ -233,10 +233,10 @@
 		size_t rest = pathlen - plen - 1;
 		if (plen > 0 && rest <= sizeof(header.name)) {
 			memcpy(header.prefix, path, plen);
-				memcpy(header.name, path + plen + 1, rest);
+			memcpy(header.name, path + plen + 1, rest);
 		} else {
-			sprintf(header.name, "%s.data",
-				sha1_to_hex(sha1));
+			xsnprintf(header.name, sizeof(header.name), "%s.data",
+				  sha1_to_hex(sha1));
 			strbuf_append_ext_header(&ext_header, "path",
 						 path, pathlen);
 		}
@@ -259,8 +259,8 @@
 
 	if (S_ISLNK(mode)) {
 		if (size > sizeof(header.linkname)) {
-			sprintf(header.linkname, "see %s.paxheader",
-			        sha1_to_hex(sha1));
+			xsnprintf(header.linkname, sizeof(header.linkname),
+				  "see %s.paxheader", sha1_to_hex(sha1));
 			strbuf_append_ext_header(&ext_header, "linkpath",
 			                         buffer, size);
 		} else
@@ -301,7 +301,7 @@
 	memset(&header, 0, sizeof(header));
 	*header.typeflag = TYPEFLAG_GLOBAL_HEADER;
 	mode = 0100666;
-	strcpy(header.name, "pax_global_header");
+	xsnprintf(header.name, sizeof(header.name), "pax_global_header");
 	prepare_header(args, &header, mode, ext_header.len);
 	write_blocked(&header, sizeof(header));
 	write_blocked(ext_header.buf, ext_header.len);
diff --git a/archive.c b/archive.c
index 01b0899..5d735ae 100644
--- a/archive.c
+++ b/archive.c
@@ -171,13 +171,14 @@
 		unsigned mode, int stage, struct archiver_context *c)
 {
 	struct directory *d;
-	d = xmallocz(sizeof(*d) + base->len + 1 + strlen(filename));
+	size_t len = st_add4(base->len, 1, strlen(filename), 1);
+	d = xmalloc(st_add(sizeof(*d), len));
 	d->up	   = c->bottom;
 	d->baselen = base->len;
 	d->mode	   = mode;
 	d->stage   = stage;
 	c->bottom  = d;
-	d->len = sprintf(d->path, "%.*s%s/", (int)base->len, base->buf, filename);
+	d->len = xsnprintf(d->path, len, "%.*s%s/", (int)base->len, base->buf, filename);
 	hashcpy(d->oid.hash, sha1);
 }
 
@@ -240,7 +241,7 @@
 			len--;
 		if (args->verbose)
 			fprintf(stderr, "%.*s\n", (int)len, args->base);
-		err = write_entry(args, args->tree->object.sha1, args->base,
+		err = write_entry(args, args->tree->object.oid.hash, args->base,
 				  len, 040777);
 		if (err)
 			return err;
@@ -373,7 +374,7 @@
 
 	commit = lookup_commit_reference_gently(oid.hash, 1);
 	if (commit) {
-		commit_sha1 = commit->object.sha1;
+		commit_sha1 = commit->object.oid.hash;
 		archive_time = commit->date;
 	} else {
 		commit_sha1 = NULL;
@@ -389,7 +390,7 @@
 		unsigned int mode;
 		int err;
 
-		err = get_tree_entry(tree->object.sha1, prefix,
+		err = get_tree_entry(tree->object.oid.hash, prefix,
 				     tree_oid.hash, &mode);
 		if (err || !S_ISDIR(mode))
 			die("current working directory is untracked");
diff --git a/argv-array.c b/argv-array.c
index eaed477..5d370fa 100644
--- a/argv-array.c
+++ b/argv-array.c
@@ -74,3 +74,14 @@
 	}
 	argv_array_init(array);
 }
+
+const char **argv_array_detach(struct argv_array *array)
+{
+	if (array->argv == empty_argv)
+		return xcalloc(1, sizeof(const char *));
+	else {
+		const char **ret = array->argv;
+		argv_array_init(array);
+		return ret;
+	}
+}
diff --git a/argv-array.h b/argv-array.h
index a2fa0aa..29056e4 100644
--- a/argv-array.h
+++ b/argv-array.h
@@ -20,5 +20,6 @@
 void argv_array_pushv(struct argv_array *, const char **);
 void argv_array_pop(struct argv_array *);
 void argv_array_clear(struct argv_array *);
+const char **argv_array_detach(struct argv_array *);
 
 #endif /* ARGV_ARRAY_H */
diff --git a/attr.c b/attr.c
index 086c08d..6537a43 100644
--- a/attr.c
+++ b/attr.c
@@ -93,9 +93,7 @@
 	if (invalid_attr_name(name, len))
 		return NULL;
 
-	a = xmalloc(sizeof(*a) + len + 1);
-	memcpy(a->name, name, len);
-	a->name[len] = 0;
+	FLEX_ALLOC_MEM(a, name, name, len);
 	a->h = hval;
 	a->next = git_attr_hash[pos];
 	a->attr_nr = attr_nr++;
@@ -799,7 +797,7 @@
 			++count;
 	}
 	*num = count;
-	*check = xmalloc(sizeof(**check) * count);
+	ALLOC_ARRAY(*check, count);
 	j = 0;
 	for (i = 0; i < attr_nr; i++) {
 		const char *value = check_all_attr[i].value;
diff --git a/bisect.c b/bisect.c
index 041a13d..6d0793b 100644
--- a/bisect.c
+++ b/bisect.c
@@ -193,7 +193,7 @@
 	b = (struct commit_dist *)b_;
 	if (a->distance != b->distance)
 		return b->distance - a->distance; /* desc sort */
-	return hashcmp(a->commit->object.sha1, b->commit->object.sha1);
+	return oidcmp(&a->commit->object.oid, &b->commit->object.oid);
 }
 
 static struct commit_list *best_bisection_sorted(struct commit_list *list, int nr)
@@ -500,7 +500,7 @@
 		struct commit_list *next = list->next;
 		list->next = NULL;
 		if (0 <= sha1_array_lookup(&skipped_revs,
-					   list->item->object.sha1)) {
+					   list->item->object.oid.hash)) {
 			if (skipped_first && !*skipped_first)
 				*skipped_first = 1;
 			/* Move current to tried list */
@@ -575,7 +575,7 @@
 
 	for (i = 0; cur; cur = cur->next, i++) {
 		if (i == index) {
-			if (hashcmp(cur->item->object.sha1, current_bad_oid->hash))
+			if (oidcmp(&cur->item->object.oid, current_bad_oid))
 				return cur;
 			if (previous)
 				return previous;
@@ -708,10 +708,10 @@
 
 static struct commit **get_bad_and_good_commits(int *rev_nr)
 {
-	int len = 1 + good_revs.nr;
-	struct commit **rev = xmalloc(len * sizeof(*rev));
+	struct commit **rev;
 	int i, n = 0;
 
+	ALLOC_ARRAY(rev, 1 + good_revs.nr);
 	rev[n++] = get_commit_reference(current_bad_oid->hash);
 	for (i = 0; i < good_revs.nr; i++)
 		rev[n++] = get_commit_reference(good_revs.sha1[i]);
@@ -730,6 +730,11 @@
 				"This means the bug has been fixed "
 				"between %s and [%s].\n",
 				bad_hex, bad_hex, good_hex);
+		} else if (!strcmp(term_bad, "new") && !strcmp(term_good, "old")) {
+			fprintf(stderr, "The merge base %s is new.\n"
+				"The property has changed "
+				"between %s and [%s].\n",
+				bad_hex, bad_hex, good_hex);
 		} else {
 			fprintf(stderr, "The merge base %s is %s.\n"
 				"This means the first '%s' commit is "
@@ -762,11 +767,11 @@
 }
 
 /*
- * "check_merge_bases" checks that merge bases are not "bad".
+ * "check_merge_bases" checks that merge bases are not "bad" (or "new").
  *
- * - If one is "bad", it means the user assumed something wrong
+ * - If one is "bad" (or "new"), it means the user assumed something wrong
  * and we must exit with a non 0 error code.
- * - If one is "good", that's good, we have nothing to do.
+ * - If one is "good" (or "old"), that's good, we have nothing to do.
  * - If one is "skipped", we can't know but we should warn.
  * - If we don't know, we should check it out and ask the user to test.
  */
@@ -779,7 +784,7 @@
 	result = get_merge_bases_many(rev[0], rev_nr - 1, rev + 1);
 
 	for (; result; result = result->next) {
-		const unsigned char *mb = result->item->object.sha1;
+		const unsigned char *mb = result->item->object.oid.hash;
 		if (!hashcmp(mb, current_bad_oid->hash)) {
 			handle_bad_merge_base();
 		} else if (0 <= sha1_array_lookup(&good_revs, mb)) {
@@ -968,7 +973,7 @@
 		exit(4);
 	}
 
-	bisect_rev = revs.commits->item->object.sha1;
+	bisect_rev = revs.commits->item->object.oid.hash;
 
 	if (!hashcmp(bisect_rev, current_bad_oid->hash)) {
 		exit_if_skipped_commits(tried, current_bad_oid);
diff --git a/branch.c b/branch.c
index d013374..c50ea42 100644
--- a/branch.c
+++ b/branch.c
@@ -4,6 +4,7 @@
 #include "refs.h"
 #include "remote.h"
 #include "commit.h"
+#include "worktree.h"
 
 struct tracking {
 	struct refspec spec;
@@ -48,7 +49,13 @@
 	return 0;
 }
 
-void install_branch_config(int flag, const char *local, const char *origin, const char *remote)
+static const char tracking_advice[] =
+N_("\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\".");
+
+int install_branch_config(int flag, const char *local, const char *origin, const char *remote)
 {
 	const char *shortname = NULL;
 	struct strbuf key = STRBUF_INIT;
@@ -59,20 +66,23 @@
 	    && !origin) {
 		warning(_("Not setting branch %s as its own upstream."),
 			local);
-		return;
+		return 0;
 	}
 
 	strbuf_addf(&key, "branch.%s.remote", local);
-	git_config_set(key.buf, origin ? origin : ".");
+	if (git_config_set_gently(key.buf, origin ? origin : ".") < 0)
+		goto out_err;
 
 	strbuf_reset(&key);
 	strbuf_addf(&key, "branch.%s.merge", local);
-	git_config_set(key.buf, remote);
+	if (git_config_set_gently(key.buf, remote) < 0)
+		goto out_err;
 
 	if (rebasing) {
 		strbuf_reset(&key);
 		strbuf_addf(&key, "branch.%s.rebase", local);
-		git_config_set(key.buf, "true");
+		if (git_config_set_gently(key.buf, "true") < 0)
+			goto out_err;
 	}
 	strbuf_release(&key);
 
@@ -101,6 +111,19 @@
 					  local, remote);
 		}
 	}
+
+	return 0;
+
+out_err:
+	strbuf_release(&key);
+	error(_("Unable to write upstream branch configuration"));
+
+	advise(_(tracking_advice),
+	       origin ? origin : "",
+	       origin ? "/" : "",
+	       shortname ? shortname : remote);
+
+	return -1;
 }
 
 /*
@@ -108,8 +131,8 @@
  * to infer the settings for branch.<new_ref>.{remote,merge} from the
  * config.
  */
-static int setup_tracking(const char *new_ref, const char *orig_ref,
-			  enum branch_track track, int quiet)
+static void setup_tracking(const char *new_ref, const char *orig_ref,
+			   enum branch_track track, int quiet)
 {
 	struct tracking tracking;
 	int config_flags = quiet ? 0 : BRANCH_CONFIG_VERBOSE;
@@ -117,7 +140,7 @@
 	memset(&tracking, 0, sizeof(tracking));
 	tracking.spec.dst = (char *)orig_ref;
 	if (for_each_remote(find_tracked_branch, &tracking))
-		return 1;
+		return;
 
 	if (!tracking.matches)
 		switch (track) {
@@ -126,18 +149,18 @@
 		case BRANCH_TRACK_OVERRIDE:
 			break;
 		default:
-			return 1;
+			return;
 		}
 
 	if (tracking.matches > 1)
-		return error(_("Not tracking: ambiguous information for ref %s"),
-				orig_ref);
+		die(_("Not tracking: ambiguous information for ref %s"),
+		    orig_ref);
 
-	install_branch_config(config_flags, new_ref, tracking.remote,
-			      tracking.src ? tracking.src : orig_ref);
+	if (install_branch_config(config_flags, new_ref, tracking.remote,
+			      tracking.src ? tracking.src : orig_ref) < 0)
+		exit(-1);
 
 	free(tracking.src);
-	return 0;
 }
 
 int read_branch_desc(struct strbuf *buf, const char *branch_name)
@@ -266,7 +289,7 @@
 
 	if ((commit = lookup_commit_reference(sha1)) == NULL)
 		die(_("Not a valid branch point: '%s'."), start_name);
-	hashcpy(sha1, commit->object.sha1);
+	hashcpy(sha1, commit->object.oid.hash);
 
 	if (forcing)
 		snprintf(msg, sizeof msg, "branch: Reset to %s",
@@ -311,84 +334,6 @@
 	unlink(git_path_squash_msg());
 }
 
-static char *find_linked_symref(const char *symref, const char *branch,
-				const char *id)
-{
-	struct strbuf sb = STRBUF_INIT;
-	struct strbuf path = STRBUF_INIT;
-	struct strbuf gitdir = STRBUF_INIT;
-	char *existing = NULL;
-
-	/*
-	 * $GIT_COMMON_DIR/$symref (e.g. HEAD) is practically outside
-	 * $GIT_DIR so resolve_ref_unsafe() won't work (it uses
-	 * git_path). Parse the ref ourselves.
-	 */
-	if (id)
-		strbuf_addf(&path, "%s/worktrees/%s/%s", get_git_common_dir(), id, symref);
-	else
-		strbuf_addf(&path, "%s/%s", get_git_common_dir(), symref);
-
-	if (!strbuf_readlink(&sb, path.buf, 0)) {
-		if (!starts_with(sb.buf, "refs/") ||
-		    check_refname_format(sb.buf, 0))
-			goto done;
-	} else if (strbuf_read_file(&sb, path.buf, 0) >= 0 &&
-	    starts_with(sb.buf, "ref:")) {
-		strbuf_remove(&sb, 0, strlen("ref:"));
-		strbuf_trim(&sb);
-	} else
-		goto done;
-	if (strcmp(sb.buf, branch))
-		goto done;
-	if (id) {
-		strbuf_reset(&path);
-		strbuf_addf(&path, "%s/worktrees/%s/gitdir", get_git_common_dir(), id);
-		if (strbuf_read_file(&gitdir, path.buf, 0) <= 0)
-			goto done;
-		strbuf_rtrim(&gitdir);
-	} else
-		strbuf_addstr(&gitdir, get_git_common_dir());
-	strbuf_strip_suffix(&gitdir, ".git");
-
-	existing = strbuf_detach(&gitdir, NULL);
-done:
-	strbuf_release(&path);
-	strbuf_release(&sb);
-	strbuf_release(&gitdir);
-
-	return existing;
-}
-
-char *find_shared_symref(const char *symref, const char *target)
-{
-	struct strbuf path = STRBUF_INIT;
-	DIR *dir;
-	struct dirent *d;
-	char *existing;
-
-	if ((existing = find_linked_symref(symref, target, NULL)))
-		return existing;
-
-	strbuf_addf(&path, "%s/worktrees", get_git_common_dir());
-	dir = opendir(path.buf);
-	strbuf_release(&path);
-	if (!dir)
-		return NULL;
-
-	while ((d = readdir(dir)) != NULL) {
-		if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
-			continue;
-		existing = find_linked_symref(symref, target, d->d_name);
-		if (existing)
-			goto done;
-	}
-done:
-	closedir(dir);
-
-	return existing;
-}
-
 void die_if_checked_out(const char *branch)
 {
 	char *existing;
diff --git a/branch.h b/branch.h
index d3446ed..78ad438 100644
--- a/branch.h
+++ b/branch.h
@@ -43,9 +43,10 @@
 /*
  * Configure local branch "local" as downstream to branch "remote"
  * from remote "origin".  Used by git branch --set-upstream.
+ * Returns 0 on success.
  */
 #define BRANCH_CONFIG_VERBOSE 01
-extern void install_branch_config(int flag, const char *local, const char *origin, const char *remote);
+extern int install_branch_config(int flag, const char *local, const char *origin, const char *remote);
 
 /*
  * Read branch description
@@ -59,12 +60,4 @@
  */
 extern void die_if_checked_out(const char *branch);
 
-/*
- * Check if a per-worktree symref points to a ref in the main worktree
- * or any linked worktree, and return the path to the exising worktree
- * if it is.  Returns NULL if there is no existing ref.  The caller is
- * responsible for freeing the returned path.
- */
-extern char *find_shared_symref(const char *symref, const char *target);
-
 #endif
diff --git a/builtin.h b/builtin.h
index 79aaf0a..6b95006 100644
--- a/builtin.h
+++ b/builtin.h
@@ -120,6 +120,7 @@
 extern int cmd_show_branch(int argc, const char **argv, const char *prefix);
 extern int cmd_status(int argc, const char **argv, const char *prefix);
 extern int cmd_stripspace(int argc, const char **argv, const char *prefix);
+extern int cmd_submodule__helper(int argc, const char **argv, const char *prefix);
 extern int cmd_symbolic_ref(int argc, const char **argv, const char *prefix);
 extern int cmd_tag(int argc, const char **argv, const char *prefix);
 extern int cmd_tar_tree(int argc, const char **argv, const char *prefix);
diff --git a/builtin/am.c b/builtin/am.c
index 4e396c8..5668e0c 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -27,6 +27,7 @@
 #include "notes-utils.h"
 #include "rerere.h"
 #include "prompt.h"
+#include "mailinfo.h"
 
 /**
  * Returns 1 if the file is empty or does not exist, 0 otherwise.
@@ -1258,58 +1259,61 @@
 static int parse_mail(struct am_state *state, const char *mail)
 {
 	FILE *fp;
-	struct child_process cp = CHILD_PROCESS_INIT;
 	struct strbuf sb = STRBUF_INIT;
 	struct strbuf msg = STRBUF_INIT;
 	struct strbuf author_name = STRBUF_INIT;
 	struct strbuf author_date = STRBUF_INIT;
 	struct strbuf author_email = STRBUF_INIT;
 	int ret = 0;
+	struct mailinfo mi;
 
-	cp.git_cmd = 1;
-	cp.in = xopen(mail, O_RDONLY, 0);
-	cp.out = xopen(am_path(state, "info"), O_WRONLY | O_CREAT, 0777);
+	setup_mailinfo(&mi);
 
-	argv_array_push(&cp.args, "mailinfo");
-	argv_array_push(&cp.args, state->utf8 ? "-u" : "-n");
+	if (state->utf8)
+		mi.metainfo_charset = get_commit_output_encoding();
+	else
+		mi.metainfo_charset = NULL;
 
 	switch (state->keep) {
 	case KEEP_FALSE:
 		break;
 	case KEEP_TRUE:
-		argv_array_push(&cp.args, "-k");
+		mi.keep_subject = 1;
 		break;
 	case KEEP_NON_PATCH:
-		argv_array_push(&cp.args, "-b");
+		mi.keep_non_patch_brackets_in_subject = 1;
 		break;
 	default:
 		die("BUG: invalid value for state->keep");
 	}
 
 	if (state->message_id)
-		argv_array_push(&cp.args, "-m");
+		mi.add_message_id = 1;
 
 	switch (state->scissors) {
 	case SCISSORS_UNSET:
 		break;
 	case SCISSORS_FALSE:
-		argv_array_push(&cp.args, "--no-scissors");
+		mi.use_scissors = 0;
 		break;
 	case SCISSORS_TRUE:
-		argv_array_push(&cp.args, "--scissors");
+		mi.use_scissors = 1;
 		break;
 	default:
 		die("BUG: invalid value for state->scissors");
 	}
 
-	argv_array_push(&cp.args, am_path(state, "msg"));
-	argv_array_push(&cp.args, am_path(state, "patch"));
-
-	if (run_command(&cp) < 0)
+	mi.input = fopen(mail, "r");
+	if (!mi.input)
+		die("could not open input");
+	mi.output = fopen(am_path(state, "info"), "w");
+	if (!mi.output)
+		die("could not open output 'info'");
+	if (mailinfo(&mi, am_path(state, "msg"), am_path(state, "patch")))
 		die("could not parse patch");
 
-	close(cp.in);
-	close(cp.out);
+	fclose(mi.input);
+	fclose(mi.output);
 
 	/* Extract message and author information */
 	fp = xfopen(am_path(state, "info"), "r");
@@ -1341,8 +1345,7 @@
 	}
 
 	strbuf_addstr(&msg, "\n\n");
-	if (strbuf_read_file(&msg, am_path(state, "msg"), 0) < 0)
-		die_errno(_("could not read '%s'"), am_path(state, "msg"));
+	strbuf_addbuf(&msg, &mi.log_message);
 	strbuf_stripspace(&msg, 0);
 
 	if (state->signoff)
@@ -1366,6 +1369,7 @@
 	strbuf_release(&author_email);
 	strbuf_release(&author_name);
 	strbuf_release(&sb);
+	clear_mailinfo(&mi);
 	return ret;
 }
 
@@ -1437,7 +1441,7 @@
 	assert(!state->msg);
 	msg = strstr(buffer, "\n\n");
 	if (!msg)
-		die(_("unable to parse commit %s"), sha1_to_hex(commit->object.sha1));
+		die(_("unable to parse commit %s"), oid_to_hex(&commit->object.oid));
 	state->msg = xstrdup(msg + 2);
 	state->msg_len = strlen(state->msg);
 }
@@ -1653,7 +1657,7 @@
 
 		init_revisions(&rev_info, NULL);
 		rev_info.diffopt.output_format = DIFF_FORMAT_NAME_STATUS;
-		diff_opt_parse(&rev_info.diffopt, &diff_filter_str, 1);
+		diff_opt_parse(&rev_info.diffopt, &diff_filter_str, 1, rev_info.prefix);
 		add_pending_sha1(&rev_info, "HEAD", our_tree, 0);
 		diff_setup_done(&rev_info.diffopt);
 		run_diff_index(&rev_info, 1);
@@ -1817,7 +1821,7 @@
 
 			if (!pager)
 				pager = "cat";
-			argv_array_push(&cp.args, pager);
+			prepare_pager_args(&cp, pager);
 			argv_array_push(&cp.args, am_path(state, "patch"));
 			run_command(&cp);
 		}
@@ -1935,6 +1939,7 @@
 	 */
 	if (!state->rebasing) {
 		am_destroy(state);
+		close_all_packs();
 		run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
 	}
 }
diff --git a/builtin/apply.c b/builtin/apply.c
index 4aa53f7..0db6d14 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -77,8 +77,7 @@
 
 
 static const char *patch_input_file;
-static const char *root;
-static int root_len;
+static struct strbuf root = STRBUF_INIT;
 static int read_stdin = 1;
 static int options;
 
@@ -494,8 +493,8 @@
 	}
 
 	strbuf_remove(&name, 0, cp - name.buf);
-	if (root)
-		strbuf_insert(&name, 0, root, root_len);
+	if (root.len)
+		strbuf_insert(&name, 0, root.buf, root.len);
 	return squash_slash(strbuf_detach(&name, NULL));
 }
 
@@ -697,11 +696,8 @@
 			return squash_slash(xstrdup(def));
 	}
 
-	if (root) {
-		char *ret = xmalloc(root_len + len + 1);
-		strcpy(ret, root);
-		memcpy(ret + root_len, start, len);
-		ret[root_len + len] = '\0';
+	if (root.len) {
+		char *ret = xstrfmt("%s%.*s", root.buf, len, start);
 		return squash_slash(ret);
 	}
 
@@ -1277,8 +1273,8 @@
 	 * the default name from the header.
 	 */
 	patch->def_name = git_header_name(line, len);
-	if (patch->def_name && root) {
-		char *s = xstrfmt("%s%s", root, patch->def_name);
+	if (patch->def_name && root.len) {
+		char *s = xstrfmt("%s%s", root.buf, patch->def_name);
 		free(patch->def_name);
 		patch->def_name = s;
 	}
@@ -2636,7 +2632,7 @@
 	insert_count = postimage->len;
 
 	/* Adjust the contents */
-	result = xmalloc(img->len + insert_count - remove_count + 1);
+	result = xmalloc(st_add3(st_sub(img->len, remove_count), insert_count, 1));
 	memcpy(result, img->buf, applied_at);
 	memcpy(result + applied_at, postimage->buf, postimage->len);
 	memcpy(result + applied_at + postimage->len,
@@ -4501,14 +4497,9 @@
 static int option_parse_directory(const struct option *opt,
 				  const char *arg, int unset)
 {
-	root_len = strlen(arg);
-	if (root_len && arg[root_len - 1] != '/') {
-		char *new_root;
-		root = new_root = xmalloc(root_len + 2);
-		strcpy(new_root, arg);
-		strcpy(new_root + root_len++, "/");
-	} else
-		root = arg;
+	strbuf_reset(&root);
+	strbuf_addstr(&root, arg);
+	strbuf_complete(&root, '/');
 	return 0;
 }
 
diff --git a/builtin/blame.c b/builtin/blame.c
index 6cac59c..0b4f0bb 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -459,12 +459,11 @@
 static struct origin *make_origin(struct commit *commit, const char *path)
 {
 	struct origin *o;
-	o = xcalloc(1, sizeof(*o) + strlen(path) + 1);
+	FLEX_ALLOC_STR(o, path, path);
 	o->commit = commit;
 	o->refcnt = 1;
 	o->next = commit->util;
 	commit->util = o;
-	strcpy(o->path, path);
 	return o;
 }
 
@@ -505,7 +504,7 @@
 {
 	if (!is_null_sha1(origin->blob_sha1))
 		return 0;
-	if (get_tree_entry(origin->commit->object.sha1,
+	if (get_tree_entry(origin->commit->object.oid.hash,
 			   origin->path,
 			   origin->blob_sha1, &origin->mode))
 		goto error_out;
@@ -556,11 +555,11 @@
 		       PATHSPEC_LITERAL_PATH, "", paths);
 	diff_setup_done(&diff_opts);
 
-	if (is_null_sha1(origin->commit->object.sha1))
-		do_diff_cache(parent->tree->object.sha1, &diff_opts);
+	if (is_null_oid(&origin->commit->object.oid))
+		do_diff_cache(parent->tree->object.oid.hash, &diff_opts);
 	else
-		diff_tree_sha1(parent->tree->object.sha1,
-			       origin->commit->tree->object.sha1,
+		diff_tree_sha1(parent->tree->object.oid.hash,
+			       origin->commit->tree->object.oid.hash,
 			       "", &diff_opts);
 	diffcore_std(&diff_opts);
 
@@ -626,11 +625,11 @@
 	diff_opts.single_follow = origin->path;
 	diff_setup_done(&diff_opts);
 
-	if (is_null_sha1(origin->commit->object.sha1))
-		do_diff_cache(parent->tree->object.sha1, &diff_opts);
+	if (is_null_oid(&origin->commit->object.oid))
+		do_diff_cache(parent->tree->object.oid.hash, &diff_opts);
 	else
-		diff_tree_sha1(parent->tree->object.sha1,
-			       origin->commit->tree->object.sha1,
+		diff_tree_sha1(parent->tree->object.oid.hash,
+			       origin->commit->tree->object.oid.hash,
 			       "", &diff_opts);
 	diffcore_std(&diff_opts);
 
@@ -976,8 +975,8 @@
 
 	if (diff_hunks(&file_p, &file_o, 0, blame_chunk_cb, &d))
 		die("unable to generate diff (%s -> %s)",
-		    sha1_to_hex(parent->commit->object.sha1),
-		    sha1_to_hex(target->commit->object.sha1));
+		    oid_to_hex(&parent->commit->object.oid),
+		    oid_to_hex(&target->commit->object.oid));
 	/* The rest are the same as the parent */
 	blame_chunk(&d.dstq, &d.srcq, INT_MAX, d.offset, INT_MAX, parent);
 	*d.dstq = NULL;
@@ -1125,7 +1124,7 @@
 	memset(split, 0, sizeof(struct blame_entry [3]));
 	if (diff_hunks(file_p, &file_o, 1, handle_split_cb, &d))
 		die("unable to generate diff (%s)",
-		    sha1_to_hex(parent->commit->object.sha1));
+		    oid_to_hex(&parent->commit->object.oid));
 	/* remainder, if any, all match the preimage */
 	handle_split(sb, ent, d.tlno, d.plno, ent->num_lines, parent, split);
 }
@@ -1274,11 +1273,11 @@
 		&& (!porigin || strcmp(target->path, porigin->path))))
 		DIFF_OPT_SET(&diff_opts, FIND_COPIES_HARDER);
 
-	if (is_null_sha1(target->commit->object.sha1))
-		do_diff_cache(parent->tree->object.sha1, &diff_opts);
+	if (is_null_oid(&target->commit->object.oid))
+		do_diff_cache(parent->tree->object.oid.hash, &diff_opts);
 	else
-		diff_tree_sha1(parent->tree->object.sha1,
-			       target->commit->tree->object.sha1,
+		diff_tree_sha1(parent->tree->object.oid.hash,
+			       target->commit->tree->object.oid.hash,
 			       "", &diff_opts);
 
 	if (!DIFF_OPT_TST(&diff_opts, FIND_COPIES_HARDER))
@@ -1689,7 +1688,7 @@
 	if (len)
 		strbuf_add(&ret->summary, subject, len);
 	else
-		strbuf_addf(&ret->summary, "(%s)", sha1_to_hex(commit->object.sha1));
+		strbuf_addf(&ret->summary, "(%s)", oid_to_hex(&commit->object.oid));
 
 	unuse_commit_buffer(commit, message);
 }
@@ -1732,7 +1731,7 @@
 		printf("boundary\n");
 	if (suspect->previous) {
 		struct origin *prev = suspect->previous;
-		printf("previous %s ", sha1_to_hex(prev->commit->object.sha1));
+		printf("previous %s ", oid_to_hex(&prev->commit->object.oid));
 		write_name_quoted(prev->path, stdout, '\n');
 	}
 
@@ -1751,7 +1750,7 @@
 		struct origin *suspect = ent->suspect;
 
 		printf("%s %d %d %d\n",
-		       sha1_to_hex(suspect->commit->object.sha1),
+		       oid_to_hex(&suspect->commit->object.oid),
 		       ent->s_lno + 1, ent->lno + 1, ent->num_lines);
 		emit_one_suspect_detail(suspect, 0);
 		write_filename_info(suspect->path);
@@ -1879,9 +1878,9 @@
 	int cnt;
 	const char *cp;
 	struct origin *suspect = ent->suspect;
-	char hex[41];
+	char hex[GIT_SHA1_HEXSZ + 1];
 
-	strcpy(hex, sha1_to_hex(suspect->commit->object.sha1));
+	sha1_to_hex_r(hex, suspect->commit->object.oid.hash);
 	printf("%s %d %d %d\n",
 	       hex,
 	       ent->s_lno + 1,
@@ -1917,11 +1916,11 @@
 	const char *cp;
 	struct origin *suspect = ent->suspect;
 	struct commit_info ci;
-	char hex[41];
+	char hex[GIT_SHA1_HEXSZ + 1];
 	int show_raw_time = !!(opt & OUTPUT_RAW_TIMESTAMP);
 
 	get_commit_info(suspect->commit, &ci, 1);
-	strcpy(hex, sha1_to_hex(suspect->commit->object.sha1));
+	sha1_to_hex_r(hex, suspect->commit->object.oid.hash);
 
 	cp = nth_line(sb, ent->lno);
 	for (cnt = 0; cnt < ent->num_lines; cnt++) {
@@ -2041,7 +2040,8 @@
 	for (p = buf; p < end; p = get_next_line(p, end))
 		num++;
 
-	sb->lineno = lineno = xmalloc(sizeof(*sb->lineno) * (num + 1));
+	ALLOC_ARRAY(sb->lineno, num + 1);
+	lineno = sb->lineno;
 
 	for (p = buf; p < end; p = get_next_line(p, end))
 		*lineno++ = p - buf;
@@ -2076,7 +2076,7 @@
 
 static int update_auto_abbrev(int auto_abbrev, struct origin *suspect)
 {
-	const char *uniq = find_unique_abbrev(suspect->commit->object.sha1,
+	const char *uniq = find_unique_abbrev(suspect->commit->object.oid.hash,
 					      auto_abbrev);
 	int len = strlen(uniq);
 	if (auto_abbrev < len)
@@ -2152,7 +2152,7 @@
 		if (ent->suspect->refcnt <= 0) {
 			fprintf(stderr, "%s in %s has negative refcnt %d\n",
 				ent->suspect->path,
-				sha1_to_hex(ent->suspect->commit->object.sha1),
+				oid_to_hex(&ent->suspect->commit->object.oid),
 				ent->suspect->refcnt);
 			baa = 1;
 		}
@@ -2215,7 +2215,7 @@
 	struct commit_list *parents;
 
 	for (parents = work_tree->parents; parents; parents = parents->next) {
-		const unsigned char *commit_sha1 = parents->item->object.sha1;
+		const unsigned char *commit_sha1 = parents->item->object.oid.hash;
 		unsigned char blob_sha1[20];
 		unsigned mode;
 
@@ -2309,7 +2309,7 @@
 	strbuf_addstr(&msg, "tree 0000000000000000000000000000000000000000\n");
 	for (parent = commit->parents; parent; parent = parent->next)
 		strbuf_addf(&msg, "parent %s\n",
-			    sha1_to_hex(parent->item->object.sha1));
+			    oid_to_hex(&parent->item->object.oid));
 	strbuf_addf(&msg,
 		    "author %s\n"
 		    "committer %s\n\n"
@@ -2391,26 +2391,18 @@
 	ce->ce_mode = create_ce_mode(mode);
 	add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);
 
-	/*
-	 * We are not going to write this out, so this does not matter
-	 * right now, but someday we might optimize diff-index --cached
-	 * with cache-tree information.
-	 */
 	cache_tree_invalidate_path(&the_index, path);
 
 	return commit;
 }
 
-static char *prepare_final(struct scoreboard *sb)
+static struct commit *find_single_final(struct rev_info *revs,
+					const char **name_p)
 {
 	int i;
-	const char *final_commit_name = NULL;
-	struct rev_info *revs = sb->revs;
+	struct commit *found = NULL;
+	const char *name = NULL;
 
-	/*
-	 * There must be one and only one positive commit in the
-	 * revs->pending array.
-	 */
 	for (i = 0; i < revs->pending.nr; i++) {
 		struct object *obj = revs->pending.objects[i].item;
 		if (obj->flags & UNINTERESTING)
@@ -2419,14 +2411,22 @@
 			obj = deref_tag(obj, NULL, 0);
 		if (obj->type != OBJ_COMMIT)
 			die("Non commit %s?", revs->pending.objects[i].name);
-		if (sb->final)
+		if (found)
 			die("More than one commit to dig from %s and %s?",
-			    revs->pending.objects[i].name,
-			    final_commit_name);
-		sb->final = (struct commit *) obj;
-		final_commit_name = revs->pending.objects[i].name;
+			    revs->pending.objects[i].name, name);
+		found = (struct commit *)obj;
+		name = revs->pending.objects[i].name;
 	}
-	return xstrdup_or_null(final_commit_name);
+	if (name_p)
+		*name_p = name;
+	return found;
+}
+
+static char *prepare_final(struct scoreboard *sb)
+{
+	const char *name;
+	sb->final = find_single_final(sb->revs, &name);
+	return xstrdup_or_null(name);
 }
 
 static char *prepare_initial(struct scoreboard *sb)
@@ -2502,6 +2502,7 @@
 	long dashdash_pos, lno;
 	char *final_commit_name = NULL;
 	enum object_type type;
+	struct commit *final_commit = NULL;
 
 	static struct string_list range_list;
 	static int output_option = 0, opt = 0;
@@ -2612,7 +2613,6 @@
 		   fewer display columns. */
 		blame_date_width = utf8_strwidth(_("4 years, 11 months ago")) + 1; /* add the null */
 		break;
-	case DATE_LOCAL:
 	case DATE_NORMAL:
 		blame_date_width = sizeof("Thu Oct 19 16:00:04 2006 -0700");
 		break;
@@ -2692,11 +2692,11 @@
 	}
 	else if (contents_from)
 		die("--contents and --reverse do not blend well.");
-	else if (revs.first_parent_only)
-		die("combining --first-parent and --reverse is not supported");
 	else {
 		final_commit_name = prepare_initial(&sb);
 		sb.commits.compare = compare_commits_by_reverse_commit_date;
+		if (revs.first_parent_only)
+			revs.children.name = NULL;
 	}
 
 	if (!sb.final) {
@@ -2713,6 +2713,12 @@
 	else if (contents_from)
 		die("Cannot use --contents with final commit object name");
 
+	if (reverse && revs.first_parent_only) {
+		final_commit = find_single_final(sb.revs, NULL);
+		if (!final_commit)
+			die("--reverse and --first-parent together require specified latest commit");
+	}
+
 	/*
 	 * If we have bottom, this will mark the ancestors of the
 	 * bottom commits we would reach while traversing as
@@ -2721,7 +2727,26 @@
 	if (prepare_revision_walk(&revs))
 		die(_("revision walk setup failed"));
 
-	if (is_null_sha1(sb.final->object.sha1)) {
+	if (reverse && revs.first_parent_only) {
+		struct commit *c = final_commit;
+
+		sb.revs->children.name = "children";
+		while (c->parents &&
+		       oidcmp(&c->object.oid, &sb.final->object.oid)) {
+			struct commit_list *l = xcalloc(1, sizeof(*l));
+
+			l->item = c;
+			if (add_decoration(&sb.revs->children,
+					   &c->parents->item->object, l))
+				die("BUG: not unique item in first-parent chain");
+			c = c->parents->item;
+		}
+
+		if (oidcmp(&c->object.oid, &sb.final->object.oid))
+			die("--reverse --first-parent together require range along first-parent chain");
+	}
+
+	if (is_null_oid(&sb.final->object.oid)) {
 		o = sb.final->util;
 		sb.final_buf = xmemdupz(o->file.ptr, o->file.size);
 		sb.final_buf_size = o->file.size;
diff --git a/builtin/branch.c b/builtin/branch.c
index baaa44c..7b45b6b 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -19,18 +19,17 @@
 #include "column.h"
 #include "utf8.h"
 #include "wt-status.h"
+#include "ref-filter.h"
 
 static const char * const builtin_branch_usage[] = {
 	N_("git branch [<options>] [-r | -a] [--merged | --no-merged]"),
 	N_("git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"),
 	N_("git branch [<options>] [-r] (-d | -D) <branch-name>..."),
 	N_("git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"),
+	N_("git branch [<options>] [-r | -a] [--points-at]"),
 	NULL
 };
 
-#define REF_LOCAL_BRANCH    0x01
-#define REF_REMOTE_BRANCH   0x02
-
 static const char *head;
 static unsigned char head_sha1[20];
 
@@ -52,13 +51,6 @@
 	BRANCH_COLOR_UPSTREAM = 5
 };
 
-static enum merge_filter {
-	NO_FILTER = 0,
-	SHOW_NOT_MERGED,
-	SHOW_MERGED
-} merge_filter;
-static unsigned char merge_filter_ref[20];
-
 static struct string_list output = STRING_LIST_INIT_DUP;
 static unsigned int colopts;
 
@@ -121,7 +113,7 @@
 	void *reference_name_to_free = NULL;
 	int merged;
 
-	if (kind == REF_LOCAL_BRANCH) {
+	if (kind == FILTER_REFS_BRANCHES) {
 		struct branch *branch = branch_get(name);
 		const char *upstream = branch_get_upstream(branch, NULL);
 		unsigned char sha1[20];
@@ -199,14 +191,14 @@
 	struct strbuf bname = STRBUF_INIT;
 
 	switch (kinds) {
-	case REF_REMOTE_BRANCH:
+	case FILTER_REFS_REMOTES:
 		fmt = "refs/remotes/%s";
 		/* For subsequent UI messages */
 		remote_branch = 1;
 
 		force = 1;
 		break;
-	case REF_LOCAL_BRANCH:
+	case FILTER_REFS_BRANCHES:
 		fmt = "refs/heads/%s";
 		break;
 	default:
@@ -223,7 +215,7 @@
 		int flags = 0;
 
 		strbuf_branchname(&bname, argv[i]);
-		if (kinds == REF_LOCAL_BRANCH && !strcmp(head, bname.buf)) {
+		if (kinds == FILTER_REFS_BRANCHES && !strcmp(head, bname.buf)) {
 			error(_("Cannot delete the branch '%s' "
 			      "which you are currently on."), bname.buf);
 			ret = 1;
@@ -279,147 +271,6 @@
 	return(ret);
 }
 
-struct ref_item {
-	char *name;
-	char *dest;
-	unsigned int kind, width;
-	struct commit *commit;
-	int ignore;
-};
-
-struct ref_list {
-	struct rev_info revs;
-	int index, alloc, maxwidth, verbose, abbrev;
-	struct ref_item *list;
-	struct commit_list *with_commit;
-	int kinds;
-};
-
-static char *resolve_symref(const char *src, const char *prefix)
-{
-	unsigned char sha1[20];
-	int flag;
-	const char *dst;
-
-	dst = resolve_ref_unsafe(src, 0, sha1, &flag);
-	if (!(dst && (flag & REF_ISSYMREF)))
-		return NULL;
-	if (prefix)
-		skip_prefix(dst, prefix, &dst);
-	return xstrdup(dst);
-}
-
-struct append_ref_cb {
-	struct ref_list *ref_list;
-	const char **pattern;
-	int ret;
-};
-
-static int match_patterns(const char **pattern, const char *refname)
-{
-	if (!*pattern)
-		return 1; /* no pattern always matches */
-	while (*pattern) {
-		if (!wildmatch(*pattern, refname, 0, NULL))
-			return 1;
-		pattern++;
-	}
-	return 0;
-}
-
-static int append_ref(const char *refname, const struct object_id *oid, int flags, void *cb_data)
-{
-	struct append_ref_cb *cb = (struct append_ref_cb *)(cb_data);
-	struct ref_list *ref_list = cb->ref_list;
-	struct ref_item *newitem;
-	struct commit *commit;
-	int kind, i;
-	const char *prefix, *orig_refname = refname;
-
-	static struct {
-		int kind;
-		const char *prefix;
-	} ref_kind[] = {
-		{ REF_LOCAL_BRANCH, "refs/heads/" },
-		{ REF_REMOTE_BRANCH, "refs/remotes/" },
-	};
-
-	/* Detect kind */
-	for (i = 0; i < ARRAY_SIZE(ref_kind); i++) {
-		prefix = ref_kind[i].prefix;
-		if (skip_prefix(refname, prefix, &refname)) {
-			kind = ref_kind[i].kind;
-			break;
-		}
-	}
-	if (ARRAY_SIZE(ref_kind) <= i)
-		return 0;
-
-	/* Don't add types the caller doesn't want */
-	if ((kind & ref_list->kinds) == 0)
-		return 0;
-
-	if (!match_patterns(cb->pattern, refname))
-		return 0;
-
-	commit = NULL;
-	if (ref_list->verbose || ref_list->with_commit || merge_filter != NO_FILTER) {
-		commit = lookup_commit_reference_gently(oid->hash, 1);
-		if (!commit) {
-			cb->ret = error(_("branch '%s' does not point at a commit"), refname);
-			return 0;
-		}
-
-		/* Filter with with_commit if specified */
-		if (!is_descendant_of(commit, ref_list->with_commit))
-			return 0;
-
-		if (merge_filter != NO_FILTER)
-			add_pending_object(&ref_list->revs,
-					   (struct object *)commit, refname);
-	}
-
-	ALLOC_GROW(ref_list->list, ref_list->index + 1, ref_list->alloc);
-
-	/* Record the new item */
-	newitem = &(ref_list->list[ref_list->index++]);
-	newitem->name = xstrdup(refname);
-	newitem->kind = kind;
-	newitem->commit = commit;
-	newitem->width = utf8_strwidth(refname);
-	newitem->dest = resolve_symref(orig_refname, prefix);
-	newitem->ignore = 0;
-	/* adjust for "remotes/" */
-	if (newitem->kind == REF_REMOTE_BRANCH &&
-	    ref_list->kinds != REF_REMOTE_BRANCH)
-		newitem->width += 8;
-	if (newitem->width > ref_list->maxwidth)
-		ref_list->maxwidth = newitem->width;
-
-	return 0;
-}
-
-static void free_ref_list(struct ref_list *ref_list)
-{
-	int i;
-
-	for (i = 0; i < ref_list->index; i++) {
-		free(ref_list->list[i].name);
-		free(ref_list->list[i].dest);
-	}
-	free(ref_list->list);
-}
-
-static int ref_cmp(const void *r1, const void *r2)
-{
-	struct ref_item *c1 = (struct ref_item *)(r1);
-	struct ref_item *c2 = (struct ref_item *)(r2);
-
-	if (c1->kind != c2->kind)
-		return c1->kind - c2->kind;
-	return strcmp(c1->name, c2->name);
-}
-
 static void fill_tracking_info(struct strbuf *stat, const char *branch_name,
 		int show_upstream_ref)
 {
@@ -482,8 +333,8 @@
 	free(ref);
 }
 
-static void add_verbose_info(struct strbuf *out, struct ref_item *item,
-			     int verbose, int abbrev)
+static void add_verbose_info(struct strbuf *out, struct ref_array_item *item,
+			     struct ref_filter *filter, const char *refname)
 {
 	struct strbuf subject = STRBUF_INIT, stat = STRBUF_INIT;
 	const char *sub = _(" **** invalid ref ****");
@@ -494,81 +345,16 @@
 		sub = subject.buf;
 	}
 
-	if (item->kind == REF_LOCAL_BRANCH)
-		fill_tracking_info(&stat, item->name, verbose > 1);
+	if (item->kind == FILTER_REFS_BRANCHES)
+		fill_tracking_info(&stat, refname, filter->verbose > 1);
 
 	strbuf_addf(out, " %s %s%s",
-		find_unique_abbrev(item->commit->object.sha1, abbrev),
+		find_unique_abbrev(item->commit->object.oid.hash, filter->abbrev),
 		stat.buf, sub);
 	strbuf_release(&stat);
 	strbuf_release(&subject);
 }
 
-static void print_ref_item(struct ref_item *item, int maxwidth, int verbose,
-			   int abbrev, int current, char *prefix)
-{
-	char c;
-	int color;
-	struct strbuf out = STRBUF_INIT, name = STRBUF_INIT;
-
-	if (item->ignore)
-		return;
-
-	switch (item->kind) {
-	case REF_LOCAL_BRANCH:
-		color = BRANCH_COLOR_LOCAL;
-		break;
-	case REF_REMOTE_BRANCH:
-		color = BRANCH_COLOR_REMOTE;
-		break;
-	default:
-		color = BRANCH_COLOR_PLAIN;
-		break;
-	}
-
-	c = ' ';
-	if (current) {
-		c = '*';
-		color = BRANCH_COLOR_CURRENT;
-	}
-
-	strbuf_addf(&name, "%s%s", prefix, item->name);
-	if (verbose) {
-		int utf8_compensation = strlen(name.buf) - utf8_strwidth(name.buf);
-		strbuf_addf(&out, "%c %s%-*s%s", c, branch_get_color(color),
-			    maxwidth + utf8_compensation, name.buf,
-			    branch_get_color(BRANCH_COLOR_RESET));
-	} else
-		strbuf_addf(&out, "%c %s%s%s", c, branch_get_color(color),
-			    name.buf, branch_get_color(BRANCH_COLOR_RESET));
-
-	if (item->dest)
-		strbuf_addf(&out, " -> %s", item->dest);
-	else if (verbose)
-		/* " f7c0c00 [ahead 58, behind 197] vcs-svn: drop obj_pool.h" */
-		add_verbose_info(&out, item, verbose, abbrev);
-	if (column_active(colopts)) {
-		assert(!verbose && "--column and --verbose are incompatible");
-		string_list_append(&output, out.buf);
-	} else {
-		printf("%s\n", out.buf);
-	}
-	strbuf_release(&name);
-	strbuf_release(&out);
-}
-
-static int calc_maxwidth(struct ref_list *refs)
-{
-	int i, w = 0;
-	for (i = 0; i < refs->index; i++) {
-		if (refs->list[i].ignore)
-			continue;
-		if (refs->list[i].width > w)
-			w = refs->list[i].width;
-	}
-	return w;
-}
-
 static char *get_head_description(void)
 {
 	struct strbuf desc = STRBUF_INIT;
@@ -600,97 +386,131 @@
 	return strbuf_detach(&desc, NULL);
 }
 
-static void show_detached(struct ref_list *ref_list)
+static void format_and_print_ref_item(struct ref_array_item *item, int maxwidth,
+				      struct ref_filter *filter, const char *remote_prefix)
 {
-	struct commit *head_commit = lookup_commit_reference_gently(head_sha1, 1);
+	char c;
+	int current = 0;
+	int color;
+	struct strbuf out = STRBUF_INIT, name = STRBUF_INIT;
+	const char *prefix = "";
+	const char *desc = item->refname;
+	char *to_free = NULL;
 
-	if (head_commit && is_descendant_of(head_commit, ref_list->with_commit)) {
-		struct ref_item item;
-		item.name = get_head_description();
-		item.width = utf8_strwidth(item.name);
-		item.kind = REF_LOCAL_BRANCH;
-		item.dest = NULL;
-		item.commit = head_commit;
-		item.ignore = 0;
-		if (item.width > ref_list->maxwidth)
-			ref_list->maxwidth = item.width;
-		print_ref_item(&item, ref_list->maxwidth, ref_list->verbose, ref_list->abbrev, 1, "");
-		free(item.name);
+	switch (item->kind) {
+	case FILTER_REFS_BRANCHES:
+		skip_prefix(desc, "refs/heads/", &desc);
+		if (!filter->detached && !strcmp(desc, head))
+			current = 1;
+		else
+			color = BRANCH_COLOR_LOCAL;
+		break;
+	case FILTER_REFS_REMOTES:
+		skip_prefix(desc, "refs/remotes/", &desc);
+		color = BRANCH_COLOR_REMOTE;
+		prefix = remote_prefix;
+		break;
+	case FILTER_REFS_DETACHED_HEAD:
+		desc = to_free = get_head_description();
+		current = 1;
+		break;
+	default:
+		color = BRANCH_COLOR_PLAIN;
+		break;
 	}
+
+	c = ' ';
+	if (current) {
+		c = '*';
+		color = BRANCH_COLOR_CURRENT;
+	}
+
+	strbuf_addf(&name, "%s%s", prefix, desc);
+	if (filter->verbose) {
+		int utf8_compensation = strlen(name.buf) - utf8_strwidth(name.buf);
+		strbuf_addf(&out, "%c %s%-*s%s", c, branch_get_color(color),
+			    maxwidth + utf8_compensation, name.buf,
+			    branch_get_color(BRANCH_COLOR_RESET));
+	} else
+		strbuf_addf(&out, "%c %s%s%s", c, branch_get_color(color),
+			    name.buf, branch_get_color(BRANCH_COLOR_RESET));
+
+	if (item->symref) {
+		skip_prefix(item->symref, "refs/remotes/", &desc);
+		strbuf_addf(&out, " -> %s", desc);
+	}
+	else if (filter->verbose)
+		/* " f7c0c00 [ahead 58, behind 197] vcs-svn: drop obj_pool.h" */
+		add_verbose_info(&out, item, filter, desc);
+	if (column_active(colopts)) {
+		assert(!filter->verbose && "--column and --verbose are incompatible");
+		string_list_append(&output, out.buf);
+	} else {
+		printf("%s\n", out.buf);
+	}
+	strbuf_release(&name);
+	strbuf_release(&out);
+	free(to_free);
 }
 
-static int print_ref_list(int kinds, int detached, int verbose, int abbrev, struct commit_list *with_commit, const char **pattern)
+static int calc_maxwidth(struct ref_array *refs, int remote_bonus)
+{
+	int i, max = 0;
+	for (i = 0; i < refs->nr; i++) {
+		struct ref_array_item *it = refs->items[i];
+		const char *desc = it->refname;
+		int w;
+
+		skip_prefix(it->refname, "refs/heads/", &desc);
+		skip_prefix(it->refname, "refs/remotes/", &desc);
+		w = utf8_strwidth(desc);
+
+		if (it->kind == FILTER_REFS_REMOTES)
+			w += remote_bonus;
+		if (w > max)
+			max = w;
+	}
+	return max;
+}
+
+static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sorting)
 {
 	int i;
-	struct append_ref_cb cb;
-	struct ref_list ref_list;
+	struct ref_array array;
+	int maxwidth = 0;
+	const char *remote_prefix = "";
 
-	memset(&ref_list, 0, sizeof(ref_list));
-	ref_list.kinds = kinds;
-	ref_list.verbose = verbose;
-	ref_list.abbrev = abbrev;
-	ref_list.with_commit = with_commit;
-	if (merge_filter != NO_FILTER)
-		init_revisions(&ref_list.revs, NULL);
-	cb.ref_list = &ref_list;
-	cb.pattern = pattern;
-	cb.ret = 0;
-	for_each_rawref(append_ref, &cb);
-	if (merge_filter != NO_FILTER) {
-		struct commit *filter;
-		filter = lookup_commit_reference_gently(merge_filter_ref, 0);
-		if (!filter)
-			die(_("object '%s' does not point to a commit"),
-			    sha1_to_hex(merge_filter_ref));
+	/*
+	 * If we are listing more than just remote branches,
+	 * then remote branches will have a "remotes/" prefix.
+	 * We need to account for this in the width.
+	 */
+	if (filter->kind != FILTER_REFS_REMOTES)
+		remote_prefix = "remotes/";
 
-		filter->object.flags |= UNINTERESTING;
-		add_pending_object(&ref_list.revs,
-				   (struct object *) filter, "");
-		ref_list.revs.limited = 1;
+	memset(&array, 0, sizeof(array));
 
-		if (prepare_revision_walk(&ref_list.revs))
-			die(_("revision walk setup failed"));
+	verify_ref_format("%(refname)%(symref)");
+	filter_refs(&array, filter, filter->kind | FILTER_REFS_INCLUDE_BROKEN);
 
-		for (i = 0; i < ref_list.index; i++) {
-			struct ref_item *item = &ref_list.list[i];
-			struct commit *commit = item->commit;
-			int is_merged = !!(commit->object.flags & UNINTERESTING);
-			item->ignore = is_merged != (merge_filter == SHOW_MERGED);
-		}
+	if (filter->verbose)
+		maxwidth = calc_maxwidth(&array, strlen(remote_prefix));
 
-		for (i = 0; i < ref_list.index; i++) {
-			struct ref_item *item = &ref_list.list[i];
-			clear_commit_marks(item->commit, ALL_REV_FLAGS);
-		}
-		clear_commit_marks(filter, ALL_REV_FLAGS);
+	/*
+	 * If no sorting parameter is given then we default to sorting
+	 * by 'refname'. This would give us an alphabetically sorted
+	 * array with the 'HEAD' ref at the beginning followed by
+	 * local branches 'refs/heads/...' and finally remote-tacking
+	 * branches 'refs/remotes/...'.
+	 */
+	if (!sorting)
+		sorting = ref_default_sorting();
+	ref_array_sort(sorting, &array);
 
-		if (verbose)
-			ref_list.maxwidth = calc_maxwidth(&ref_list);
-	}
+	for (i = 0; i < array.nr; i++)
+		format_and_print_ref_item(array.items[i], maxwidth, filter, remote_prefix);
 
-	qsort(ref_list.list, ref_list.index, sizeof(struct ref_item), ref_cmp);
-
-	detached = (detached && (kinds & REF_LOCAL_BRANCH));
-	if (detached && match_patterns(pattern, "HEAD"))
-		show_detached(&ref_list);
-
-	for (i = 0; i < ref_list.index; i++) {
-		int current = !detached &&
-			(ref_list.list[i].kind == REF_LOCAL_BRANCH) &&
-			!strcmp(ref_list.list[i].name, head);
-		char *prefix = (kinds != REF_REMOTE_BRANCH &&
-				ref_list.list[i].kind == REF_REMOTE_BRANCH)
-				? "remotes/" : "";
-		print_ref_item(&ref_list.list[i], ref_list.maxwidth, verbose,
-			       abbrev, current, prefix);
-	}
-
-	free_ref_list(&ref_list);
-
-	if (cb.ret)
-		error(_("some refs could not be read"));
-
-	return cb.ret;
+	ref_array_clear(&array);
 }
 
 static void rename_branch(const char *oldname, const char *newname, int force)
@@ -746,25 +566,10 @@
 	strbuf_release(&newsection);
 }
 
-static int opt_parse_merge_filter(const struct option *opt, const char *arg, int unset)
-{
-	merge_filter = ((opt->long_name[0] == 'n')
-			? SHOW_NOT_MERGED
-			: SHOW_MERGED);
-	if (unset)
-		merge_filter = SHOW_NOT_MERGED; /* b/c for --no-merged */
-	if (!arg)
-		arg = "HEAD";
-	if (get_sha1(arg, merge_filter_ref))
-		die(_("malformed object name %s"), arg);
-	return 0;
-}
-
 static const char edit_description[] = "BRANCH_DESCRIPTION";
 
 static int edit_branch_description(const char *branch_name)
 {
-	int status;
 	struct strbuf buf = STRBUF_INIT;
 	struct strbuf name = STRBUF_INIT;
 
@@ -789,27 +594,26 @@
 	strbuf_stripspace(&buf, 1);
 
 	strbuf_addf(&name, "branch.%s.description", branch_name);
-	status = git_config_set(name.buf, buf.len ? buf.buf : NULL);
+	git_config_set(name.buf, buf.len ? buf.buf : NULL);
 	strbuf_release(&name);
 	strbuf_release(&buf);
 
-	return status;
+	return 0;
 }
 
 int cmd_branch(int argc, const char **argv, const char *prefix)
 {
 	int delete = 0, rename = 0, force = 0, list = 0;
-	int verbose = 0, abbrev = -1, detached = 0;
 	int reflog = 0, edit_description = 0;
 	int quiet = 0, unset_upstream = 0;
 	const char *new_upstream = NULL;
 	enum branch_track track;
-	int kinds = REF_LOCAL_BRANCH;
-	struct commit_list *with_commit = NULL;
+	struct ref_filter filter;
+	static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
 
 	struct option options[] = {
 		OPT_GROUP(N_("Generic options")),
-		OPT__VERBOSE(&verbose,
+		OPT__VERBOSE(&filter.verbose,
 			N_("show hash and subject, give twice for upstream branch")),
 		OPT__QUIET(&quiet, N_("suppress informational messages")),
 		OPT_SET_INT('t', "track",  &track, N_("set up tracking mode (see git-pull(1))"),
@@ -819,25 +623,15 @@
 		OPT_STRING('u', "set-upstream-to", &new_upstream, "upstream", "change the upstream info"),
 		OPT_BOOL(0, "unset-upstream", &unset_upstream, "Unset the upstream info"),
 		OPT__COLOR(&branch_use_color, N_("use colored output")),
-		OPT_SET_INT('r', "remotes",     &kinds, N_("act on remote-tracking branches"),
-			REF_REMOTE_BRANCH),
-		{
-			OPTION_CALLBACK, 0, "contains", &with_commit, N_("commit"),
-			N_("print only branches that contain the commit"),
-			PARSE_OPT_LASTARG_DEFAULT,
-			parse_opt_with_commit, (intptr_t)"HEAD",
-		},
-		{
-			OPTION_CALLBACK, 0, "with", &with_commit, N_("commit"),
-			N_("print only branches that contain the commit"),
-			PARSE_OPT_HIDDEN | PARSE_OPT_LASTARG_DEFAULT,
-			parse_opt_with_commit, (intptr_t) "HEAD",
-		},
-		OPT__ABBREV(&abbrev),
+		OPT_SET_INT('r', "remotes",     &filter.kind, N_("act on remote-tracking branches"),
+			FILTER_REFS_REMOTES),
+		OPT_CONTAINS(&filter.with_commit, N_("print only branches that contain the commit")),
+		OPT_WITH(&filter.with_commit, N_("print only branches that contain the commit")),
+		OPT__ABBREV(&filter.abbrev),
 
 		OPT_GROUP(N_("Specific git-branch actions:")),
-		OPT_SET_INT('a', "all", &kinds, N_("list both remote-tracking and local branches"),
-			REF_REMOTE_BRANCH | REF_LOCAL_BRANCH),
+		OPT_SET_INT('a', "all", &filter.kind, N_("list both remote-tracking and local branches"),
+			FILTER_REFS_REMOTES | FILTER_REFS_BRANCHES),
 		OPT_BIT('d', "delete", &delete, N_("delete fully merged branch"), 1),
 		OPT_BIT('D', NULL, &delete, N_("delete branch (even if not merged)"), 2),
 		OPT_BIT('m', "move", &rename, N_("move/rename a branch and its reflog"), 1),
@@ -847,22 +641,22 @@
 		OPT_BOOL(0, "edit-description", &edit_description,
 			 N_("edit the description for the branch")),
 		OPT__FORCE(&force, N_("force creation, move/rename, deletion")),
-		{
-			OPTION_CALLBACK, 0, "no-merged", &merge_filter_ref,
-			N_("commit"), N_("print only not merged branches"),
-			PARSE_OPT_LASTARG_DEFAULT | PARSE_OPT_NONEG,
-			opt_parse_merge_filter, (intptr_t) "HEAD",
-		},
-		{
-			OPTION_CALLBACK, 0, "merged", &merge_filter_ref,
-			N_("commit"), N_("print only merged branches"),
-			PARSE_OPT_LASTARG_DEFAULT | PARSE_OPT_NONEG,
-			opt_parse_merge_filter, (intptr_t) "HEAD",
-		},
+		OPT_MERGED(&filter, N_("print only branches that are merged")),
+		OPT_NO_MERGED(&filter, N_("print only branches that are not merged")),
 		OPT_COLUMN(0, "column", &colopts, N_("list branches in columns")),
+		OPT_CALLBACK(0 , "sort", sorting_tail, N_("key"),
+			     N_("field name to sort on"), &parse_opt_ref_sorting),
+		{
+			OPTION_CALLBACK, 0, "points-at", &filter.points_at, N_("object"),
+			N_("print only branches of the object"), 0, parse_opt_object_name
+		},
 		OPT_END(),
 	};
 
+	memset(&filter, 0, sizeof(filter));
+	filter.kind = FILTER_REFS_BRANCHES;
+	filter.abbrev = -1;
+
 	if (argc == 2 && !strcmp(argv[1], "-h"))
 		usage_with_options(builtin_branch_usage, options);
 
@@ -874,11 +668,9 @@
 	if (!head)
 		die(_("Failed to resolve HEAD as a valid ref."));
 	if (!strcmp(head, "HEAD"))
-		detached = 1;
+		filter.detached = 1;
 	else if (!skip_prefix(head, "refs/heads/", &head))
 		die(_("HEAD not found below refs/heads!"));
-	hashcpy(merge_filter_ref, head_sha1);
-
 
 	argc = parse_options(argc, argv, prefix, options, builtin_branch_usage,
 			     0);
@@ -886,17 +678,17 @@
 	if (!delete && !rename && !edit_description && !new_upstream && !unset_upstream && argc == 0)
 		list = 1;
 
-	if (with_commit || merge_filter != NO_FILTER)
+	if (filter.with_commit || filter.merge != REF_FILTER_MERGED_NONE || filter.points_at.nr)
 		list = 1;
 
 	if (!!delete + !!rename + !!new_upstream +
 	    list + unset_upstream > 1)
 		usage_with_options(builtin_branch_usage, options);
 
-	if (abbrev == -1)
-		abbrev = DEFAULT_ABBREV;
+	if (filter.abbrev == -1)
+		filter.abbrev = DEFAULT_ABBREV;
 	finalize_colopts(&colopts, -1);
-	if (verbose) {
+	if (filter.verbose) {
 		if (explicitly_enable_column(colopts))
 			die(_("--column and --verbose are incompatible"));
 		colopts = 0;
@@ -910,20 +702,23 @@
 	if (delete) {
 		if (!argc)
 			die(_("branch name required"));
-		return delete_branches(argc, argv, delete > 1, kinds, quiet);
+		return delete_branches(argc, argv, delete > 1, filter.kind, quiet);
 	} else if (list) {
-		int ret = print_ref_list(kinds, detached, verbose, abbrev,
-					 with_commit, argv);
+		/*  git branch --local also shows HEAD when it is detached */
+		if ((filter.kind & FILTER_REFS_BRANCHES) && filter.detached)
+			filter.kind |= FILTER_REFS_DETACHED_HEAD;
+		filter.name_patterns = argv;
+		print_ref_list(&filter, sorting);
 		print_columns(&output, colopts, NULL);
 		string_list_clear(&output, 0);
-		return ret;
+		return 0;
 	}
 	else if (edit_description) {
 		const char *branch_name;
 		struct strbuf branch_ref = STRBUF_INIT;
 
 		if (!argc) {
-			if (detached)
+			if (filter.detached)
 				die(_("Cannot give description to detached HEAD"));
 			branch_name = head;
 		} else if (argc == 1)
@@ -1011,7 +806,7 @@
 		if (!branch)
 			die(_("no such branch '%s'"), argv[0]);
 
-		if (kinds != REF_LOCAL_BRANCH)
+		if (filter.kind != FILTER_REFS_BRANCHES)
 			die(_("-a and -r options to 'git branch' do not make sense with a branch name"));
 
 		if (track == BRANCH_TRACK_OVERRIDE)
diff --git a/builtin/check-ref-format.c b/builtin/check-ref-format.c
index fd915d5..eac4994 100644
--- a/builtin/check-ref-format.c
+++ b/builtin/check-ref-format.c
@@ -20,7 +20,7 @@
  */
 static char *collapse_slashes(const char *refname)
 {
-	char *ret = xmalloc(strlen(refname) + 1);
+	char *ret = xmallocz(strlen(refname));
 	char ch;
 	char prev = '/';
 	char *cp = ret;
diff --git a/builtin/checkout.c b/builtin/checkout.c
index bc703c0..d53ab75 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -37,6 +37,7 @@
 	int overwrite_ignore;
 	int ignore_skipworktree;
 	int ignore_other_worktrees;
+	int show_progress;
 
 	const char *new_branch;
 	const char *new_branch_force;
@@ -55,8 +56,8 @@
 			      int changed)
 {
 	return run_hook_le(NULL, "post-checkout",
-			   sha1_to_hex(old ? old->object.sha1 : null_sha1),
-			   sha1_to_hex(new ? new->object.sha1 : null_sha1),
+			   sha1_to_hex(old ? old->object.oid.hash : null_sha1),
+			   sha1_to_hex(new ? new->object.oid.hash : null_sha1),
 			   changed ? "1" : "0", NULL);
 	/* "new" can be NULL when checking out from the index before
 	   a commit exists. */
@@ -400,7 +401,7 @@
 	if (!parse_commit(commit))
 		pp_commit_easy(CMIT_FMT_ONELINE, commit, &sb);
 	fprintf(stderr, "%s %s... %s\n", msg,
-		find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV), sb.buf);
+		find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV), sb.buf);
 	strbuf_release(&sb);
 }
 
@@ -417,7 +418,7 @@
 	opts.reset = 1;
 	opts.merge = 1;
 	opts.fn = oneway_merge;
-	opts.verbose_update = !o->quiet && isatty(2);
+	opts.verbose_update = o->show_progress;
 	opts.src_index = &the_index;
 	opts.dst_index = &the_index;
 	parse_tree(tree);
@@ -501,7 +502,7 @@
 		topts.update = 1;
 		topts.merge = 1;
 		topts.gently = opts->merge && old->commit;
-		topts.verbose_update = !opts->quiet && isatty(2);
+		topts.verbose_update = opts->show_progress;
 		topts.fn = twoway_merge;
 		if (opts->overwrite_ignore) {
 			topts.dir = xcalloc(1, sizeof(*topts.dir));
@@ -509,10 +510,10 @@
 			setup_standard_excludes(topts.dir);
 		}
 		tree = parse_tree_indirect(old->commit ?
-					   old->commit->object.sha1 :
+					   old->commit->object.oid.hash :
 					   EMPTY_TREE_SHA1_BIN);
 		init_tree_desc(&trees[0], tree->buffer, tree->size);
-		tree = parse_tree_indirect(new->commit->object.sha1);
+		tree = parse_tree_indirect(new->commit->object.oid.hash);
 		init_tree_desc(&trees[1], tree->buffer, tree->size);
 
 		ret = unpack_trees(2, trees, &topts);
@@ -640,7 +641,7 @@
 
 	old_desc = old->name;
 	if (!old_desc && old->commit)
-		old_desc = sha1_to_hex(old->commit->object.sha1);
+		old_desc = oid_to_hex(&old->commit->object.oid);
 
 	reflog_msg = getenv("GIT_REFLOG_ACTION");
 	if (!reflog_msg)
@@ -652,7 +653,7 @@
 	if (!strcmp(new->name, "HEAD") && !new->path && !opts->force_detach) {
 		/* Nothing to do. */
 	} else if (opts->force_detach || !new->path) {	/* No longer on any branch. */
-		update_ref(msg.buf, "HEAD", new->commit->object.sha1, NULL,
+		update_ref(msg.buf, "HEAD", new->commit->object.oid.hash, NULL,
 			   REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
 		if (!opts->quiet) {
 			if (old->path && advice_detached_head)
@@ -703,7 +704,7 @@
 {
 	strbuf_addstr(sb, "  ");
 	strbuf_addstr(sb,
-		find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV));
+		find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV));
 	strbuf_addch(sb, ' ');
 	if (!parse_commit(commit))
 		pp_commit_easy(CMIT_FMT_ONELINE, commit, sb);
@@ -761,7 +762,7 @@
 			" git branch <new-branch-name> %s\n\n",
 			/* Give ngettext() the count */
 			lost),
-			find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV));
+			find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV));
 }
 
 /*
@@ -779,10 +780,10 @@
 	setup_revisions(0, NULL, &revs, NULL);
 
 	object->flags &= ~UNINTERESTING;
-	add_pending_object(&revs, object, sha1_to_hex(object->sha1));
+	add_pending_object(&revs, object, oid_to_hex(&object->oid));
 
 	for_each_ref(add_pending_uninteresting_ref, &revs);
-	add_pending_sha1(&revs, "HEAD", new->object.sha1, UNINTERESTING);
+	add_pending_sha1(&revs, "HEAD", new->object.oid.hash, UNINTERESTING);
 
 	refs = revs.pending;
 	revs.leak_pending = 1;
@@ -980,7 +981,8 @@
 		 */
 		int recover_with_dwim = dwim_new_local_branch_ok;
 
-		if (check_filename(NULL, arg) && !has_dash_dash)
+		if (!has_dash_dash &&
+		    (check_filename(NULL, arg) || !no_wildcard(arg)))
 			recover_with_dwim = 0;
 		/*
 		 * Accept "git checkout foo" and "git checkout foo --"
@@ -1156,6 +1158,7 @@
 				N_("second guess 'git checkout <no-such-branch>'")),
 		OPT_BOOL(0, "ignore-other-worktrees", &opts.ignore_other_worktrees,
 			 N_("do not check if another worktree is holding the given ref")),
+		OPT_BOOL(0, "progress", &opts.show_progress, N_("force progress reporting")),
 		OPT_END(),
 	};
 
@@ -1163,6 +1166,7 @@
 	memset(&new, 0, sizeof(new));
 	opts.overwrite_ignore = 1;
 	opts.prefix = prefix;
+	opts.show_progress = -1;
 
 	gitmodules_config();
 	git_config(git_checkout_config, &opts);
@@ -1172,6 +1176,13 @@
 	argc = parse_options(argc, argv, prefix, options, checkout_usage,
 			     PARSE_OPT_KEEP_DASHDASH);
 
+	if (opts.show_progress < 0) {
+		if (opts.quiet)
+			opts.show_progress = 0;
+		else
+			opts.show_progress = isatty(2);
+	}
+
 	if (conflict_style) {
 		opts.merge = 1; /* implied */
 		git_xmerge_config("merge.conflictstyle", conflict_style, NULL);
diff --git a/builtin/clean.c b/builtin/clean.c
index df53def..fb1824c 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -147,31 +147,6 @@
 	return 0;
 }
 
-/*
- * Return 1 if the given path is the root of a git repository or
- * submodule else 0. Will not return 1 for bare repositories with the
- * exception of creating a bare repository in "foo/.git" and calling
- * is_git_repository("foo").
- */
-static int is_git_repository(struct strbuf *path)
-{
-	int ret = 0;
-	int gitfile_error;
-	size_t orig_path_len = path->len;
-	assert(orig_path_len != 0);
-	if (path->buf[orig_path_len - 1] != '/')
-		strbuf_addch(path, '/');
-	strbuf_addstr(path, ".git");
-	if (read_gitfile_gently(path->buf, &gitfile_error) || is_git_directory(path->buf))
-		ret = 1;
-	if (gitfile_error == READ_GITFILE_ERR_OPEN_FAILED ||
-	    gitfile_error == READ_GITFILE_ERR_READ_FAILED)
-		ret = 1;  /* This could be a real .git file, take the
-			   * safe option and avoid cleaning */
-	strbuf_setlen(path, orig_path_len);
-	return ret;
-}
-
 static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag,
 		int dry_run, int quiet, int *dir_gone)
 {
@@ -183,7 +158,7 @@
 
 	*dir_gone = 1;
 
-	if ((force_flag & REMOVE_DIR_KEEP_NESTED_GIT) && is_git_repository(path)) {
+	if ((force_flag & REMOVE_DIR_KEEP_NESTED_GIT) && is_nonbare_repository_dir(path)) {
 		if (!quiet) {
 			quote_path_relative(path->buf, prefix, &quoted);
 			printf(dry_run ?  _(msg_would_skip_git_dir) : _(msg_skip_git_dir),
@@ -206,8 +181,7 @@
 		return res;
 	}
 
-	if (path->buf[original_len - 1] != '/')
-		strbuf_addch(path, '/');
+	strbuf_complete(path, '/');
 
 	len = path->len;
 	while ((e = readdir(dir)) != NULL) {
@@ -569,7 +543,7 @@
 	int eof = 0;
 	int i;
 
-	chosen = xmalloc(sizeof(int) * stuff->nr);
+	ALLOC_ARRAY(chosen, stuff->nr);
 	/* set chosen as uninitialized */
 	for (i = 0; i < stuff->nr; i++)
 		chosen[i] = -1;
@@ -641,7 +615,7 @@
 				nr += chosen[i];
 		}
 
-		result = xcalloc(nr + 1, sizeof(int));
+		result = xcalloc(st_add(nr, 1), sizeof(int));
 		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 9eaecd9..8a90cad 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -559,7 +559,7 @@
 	for (r = local_refs; r; r = r->next) {
 		if (!r->peer_ref)
 			continue;
-		if (ref_transaction_create(t, r->peer_ref->name, r->old_sha1,
+		if (ref_transaction_create(t, r->peer_ref->name, r->old_oid.hash,
 					   0, NULL, &err))
 			die("%s", err.buf);
 	}
@@ -579,9 +579,9 @@
 			continue;
 		if (ends_with(ref->name, "^{}"))
 			continue;
-		if (!has_sha1_file(ref->old_sha1))
+		if (!has_object_file(&ref->old_oid))
 			continue;
-		update_ref(msg, ref->name, ref->old_sha1,
+		update_ref(msg, ref->name, ref->old_oid.hash,
 			   NULL, 0, UPDATE_REFS_DIE_ON_ERR);
 	}
 }
@@ -601,7 +601,7 @@
 	if (!ref)
 		return -1;
 
-	hashcpy(sha1, ref->old_sha1);
+	hashcpy(sha1, ref->old_oid.hash);
 	*rm = ref->next;
 	return 0;
 }
@@ -650,14 +650,14 @@
 		/* Local default branch link */
 		create_symref("HEAD", our->name, NULL);
 		if (!option_bare) {
-			update_ref(msg, "HEAD", our->old_sha1, NULL, 0,
+			update_ref(msg, "HEAD", our->old_oid.hash, NULL, 0,
 				   UPDATE_REFS_DIE_ON_ERR);
 			install_branch_config(0, head, option_origin, our->name);
 		}
 	} else if (our) {
-		struct commit *c = lookup_commit_reference(our->old_sha1);
+		struct commit *c = lookup_commit_reference(our->old_oid.hash);
 		/* --branch specifies a non-branch (i.e. tags), detach HEAD */
-		update_ref(msg, "HEAD", c->object.sha1,
+		update_ref(msg, "HEAD", c->object.oid.hash,
 			   NULL, REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
 	} else if (remote) {
 		/*
@@ -665,7 +665,7 @@
 		 * HEAD points to a branch but we don't know which one.
 		 * Detach HEAD in all these cases.
 		 */
-		update_ref(msg, "HEAD", remote->old_sha1,
+		update_ref(msg, "HEAD", remote->old_oid.hash,
 			   NULL, REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
 	}
 }
@@ -732,7 +732,7 @@
 
 static int write_one_config(const char *key, const char *value, void *data)
 {
-	return git_config_set_multivar(key, value ? value : "true", "^$", 0);
+	return git_config_set_multivar_gently(key, value ? value : "true", "^$", 0);
 }
 
 static void write_config(struct string_list *config)
@@ -801,11 +801,15 @@
 static void dissociate_from_references(void)
 {
 	static const char* argv[] = { "repack", "-a", "-d", NULL };
+	char *alternates = git_pathdup("objects/info/alternates");
 
-	if (run_command_v_opt(argv, RUN_GIT_CMD|RUN_COMMAND_NO_STDIN))
-		die(_("cannot repack to clean up"));
-	if (unlink(git_path("objects/info/alternates")) && errno != ENOENT)
-		die_errno(_("cannot unlink temporary alternates file"));
+	if (!access(alternates, F_OK)) {
+		if (run_command_v_opt(argv, RUN_GIT_CMD|RUN_COMMAND_NO_STDIN))
+			die(_("cannot repack to clean up"));
+		if (unlink(alternates) && errno != ENOENT)
+			die_errno(_("cannot unlink temporary alternates file"));
+	}
+	free(alternates);
 }
 
 int cmd_clone(int argc, const char **argv, const char *prefix)
@@ -954,10 +958,6 @@
 
 	if (option_reference.nr)
 		setup_reference();
-	else if (option_dissociate) {
-		warning(_("--dissociate given, but there is no --reference"));
-		option_dissociate = 0;
-	}
 
 	fetch_pattern = value.buf;
 	refspec = parse_fetch_refspec(1, &fetch_pattern);
@@ -1016,7 +1016,7 @@
 		 * remote HEAD check.
 		 */
 		for (ref = refs; ref; ref = ref->next)
-			if (is_null_sha1(ref->old_sha1)) {
+			if (is_null_oid(&ref->old_oid)) {
 				complete_refs_before_fetch = 0;
 				break;
 			}
diff --git a/builtin/commit-tree.c b/builtin/commit-tree.c
index 8747c0f..3feeffe 100644
--- a/builtin/commit-tree.c
+++ b/builtin/commit-tree.c
@@ -16,11 +16,11 @@
 
 static void new_parent(struct commit *parent, struct commit_list **parents_p)
 {
-	unsigned char *sha1 = parent->object.sha1;
+	struct object_id *oid = &parent->object.oid;
 	struct commit_list *parents;
 	for (parents = *parents_p; parents; parents = parents->next) {
 		if (parents->item == parent) {
-			error("duplicate parent %s ignored", sha1_to_hex(sha1));
+			error("duplicate parent %s ignored", oid_to_hex(oid));
 			return;
 		}
 		parents_p = &parents->next;
diff --git a/builtin/commit.c b/builtin/commit.c
index f2a8b78..89bf6ad 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -300,7 +300,7 @@
 	opts.dst_index = &the_index;
 
 	opts.fn = oneway_merge;
-	tree = parse_tree_indirect(current_head->object.sha1);
+	tree = parse_tree_indirect(current_head->object.oid.hash);
 	if (!tree)
 		die(_("failed to unpack HEAD tree object"));
 	parse_tree(tree);
@@ -761,7 +761,7 @@
 		hook_arg2 = "";
 	}
 
-	s->fp = fopen(git_path(commit_editmsg), "w");
+	s->fp = fopen_for_writing(git_path(commit_editmsg));
 	if (s->fp == NULL)
 		die_errno(_("could not open '%s'"), git_path(commit_editmsg));
 
@@ -1769,7 +1769,7 @@
 	if (!transaction ||
 	    ref_transaction_update(transaction, "HEAD", sha1,
 				   current_head
-				   ? current_head->object.sha1 : null_sha1,
+				   ? current_head->object.oid.hash : null_sha1,
 				   0, sb.buf, &err) ||
 	    ref_transaction_commit(transaction, &err)) {
 		rollback_index_files();
@@ -1796,10 +1796,10 @@
 		cfg = init_copy_notes_for_rewrite("amend");
 		if (cfg) {
 			/* we are amending, so current_head is not NULL */
-			copy_note_for_rewrite(cfg, current_head->object.sha1, sha1);
+			copy_note_for_rewrite(cfg, current_head->object.oid.hash, sha1);
 			finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
 		}
-		run_rewrite_hook(current_head->object.sha1, sha1);
+		run_rewrite_hook(current_head->object.oid.hash, sha1);
 	}
 	if (!quiet)
 		print_summary(prefix, sha1, !current_head);
diff --git a/builtin/config.c b/builtin/config.c
index 71acc44..746233e 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -246,8 +246,6 @@
 
 static char *normalize_value(const char *key, const char *value)
 {
-	char *normalized;
-
 	if (!value)
 		return NULL;
 
@@ -258,27 +256,21 @@
 		 * "~/foobar/" in the config file, and to expand the ~
 		 * when retrieving the value.
 		 */
-		normalized = xstrdup(value);
-	else {
-		normalized = xmalloc(64);
-		if (types == TYPE_INT) {
-			int64_t v = git_config_int64(key, value);
-			sprintf(normalized, "%"PRId64, v);
-		}
-		else if (types == TYPE_BOOL)
-			sprintf(normalized, "%s",
-				git_config_bool(key, value) ? "true" : "false");
-		else if (types == TYPE_BOOL_OR_INT) {
-			int is_bool, v;
-			v = git_config_bool_or_int(key, value, &is_bool);
-			if (!is_bool)
-				sprintf(normalized, "%d", v);
-			else
-				sprintf(normalized, "%s", v ? "true" : "false");
-		}
+		return xstrdup(value);
+	if (types == TYPE_INT)
+		return xstrfmt("%"PRId64, git_config_int64(key, value));
+	if (types == TYPE_BOOL)
+		return xstrdup(git_config_bool(key, value) ?  "true" : "false");
+	if (types == TYPE_BOOL_OR_INT) {
+		int is_bool, v;
+		v = git_config_bool_or_int(key, value, &is_bool);
+		if (!is_bool)
+			return xstrfmt("%d", v);
+		else
+			return xstrdup(v ? "true" : "false");
 	}
 
-	return normalized;
+	die("BUG: cannot normalize type %d", types);
 }
 
 static int get_color_found;
@@ -360,6 +352,9 @@
 
 static void check_write(void)
 {
+	if (!given_config_source.file && !startup_info->have_repository)
+		die("not in a git directory");
+
 	if (given_config_source.use_stdin)
 		die("writing to stdin is not supported");
 
@@ -590,7 +585,7 @@
 		check_write();
 		check_argc(argc, 2, 2);
 		value = normalize_value(argv[0], argv[1]);
-		ret = git_config_set_in_file(given_config_source.file, argv[0], value);
+		ret = git_config_set_in_file_gently(given_config_source.file, argv[0], value);
 		if (ret == CONFIG_NOTHING_SET)
 			error("cannot overwrite multiple values with a single value\n"
 			"       Use a regexp, --add or --replace-all to change %s.", argv[0]);
@@ -600,23 +595,23 @@
 		check_write();
 		check_argc(argc, 2, 3);
 		value = normalize_value(argv[0], argv[1]);
-		return git_config_set_multivar_in_file(given_config_source.file,
-						       argv[0], value, argv[2], 0);
+		return git_config_set_multivar_in_file_gently(given_config_source.file,
+							      argv[0], value, argv[2], 0);
 	}
 	else if (actions == ACTION_ADD) {
 		check_write();
 		check_argc(argc, 2, 2);
 		value = normalize_value(argv[0], argv[1]);
-		return git_config_set_multivar_in_file(given_config_source.file,
-						       argv[0], value,
-						       CONFIG_REGEX_NONE, 0);
+		return git_config_set_multivar_in_file_gently(given_config_source.file,
+							      argv[0], value,
+							      CONFIG_REGEX_NONE, 0);
 	}
 	else if (actions == ACTION_REPLACE_ALL) {
 		check_write();
 		check_argc(argc, 2, 3);
 		value = normalize_value(argv[0], argv[1]);
-		return git_config_set_multivar_in_file(given_config_source.file,
-						       argv[0], value, argv[2], 1);
+		return git_config_set_multivar_in_file_gently(given_config_source.file,
+							      argv[0], value, argv[2], 1);
 	}
 	else if (actions == ACTION_GET) {
 		check_argc(argc, 1, 2);
@@ -642,17 +637,17 @@
 		check_write();
 		check_argc(argc, 1, 2);
 		if (argc == 2)
-			return git_config_set_multivar_in_file(given_config_source.file,
-							       argv[0], NULL, argv[1], 0);
+			return git_config_set_multivar_in_file_gently(given_config_source.file,
+								      argv[0], NULL, argv[1], 0);
 		else
-			return git_config_set_in_file(given_config_source.file,
-						      argv[0], NULL);
+			return git_config_set_in_file_gently(given_config_source.file,
+							     argv[0], NULL);
 	}
 	else if (actions == ACTION_UNSET_ALL) {
 		check_write();
 		check_argc(argc, 1, 2);
-		return git_config_set_multivar_in_file(given_config_source.file,
-						       argv[0], NULL, argv[1], 1);
+		return git_config_set_multivar_in_file_gently(given_config_source.file,
+							      argv[0], NULL, argv[1], 1);
 	}
 	else if (actions == ACTION_RENAME_SECTION) {
 		int ret;
diff --git a/builtin/describe.c b/builtin/describe.c
index 7df5543..8a25abe 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -252,14 +252,14 @@
 	if (!cmit)
 		die(_("%s is not a valid '%s' object"), arg, commit_type);
 
-	n = find_commit_name(cmit->object.sha1);
+	n = find_commit_name(cmit->object.oid.hash);
 	if (n && (tags || all || n->prio == 2)) {
 		/*
 		 * Exact match to an existing ref.
 		 */
 		display_name(n);
 		if (longformat)
-			show_suffix(0, n->tag ? n->tag->tagged->sha1 : sha1);
+			show_suffix(0, n->tag ? n->tag->tagged->oid.hash : sha1);
 		if (dirty)
 			printf("%s", dirty);
 		printf("\n");
@@ -267,7 +267,7 @@
 	}
 
 	if (!max_candidates)
-		die(_("no tag exactly matches '%s'"), sha1_to_hex(cmit->object.sha1));
+		die(_("no tag exactly matches '%s'"), oid_to_hex(&cmit->object.oid));
 	if (debug)
 		fprintf(stderr, _("searching to describe %s\n"), arg);
 
@@ -317,7 +317,7 @@
 		if (annotated_cnt && !list) {
 			if (debug)
 				fprintf(stderr, _("finished search at %s\n"),
-					sha1_to_hex(c->object.sha1));
+					oid_to_hex(&c->object.oid));
 			break;
 		}
 		while (parents) {
@@ -334,9 +334,9 @@
 	}
 
 	if (!match_cnt) {
-		const unsigned char *sha1 = cmit->object.sha1;
+		struct object_id *oid = &cmit->object.oid;
 		if (always) {
-			printf("%s", find_unique_abbrev(sha1, abbrev));
+			printf("%s", find_unique_abbrev(oid->hash, abbrev));
 			if (dirty)
 				printf("%s", dirty);
 			printf("\n");
@@ -345,11 +345,11 @@
 		if (unannotated_cnt)
 			die(_("No annotated tags can describe '%s'.\n"
 			    "However, there were unannotated tags: try --tags."),
-			    sha1_to_hex(sha1));
+			    oid_to_hex(oid));
 		else
 			die(_("No tags can describe '%s'.\n"
 			    "Try --always, or create some tags."),
-			    sha1_to_hex(sha1));
+			    oid_to_hex(oid));
 	}
 
 	qsort(all_matches, match_cnt, sizeof(all_matches[0]), compare_pt);
@@ -374,13 +374,13 @@
 				_("more than %i tags found; listed %i most recent\n"
 				"gave up search at %s\n"),
 				max_candidates, max_candidates,
-				sha1_to_hex(gave_up_on->object.sha1));
+				oid_to_hex(&gave_up_on->object.oid));
 		}
 	}
 
 	display_name(all_matches[0].name);
 	if (abbrev)
-		show_suffix(all_matches[0].depth, cmit->object.sha1);
+		show_suffix(all_matches[0].depth, cmit->object.oid.hash);
 	if (dirty)
 		printf("%s", dirty);
 	printf("\n");
diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c
index 12b683d..2a12b81 100644
--- a/builtin/diff-tree.c
+++ b/builtin/diff-tree.c
@@ -49,9 +49,9 @@
 	tree2 = lookup_tree(sha1);
 	if (!tree2 || parse_tree(tree2))
 		return -1;
-	printf("%s %s\n", sha1_to_hex(tree1->object.sha1),
-			  sha1_to_hex(tree2->object.sha1));
-	diff_tree_sha1(tree1->object.sha1, tree2->object.sha1,
+	printf("%s %s\n", oid_to_hex(&tree1->object.oid),
+			  oid_to_hex(&tree2->object.oid));
+	diff_tree_sha1(tree1->object.oid.hash, tree2->object.oid.hash,
 		       "", &log_tree_opt.diffopt);
 	log_tree_diff_flush(&log_tree_opt);
 	return 0;
@@ -139,7 +139,7 @@
 		break;
 	case 1:
 		tree1 = opt->pending.objects[0].item;
-		diff_tree_commit_sha1(tree1->sha1);
+		diff_tree_commit_sha1(tree1->oid.hash);
 		break;
 	case 2:
 		tree1 = opt->pending.objects[0].item;
@@ -149,8 +149,8 @@
 			tree2 = tree1;
 			tree1 = tmp;
 		}
-		diff_tree_sha1(tree1->sha1,
-			       tree2->sha1,
+		diff_tree_sha1(tree1->oid.hash,
+			       tree2->oid.hash,
 			       "", &opt->diffopt);
 		log_tree_diff_flush(opt);
 		break;
diff --git a/builtin/diff.c b/builtin/diff.c
index 4326fa5..52c98a9 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -175,8 +175,8 @@
 	 */
 	if (ent1->item->flags & UNINTERESTING)
 		swap = 1;
-	sha1[swap] = ent0->item->sha1;
-	sha1[1 - swap] = ent1->item->sha1;
+	sha1[swap] = ent0->item->oid.hash;
+	sha1[1 - swap] = ent1->item->oid.hash;
 	diff_tree_sha1(sha1[0], sha1[1], "", &revs->diffopt);
 	log_tree_diff_flush(revs);
 	return 0;
@@ -196,8 +196,8 @@
 	if (!revs->dense_combined_merges && !revs->combine_merges)
 		revs->dense_combined_merges = revs->combine_merges = 1;
 	for (i = 1; i < ents; i++)
-		sha1_array_append(&parents, ent[i].item->sha1);
-	diff_tree_combined(ent[0].item->sha1, &parents,
+		sha1_array_append(&parents, ent[i].item->oid.hash);
+	diff_tree_combined(ent[0].item->oid.hash, &parents,
 			   revs->dense_combined_merges, revs);
 	sha1_array_clear(&parents);
 	return 0;
@@ -341,7 +341,7 @@
 	}
 	if (no_index)
 		/* If this is a no-index diff, just run it and exit there. */
-		diff_no_index(&rev, argc, argv, prefix);
+		diff_no_index(&rev, argc, argv);
 
 	/* Otherwise, we are doing the usual "git" diff */
 	rev.diffopt.skip_stat_unmatch = !!diff_auto_refresh_index;
@@ -395,7 +395,7 @@
 		const char *name = entry->name;
 		int flags = (obj->flags & UNINTERESTING);
 		if (!obj->parsed)
-			obj = parse_object(obj->sha1);
+			obj = parse_object(obj->oid.hash);
 		obj = deref_tag(obj, NULL, 0);
 		if (!obj)
 			die(_("invalid object '%s' given."), name);
@@ -408,7 +408,7 @@
 		} else if (obj->type == OBJ_BLOB) {
 			if (2 <= blobs)
 				die(_("more than two blobs given: '%s'"), name);
-			hashcpy(blob[blobs].sha1, obj->sha1);
+			hashcpy(blob[blobs].sha1, obj->oid.hash);
 			blob[blobs].name = name;
 			blob[blobs].mode = entry->mode;
 			blobs++;
diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index d23f3be..8164b58 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -544,13 +544,13 @@
 	author = strstr(commit_buffer, "\nauthor ");
 	if (!author)
 		die ("Could not find author in commit %s",
-		     sha1_to_hex(commit->object.sha1));
+		     oid_to_hex(&commit->object.oid));
 	author++;
 	author_end = strchrnul(author, '\n');
 	committer = strstr(author_end, "\ncommitter ");
 	if (!committer)
 		die ("Could not find committer in commit %s",
-		     sha1_to_hex(commit->object.sha1));
+		     oid_to_hex(&commit->object.oid));
 	committer++;
 	committer_end = strchrnul(committer, '\n');
 	message = strstr(committer_end, "\n\n");
@@ -562,11 +562,11 @@
 	    get_object_mark(&commit->parents->item->object) != 0 &&
 	    !full_tree) {
 		parse_commit_or_die(commit->parents->item);
-		diff_tree_sha1(commit->parents->item->tree->object.sha1,
-			       commit->tree->object.sha1, "", &rev->diffopt);
+		diff_tree_sha1(commit->parents->item->tree->object.oid.hash,
+			       commit->tree->object.oid.hash, "", &rev->diffopt);
 	}
 	else
-		diff_root_tree_sha1(commit->tree->object.sha1,
+		diff_root_tree_sha1(commit->tree->object.oid.hash,
 				    "", &rev->diffopt);
 
 	/* Export the referenced blobs, and remember the marks. */
@@ -661,13 +661,13 @@
 	}
 	if (tagged->type == OBJ_TREE) {
 		warning("Omitting tag %s,\nsince tags of trees (or tags of tags of trees, etc.) are not supported.",
-			sha1_to_hex(tag->object.sha1));
+			oid_to_hex(&tag->object.oid));
 		return;
 	}
 
-	buf = read_sha1_file(tag->object.sha1, &type, &size);
+	buf = read_sha1_file(tag->object.oid.hash, &type, &size);
 	if (!buf)
-		die ("Could not read tag %s", sha1_to_hex(tag->object.sha1));
+		die ("Could not read tag %s", oid_to_hex(&tag->object.oid));
 	message = memmem(buf, size, "\n\n", 2);
 	if (message) {
 		message += 2;
@@ -706,16 +706,16 @@
 			case ABORT:
 				die ("Encountered signed tag %s; use "
 				     "--signed-tags=<mode> to handle it.",
-				     sha1_to_hex(tag->object.sha1));
+				     oid_to_hex(&tag->object.oid));
 			case WARN:
 				warning ("Exporting signed tag %s",
-					 sha1_to_hex(tag->object.sha1));
+					 oid_to_hex(&tag->object.oid));
 				/* fallthru */
 			case VERBATIM:
 				break;
 			case WARN_STRIP:
 				warning ("Stripping signature from tag %s",
-					 sha1_to_hex(tag->object.sha1));
+					 oid_to_hex(&tag->object.oid));
 				/* fallthru */
 			case STRIP:
 				message_size = signature + 1 - message;
@@ -731,14 +731,14 @@
 		case ABORT:
 			die ("Tag %s tags unexported object; use "
 			     "--tag-of-filtered-object=<mode> to handle it.",
-			     sha1_to_hex(tag->object.sha1));
+			     oid_to_hex(&tag->object.oid));
 		case DROP:
 			/* Ignore this tag altogether */
 			return;
 		case REWRITE:
 			if (tagged->type != OBJ_COMMIT) {
 				die ("Tag %s tags unexported %s!",
-				     sha1_to_hex(tag->object.sha1),
+				     oid_to_hex(&tag->object.oid),
 				     typename(tagged->type));
 			}
 			p = (struct commit *)tagged;
@@ -751,7 +751,7 @@
 					break;
 				if (!p->parents)
 					die ("Can't find replacement commit for tag %s\n",
-					     sha1_to_hex(tag->object.sha1));
+					     oid_to_hex(&tag->object.oid));
 				p = p->parents->item;
 			}
 			tagged_mark = get_object_mark(&p->object);
@@ -777,7 +777,7 @@
 
 		/* handle nested tags */
 		while (tag && tag->object.type == OBJ_TAG) {
-			parse_object(tag->object.sha1);
+			parse_object(tag->object.oid.hash);
 			string_list_append(&extra_refs, full_name)->util = tag;
 			tag = (struct tag *)tag->tagged;
 		}
@@ -828,7 +828,7 @@
 		case OBJ_COMMIT:
 			break;
 		case OBJ_BLOB:
-			export_blob(commit->object.sha1);
+			export_blob(commit->object.oid.hash);
 			continue;
 		default: /* OBJ_TAG (nested tags) is already handled */
 			warning("Tag points to object of unexpected type %s, skipping.",
@@ -880,7 +880,7 @@
 	FILE *f;
 	int e = 0;
 
-	f = fopen(file, "w");
+	f = fopen_for_writing(file);
 	if (!f)
 		die_errno("Unable to open marks file %s for writing.", file);
 
@@ -888,7 +888,7 @@
 		if (deco->base && deco->base->type == 1) {
 			mark = ptr_to_mark(deco->decoration);
 			if (fprintf(f, ":%"PRIu32" %s\n", mark,
-				sha1_to_hex(deco->base->sha1)) < 0) {
+				oid_to_hex(&deco->base->oid)) < 0) {
 			    e = 1;
 			    break;
 			}
@@ -1021,7 +1021,7 @@
 		const char **refspecs_str;
 		int i;
 
-		refspecs_str = xmalloc(sizeof(*refspecs_str) * refspecs_list.nr);
+		ALLOC_ARRAY(refspecs_str, refspecs_list.nr);
 		for (i = 0; i < refspecs_list.nr; i++)
 			refspecs_str[i] = refspecs_list.items[i].string;
 
diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c
index 4a6b340..7d5914f 100644
--- a/builtin/fetch-pack.c
+++ b/builtin/fetch-pack.c
@@ -10,31 +10,24 @@
 "[--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] "
 "[--no-progress] [--diag-url] [-v] [<host>:]<directory> [<refs>...]";
 
-static void add_sought_entry_mem(struct ref ***sought, int *nr, int *alloc,
-				 const char *name, int namelen)
+static void add_sought_entry(struct ref ***sought, int *nr, int *alloc,
+			     const char *name)
 {
-	struct ref *ref = xcalloc(1, sizeof(*ref) + namelen + 1);
-	unsigned char sha1[20];
+	struct ref *ref;
+	struct object_id oid;
 
-	if (namelen > 41 && name[40] == ' ' && !get_sha1_hex(name, sha1)) {
-		hashcpy(ref->old_sha1, sha1);
-		name += 41;
-		namelen -= 41;
-	}
+	if (!get_oid_hex(name, &oid) && name[GIT_SHA1_HEXSZ] == ' ')
+		name += GIT_SHA1_HEXSZ + 1;
+	else
+		oidclr(&oid);
 
-	memcpy(ref->name, name, namelen);
-	ref->name[namelen] = '\0';
+	ref = alloc_ref(name);
+	oidcpy(&ref->old_oid, &oid);
 	(*nr)++;
 	ALLOC_GROW(*sought, *nr, *alloc);
 	(*sought)[*nr - 1] = ref;
 }
 
-static void add_sought_entry(struct ref ***sought, int *nr, int *alloc,
-			     const char *string)
-{
-	add_sought_entry_mem(sought, nr, alloc, string, strlen(string));
-}
-
 int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
 {
 	int i, ret;
@@ -210,7 +203,7 @@
 
 	while (ref) {
 		printf("%s %s\n",
-		       sha1_to_hex(ref->old_sha1), ref->name);
+		       oid_to_hex(&ref->old_oid), ref->name);
 		ref = ref->next;
 	}
 
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 9a3869f..683f08e 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -196,7 +196,7 @@
 {
 	struct ref *rm = *head;
 	while (rm) {
-		if (!hashcmp(rm->old_sha1, sha1))
+		if (!hashcmp(rm->old_oid.hash, sha1))
 			return 1;
 		rm = rm->next;
 	}
@@ -224,8 +224,8 @@
 		 * as one to ignore by setting util to NULL.
 		 */
 		if (ends_with(ref->name, "^{}")) {
-			if (item && !has_sha1_file(ref->old_sha1) &&
-			    !will_fetch(head, ref->old_sha1) &&
+			if (item && !has_object_file(&ref->old_oid) &&
+			    !will_fetch(head, ref->old_oid.hash) &&
 			    !has_sha1_file(item->util) &&
 			    !will_fetch(head, item->util))
 				item->util = NULL;
@@ -251,7 +251,7 @@
 			continue;
 
 		item = string_list_insert(&remote_refs, ref->name);
-		item->util = (void *)ref->old_sha1;
+		item->util = (void *)&ref->old_oid;
 	}
 	string_list_clear(&existing_refs, 1);
 
@@ -273,7 +273,7 @@
 		{
 			struct ref *rm = alloc_ref(item->string);
 			rm->peer_ref = alloc_ref(item->string);
-			hashcpy(rm->old_sha1, item->util);
+			oidcpy(&rm->old_oid, item->util);
 			**tail = rm;
 			*tail = &rm->next;
 		}
@@ -419,8 +419,8 @@
 	transaction = ref_transaction_begin(&err);
 	if (!transaction ||
 	    ref_transaction_update(transaction, ref->name,
-				   ref->new_sha1,
-				   check_old ? ref->old_sha1 : NULL,
+				   ref->new_oid.hash,
+				   check_old ? ref->old_oid.hash : NULL,
 				   0, msg, &err))
 		goto fail;
 
@@ -453,11 +453,11 @@
 	struct branch *current_branch = branch_get(NULL);
 	const char *pretty_ref = prettify_refname(ref->name);
 
-	type = sha1_object_info(ref->new_sha1, NULL);
+	type = sha1_object_info(ref->new_oid.hash, NULL);
 	if (type < 0)
-		die(_("object %s not found"), sha1_to_hex(ref->new_sha1));
+		die(_("object %s not found"), oid_to_hex(&ref->new_oid));
 
-	if (!hashcmp(ref->old_sha1, ref->new_sha1)) {
+	if (!oidcmp(&ref->old_oid, &ref->new_oid)) {
 		if (verbosity > 0)
 			strbuf_addf(display, "= %-*s %-*s -> %s",
 				    TRANSPORT_SUMMARY(_("[up to date]")),
@@ -468,7 +468,7 @@
 	if (current_branch &&
 	    !strcmp(ref->name, current_branch->name) &&
 	    !(update_head_ok || is_bare_repository()) &&
-	    !is_null_sha1(ref->old_sha1)) {
+	    !is_null_oid(&ref->old_oid)) {
 		/*
 		 * If this is the head, and it's not okay to update
 		 * the head, and the old value of the head isn't empty...
@@ -480,7 +480,7 @@
 		return 1;
 	}
 
-	if (!is_null_sha1(ref->old_sha1) &&
+	if (!is_null_oid(&ref->old_oid) &&
 	    starts_with(ref->name, "refs/tags/")) {
 		int r;
 		r = s_update_ref("updating tag", ref, 0);
@@ -492,8 +492,8 @@
 		return r;
 	}
 
-	current = lookup_commit_reference_gently(ref->old_sha1, 1);
-	updated = lookup_commit_reference_gently(ref->new_sha1, 1);
+	current = lookup_commit_reference_gently(ref->old_oid.hash, 1);
+	updated = lookup_commit_reference_gently(ref->new_oid.hash, 1);
 	if (!current || !updated) {
 		const char *msg;
 		const char *what;
@@ -517,7 +517,7 @@
 
 		if ((recurse_submodules != RECURSE_SUBMODULES_OFF) &&
 		    (recurse_submodules != RECURSE_SUBMODULES_ON))
-			check_for_new_submodule_commits(ref->new_sha1);
+			check_for_new_submodule_commits(ref->new_oid.hash);
 		r = s_update_ref(msg, ref, 0);
 		strbuf_addf(display, "%c %-*s %-*s -> %s%s",
 			    r ? '!' : '*',
@@ -528,36 +528,38 @@
 	}
 
 	if (in_merge_bases(current, updated)) {
-		char quickref[83];
+		struct strbuf quickref = STRBUF_INIT;
 		int r;
-		strcpy(quickref, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV));
-		strcat(quickref, "..");
-		strcat(quickref, find_unique_abbrev(ref->new_sha1, DEFAULT_ABBREV));
+		strbuf_add_unique_abbrev(&quickref, current->object.oid.hash, DEFAULT_ABBREV);
+		strbuf_addstr(&quickref, "..");
+		strbuf_add_unique_abbrev(&quickref, ref->new_oid.hash, DEFAULT_ABBREV);
 		if ((recurse_submodules != RECURSE_SUBMODULES_OFF) &&
 		    (recurse_submodules != RECURSE_SUBMODULES_ON))
-			check_for_new_submodule_commits(ref->new_sha1);
+			check_for_new_submodule_commits(ref->new_oid.hash);
 		r = s_update_ref("fast-forward", ref, 1);
 		strbuf_addf(display, "%c %-*s %-*s -> %s%s",
 			    r ? '!' : ' ',
-			    TRANSPORT_SUMMARY_WIDTH, quickref,
+			    TRANSPORT_SUMMARY_WIDTH, quickref.buf,
 			    REFCOL_WIDTH, remote, pretty_ref,
 			    r ? _("  (unable to update local ref)") : "");
+		strbuf_release(&quickref);
 		return r;
 	} else if (force || ref->force) {
-		char quickref[84];
+		struct strbuf quickref = STRBUF_INIT;
 		int r;
-		strcpy(quickref, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV));
-		strcat(quickref, "...");
-		strcat(quickref, find_unique_abbrev(ref->new_sha1, DEFAULT_ABBREV));
+		strbuf_add_unique_abbrev(&quickref, current->object.oid.hash, DEFAULT_ABBREV);
+		strbuf_addstr(&quickref, "...");
+		strbuf_add_unique_abbrev(&quickref, ref->new_oid.hash, DEFAULT_ABBREV);
 		if ((recurse_submodules != RECURSE_SUBMODULES_OFF) &&
 		    (recurse_submodules != RECURSE_SUBMODULES_ON))
-			check_for_new_submodule_commits(ref->new_sha1);
+			check_for_new_submodule_commits(ref->new_oid.hash);
 		r = s_update_ref("forced-update", ref, 1);
 		strbuf_addf(display, "%c %-*s %-*s -> %s  (%s)",
 			    r ? '!' : '+',
-			    TRANSPORT_SUMMARY_WIDTH, quickref,
+			    TRANSPORT_SUMMARY_WIDTH, quickref.buf,
 			    REFCOL_WIDTH, remote, pretty_ref,
 			    r ? _("unable to update local ref") : _("forced update"));
+		strbuf_release(&quickref);
 		return r;
 	} else {
 		strbuf_addf(display, "! %-*s %-*s -> %s  %s",
@@ -578,7 +580,7 @@
 	if (!ref)
 		return -1; /* end of the list */
 	*rm = ref->next;
-	hashcpy(sha1, ref->old_sha1);
+	hashcpy(sha1, ref->old_oid.hash);
 	return 0;
 }
 
@@ -629,7 +631,7 @@
 				continue;
 			}
 
-			commit = lookup_commit_reference_gently(rm->old_sha1, 1);
+			commit = lookup_commit_reference_gently(rm->old_oid.hash, 1);
 			if (!commit)
 				rm->fetch_head_status = FETCH_HEAD_NOT_FOR_MERGE;
 
@@ -637,10 +639,9 @@
 				continue;
 
 			if (rm->peer_ref) {
-				ref = xcalloc(1, sizeof(*ref) + strlen(rm->peer_ref->name) + 1);
-				strcpy(ref->name, rm->peer_ref->name);
-				hashcpy(ref->old_sha1, rm->peer_ref->old_sha1);
-				hashcpy(ref->new_sha1, rm->old_sha1);
+				ref = alloc_ref(rm->peer_ref->name);
+				oidcpy(&ref->old_oid, &rm->peer_ref->old_oid);
+				oidcpy(&ref->new_oid, &rm->old_oid);
 				ref->force = rm->peer_ref->force;
 			}
 
@@ -685,7 +686,7 @@
 				/* fall-through */
 			case FETCH_HEAD_MERGE:
 				fprintf(fp, "%s\t%s\t%s",
-					sha1_to_hex(rm->old_sha1),
+					oid_to_hex(&rm->old_oid),
 					merge_status_marker,
 					note.buf);
 				for (i = 0; i < url_len; ++i)
@@ -836,7 +837,7 @@
 static int truncate_fetch_head(void)
 {
 	const char *filename = git_path_fetch_head();
-	FILE *fp = fopen(filename, "w");
+	FILE *fp = fopen_for_writing(filename);
 
 	if (!fp)
 		return error(_("cannot open %s: %s\n"), filename, strerror(errno));
@@ -927,7 +928,7 @@
 						   rm->peer_ref->name);
 			if (peer_item) {
 				struct object_id *old_oid = peer_item->util;
-				hashcpy(rm->peer_ref->old_sha1, old_oid->hash);
+				oidcpy(&rm->peer_ref->old_oid, old_oid);
 			}
 		}
 	}
@@ -1106,7 +1107,7 @@
 	if (argc > 0) {
 		int j = 0;
 		int i;
-		refs = xcalloc(argc + 1, sizeof(const char *));
+		refs = xcalloc(st_add(argc, 1), sizeof(const char *));
 		for (i = 0; i < argc; i++) {
 			if (!strcmp(argv[i], "tag")) {
 				i++;
@@ -1156,11 +1157,8 @@
 			die(_("--depth and --unshallow cannot be used together"));
 		else if (!is_repository_shallow())
 			die(_("--unshallow on a complete repository does not make sense"));
-		else {
-			static char inf_depth[12];
-			sprintf(inf_depth, "%d", INFINITE_DEPTH);
-			depth = inf_depth;
-		}
+		else
+			depth = xstrfmt("%d", INFINITE_DEPTH);
 	}
 
 	/* no need to be strict, transport_set_option() will validate it again */
@@ -1223,6 +1221,8 @@
 	list.strdup_strings = 1;
 	string_list_clear(&list, 0);
 
+	close_all_packs();
+
 	argv_array_pushl(&argv_gc_auto, "gc", "--auto", NULL);
 	if (verbosity < 0)
 		argv_array_push(&argv_gc_auto, "--quiet");
diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c
index 846004b..e5658c3 100644
--- a/builtin/fmt-merge-msg.c
+++ b/builtin/fmt-merge-msg.c
@@ -378,7 +378,7 @@
 
 		if (!sb.len)
 			string_list_append(&subjects,
-					   sha1_to_hex(commit->object.sha1));
+					   oid_to_hex(&commit->object.oid));
 		else
 			string_list_append(&subjects, strbuf_detach(&sb, NULL));
 	}
@@ -568,7 +568,7 @@
 		if (!parent)
 			continue;
 		commit_list_insert(parent, &parents);
-		add_merge_parent(result, obj->sha1, parent->object.sha1);
+		add_merge_parent(result, obj->oid.hash, parent->object.oid.hash);
 	}
 	head_commit = lookup_commit(head);
 	if (head_commit)
@@ -578,7 +578,7 @@
 	while (parents) {
 		struct commit *cmit = pop_commit(&parents);
 		for (i = 0; i < result->nr; i++)
-			if (!hashcmp(result->item[i].commit, cmit->object.sha1))
+			if (!hashcmp(result->item[i].commit, cmit->object.oid.hash))
 				result->item[i].used = 1;
 	}
 
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 7919206..4e9f6c2 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -7,6 +7,9 @@
 
 static char const * const for_each_ref_usage[] = {
 	N_("git for-each-ref [<options>] [<pattern>]"),
+	N_("git for-each-ref [--points-at <object>]"),
+	N_("git for-each-ref [(--merged | --no-merged) [<object>]]"),
+	N_("git for-each-ref [--contains [<object>]]"),
 	NULL
 };
 
@@ -34,9 +37,18 @@
 		OPT_STRING(  0 , "format", &format, N_("format"), N_("format to use for the output")),
 		OPT_CALLBACK(0 , "sort", sorting_tail, N_("key"),
 			    N_("field name to sort on"), &parse_opt_ref_sorting),
+		OPT_CALLBACK(0, "points-at", &filter.points_at,
+			     N_("object"), N_("print only refs which points at the given object"),
+			     parse_opt_object_name),
+		OPT_MERGED(&filter, N_("print only refs that are merged")),
+		OPT_NO_MERGED(&filter, N_("print only refs that are not merged")),
+		OPT_CONTAINS(&filter.with_commit, N_("print only refs which contain the commit")),
 		OPT_END(),
 	};
 
+	memset(&array, 0, sizeof(array));
+	memset(&filter, 0, sizeof(filter));
+
 	parse_options(argc, argv, prefix, opts, for_each_ref_usage, 0);
 	if (maxcount < 0) {
 		error("invalid --count argument: `%d'", maxcount);
@@ -55,9 +67,8 @@
 	/* for warn_ambiguous_refs */
 	git_config(git_default_config, NULL);
 
-	memset(&array, 0, sizeof(array));
-	memset(&filter, 0, sizeof(filter));
 	filter.name_patterns = argv;
+	filter.match_as_path = 1;
 	filter_refs(&array, &filter, FILTER_REFS_ALL | FILTER_REFS_INCLUDE_BROKEN);
 	ref_array_sort(sorting, &array);
 
diff --git a/builtin/fsck.c b/builtin/fsck.c
index b9a74f0..55eac75 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -40,14 +40,6 @@
 #define ERROR_PACK 04
 #define ERROR_REFS 010
 
-#ifdef NO_D_INO_IN_DIRENT
-#define SORT_DIRENT 0
-#define DIRENT_SORT_HINT(de) 0
-#else
-#define SORT_DIRENT 1
-#define DIRENT_SORT_HINT(de) ((de)->d_ino)
-#endif
-
 static int fsck_config(const char *var, const char *value, void *cb)
 {
 	if (strcmp(var, "fsck.skiplist") == 0) {
@@ -75,7 +67,7 @@
 			const char *err)
 {
 	fprintf(stderr, "%s in %s %s: %s\n",
-		msg_type, typename(obj->type), sha1_to_hex(obj->sha1), err);
+		msg_type, typename(obj->type), oid_to_hex(&obj->oid), err);
 }
 
 static int objerror(struct object *obj, const char *err)
@@ -105,7 +97,7 @@
 	if (!obj) {
 		/* ... these references to parent->fld are safe here */
 		printf("broken link from %7s %s\n",
-			   typename(parent->type), sha1_to_hex(parent->sha1));
+			   typename(parent->type), oid_to_hex(&parent->oid));
 		printf("broken link from %7s %s\n",
 			   (type == OBJ_ANY ? "unknown" : typename(type)), "unknown");
 		errors_found |= ERROR_REACHABLE;
@@ -120,11 +112,11 @@
 		return 0;
 	obj->flags |= REACHABLE;
 	if (!(obj->flags & HAS_OBJ)) {
-		if (parent && !has_sha1_file(obj->sha1)) {
+		if (parent && !has_object_file(&obj->oid)) {
 			printf("broken link from %7s %s\n",
-				 typename(parent->type), sha1_to_hex(parent->sha1));
+				 typename(parent->type), oid_to_hex(&parent->oid));
 			printf("              to %7s %s\n",
-				 typename(obj->type), sha1_to_hex(obj->sha1));
+				 typename(obj->type), oid_to_hex(&obj->oid));
 			errors_found |= ERROR_REACHABLE;
 		}
 		return 1;
@@ -194,11 +186,11 @@
 	 * do a full fsck
 	 */
 	if (!(obj->flags & HAS_OBJ)) {
-		if (has_sha1_pack(obj->sha1))
+		if (has_sha1_pack(obj->oid.hash))
 			return; /* it is in pack - forget about it */
-		if (connectivity_only && has_sha1_file(obj->sha1))
+		if (connectivity_only && has_object_file(&obj->oid))
 			return;
-		printf("missing %s %s\n", typename(obj->type), sha1_to_hex(obj->sha1));
+		printf("missing %s %s\n", typename(obj->type), oid_to_hex(&obj->oid));
 		errors_found |= ERROR_REACHABLE;
 		return;
 	}
@@ -223,7 +215,7 @@
 	 * since this is something that is prunable.
 	 */
 	if (show_unreachable) {
-		printf("unreachable %s %s\n", typename(obj->type), sha1_to_hex(obj->sha1));
+		printf("unreachable %s %s\n", typename(obj->type), oid_to_hex(&obj->oid));
 		return;
 	}
 
@@ -242,11 +234,11 @@
 	if (!obj->used) {
 		if (show_dangling)
 			printf("dangling %s %s\n", typename(obj->type),
-			       sha1_to_hex(obj->sha1));
+			       oid_to_hex(&obj->oid));
 		if (write_lost_and_found) {
 			char *filename = git_pathdup("lost-found/%s/%s",
 				obj->type == OBJ_COMMIT ? "commit" : "other",
-				sha1_to_hex(obj->sha1));
+				oid_to_hex(&obj->oid));
 			FILE *f;
 
 			if (safe_create_leading_directories_const(filename)) {
@@ -257,10 +249,10 @@
 			if (!(f = fopen(filename, "w")))
 				die_errno("Could not open '%s'", filename);
 			if (obj->type == OBJ_BLOB) {
-				if (stream_blob_to_fd(fileno(f), obj->sha1, NULL, 1))
+				if (stream_blob_to_fd(fileno(f), obj->oid.hash, NULL, 1))
 					die_errno("Could not write '%s'", filename);
 			} else
-				fprintf(f, "%s\n", sha1_to_hex(obj->sha1));
+				fprintf(f, "%s\n", oid_to_hex(&obj->oid));
 			if (fclose(f))
 				die_errno("Could not finish '%s'",
 					  filename);
@@ -279,7 +271,7 @@
 static void check_object(struct object *obj)
 {
 	if (verbose)
-		fprintf(stderr, "Checking %s\n", sha1_to_hex(obj->sha1));
+		fprintf(stderr, "Checking %s\n", oid_to_hex(&obj->oid));
 
 	if (obj->flags & REACHABLE)
 		check_reachable_object(obj);
@@ -315,7 +307,7 @@
 
 	if (verbose)
 		fprintf(stderr, "Checking %s %s\n",
-			typename(obj->type), sha1_to_hex(obj->sha1));
+			typename(obj->type), oid_to_hex(&obj->oid));
 
 	if (fsck_walk(obj, NULL, &fsck_obj_options))
 		objerror(obj, "broken links");
@@ -334,15 +326,15 @@
 		free_commit_buffer(commit);
 
 		if (!commit->parents && show_root)
-			printf("root %s\n", sha1_to_hex(commit->object.sha1));
+			printf("root %s\n", oid_to_hex(&commit->object.oid));
 	}
 
 	if (obj->type == OBJ_TAG) {
 		struct tag *tag = (struct tag *) obj;
 
 		if (show_tags && tag->tagged) {
-			printf("tagged %s %s", typename(tag->tagged->type), sha1_to_hex(tag->tagged->sha1));
-			printf(" (%s) in %s\n", tag->tag, sha1_to_hex(tag->object.sha1));
+			printf("tagged %s %s", typename(tag->tagged->type), oid_to_hex(&tag->tagged->oid));
+			printf(" (%s) in %s\n", tag->tag, oid_to_hex(&tag->object.oid));
 		}
 	}
 
@@ -374,102 +366,6 @@
 	return fsck_obj(obj);
 }
 
-/*
- * This is the sorting chunk size: make it reasonably
- * big so that we can sort well..
- */
-#define MAX_SHA1_ENTRIES (1024)
-
-struct sha1_entry {
-	unsigned long ino;
-	unsigned char sha1[20];
-};
-
-static struct {
-	unsigned long nr;
-	struct sha1_entry *entry[MAX_SHA1_ENTRIES];
-} sha1_list;
-
-static int ino_compare(const void *_a, const void *_b)
-{
-	const struct sha1_entry *a = _a, *b = _b;
-	unsigned long ino1 = a->ino, ino2 = b->ino;
-	return ino1 < ino2 ? -1 : ino1 > ino2 ? 1 : 0;
-}
-
-static void fsck_sha1_list(void)
-{
-	int i, nr = sha1_list.nr;
-
-	if (SORT_DIRENT)
-		qsort(sha1_list.entry, nr,
-		      sizeof(struct sha1_entry *), ino_compare);
-	for (i = 0; i < nr; i++) {
-		struct sha1_entry *entry = sha1_list.entry[i];
-		unsigned char *sha1 = entry->sha1;
-
-		sha1_list.entry[i] = NULL;
-		if (fsck_sha1(sha1))
-			errors_found |= ERROR_OBJECT;
-		free(entry);
-	}
-	sha1_list.nr = 0;
-}
-
-static void add_sha1_list(unsigned char *sha1, unsigned long ino)
-{
-	struct sha1_entry *entry = xmalloc(sizeof(*entry));
-	int nr;
-
-	entry->ino = ino;
-	hashcpy(entry->sha1, sha1);
-	nr = sha1_list.nr;
-	if (nr == MAX_SHA1_ENTRIES) {
-		fsck_sha1_list();
-		nr = 0;
-	}
-	sha1_list.entry[nr] = entry;
-	sha1_list.nr = ++nr;
-}
-
-static inline int is_loose_object_file(struct dirent *de,
-				       char *name, unsigned char *sha1)
-{
-	if (strlen(de->d_name) != 38)
-		return 0;
-	memcpy(name + 2, de->d_name, 39);
-	return !get_sha1_hex(name, sha1);
-}
-
-static void fsck_dir(int i, char *path)
-{
-	DIR *dir = opendir(path);
-	struct dirent *de;
-	char name[100];
-
-	if (!dir)
-		return;
-
-	if (verbose)
-		fprintf(stderr, "Checking directory %s\n", path);
-
-	sprintf(name, "%02x", i);
-	while ((de = readdir(dir)) != NULL) {
-		unsigned char sha1[20];
-
-		if (is_dot_or_dotdot(de->d_name))
-			continue;
-		if (is_loose_object_file(de, name, sha1)) {
-			add_sha1_list(sha1, DIRENT_SORT_HINT(de));
-			continue;
-		}
-		if (starts_with(de->d_name, "tmp_obj_"))
-			continue;
-		fprintf(stderr, "bad sha1 file: %s/%s\n", path, de->d_name);
-	}
-	closedir(dir);
-}
-
 static int default_refs;
 
 static void fsck_handle_reflog_sha1(const char *refname, unsigned char *sha1)
@@ -559,9 +455,28 @@
 	}
 }
 
+static int fsck_loose(const unsigned char *sha1, const char *path, void *data)
+{
+	if (fsck_sha1(sha1))
+		errors_found |= ERROR_OBJECT;
+	return 0;
+}
+
+static int fsck_cruft(const char *basename, const char *path, void *data)
+{
+	if (!starts_with(basename, "tmp_obj_"))
+		fprintf(stderr, "bad sha1 file: %s\n", path);
+	return 0;
+}
+
+static int fsck_subdir(int nr, const char *path, void *progress)
+{
+	display_progress(progress, nr + 1);
+	return 0;
+}
+
 static void fsck_object_dir(const char *path)
 {
-	int i;
 	struct progress *progress = NULL;
 
 	if (verbose)
@@ -569,14 +484,11 @@
 
 	if (show_progress)
 		progress = start_progress(_("Checking object directories"), 256);
-	for (i = 0; i < 256; i++) {
-		static char dir[4096];
-		sprintf(dir, "%s/%02x", path, i);
-		fsck_dir(i, dir);
-		display_progress(progress, i+1);
-	}
+
+	for_each_loose_file_in_objdir(path, fsck_loose, fsck_cruft, fsck_subdir,
+				      progress);
+	display_progress(progress, 256);
 	stop_progress(&progress);
-	fsck_sha1_list();
 }
 
 static int fsck_head_link(void)
@@ -688,16 +600,18 @@
 	git_config(fsck_config, NULL);
 
 	fsck_head_link();
-	if (!connectivity_only)
+	if (!connectivity_only) {
 		fsck_object_dir(get_object_directory());
 
-	prepare_alt_odb();
-	for (alt = alt_odb_list; alt; alt = alt->next) {
-		char namebuf[PATH_MAX];
-		int namelen = alt->name - alt->base;
-		memcpy(namebuf, alt->base, namelen);
-		namebuf[namelen - 1] = 0;
-		fsck_object_dir(namebuf);
+		prepare_alt_odb();
+		for (alt = alt_odb_list; alt; alt = alt->next) {
+			/* directory name, minus trailing slash */
+			size_t namelen = alt->name - alt->base - 1;
+			struct strbuf name = STRBUF_INIT;
+			strbuf_add(&name, alt->base, namelen);
+			fsck_object_dir(name.buf);
+			strbuf_release(&name);
+		}
 	}
 
 	if (check_full) {
diff --git a/builtin/gc.c b/builtin/gc.c
index 42258fe..c583aad 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -233,7 +233,7 @@
 		return NULL;
 
 	if (gethostname(my_host, sizeof(my_host)))
-		strcpy(my_host, "unknown");
+		xsnprintf(my_host, sizeof(my_host), "unknown");
 
 	pidfile_path = git_pathdup("gc.pid");
 	fd = hold_lock_file_for_update(&lock, pidfile_path,
diff --git a/builtin/grep.c b/builtin/grep.c
index d04f440..65c0201 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -354,17 +354,17 @@
 static void run_pager(struct grep_opt *opt, const char *prefix)
 {
 	struct string_list *path_list = opt->output_priv;
-	const char **argv = xmalloc(sizeof(const char *) * (path_list->nr + 1));
+	struct child_process child = CHILD_PROCESS_INIT;
 	int i, status;
 
 	for (i = 0; i < path_list->nr; i++)
-		argv[i] = path_list->items[i].string;
-	argv[path_list->nr] = NULL;
+		argv_array_push(&child.args, path_list->items[i].string);
+	child.dir = prefix;
+	child.use_shell = 1;
 
-	status = run_command_v_opt_cd_env(argv, RUN_USING_SHELL, prefix, NULL);
+	status = run_command(&child);
 	if (status)
 		exit(status);
-	free(argv);
 }
 
 static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int cached)
@@ -375,7 +375,7 @@
 
 	for (nr = 0; nr < active_nr; nr++) {
 		const struct cache_entry *ce = active_cache[nr];
-		if (!S_ISREG(ce->ce_mode))
+		if (!S_ISREG(ce->ce_mode) || ce_intent_to_add(ce))
 			continue;
 		if (!ce_path_match(ce, pathspec, NULL))
 			continue;
@@ -459,7 +459,7 @@
 		       struct object *obj, const char *name, const char *path)
 {
 	if (obj->type == OBJ_BLOB)
-		return grep_sha1(opt, obj->sha1, name, 0, path);
+		return grep_sha1(opt, obj->oid.hash, name, 0, path);
 	if (obj->type == OBJ_COMMIT || obj->type == OBJ_TREE) {
 		struct tree_desc tree;
 		void *data;
@@ -468,12 +468,12 @@
 		int hit, len;
 
 		grep_read_lock();
-		data = read_object_with_reference(obj->sha1, tree_type,
+		data = read_object_with_reference(obj->oid.hash, tree_type,
 						  &size, NULL);
 		grep_read_unlock();
 
 		if (!data)
-			die(_("unable to read tree (%s)"), sha1_to_hex(obj->sha1));
+			die(_("unable to read tree (%s)"), oid_to_hex(&obj->oid));
 
 		len = name ? strlen(name) : 0;
 		strbuf_init(&base, PATH_MAX + len + 1);
@@ -612,11 +612,6 @@
 	return 0;
 }
 
-static int help_callback(const struct option *opt, const char *arg, int unset)
-{
-	return -1;
-}
-
 int cmd_grep(int argc, const char **argv, const char *prefix)
 {
 	int hit = 0;
@@ -738,18 +733,9 @@
 			PARSE_OPT_OPTARG, NULL, (intptr_t)default_pager },
 		OPT_BOOL(0, "ext-grep", &external_grep_allowed__ignored,
 			 N_("allow calling of grep(1) (ignored by this build)")),
-		{ OPTION_CALLBACK, 0, "help-all", NULL, NULL, N_("show usage"),
-		  PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, help_callback },
 		OPT_END()
 	};
 
-	/*
-	 * 'git grep -h', unlike 'git grep -h <pattern>', is a request
-	 * to show usage information and exit.
-	 */
-	if (argc == 2 && !strcmp(argv[1], "-h"))
-		usage_with_options(grep_usage, options);
-
 	init_grep_defaults();
 	git_config(grep_cmd_config, NULL);
 	grep_init(&opt, prefix);
@@ -766,8 +752,7 @@
 	 */
 	argc = parse_options(argc, argv, prefix, options, grep_usage,
 			     PARSE_OPT_KEEP_DASHDASH |
-			     PARSE_OPT_STOP_AT_NON_OPTION |
-			     PARSE_OPT_NO_INTERNAL_HELP);
+			     PARSE_OPT_STOP_AT_NON_OPTION);
 	grep_commit_pattern_type(pattern_type_arg, &opt);
 
 	if (use_index && !startup_info->have_repository)
diff --git a/builtin/help.c b/builtin/help.c
index 3422e73..3c55ce4 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -140,17 +140,10 @@
 
 		/* It's simpler to launch konqueror using kfmclient. */
 		if (path) {
-			const char *file = strrchr(path, '/');
-			if (file && !strcmp(file + 1, "konqueror")) {
-				char *new = xstrdup(path);
-				char *dest = strrchr(new, '/');
-
-				/* strlen("konqueror") == strlen("kfmclient") */
-				strcpy(dest + 1, "kfmclient");
-				path = new;
-			}
-			if (file)
-				filename = file;
+			size_t len;
+			if (strip_suffix(path, "/konqueror", &len))
+				path = xstrfmt("%.*s/kfmclient", (int)len, path);
+			filename = basename((char *)path);
 		} else
 			path = "kfmclient";
 		strbuf_addf(&man_page, "man:%s(1)", page);
@@ -178,12 +171,10 @@
 static void add_man_viewer(const char *name)
 {
 	struct man_viewer_list **p = &man_viewer_list;
-	size_t len = strlen(name);
 
 	while (*p)
 		p = &((*p)->next);
-	*p = xcalloc(1, (sizeof(**p) + len + 1));
-	strncpy((*p)->name, name, len);
+	FLEX_ALLOC_STR(*p, name, name);
 }
 
 static int supported_man_viewer(const char *name, size_t len)
@@ -197,9 +188,8 @@
 				   size_t len,
 				   const char *value)
 {
-	struct man_viewer_info_list *new = xcalloc(1, sizeof(*new) + len + 1);
-
-	strncpy(new->name, name, len);
+	struct man_viewer_info_list *new;
+	FLEX_ALLOC_MEM(new, name, name, len);
 	new->info = xstrdup(value);
 	new->next = man_viewer_info_list;
 	man_viewer_info_list = new;
@@ -295,16 +285,6 @@
 		is_in_cmdlist(&other_cmds, s);
 }
 
-static const char *prepend(const char *prefix, const char *cmd)
-{
-	size_t pre_len = strlen(prefix);
-	size_t cmd_len = strlen(cmd);
-	char *p = xmalloc(pre_len + cmd_len + 1);
-	memcpy(p, prefix, pre_len);
-	strcpy(p + pre_len, cmd);
-	return p;
-}
-
 static const char *cmd_to_page(const char *git_cmd)
 {
 	if (!git_cmd)
@@ -312,9 +292,9 @@
 	else if (starts_with(git_cmd, "git"))
 		return git_cmd;
 	else if (is_git_command(git_cmd))
-		return prepend("git-", git_cmd);
+		return xstrfmt("git-%s", git_cmd);
 	else
-		return prepend("git", git_cmd);
+		return xstrfmt("git%s", git_cmd);
 }
 
 static void setup_man_path(void)
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 3431de2..4524519 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -199,7 +199,7 @@
 		return -1;
 
 	if (type != OBJ_ANY && obj->type != type)
-		die(_("object type mismatch at %s"), sha1_to_hex(obj->sha1));
+		die(_("object type mismatch at %s"), oid_to_hex(&obj->oid));
 
 	obj->flags |= FLAG_LINK;
 	return 0;
@@ -217,13 +217,13 @@
 
 	if (!(obj->flags & FLAG_CHECKED)) {
 		unsigned long size;
-		int type = sha1_object_info(obj->sha1, &size);
+		int type = sha1_object_info(obj->oid.hash, &size);
 		if (type <= 0)
 			die(_("did not receive expected object %s"),
-			      sha1_to_hex(obj->sha1));
+			      oid_to_hex(&obj->oid));
 		if (type != obj->type)
 			die(_("object %s: expected type %s, found %s"),
-			    sha1_to_hex(obj->sha1),
+			    oid_to_hex(&obj->oid),
 			    typename(obj->type), typename(type));
 		obj->flags |= FLAG_CHECKED;
 		return 1;
@@ -441,7 +441,7 @@
 	int hdrlen;
 
 	if (!is_delta_type(type)) {
-		hdrlen = sprintf(hdr, "%s %lu", typename(type), size) + 1;
+		hdrlen = xsnprintf(hdr, sizeof(hdr), "%s %lu", typename(type), size) + 1;
 		git_SHA1_Init(&c);
 		git_SHA1_Update(&c, hdr, hdrlen);
 	} else
@@ -842,7 +842,7 @@
 			    fsck_object(obj, buf, size, &fsck_options))
 				die(_("Error in object"));
 			if (fsck_walk(obj, NULL, &fsck_options))
-				die(_("Not all child objects of %s are reachable"), sha1_to_hex(obj->sha1));
+				die(_("Not all child objects of %s are reachable"), oid_to_hex(&obj->oid));
 
 			if (obj->type == OBJ_TREE) {
 				struct tree *item = (struct tree *) obj;
@@ -1346,7 +1346,7 @@
 	 * before deltas depending on them, a good heuristic is to start
 	 * resolving deltas in the same order as their position in the pack.
 	 */
-	sorted_by_pos = xmalloc(nr_ref_deltas * sizeof(*sorted_by_pos));
+	ALLOC_ARRAY(sorted_by_pos, nr_ref_deltas);
 	for (i = 0; i < nr_ref_deltas; i++)
 		sorted_by_pos[i] = &ref_deltas[i];
 	qsort(sorted_by_pos, nr_ref_deltas, sizeof(*sorted_by_pos), delta_pos_compare);
@@ -1514,6 +1514,7 @@
 		if (!(off & 0x80000000))
 			continue;
 		off = off & 0x7fffffff;
+		check_pack_index_ptr(p, &idx2[off * 2]);
 		if (idx2[off * 2])
 			continue;
 		/*
@@ -1744,9 +1745,9 @@
 
 	curr_pack = open_pack_file(pack_name);
 	parse_pack_header();
-	objects = xcalloc(nr_objects + 1, sizeof(struct object_entry));
+	objects = xcalloc(st_add(nr_objects, 1), sizeof(struct object_entry));
 	if (show_stat)
-		obj_stat = xcalloc(nr_objects + 1, sizeof(struct object_stat));
+		obj_stat = xcalloc(st_add(nr_objects, 1), sizeof(struct object_stat));
 	ofs_deltas = xcalloc(nr_objects, sizeof(struct ofs_delta_entry));
 	parse_pack_objects(pack_sha1);
 	resolve_deltas();
@@ -1759,7 +1760,7 @@
 	if (show_stat)
 		show_pack_info(stat_only);
 
-	idx_objects = xmalloc((nr_objects) * sizeof(struct pack_idx_entry *));
+	ALLOC_ARRAY(idx_objects, nr_objects);
 	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_sha1);
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 69323e1..6223b7d 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -24,22 +24,11 @@
 static const char *init_db_template_dir;
 static const char *git_link;
 
-static void safe_create_dir(const char *dir, int share)
-{
-	if (mkdir(dir, 0777) < 0) {
-		if (errno != EEXIST) {
-			perror(dir);
-			exit(1);
-		}
-	}
-	else if (share && adjust_shared_perm(dir))
-		die(_("Could not make %s writable by group"), dir);
-}
-
-static void copy_templates_1(char *path, int baselen,
-			     char *template, int template_baselen,
+static void copy_templates_1(struct strbuf *path, struct strbuf *template,
 			     DIR *dir)
 {
+	size_t path_baselen = path->len;
+	size_t template_baselen = template->len;
 	struct dirent *de;
 
 	/* Note: if ".git/hooks" file exists in the repository being
@@ -49,77 +38,64 @@
 	 * with the way the namespace under .git/ is organized, should
 	 * be really carefully chosen.
 	 */
-	safe_create_dir(path, 1);
+	safe_create_dir(path->buf, 1);
 	while ((de = readdir(dir)) != NULL) {
 		struct stat st_git, st_template;
-		int namelen;
 		int exists = 0;
 
+		strbuf_setlen(path, path_baselen);
+		strbuf_setlen(template, template_baselen);
+
 		if (de->d_name[0] == '.')
 			continue;
-		namelen = strlen(de->d_name);
-		if ((PATH_MAX <= baselen + namelen) ||
-		    (PATH_MAX <= template_baselen + namelen))
-			die(_("insanely long template name %s"), de->d_name);
-		memcpy(path + baselen, de->d_name, namelen+1);
-		memcpy(template + template_baselen, de->d_name, namelen+1);
-		if (lstat(path, &st_git)) {
+		strbuf_addstr(path, de->d_name);
+		strbuf_addstr(template, de->d_name);
+		if (lstat(path->buf, &st_git)) {
 			if (errno != ENOENT)
-				die_errno(_("cannot stat '%s'"), path);
+				die_errno(_("cannot stat '%s'"), path->buf);
 		}
 		else
 			exists = 1;
 
-		if (lstat(template, &st_template))
-			die_errno(_("cannot stat template '%s'"), template);
+		if (lstat(template->buf, &st_template))
+			die_errno(_("cannot stat template '%s'"), template->buf);
 
 		if (S_ISDIR(st_template.st_mode)) {
-			DIR *subdir = opendir(template);
-			int baselen_sub = baselen + namelen;
-			int template_baselen_sub = template_baselen + namelen;
+			DIR *subdir = opendir(template->buf);
 			if (!subdir)
-				die_errno(_("cannot opendir '%s'"), template);
-			path[baselen_sub++] =
-				template[template_baselen_sub++] = '/';
-			path[baselen_sub] =
-				template[template_baselen_sub] = 0;
-			copy_templates_1(path, baselen_sub,
-					 template, template_baselen_sub,
-					 subdir);
+				die_errno(_("cannot opendir '%s'"), template->buf);
+			strbuf_addch(path, '/');
+			strbuf_addch(template, '/');
+			copy_templates_1(path, template, subdir);
 			closedir(subdir);
 		}
 		else if (exists)
 			continue;
 		else if (S_ISLNK(st_template.st_mode)) {
-			char lnk[256];
-			int len;
-			len = readlink(template, lnk, sizeof(lnk));
-			if (len < 0)
-				die_errno(_("cannot readlink '%s'"), template);
-			if (sizeof(lnk) <= len)
-				die(_("insanely long symlink %s"), template);
-			lnk[len] = 0;
-			if (symlink(lnk, path))
-				die_errno(_("cannot symlink '%s' '%s'"), lnk, path);
+			struct strbuf lnk = STRBUF_INIT;
+			if (strbuf_readlink(&lnk, template->buf, 0) < 0)
+				die_errno(_("cannot readlink '%s'"), template->buf);
+			if (symlink(lnk.buf, path->buf))
+				die_errno(_("cannot symlink '%s' '%s'"),
+					  lnk.buf, path->buf);
+			strbuf_release(&lnk);
 		}
 		else if (S_ISREG(st_template.st_mode)) {
-			if (copy_file(path, template, st_template.st_mode))
-				die_errno(_("cannot copy '%s' to '%s'"), template,
-					  path);
+			if (copy_file(path->buf, template->buf, st_template.st_mode))
+				die_errno(_("cannot copy '%s' to '%s'"),
+					  template->buf, path->buf);
 		}
 		else
-			error(_("ignoring template %s"), template);
+			error(_("ignoring template %s"), template->buf);
 	}
 }
 
 static void copy_templates(const char *template_dir)
 {
-	char path[PATH_MAX];
-	char template_path[PATH_MAX];
-	int template_len;
+	struct strbuf path = STRBUF_INIT;
+	struct strbuf template_path = STRBUF_INIT;
+	size_t template_len;
 	DIR *dir;
-	const char *git_dir = get_git_dir();
-	int len = strlen(git_dir);
 	char *to_free = NULL;
 
 	if (!template_dir)
@@ -132,26 +108,23 @@
 		free(to_free);
 		return;
 	}
-	template_len = strlen(template_dir);
-	if (PATH_MAX <= (template_len+strlen("/config")))
-		die(_("insanely long template path %s"), template_dir);
-	strcpy(template_path, template_dir);
-	if (template_path[template_len-1] != '/') {
-		template_path[template_len++] = '/';
-		template_path[template_len] = 0;
-	}
-	dir = opendir(template_path);
+
+	strbuf_addstr(&template_path, template_dir);
+	strbuf_complete(&template_path, '/');
+	template_len = template_path.len;
+
+	dir = opendir(template_path.buf);
 	if (!dir) {
 		warning(_("templates not found %s"), template_dir);
 		goto free_return;
 	}
 
 	/* Make sure that template is from the correct vintage */
-	strcpy(template_path + template_len, "config");
+	strbuf_addstr(&template_path, "config");
 	repository_format_version = 0;
 	git_config_from_file(check_repository_format_version,
-			     template_path, NULL);
-	template_path[template_len] = 0;
+			     template_path.buf, NULL);
+	strbuf_setlen(&template_path, template_len);
 
 	if (repository_format_version &&
 	    repository_format_version != GIT_REPO_VERSION) {
@@ -162,17 +135,15 @@
 		goto close_free_return;
 	}
 
-	memcpy(path, git_dir, len);
-	if (len && path[len - 1] != '/')
-		path[len++] = '/';
-	path[len] = 0;
-	copy_templates_1(path, len,
-			 template_path, template_len,
-			 dir);
+	strbuf_addstr(&path, get_git_dir());
+	strbuf_complete(&path, '/');
+	copy_templates_1(&path, &template_path, dir);
 close_free_return:
 	closedir(dir);
 free_return:
 	free(to_free);
+	strbuf_release(&path);
+	strbuf_release(&template_path);
 }
 
 static int git_init_db_config(const char *k, const char *v, void *cb)
@@ -199,28 +170,20 @@
 
 static int create_default_files(const char *template_path)
 {
-	const char *git_dir = get_git_dir();
-	unsigned len = strlen(git_dir);
-	static char path[PATH_MAX];
 	struct stat st1;
+	struct strbuf buf = STRBUF_INIT;
+	char *path;
 	char repo_version_string[10];
 	char junk[2];
 	int reinit;
 	int filemode;
 
-	if (len > sizeof(path)-50)
-		die(_("insane git directory %s"), git_dir);
-	memcpy(path, git_dir, len);
-
-	if (len && path[len-1] != '/')
-		path[len++] = '/';
-
 	/*
 	 * Create .git/refs/{heads,tags}
 	 */
-	safe_create_dir(git_path("refs"), 1);
-	safe_create_dir(git_path("refs/heads"), 1);
-	safe_create_dir(git_path("refs/tags"), 1);
+	safe_create_dir(git_path_buf(&buf, "refs"), 1);
+	safe_create_dir(git_path_buf(&buf, "refs/heads"), 1);
+	safe_create_dir(git_path_buf(&buf, "refs/tags"), 1);
 
 	/* Just look for `init.templatedir` */
 	git_config(git_init_db_config, NULL);
@@ -244,16 +207,16 @@
 	 */
 	if (shared_repository) {
 		adjust_shared_perm(get_git_dir());
-		adjust_shared_perm(git_path("refs"));
-		adjust_shared_perm(git_path("refs/heads"));
-		adjust_shared_perm(git_path("refs/tags"));
+		adjust_shared_perm(git_path_buf(&buf, "refs"));
+		adjust_shared_perm(git_path_buf(&buf, "refs/heads"));
+		adjust_shared_perm(git_path_buf(&buf, "refs/tags"));
 	}
 
 	/*
 	 * Create the default symlink from ".git/HEAD" to the "master"
 	 * branch, if it does not exist yet.
 	 */
-	strcpy(path + len, "HEAD");
+	path = git_path_buf(&buf, "HEAD");
 	reinit = (!access(path, R_OK)
 		  || readlink(path, junk, sizeof(junk)-1) != -1);
 	if (!reinit) {
@@ -262,13 +225,12 @@
 	}
 
 	/* This forces creation of new config file */
-	sprintf(repo_version_string, "%d", GIT_REPO_VERSION);
+	xsnprintf(repo_version_string, sizeof(repo_version_string),
+		  "%d", GIT_REPO_VERSION);
 	git_config_set("core.repositoryformatversion", repo_version_string);
 
-	path[len] = 0;
-	strcpy(path + len, "config");
-
 	/* Check filemode trustability */
+	path = git_path_buf(&buf, "config");
 	filemode = TEST_FILEMODE;
 	if (TEST_FILEMODE && !lstat(path, &st1)) {
 		struct stat st2;
@@ -288,15 +250,14 @@
 		git_config_set("core.bare", "false");
 		/* allow template config file to override the default */
 		if (log_all_ref_updates == -1)
-		    git_config_set("core.logallrefupdates", "true");
-		if (needs_work_tree_config(git_dir, work_tree))
+			git_config_set("core.logallrefupdates", "true");
+		if (needs_work_tree_config(get_git_dir(), work_tree))
 			git_config_set("core.worktree", work_tree);
 	}
 
 	if (!reinit) {
 		/* Check if symlink is supported in the work tree */
-		path[len] = 0;
-		strcpy(path + len, "tXXXXXX");
+		path = git_path_buf(&buf, "tXXXXXX");
 		if (!close(xmkstemp(path)) &&
 		    !unlink(path) &&
 		    !symlink("testing", path) &&
@@ -307,31 +268,35 @@
 			git_config_set("core.symlinks", "false");
 
 		/* Check if the filesystem is case-insensitive */
-		path[len] = 0;
-		strcpy(path + len, "CoNfIg");
+		path = git_path_buf(&buf, "CoNfIg");
 		if (!access(path, F_OK))
 			git_config_set("core.ignorecase", "true");
-		probe_utf8_pathname_composition(path, len);
+		probe_utf8_pathname_composition();
 	}
 
+	strbuf_release(&buf);
 	return reinit;
 }
 
 static void create_object_directory(void)
 {
-	const char *object_directory = get_object_directory();
-	int len = strlen(object_directory);
-	char *path = xmalloc(len + 40);
+	struct strbuf path = STRBUF_INIT;
+	size_t baselen;
 
-	memcpy(path, object_directory, len);
+	strbuf_addstr(&path, get_object_directory());
+	baselen = path.len;
 
-	safe_create_dir(object_directory, 1);
-	strcpy(path+len, "/pack");
-	safe_create_dir(path, 1);
-	strcpy(path+len, "/info");
-	safe_create_dir(path, 1);
+	safe_create_dir(path.buf, 1);
 
-	free(path);
+	strbuf_setlen(&path, baselen);
+	strbuf_addstr(&path, "/pack");
+	safe_create_dir(path.buf, 1);
+
+	strbuf_setlen(&path, baselen);
+	strbuf_addstr(&path, "/info");
+	safe_create_dir(path.buf, 1);
+
+	strbuf_release(&path);
 }
 
 int set_git_dir_init(const char *git_dir, const char *real_git_dir,
@@ -414,13 +379,13 @@
 		 */
 		if (shared_repository < 0)
 			/* force to the mode value */
-			sprintf(buf, "0%o", -shared_repository);
+			xsnprintf(buf, sizeof(buf), "0%o", -shared_repository);
 		else if (shared_repository == PERM_GROUP)
-			sprintf(buf, "%d", OLD_PERM_GROUP);
+			xsnprintf(buf, sizeof(buf), "%d", OLD_PERM_GROUP);
 		else if (shared_repository == PERM_EVERYBODY)
-			sprintf(buf, "%d", OLD_PERM_EVERYBODY);
+			xsnprintf(buf, sizeof(buf), "%d", OLD_PERM_EVERYBODY);
 		else
-			die("oops");
+			die("BUG: invalid value for shared_repository");
 		git_config_set("core.sharedrepository", buf);
 		git_config_set("receive.denyNonFastforwards", "true");
 	}
diff --git a/builtin/log.c b/builtin/log.c
index a491d3d..e00cea7 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -552,7 +552,7 @@
 		const char *name = objects[i].name;
 		switch (o->type) {
 		case OBJ_BLOB:
-			ret = show_blob_object(o->sha1, &rev, name);
+			ret = show_blob_object(o->oid.hash, &rev, name);
 			break;
 		case OBJ_TAG: {
 			struct tag *t = (struct tag *)o;
@@ -563,14 +563,14 @@
 					diff_get_color_opt(&rev.diffopt, DIFF_COMMIT),
 					t->tag,
 					diff_get_color_opt(&rev.diffopt, DIFF_RESET));
-			ret = show_tag_object(o->sha1, &rev);
+			ret = show_tag_object(o->oid.hash, &rev);
 			rev.shown_one = 1;
 			if (ret)
 				break;
-			o = parse_object(t->tagged->sha1);
+			o = parse_object(t->tagged->oid.hash);
 			if (!o)
 				ret = error(_("Could not read object %s"),
-					    sha1_to_hex(t->tagged->sha1));
+					    oid_to_hex(&t->tagged->oid));
 			objects[i].item = o;
 			i--;
 			break;
@@ -796,8 +796,7 @@
 		if (filename.len >=
 		    PATH_MAX - FORMAT_PATCH_NAME_MAX - suffix_len)
 			return error(_("name of output directory is too long"));
-		if (filename.buf[filename.len - 1] != '/')
-			strbuf_addch(&filename, '/');
+		strbuf_complete(&filename, '/');
 	}
 
 	if (rev->numbered_files)
@@ -831,8 +830,8 @@
 	o2 = rev->pending.objects[1].item;
 	flags1 = o1->flags;
 	flags2 = o2->flags;
-	c1 = lookup_commit_reference(o1->sha1);
-	c2 = lookup_commit_reference(o2->sha1);
+	c1 = lookup_commit_reference(o1->oid.hash);
+	c2 = lookup_commit_reference(o2->oid.hash);
 
 	if ((flags1 & UNINTERESTING) == (flags2 & UNINTERESTING))
 		die(_("Not a range."));
@@ -897,8 +896,8 @@
 static char *find_branch_name(struct rev_info *rev)
 {
 	int i, positive = -1;
-	unsigned char branch_sha1[20];
-	const unsigned char *tip_sha1;
+	struct object_id branch_oid;
+	const struct object_id *tip_oid;
 	const char *ref, *v;
 	char *full_ref, *branch = NULL;
 
@@ -913,10 +912,10 @@
 	if (positive < 0)
 		return NULL;
 	ref = rev->cmdline.rev[positive].name;
-	tip_sha1 = rev->cmdline.rev[positive].item->sha1;
-	if (dwim_ref(ref, strlen(ref), branch_sha1, &full_ref) &&
+	tip_oid = &rev->cmdline.rev[positive].item->oid;
+	if (dwim_ref(ref, strlen(ref), branch_oid.hash, &full_ref) &&
 	    skip_prefix(full_ref, "refs/heads/", &v) &&
-	    !hashcmp(tip_sha1, branch_sha1))
+	    !oidcmp(tip_oid, &branch_oid))
 		branch = xstrdup(v);
 	free(full_ref);
 	return branch;
@@ -994,8 +993,8 @@
 
 	diff_setup_done(&opts);
 
-	diff_tree_sha1(origin->tree->object.sha1,
-		       head->tree->object.sha1,
+	diff_tree_sha1(origin->tree->object.oid.hash,
+		       head->tree->object.oid.hash,
 		       "", &opts);
 	diffcore_std(&opts);
 	diff_flush(&opts);
@@ -1197,6 +1196,7 @@
 	int cover_letter = -1;
 	int boundary_count = 0;
 	int no_binary_diff = 0;
+	int zero_commit = 0;
 	struct commit *origin = NULL;
 	const char *in_reply_to = NULL;
 	struct patch_ids ids;
@@ -1237,6 +1237,8 @@
 			    PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback },
 		OPT_BOOL(0, "no-binary", &no_binary_diff,
 			 N_("don't output binary diffs")),
+		OPT_BOOL(0, "zero-commit", &zero_commit,
+			 N_("output all-zero hash in From header")),
 		OPT_BOOL(0, "ignore-if-in-upstream", &ignore_if_in_upstream,
 			 N_("don't include a patch matching a commit upstream")),
 		{ OPTION_SET_INT, 'p', "no-stat", &use_patch_format, NULL,
@@ -1381,6 +1383,8 @@
 	/* Always generate a patch */
 	rev.diffopt.output_format |= DIFF_FORMAT_PATCH;
 
+	rev.zero_commit = zero_commit;
+
 	if (!DIFF_OPT_TST(&rev.diffopt, TEXT) && !no_binary_diff)
 		DIFF_OPT_SET(&rev.diffopt, BINARY);
 
@@ -1444,7 +1448,7 @@
 		/* Don't say anything if head and upstream are the same. */
 		if (rev.pending.nr == 2) {
 			struct object_array_entry *o = rev.pending.objects;
-			if (hashcmp(o[0].item->sha1, o[1].item->sha1) == 0)
+			if (oidcmp(&o[0].item->oid, &o[1].item->oid) == 0)
 				return 0;
 		}
 		get_patch_ids(&rev, &ids);
@@ -1551,7 +1555,7 @@
 					string_list_append(rev.ref_message_ids,
 							   rev.message_id);
 			}
-			gen_message_id(&rev, sha1_to_hex(commit->object.sha1));
+			gen_message_id(&rev, oid_to_hex(&commit->object.oid));
 		}
 
 		if (!use_stdout &&
@@ -1613,12 +1617,12 @@
 {
 	if (!verbose) {
 		printf("%c %s\n", sign,
-		       find_unique_abbrev(commit->object.sha1, abbrev));
+		       find_unique_abbrev(commit->object.oid.hash, abbrev));
 	} else {
 		struct strbuf buf = STRBUF_INIT;
 		pp_commit_easy(CMIT_FMT_ONELINE, commit, &buf);
 		printf("%c %s %s\n", sign,
-		       find_unique_abbrev(commit->object.sha1, abbrev),
+		       find_unique_abbrev(commit->object.oid.hash, abbrev),
 		       buf.buf);
 		strbuf_release(&buf);
 	}
@@ -1676,7 +1680,7 @@
 	/* Don't say anything if head and upstream are the same. */
 	if (revs.pending.nr == 2) {
 		struct object_array_entry *o = revs.pending.objects;
-		if (hashcmp(o[0].item->sha1, o[1].item->sha1) == 0)
+		if (oidcmp(&o[0].item->oid, &o[1].item->oid) == 0)
 			return 0;
 	}
 
diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c
index 5e9d545..fa65a84 100644
--- a/builtin/ls-remote.c
+++ b/builtin/ls-remote.c
@@ -93,12 +93,8 @@
 	if (argv[i]) {
 		int j;
 		pattern = xcalloc(argc - i + 1, sizeof(const char *));
-		for (j = i; j < argc; j++) {
-			int len = strlen(argv[j]);
-			char *p = xmalloc(len + 3);
-			sprintf(p, "*/%s", argv[j]);
-			pattern[j - i] = p;
-		}
+		for (j = i; j < argc; j++)
+			pattern[j - i] = xstrfmt("*/%s", argv[j]);
 	}
 	remote = remote_get(dest);
 	if (!remote) {
@@ -129,7 +125,7 @@
 			continue;
 		if (!tail_match(pattern, ref->name))
 			continue;
-		printf("%s	%s\n", sha1_to_hex(ref->old_sha1), ref->name);
+		printf("%s	%s\n", oid_to_hex(&ref->old_oid), ref->name);
 		status = 0; /* we found something */
 	}
 	return status;
diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c
index 3b04a0f..0e30d86 100644
--- a/builtin/ls-tree.c
+++ b/builtin/ls-tree.c
@@ -96,12 +96,13 @@
 			if (!strcmp(type, blob_type)) {
 				unsigned long size;
 				if (sha1_object_info(sha1, &size) == OBJ_BAD)
-					strcpy(size_text, "BAD");
+					xsnprintf(size_text, sizeof(size_text),
+						  "BAD");
 				else
-					snprintf(size_text, sizeof(size_text),
-						 "%lu", size);
+					xsnprintf(size_text, sizeof(size_text),
+						  "%lu", size);
 			} else
-				strcpy(size_text, "-");
+				xsnprintf(size_text, sizeof(size_text), "-");
 			printf("%06o %s %s %7s\t", mode, type,
 			       find_unique_abbrev(sha1, abbrev),
 			       size_text);
diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c
index 999a525..f6df274 100644
--- a/builtin/mailinfo.c
+++ b/builtin/mailinfo.c
@@ -6,1029 +6,7 @@
 #include "builtin.h"
 #include "utf8.h"
 #include "strbuf.h"
-
-static FILE *cmitmsg, *patchfile, *fin, *fout;
-
-static int keep_subject;
-static int keep_non_patch_brackets_in_subject;
-static const char *metainfo_charset;
-static struct strbuf line = STRBUF_INIT;
-static struct strbuf name = STRBUF_INIT;
-static struct strbuf email = STRBUF_INIT;
-static char *message_id;
-
-static enum  {
-	TE_DONTCARE, TE_QP, TE_BASE64
-} transfer_encoding;
-
-static struct strbuf charset = STRBUF_INIT;
-static int patch_lines;
-static struct strbuf **p_hdr_data, **s_hdr_data;
-static int use_scissors;
-static int add_message_id;
-static int use_inbody_headers = 1;
-
-#define MAX_HDR_PARSED 10
-#define MAX_BOUNDARIES 5
-
-static void cleanup_space(struct strbuf *sb);
-
-
-static void get_sane_name(struct strbuf *out, struct strbuf *name, struct strbuf *email)
-{
-	struct strbuf *src = name;
-	if (name->len < 3 || 60 < name->len || strchr(name->buf, '@') ||
-		strchr(name->buf, '<') || strchr(name->buf, '>'))
-		src = email;
-	else if (name == out)
-		return;
-	strbuf_reset(out);
-	strbuf_addbuf(out, src);
-}
-
-static void parse_bogus_from(const struct strbuf *line)
-{
-	/* John Doe <johndoe> */
-
-	char *bra, *ket;
-	/* This is fallback, so do not bother if we already have an
-	 * e-mail address.
-	 */
-	if (email.len)
-		return;
-
-	bra = strchr(line->buf, '<');
-	if (!bra)
-		return;
-	ket = strchr(bra, '>');
-	if (!ket)
-		return;
-
-	strbuf_reset(&email);
-	strbuf_add(&email, bra + 1, ket - bra - 1);
-
-	strbuf_reset(&name);
-	strbuf_add(&name, line->buf, bra - line->buf);
-	strbuf_trim(&name);
-	get_sane_name(&name, &name, &email);
-}
-
-static void handle_from(const struct strbuf *from)
-{
-	char *at;
-	size_t el;
-	struct strbuf f;
-
-	strbuf_init(&f, from->len);
-	strbuf_addbuf(&f, from);
-
-	at = strchr(f.buf, '@');
-	if (!at) {
-		parse_bogus_from(from);
-		return;
-	}
-
-	/*
-	 * If we already have one email, don't take any confusing lines
-	 */
-	if (email.len && strchr(at + 1, '@')) {
-		strbuf_release(&f);
-		return;
-	}
-
-	/* Pick up the string around '@', possibly delimited with <>
-	 * pair; that is the email part.
-	 */
-	while (at > f.buf) {
-		char c = at[-1];
-		if (isspace(c))
-			break;
-		if (c == '<') {
-			at[-1] = ' ';
-			break;
-		}
-		at--;
-	}
-	el = strcspn(at, " \n\t\r\v\f>");
-	strbuf_reset(&email);
-	strbuf_add(&email, at, el);
-	strbuf_remove(&f, at - f.buf, el + (at[el] ? 1 : 0));
-
-	/* The remainder is name.  It could be
-	 *
-	 * - "John Doe <john.doe@xz>"			(a), or
-	 * - "john.doe@xz (John Doe)"			(b), or
-	 * - "John (zzz) Doe <john.doe@xz> (Comment)"	(c)
-	 *
-	 * but we have removed the email part, so
-	 *
-	 * - remove extra spaces which could stay after email (case 'c'), and
-	 * - trim from both ends, possibly removing the () pair at the end
-	 *   (cases 'a' and 'b').
-	 */
-	cleanup_space(&f);
-	strbuf_trim(&f);
-	if (f.buf[0] == '(' && f.len && f.buf[f.len - 1] == ')') {
-		strbuf_remove(&f, 0, 1);
-		strbuf_setlen(&f, f.len - 1);
-	}
-
-	get_sane_name(&name, &f, &email);
-	strbuf_release(&f);
-}
-
-static void handle_header(struct strbuf **out, const struct strbuf *line)
-{
-	if (!*out) {
-		*out = xmalloc(sizeof(struct strbuf));
-		strbuf_init(*out, line->len);
-	} else
-		strbuf_reset(*out);
-
-	strbuf_addbuf(*out, line);
-}
-
-/* NOTE NOTE NOTE.  We do not claim we do full MIME.  We just attempt
- * to have enough heuristics to grok MIME encoded patches often found
- * on our mailing lists.  For example, we do not even treat header lines
- * case insensitively.
- */
-
-static int slurp_attr(const char *line, const char *name, struct strbuf *attr)
-{
-	const char *ends, *ap = strcasestr(line, name);
-	size_t sz;
-
-	strbuf_setlen(attr, 0);
-	if (!ap)
-		return 0;
-	ap += strlen(name);
-	if (*ap == '"') {
-		ap++;
-		ends = "\"";
-	}
-	else
-		ends = "; \t";
-	sz = strcspn(ap, ends);
-	strbuf_add(attr, ap, sz);
-	return 1;
-}
-
-static struct strbuf *content[MAX_BOUNDARIES];
-
-static struct strbuf **content_top = content;
-
-static void handle_content_type(struct strbuf *line)
-{
-	struct strbuf *boundary = xmalloc(sizeof(struct strbuf));
-	strbuf_init(boundary, line->len);
-
-	if (slurp_attr(line->buf, "boundary=", boundary)) {
-		strbuf_insert(boundary, 0, "--", 2);
-		if (++content_top > &content[MAX_BOUNDARIES]) {
-			fprintf(stderr, "Too many boundaries to handle\n");
-			exit(1);
-		}
-		*content_top = boundary;
-		boundary = NULL;
-	}
-	slurp_attr(line->buf, "charset=", &charset);
-
-	if (boundary) {
-		strbuf_release(boundary);
-		free(boundary);
-	}
-}
-
-static void handle_message_id(const struct strbuf *line)
-{
-	if (add_message_id)
-		message_id = strdup(line->buf);
-}
-
-static void handle_content_transfer_encoding(const struct strbuf *line)
-{
-	if (strcasestr(line->buf, "base64"))
-		transfer_encoding = TE_BASE64;
-	else if (strcasestr(line->buf, "quoted-printable"))
-		transfer_encoding = TE_QP;
-	else
-		transfer_encoding = TE_DONTCARE;
-}
-
-static int is_multipart_boundary(const struct strbuf *line)
-{
-	return (((*content_top)->len <= line->len) &&
-		!memcmp(line->buf, (*content_top)->buf, (*content_top)->len));
-}
-
-static void cleanup_subject(struct strbuf *subject)
-{
-	size_t at = 0;
-
-	while (at < subject->len) {
-		char *pos;
-		size_t remove;
-
-		switch (subject->buf[at]) {
-		case 'r': case 'R':
-			if (subject->len <= at + 3)
-				break;
-			if ((subject->buf[at + 1] == 'e' ||
-			     subject->buf[at + 1] == 'E') &&
-			    subject->buf[at + 2] == ':') {
-				strbuf_remove(subject, at, 3);
-				continue;
-			}
-			at++;
-			break;
-		case ' ': case '\t': case ':':
-			strbuf_remove(subject, at, 1);
-			continue;
-		case '[':
-			pos = strchr(subject->buf + at, ']');
-			if (!pos)
-				break;
-			remove = pos - subject->buf + at + 1;
-			if (!keep_non_patch_brackets_in_subject ||
-			    (7 <= remove &&
-			     memmem(subject->buf + at, remove, "PATCH", 5)))
-				strbuf_remove(subject, at, remove);
-			else {
-				at += remove;
-				/*
-				 * If the input had a space after the ], keep
-				 * it.  We don't bother with finding the end of
-				 * the space, since we later normalize it
-				 * anyway.
-				 */
-				if (isspace(subject->buf[at]))
-					at += 1;
-			}
-			continue;
-		}
-		break;
-	}
-	strbuf_trim(subject);
-}
-
-static void cleanup_space(struct strbuf *sb)
-{
-	size_t pos, cnt;
-	for (pos = 0; pos < sb->len; pos++) {
-		if (isspace(sb->buf[pos])) {
-			sb->buf[pos] = ' ';
-			for (cnt = 0; isspace(sb->buf[pos + cnt + 1]); cnt++);
-			strbuf_remove(sb, pos + 1, cnt);
-		}
-	}
-}
-
-static void decode_header(struct strbuf *line);
-static const char *header[MAX_HDR_PARSED] = {
-	"From","Subject","Date",
-};
-
-static inline int cmp_header(const struct strbuf *line, const char *hdr)
-{
-	int len = strlen(hdr);
-	return !strncasecmp(line->buf, hdr, len) && line->len > len &&
-			line->buf[len] == ':' && isspace(line->buf[len + 1]);
-}
-
-static int is_format_patch_separator(const char *line, int len)
-{
-	static const char SAMPLE[] =
-		"From e6807f3efca28b30decfecb1732a56c7db1137ee Mon Sep 17 00:00:00 2001\n";
-	const char *cp;
-
-	if (len != strlen(SAMPLE))
-		return 0;
-	if (!skip_prefix(line, "From ", &cp))
-		return 0;
-	if (strspn(cp, "0123456789abcdef") != 40)
-		return 0;
-	cp += 40;
-	return !memcmp(SAMPLE + (cp - line), cp, strlen(SAMPLE) - (cp - line));
-}
-
-static int check_header(const struct strbuf *line,
-				struct strbuf *hdr_data[], int overwrite)
-{
-	int i, ret = 0, len;
-	struct strbuf sb = STRBUF_INIT;
-	/* search for the interesting parts */
-	for (i = 0; header[i]; i++) {
-		int len = strlen(header[i]);
-		if ((!hdr_data[i] || overwrite) && cmp_header(line, header[i])) {
-			/* Unwrap inline B and Q encoding, and optionally
-			 * normalize the meta information to utf8.
-			 */
-			strbuf_add(&sb, line->buf + len + 2, line->len - len - 2);
-			decode_header(&sb);
-			handle_header(&hdr_data[i], &sb);
-			ret = 1;
-			goto check_header_out;
-		}
-	}
-
-	/* Content stuff */
-	if (cmp_header(line, "Content-Type")) {
-		len = strlen("Content-Type: ");
-		strbuf_add(&sb, line->buf + len, line->len - len);
-		decode_header(&sb);
-		strbuf_insert(&sb, 0, "Content-Type: ", len);
-		handle_content_type(&sb);
-		ret = 1;
-		goto check_header_out;
-	}
-	if (cmp_header(line, "Content-Transfer-Encoding")) {
-		len = strlen("Content-Transfer-Encoding: ");
-		strbuf_add(&sb, line->buf + len, line->len - len);
-		decode_header(&sb);
-		handle_content_transfer_encoding(&sb);
-		ret = 1;
-		goto check_header_out;
-	}
-	if (cmp_header(line, "Message-Id")) {
-		len = strlen("Message-Id: ");
-		strbuf_add(&sb, line->buf + len, line->len - len);
-		decode_header(&sb);
-		handle_message_id(&sb);
-		ret = 1;
-		goto check_header_out;
-	}
-
-	/* for inbody stuff */
-	if (starts_with(line->buf, ">From") && isspace(line->buf[5])) {
-		ret = is_format_patch_separator(line->buf + 1, line->len - 1);
-		goto check_header_out;
-	}
-	if (starts_with(line->buf, "[PATCH]") && isspace(line->buf[7])) {
-		for (i = 0; header[i]; i++) {
-			if (!strcmp("Subject", header[i])) {
-				handle_header(&hdr_data[i], line);
-				ret = 1;
-				goto check_header_out;
-			}
-		}
-	}
-
-check_header_out:
-	strbuf_release(&sb);
-	return ret;
-}
-
-static int is_rfc2822_header(const struct strbuf *line)
-{
-	/*
-	 * The section that defines the loosest possible
-	 * field name is "3.6.8 Optional fields".
-	 *
-	 * optional-field = field-name ":" unstructured CRLF
-	 * field-name = 1*ftext
-	 * ftext = %d33-57 / %59-126
-	 */
-	int ch;
-	char *cp = line->buf;
-
-	/* Count mbox From headers as headers */
-	if (starts_with(cp, "From ") || starts_with(cp, ">From "))
-		return 1;
-
-	while ((ch = *cp++)) {
-		if (ch == ':')
-			return 1;
-		if ((33 <= ch && ch <= 57) ||
-		    (59 <= ch && ch <= 126))
-			continue;
-		break;
-	}
-	return 0;
-}
-
-static int read_one_header_line(struct strbuf *line, FILE *in)
-{
-	/* Get the first part of the line. */
-	if (strbuf_getline(line, in, '\n'))
-		return 0;
-
-	/*
-	 * Is it an empty line or not a valid rfc2822 header?
-	 * If so, stop here, and return false ("not a header")
-	 */
-	strbuf_rtrim(line);
-	if (!line->len || !is_rfc2822_header(line)) {
-		/* Re-add the newline */
-		strbuf_addch(line, '\n');
-		return 0;
-	}
-
-	/*
-	 * Now we need to eat all the continuation lines..
-	 * Yuck, 2822 header "folding"
-	 */
-	for (;;) {
-		int peek;
-		struct strbuf continuation = STRBUF_INIT;
-
-		peek = fgetc(in); ungetc(peek, in);
-		if (peek != ' ' && peek != '\t')
-			break;
-		if (strbuf_getline(&continuation, in, '\n'))
-			break;
-		continuation.buf[0] = ' ';
-		strbuf_rtrim(&continuation);
-		strbuf_addbuf(line, &continuation);
-	}
-
-	return 1;
-}
-
-static struct strbuf *decode_q_segment(const struct strbuf *q_seg, int rfc2047)
-{
-	const char *in = q_seg->buf;
-	int c;
-	struct strbuf *out = xmalloc(sizeof(struct strbuf));
-	strbuf_init(out, q_seg->len);
-
-	while ((c = *in++) != 0) {
-		if (c == '=') {
-			int d = *in++;
-			if (d == '\n' || !d)
-				break; /* drop trailing newline */
-			strbuf_addch(out, (hexval(d) << 4) | hexval(*in++));
-			continue;
-		}
-		if (rfc2047 && c == '_') /* rfc2047 4.2 (2) */
-			c = 0x20;
-		strbuf_addch(out, c);
-	}
-	return out;
-}
-
-static struct strbuf *decode_b_segment(const struct strbuf *b_seg)
-{
-	/* Decode in..ep, possibly in-place to ot */
-	int c, pos = 0, acc = 0;
-	const char *in = b_seg->buf;
-	struct strbuf *out = xmalloc(sizeof(struct strbuf));
-	strbuf_init(out, b_seg->len);
-
-	while ((c = *in++) != 0) {
-		if (c == '+')
-			c = 62;
-		else if (c == '/')
-			c = 63;
-		else if ('A' <= c && c <= 'Z')
-			c -= 'A';
-		else if ('a' <= c && c <= 'z')
-			c -= 'a' - 26;
-		else if ('0' <= c && c <= '9')
-			c -= '0' - 52;
-		else
-			continue; /* garbage */
-		switch (pos++) {
-		case 0:
-			acc = (c << 2);
-			break;
-		case 1:
-			strbuf_addch(out, (acc | (c >> 4)));
-			acc = (c & 15) << 4;
-			break;
-		case 2:
-			strbuf_addch(out, (acc | (c >> 2)));
-			acc = (c & 3) << 6;
-			break;
-		case 3:
-			strbuf_addch(out, (acc | c));
-			acc = pos = 0;
-			break;
-		}
-	}
-	return out;
-}
-
-static void convert_to_utf8(struct strbuf *line, const char *charset)
-{
-	char *out;
-
-	if (!charset || !*charset)
-		return;
-
-	if (same_encoding(metainfo_charset, charset))
-		return;
-	out = reencode_string(line->buf, metainfo_charset, charset);
-	if (!out)
-		die("cannot convert from %s to %s",
-		    charset, metainfo_charset);
-	strbuf_attach(line, out, strlen(out), strlen(out));
-}
-
-static int decode_header_bq(struct strbuf *it)
-{
-	char *in, *ep, *cp;
-	struct strbuf outbuf = STRBUF_INIT, *dec;
-	struct strbuf charset_q = STRBUF_INIT, piecebuf = STRBUF_INIT;
-	int rfc2047 = 0;
-
-	in = it->buf;
-	while (in - it->buf <= it->len && (ep = strstr(in, "=?")) != NULL) {
-		int encoding;
-		strbuf_reset(&charset_q);
-		strbuf_reset(&piecebuf);
-		rfc2047 = 1;
-
-		if (in != ep) {
-			/*
-			 * We are about to process an encoded-word
-			 * that begins at ep, but there is something
-			 * before the encoded word.
-			 */
-			char *scan;
-			for (scan = in; scan < ep; scan++)
-				if (!isspace(*scan))
-					break;
-
-			if (scan != ep || in == it->buf) {
-				/*
-				 * We should not lose that "something",
-				 * unless we have just processed an
-				 * encoded-word, and there is only LWS
-				 * before the one we are about to process.
-				 */
-				strbuf_add(&outbuf, in, ep - in);
-			}
-		}
-		/* E.g.
-		 * ep : "=?iso-2022-jp?B?GyR...?= foo"
-		 * ep : "=?ISO-8859-1?Q?Foo=FCbar?= baz"
-		 */
-		ep += 2;
-
-		if (ep - it->buf >= it->len || !(cp = strchr(ep, '?')))
-			goto decode_header_bq_out;
-
-		if (cp + 3 - it->buf > it->len)
-			goto decode_header_bq_out;
-		strbuf_add(&charset_q, ep, cp - ep);
-
-		encoding = cp[1];
-		if (!encoding || cp[2] != '?')
-			goto decode_header_bq_out;
-		ep = strstr(cp + 3, "?=");
-		if (!ep)
-			goto decode_header_bq_out;
-		strbuf_add(&piecebuf, cp + 3, ep - cp - 3);
-		switch (tolower(encoding)) {
-		default:
-			goto decode_header_bq_out;
-		case 'b':
-			dec = decode_b_segment(&piecebuf);
-			break;
-		case 'q':
-			dec = decode_q_segment(&piecebuf, 1);
-			break;
-		}
-		if (metainfo_charset)
-			convert_to_utf8(dec, charset_q.buf);
-
-		strbuf_addbuf(&outbuf, dec);
-		strbuf_release(dec);
-		free(dec);
-		in = ep + 2;
-	}
-	strbuf_addstr(&outbuf, in);
-	strbuf_reset(it);
-	strbuf_addbuf(it, &outbuf);
-decode_header_bq_out:
-	strbuf_release(&outbuf);
-	strbuf_release(&charset_q);
-	strbuf_release(&piecebuf);
-	return rfc2047;
-}
-
-static void decode_header(struct strbuf *it)
-{
-	if (decode_header_bq(it))
-		return;
-	/* otherwise "it" is a straight copy of the input.
-	 * This can be binary guck but there is no charset specified.
-	 */
-	if (metainfo_charset)
-		convert_to_utf8(it, "");
-}
-
-static void decode_transfer_encoding(struct strbuf *line)
-{
-	struct strbuf *ret;
-
-	switch (transfer_encoding) {
-	case TE_QP:
-		ret = decode_q_segment(line, 0);
-		break;
-	case TE_BASE64:
-		ret = decode_b_segment(line);
-		break;
-	case TE_DONTCARE:
-	default:
-		return;
-	}
-	strbuf_reset(line);
-	strbuf_addbuf(line, ret);
-	strbuf_release(ret);
-	free(ret);
-}
-
-static void handle_filter(struct strbuf *line);
-
-static int find_boundary(void)
-{
-	while (!strbuf_getline(&line, fin, '\n')) {
-		if (*content_top && is_multipart_boundary(&line))
-			return 1;
-	}
-	return 0;
-}
-
-static int handle_boundary(void)
-{
-	struct strbuf newline = STRBUF_INIT;
-
-	strbuf_addch(&newline, '\n');
-again:
-	if (line.len >= (*content_top)->len + 2 &&
-	    !memcmp(line.buf + (*content_top)->len, "--", 2)) {
-		/* we hit an end boundary */
-		/* pop the current boundary off the stack */
-		strbuf_release(*content_top);
-		free(*content_top);
-		*content_top = NULL;
-
-		/* technically won't happen as is_multipart_boundary()
-		   will fail first.  But just in case..
-		 */
-		if (--content_top < content) {
-			fprintf(stderr, "Detected mismatched boundaries, "
-					"can't recover\n");
-			exit(1);
-		}
-		handle_filter(&newline);
-		strbuf_release(&newline);
-
-		/* skip to the next boundary */
-		if (!find_boundary())
-			return 0;
-		goto again;
-	}
-
-	/* set some defaults */
-	transfer_encoding = TE_DONTCARE;
-	strbuf_reset(&charset);
-
-	/* slurp in this section's info */
-	while (read_one_header_line(&line, fin))
-		check_header(&line, p_hdr_data, 0);
-
-	strbuf_release(&newline);
-	/* replenish line */
-	if (strbuf_getline(&line, fin, '\n'))
-		return 0;
-	strbuf_addch(&line, '\n');
-	return 1;
-}
-
-static inline int patchbreak(const struct strbuf *line)
-{
-	size_t i;
-
-	/* Beginning of a "diff -" header? */
-	if (starts_with(line->buf, "diff -"))
-		return 1;
-
-	/* CVS "Index: " line? */
-	if (starts_with(line->buf, "Index: "))
-		return 1;
-
-	/*
-	 * "--- <filename>" starts patches without headers
-	 * "---<sp>*" is a manual separator
-	 */
-	if (line->len < 4)
-		return 0;
-
-	if (starts_with(line->buf, "---")) {
-		/* space followed by a filename? */
-		if (line->buf[3] == ' ' && !isspace(line->buf[4]))
-			return 1;
-		/* Just whitespace? */
-		for (i = 3; i < line->len; i++) {
-			unsigned char c = line->buf[i];
-			if (c == '\n')
-				return 1;
-			if (!isspace(c))
-				break;
-		}
-		return 0;
-	}
-	return 0;
-}
-
-static int is_scissors_line(const struct strbuf *line)
-{
-	size_t i, len = line->len;
-	int scissors = 0, gap = 0;
-	int first_nonblank = -1;
-	int last_nonblank = 0, visible, perforation = 0, in_perforation = 0;
-	const char *buf = line->buf;
-
-	for (i = 0; i < len; i++) {
-		if (isspace(buf[i])) {
-			if (in_perforation) {
-				perforation++;
-				gap++;
-			}
-			continue;
-		}
-		last_nonblank = i;
-		if (first_nonblank < 0)
-			first_nonblank = i;
-		if (buf[i] == '-') {
-			in_perforation = 1;
-			perforation++;
-			continue;
-		}
-		if (i + 1 < len &&
-		    (!memcmp(buf + i, ">8", 2) || !memcmp(buf + i, "8<", 2) ||
-		     !memcmp(buf + i, ">%", 2) || !memcmp(buf + i, "%<", 2))) {
-			in_perforation = 1;
-			perforation += 2;
-			scissors += 2;
-			i++;
-			continue;
-		}
-		in_perforation = 0;
-	}
-
-	/*
-	 * The mark must be at least 8 bytes long (e.g. "-- >8 --").
-	 * Even though there can be arbitrary cruft on the same line
-	 * (e.g. "cut here"), in order to avoid misidentification, the
-	 * perforation must occupy more than a third of the visible
-	 * width of the line, and dashes and scissors must occupy more
-	 * than half of the perforation.
-	 */
-
-	visible = last_nonblank - first_nonblank + 1;
-	return (scissors && 8 <= visible &&
-		visible < perforation * 3 &&
-		gap * 2 < perforation);
-}
-
-static int handle_commit_msg(struct strbuf *line)
-{
-	static int still_looking = 1;
-
-	if (!cmitmsg)
-		return 0;
-
-	if (still_looking) {
-		if (!line->len || (line->len == 1 && line->buf[0] == '\n'))
-			return 0;
-	}
-
-	if (use_inbody_headers && still_looking) {
-		still_looking = check_header(line, s_hdr_data, 0);
-		if (still_looking)
-			return 0;
-	} else
-		/* Only trim the first (blank) line of the commit message
-		 * when ignoring in-body headers.
-		 */
-		still_looking = 0;
-
-	/* normalize the log message to UTF-8. */
-	if (metainfo_charset)
-		convert_to_utf8(line, charset.buf);
-
-	if (use_scissors && is_scissors_line(line)) {
-		int i;
-		if (fseek(cmitmsg, 0L, SEEK_SET))
-			die_errno("Could not rewind output message file");
-		if (ftruncate(fileno(cmitmsg), 0))
-			die_errno("Could not truncate output message file at scissors");
-		still_looking = 1;
-
-		/*
-		 * We may have already read "secondary headers"; purge
-		 * them to give ourselves a clean restart.
-		 */
-		for (i = 0; header[i]; i++) {
-			if (s_hdr_data[i])
-				strbuf_release(s_hdr_data[i]);
-			s_hdr_data[i] = NULL;
-		}
-		return 0;
-	}
-
-	if (patchbreak(line)) {
-		if (message_id)
-			fprintf(cmitmsg, "Message-Id: %s\n", message_id);
-		fclose(cmitmsg);
-		cmitmsg = NULL;
-		return 1;
-	}
-
-	fputs(line->buf, cmitmsg);
-	return 0;
-}
-
-static void handle_patch(const struct strbuf *line)
-{
-	fwrite(line->buf, 1, line->len, patchfile);
-	patch_lines++;
-}
-
-static void handle_filter(struct strbuf *line)
-{
-	static int filter = 0;
-
-	/* filter tells us which part we left off on */
-	switch (filter) {
-	case 0:
-		if (!handle_commit_msg(line))
-			break;
-		filter++;
-	case 1:
-		handle_patch(line);
-		break;
-	}
-}
-
-static void handle_body(void)
-{
-	struct strbuf prev = STRBUF_INIT;
-
-	/* Skip up to the first boundary */
-	if (*content_top) {
-		if (!find_boundary())
-			goto handle_body_out;
-	}
-
-	do {
-		/* process any boundary lines */
-		if (*content_top && is_multipart_boundary(&line)) {
-			/* flush any leftover */
-			if (prev.len) {
-				handle_filter(&prev);
-				strbuf_reset(&prev);
-			}
-			if (!handle_boundary())
-				goto handle_body_out;
-		}
-
-		/* Unwrap transfer encoding */
-		decode_transfer_encoding(&line);
-
-		switch (transfer_encoding) {
-		case TE_BASE64:
-		case TE_QP:
-		{
-			struct strbuf **lines, **it, *sb;
-
-			/* Prepend any previous partial lines */
-			strbuf_insert(&line, 0, prev.buf, prev.len);
-			strbuf_reset(&prev);
-
-			/*
-			 * This is a decoded line that may contain
-			 * multiple new lines.  Pass only one chunk
-			 * at a time to handle_filter()
-			 */
-			lines = strbuf_split(&line, '\n');
-			for (it = lines; (sb = *it); it++) {
-				if (*(it + 1) == NULL) /* The last line */
-					if (sb->buf[sb->len - 1] != '\n') {
-						/* Partial line, save it for later. */
-						strbuf_addbuf(&prev, sb);
-						break;
-					}
-				handle_filter(sb);
-			}
-			/*
-			 * The partial chunk is saved in "prev" and will be
-			 * appended by the next iteration of read_line_with_nul().
-			 */
-			strbuf_list_free(lines);
-			break;
-		}
-		default:
-			handle_filter(&line);
-		}
-
-	} while (!strbuf_getwholeline(&line, fin, '\n'));
-
-handle_body_out:
-	strbuf_release(&prev);
-}
-
-static void output_header_lines(FILE *fout, const char *hdr, const struct strbuf *data)
-{
-	const char *sp = data->buf;
-	while (1) {
-		char *ep = strchr(sp, '\n');
-		int len;
-		if (!ep)
-			len = strlen(sp);
-		else
-			len = ep - sp;
-		fprintf(fout, "%s: %.*s\n", hdr, len, sp);
-		if (!ep)
-			break;
-		sp = ep + 1;
-	}
-}
-
-static void handle_info(void)
-{
-	struct strbuf *hdr;
-	int i;
-
-	for (i = 0; header[i]; i++) {
-		/* only print inbody headers if we output a patch file */
-		if (patch_lines && s_hdr_data[i])
-			hdr = s_hdr_data[i];
-		else if (p_hdr_data[i])
-			hdr = p_hdr_data[i];
-		else
-			continue;
-
-		if (!strcmp(header[i], "Subject")) {
-			if (!keep_subject) {
-				cleanup_subject(hdr);
-				cleanup_space(hdr);
-			}
-			output_header_lines(fout, "Subject", hdr);
-		} else if (!strcmp(header[i], "From")) {
-			cleanup_space(hdr);
-			handle_from(hdr);
-			fprintf(fout, "Author: %s\n", name.buf);
-			fprintf(fout, "Email: %s\n", email.buf);
-		} else {
-			cleanup_space(hdr);
-			fprintf(fout, "%s: %s\n", header[i], hdr->buf);
-		}
-	}
-	fprintf(fout, "\n");
-}
-
-static int mailinfo(FILE *in, FILE *out, const char *msg, const char *patch)
-{
-	int peek;
-	fin = in;
-	fout = out;
-
-	cmitmsg = fopen(msg, "w");
-	if (!cmitmsg) {
-		perror(msg);
-		return -1;
-	}
-	patchfile = fopen(patch, "w");
-	if (!patchfile) {
-		perror(patch);
-		fclose(cmitmsg);
-		return -1;
-	}
-
-	p_hdr_data = xcalloc(MAX_HDR_PARSED, sizeof(*p_hdr_data));
-	s_hdr_data = xcalloc(MAX_HDR_PARSED, sizeof(*s_hdr_data));
-
-	do {
-		peek = fgetc(in);
-	} while (isspace(peek));
-	ungetc(peek, in);
-
-	/* process the email header */
-	while (read_one_header_line(&line, fin))
-		check_header(&line, p_hdr_data, 1);
-
-	handle_body();
-	handle_info();
-
-	return 0;
-}
-
-static int git_mailinfo_config(const char *var, const char *value, void *unused)
-{
-	if (!starts_with(var, "mailinfo."))
-		return git_default_config(var, value, unused);
-	if (!strcmp(var, "mailinfo.scissors")) {
-		use_scissors = git_config_bool(var, value);
-		return 0;
-	}
-	/* perhaps others here */
-	return 0;
-}
+#include "mailinfo.h"
 
 static const char mailinfo_usage[] =
 	"git mailinfo [-k | -b] [-m | --message-id] [-u | --encoding=<encoding> | -n] [--scissors | --no-scissors] <msg> <patch> < mail >info";
@@ -1036,34 +14,36 @@
 int cmd_mailinfo(int argc, const char **argv, const char *prefix)
 {
 	const char *def_charset;
+	struct mailinfo mi;
+	int status;
 
 	/* NEEDSWORK: might want to do the optional .git/ directory
 	 * discovery
 	 */
-	git_config(git_mailinfo_config, NULL);
+	setup_mailinfo(&mi);
 
 	def_charset = get_commit_output_encoding();
-	metainfo_charset = def_charset;
+	mi.metainfo_charset = def_charset;
 
 	while (1 < argc && argv[1][0] == '-') {
 		if (!strcmp(argv[1], "-k"))
-			keep_subject = 1;
+			mi.keep_subject = 1;
 		else if (!strcmp(argv[1], "-b"))
-			keep_non_patch_brackets_in_subject = 1;
+			mi.keep_non_patch_brackets_in_subject = 1;
 		else if (!strcmp(argv[1], "-m") || !strcmp(argv[1], "--message-id"))
-			add_message_id = 1;
+			mi.add_message_id = 1;
 		else if (!strcmp(argv[1], "-u"))
-			metainfo_charset = def_charset;
+			mi.metainfo_charset = def_charset;
 		else if (!strcmp(argv[1], "-n"))
-			metainfo_charset = NULL;
+			mi.metainfo_charset = NULL;
 		else if (starts_with(argv[1], "--encoding="))
-			metainfo_charset = argv[1] + 11;
+			mi.metainfo_charset = argv[1] + 11;
 		else if (!strcmp(argv[1], "--scissors"))
-			use_scissors = 1;
+			mi.use_scissors = 1;
 		else if (!strcmp(argv[1], "--no-scissors"))
-			use_scissors = 0;
+			mi.use_scissors = 0;
 		else if (!strcmp(argv[1], "--no-inbody-headers"))
-			use_inbody_headers = 0;
+			mi.use_inbody_headers = 0;
 		else
 			usage(mailinfo_usage);
 		argc--; argv++;
@@ -1072,5 +52,10 @@
 	if (argc != 3)
 		usage(mailinfo_usage);
 
-	return !!mailinfo(stdin, stdout, argv[1], argv[2]);
+	mi.input = stdin;
+	mi.output = stdout;
+	status = !!mailinfo(&mi, argv[1], argv[2]);
+	clear_mailinfo(&mi);
+
+	return status;
 }
diff --git a/builtin/mailsplit.c b/builtin/mailsplit.c
index 8e02ea1..104277a 100644
--- a/builtin/mailsplit.c
+++ b/builtin/mailsplit.c
@@ -98,30 +98,37 @@
 {
 	DIR *dir;
 	struct dirent *dent;
-	char name[PATH_MAX];
+	char *name = NULL;
 	char *subs[] = { "cur", "new", NULL };
 	char **sub;
+	int ret = -1;
 
 	for (sub = subs; *sub; ++sub) {
-		snprintf(name, sizeof(name), "%s/%s", path, *sub);
+		free(name);
+		name = xstrfmt("%s/%s", path, *sub);
 		if ((dir = opendir(name)) == NULL) {
 			if (errno == ENOENT)
 				continue;
 			error("cannot opendir %s (%s)", name, strerror(errno));
-			return -1;
+			goto out;
 		}
 
 		while ((dent = readdir(dir)) != NULL) {
 			if (dent->d_name[0] == '.')
 				continue;
-			snprintf(name, sizeof(name), "%s/%s", *sub, dent->d_name);
+			free(name);
+			name = xstrfmt("%s/%s", *sub, dent->d_name);
 			string_list_insert(list, name);
 		}
 
 		closedir(dir);
 	}
 
-	return 0;
+	ret = 0;
+
+out:
+	free(name);
+	return ret;
 }
 
 static int maildir_filename_cmp(const char *a, const char *b)
@@ -148,8 +155,8 @@
 static int split_maildir(const char *maildir, const char *dir,
 	int nr_prec, int skip)
 {
-	char file[PATH_MAX];
-	char name[PATH_MAX];
+	char *file = NULL;
+	FILE *f = NULL;
 	int ret = -1;
 	int i;
 	struct string_list list = STRING_LIST_INIT_DUP;
@@ -160,8 +167,11 @@
 		goto out;
 
 	for (i = 0; i < list.nr; i++) {
-		FILE *f;
-		snprintf(file, sizeof(file), "%s/%s", maildir, list.items[i].string);
+		char *name;
+
+		free(file);
+		file = xstrfmt("%s/%s", maildir, list.items[i].string);
+
 		f = fopen(file, "r");
 		if (!f) {
 			error("cannot open mail %s (%s)", file, strerror(errno));
@@ -173,14 +183,19 @@
 			goto out;
 		}
 
-		sprintf(name, "%s/%0*d", dir, nr_prec, ++skip);
+		name = xstrfmt("%s/%0*d", dir, nr_prec, ++skip);
 		split_one(f, name, 1);
+		free(name);
 
 		fclose(f);
+		f = NULL;
 	}
 
 	ret = skip;
 out:
+	if (f)
+		fclose(f);
+	free(file);
 	string_list_clear(&list, 1);
 	return ret;
 }
@@ -188,7 +203,6 @@
 static int split_mbox(const char *file, const char *dir, int allow_bare,
 		      int nr_prec, int skip)
 {
-	char name[PATH_MAX];
 	int ret = -1;
 	int peek;
 
@@ -215,8 +229,9 @@
 	}
 
 	while (!file_done) {
-		sprintf(name, "%s/%0*d", dir, nr_prec, ++skip);
+		char *name = xstrfmt("%s/%0*d", dir, nr_prec, ++skip);
 		file_done = split_one(f, name, allow_bare);
+		free(name);
 	}
 
 	if (f != stdin)
diff --git a/builtin/merge-base.c b/builtin/merge-base.c
index 08a8217..c0d1822 100644
--- a/builtin/merge-base.c
+++ b/builtin/merge-base.c
@@ -16,7 +16,7 @@
 		return 1;
 
 	while (result) {
-		printf("%s\n", sha1_to_hex(result->item->object.sha1));
+		printf("%s\n", oid_to_hex(&result->item->object.oid));
 		if (!show_all)
 			return 0;
 		result = result->next;
@@ -62,7 +62,7 @@
 		return 1;
 
 	while (result) {
-		printf("%s\n", sha1_to_hex(result->item->object.sha1));
+		printf("%s\n", oid_to_hex(&result->item->object.oid));
 		result = result->next;
 	}
 	return 0;
@@ -83,7 +83,7 @@
 		return 1;
 
 	while (result) {
-		printf("%s\n", sha1_to_hex(result->item->object.sha1));
+		printf("%s\n", oid_to_hex(&result->item->object.oid));
 		if (!show_all)
 			return 0;
 		result = result->next;
@@ -196,7 +196,7 @@
 		goto cleanup_return;
 	}
 
-	printf("%s\n", sha1_to_hex(bases->item->object.sha1));
+	printf("%s\n", oid_to_hex(&bases->item->object.oid));
 
 cleanup_return:
 	free_commit_list(bases);
@@ -252,7 +252,7 @@
 	if (argc < 2)
 		usage_with_options(merge_base_usage, options);
 
-	rev = xmalloc(argc * sizeof(*rev));
+	ALLOC_ARRAY(rev, argc);
 	while (argc-- > 0)
 		rev[rev_nr++] = get_commit_reference(*argv++);
 	return show_merge_base(rev, rev_nr, show_all);
diff --git a/builtin/merge-index.c b/builtin/merge-index.c
index 1a1eafa..1c3427c 100644
--- a/builtin/merge-index.c
+++ b/builtin/merge-index.c
@@ -9,7 +9,7 @@
 {
 	int found;
 	const char *arguments[] = { pgm, "", "", "", path, "", "", "", NULL };
-	char hexbuf[4][60];
+	char hexbuf[4][GIT_SHA1_HEXSZ + 1];
 	char ownbuf[4][60];
 
 	if (pos >= active_nr)
@@ -22,8 +22,8 @@
 		if (strcmp(ce->name, path))
 			break;
 		found++;
-		strcpy(hexbuf[stage], sha1_to_hex(ce->sha1));
-		sprintf(ownbuf[stage], "%o", ce->ce_mode);
+		sha1_to_hex_r(hexbuf[stage], ce->sha1);
+		xsnprintf(ownbuf[stage], sizeof(ownbuf[stage]), "%o", ce->ce_mode);
 		arguments[stage] = hexbuf[stage];
 		arguments[stage + 4] = ownbuf[stage];
 	} while (++pos < active_nr);
diff --git a/builtin/merge-recursive.c b/builtin/merge-recursive.c
index a90f28f..491efd5 100644
--- a/builtin/merge-recursive.c
+++ b/builtin/merge-recursive.c
@@ -14,7 +14,7 @@
 
 	if (strlen(branch) != 40)
 		return branch;
-	sprintf(githead_env, "GITHEAD_%s", branch);
+	xsnprintf(githead_env, sizeof(githead_env), "GITHEAD_%s", branch);
 	name = getenv(githead_env);
 	return name ? name : branch;
 }
diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c
index 2a4aafe..ca57004 100644
--- a/builtin/merge-tree.c
+++ b/builtin/merge-tree.c
@@ -60,7 +60,7 @@
 	const char *path = entry->path;
 
 	if (!entry->stage)
-		return read_sha1_file(entry->blob->object.sha1, &type, size);
+		return read_sha1_file(entry->blob->object.oid.hash, &type, size);
 	base = NULL;
 	if (entry->stage == 1) {
 		base = entry->blob;
@@ -82,7 +82,7 @@
 	enum object_type type;
 	while (entry) {
 		if (entry->stage == 2)
-			return read_sha1_file(entry->blob->object.sha1, &type, size);
+			return read_sha1_file(entry->blob->object.oid.hash, &type, size);
 		entry = entry->link;
 	}
 	return NULL;
@@ -130,7 +130,7 @@
 	do {
 		struct merge_list *link = entry->link;
 		static const char *desc[4] = { "result", "base", "our", "their" };
-		printf("  %-6s %o %s %s\n", desc[entry->stage], entry->mode, sha1_to_hex(entry->blob->object.sha1), entry->path);
+		printf("  %-6s %o %s %s\n", desc[entry->stage], entry->mode, oid_to_hex(&entry->blob->object.oid), entry->path);
 		entry = link;
 	} while (entry);
 }
@@ -174,7 +174,7 @@
 
 static char *traverse_path(const struct traverse_info *info, const struct name_entry *n)
 {
-	char *path = xmalloc(traverse_path_len(info, n) + 1);
+	char *path = xmallocz(traverse_path_len(info, n));
 	return make_traverse_path(path, info, n);
 }
 
diff --git a/builtin/merge.c b/builtin/merge.c
index 3ec97a8..101ffef 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -365,7 +365,7 @@
 	while ((commit = get_revision(&rev)) != NULL) {
 		strbuf_addch(&out, '\n');
 		strbuf_addf(&out, "commit %s\n",
-			sha1_to_hex(commit->object.sha1));
+			oid_to_hex(&commit->object.oid));
 		pretty_print_commit(&ctx, commit, &out);
 	}
 	if (write_in_full(fd, out.buf, out.len) != out.len)
@@ -380,7 +380,7 @@
 		   const unsigned char *new_head, const char *msg)
 {
 	struct strbuf reflog_message = STRBUF_INIT;
-	const unsigned char *head = head_commit->object.sha1;
+	const unsigned char *head = head_commit->object.oid.hash;
 
 	if (!msg)
 		strbuf_addstr(&reflog_message, getenv("GIT_REFLOG_ACTION"));
@@ -404,6 +404,7 @@
 			 * We ignore errors in 'gc --auto', since the
 			 * user should see them.
 			 */
+			close_all_packs();
 			run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
 		}
 	}
@@ -497,7 +498,7 @@
 		if (ref_exists(truname.buf)) {
 			strbuf_addf(msg,
 				    "%s\t\tbranch '%s'%s of .\n",
-				    sha1_to_hex(remote_head->object.sha1),
+				    sha1_to_hex(remote_head->object.oid.hash),
 				    truname.buf + 11,
 				    (early ? " (early part)" : ""));
 			strbuf_release(&truname);
@@ -511,7 +512,7 @@
 		desc = merge_remote_util(remote_head);
 		if (desc && desc->obj && desc->obj->type == OBJ_TAG) {
 			strbuf_addf(msg, "%s\t\t%s '%s'\n",
-				    sha1_to_hex(desc->obj->sha1),
+				    sha1_to_hex(desc->obj->oid.hash),
 				    typename(desc->obj->type),
 				    remote);
 			goto cleanup;
@@ -519,7 +520,7 @@
 	}
 
 	strbuf_addf(msg, "%s\t\tcommit '%s'\n",
-		sha1_to_hex(remote_head->object.sha1), remote);
+		sha1_to_hex(remote_head->object.oid.hash), remote);
 cleanup:
 	strbuf_release(&buf);
 	strbuf_release(&bname);
@@ -892,7 +893,7 @@
 		second_token = lookup_commit_reference_gently(second_sha1, 0);
 		if (!second_token)
 			die(_("'%s' is not a commit"), argv[1]);
-		if (hashcmp(second_token->object.sha1, head))
+		if (hashcmp(second_token->object.oid.hash, head))
 			return NULL;
 	}
 	return second_token;
@@ -938,7 +939,7 @@
 	if (!branch->merge_nr)
 		die(_("No default upstream defined for the current branch."));
 
-	args = xcalloc(branch->merge_nr + 1, sizeof(char *));
+	args = xcalloc(st_add(branch->merge_nr, 1), sizeof(char *));
 	for (i = 0; i < branch->merge_nr; i++) {
 		if (!branch->merge[i]->dst)
 			die(_("No remote-tracking branch for %s from %s"),
@@ -958,14 +959,14 @@
 	struct strbuf buf = STRBUF_INIT;
 
 	for (j = remoteheads; j; j = j->next) {
-		unsigned const char *sha1;
+		struct object_id *oid;
 		struct commit *c = j->item;
 		if (c->util && merge_remote_util(c)->obj) {
-			sha1 = merge_remote_util(c)->obj->sha1;
+			oid = &merge_remote_util(c)->obj->oid;
 		} else {
-			sha1 = c->object.sha1;
+			oid = &c->object.oid;
 		}
-		strbuf_addf(&buf, "%s\n", sha1_to_hex(sha1));
+		strbuf_addf(&buf, "%s\n", oid_to_hex(oid));
 	}
 	filename = git_path_merge_head();
 	fd = open(filename, O_WRONLY | O_CREAT, 0666);
@@ -1274,8 +1275,8 @@
 			die(_("%s - not something we can merge"), argv[0]);
 		if (remoteheads->next)
 			die(_("Can merge only exactly one commit into empty head"));
-		read_empty(remote_head->object.sha1, 0);
-		update_ref("initial pull", "HEAD", remote_head->object.sha1,
+		read_empty(remote_head->object.oid.hash, 0);
+		update_ref("initial pull", "HEAD", remote_head->object.oid.hash,
 			   NULL, 0, UPDATE_REFS_DIE_ON_ERR);
 		goto done;
 	}
@@ -1289,7 +1290,7 @@
 	 * additional safety measure to check for it.
 	 */
 	if (!have_message &&
-	    is_old_style_invocation(argc, argv, head_commit->object.sha1)) {
+	    is_old_style_invocation(argc, argv, head_commit->object.oid.hash)) {
 		warning("old-style 'git merge <msg> HEAD <commit>' is deprecated.");
 		strbuf_addstr(&merge_msg, argv[0]);
 		head_arg = argv[1];
@@ -1317,13 +1318,13 @@
 	if (verify_signatures) {
 		for (p = remoteheads; p; p = p->next) {
 			struct commit *commit = p->item;
-			char hex[41];
+			char hex[GIT_SHA1_HEXSZ + 1];
 			struct signature_check signature_check;
 			memset(&signature_check, 0, sizeof(signature_check));
 
 			check_commit_signature(commit, &signature_check);
 
-			strcpy(hex, find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV));
+			find_unique_abbrev_r(hex, commit->object.oid.hash, DEFAULT_ABBREV);
 			switch (signature_check.result) {
 			case 'G':
 				break;
@@ -1353,7 +1354,7 @@
 	for (p = remoteheads; p; p = p->next) {
 		struct commit *commit = p->item;
 		strbuf_addf(&buf, "GITHEAD_%s",
-			    sha1_to_hex(commit->object.sha1));
+			    sha1_to_hex(commit->object.oid.hash));
 		setenv(buf.buf, merge_remote_util(commit)->name, 1);
 		strbuf_reset(&buf);
 		if (fast_forward != FF_ONLY &&
@@ -1393,7 +1394,7 @@
 		free(list);
 	}
 
-	update_ref("updating ORIG_HEAD", "ORIG_HEAD", head_commit->object.sha1,
+	update_ref("updating ORIG_HEAD", "ORIG_HEAD", head_commit->object.oid.hash,
 		   NULL, 0, UPDATE_REFS_DIE_ON_ERR);
 
 	if (remoteheads && !common)
@@ -1409,19 +1410,19 @@
 		goto done;
 	} else if (fast_forward != FF_NO && !remoteheads->next &&
 			!common->next &&
-			!hashcmp(common->item->object.sha1, head_commit->object.sha1)) {
+			!hashcmp(common->item->object.oid.hash, head_commit->object.oid.hash)) {
 		/* Again the most common case of merging one remote. */
 		struct strbuf msg = STRBUF_INIT;
 		struct commit *commit;
-		char hex[41];
 
-		strcpy(hex, find_unique_abbrev(head_commit->object.sha1, DEFAULT_ABBREV));
-
-		if (verbosity >= 0)
-			printf(_("Updating %s..%s\n"),
-				hex,
-				find_unique_abbrev(remoteheads->item->object.sha1,
-				DEFAULT_ABBREV));
+		if (verbosity >= 0) {
+			char from[GIT_SHA1_HEXSZ + 1], to[GIT_SHA1_HEXSZ + 1];
+			find_unique_abbrev_r(from, head_commit->object.oid.hash,
+					      DEFAULT_ABBREV);
+			find_unique_abbrev_r(to, remoteheads->item->object.oid.hash,
+					      DEFAULT_ABBREV);
+			printf(_("Updating %s..%s\n"), from, to);
+		}
 		strbuf_addstr(&msg, "Fast-forward");
 		if (have_message)
 			strbuf_addstr(&msg,
@@ -1432,14 +1433,14 @@
 			goto done;
 		}
 
-		if (checkout_fast_forward(head_commit->object.sha1,
-					  commit->object.sha1,
+		if (checkout_fast_forward(head_commit->object.oid.hash,
+					  commit->object.oid.hash,
 					  overwrite_ignore)) {
 			ret = 1;
 			goto done;
 		}
 
-		finish(head_commit, remoteheads, commit->object.sha1, msg.buf);
+		finish(head_commit, remoteheads, commit->object.oid.hash, msg.buf);
 		drop_save();
 		goto done;
 	} else if (!remoteheads->next && common->next)
@@ -1458,9 +1459,9 @@
 			/* See if it is really trivial. */
 			git_committer_info(IDENT_STRICT);
 			printf(_("Trying really trivial in-index merge...\n"));
-			if (!read_tree_trivial(common->item->object.sha1,
-					       head_commit->object.sha1,
-					       remoteheads->item->object.sha1)) {
+			if (!read_tree_trivial(common->item->object.oid.hash,
+					       head_commit->object.oid.hash,
+					       remoteheads->item->object.oid.hash)) {
 				ret = merge_trivial(head_commit, remoteheads);
 				goto done;
 			}
@@ -1483,8 +1484,8 @@
 			 * HEAD^^" would be missed.
 			 */
 			common_one = get_merge_bases(head_commit, j->item);
-			if (hashcmp(common_one->item->object.sha1,
-				j->item->object.sha1)) {
+			if (hashcmp(common_one->item->object.oid.hash,
+				j->item->object.oid.hash)) {
 				up_to_date = 0;
 				break;
 			}
@@ -1520,7 +1521,7 @@
 		int ret;
 		if (i) {
 			printf(_("Rewinding the tree to pristine...\n"));
-			restore_state(head_commit->object.sha1, stash);
+			restore_state(head_commit->object.oid.hash, stash);
 		}
 		if (use_strategies_nr != 1)
 			printf(_("Trying merge strategy %s...\n"),
@@ -1586,7 +1587,7 @@
 	 * it up.
 	 */
 	if (!best_strategy) {
-		restore_state(head_commit->object.sha1, stash);
+		restore_state(head_commit->object.oid.hash, stash);
 		if (use_strategies_nr > 1)
 			fprintf(stderr,
 				_("No merge strategy handled the merge.\n"));
@@ -1599,7 +1600,7 @@
 		; /* We already have its result in the working tree. */
 	else {
 		printf(_("Rewinding the tree to pristine...\n"));
-		restore_state(head_commit->object.sha1, stash);
+		restore_state(head_commit->object.oid.hash, stash);
 		printf(_("Using the %s to prepare resolving by hand.\n"),
 			best_strategy);
 		try_merge_strategy(best_strategy, common, remoteheads,
diff --git a/builtin/mktree.c b/builtin/mktree.c
index a964d6b..b0aab65 100644
--- a/builtin/mktree.c
+++ b/builtin/mktree.c
@@ -19,16 +19,17 @@
 static void append_to_tree(unsigned mode, unsigned char *sha1, char *path)
 {
 	struct treeent *ent;
-	int len = strlen(path);
+	size_t len = strlen(path);
 	if (strchr(path, '/'))
 		die("path %s contains slash", path);
 
-	ALLOC_GROW(entries, used + 1, alloc);
-	ent = entries[used++] = xmalloc(sizeof(**entries) + len + 1);
+	FLEX_ALLOC_MEM(ent, name, path, len);
 	ent->mode = mode;
 	ent->len = len;
 	hashcpy(ent->sha1, sha1);
-	memcpy(ent->name, path, len+1);
+
+	ALLOC_GROW(entries, used + 1, alloc);
+	entries[used++] = ent;
 }
 
 static int ent_compare(const void *a_, const void *b_)
diff --git a/builtin/mv.c b/builtin/mv.c
index d1d4316..aeae855 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -24,7 +24,8 @@
 					   int count, unsigned flags)
 {
 	int i;
-	const char **result = xmalloc((count + 1) * sizeof(const char *));
+	const char **result;
+	ALLOC_ARRAY(result, count + 1);
 	memcpy(result, pathspec, count * sizeof(const char *));
 	result[count] = NULL;
 	for (i = 0; i < count; i++) {
@@ -47,9 +48,9 @@
 
 static const char *add_slash(const char *path)
 {
-	int len = strlen(path);
+	size_t len = strlen(path);
 	if (path[len - 1] != '/') {
-		char *with_slash = xmalloc(len + 2);
+		char *with_slash = xmalloc(st_add(len, 2));
 		memcpy(with_slash, path, len);
 		with_slash[len++] = '/';
 		with_slash[len] = 0;
diff --git a/builtin/name-rev.c b/builtin/name-rev.c
index 248a3eb..092e03c 100644
--- a/builtin/name-rev.c
+++ b/builtin/name-rev.c
@@ -55,20 +55,16 @@
 			parents;
 			parents = parents->next, parent_number++) {
 		if (parent_number > 1) {
-			int len = strlen(tip_name);
-			char *new_name = xmalloc(len +
-				1 + decimal_length(generation) +  /* ~<n> */
-				1 + 2 +				  /* ^NN */
-				1);
+			size_t len;
+			char *new_name;
 
-			if (len > 2 && !strcmp(tip_name + len - 2, "^0"))
-				len -= 2;
+			strip_suffix(tip_name, "^0", &len);
 			if (generation > 0)
-				sprintf(new_name, "%.*s~%d^%d", len, tip_name,
-						generation, parent_number);
+				new_name = xstrfmt("%.*s~%d^%d", (int)len, tip_name,
+						   generation, parent_number);
 			else
-				sprintf(new_name, "%.*s^%d", len, tip_name,
-						parent_number);
+				new_name = xstrfmt("%.*s^%d", (int)len, tip_name,
+						   parent_number);
 
 			name_rev(parents->item, new_name, 0,
 				distance + MERGE_TRAVERSAL_WEIGHT, 0);
@@ -166,7 +162,7 @@
 		struct tag *t = (struct tag *) o;
 		if (!t->tagged)
 			break; /* broken repository */
-		o = parse_object(t->tagged->sha1);
+		o = parse_object(t->tagged->oid.hash);
 		deref = 1;
 	}
 	if (o && o->type == OBJ_COMMIT) {
@@ -197,7 +193,7 @@
 		tip_table.sorted = 1;
 	}
 
-	found = sha1_pos(o->sha1, tip_table.table, tip_table.nr,
+	found = sha1_pos(o->oid.hash, tip_table.table, tip_table.nr,
 			 nth_tip_table_ent);
 	if (0 <= found)
 		return tip_table.table[found].refname;
@@ -236,19 +232,19 @@
 		      int always, int allow_undefined, int name_only)
 {
 	const char *name;
-	const unsigned char *sha1 = obj->sha1;
+	const struct object_id *oid = &obj->oid;
 
 	if (!name_only)
-		printf("%s ", caller_name ? caller_name : sha1_to_hex(sha1));
+		printf("%s ", caller_name ? caller_name : oid_to_hex(oid));
 	name = get_rev_name(obj);
 	if (name)
 		printf("%s\n", name);
 	else if (allow_undefined)
 		printf("undefined\n");
 	else if (always)
-		printf("%s\n", find_unique_abbrev(sha1, DEFAULT_ABBREV));
+		printf("%s\n", find_unique_abbrev(oid->hash, DEFAULT_ABBREV));
 	else
-		die("cannot describe '%s'", sha1_to_hex(sha1));
+		die("cannot describe '%s'", oid_to_hex(oid));
 }
 
 static char const * const name_rev_usage[] = {
diff --git a/builtin/notes.c b/builtin/notes.c
index bb23d55..52aa9af 100644
--- a/builtin/notes.c
+++ b/builtin/notes.c
@@ -19,7 +19,7 @@
 #include "string-list.h"
 #include "notes-merge.h"
 #include "notes-utils.h"
-#include "branch.h"
+#include "worktree.h"
 
 static const char * const git_notes_usage[] = {
 	N_("git notes [--ref <notes-ref>] [list [<object>]]"),
@@ -707,7 +707,7 @@
 		die("Could not parse commit from NOTES_MERGE_PARTIAL.");
 
 	if (partial->parents)
-		hashcpy(parent_sha1, partial->parents->item->object.sha1);
+		hashcpy(parent_sha1, partial->parents->item->object.oid.hash);
 	else
 		hashclr(parent_sha1);
 
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 676727e..a27de5b 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -624,7 +624,7 @@
 {
 	unsigned int i, wo_end, last_untagged;
 
-	struct object_entry **wo = xmalloc(to_pack.nr_objects * sizeof(*wo));
+	struct object_entry **wo;
 	struct object_entry *objects = to_pack.objects;
 
 	for (i = 0; i < to_pack.nr_objects; i++) {
@@ -657,6 +657,7 @@
 	 * Give the objects in the original recency order until
 	 * we see a tagged tip.
 	 */
+	ALLOC_ARRAY(wo, to_pack.nr_objects);
 	for (i = wo_end = 0; i < to_pack.nr_objects; i++) {
 		if (objects[i].tagged)
 			break;
@@ -769,7 +770,7 @@
 
 	if (progress > pack_to_stdout)
 		progress_state = start_progress(_("Writing objects"), nr_result);
-	written_list = xmalloc(to_pack.nr_objects * sizeof(*written_list));
+	ALLOC_ARRAY(written_list, to_pack.nr_objects);
 	write_order = compute_write_order();
 
 	do {
@@ -2129,7 +2130,7 @@
 	if (!to_pack.nr_objects || !window || !depth)
 		return;
 
-	delta_list = xmalloc(to_pack.nr_objects * sizeof(*delta_list));
+	ALLOC_ARRAY(delta_list, to_pack.nr_objects);
 	nr_deltas = n = 0;
 
 	for (i = 0; i < to_pack.nr_objects; i++) {
@@ -2277,7 +2278,7 @@
 
 static void show_commit(struct commit *commit, void *data)
 {
-	add_object_entry(commit->object.sha1, OBJ_COMMIT, NULL, 0);
+	add_object_entry(commit->object.oid.hash, OBJ_COMMIT, NULL, 0);
 	commit->object.flags |= OBJECT_ADDED;
 
 	if (write_bitmap_index)
@@ -2287,13 +2288,13 @@
 static void show_object(struct object *obj, const char *name, void *data)
 {
 	add_preferred_base_object(name);
-	add_object_entry(obj->sha1, obj->type, name, 0);
+	add_object_entry(obj->oid.hash, obj->type, name, 0);
 	obj->flags |= OBJECT_ADDED;
 }
 
 static void show_edge(struct commit *commit)
 {
-	add_preferred_base(commit->object.sha1);
+	add_preferred_base(commit->object.oid.hash);
 }
 
 struct in_pack_object {
@@ -2309,7 +2310,7 @@
 
 static void mark_in_pack_object(struct object *object, struct packed_git *p, struct in_pack *in_pack)
 {
-	in_pack->array[in_pack->nr].offset = find_pack_entry_one(object->sha1, p);
+	in_pack->array[in_pack->nr].offset = find_pack_entry_one(object->oid.hash, p);
 	in_pack->array[in_pack->nr].object = object;
 	in_pack->nr++;
 }
@@ -2328,7 +2329,7 @@
 	else if (a->offset > b->offset)
 		return 1;
 	else
-		return hashcmp(a->object->sha1, b->object->sha1);
+		return oidcmp(&a->object->oid, &b->object->oid);
 }
 
 static void add_objects_in_unpacked_packs(struct rev_info *revs)
@@ -2366,7 +2367,7 @@
 		      ofscmp);
 		for (i = 0; i < in_pack.nr; i++) {
 			struct object *o = in_pack.array[i].object;
-			add_object_entry(o->sha1, o->type, "", 0);
+			add_object_entry(o->oid.hash, o->type, "", 0);
 		}
 	}
 	free(in_pack.array);
@@ -2473,12 +2474,12 @@
 				 const char *name,
 				 void *data)
 {
-	sha1_array_append(&recent_objects, obj->sha1);
+	sha1_array_append(&recent_objects, obj->oid.hash);
 }
 
 static void record_recent_commit(struct commit *commit, void *data)
 {
-	sha1_array_append(&recent_objects, commit->object.sha1);
+	sha1_array_append(&recent_objects, commit->object.oid.hash);
 }
 
 static void get_object_list(int ac, const char **av)
diff --git a/builtin/pack-redundant.c b/builtin/pack-redundant.c
index d0532f6..72c8158 100644
--- a/builtin/pack-redundant.c
+++ b/builtin/pack-redundant.c
@@ -53,7 +53,7 @@
 		free_nodes = free_nodes->next;
 	} else {
 		int i = 1;
-		new = xmalloc(sizeof(struct llist_item) * BLKSIZE);
+		ALLOC_ARRAY(new, BLKSIZE);
 		for (; i < BLKSIZE; i++)
 			llist_item_put(&new[i]);
 	}
diff --git a/builtin/pull.c b/builtin/pull.c
index bf3fd3f..5145fc6 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -743,7 +743,7 @@
 	if (!result)
 		return 1;
 
-	hashcpy(merge_base, result->item->object.sha1);
+	hashcpy(merge_base, result->item->object.oid.hash);
 	return 0;
 }
 
diff --git a/builtin/push.c b/builtin/push.c
index 3bda430..8963dbd 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -9,6 +9,7 @@
 #include "transport.h"
 #include "parse-options.h"
 #include "submodule.h"
+#include "submodule-config.h"
 #include "send-pack.h"
 
 static const char * const push_usage[] = {
@@ -21,6 +22,7 @@
 static const char *receivepack;
 static int verbosity;
 static int progress = -1;
+static int recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
 
 static struct push_cas_option cas;
 
@@ -452,22 +454,14 @@
 static int option_parse_recurse_submodules(const struct option *opt,
 				   const char *arg, int unset)
 {
-	int *flags = opt->value;
+	int *recurse_submodules = opt->value;
 
-	if (*flags & (TRANSPORT_RECURSE_SUBMODULES_CHECK |
-		      TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND))
-		die("%s can only be used once.", opt->long_name);
-
-	if (arg) {
-		if (!strcmp(arg, "check"))
-			*flags |= TRANSPORT_RECURSE_SUBMODULES_CHECK;
-		else if (!strcmp(arg, "on-demand"))
-			*flags |= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND;
-		else
-			die("bad %s argument: %s", opt->long_name, arg);
-	} else
-		die("option %s needs an argument (check|on-demand)",
-				opt->long_name);
+	if (unset)
+		*recurse_submodules = RECURSE_SUBMODULES_OFF;
+	else if (arg)
+		*recurse_submodules = parse_push_recurse_submodules_arg(opt->long_name, arg);
+	else
+		die("%s missing parameter", opt->long_name);
 
 	return 0;
 }
@@ -522,6 +516,10 @@
 					return error("Invalid value for '%s'", k);
 			}
 		}
+	} else if (!strcmp(k, "push.recursesubmodules")) {
+		const char *value;
+		if (!git_config_get_value("push.recursesubmodules", &value))
+			recurse_submodules = parse_push_recurse_submodules_arg(k, value);
 	}
 
 	return git_default_config(k, v, NULL);
@@ -549,7 +547,7 @@
 		  0, CAS_OPT_NAME, &cas, N_("refname>:<expect"),
 		  N_("require old value of ref to be at this value"),
 		  PARSE_OPT_OPTARG, parseopt_push_cas_option },
-		{ OPTION_CALLBACK, 0, "recurse-submodules", &flags, "check|on-demand",
+		{ OPTION_CALLBACK, 0, "recurse-submodules", &recurse_submodules, "check|on-demand|no",
 			N_("control recursive pushing of submodules"),
 			PARSE_OPT_OPTARG, option_parse_recurse_submodules },
 		OPT_BOOL( 0 , "thin", &thin, N_("use thin pack")),
@@ -580,6 +578,11 @@
 	if (deleterefs && argc < 2)
 		die(_("--delete doesn't make sense without any refs"));
 
+	if (recurse_submodules == RECURSE_SUBMODULES_CHECK)
+		flags |= TRANSPORT_RECURSE_SUBMODULES_CHECK;
+	else if (recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND)
+		flags |= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND;
+
 	if (tags)
 		add_refspec("refs/tags/*");
 
diff --git a/builtin/read-tree.c b/builtin/read-tree.c
index 2379e11..8c693e7 100644
--- a/builtin/read-tree.c
+++ b/builtin/read-tree.c
@@ -90,7 +90,7 @@
 	debug_stage("index", stages[0], o);
 	for (i = 1; i <= o->merge_size; i++) {
 		char buf[24];
-		sprintf(buf, "ent#%d", i);
+		xsnprintf(buf, sizeof(buf), "ent#%d", i);
 		debug_stage(buf, stages[i], o);
 	}
 	return 0;
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index e6b93d0..c8e32b2 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -195,9 +195,6 @@
 
 static void show_ref(const char *path, const unsigned char *sha1)
 {
-	if (ref_is_hidden(path))
-		return;
-
 	if (sent_capabilities) {
 		packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
 	} else {
@@ -219,9 +216,14 @@
 	}
 }
 
-static int show_ref_cb(const char *path, const struct object_id *oid, int flag, void *unused)
+static int show_ref_cb(const char *path_full, const struct object_id *oid,
+		       int flag, void *unused)
 {
-	path = strip_namespace(path);
+	const char *path = strip_namespace(path_full);
+
+	if (ref_is_hidden(path, path_full))
+		return 0;
+
 	/*
 	 * Advertise refs outside our current namespace as ".have"
 	 * refs, so that the client can use them to minimize data
@@ -244,7 +246,7 @@
 static void collect_one_alternate_ref(const struct ref *ref, void *data)
 {
 	struct sha1_array *sa = data;
-	sha1_array_append(sa, ref->old_sha1);
+	sha1_array_append(sa, ref->old_oid.hash);
 }
 
 static void write_head_info(void)
@@ -280,10 +282,10 @@
 
 static void report_message(const char *prefix, const char *err, va_list params)
 {
-	int sz = strlen(prefix);
+	int sz;
 	char msg[4096];
 
-	strncpy(msg, prefix, sz);
+	sz = xsnprintf(msg, sizeof(msg), "%s", prefix);
 	sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
 	if (sz > (sizeof(msg) - 1))
 		sz = sizeof(msg) - 1;
@@ -1029,7 +1031,6 @@
 {
 	struct command *cmd;
 	int argc;
-	const char **argv;
 	struct child_process proc = CHILD_PROCESS_INIT;
 	const char *hook;
 
@@ -1042,21 +1043,16 @@
 	if (!argc || !hook)
 		return;
 
-	argv = xmalloc(sizeof(*argv) * (2 + argc));
-	argv[0] = hook;
-
-	for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
+	argv_array_push(&proc.args, hook);
+	for (cmd = commands; cmd; cmd = cmd->next) {
 		if (cmd->error_string || cmd->did_not_exist)
 			continue;
-		argv[argc] = xstrdup(cmd->ref_name);
-		argc++;
+		argv_array_push(&proc.args, cmd->ref_name);
 	}
-	argv[argc] = NULL;
 
 	proc.no_stdin = 1;
 	proc.stdout_to_stderr = 1;
 	proc.err = use_sideband ? -1 : 0;
-	proc.argv = argv;
 
 	if (!start_command(&proc)) {
 		if (use_sideband)
@@ -1071,8 +1067,11 @@
 	const char *dst_name;
 	struct string_list_item *item;
 	struct command *dst_cmd;
-	unsigned char sha1[20];
-	char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
+	unsigned char sha1[GIT_SHA1_RAWSZ];
+	char cmd_oldh[GIT_SHA1_HEXSZ + 1],
+	     cmd_newh[GIT_SHA1_HEXSZ + 1],
+	     dst_oldh[GIT_SHA1_HEXSZ + 1],
+	     dst_newh[GIT_SHA1_HEXSZ + 1];
 	int flag;
 
 	strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
@@ -1103,10 +1102,10 @@
 
 	dst_cmd->skip_update = 1;
 
-	strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
-	strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
-	strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
-	strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
+	find_unique_abbrev_r(cmd_oldh, cmd->old_sha1, DEFAULT_ABBREV);
+	find_unique_abbrev_r(cmd_newh, cmd->new_sha1, DEFAULT_ABBREV);
+	find_unique_abbrev_r(dst_oldh, dst_cmd->old_sha1, DEFAULT_ABBREV);
+	find_unique_abbrev_r(dst_newh, dst_cmd->new_sha1, DEFAULT_ABBREV);
 	rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
 		 " its target '%s' (%s..%s)",
 		 cmd->ref_name, cmd_oldh, cmd_newh,
@@ -1192,16 +1191,29 @@
 
 static void reject_updates_to_hidden(struct command *commands)
 {
+	struct strbuf refname_full = STRBUF_INIT;
+	size_t prefix_len;
 	struct command *cmd;
 
+	strbuf_addstr(&refname_full, get_git_namespace());
+	prefix_len = refname_full.len;
+
 	for (cmd = commands; cmd; cmd = cmd->next) {
-		if (cmd->error_string || !ref_is_hidden(cmd->ref_name))
+		if (cmd->error_string)
+			continue;
+
+		strbuf_setlen(&refname_full, prefix_len);
+		strbuf_addstr(&refname_full, cmd->ref_name);
+
+		if (!ref_is_hidden(cmd->ref_name, refname_full.buf))
 			continue;
 		if (is_null_sha1(cmd->new_sha1))
 			cmd->error_string = "deny deleting a hidden ref";
 		else
 			cmd->error_string = "deny updating a hidden ref";
 	}
+
+	strbuf_release(&refname_full);
 }
 
 static int should_process_cmd(struct command *cmd)
@@ -1360,7 +1372,7 @@
 
 	refname = line + 82;
 	reflen = linelen - 82;
-	cmd = xcalloc(1, sizeof(struct command) + reflen + 1);
+	cmd = xcalloc(1, st_add3(sizeof(struct command), reflen, 1));
 	hashcpy(cmd->old_sha1, old_sha1);
 	hashcpy(cmd->new_sha1, new_sha1);
 	memcpy(cmd->ref_name, refname, reflen);
@@ -1521,15 +1533,18 @@
 		if (status)
 			return "unpack-objects abnormal exit";
 	} else {
-		int s;
-		char keep_arg[256];
-
-		s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
-		if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
-			strcpy(keep_arg + s, "localhost");
+		char hostname[256];
 
 		argv_array_pushl(&child.args, "index-pack",
-				 "--stdin", hdr_arg, keep_arg, NULL);
+				 "--stdin", hdr_arg, NULL);
+
+		if (gethostname(hostname, sizeof(hostname)))
+			xsnprintf(hostname, sizeof(hostname), "localhost");
+		argv_array_pushf(&child.args,
+				 "--keep=receive-pack %"PRIuMAX" on %s",
+				 (uintmax_t)getpid(),
+				 hostname);
+
 		if (fsck_objects)
 			argv_array_pushf(&child.args, "--strict%s",
 				fsck_msg_types.buf);
@@ -1576,8 +1591,7 @@
 {
 	int i, j, k, bitmap_size = (si->ref->nr + 31) / 32;
 
-	si->used_shallow = xmalloc(sizeof(*si->used_shallow) *
-				   si->shallow->nr);
+	ALLOC_ARRAY(si->used_shallow, si->shallow->nr);
 	assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
 
 	si->need_reachability_test =
@@ -1597,7 +1611,7 @@
 				continue;
 			si->need_reachability_test[i]++;
 			for (k = 0; k < 32; k++)
-				if (si->used_shallow[i][j] & (1 << k))
+				if (si->used_shallow[i][j] & (1U << k))
 					si->shallow_ref[j * 32 + k]++;
 		}
 
@@ -1643,7 +1657,7 @@
 		return;
 	}
 
-	ref_status = xmalloc(sizeof(*ref_status) * ref->nr);
+	ALLOC_ARRAY(ref_status, ref->nr);
 	assign_shallow_commits_to_refs(si, NULL, ref_status);
 	for (cmd = commands; cmd; cmd = cmd->next) {
 		if (is_null_sha1(cmd->new_sha1))
@@ -1775,6 +1789,7 @@
 				"gc", "--auto", "--quiet", NULL,
 			};
 			int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
+			close_all_packs();
 			run_command_v_opt(argv_gc_auto, opt);
 		}
 		if (auto_update_server_info)
diff --git a/builtin/reflog.c b/builtin/reflog.c
index cf1145e..2d46b64 100644
--- a/builtin/reflog.c
+++ b/builtin/reflog.c
@@ -126,7 +126,7 @@
 		struct commit_list *parent;
 
 		c = (struct commit *)study.objects[--study.nr].item;
-		if (!c->object.parsed && !parse_object(c->object.sha1))
+		if (!c->object.parsed && !parse_object(c->object.oid.hash))
 			c->object.flags |= INCOMPLETE;
 
 		if (c->object.flags & INCOMPLETE) {
@@ -152,7 +152,7 @@
 		for (i = 0; i < found.nr; i++) {
 			struct commit *c =
 				(struct commit *)found.objects[i].item;
-			if (!tree_is_complete(c->tree->object.sha1)) {
+			if (!tree_is_complete(c->tree->object.oid.hash)) {
 				is_incomplete = 1;
 				c->object.flags |= INCOMPLETE;
 			}
@@ -382,11 +382,9 @@
 {
 	struct collected_reflog *e;
 	struct collect_reflog_cb *cb = cb_data;
-	size_t namelen = strlen(ref);
 
-	e = xmalloc(sizeof(*e) + namelen + 1);
+	FLEX_ALLOC_STR(e, reflog, ref);
 	hashcpy(e->sha1, oid->hash);
-	memcpy(e->reflog, ref, namelen + 1);
 	ALLOC_GROW(cb->e, cb->nr + 1, cb->alloc);
 	cb->e[cb->nr++] = e;
 	return 0;
@@ -396,7 +394,6 @@
 	struct reflog_expire_cfg *next;
 	unsigned long expire_total;
 	unsigned long expire_unreachable;
-	size_t len;
 	char pattern[FLEX_ARRAY];
 } *reflog_expire_cfg, **reflog_expire_cfg_tail;
 
@@ -408,13 +405,11 @@
 		reflog_expire_cfg_tail = &reflog_expire_cfg;
 
 	for (ent = reflog_expire_cfg; ent; ent = ent->next)
-		if (ent->len == len &&
-		    !memcmp(ent->pattern, pattern, len))
+		if (!strncmp(ent->pattern, pattern, len) &&
+		    ent->pattern[len] == '\0')
 			return ent;
 
-	ent = xcalloc(1, (sizeof(*ent) + len));
-	memcpy(ent->pattern, pattern, len);
-	ent->len = len;
+	FLEX_ALLOC_MEM(ent, pattern, pattern, len);
 	*reflog_expire_cfg_tail = ent;
 	reflog_expire_cfg_tail = &(ent->next);
 	return ent;
diff --git a/builtin/remote-ext.c b/builtin/remote-ext.c
index 3b8c22c..7457c74 100644
--- a/builtin/remote-ext.c
+++ b/builtin/remote-ext.c
@@ -1,6 +1,7 @@
 #include "builtin.h"
 #include "transport.h"
 #include "run-command.h"
+#include "pkt-line.h"
 
 /*
  * URL syntax:
@@ -113,65 +114,24 @@
 	}
 }
 
-/* Should be enough... */
-#define MAXARGUMENTS 256
-
-static const char **parse_argv(const char *arg, const char *service)
+static void parse_argv(struct argv_array *out, const char *arg, const char *service)
 {
-	int arguments = 0;
-	int i;
-	const char **ret;
-	char *temparray[MAXARGUMENTS + 1];
-
 	while (*arg) {
-		char *expanded;
-		if (arguments == MAXARGUMENTS)
-			die("remote-ext command has too many arguments");
-		expanded = strip_escapes(arg, service, &arg);
+		char *expanded = strip_escapes(arg, service, &arg);
 		if (expanded)
-			temparray[arguments++] = expanded;
+			argv_array_push(out, expanded);
+		free(expanded);
 	}
-
-	ret = xmalloc((arguments + 1) * sizeof(char *));
-	for (i = 0; i < arguments; i++)
-		ret[i] = temparray[i];
-	ret[arguments] = NULL;
-	return ret;
 }
 
 static void send_git_request(int stdin_fd, const char *serv, const char *repo,
 	const char *vhost)
 {
-	size_t bufferspace;
-	size_t wpos = 0;
-	char *buffer;
-
-	/*
-	 * Request needs 12 bytes extra if there is vhost (xxxx \0host=\0) and
-	 * 6 bytes extra (xxxx \0) if there is no vhost.
-	 */
-	if (vhost)
-		bufferspace = strlen(serv) + strlen(repo) + strlen(vhost) + 12;
+	if (!vhost)
+		packet_write(stdin_fd, "%s %s%c", serv, repo, 0);
 	else
-		bufferspace = strlen(serv) + strlen(repo) + 6;
-
-	if (bufferspace > 0xFFFF)
-		die("Request too large to send");
-	buffer = xmalloc(bufferspace);
-
-	/* Make the packet. */
-	wpos = sprintf(buffer, "%04x%s %s%c", (unsigned)bufferspace,
-		serv, repo, 0);
-
-	/* Add vhost if any. */
-	if (vhost)
-		sprintf(buffer + wpos, "host=%s%c", vhost, 0);
-
-	/* Send the request */
-	if (write_in_full(stdin_fd, buffer, bufferspace) < 0)
-		die_errno("Failed to send request");
-
-	free(buffer);
+		packet_write(stdin_fd, "%s %s%chost=%s%c", serv, repo, 0,
+			     vhost, 0);
 }
 
 static int run_child(const char *arg, const char *service)
@@ -182,7 +142,7 @@
 	child.in = -1;
 	child.out = -1;
 	child.err = 0;
-	child.argv = parse_argv(arg, service);
+	parse_argv(&child.args, arg, service);
 
 	if (start_command(&child) < 0)
 		die("Can't run specified command");
diff --git a/builtin/remote.c b/builtin/remote.c
index 181668d..4313695 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -18,6 +18,7 @@
 	N_("git remote prune [-n | --dry-run] <name>"),
 	N_("git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"),
 	N_("git remote set-branches [--add] <name> <branch>..."),
+	N_("git remote get-url [--push] [--all] <name>"),
 	N_("git remote set-url [--push] <name> <newurl> [<oldurl>]"),
 	N_("git remote set-url --add <name> <newurl>"),
 	N_("git remote set-url --delete <name> <url>"),
@@ -65,6 +66,11 @@
 	NULL
 };
 
+static const char * const builtin_remote_geturl_usage[] = {
+	N_("git remote get-url [--push] [--all] <name>"),
+	NULL
+};
+
 static const char * const builtin_remote_seturl_usage[] = {
 	N_("git remote set-url [--push] <name> <newurl> [<oldurl>]"),
 	N_("git remote set-url --add <name> <newurl>"),
@@ -102,8 +108,8 @@
 #define MIRROR_PUSH 2
 #define MIRROR_BOTH (MIRROR_FETCH|MIRROR_PUSH)
 
-static int add_branch(const char *key, const char *branchname,
-		const char *remotename, int mirror, struct strbuf *tmp)
+static void add_branch(const char *key, const char *branchname,
+		       const char *remotename, int mirror, struct strbuf *tmp)
 {
 	strbuf_reset(tmp);
 	strbuf_addch(tmp, '+');
@@ -113,7 +119,7 @@
 	else
 		strbuf_addf(tmp, "refs/heads/%s:refs/remotes/%s/%s",
 				branchname, remotename, branchname);
-	return git_config_set_multivar(key, tmp->buf, "^$", 0);
+	git_config_set_multivar(key, tmp->buf, "^$", 0);
 }
 
 static const char mirror_advice[] =
@@ -191,8 +197,7 @@
 		die(_("'%s' is not a valid remote name"), name);
 
 	strbuf_addf(&buf, "remote.%s.url", name);
-	if (git_config_set(buf.buf, url))
-		return 1;
+	git_config_set(buf.buf, url);
 
 	if (!mirror || mirror & MIRROR_FETCH) {
 		strbuf_reset(&buf);
@@ -200,25 +205,22 @@
 		if (track.nr == 0)
 			string_list_append(&track, "*");
 		for (i = 0; i < track.nr; i++) {
-			if (add_branch(buf.buf, track.items[i].string,
-				       name, mirror, &buf2))
-				return 1;
+			add_branch(buf.buf, track.items[i].string,
+				   name, mirror, &buf2);
 		}
 	}
 
 	if (mirror & MIRROR_PUSH) {
 		strbuf_reset(&buf);
 		strbuf_addf(&buf, "remote.%s.mirror", name);
-		if (git_config_set(buf.buf, "true"))
-			return 1;
+		git_config_set(buf.buf, "true");
 	}
 
 	if (fetch_tags != TAGS_DEFAULT) {
 		strbuf_reset(&buf);
 		strbuf_addf(&buf, "remote.%s.tagopt", name);
-		if (git_config_set(buf.buf,
-			fetch_tags == TAGS_SET ? "--tags" : "--no-tags"))
-			return 1;
+		git_config_set(buf.buf,
+			       fetch_tags == TAGS_SET ? "--tags" : "--no-tags");
 	}
 
 	if (fetch && fetch_remote(name))
@@ -395,7 +397,7 @@
 
 		if (!ref->peer_ref)
 			continue;
-		hashcpy(ref->new_sha1, ref->peer_ref->new_sha1);
+		oidcpy(&ref->new_oid, &ref->peer_ref->new_oid);
 
 		item = string_list_append(&states->push,
 					  abbrev_branch(ref->peer_ref->name));
@@ -404,14 +406,14 @@
 		info->forced = ref->force;
 		info->dest = xstrdup(abbrev_branch(ref->name));
 
-		if (is_null_sha1(ref->new_sha1)) {
+		if (is_null_oid(&ref->new_oid)) {
 			info->status = PUSH_STATUS_DELETE;
-		} else if (!hashcmp(ref->old_sha1, ref->new_sha1))
+		} else if (!oidcmp(&ref->old_oid, &ref->new_oid))
 			info->status = PUSH_STATUS_UPTODATE;
-		else if (is_null_sha1(ref->old_sha1))
+		else if (is_null_oid(&ref->old_oid))
 			info->status = PUSH_STATUS_CREATE;
-		else if (has_sha1_file(ref->old_sha1) &&
-			 ref_newer(ref->new_sha1, ref->old_sha1))
+		else if (has_object_file(&ref->old_oid) &&
+			 ref_newer(&ref->new_oid, &ref->old_oid))
 			info->status = PUSH_STATUS_FASTFORWARD;
 		else
 			info->status = PUSH_STATUS_OUTOFDATE;
@@ -584,25 +586,20 @@
 
 	strbuf_addf(&buf, "remote.%s.url", remote->name);
 	for (i = 0; i < remote->url_nr; i++)
-		if (git_config_set_multivar(buf.buf, remote->url[i], "^$", 0))
-			return error(_("Could not append '%s' to '%s'"),
-					remote->url[i], buf.buf);
+		git_config_set_multivar(buf.buf, remote->url[i], "^$", 0);
 	strbuf_reset(&buf);
 	strbuf_addf(&buf, "remote.%s.push", remote->name);
 	for (i = 0; i < remote->push_refspec_nr; i++)
-		if (git_config_set_multivar(buf.buf, remote->push_refspec[i], "^$", 0))
-			return error(_("Could not append '%s' to '%s'"),
-					remote->push_refspec[i], buf.buf);
+		git_config_set_multivar(buf.buf, remote->push_refspec[i], "^$", 0);
 	strbuf_reset(&buf);
 	strbuf_addf(&buf, "remote.%s.fetch", remote->name);
 	for (i = 0; i < remote->fetch_refspec_nr; i++)
-		if (git_config_set_multivar(buf.buf, remote->fetch_refspec[i], "^$", 0))
-			return error(_("Could not append '%s' to '%s'"),
-					remote->fetch_refspec[i], buf.buf);
+		git_config_set_multivar(buf.buf, remote->fetch_refspec[i], "^$", 0);
 	if (remote->origin == REMOTE_REMOTES)
 		unlink_or_warn(git_path("remotes/%s", remote->name));
 	else if (remote->origin == REMOTE_BRANCHES)
 		unlink_or_warn(git_path("branches/%s", remote->name));
+
 	return 0;
 }
 
@@ -649,8 +646,7 @@
 
 	strbuf_reset(&buf);
 	strbuf_addf(&buf, "remote.%s.fetch", rename.new);
-	if (git_config_set_multivar(buf.buf, NULL, NULL, 1))
-		return error(_("Could not remove config section '%s'"), buf.buf);
+	git_config_set_multivar(buf.buf, NULL, NULL, 1);
 	strbuf_addf(&old_remote_context, ":refs/remotes/%s/", rename.old);
 	for (i = 0; i < oldremote->fetch_refspec_nr; i++) {
 		char *ptr;
@@ -670,8 +666,7 @@
 				  "\tPlease update the configuration manually if necessary."),
 				buf2.buf);
 
-		if (git_config_set_multivar(buf.buf, buf2.buf, "^$", 0))
-			return error(_("Could not append '%s'"), buf.buf);
+		git_config_set_multivar(buf.buf, buf2.buf, "^$", 0);
 	}
 
 	read_branches();
@@ -681,9 +676,7 @@
 		if (info->remote_name && !strcmp(info->remote_name, rename.old)) {
 			strbuf_reset(&buf);
 			strbuf_addf(&buf, "branch.%s.remote", item->string);
-			if (git_config_set(buf.buf, rename.new)) {
-				return error(_("Could not set '%s'"), buf.buf);
-			}
+			git_config_set(buf.buf, rename.new);
 		}
 	}
 
@@ -781,10 +774,7 @@
 				strbuf_reset(&buf);
 				strbuf_addf(&buf, "branch.%s.%s",
 						item->string, *k);
-				if (git_config_set(buf.buf, NULL)) {
-					strbuf_release(&buf);
-					return -1;
-				}
+				git_config_set(buf.buf, NULL);
 			}
 		}
 	}
@@ -1403,24 +1393,20 @@
 
 static int remove_all_fetch_refspecs(const char *remote, const char *key)
 {
-	return git_config_set_multivar(key, NULL, NULL, 1);
+	return git_config_set_multivar_gently(key, NULL, NULL, 1);
 }
 
-static int add_branches(struct remote *remote, const char **branches,
-			const char *key)
+static void add_branches(struct remote *remote, const char **branches,
+			 const char *key)
 {
 	const char *remotename = remote->name;
 	int mirror = remote->mirror;
 	struct strbuf refspec = STRBUF_INIT;
 
 	for (; *branches; branches++)
-		if (add_branch(key, *branches, remotename, mirror, &refspec)) {
-			strbuf_release(&refspec);
-			return 1;
-		}
+		add_branch(key, *branches, remotename, mirror, &refspec);
 
 	strbuf_release(&refspec);
-	return 0;
 }
 
 static int set_remote_branches(const char *remotename, const char **branches,
@@ -1439,10 +1425,7 @@
 		strbuf_release(&key);
 		return 1;
 	}
-	if (add_branches(remote, branches, key.buf)) {
-		strbuf_release(&key);
-		return 1;
-	}
+	add_branches(remote, branches, key.buf);
 
 	strbuf_release(&key);
 	return 0;
@@ -1467,6 +1450,57 @@
 	return set_remote_branches(argv[0], argv + 1, add_mode);
 }
 
+static int get_url(int argc, const char **argv)
+{
+	int i, push_mode = 0, all_mode = 0;
+	const char *remotename = NULL;
+	struct remote *remote;
+	const char **url;
+	int url_nr;
+	struct option options[] = {
+		OPT_BOOL('\0', "push", &push_mode,
+			 N_("query push URLs rather than fetch URLs")),
+		OPT_BOOL('\0', "all", &all_mode,
+			 N_("return all URLs")),
+		OPT_END()
+	};
+	argc = parse_options(argc, argv, NULL, options, builtin_remote_geturl_usage, 0);
+
+	if (argc != 1)
+		usage_with_options(builtin_remote_geturl_usage, options);
+
+	remotename = argv[0];
+
+	if (!remote_is_configured(remotename))
+		die(_("No such remote '%s'"), remotename);
+	remote = remote_get(remotename);
+
+	url_nr = 0;
+	if (push_mode) {
+		url = remote->pushurl;
+		url_nr = remote->pushurl_nr;
+	}
+	/* else fetch mode */
+
+	/* Use the fetch URL when no push URLs were found or requested. */
+	if (!url_nr) {
+		url = remote->url;
+		url_nr = remote->url_nr;
+	}
+
+	if (!url_nr)
+		die(_("no URLs configured for remote '%s'"), remotename);
+
+	if (all_mode) {
+		for (i = 0; i < url_nr; i++)
+			printf_ln("%s", url[i]);
+	} else {
+		printf_ln("%s", *url);
+	}
+
+	return 0;
+}
+
 static int set_url(int argc, const char **argv)
 {
 	int i, push_mode = 0, add_mode = 0, delete_mode = 0;
@@ -1523,10 +1557,11 @@
 	if ((!oldurl && !delete_mode) || add_mode) {
 		if (add_mode)
 			git_config_set_multivar(name_buf.buf, newurl,
-				"^$", 0);
+						       "^$", 0);
 		else
 			git_config_set(name_buf.buf, newurl);
 		strbuf_release(&name_buf);
+
 		return 0;
 	}
 
@@ -1576,6 +1611,8 @@
 		result = set_head(argc, argv);
 	else if (!strcmp(argv[0], "set-branches"))
 		result = set_branches(argc, argv);
+	else if (!strcmp(argv[0], "get-url"))
+		result = get_url(argc, argv);
 	else if (!strcmp(argv[0], "set-url"))
 		result = set_url(argc, argv);
 	else if (!strcmp(argv[0], "show"))
diff --git a/builtin/replace.c b/builtin/replace.c
index 6b3c469..748c6ca 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -358,10 +358,10 @@
 
 	/* iterate over new parents */
 	for (i = 1; i < mergetag_data->argc; i++) {
-		unsigned char sha1[20];
-		if (get_sha1(mergetag_data->argv[i], sha1) < 0)
+		struct object_id oid;
+		if (get_sha1(mergetag_data->argv[i], oid.hash) < 0)
 			die(_("Not a valid object name: '%s'"), mergetag_data->argv[i]);
-		if (!hashcmp(tag->tagged->sha1, sha1))
+		if (!oidcmp(&tag->tagged->oid, &oid))
 			return; /* found */
 	}
 
diff --git a/builtin/rerere.c b/builtin/rerere.c
index 88e1359..1bf7242 100644
--- a/builtin/rerere.c
+++ b/builtin/rerere.c
@@ -104,9 +104,9 @@
 			return 0;
 		for (i = 0; i < merge_rr.nr; i++) {
 			const char *path = merge_rr.items[i].string;
-			const char *name = (const char *)merge_rr.items[i].util;
-			if (diff_two(rerere_path(name, "preimage"), path, path, path))
-				die("unable to generate diff for %s", name);
+			const struct rerere_id *id = merge_rr.items[i].util;
+			if (diff_two(rerere_path(id, "preimage"), path, path, path))
+				die("unable to generate diff for %s", rerere_path(id, NULL));
 		}
 	} else
 		usage_with_options(rerere_usage, options);
diff --git a/builtin/reset.c b/builtin/reset.c
index c503e75..092c3a5 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -96,7 +96,7 @@
 	const char *hex, *body;
 	const char *msg;
 
-	hex = find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV);
+	hex = find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV);
 	printf(_("HEAD is now at %s"), hex);
 	msg = logmsg_reencode(commit, NULL, get_log_output_encoding());
 	body = strstr(msg, "\n\n");
@@ -269,7 +269,7 @@
 	int reset_type = NONE, update_ref_status = 0, quiet = 0;
 	int patch_mode = 0, unborn;
 	const char *rev;
-	unsigned char sha1[20];
+	struct object_id oid;
 	struct pathspec pathspec;
 	int intent_to_add = 0;
 	const struct option options[] = {
@@ -295,26 +295,26 @@
 						PARSE_OPT_KEEP_DASHDASH);
 	parse_args(&pathspec, argv, prefix, patch_mode, &rev);
 
-	unborn = !strcmp(rev, "HEAD") && get_sha1("HEAD", sha1);
+	unborn = !strcmp(rev, "HEAD") && get_sha1("HEAD", oid.hash);
 	if (unborn) {
 		/* reset on unborn branch: treat as reset to empty tree */
-		hashcpy(sha1, EMPTY_TREE_SHA1_BIN);
+		hashcpy(oid.hash, EMPTY_TREE_SHA1_BIN);
 	} else if (!pathspec.nr) {
 		struct commit *commit;
-		if (get_sha1_committish(rev, sha1))
+		if (get_sha1_committish(rev, oid.hash))
 			die(_("Failed to resolve '%s' as a valid revision."), rev);
-		commit = lookup_commit_reference(sha1);
+		commit = lookup_commit_reference(oid.hash);
 		if (!commit)
 			die(_("Could not parse object '%s'."), rev);
-		hashcpy(sha1, commit->object.sha1);
+		oidcpy(&oid, &commit->object.oid);
 	} else {
 		struct tree *tree;
-		if (get_sha1_treeish(rev, sha1))
+		if (get_sha1_treeish(rev, oid.hash))
 			die(_("Failed to resolve '%s' as a valid tree."), rev);
-		tree = parse_tree_indirect(sha1);
+		tree = parse_tree_indirect(oid.hash);
 		if (!tree)
 			die(_("Could not parse object '%s'."), rev);
-		hashcpy(sha1, tree->object.sha1);
+		oidcpy(&oid, &tree->object.oid);
 	}
 
 	if (patch_mode) {
@@ -357,15 +357,15 @@
 		hold_locked_index(lock, 1);
 		if (reset_type == MIXED) {
 			int flags = quiet ? REFRESH_QUIET : REFRESH_IN_PORCELAIN;
-			if (read_from_tree(&pathspec, sha1, intent_to_add))
+			if (read_from_tree(&pathspec, oid.hash, intent_to_add))
 				return 1;
 			if (get_git_work_tree())
 				refresh_index(&the_index, flags, NULL, NULL,
 					      _("Unstaged changes after reset:"));
 		} else {
-			int err = reset_index(sha1, reset_type, quiet);
+			int err = reset_index(oid.hash, reset_type, quiet);
 			if (reset_type == KEEP && !err)
-				err = reset_index(sha1, MIXED, quiet);
+				err = reset_index(oid.hash, MIXED, quiet);
 			if (err)
 				die(_("Could not reset index file to revision '%s'."), rev);
 		}
@@ -377,10 +377,10 @@
 	if (!pathspec.nr && !unborn) {
 		/* Any resets without paths update HEAD to the head being
 		 * switched to, saving the previous head in ORIG_HEAD before. */
-		update_ref_status = reset_refs(rev, sha1);
+		update_ref_status = reset_refs(rev, oid.hash);
 
 		if (reset_type == HARD && !update_ref_status && !quiet)
-			print_new_head_line(lookup_commit_reference(sha1));
+			print_new_head_line(lookup_commit_reference(oid.hash));
 	}
 	if (!pathspec.nr)
 		remove_branch_state();
diff --git a/builtin/rev-list.c b/builtin/rev-list.c
index 4c46341..275da0d 100644
--- a/builtin/rev-list.c
+++ b/builtin/rev-list.c
@@ -81,14 +81,14 @@
 	if (!revs->graph)
 		fputs(get_revision_mark(revs, commit), stdout);
 	if (revs->abbrev_commit && revs->abbrev)
-		fputs(find_unique_abbrev(commit->object.sha1, revs->abbrev),
+		fputs(find_unique_abbrev(commit->object.oid.hash, revs->abbrev),
 		      stdout);
 	else
-		fputs(sha1_to_hex(commit->object.sha1), stdout);
+		fputs(oid_to_hex(&commit->object.oid), stdout);
 	if (revs->print_parents) {
 		struct commit_list *parents = commit->parents;
 		while (parents) {
-			printf(" %s", sha1_to_hex(parents->item->object.sha1));
+			printf(" %s", oid_to_hex(&parents->item->object.oid));
 			parents = parents->next;
 		}
 	}
@@ -97,7 +97,7 @@
 
 		children = lookup_decoration(&revs->children, &commit->object);
 		while (children) {
-			printf(" %s", sha1_to_hex(children->item->object.sha1));
+			printf(" %s", oid_to_hex(&children->item->object.oid));
 			children = children->next;
 		}
 	}
@@ -180,10 +180,10 @@
 static void finish_object(struct object *obj, const char *name, void *cb_data)
 {
 	struct rev_list_info *info = cb_data;
-	if (obj->type == OBJ_BLOB && !has_sha1_file(obj->sha1))
-		die("missing blob object '%s'", sha1_to_hex(obj->sha1));
+	if (obj->type == OBJ_BLOB && !has_object_file(&obj->oid))
+		die("missing blob object '%s'", oid_to_hex(&obj->oid));
 	if (info->revs->verify_objects && !obj->parsed && obj->type != OBJ_COMMIT)
-		parse_object(obj->sha1);
+		parse_object(obj->oid.hash);
 }
 
 static void show_object(struct object *obj, const char *name, void *cb_data)
@@ -197,7 +197,7 @@
 
 static void show_edge(struct commit *commit)
 {
-	printf("-%s\n", sha1_to_hex(commit->object.sha1));
+	printf("-%s\n", oid_to_hex(&commit->object.oid));
 }
 
 static void print_var_str(const char *var, const char *val)
@@ -213,7 +213,7 @@
 static int show_bisect_vars(struct rev_list_info *info, int reaches, int all)
 {
 	int cnt, flags = info->flags;
-	char hex[41] = "";
+	char hex[GIT_SHA1_HEXSZ + 1] = "";
 	struct commit_list *tried;
 	struct rev_info *revs = info->revs;
 
@@ -238,7 +238,7 @@
 		cnt = reaches;
 
 	if (revs->commits)
-		strcpy(hex, sha1_to_hex(revs->commits->item->object.sha1));
+		sha1_to_hex_r(hex, revs->commits->item->object.oid.hash);
 
 	if (flags & BISECT_SHOW_ALL) {
 		traverse_commit_list(revs, show_commit, show_object, info);
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index e92a782..7a4f2c0 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -282,7 +282,7 @@
 			exclude = get_merge_bases(a, b);
 			while (exclude) {
 				struct commit *commit = pop_commit(&exclude);
-				show_rev(REVERSED, commit->object.sha1, NULL);
+				show_rev(REVERSED, commit->object.oid.hash, NULL);
 			}
 		}
 		*dotdot = '.';
@@ -319,7 +319,7 @@
 	commit = lookup_commit_reference(sha1);
 	for (parents = commit->parents; parents; parents = parents->next)
 		show_rev(parents_only ? NORMAL : REVERSED,
-				parents->item->object.sha1, arg);
+				parents->item->object.oid.hash, arg);
 
 	*dotdot = '^';
 	return 1;
@@ -763,7 +763,8 @@
 				continue;
 			}
 			if (!strcmp(arg, "--git-common-dir")) {
-				puts(get_git_common_dir());
+				const char *pfx = prefix ? prefix : "";
+				puts(prefix_filename(pfx, strlen(pfx), get_git_common_dir()));
 				continue;
 			}
 			if (!strcmp(arg, "--resolve-git-dir")) {
diff --git a/builtin/rm.c b/builtin/rm.c
index 80b972f..8829b09 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -211,7 +211,7 @@
 		 * "intent to add" entry.
 		 */
 		if (local_changes && staged_changes) {
-			if (!index_only || !(ce->ce_flags & CE_INTENT_TO_ADD))
+			if (!index_only || !ce_intent_to_add(ce))
 				string_list_append(&files_staged, name);
 		}
 		else if (!index_only) {
diff --git a/builtin/shortlog.c b/builtin/shortlog.c
index 007cc66..35ebd17 100644
--- a/builtin/shortlog.c
+++ b/builtin/shortlog.c
@@ -129,7 +129,7 @@
 	}
 	if (!author) {
 		warning(_("Missing author: %s"),
-		    sha1_to_hex(commit->object.sha1));
+		    oid_to_hex(&commit->object.oid));
 		return;
 	}
 	if (log->user_format) {
diff --git a/builtin/show-branch.c b/builtin/show-branch.c
index 717a8e7..2566935 100644
--- a/builtin/show-branch.c
+++ b/builtin/show-branch.c
@@ -291,7 +291,7 @@
 		}
 		else
 			printf("[%s] ",
-			       find_unique_abbrev(commit->object.sha1,
+			       find_unique_abbrev(commit->object.oid.hash,
 						  DEFAULT_ABBREV));
 	}
 	puts(pretty_str);
@@ -496,7 +496,7 @@
 		int flags = commit->object.flags & all_mask;
 		if (!(flags & UNINTERESTING) &&
 		    ((flags & all_revs) == all_revs)) {
-			puts(sha1_to_hex(commit->object.sha1));
+			puts(oid_to_hex(&commit->object.oid));
 			exit_status = 0;
 			commit->object.flags |= UNINTERESTING;
 		}
@@ -516,7 +516,7 @@
 		unsigned int flag = rev_mask[i];
 
 		if (commit->object.flags == flag)
-			puts(sha1_to_hex(commit->object.sha1));
+			puts(oid_to_hex(&commit->object.oid));
 		commit->object.flags |= UNINTERESTING;
 	}
 	return 0;
@@ -724,6 +724,8 @@
 			fake_av[1] = NULL;
 			av = fake_av;
 			ac = 1;
+			if (!*av)
+				die("no branches given, and HEAD is not valid");
 		}
 		if (ac != 1)
 			die("--reflog option needs one branch name");
@@ -865,7 +867,7 @@
 						  head_len,
 						  ref_name[i],
 						  head_oid.hash,
-						  rev[i]->object.sha1);
+						  rev[i]->object.oid.hash);
 			if (extra < 0)
 				printf("%c [%s] ",
 				       is_head ? '*' : ' ', ref_name[i]);
diff --git a/builtin/show-ref.c b/builtin/show-ref.c
index 264c392..6d4e669 100644
--- a/builtin/show-ref.c
+++ b/builtin/show-ref.c
@@ -161,11 +161,6 @@
 	return 0;
 }
 
-static int help_callback(const struct option *opt, const char *arg, int unset)
-{
-	return -1;
-}
-
 static const struct option show_ref_options[] = {
 	OPT_BOOL(0, "tags", &tags_only, N_("only show tags (can be combined with heads)")),
 	OPT_BOOL(0, "heads", &heads_only, N_("only show heads (can be combined with tags)")),
@@ -186,18 +181,13 @@
 	{ OPTION_CALLBACK, 0, "exclude-existing", &exclude_existing_arg,
 	  N_("pattern"), N_("show refs from stdin that aren't in local repository"),
 	  PARSE_OPT_OPTARG | PARSE_OPT_NONEG, exclude_existing_callback },
-	{ OPTION_CALLBACK, 0, "help-all", NULL, NULL, N_("show usage"),
-	  PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, help_callback },
 	OPT_END()
 };
 
 int cmd_show_ref(int argc, const char **argv, const char *prefix)
 {
-	if (argc == 2 && !strcmp(argv[1], "-h"))
-		usage_with_options(show_ref_usage, show_ref_options);
-
 	argc = parse_options(argc, argv, prefix, show_ref_options,
-			     show_ref_usage, PARSE_OPT_NO_INTERNAL_HELP);
+			     show_ref_usage, 0);
 
 	if (exclude_arg)
 		return exclude_existing(exclude_existing_arg);
diff --git a/builtin/stripspace.c b/builtin/stripspace.c
index 7ff8434..15e716e 100644
--- a/builtin/stripspace.c
+++ b/builtin/stripspace.c
@@ -35,7 +35,7 @@
 			    N_("skip and remove all lines starting with comment character"),
 			    STRIP_COMMENTS),
 		OPT_CMDMODE('c', "comment-lines", &mode,
-			    N_("prepend comment character and blank to each line"),
+			    N_("prepend comment character and space to each line"),
 			    COMMENT_LINES),
 		OPT_END()
 	};
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
new file mode 100644
index 0000000..ed764c9
--- /dev/null
+++ b/builtin/submodule--helper.c
@@ -0,0 +1,276 @@
+#include "builtin.h"
+#include "cache.h"
+#include "parse-options.h"
+#include "quote.h"
+#include "pathspec.h"
+#include "dir.h"
+#include "utf8.h"
+#include "submodule.h"
+#include "submodule-config.h"
+#include "string-list.h"
+#include "run-command.h"
+
+struct module_list {
+	const struct cache_entry **entries;
+	int alloc, nr;
+};
+#define MODULE_LIST_INIT { NULL, 0, 0 }
+
+static int module_list_compute(int argc, const char **argv,
+			       const char *prefix,
+			       struct pathspec *pathspec,
+			       struct module_list *list)
+{
+	int i, result = 0;
+	char *ps_matched = NULL;
+	parse_pathspec(pathspec, 0,
+		       PATHSPEC_PREFER_FULL |
+		       PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP,
+		       prefix, argv);
+
+	if (pathspec->nr)
+		ps_matched = xcalloc(pathspec->nr, 1);
+
+	if (read_cache() < 0)
+		die(_("index file corrupt"));
+
+	for (i = 0; i < active_nr; i++) {
+		const struct cache_entry *ce = active_cache[i];
+
+		if (!S_ISGITLINK(ce->ce_mode) ||
+		    !match_pathspec(pathspec, ce->name, ce_namelen(ce),
+				    0, ps_matched, 1))
+			continue;
+
+		ALLOC_GROW(list->entries, list->nr + 1, list->alloc);
+		list->entries[list->nr++] = ce;
+		while (i + 1 < active_nr &&
+		       !strcmp(ce->name, active_cache[i + 1]->name))
+			/*
+			 * Skip entries with the same name in different stages
+			 * to make sure an entry is returned only once.
+			 */
+			i++;
+	}
+
+	if (ps_matched && report_path_error(ps_matched, pathspec, prefix))
+		result = -1;
+
+	free(ps_matched);
+
+	return result;
+}
+
+static int module_list(int argc, const char **argv, const char *prefix)
+{
+	int i;
+	struct pathspec pathspec;
+	struct module_list list = MODULE_LIST_INIT;
+
+	struct option module_list_options[] = {
+		OPT_STRING(0, "prefix", &prefix,
+			   N_("path"),
+			   N_("alternative anchor for relative paths")),
+		OPT_END()
+	};
+
+	const char *const git_submodule_helper_usage[] = {
+		N_("git submodule--helper list [--prefix=<path>] [<path>...]"),
+		NULL
+	};
+
+	argc = parse_options(argc, argv, prefix, module_list_options,
+			     git_submodule_helper_usage, 0);
+
+	if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0) {
+		printf("#unmatched\n");
+		return 1;
+	}
+
+	for (i = 0; i < list.nr; i++) {
+		const struct cache_entry *ce = list.entries[i];
+
+		if (ce_stage(ce))
+			printf("%06o %s U\t", ce->ce_mode, sha1_to_hex(null_sha1));
+		else
+			printf("%06o %s %d\t", ce->ce_mode, sha1_to_hex(ce->sha1), ce_stage(ce));
+
+		utf8_fprintf(stdout, "%s\n", ce->name);
+	}
+	return 0;
+}
+
+static int module_name(int argc, const char **argv, const char *prefix)
+{
+	const struct submodule *sub;
+
+	if (argc != 2)
+		usage(_("git submodule--helper name <path>"));
+
+	gitmodules_config();
+	sub = submodule_from_path(null_sha1, argv[1]);
+
+	if (!sub)
+		die(_("no submodule mapping found in .gitmodules for path '%s'"),
+		    argv[1]);
+
+	printf("%s\n", sub->name);
+
+	return 0;
+}
+static int clone_submodule(const char *path, const char *gitdir, const char *url,
+			   const char *depth, const char *reference, int quiet)
+{
+	struct child_process cp;
+	child_process_init(&cp);
+
+	argv_array_push(&cp.args, "clone");
+	argv_array_push(&cp.args, "--no-checkout");
+	if (quiet)
+		argv_array_push(&cp.args, "--quiet");
+	if (depth && *depth)
+		argv_array_pushl(&cp.args, "--depth", depth, NULL);
+	if (reference && *reference)
+		argv_array_pushl(&cp.args, "--reference", reference, NULL);
+	if (gitdir && *gitdir)
+		argv_array_pushl(&cp.args, "--separate-git-dir", gitdir, NULL);
+
+	argv_array_push(&cp.args, url);
+	argv_array_push(&cp.args, path);
+
+	cp.git_cmd = 1;
+	cp.env = local_repo_env;
+	cp.no_stdin = 1;
+
+	return run_command(&cp);
+}
+
+static int module_clone(int argc, const char **argv, const char *prefix)
+{
+	const char *path = NULL, *name = NULL, *url = NULL;
+	const char *reference = NULL, *depth = NULL;
+	int quiet = 0;
+	FILE *submodule_dot_git;
+	char *sm_gitdir, *cwd, *p;
+	struct strbuf rel_path = STRBUF_INIT;
+	struct strbuf sb = STRBUF_INIT;
+
+	struct option module_clone_options[] = {
+		OPT_STRING(0, "prefix", &prefix,
+			   N_("path"),
+			   N_("alternative anchor for relative paths")),
+		OPT_STRING(0, "path", &path,
+			   N_("path"),
+			   N_("where the new submodule will be cloned to")),
+		OPT_STRING(0, "name", &name,
+			   N_("string"),
+			   N_("name of the new submodule")),
+		OPT_STRING(0, "url", &url,
+			   N_("string"),
+			   N_("url where to clone the submodule from")),
+		OPT_STRING(0, "reference", &reference,
+			   N_("string"),
+			   N_("reference repository")),
+		OPT_STRING(0, "depth", &depth,
+			   N_("string"),
+			   N_("depth for shallow clones")),
+		OPT__QUIET(&quiet, "Suppress output for cloning a submodule"),
+		OPT_END()
+	};
+
+	const char *const git_submodule_helper_usage[] = {
+		N_("git submodule--helper clone [--prefix=<path>] [--quiet] "
+		   "[--reference <repository>] [--name <name>] [--url <url>]"
+		   "[--depth <depth>] [--] [<path>...]"),
+		NULL
+	};
+
+	argc = parse_options(argc, argv, prefix, module_clone_options,
+			     git_submodule_helper_usage, 0);
+
+	strbuf_addf(&sb, "%s/modules/%s", get_git_dir(), name);
+	sm_gitdir = strbuf_detach(&sb, NULL);
+
+	if (!file_exists(sm_gitdir)) {
+		if (safe_create_leading_directories_const(sm_gitdir) < 0)
+			die(_("could not create directory '%s'"), sm_gitdir);
+		if (clone_submodule(path, sm_gitdir, url, depth, reference, quiet))
+			die(_("clone of '%s' into submodule path '%s' failed"),
+			    url, path);
+	} else {
+		if (safe_create_leading_directories_const(path) < 0)
+			die(_("could not create directory '%s'"), path);
+		strbuf_addf(&sb, "%s/index", sm_gitdir);
+		unlink_or_warn(sb.buf);
+		strbuf_reset(&sb);
+	}
+
+	/* Write a .git file in the submodule to redirect to the superproject. */
+	if (safe_create_leading_directories_const(path) < 0)
+		die(_("could not create directory '%s'"), path);
+
+	if (path && *path)
+		strbuf_addf(&sb, "%s/.git", path);
+	else
+		strbuf_addstr(&sb, ".git");
+
+	if (safe_create_leading_directories_const(sb.buf) < 0)
+		die(_("could not create leading directories of '%s'"), sb.buf);
+	submodule_dot_git = fopen(sb.buf, "w");
+	if (!submodule_dot_git)
+		die_errno(_("cannot open file '%s'"), sb.buf);
+
+	fprintf(submodule_dot_git, "gitdir: %s\n",
+		relative_path(sm_gitdir, path, &rel_path));
+	if (fclose(submodule_dot_git))
+		die(_("could not close file %s"), sb.buf);
+	strbuf_reset(&sb);
+	strbuf_reset(&rel_path);
+
+	cwd = xgetcwd();
+	/* Redirect the worktree of the submodule in the superproject's config */
+	if (!is_absolute_path(sm_gitdir)) {
+		strbuf_addf(&sb, "%s/%s", cwd, sm_gitdir);
+		free(sm_gitdir);
+		sm_gitdir = strbuf_detach(&sb, NULL);
+	}
+
+	strbuf_addf(&sb, "%s/%s", cwd, path);
+	p = git_pathdup_submodule(path, "config");
+	if (!p)
+		die(_("could not get submodule directory for '%s'"), path);
+	git_config_set_in_file(p, "core.worktree",
+			       relative_path(sb.buf, sm_gitdir, &rel_path));
+	strbuf_release(&sb);
+	strbuf_release(&rel_path);
+	free(sm_gitdir);
+	free(cwd);
+	free(p);
+	return 0;
+}
+
+struct cmd_struct {
+	const char *cmd;
+	int (*fn)(int, const char **, const char *);
+};
+
+static struct cmd_struct commands[] = {
+	{"list", module_list},
+	{"name", module_name},
+	{"clone", module_clone},
+};
+
+int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
+{
+	int i;
+	if (argc < 2)
+		die(_("fatal: submodule--helper subcommand must be "
+		      "called with a subcommand"));
+
+	for (i = 0; i < ARRAY_SIZE(commands); i++)
+		if (!strcmp(argv[1], commands[i].cmd))
+			return commands[i].fn(argc - 1, argv + 1, prefix);
+
+	die(_("fatal: '%s' is not a valid submodule--helper "
+	      "subcommand"), argv[1]);
+}
diff --git a/builtin/tag.c b/builtin/tag.c
index f048cae..1705c94 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -17,271 +17,50 @@
 #include "gpg-interface.h"
 #include "sha1-array.h"
 #include "column.h"
+#include "ref-filter.h"
 
 static const char * const git_tag_usage[] = {
 	N_("git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> [<head>]"),
 	N_("git tag -d <tagname>..."),
 	N_("git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]"
-		"\n\t\t[<pattern>...]"),
+		"\n\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"),
 	N_("git tag -v <tagname>..."),
 	NULL
 };
 
-#define STRCMP_SORT     0	/* must be zero */
-#define VERCMP_SORT     1
-#define SORT_MASK       0x7fff
-#define REVERSE_SORT    0x8000
-
-static int tag_sort;
-
-struct tag_filter {
-	const char **patterns;
-	int lines;
-	int sort;
-	struct string_list tags;
-	struct commit_list *with_commit;
-};
-
-static struct sha1_array points_at;
 static unsigned int colopts;
 
-static int match_pattern(const char **patterns, const char *ref)
+static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, const char *format)
 {
-	/* no pattern means match everything */
-	if (!*patterns)
-		return 1;
-	for (; *patterns; patterns++)
-		if (!wildmatch(*patterns, ref, 0, NULL))
-			return 1;
-	return 0;
-}
-
-static const unsigned char *match_points_at(const char *refname,
-					    const unsigned char *sha1)
-{
-	const unsigned char *tagged_sha1 = NULL;
-	struct object *obj;
-
-	if (sha1_array_lookup(&points_at, sha1) >= 0)
-		return sha1;
-	obj = parse_object(sha1);
-	if (!obj)
-		die(_("malformed object at '%s'"), refname);
-	if (obj->type == OBJ_TAG)
-		tagged_sha1 = ((struct tag *)obj)->tagged->sha1;
-	if (tagged_sha1 && sha1_array_lookup(&points_at, tagged_sha1) >= 0)
-		return tagged_sha1;
-	return NULL;
-}
-
-static int in_commit_list(const struct commit_list *want, struct commit *c)
-{
-	for (; want; want = want->next)
-		if (!hashcmp(want->item->object.sha1, c->object.sha1))
-			return 1;
-	return 0;
-}
-
-enum contains_result {
-	CONTAINS_UNKNOWN = -1,
-	CONTAINS_NO = 0,
-	CONTAINS_YES = 1
-};
-
-/*
- * Test whether the candidate or one of its parents is contained in the list.
- * Do not recurse to find out, though, but return -1 if inconclusive.
- */
-static enum contains_result contains_test(struct commit *candidate,
-			    const struct commit_list *want)
-{
-	/* was it previously marked as containing a want commit? */
-	if (candidate->object.flags & TMP_MARK)
-		return 1;
-	/* or marked as not possibly containing a want commit? */
-	if (candidate->object.flags & UNINTERESTING)
-		return 0;
-	/* or are we it? */
-	if (in_commit_list(want, candidate)) {
-		candidate->object.flags |= TMP_MARK;
-		return 1;
-	}
-
-	if (parse_commit(candidate) < 0)
-		return 0;
-
-	return -1;
-}
-
-/*
- * Mimicking the real stack, this stack lives on the heap, avoiding stack
- * overflows.
- *
- * At each recursion step, the stack items points to the commits whose
- * ancestors are to be inspected.
- */
-struct stack {
-	int nr, alloc;
-	struct stack_entry {
-		struct commit *commit;
-		struct commit_list *parents;
-	} *stack;
-};
-
-static void push_to_stack(struct commit *candidate, struct stack *stack)
-{
-	int index = stack->nr++;
-	ALLOC_GROW(stack->stack, stack->nr, stack->alloc);
-	stack->stack[index].commit = candidate;
-	stack->stack[index].parents = candidate->parents;
-}
-
-static enum contains_result contains(struct commit *candidate,
-		const struct commit_list *want)
-{
-	struct stack stack = { 0, 0, NULL };
-	int result = contains_test(candidate, want);
-
-	if (result != CONTAINS_UNKNOWN)
-		return result;
-
-	push_to_stack(candidate, &stack);
-	while (stack.nr) {
-		struct stack_entry *entry = &stack.stack[stack.nr - 1];
-		struct commit *commit = entry->commit;
-		struct commit_list *parents = entry->parents;
-
-		if (!parents) {
-			commit->object.flags |= UNINTERESTING;
-			stack.nr--;
-		}
-		/*
-		 * If we just popped the stack, parents->item has been marked,
-		 * therefore contains_test will return a meaningful 0 or 1.
-		 */
-		else switch (contains_test(parents->item, want)) {
-		case CONTAINS_YES:
-			commit->object.flags |= TMP_MARK;
-			stack.nr--;
-			break;
-		case CONTAINS_NO:
-			entry->parents = parents->next;
-			break;
-		case CONTAINS_UNKNOWN:
-			push_to_stack(parents->item, &stack);
-			break;
-		}
-	}
-	free(stack.stack);
-	return contains_test(candidate, want);
-}
-
-static void show_tag_lines(const struct object_id *oid, int lines)
-{
+	struct ref_array array;
+	char *to_free = NULL;
 	int i;
-	unsigned long size;
-	enum object_type type;
-	char *buf, *sp, *eol;
-	size_t len;
 
-	buf = read_sha1_file(oid->hash, &type, &size);
-	if (!buf)
-		die_errno("unable to read object %s", oid_to_hex(oid));
-	if (type != OBJ_COMMIT && type != OBJ_TAG)
-		goto free_return;
-	if (!size)
-		die("an empty %s object %s?",
-		    typename(type), oid_to_hex(oid));
+	memset(&array, 0, sizeof(array));
 
-	/* skip header */
-	sp = strstr(buf, "\n\n");
-	if (!sp)
-		goto free_return;
+	if (filter->lines == -1)
+		filter->lines = 0;
 
-	/* only take up to "lines" lines, and strip the signature from a tag */
-	if (type == OBJ_TAG)
-		size = parse_signature(buf, size);
-	for (i = 0, sp += 2; i < lines && sp < buf + size; i++) {
-		if (i)
-			printf("\n    ");
-		eol = memchr(sp, '\n', size - (sp - buf));
-		len = eol ? eol - sp : size - (sp - buf);
-		fwrite(sp, len, 1, stdout);
-		if (!eol)
-			break;
-		sp = eol + 1;
-	}
-free_return:
-	free(buf);
-}
-
-static int show_reference(const char *refname, const struct object_id *oid,
-			  int flag, void *cb_data)
-{
-	struct tag_filter *filter = cb_data;
-
-	if (match_pattern(filter->patterns, refname)) {
-		if (filter->with_commit) {
-			struct commit *commit;
-
-			commit = lookup_commit_reference_gently(oid->hash, 1);
-			if (!commit)
-				return 0;
-			if (!contains(commit, filter->with_commit))
-				return 0;
-		}
-
-		if (points_at.nr && !match_points_at(refname, oid->hash))
-			return 0;
-
-		if (!filter->lines) {
-			if (filter->sort)
-				string_list_append(&filter->tags, refname);
-			else
-				printf("%s\n", refname);
-			return 0;
-		}
-		printf("%-15s ", refname);
-		show_tag_lines(oid, filter->lines);
-		putchar('\n');
+	if (!format) {
+		if (filter->lines) {
+			to_free = xstrfmt("%s %%(contents:lines=%d)",
+					  "%(align:15)%(refname:strip=2)%(end)",
+					  filter->lines);
+			format = to_free;
+		} else
+			format = "%(refname:strip=2)";
 	}
 
-	return 0;
-}
+	verify_ref_format(format);
+	filter->with_commit_tag_algo = 1;
+	filter_refs(&array, filter, FILTER_REFS_TAGS);
+	ref_array_sort(sorting, &array);
 
-static int sort_by_version(const void *a_, const void *b_)
-{
-	const struct string_list_item *a = a_;
-	const struct string_list_item *b = b_;
-	return versioncmp(a->string, b->string);
-}
+	for (i = 0; i < array.nr; i++)
+		show_ref_array_item(array.items[i], format, 0);
+	ref_array_clear(&array);
+	free(to_free);
 
-static int list_tags(const char **patterns, int lines,
-		     struct commit_list *with_commit, int sort)
-{
-	struct tag_filter filter;
-
-	filter.patterns = patterns;
-	filter.lines = lines;
-	filter.sort = sort;
-	filter.with_commit = with_commit;
-	memset(&filter.tags, 0, sizeof(filter.tags));
-	filter.tags.strdup_strings = 1;
-
-	for_each_tag_ref(show_reference, (void *)&filter);
-	if (sort) {
-		int i;
-		if ((sort & SORT_MASK) == VERCMP_SORT)
-			qsort(filter.tags.items, filter.tags.nr,
-			      sizeof(struct string_list_item), sort_by_version);
-		if (sort & REVERSE_SORT)
-			for (i = filter.tags.nr - 1; i >= 0; i--)
-				printf("%s\n", filter.tags.items[i].string);
-		else
-			for (i = 0; i < filter.tags.nr; i++)
-				printf("%s\n", filter.tags.items[i].string);
-		string_list_clear(&filter.tags, 0);
-	}
 	return 0;
 }
 
@@ -348,35 +127,26 @@
 	"Lines starting with '%c' will be kept; you may remove them"
 	" yourself if you want to.\n");
 
-/*
- * Parse a sort string, and return 0 if parsed successfully. Will return
- * non-zero when the sort string does not parse into a known type. If var is
- * given, the error message becomes a warning and includes information about
- * the configuration value.
- */
-static int parse_sort_string(const char *var, const char *arg, int *sort)
+/* Parse arg given and add it the ref_sorting array */
+static int parse_sorting_string(const char *arg, struct ref_sorting **sorting_tail)
 {
-	int type = 0, flags = 0;
+	struct ref_sorting *s;
+	int len;
 
-	if (skip_prefix(arg, "-", &arg))
-		flags |= REVERSE_SORT;
+	s = xcalloc(1, sizeof(*s));
+	s->next = *sorting_tail;
+	*sorting_tail = s;
 
-	if (skip_prefix(arg, "version:", &arg) || skip_prefix(arg, "v:", &arg))
-		type = VERCMP_SORT;
-	else
-		type = STRCMP_SORT;
-
-	if (strcmp(arg, "refname")) {
-		if (!var)
-			return error(_("unsupported sort specification '%s'"), arg);
-		else {
-			warning(_("unsupported sort specification '%s' in variable '%s'"),
-				var, arg);
-			return -1;
-		}
+	if (*arg == '-') {
+		s->reverse = 1;
+		arg++;
 	}
+	if (skip_prefix(arg, "version:", &arg) ||
+	    skip_prefix(arg, "v:", &arg))
+		s->version = 1;
 
-	*sort = (type | flags);
+	len = strlen(arg);
+	s->atom = parse_ref_filter_atom(arg, arg+len);
 
 	return 0;
 }
@@ -384,11 +154,12 @@
 static int git_tag_config(const char *var, const char *value, void *cb)
 {
 	int status;
+	struct ref_sorting **sorting_tail = (struct ref_sorting **)cb;
 
 	if (!strcmp(var, "tag.sort")) {
 		if (!value)
 			return config_error_nonbool(var);
-		parse_sort_string(var, value, &tag_sort);
+		parse_sorting_string(value, sorting_tail);
 		return 0;
 	}
 
@@ -546,30 +317,6 @@
 	return check_refname_format(sb->buf, 0);
 }
 
-static int parse_opt_points_at(const struct option *opt __attribute__((unused)),
-			const char *arg, int unset)
-{
-	unsigned char sha1[20];
-
-	if (unset) {
-		sha1_array_clear(&points_at);
-		return 0;
-	}
-	if (!arg)
-		return error(_("switch 'points-at' requires an object"));
-	if (get_sha1(arg, sha1))
-		return error(_("malformed object name '%s'"), arg);
-	sha1_array_append(&points_at, sha1);
-	return 0;
-}
-
-static int parse_opt_sort(const struct option *opt, const char *arg, int unset)
-{
-	int *sort = opt->value;
-
-	return parse_sort_string(NULL, arg, sort);
-}
-
 int cmd_tag(int argc, const char **argv, const char *prefix)
 {
 	struct strbuf buf = STRBUF_INIT;
@@ -578,17 +325,19 @@
 	const char *object_ref, *tag;
 	struct create_tag_options opt;
 	char *cleanup_arg = NULL;
-	int annotate = 0, force = 0, lines = -1;
 	int create_reflog = 0;
+	int annotate = 0, force = 0;
 	int cmdmode = 0;
 	const char *msgfile = NULL, *keyid = NULL;
 	struct msg_arg msg = { 0, STRBUF_INIT };
-	struct commit_list *with_commit = NULL;
 	struct ref_transaction *transaction;
 	struct strbuf err = STRBUF_INIT;
+	struct ref_filter filter;
+	static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
+	const char *format = NULL;
 	struct option options[] = {
 		OPT_CMDMODE('l', "list", &cmdmode, N_("list tag names"), 'l'),
-		{ OPTION_INTEGER, 'n', NULL, &lines, N_("n"),
+		{ OPTION_INTEGER, 'n', NULL, &filter.lines, N_("n"),
 				N_("print <n> lines of each tag message"),
 				PARSE_OPT_OPTARG, NULL, 1 },
 		OPT_CMDMODE('d', "delete", &cmdmode, N_("delete tags"), 'd'),
@@ -610,32 +359,25 @@
 
 		OPT_GROUP(N_("Tag listing options")),
 		OPT_COLUMN(0, "column", &colopts, N_("show tag list in columns")),
+		OPT_CONTAINS(&filter.with_commit, N_("print only tags that contain the commit")),
+		OPT_WITH(&filter.with_commit, N_("print only tags that contain the commit")),
+		OPT_MERGED(&filter, N_("print only tags that are merged")),
+		OPT_NO_MERGED(&filter, N_("print only tags that are not merged")),
+		OPT_CALLBACK(0 , "sort", sorting_tail, N_("key"),
+			     N_("field name to sort on"), &parse_opt_ref_sorting),
 		{
-			OPTION_CALLBACK, 0, "sort", &tag_sort, N_("type"), N_("sort tags"),
-			PARSE_OPT_NONEG, parse_opt_sort
+			OPTION_CALLBACK, 0, "points-at", &filter.points_at, N_("object"),
+			N_("print only tags of the object"), 0, parse_opt_object_name
 		},
-		{
-			OPTION_CALLBACK, 0, "contains", &with_commit, N_("commit"),
-			N_("print only tags that contain the commit"),
-			PARSE_OPT_LASTARG_DEFAULT,
-			parse_opt_with_commit, (intptr_t)"HEAD",
-		},
-		{
-			OPTION_CALLBACK, 0, "with", &with_commit, N_("commit"),
-			N_("print only tags that contain the commit"),
-			PARSE_OPT_HIDDEN | PARSE_OPT_LASTARG_DEFAULT,
-			parse_opt_with_commit, (intptr_t)"HEAD",
-		},
-		{
-			OPTION_CALLBACK, 0, "points-at", NULL, N_("object"),
-			N_("print only tags of the object"), 0, parse_opt_points_at
-		},
+		OPT_STRING(  0 , "format", &format, N_("format"), N_("format to use for the output")),
 		OPT_END()
 	};
 
-	git_config(git_tag_config, NULL);
+	git_config(git_tag_config, sorting_tail);
 
 	memset(&opt, 0, sizeof(opt));
+	memset(&filter, 0, sizeof(filter));
+	filter.lines = -1;
 
 	argc = parse_options(argc, argv, prefix, options, git_tag_usage, 0);
 
@@ -652,11 +394,13 @@
 		usage_with_options(git_tag_usage, options);
 
 	finalize_colopts(&colopts, -1);
-	if (cmdmode == 'l' && lines != -1) {
+	if (cmdmode == 'l' && filter.lines != -1) {
 		if (explicitly_enable_column(colopts))
 			die(_("--column and -n are incompatible"));
 		colopts = 0;
 	}
+	if (!sorting)
+		sorting = ref_default_sorting();
 	if (cmdmode == 'l') {
 		int ret;
 		if (column_active(colopts)) {
@@ -665,19 +409,20 @@
 			copts.padding = 2;
 			run_column_filter(colopts, &copts);
 		}
-		if (lines != -1 && tag_sort)
-			die(_("--sort and -n are incompatible"));
-		ret = list_tags(argv, lines == -1 ? 0 : lines, with_commit, tag_sort);
+		filter.name_patterns = argv;
+		ret = list_tags(&filter, sorting, format);
 		if (column_active(colopts))
 			stop_column_filter();
 		return ret;
 	}
-	if (lines != -1)
+	if (filter.lines != -1)
 		die(_("-n option is only allowed with -l."));
-	if (with_commit)
+	if (filter.with_commit)
 		die(_("--contains option is only allowed with -l."));
-	if (points_at.nr)
+	if (filter.points_at.nr)
 		die(_("--points-at option is only allowed with -l."));
+	if (filter.merge_commit)
+		die(_("--merged and --no-merged option are only allowed with -l"));
 	if (cmdmode == 'd')
 		return for_each_tag_name(argv, delete_tag);
 	if (cmdmode == 'v')
diff --git a/builtin/unpack-file.c b/builtin/unpack-file.c
index 1920029..6fc6bcd 100644
--- a/builtin/unpack-file.c
+++ b/builtin/unpack-file.c
@@ -12,7 +12,7 @@
 	if (!buf || type != OBJ_BLOB)
 		die("unable to read blob object %s", sha1_to_hex(sha1));
 
-	strcpy(path, ".merge_file_XXXXXX");
+	xsnprintf(path, sizeof(path), ".merge_file_XXXXXX");
 	fd = xmkstemp(path);
 	if (write_in_full(fd, buf, size) != size)
 		die_errno("unable to write temp-file");
diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c
index 7c3e79c..875e7ed 100644
--- a/builtin/unpack-objects.c
+++ b/builtin/unpack-objects.c
@@ -46,7 +46,7 @@
 	obj->buffer = buffer;
 	obj->size = size;
 	if (add_decoration(&obj_decorate, object, obj))
-		die("object %s tried to add buffer twice!", sha1_to_hex(object->sha1));
+		die("object %s tried to add buffer twice!", oid_to_hex(&object->oid));
 }
 
 /*
@@ -170,7 +170,7 @@
 	unsigned char sha1[20];
 
 	if (write_sha1_file(obj_buf->buffer, obj_buf->size, typename(obj->type), sha1) < 0)
-		die("failed to write object %s", sha1_to_hex(obj->sha1));
+		die("failed to write object %s", oid_to_hex(&obj->oid));
 	obj->flags |= FLAG_WRITTEN;
 }
 
@@ -194,7 +194,7 @@
 
 	if (!(obj->flags & FLAG_OPEN)) {
 		unsigned long size;
-		int type = sha1_object_info(obj->sha1, &size);
+		int type = sha1_object_info(obj->oid.hash, &size);
 		if (type != obj->type || type <= 0)
 			die("object of unexpected type");
 		obj->flags |= FLAG_WRITTEN;
@@ -203,12 +203,12 @@
 
 	obj_buf = lookup_object_buffer(obj);
 	if (!obj_buf)
-		die("Whoops! Cannot find object '%s'", sha1_to_hex(obj->sha1));
+		die("Whoops! Cannot find object '%s'", oid_to_hex(&obj->oid));
 	if (fsck_object(obj, obj_buf->buffer, obj_buf->size, &fsck_options))
 		die("Error in object");
 	fsck_options.walk = check_object;
 	if (fsck_walk(obj, NULL, &fsck_options))
-		die("Error on reachable objects of %s", sha1_to_hex(obj->sha1));
+		die("Error on reachable objects of %s", oid_to_hex(&obj->oid));
 	write_cached_object(obj, obj_buf);
 	return 0;
 }
diff --git a/builtin/upload-archive.c b/builtin/upload-archive.c
index 32ab94c..dbfe14f 100644
--- a/builtin/upload-archive.c
+++ b/builtin/upload-archive.c
@@ -49,15 +49,14 @@
 __attribute__((format (printf, 1, 2)))
 static void error_clnt(const char *fmt, ...)
 {
-	char buf[1024];
+	struct strbuf buf = STRBUF_INIT;
 	va_list params;
-	int len;
 
 	va_start(params, fmt);
-	len = vsprintf(buf, fmt, params);
+	strbuf_vaddf(&buf, fmt, params);
 	va_end(params);
-	send_sideband(1, 3, buf, len, LARGE_PACKET_MAX);
-	die("sent error to the client: %s", buf);
+	send_sideband(1, 3, buf.buf, buf.len, LARGE_PACKET_MAX);
+	die("sent error to the client: %s", buf.buf);
 }
 
 static ssize_t process_input(int child_fd, int band)
diff --git a/builtin/worktree.c b/builtin/worktree.c
index 33d2d37..0a45710 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -8,10 +8,13 @@
 #include "run-command.h"
 #include "sigchain.h"
 #include "refs.h"
+#include "utf8.h"
+#include "worktree.h"
 
 static const char * const worktree_usage[] = {
 	N_("git worktree add [<options>] <path> [<branch>]"),
 	N_("git worktree prune [<options>]"),
+	N_("git worktree list [<options>]"),
 	NULL
 };
 
@@ -49,7 +52,7 @@
 		return 1;
 	}
 	len = st.st_size;
-	path = xmalloc(len + 1);
+	path = xmallocz(len);
 	read_in_full(fd, path, len);
 	close(fd);
 	while (len && (path[len - 1] == '\n' || path[len - 1] == '\r'))
@@ -274,7 +277,7 @@
 
 	if (commit)
 		argv_array_pushl(&cp.args, "update-ref", "HEAD",
-				 sha1_to_hex(commit->object.sha1), NULL);
+				 oid_to_hex(&commit->object.oid), NULL);
 	else
 		argv_array_pushl(&cp.args, "symbolic-ref", "HEAD",
 				 symref.buf, NULL);
@@ -359,6 +362,89 @@
 	return add_worktree(path, branch, &opts);
 }
 
+static void show_worktree_porcelain(struct worktree *wt)
+{
+	printf("worktree %s\n", wt->path);
+	if (wt->is_bare)
+		printf("bare\n");
+	else {
+		printf("HEAD %s\n", sha1_to_hex(wt->head_sha1));
+		if (wt->is_detached)
+			printf("detached\n");
+		else
+			printf("branch %s\n", wt->head_ref);
+	}
+	printf("\n");
+}
+
+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);
+
+	strbuf_addf(&sb, "%-*s ", 1 + path_maxlen + path_adj, wt->path);
+	if (wt->is_bare)
+		strbuf_addstr(&sb, "(bare)");
+	else {
+		strbuf_addf(&sb, "%-*s ", abbrev_len,
+				find_unique_abbrev(wt->head_sha1, DEFAULT_ABBREV));
+		if (!wt->is_detached)
+			strbuf_addf(&sb, "[%s]", shorten_unambiguous_ref(wt->head_ref, 0));
+		else
+			strbuf_addstr(&sb, "(detached HEAD)");
+	}
+	printf("%s\n", sb.buf);
+
+	strbuf_release(&sb);
+}
+
+static void measure_widths(struct worktree **wt, int *abbrev, int *maxlen)
+{
+	int i;
+
+	for (i = 0; wt[i]; i++) {
+		int sha1_len;
+		int path_len = strlen(wt[i]->path);
+
+		if (path_len > *maxlen)
+			*maxlen = path_len;
+		sha1_len = strlen(find_unique_abbrev(wt[i]->head_sha1, *abbrev));
+		if (sha1_len > *abbrev)
+			*abbrev = sha1_len;
+	}
+}
+
+static int list(int ac, const char **av, const char *prefix)
+{
+	int porcelain = 0;
+
+	struct option options[] = {
+		OPT_BOOL(0, "porcelain", &porcelain, N_("machine-readable output")),
+		OPT_END()
+	};
+
+	ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
+	if (ac)
+		usage_with_options(worktree_usage, options);
+	else {
+		struct worktree **worktrees = get_worktrees();
+		int path_maxlen = 0, abbrev = DEFAULT_ABBREV, i;
+
+		if (!porcelain)
+			measure_widths(worktrees, &abbrev, &path_maxlen);
+
+		for (i = 0; worktrees[i]; i++) {
+			if (porcelain)
+				show_worktree_porcelain(worktrees[i]);
+			else
+				show_worktree(worktrees[i], path_maxlen, abbrev);
+		}
+		free_worktrees(worktrees);
+	}
+	return 0;
+}
+
 int cmd_worktree(int ac, const char **av, const char *prefix)
 {
 	struct option options[] = {
@@ -371,5 +457,7 @@
 		return add(ac - 1, av + 1, prefix);
 	if (!strcmp(av[1], "prune"))
 		return prune(ac - 1, av + 1, prefix);
+	if (!strcmp(av[1], "list"))
+		return list(ac - 1, av + 1, prefix);
 	usage_with_options(worktree_usage, options);
 }
diff --git a/bulk-checkin.c b/bulk-checkin.c
index 7cffc3a..4347f5c 100644
--- a/bulk-checkin.c
+++ b/bulk-checkin.c
@@ -200,8 +200,8 @@
 	if (seekback == (off_t) -1)
 		return error("cannot find the current offset");
 
-	header_len = sprintf((char *)obuf, "%s %" PRIuMAX,
-			     typename(type), (uintmax_t)size) + 1;
+	header_len = xsnprintf((char *)obuf, sizeof(obuf), "%s %" PRIuMAX,
+			       typename(type), (uintmax_t)size) + 1;
 	git_SHA1_Init(&ctx);
 	git_SHA1_Update(&ctx, obuf, header_len);
 
diff --git a/bundle.c b/bundle.c
index b9dacc0..506ac49 100644
--- a/bundle.c
+++ b/bundle.c
@@ -171,7 +171,7 @@
 		if (!(refs.objects[i].item->flags & SHOWN)) {
 			if (++ret == 1)
 				error("%s", message);
-			error("%s %s", sha1_to_hex(refs.objects[i].item->sha1),
+			error("%s %s", oid_to_hex(&refs.objects[i].item->oid),
 				refs.objects[i].name);
 		}
 
@@ -217,7 +217,7 @@
 	if (revs->max_age == -1 && revs->min_age == -1)
 		goto out;
 
-	buf = read_sha1_file(tag->sha1, &type, &size);
+	buf = read_sha1_file(tag->oid.hash, &type, &size);
 	if (!buf)
 		goto out;
 	line = memmem(buf, size, "\ntagger ", 8);
@@ -256,7 +256,7 @@
 		struct object *object = revs->pending.objects[i].item;
 		if (object->flags & UNINTERESTING)
 			write_or_die(pack_objects.in, "^", 1);
-		write_or_die(pack_objects.in, sha1_to_hex(object->sha1), 40);
+		write_or_die(pack_objects.in, oid_to_hex(&object->oid), GIT_SHA1_HEXSZ);
 		write_or_die(pack_objects.in, "\n", 1);
 	}
 	close(pack_objects.in);
@@ -321,16 +321,16 @@
 
 	for (i = 0; i < revs->pending.nr; i++) {
 		struct object_array_entry *e = revs->pending.objects + i;
-		unsigned char sha1[20];
+		struct object_id oid;
 		char *ref;
 		const char *display_ref;
 		int flag;
 
 		if (e->item->flags & UNINTERESTING)
 			continue;
-		if (dwim_ref(e->name, strlen(e->name), sha1, &ref) != 1)
+		if (dwim_ref(e->name, strlen(e->name), oid.hash, &ref) != 1)
 			goto skip_write_ref;
-		if (read_ref_full(e->name, RESOLVE_REF_READING, sha1, &flag))
+		if (read_ref_full(e->name, RESOLVE_REF_READING, oid.hash, &flag))
 			flag = 0;
 		display_ref = (flag & REF_ISSYMREF) ? e->name : ref;
 
@@ -360,13 +360,13 @@
 		 * commit that is referenced by the tag, and not the tag
 		 * itself.
 		 */
-		if (hashcmp(sha1, e->item->sha1)) {
+		if (oidcmp(&oid, &e->item->oid)) {
 			/*
 			 * Is this the positive end of a range expressed
 			 * in terms of a tag (e.g. v2.0 from the range
 			 * "v1.0..v2.0")?
 			 */
-			struct commit *one = lookup_commit_reference(sha1);
+			struct commit *one = lookup_commit_reference(oid.hash);
 			struct object *obj;
 
 			if (e->item == &(one->object)) {
@@ -378,7 +378,7 @@
 				 * end up triggering "empty bundle"
 				 * error.
 				 */
-				obj = parse_object_or_die(sha1, e->name);
+				obj = parse_object_or_die(oid.hash, e->name);
 				obj->flags |= SHOWN;
 				add_pending_object(revs, obj, e->name);
 			}
@@ -386,7 +386,7 @@
 		}
 
 		ref_count++;
-		write_or_die(bundle_fd, sha1_to_hex(e->item->sha1), 40);
+		write_or_die(bundle_fd, oid_to_hex(&e->item->oid), 40);
 		write_or_die(bundle_fd, " ", 1);
 		write_or_die(bundle_fd, display_ref, strlen(display_ref));
 		write_or_die(bundle_fd, "\n", 1);
diff --git a/cache-tree.c b/cache-tree.c
index feace8b..3ebf9c3 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -79,11 +79,9 @@
 	ALLOC_GROW(it->down, it->subtree_nr + 1, it->subtree_alloc);
 	it->subtree_nr++;
 
-	down = xmalloc(sizeof(*down) + pathlen + 1);
+	FLEX_ALLOC_MEM(down, name, path, pathlen);
 	down->cache_tree = NULL;
 	down->namelen = pathlen;
-	memcpy(down->name, path, pathlen);
-	down->name[pathlen] = 0;
 
 	if (pos < it->subtree_nr)
 		memmove(it->down + pos + 1,
@@ -377,7 +375,7 @@
 		 * they are not part of generated trees. Invalidate up
 		 * to root to force cache-tree users to read elsewhere.
 		 */
-		if (ce->ce_flags & CE_INTENT_TO_ADD) {
+		if (ce_intent_to_add(ce)) {
 			to_invalidate = 1;
 			continue;
 		}
@@ -657,7 +655,7 @@
 	struct name_entry entry;
 	int cnt;
 
-	hashcpy(it->sha1, tree->object.sha1);
+	hashcpy(it->sha1, tree->object.oid.hash);
 	init_tree_desc(&desc, tree->buffer, tree->size);
 	cnt = 0;
 	while (tree_entry(&desc, &entry)) {
diff --git a/cache.h b/cache.h
index 6f53962..1a2cec0 100644
--- a/cache.h
+++ b/cache.h
@@ -214,7 +214,7 @@
 #define CE_INTENT_TO_ADD     (1 << 29)
 #define CE_SKIP_WORKTREE     (1 << 30)
 /* CE_EXTENDED2 is for future extension */
-#define CE_EXTENDED2         (1 << 31)
+#define CE_EXTENDED2         (1U << 31)
 
 #define CE_EXTENDED_FLAGS (CE_INTENT_TO_ADD | CE_SKIP_WORKTREE)
 
@@ -228,7 +228,9 @@
 #error "CE_EXTENDED_FLAGS out of range"
 #endif
 
+/* Forward structure decls */
 struct pathspec;
+struct child_process;
 
 /*
  * Copy the sha1 and stat state of a cache entry from one to
@@ -259,6 +261,7 @@
 #define ce_uptodate(ce) ((ce)->ce_flags & CE_UPTODATE)
 #define ce_skip_worktree(ce) ((ce)->ce_flags & CE_SKIP_WORKTREE)
 #define ce_mark_uptodate(ce) ((ce)->ce_flags |= CE_UPTODATE)
+#define ce_intent_to_add(ce) ((ce)->ce_flags & CE_INTENT_TO_ADD)
 
 #define ce_permissions(mode) (((mode) & 0100) ? 0755 : 0644)
 static inline unsigned int create_ce_mode(unsigned int mode)
@@ -456,7 +459,6 @@
 extern int is_inside_work_tree(void);
 extern const char *get_git_dir(void);
 extern const char *get_git_common_dir(void);
-extern int is_git_directory(const char *path);
 extern char *get_object_directory(void);
 extern char *get_index_file(void);
 extern char *get_graft_file(void);
@@ -467,6 +469,25 @@
 extern const char *strip_namespace(const char *namespaced_ref);
 extern const char *get_git_work_tree(void);
 
+/*
+ * Return true if the given path is a git directory; note that this _just_
+ * looks at the directory itself. If you want to know whether "foo/.git"
+ * is a repository, you must feed that path, not just "foo".
+ */
+extern int is_git_directory(const char *path);
+
+/*
+ * Return 1 if the given path is the root of a git repository or
+ * submodule, else 0. Will not return 1 for bare repositories with the
+ * exception of creating a bare repository in "foo/.git" and calling
+ * is_git_repository("foo").
+ *
+ * If we run into read errors, we err on the side of saying "yes, it is",
+ * as we usually consider sub-repos precious, and would prefer to err on the
+ * side of not disrupting or deleting them.
+ */
+extern int is_nonbare_repository_dir(struct strbuf *path);
+
 #define READ_GITFILE_ERR_STAT_FAILED 1
 #define READ_GITFILE_ERR_NOT_A_FILE 2
 #define READ_GITFILE_ERR_OPEN_FAILED 3
@@ -750,6 +771,8 @@
 	__attribute__((format (printf, 3, 4)));
 extern void strbuf_git_path(struct strbuf *sb, const char *fmt, ...)
 	__attribute__((format (printf, 2, 3)));
+extern char *git_path_buf(struct strbuf *buf, const char *fmt, ...)
+	__attribute__((format (printf, 2, 3)));
 extern void strbuf_git_path_submodule(struct strbuf *sb, const char *path,
 				      const char *fmt, ...)
 	__attribute__((format (printf, 3, 4)));
@@ -810,8 +833,26 @@
  */
 extern char *sha1_pack_index_name(const unsigned char *sha1);
 
-extern const char *find_unique_abbrev(const unsigned char *sha1, int);
+/*
+ * Return an abbreviated sha1 unique within this repository's object database.
+ * The result will be at least `len` characters long, and will be NUL
+ * terminated.
+ *
+ * The non-`_r` version returns a static buffer which will be overwritten by
+ * subsequent calls.
+ *
+ * The `_r` variant writes to a buffer supplied by the caller, which must be at
+ * least `GIT_SHA1_HEXSZ + 1` bytes. The return value is the number of bytes
+ * written (excluding the NUL terminator).
+ *
+ * Note that while this version avoids the static buffer, it is not fully
+ * reentrant, as it calls into other non-reentrant git code.
+ */
+extern const char *find_unique_abbrev(const unsigned char *sha1, int len);
+extern int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len);
+
 extern const unsigned char null_sha1[GIT_SHA1_RAWSZ];
+extern const struct object_id null_oid;
 
 static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
 {
@@ -1029,6 +1070,9 @@
 	return has_sha1_file_with_flags(sha1, 0);
 }
 
+/* Same as the above, except for struct object_id. */
+extern int has_object_file(const struct object_id *oid);
+
 /*
  * Return true iff an alternate object database has a loose object
  * with the specified name.  This function does not respect replace
@@ -1092,6 +1136,18 @@
 extern int get_sha1_hex(const char *hex, unsigned char *sha1);
 extern int get_oid_hex(const char *hex, struct object_id *sha1);
 
+/*
+ * Convert a binary sha1 to its hex equivalent. The `_r` variant is reentrant,
+ * and writes the NUL-terminated output to the buffer `out`, which must be at
+ * least `GIT_SHA1_HEXSZ + 1` bytes, and returns a pointer to out for
+ * convenience.
+ *
+ * The non-`_r` variant returns a static buffer, but uses a ring of 4
+ * buffers, making it safe to make multiple calls for a single statement, like:
+ *
+ *   printf("%s -> %s", sha1_to_hex(one), sha1_to_hex(two));
+ */
+extern char *sha1_to_hex_r(char *out, const unsigned char *sha1);
 extern char *sha1_to_hex(const unsigned char *sha1);	/* static buffer result! */
 extern char *oid_to_hex(const struct object_id *oid);	/* same static buffer as sha1_to_hex */
 
@@ -1118,7 +1174,6 @@
 		DATE_NORMAL = 0,
 		DATE_RELATIVE,
 		DATE_SHORT,
-		DATE_LOCAL,
 		DATE_ISO8601,
 		DATE_ISO8601_STRICT,
 		DATE_RFC2822,
@@ -1126,6 +1181,7 @@
 		DATE_RAW
 	} type;
 	const char *strftime_fmt;
+	int local;
 };
 
 /*
@@ -1309,7 +1365,17 @@
 extern void unuse_pack(struct pack_window **);
 extern void free_pack_by_name(const char *);
 extern void clear_delta_base_cache(void);
-extern struct packed_git *add_packed_git(const char *, int, int);
+extern struct packed_git *add_packed_git(const char *path, size_t path_len, int local);
+
+/*
+ * Make sure that a pointer access into an mmap'd index file is within bounds,
+ * and can provide at least 8 bytes of data.
+ *
+ * Note that this is only necessary for variable-length segments of the file
+ * (like the 64-bit extended offset table), as we compare the size to the
+ * fixed-length parts when we open the file.
+ */
+extern void check_pack_index_ptr(const struct packed_git *p, const void *ptr);
 
 /*
  * Return the SHA-1 of the nth object within the specified packfile.
@@ -1431,7 +1497,7 @@
 /* git_config_parse_key() returns these negated: */
 #define CONFIG_INVALID_KEY 1
 #define CONFIG_NO_SECTION_OR_NAME 2
-/* git_config_set(), git_config_set_multivar() return the above or these: */
+/* git_config_set_gently(), git_config_set_multivar_gently() return the above or these: */
 #define CONFIG_NO_LOCK -1
 #define CONFIG_INVALID_FILE 3
 #define CONFIG_NO_WRITE 4
@@ -1469,12 +1535,16 @@
 extern int git_config_maybe_bool(const char *, const char *);
 extern int git_config_string(const char **, const char *, const char *);
 extern int git_config_pathname(const char **, const char *, const char *);
-extern int git_config_set_in_file(const char *, const char *, const char *);
-extern int git_config_set(const char *, const char *);
+extern int git_config_set_in_file_gently(const char *, const char *, const char *);
+extern void git_config_set_in_file(const char *, const char *, const char *);
+extern int git_config_set_gently(const char *, const char *);
+extern void git_config_set(const char *, const char *);
 extern int git_config_parse_key(const char *, char **, int *);
 extern int git_config_key_is_valid(const char *key);
-extern int git_config_set_multivar(const char *, const char *, const char *, int);
-extern int git_config_set_multivar_in_file(const char *, const char *, const char *, const char *, int);
+extern int git_config_set_multivar_gently(const char *, const char *, const char *, int);
+extern void git_config_set_multivar(const char *, const char *, const char *, int);
+extern int git_config_set_multivar_in_file_gently(const char *, const char *, const char *, const char *, int);
+extern void git_config_set_multivar_in_file(const char *, const char *, const char *, const char *, int);
 extern int git_config_rename_section(const char *, const char *);
 extern int git_config_rename_section_in_file(const char *, const char *, const char *);
 extern const char *git_etc_gitconfig(void);
@@ -1621,6 +1691,7 @@
 extern int term_columns(void);
 extern int decimal_width(uintmax_t);
 extern int check_pager_config(const char *cmd);
+extern void prepare_pager_args(struct child_process *, const char *pager);
 
 extern const char *editor_program;
 extern const char *askpass_program;
@@ -1737,4 +1808,12 @@
 int versioncmp(const char *s1, const char *s2);
 void sleep_millisec(int millisec);
 
+/*
+ * Create a directory and (if share is nonzero) adjust its permissions
+ * according to the shared_repository setting. Only use this for
+ * directories under $GIT_DIR.  Don't use it for working tree
+ * directories.
+ */
+void safe_create_dir(const char *dir, int share);
+
 #endif /* CACHE_H */
diff --git a/color.c b/color.c
index 9027352..8f85153 100644
--- a/color.c
+++ b/color.c
@@ -145,27 +145,34 @@
 	return color_parse_mem(value, strlen(value), dst);
 }
 
+void color_set(char *dst, const char *color_bytes)
+{
+	xsnprintf(dst, COLOR_MAXLEN, "%s", color_bytes);
+}
+
 /*
  * Write the ANSI color codes for "c" to "out"; the string should
  * already have the ANSI escape code in it. "out" should have enough
  * space in it to fit any color.
  */
-static char *color_output(char *out, const struct color *c, char type)
+static char *color_output(char *out, int len, const struct color *c, char type)
 {
 	switch (c->type) {
 	case COLOR_UNSPECIFIED:
 	case COLOR_NORMAL:
 		break;
 	case COLOR_ANSI:
+		if (len < 2)
+			die("BUG: color parsing ran out of space");
 		*out++ = type;
 		*out++ = '0' + c->value;
 		break;
 	case COLOR_256:
-		out += sprintf(out, "%c8;5;%d", type, c->value);
+		out += xsnprintf(out, len, "%c8;5;%d", type, c->value);
 		break;
 	case COLOR_RGB:
-		out += sprintf(out, "%c8;2;%d;%d;%d", type,
-			       c->red, c->green, c->blue);
+		out += xsnprintf(out, len, "%c8;2;%d;%d;%d", type,
+				 c->red, c->green, c->blue);
 		break;
 	}
 	return out;
@@ -180,12 +187,13 @@
 {
 	const char *ptr = value;
 	int len = value_len;
+	char *end = dst + COLOR_MAXLEN;
 	unsigned int attr = 0;
 	struct color fg = { COLOR_UNSPECIFIED };
 	struct color bg = { COLOR_UNSPECIFIED };
 
 	if (!strncasecmp(value, "reset", len)) {
-		strcpy(dst, GIT_COLOR_RESET);
+		xsnprintf(dst, end - dst, GIT_COLOR_RESET);
 		return 0;
 	}
 
@@ -224,12 +232,19 @@
 			goto bad;
 	}
 
+#undef OUT
+#define OUT(x) do { \
+	if (dst == end) \
+		die("BUG: color parsing ran out of space"); \
+	*dst++ = (x); \
+} while(0)
+
 	if (attr || !color_empty(&fg) || !color_empty(&bg)) {
 		int sep = 0;
 		int i;
 
-		*dst++ = '\033';
-		*dst++ = '[';
+		OUT('\033');
+		OUT('[');
 
 		for (i = 0; attr; i++) {
 			unsigned bit = (1 << i);
@@ -237,27 +252,28 @@
 				continue;
 			attr &= ~bit;
 			if (sep++)
-				*dst++ = ';';
-			dst += sprintf(dst, "%d", i);
+				OUT(';');
+			dst += xsnprintf(dst, end - dst, "%d", i);
 		}
 		if (!color_empty(&fg)) {
 			if (sep++)
-				*dst++ = ';';
+				OUT(';');
 			/* foreground colors are all in the 3x range */
-			dst = color_output(dst, &fg, '3');
+			dst = color_output(dst, end - dst, &fg, '3');
 		}
 		if (!color_empty(&bg)) {
 			if (sep++)
-				*dst++ = ';';
+				OUT(';');
 			/* background colors are all in the 4x range */
-			dst = color_output(dst, &bg, '4');
+			dst = color_output(dst, end - dst, &bg, '4');
 		}
-		*dst++ = 'm';
+		OUT('m');
 	}
-	*dst = 0;
+	OUT(0);
 	return 0;
 bad:
 	return error(_("invalid color value: %.*s"), value_len, value);
+#undef OUT
 }
 
 int git_config_colorbool(const char *var, const char *value)
diff --git a/color.h b/color.h
index 7fe77fb..e155d13 100644
--- a/color.h
+++ b/color.h
@@ -75,6 +75,13 @@
 int git_color_config(const char *var, const char *value, void *cb);
 int git_color_default_config(const char *var, const char *value, void *cb);
 
+/*
+ * Set the color buffer (which must be COLOR_MAXLEN bytes)
+ * to the raw color bytes; this is useful for initializing
+ * default color variables.
+ */
+void color_set(char *dst, const char *color_bytes);
+
 int git_config_colorbool(const char *var, const char *value);
 int want_color(int var);
 int color_parse(const char *value, char *dst);
diff --git a/column.c b/column.c
index 786abe6..d55ead1 100644
--- a/column.c
+++ b/column.c
@@ -164,7 +164,7 @@
 	data.colopts = colopts;
 	data.opts = *opts;
 
-	data.len = xmalloc(sizeof(*data.len) * list->nr);
+	ALLOC_ARRAY(data.len, list->nr);
 	for (i = 0; i < list->nr; i++)
 		data.len[i] = item_length(colopts, list->items[i].string);
 
@@ -173,9 +173,8 @@
 	if (colopts & COL_DENSE)
 		shrink_columns(&data);
 
-	empty_cell = xmalloc(initial_width + 1);
+	empty_cell = xmallocz(initial_width);
 	memset(empty_cell, ' ', initial_width);
-	empty_cell[initial_width] = '\0';
 	for (y = 0; y < data.rows; y++) {
 		for (x = 0; x < data.cols; x++)
 			if (display_cell(&data, initial_width, empty_cell, x, y))
diff --git a/combine-diff.c b/combine-diff.c
index 0f62f54..0e1d4b0 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -189,11 +189,11 @@
 	 *   - Else if we have NEW, insert newend lline into base and
 	 *   consume newend
 	 */
-	lcs = xcalloc(origbaselen + 1, sizeof(int*));
-	directions = xcalloc(origbaselen + 1, sizeof(enum coalesce_direction*));
+	lcs = xcalloc(st_add(origbaselen, 1), sizeof(int*));
+	directions = xcalloc(st_add(origbaselen, 1), sizeof(enum coalesce_direction*));
 	for (i = 0; i < origbaselen + 1; i++) {
-		lcs[i] = xcalloc(lennew + 1, sizeof(int));
-		directions[i] = xcalloc(lennew + 1, sizeof(enum coalesce_direction));
+		lcs[i] = xcalloc(st_add(lennew, 1), sizeof(int));
+		directions[i] = xcalloc(st_add(lennew, 1), sizeof(enum coalesce_direction));
 		directions[i][0] = BASE;
 	}
 	for (j = 1; j < lennew + 1; j++)
@@ -319,7 +319,7 @@
 	if (line[len-1] == '\n')
 		len--;
 
-	lline = xmalloc(sizeof(*lline) + len + 1);
+	FLEX_ALLOC_MEM(lline, line, line, len);
 	lline->len = len;
 	lline->next = NULL;
 	lline->prev = sline->plost.lost_tail;
@@ -330,8 +330,6 @@
 	sline->plost.lost_tail = lline;
 	sline->plost.len++;
 	lline->parent_map = this_mask;
-	memcpy(lline->line, line, len);
-	lline->line[len] = 0;
 }
 
 struct combine_diff_state {
@@ -1043,7 +1041,7 @@
 				elem->mode = canon_mode(S_IFLNK);
 
 			result_size = len;
-			result = xmalloc(len + 1);
+			result = xmallocz(len);
 
 			done = read_in_full(fd, result, len);
 			if (done < 0)
@@ -1051,8 +1049,6 @@
 			else if (done < len)
 				die("early EOF '%s'", elem->path);
 
-			result[len] = 0;
-
 			/* If not a fake symlink, apply filters, e.g. autocrlf */
 			if (is_file) {
 				struct strbuf buf = STRBUF_INIT;
@@ -1115,7 +1111,7 @@
 	if (result_size && result[result_size-1] != '\n')
 		cnt++; /* incomplete line */
 
-	sline = xcalloc(cnt+2, sizeof(*sline));
+	sline = xcalloc(st_add(cnt, 2), sizeof(*sline));
 	sline[0].bol = result;
 	for (lno = 0, cp = result; cp < result + result_size; cp++) {
 		if (*cp == '\n') {
@@ -1134,7 +1130,7 @@
 	/* 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((cnt+2) * num_parent, sizeof(unsigned long));
+	sline[0].p_lno = xcalloc(st_mult(st_add(cnt, 2), num_parent), sizeof(unsigned long));
 	for (lno = 0; lno <= cnt; lno++)
 		sline[lno+1].p_lno = sline[lno].p_lno + num_parent;
 
@@ -1266,7 +1262,7 @@
 	struct diff_filespec *pool;
 
 	pair = xmalloc(sizeof(*pair));
-	pool = xcalloc(num_parent + 1, sizeof(struct diff_filespec));
+	pool = xcalloc(st_add(num_parent, 1), sizeof(struct diff_filespec));
 	pair->one = pool + 1;
 	pair->two = pool;
 
@@ -1372,7 +1368,7 @@
 	struct combine_diff_path paths_head;
 	struct strbuf base;
 
-	parents_sha1 = xmalloc(nparent * sizeof(parents_sha1[0]));
+	ALLOC_ARRAY(parents_sha1, nparent);
 	for (i = 0; i < nparent; i++)
 		parents_sha1[i] = parents->sha1[i];
 
@@ -1483,7 +1479,7 @@
 	if (opt->orderfile && num_paths) {
 		struct obj_order *o;
 
-		o = xmalloc(sizeof(*o) * num_paths);
+		ALLOC_ARRAY(o, num_paths);
 		for (i = 0, p = paths; p; p = p->next, i++)
 			o[i].obj = p;
 		order_objects(opt->orderfile, path_path, o, num_paths);
@@ -1540,9 +1536,9 @@
 	struct sha1_array parents = SHA1_ARRAY_INIT;
 
 	while (parent) {
-		sha1_array_append(&parents, parent->item->object.sha1);
+		sha1_array_append(&parents, parent->item->object.oid.hash);
 		parent = parent->next;
 	}
-	diff_tree_combined(commit->object.sha1, &parents, dense, rev);
+	diff_tree_combined(commit->object.oid.hash, &parents, dense, rev);
 	sha1_array_clear(&parents);
 }
diff --git a/commit.c b/commit.c
index d1810c9..3f4f371 100644
--- a/commit.c
+++ b/commit.c
@@ -38,7 +38,7 @@
 	struct commit *c = lookup_commit_reference(sha1);
 	if (!c)
 		die(_("could not parse %s"), ref_name);
-	if (hashcmp(sha1, c->object.sha1)) {
+	if (hashcmp(sha1, c->object.oid.hash)) {
 		warning(_("%s %s is not a commit!"),
 			ref_name, sha1_to_hex(sha1));
 	}
@@ -147,7 +147,7 @@
 	if ((len + 1) % entry_size)
 		goto bad_graft_data;
 	i = (len + 1) / entry_size - 1;
-	graft = xmalloc(sizeof(*graft) + GIT_SHA1_RAWSZ * i);
+	graft = xmalloc(st_add(sizeof(*graft), st_mult(GIT_SHA1_RAWSZ, i)));
 	graft->nr_parent = i;
 	if (get_oid_hex(buf, &graft->oid))
 		goto bad_graft_data;
@@ -262,13 +262,13 @@
 	if (!ret) {
 		enum object_type type;
 		unsigned long size;
-		ret = read_sha1_file(commit->object.sha1, &type, &size);
+		ret = read_sha1_file(commit->object.oid.hash, &type, &size);
 		if (!ret)
 			die("cannot read commit object %s",
-			    sha1_to_hex(commit->object.sha1));
+			    oid_to_hex(&commit->object.oid));
 		if (type != OBJ_COMMIT)
 			die("expected commit for %s, got %s",
-			    sha1_to_hex(commit->object.sha1), typename(type));
+			    oid_to_hex(&commit->object.oid), typename(type));
 		if (sizep)
 			*sizep = size;
 	}
@@ -327,22 +327,22 @@
 	tail += size;
 	if (tail <= bufptr + tree_entry_len + 1 || memcmp(bufptr, "tree ", 5) ||
 			bufptr[tree_entry_len] != '\n')
-		return error("bogus commit object %s", sha1_to_hex(item->object.sha1));
+		return error("bogus commit object %s", oid_to_hex(&item->object.oid));
 	if (get_sha1_hex(bufptr + 5, parent.hash) < 0)
 		return error("bad tree pointer in commit %s",
-			     sha1_to_hex(item->object.sha1));
+			     oid_to_hex(&item->object.oid));
 	item->tree = lookup_tree(parent.hash);
 	bufptr += tree_entry_len + 1; /* "tree " + "hex sha1" + "\n" */
 	pptr = &item->parents;
 
-	graft = lookup_commit_graft(item->object.sha1);
+	graft = lookup_commit_graft(item->object.oid.hash);
 	while (bufptr + parent_entry_len < tail && !memcmp(bufptr, "parent ", 7)) {
 		struct commit *new_parent;
 
 		if (tail <= bufptr + parent_entry_len + 1 ||
 		    get_sha1_hex(bufptr + 7, parent.hash) ||
 		    bufptr[parent_entry_len] != '\n')
-			return error("bad parents in commit %s", sha1_to_hex(item->object.sha1));
+			return error("bad parents in commit %s", oid_to_hex(&item->object.oid));
 		bufptr += parent_entry_len + 1;
 		/*
 		 * The clone is shallow if nr_parent < 0, and we must
@@ -380,15 +380,15 @@
 		return -1;
 	if (item->object.parsed)
 		return 0;
-	buffer = read_sha1_file(item->object.sha1, &type, &size);
+	buffer = read_sha1_file(item->object.oid.hash, &type, &size);
 	if (!buffer)
 		return quiet_on_missing ? -1 :
 			error("Could not read %s",
-			     sha1_to_hex(item->object.sha1));
+			     oid_to_hex(&item->object.oid));
 	if (type != OBJ_COMMIT) {
 		free(buffer);
 		return error("Object %s not a commit",
-			     sha1_to_hex(item->object.sha1));
+			     oid_to_hex(&item->object.oid));
 	}
 	ret = parse_commit_buffer(item, buffer, size);
 	if (save_commit_buffer && !ret) {
@@ -403,7 +403,7 @@
 {
 	if (parse_commit(item))
 		die("unable to parse commit %s",
-		    item ? sha1_to_hex(item->object.sha1) : "(null)");
+		    item ? oid_to_hex(&item->object.oid) : "(null)");
 }
 
 int find_commit_subject(const char *commit_buffer, const char **subject)
@@ -563,7 +563,7 @@
 
 	for (i = 0; i < a->nr; i++) {
 		object = a->objects[i].item;
-		commit = lookup_commit_reference_gently(object->sha1, 1);
+		commit = lookup_commit_reference_gently(object->oid.hash, 1);
 		if (commit)
 			clear_commit_marks(commit, mark);
 	}
@@ -903,7 +903,7 @@
 
 	work = xcalloc(cnt, sizeof(*work));
 	redundant = xcalloc(cnt, 1);
-	filled_index = xmalloc(sizeof(*filled_index) * (cnt - 1));
+	ALLOC_ARRAY(filled_index, cnt - 1);
 
 	for (i = 0; i < cnt; i++)
 		parse_commit(array[i]);
@@ -1206,7 +1206,7 @@
 	desc = merge_remote_util(parent);
 	if (!desc || !desc->obj)
 		return;
-	buf = read_sha1_file(desc->obj->sha1, &type, &size);
+	buf = read_sha1_file(desc->obj->oid.hash, &type, &size);
 	if (!buf || type != OBJ_TAG)
 		goto free_return;
 	len = parse_signature(buf, size);
@@ -1539,7 +1539,7 @@
 	while (parents) {
 		struct commit *parent = pop_commit(&parents);
 		strbuf_addf(&buffer, "parent %s\n",
-			    sha1_to_hex(parent->object.sha1));
+			    oid_to_hex(&parent->object.oid));
 	}
 
 	/* Person/date information */
@@ -1623,7 +1623,7 @@
 {
 	for ( ; list; list = list->next) {
 		const char *format = list->next ? format_cur : format_last;
-		printf(format, sha1_to_hex(list->item->object.sha1));
+		printf(format, oid_to_hex(&list->item->object.oid));
 	}
 }
 
diff --git a/compat/basename.c b/compat/basename.c
index d8f8a3c..96bd953 100644
--- a/compat/basename.c
+++ b/compat/basename.c
@@ -1,15 +1,71 @@
 #include "../git-compat-util.h"
+#include "../strbuf.h"
 
 /* Adapted from libiberty's basename.c.  */
 char *gitbasename (char *path)
 {
 	const char *base;
-	/* Skip over the disk name in MSDOS pathnames. */
-	if (has_dos_drive_prefix(path))
-		path += 2;
+
+	if (path)
+		skip_dos_drive_prefix(&path);
+
+	if (!path || !*path)
+		return ".";
+
 	for (base = path; *path; path++) {
-		if (is_dir_sep(*path))
-			base = path + 1;
+		if (!is_dir_sep(*path))
+			continue;
+		do {
+			path++;
+		} while (is_dir_sep(*path));
+		if (*path)
+			base = path;
+		else
+			while (--path != base && is_dir_sep(*path))
+				*path = '\0';
 	}
 	return (char *)base;
 }
+
+char *gitdirname(char *path)
+{
+	static struct strbuf buf = STRBUF_INIT;
+	char *p = path, *slash = NULL, c;
+	int dos_drive_prefix;
+
+	if (!p)
+		return ".";
+
+	if ((dos_drive_prefix = skip_dos_drive_prefix(&p)) && !*p)
+		goto dot;
+
+	/*
+	 * POSIX.1-2001 says dirname("/") should return "/", and dirname("//")
+	 * should return "//", but dirname("///") should return "/" again.
+	 */
+	if (is_dir_sep(*p)) {
+		if (!p[1] || (is_dir_sep(p[1]) && !p[2]))
+			return path;
+		slash = ++p;
+	}
+	while ((c = *(p++)))
+		if (is_dir_sep(c)) {
+			char *tentative = p - 1;
+
+			/* POSIX.1-2001 says to ignore trailing slashes */
+			while (is_dir_sep(*p))
+				p++;
+			if (*p)
+				slash = tentative;
+		}
+
+	if (slash) {
+		*slash = '\0';
+		return path;
+	}
+
+dot:
+	strbuf_reset(&buf);
+	strbuf_addf(&buf, "%.*s.", dos_drive_prefix, path);
+	return buf.buf;
+}
diff --git a/compat/bswap.h b/compat/bswap.h
index 7fed637..d47c003 100644
--- a/compat/bswap.h
+++ b/compat/bswap.h
@@ -149,11 +149,12 @@
  * and is faster on architectures with memory alignment issues.
  */
 
-#if defined(__i386__) || defined(__x86_64__) || \
+#if !defined(NO_UNALIGNED_LOADS) && ( \
+    defined(__i386__) || defined(__x86_64__) || \
     defined(_M_IX86) || defined(_M_X64) || \
     defined(__ppc__) || defined(__ppc64__) || \
     defined(__powerpc__) || defined(__powerpc64__) || \
-    defined(__s390__) || defined(__s390x__)
+    defined(__s390__) || defined(__s390x__))
 
 #define get_be16(p)	ntohs(*(unsigned short *)(p))
 #define get_be32(p)	ntohl(*(unsigned int *)(p))
diff --git a/compat/hstrerror.c b/compat/hstrerror.c
index 069c555..b85a2fa 100644
--- a/compat/hstrerror.c
+++ b/compat/hstrerror.c
@@ -16,6 +16,6 @@
 	case TRY_AGAIN:
 		return "Non-authoritative \"host not found\", or SERVERFAIL";
 	}
-	sprintf(buffer, "Name resolution error %d", err);
+	snprintf(buffer, sizeof(buffer), "Name resolution error %d", err);
 	return buffer;
 }
diff --git a/compat/inet_ntop.c b/compat/inet_ntop.c
index 90b7cc4..6830726 100644
--- a/compat/inet_ntop.c
+++ b/compat/inet_ntop.c
@@ -53,11 +53,11 @@
 	nprinted = snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]);
 	if (nprinted < 0)
 		return (NULL);	/* we assume "errno" was set by "snprintf()" */
-	if ((size_t)nprinted > size) {
+	if ((size_t)nprinted >= size) {
 		errno = ENOSPC;
 		return (NULL);
 	}
-	strcpy(dst, tmp);
+	strlcpy(dst, tmp, size);
 	return (dst);
 }
 
@@ -154,7 +154,7 @@
 		errno = ENOSPC;
 		return (NULL);
 	}
-	strcpy(dst, tmp);
+	strlcpy(dst, tmp, size);
 	return (dst);
 }
 #endif
diff --git a/compat/mingw.c b/compat/mingw.c
index f74da23..af56c1f 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -394,6 +394,23 @@
 	return ret;
 }
 
+#undef write
+ssize_t mingw_write(int fd, const void *buf, size_t len)
+{
+	ssize_t result = write(fd, buf, len);
+
+	if (result < 0 && errno == EINVAL && buf) {
+		/* check if fd is a pipe */
+		HANDLE h = (HANDLE) _get_osfhandle(fd);
+		if (GetFileType(h) == FILE_TYPE_PIPE)
+			errno = EPIPE;
+		else
+			errno = EINVAL;
+	}
+
+	return result;
+}
+
 int mingw_access(const char *filename, int mode)
 {
 	wchar_t wfilename[MAX_PATH];
@@ -752,7 +769,7 @@
 		return arg;
 
 	/* insert \ where necessary */
-	d = q = xmalloc(len+n+3);
+	d = q = xmalloc(st_add3(len, n, 3));
 	*d++ = '"';
 	while (*arg) {
 		if (*arg == '"')
@@ -835,7 +852,7 @@
 	if (!n)
 		return NULL;
 
-	path = xmalloc((n+1)*sizeof(char *));
+	ALLOC_ARRAY(path, n + 1);
 	p = envpath;
 	i = 0;
 	do {
@@ -920,7 +937,7 @@
 		i++;
 
 	/* copy the environment, leaving space for changes */
-	tmpenv = xmalloc((size + i) * sizeof(char*));
+	ALLOC_ARRAY(tmpenv, size + i);
 	memcpy(tmpenv, environ, size * sizeof(char*));
 
 	/* merge supplied environment changes into the temporary environment */
@@ -1011,7 +1028,7 @@
 			free(quoted);
 	}
 
-	wargs = xmalloc((2 * args.len + 1) * sizeof(wchar_t));
+	ALLOC_ARRAY(wargs, st_add(st_mult(2, args.len), 1));
 	xutftowcs(wargs, args.buf, 2 * args.len + 1);
 	strbuf_release(&args);
 
@@ -1110,7 +1127,7 @@
 		int argc = 0;
 		const char **argv2;
 		while (argv[argc]) argc++;
-		argv2 = xmalloc(sizeof(*argv) * (argc+1));
+		ALLOC_ARRAY(argv2, argc + 1);
 		argv2[0] = (char *)cmd;	/* full path to the script file */
 		memcpy(&argv2[1], &argv[1], sizeof(*argv) * argc);
 		pid = mingw_spawnv(prog, argv2, 1);
@@ -1915,28 +1932,31 @@
 	return -1;
 }
 
+int mingw_skip_dos_drive_prefix(char **path)
+{
+	int ret = has_dos_drive_prefix(*path);
+	*path += ret;
+	return ret;
+}
+
 int mingw_offset_1st_component(const char *path)
 {
-	int offset = 0;
-	if (has_dos_drive_prefix(path))
-		offset = 2;
+	char *pos = (char *)path;
 
 	/* unc paths */
-	else if (is_dir_sep(path[0]) && is_dir_sep(path[1])) {
-
+	if (!skip_dos_drive_prefix(&pos) &&
+			is_dir_sep(pos[0]) && is_dir_sep(pos[1])) {
 		/* skip server name */
-		char *pos = strpbrk(path + 2, "\\/");
+		pos = strpbrk(pos + 2, "\\/");
 		if (!pos)
 			return 0; /* Error: malformed unc path */
 
 		do {
 			pos++;
 		} while (*pos && !is_dir_sep(*pos));
-
-		offset = pos - path;
 	}
 
-	return offset + is_dir_sep(path[offset]);
+	return pos + is_dir_sep(*pos) - path;
 }
 
 int xutftowcsn(wchar_t *wcs, const char *utfs, size_t wcslen, int utflen)
@@ -2131,11 +2151,13 @@
 
 int uname(struct utsname *buf)
 {
-	DWORD v = GetVersion();
+	unsigned v = (unsigned)GetVersion();
 	memset(buf, 0, sizeof(*buf));
-	strcpy(buf->sysname, "Windows");
-	sprintf(buf->release, "%u.%u", v & 0xff, (v >> 8) & 0xff);
+	xsnprintf(buf->sysname, sizeof(buf->sysname), "Windows");
+	xsnprintf(buf->release, sizeof(buf->release),
+		 "%u.%u", v & 0xff, (v >> 8) & 0xff);
 	/* assuming NT variants only.. */
-	sprintf(buf->version, "%u", (v >> 16) & 0x7fff);
+	xsnprintf(buf->version, sizeof(buf->version),
+		  "%u", (v >> 16) & 0x7fff);
 	return 0;
 }
diff --git a/compat/mingw.h b/compat/mingw.h
index 738865c..a5fb52f 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -210,6 +210,9 @@
 int mingw_fflush(FILE *stream);
 #define fflush mingw_fflush
 
+ssize_t mingw_write(int fd, const void *buf, size_t len);
+#define write mingw_write
+
 int mingw_access(const char *filename, int mode);
 #undef access
 #define access mingw_access
@@ -358,7 +361,10 @@
  * git specific compatibility
  */
 
-#define has_dos_drive_prefix(path) (isalpha(*(path)) && (path)[1] == ':')
+#define has_dos_drive_prefix(path) \
+	(isalpha(*(path)) && (path)[1] == ':' ? 2 : 0)
+int mingw_skip_dos_drive_prefix(char **path);
+#define skip_dos_drive_prefix mingw_skip_dos_drive_prefix
 #define is_dir_sep(c) ((c) == '/' || (c) == '\\')
 static inline char *mingw_find_last_dir_sep(const char *path)
 {
diff --git a/compat/nedmalloc/nedmalloc.c b/compat/nedmalloc/nedmalloc.c
index 609ebba..a0a16eb 100644
--- a/compat/nedmalloc/nedmalloc.c
+++ b/compat/nedmalloc/nedmalloc.c
@@ -957,8 +957,9 @@
 {
 	char *s2 = 0;
 	if (s1) {
-		s2 = malloc(strlen(s1) + 1);
-		strcpy(s2, s1);
+		size_t len = strlen(s1) + 1;
+		s2 = malloc(len);
+		memcpy(s2, s1, len);
 	}
 	return s2;
 }
diff --git a/compat/precompose_utf8.c b/compat/precompose_utf8.c
index 95fe849..dfbe6d8 100644
--- a/compat/precompose_utf8.c
+++ b/compat/precompose_utf8.c
@@ -36,24 +36,27 @@
 }
 
 
-void probe_utf8_pathname_composition(char *path, int len)
+void probe_utf8_pathname_composition(void)
 {
+	struct strbuf path = STRBUF_INIT;
 	static const char *auml_nfc = "\xc3\xa4";
 	static const char *auml_nfd = "\x61\xcc\x88";
 	int output_fd;
 	if (precomposed_unicode != -1)
 		return; /* We found it defined in the global config, respect it */
-	strcpy(path + len, auml_nfc);
-	output_fd = open(path, O_CREAT|O_EXCL|O_RDWR, 0600);
+	git_path_buf(&path, "%s", auml_nfc);
+	output_fd = open(path.buf, O_CREAT|O_EXCL|O_RDWR, 0600);
 	if (output_fd >= 0) {
 		close(output_fd);
-		strcpy(path + len, auml_nfd);
-		precomposed_unicode = access(path, R_OK) ? 0 : 1;
-		git_config_set("core.precomposeunicode", precomposed_unicode ? "true" : "false");
-		strcpy(path + len, auml_nfc);
-		if (unlink(path))
-			die_errno(_("failed to unlink '%s'"), path);
+		git_path_buf(&path, "%s", auml_nfd);
+		precomposed_unicode = access(path.buf, R_OK) ? 0 : 1;
+		git_config_set("core.precomposeunicode",
+			       precomposed_unicode ? "true" : "false");
+		git_path_buf(&path, "%s", auml_nfc);
+		if (unlink(path.buf))
+			die_errno(_("failed to unlink '%s'"), path.buf);
 	}
+	strbuf_release(&path);
 }
 
 
@@ -139,9 +142,8 @@
 				size_t inleft = namelenz;
 				char *outpos = &prec_dir->dirent_nfc->d_name[0];
 				size_t outsz = prec_dir->dirent_nfc->max_name_len;
-				size_t cnt;
 				errno = 0;
-				cnt = iconv(prec_dir->ic_precompose, &cp, &inleft, &outpos, &outsz);
+				iconv(prec_dir->ic_precompose, &cp, &inleft, &outpos, &outsz);
 				if (errno || inleft) {
 					/*
 					 * iconv() failed and errno could be E2BIG, EILSEQ, EINVAL, EBADF
diff --git a/compat/precompose_utf8.h b/compat/precompose_utf8.h
index 3b73585..a94e7c4 100644
--- a/compat/precompose_utf8.h
+++ b/compat/precompose_utf8.h
@@ -27,7 +27,7 @@
 } PREC_DIR;
 
 void precompose_argv(int argc, const char **argv);
-void probe_utf8_pathname_composition(char *, int);
+void probe_utf8_pathname_composition(void);
 
 PREC_DIR *precompose_utf8_opendir(const char *dirname);
 struct dirent_prec_psx *precompose_utf8_readdir(PREC_DIR *dirp);
diff --git a/compat/qsort.c b/compat/qsort.c
index 9574d53..7d071af 100644
--- a/compat/qsort.c
+++ b/compat/qsort.c
@@ -47,7 +47,7 @@
 void git_qsort(void *b, size_t n, size_t s,
 	       int (*cmp)(const void *, const void *))
 {
-	const size_t size = n * s;
+	const size_t size = st_mult(n, s);
 	char buf[1024];
 
 	if (size < sizeof(buf)) {
diff --git a/compat/setenv.c b/compat/setenv.c
index fc1439a..7849f25 100644
--- a/compat/setenv.c
+++ b/compat/setenv.c
@@ -18,7 +18,7 @@
 
 	namelen = strlen(name);
 	valuelen = strlen(value);
-	envstr = malloc((namelen + valuelen + 2));
+	envstr = malloc(st_add3(namelen, valuelen, 2));
 	if (!envstr) {
 		errno = ENOMEM;
 		return -1;
diff --git a/compat/win32/syslog.c b/compat/win32/syslog.c
index d015e43..b905aea 100644
--- a/compat/win32/syslog.c
+++ b/compat/win32/syslog.c
@@ -32,7 +32,7 @@
 		return;
 	}
 
-	str = malloc(str_len + 1);
+	str = malloc(st_add(str_len, 1));
 	if (!str) {
 		warning("malloc failed: '%s'", strerror(errno));
 		return;
@@ -43,7 +43,7 @@
 	va_end(ap);
 
 	while ((pos = strstr(str, "%1")) != NULL) {
-		str = realloc(str, ++str_len + 1);
+		str = realloc(str, st_add(++str_len, 1));
 		if (!str) {
 			warning("realloc failed: '%s'", strerror(errno));
 			return;
diff --git a/compat/winansi.c b/compat/winansi.c
index efc5bb3..ceff55b 100644
--- a/compat/winansi.c
+++ b/compat/winansi.c
@@ -539,7 +539,7 @@
 		return;
 
 	/* create a named pipe to communicate with the console thread */
-	sprintf(name, "\\\\.\\pipe\\winansi%lu", GetCurrentProcessId());
+	xsnprintf(name, sizeof(name), "\\\\.\\pipe\\winansi%lu", GetCurrentProcessId());
 	hwrite = CreateNamedPipe(name, PIPE_ACCESS_OUTBOUND,
 		PIPE_TYPE_BYTE | PIPE_WAIT, 1, BUFFER_SIZE, 0, 0, NULL);
 	if (hwrite == INVALID_HANDLE_VALUE)
diff --git a/config.c b/config.c
index 86a5eb2..03544e7 100644
--- a/config.c
+++ b/config.c
@@ -1825,15 +1825,26 @@
 	return offset;
 }
 
-int git_config_set_in_file(const char *config_filename,
-			const char *key, const char *value)
+int git_config_set_in_file_gently(const char *config_filename,
+				  const char *key, const char *value)
 {
-	return git_config_set_multivar_in_file(config_filename, key, value, NULL, 0);
+	return git_config_set_multivar_in_file_gently(config_filename, key, value, NULL, 0);
 }
 
-int git_config_set(const char *key, const char *value)
+void git_config_set_in_file(const char *config_filename,
+			    const char *key, const char *value)
 {
-	return git_config_set_multivar(key, value, NULL, 0);
+	git_config_set_multivar_in_file(config_filename, key, value, NULL, 0);
+}
+
+int git_config_set_gently(const char *key, const char *value)
+{
+	return git_config_set_multivar_gently(key, value, NULL, 0);
+}
+
+void git_config_set(const char *key, const char *value)
+{
+	git_config_set_multivar(key, value, NULL, 0);
 }
 
 /*
@@ -1878,7 +1889,7 @@
 	 * Validate the key and while at it, lower case it for matching.
 	 */
 	if (store_key)
-		*store_key = xmalloc(strlen(key) + 1);
+		*store_key = xmallocz(strlen(key));
 
 	dot = 0;
 	for (i = 0; key[i]; i++) {
@@ -1902,8 +1913,6 @@
 		if (store_key)
 			(*store_key)[i] = c;
 	}
-	if (store_key)
-		(*store_key)[i] = 0;
 
 	return 0;
 
@@ -1950,9 +1959,10 @@
  * - the config file is removed and the lock file rename()d to it.
  *
  */
-int git_config_set_multivar_in_file(const char *config_filename,
-				const char *key, const char *value,
-				const char *value_regex, int multi_replace)
+int git_config_set_multivar_in_file_gently(const char *config_filename,
+					   const char *key, const char *value,
+					   const char *value_regex,
+					   int multi_replace)
 {
 	int fd = -1, in_fd = -1;
 	int ret;
@@ -2179,11 +2189,27 @@
 
 }
 
-int git_config_set_multivar(const char *key, const char *value,
-			const char *value_regex, int multi_replace)
+void git_config_set_multivar_in_file(const char *config_filename,
+				     const char *key, const char *value,
+				     const char *value_regex, int multi_replace)
 {
-	return git_config_set_multivar_in_file(NULL, key, value, value_regex,
-					       multi_replace);
+	if (git_config_set_multivar_in_file_gently(config_filename, key, value,
+						   value_regex, multi_replace) < 0)
+		die(_("Could not set '%s' to '%s'"), key, value);
+}
+
+int git_config_set_multivar_gently(const char *key, const char *value,
+				   const char *value_regex, int multi_replace)
+{
+	return git_config_set_multivar_in_file_gently(NULL, key, value, value_regex,
+						      multi_replace);
+}
+
+void git_config_set_multivar(const char *key, const char *value,
+			     const char *value_regex, int multi_replace)
+{
+	git_config_set_multivar_in_file(NULL, key, value, value_regex,
+					multi_replace);
 }
 
 static int section_name_match (const char *buf, const char *name)
diff --git a/config.mak.uname b/config.mak.uname
index 943c439..f34dcaa 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -166,7 +166,6 @@
 ifeq ($(uname_O),Cygwin)
 	ifeq ($(shell expr "$(uname_R)" : '1\.[1-6]\.'),4)
 		NO_D_TYPE_IN_DIRENT = YesPlease
-		NO_D_INO_IN_DIRENT = YesPlease
 		NO_STRCASESTR = YesPlease
 		NO_MEMMEM = YesPlease
 		NO_MKSTEMPS = YesPlease
@@ -370,7 +369,6 @@
 	NO_POSIX_GOODIES = UnfortunatelyYes
 	NATIVE_CRLF = YesPlease
 	DEFAULT_HELP_FORMAT = html
-	NO_D_INO_IN_DIRENT = YesPlease
 
 	CC = compat/vcbuild/scripts/clink.pl
 	AR = compat/vcbuild/scripts/lib.pl
@@ -520,7 +518,6 @@
 	NO_INET_NTOP = YesPlease
 	NO_POSIX_GOODIES = UnfortunatelyYes
 	DEFAULT_HELP_FORMAT = html
-	NO_D_INO_IN_DIRENT = YesPlease
 	COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -D_USE_32BIT_TIME_T -DNOGDI -Icompat -Icompat/win32
 	COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
 	COMPAT_OBJS += compat/mingw.o compat/winansi.o \
diff --git a/configure.ac b/configure.ac
index 1f55009..89e2590 100644
--- a/configure.ac
+++ b/configure.ac
@@ -790,13 +790,6 @@
 	GIT_CONF_SUBST([NO_NSEC])
 fi
 #
-# Define NO_D_INO_IN_DIRENT if you don't have d_ino in your struct dirent.
-AC_CHECK_MEMBER(struct dirent.d_ino,
-[NO_D_INO_IN_DIRENT=],
-[NO_D_INO_IN_DIRENT=YesPlease],
-[#include <dirent.h>])
-GIT_CONF_SUBST([NO_D_INO_IN_DIRENT])
-#
 # Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
 # d_type in struct dirent (latest Cygwin -- will be fixed soonish).
 AC_CHECK_MEMBER(struct dirent.d_type,
diff --git a/connect.c b/connect.c
index d3283b8..fd7ffe1 100644
--- a/connect.c
+++ b/connect.c
@@ -120,7 +120,7 @@
 	*list = NULL;
 	for (;;) {
 		struct ref *ref;
-		unsigned char old_sha1[20];
+		struct object_id old_oid;
 		char *name;
 		int len, name_len;
 		char *buffer = packet_buffer;
@@ -139,34 +139,36 @@
 		if (len > 4 && skip_prefix(buffer, "ERR ", &arg))
 			die("remote error: %s", arg);
 
-		if (len == 48 && skip_prefix(buffer, "shallow ", &arg)) {
-			if (get_sha1_hex(arg, old_sha1))
+		if (len == GIT_SHA1_HEXSZ + strlen("shallow ") &&
+			skip_prefix(buffer, "shallow ", &arg)) {
+			if (get_oid_hex(arg, &old_oid))
 				die("protocol error: expected shallow sha-1, got '%s'", arg);
 			if (!shallow_points)
 				die("repository on the other end cannot be shallow");
-			sha1_array_append(shallow_points, old_sha1);
+			sha1_array_append(shallow_points, old_oid.hash);
 			continue;
 		}
 
-		if (len < 42 || get_sha1_hex(buffer, old_sha1) || buffer[40] != ' ')
+		if (len < GIT_SHA1_HEXSZ + 2 || get_oid_hex(buffer, &old_oid) ||
+			buffer[GIT_SHA1_HEXSZ] != ' ')
 			die("protocol error: expected sha/ref, got '%s'", buffer);
-		name = buffer + 41;
+		name = buffer + GIT_SHA1_HEXSZ + 1;
 
 		name_len = strlen(name);
-		if (len != name_len + 41) {
+		if (len != name_len + GIT_SHA1_HEXSZ + 1) {
 			free(server_capabilities);
 			server_capabilities = xstrdup(name + name_len + 1);
 		}
 
 		if (extra_have && !strcmp(name, ".have")) {
-			sha1_array_append(extra_have, old_sha1);
+			sha1_array_append(extra_have, old_oid.hash);
 			continue;
 		}
 
 		if (!check_ref(name, flags))
 			continue;
-		ref = alloc_ref(buffer + 41);
-		hashcpy(ref->old_sha1, old_sha1);
+		ref = alloc_ref(buffer + GIT_SHA1_HEXSZ + 1);
+		oidcpy(&ref->old_oid, &old_oid);
 		*list = ref;
 		list = &ref->next;
 		got_at_least_one_head = 1;
@@ -333,7 +335,7 @@
 	static char addr[NI_MAXHOST];
 	if (getnameinfo(ai->ai_addr, ai->ai_addrlen, addr, sizeof(addr), NULL, 0,
 			NI_NUMERICHOST) != 0)
-		strcpy(addr, "(unknown)");
+		xsnprintf(addr, sizeof(addr), "(unknown)");
 
 	return addr;
 }
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index b383ed0..00d7299 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -10,6 +10,7 @@
 #    *) local and remote tag names
 #    *) .git/remotes file names
 #    *) git 'subcommands'
+#    *) git email aliases for git-send-email
 #    *) tree paths within 'ref:path/to/file' expressions
 #    *) file paths within current working directory and index
 #    *) common --long-options
@@ -1168,7 +1169,7 @@
 			--no-prefix --src-prefix= --dst-prefix=
 			--inter-hunk-context=
 			--patience --histogram --minimal
-			--raw --word-diff
+			--raw --word-diff --word-diff-regex=
 			--dirstat --dirstat= --dirstat-by-file
 			--dirstat-by-file= --cumulative
 			--diff-algorithm=
@@ -1686,8 +1687,12 @@
 			--preserve-merges --stat --no-stat
 			--committer-date-is-author-date --ignore-date
 			--ignore-whitespace --whitespace=
-			--autosquash --fork-point --no-fork-point
-			--autostash
+			--autosquash --no-autosquash
+			--fork-point --no-fork-point
+			--autostash --no-autostash
+			--verify --no-verify
+			--keep-empty --root --force-rebase --no-ff
+			--exec
 			"
 
 		return
@@ -1712,6 +1717,15 @@
 
 _git_send_email ()
 {
+	case "$prev" in
+	--to|--cc|--bcc|--from)
+		__gitcomp "
+		$(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
+		"
+		return
+		;;
+	esac
+
 	case "$cur" in
 	--confirm=*)
 		__gitcomp "
@@ -1736,6 +1750,12 @@
 			" "" "${cur##--thread=}"
 		return
 		;;
+	--to=*|--cc=*|--bcc=*|--from=*)
+		__gitcomp "
+		$(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
+		" "" "${cur#--*=}"
+		return
+		;;
 	--*)
 		__gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
 			--compose --confirm= --dry-run --envelope-sender
@@ -2352,7 +2372,7 @@
 	case "$cur" in
 	--*)
 		__gitcomp "
-			--all --remotes --topo-order --current --more=
+			--all --remotes --topo-order --date-order --current --more=
 			--list --independent --merge-base --no-name
 			--color --no-color
 			--sha1-name --sparse --topics --reflog
@@ -2365,7 +2385,7 @@
 
 _git_stash ()
 {
-	local save_opts='--keep-index --no-keep-index --quiet --patch'
+	local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
 	local subcommands='save list show apply clear drop pop create branch'
 	local subcommand="$(__git_find_on_cmdline "$subcommands")"
 	if [ -z "$subcommand" ]; then
@@ -2387,9 +2407,20 @@
 		apply,--*|pop,--*)
 			__gitcomp "--index --quiet"
 			;;
-		show,--*|drop,--*|branch,--*)
+		drop,--*)
+			__gitcomp "--quiet"
 			;;
-		show,*|apply,*|drop,*|pop,*|branch,*)
+		show,--*|branch,--*)
+			;;
+		branch,*)
+			if [ $cword -eq 3 ]; then
+				__gitcomp_nl "$(__git_refs)";
+			else
+				__gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
+						| sed -n -e 's/:.*//p')"
+			fi
+			;;
+		show,*|apply,*|drop,*|pop,*)
 			__gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
 					| sed -n -e 's/:.*//p')"
 			;;
diff --git a/contrib/hooks/multimail/CHANGES b/contrib/hooks/multimail/CHANGES
index 6bb1230..bc77e66 100644
--- a/contrib/hooks/multimail/CHANGES
+++ b/contrib/hooks/multimail/CHANGES
@@ -1,3 +1,44 @@
+Release 1.2.0
+=============
+
+* It is now possible to exclude some refs (e.g. exclude some branches
+  or tags). See refFilterDoSendRegex, refFilterDontSendRegex,
+  refFilterInclusionRegex and refFilterExclusionRegex.
+
+* New commitEmailFormat option which can be set to "html" to generate
+  simple colorized diffs using HTML for the commit emails.
+
+* git-multimail can now be ran as a Gerrit ref-updated hook, or from
+  Atlassian BitBucket Server (formerly known as Atlassian Stash).
+
+* The From: field is now more customizeable. It can be set
+  independently for refchange emails and commit emails (see
+  fromCommit, fromRefChange). The special values pusher and author can
+  be used in these configuration variable.
+
+* A new command-line option, --version, was added. The version is also
+  available in the X-Git-Multimail-Version header of sent emails.
+
+* Set X-Git-NotificationType header to differentiate the various types
+  of notifications. Current values are: diff, ref_changed_plus_diff,
+  ref_changed.
+
+* Preliminary support for Python 3. The testsuite passes with Python 3,
+  but it has not received as much testing as the Python 2 version yet.
+
+* Several encoding-related fixes. UTF-8 characters work in more
+  situations (but non-ascii characters in email address are still not
+  supported).
+
+* The testsuite and its documentation has been greatly improved.
+
+Plus all the bugfixes from version 1.1.1.
+
+This version has been tested with Python 2.4 and 2.6 to 3.5, and Git
+v1.7.10-406-gdc801e7, git-1.8.2.3 and 2.6.0. Git versions prior to
+v1.7.10-406-gdc801e7 probably work, but cannot run the testsuite
+properly.
+
 Release 1.1.1 (bugfix-only release)
 ===================================
 
diff --git a/contrib/hooks/multimail/CONTRIBUTING.rst b/contrib/hooks/multimail/CONTRIBUTING.rst
new file mode 100644
index 0000000..09efdb0
--- /dev/null
+++ b/contrib/hooks/multimail/CONTRIBUTING.rst
@@ -0,0 +1,30 @@
+git-multimail is an open-source project, built by volunteers. We would
+welcome your help!
+
+The current maintainers are Michael Haggerty <mhagger@alum.mit.edu>
+and Matthieu Moy <matthieu.moy@grenoble-inp.fr>.
+
+Please note that although a copy of git-multimail is distributed in
+the "contrib" section of the main Git project, development takes place
+in a separate git-multimail repository on GitHub:
+
+    https://github.com/git-multimail/git-multimail
+
+Whenever enough changes to git-multimail have accumulated, a new
+code-drop of git-multimail will be submitted for inclusion in the Git
+project.
+
+We use the GitHub issue tracker to keep track of bugs and feature
+requests, and we use GitHub pull requests to exchange patches (though,
+if you prefer, you can send patches via the Git mailing list with CC
+to the maintainers). Please sign off your patches as per the `Git
+project practice
+<https://github.com/git/git/blob/master/Documentation/SubmittingPatches#L234>`__.
+
+General discussion of git-multimail can take place on the main Git
+mailing list,
+
+    git@vger.kernel.org
+
+Please CC emails regarding git-multimail to the maintainers so that we
+don't overlook them.
diff --git a/contrib/hooks/multimail/README b/contrib/hooks/multimail/README
index e552c90..5512068 100644
--- a/contrib/hooks/multimail/README
+++ b/contrib/hooks/multimail/README
@@ -1,5 +1,5 @@
-git-multimail Version 1.1.1
-===========================
+git-multimail (version 1.2.0)
+=============================
 
 .. image:: https://travis-ci.org/git-multimail/git-multimail.svg?branch=master
     :target: https://travis-ci.org/git-multimail/git-multimail
@@ -53,11 +53,13 @@
      + [git] 07/08: Merge branch 'mm/api-credentials-doc'
      + [git] 08/08: Git 1.7.11-rc2
 
-   Each commit appears in exactly one commit email, the first time
-   that it is pushed to the repository.  If a commit is later merged
-   into another branch, then a one-line summary of the commit is
-   included in the reference change email (as usual), but no
-   additional commit email is generated.
+   By default, each commit appears in exactly one commit email, the
+   first time that it is pushed to the repository.  If a commit is later
+   merged into another branch, then a one-line summary of the commit
+   is included in the reference change email (as usual), but no
+   additional commit email is generated. See
+   `multimailhook.refFilter(Inclusion|Exclusion|DoSend|DontSend)Regex`
+   below to configure which branches and tags are watched by the hook.
 
    By default, reference change emails have their "Reply-To" field set
    to the person who pushed the change, and commit emails have their
@@ -73,21 +75,8 @@
 ------------
 
 * Python 2.x, version 2.4 or later.  No non-standard Python modules
-  are required.  git-multimail does *not* currently work with Python
-  3.x.
-
-  The example scripts invoke Python using the following shebang line
-  (following PEP 394 [1]_)::
-
-      #! /usr/bin/env python2
-
-  If your system's Python2 interpreter is not in your PATH or is not
-  called ``python2``, you can change the lines accordingly.  Or you can
-  invoke the Python interpreter explicitly, for example via a tiny
-  shell script like::
-
-      #! /bin/sh
-      /usr/local/bin/python /path/to/git_multimail.py "$@"
+  are required.  git-multimail has preliminary support for Python 3
+  (but it has been better tested with Python 2).
 
 * The ``git`` command must be in your PATH.  git-multimail is known to
   work with Git versions back to 1.7.1.  (Earlier versions have not
@@ -146,7 +135,9 @@
 
 multimailhook.environment
 
-    This describes the general environment of the repository.
+    This describes the general environment of the repository. In most
+    cases, you do not need to specify a value for this variable:
+    `git-multimail` will autodetect which environment to use.
     Currently supported values:
 
     * generic
@@ -161,18 +152,57 @@
       optionally read from gitolite.conf (see multimailhook.from).
 
       For more information about gitolite and git-multimail, read
-      doc/gitolite.rst
+      `<doc/gitolite.rst>`__
 
-    If neither of these environments is suitable for your setup, then
-    you can implement a Python class that inherits from Environment
-    and instantiate it via a script that looks like the example
+    * stash
+
+      Environment to use when ``git-multimail`` is ran as an Atlassian
+      BitBucket Server (formerly known as Atlassian Stash) hook.
+
+      **Warning:** this mode was provided by a third-party contributor
+      and never tested by the git-multimail maintainers. It is
+      provided as-is and may or may not work for you.
+
+      This value is automatically assumed when the stash-specific
+      flags (``--stash-user`` and ``--stash-repo``) are specified on
+      the command line. When this environment is active, the username
+      and repo come from these two command line flags, which must be
+      specified.
+
+    * gerrit
+
+      Environment to use when ``git-multimail`` is ran as a
+      ``ref-updated`` Gerrit hook.
+
+      This value is used when the gerrit-specific command line flags
+      (``--oldrev``, ``--newrev``, ``--refname``, ``--project``) for
+      gerrit's ref-updated hook are present. When this environment is
+      active, the username of the pusher is taken from the
+      ``--submitter`` argument if that command line option is passed,
+      otherwise 'Gerrit' is used. The repository name is taken from
+      the ``--project`` option on the command line, which must be passed.
+
+      For more information about gerrit and git-multimail, read
+      `<doc/gerrit.rst>`__
+
+    If none of these environments is suitable for your setup, then you
+    can implement a Python class that inherits from Environment and
+    instantiate it via a script that looks like the example
     post-receive script.
 
     The environment value can be specified on the command line using
-    the --environment option.  If it is not specified on the command
-    line or by multimailhook.environment, then it defaults to
-    ``gitolite`` if the environment contains variables $GL_USER and
-    $GL_REPO; otherwise ``generic``.
+    the ``--environment`` option. If it is not specified on the
+    command line or by ``multimailhook.environment``, the value is
+    guessed as follows:
+
+    * If stash-specific (respectively gerrit-specific) command flags
+      are present on the command-line, then ``stash`` (respectively
+      ``gerrit``) is used.
+
+    * If the environment variables $GL_USER and $GL_REPO are set, then
+      ``gitolite`` is used.
+
+    * If none of the above apply, then ``generic`` is used.
 
 multimailhook.repoName
 
@@ -196,8 +226,8 @@
     reference changes should be sent, as RFC 2822 email addresses
     separated by commas.  This configuration option can be
     multivalued.  The default is the value in
-    multimailhook.mailingList.  Set this value to the empty string to
-    prevent reference change emails from being sent even if
+    multimailhook.mailingList.  Set this value to "none" (or the empty
+    string) to prevent reference change emails from being sent even if
     multimailhook.mailingList is set.
 
 multimailhook.announceList
@@ -206,9 +236,9 @@
     tags should be sent, as RFC 2822 email addresses separated by
     commas.  This configuration option can be multivalued.  The
     default is the value in multimailhook.refchangeList or
-    multimailhook.mailingList.  Set this value to the empty string to
-    prevent annotated tag announcement emails from being sent even if
-    one of the other values is set.
+    multimailhook.mailingList.  Set this value to "none" (or the empty
+    string) to prevent annotated tag announcement emails from being sent
+    even if one of the other values is set.
 
 multimailhook.commitList
 
@@ -216,7 +246,7 @@
     commits should be sent, as RFC 2822 email addresses separated by
     commas.  This configuration option can be multivalued.  The
     default is the value in multimailhook.mailingList.  Set this value
-    to the empty string to prevent notification emails about
+    to "none" (or the empty string) to prevent notification emails about
     individual commits from being sent even if
     multimailhook.mailingList is set.
 
@@ -230,6 +260,20 @@
     not so straightforward, then the shortlog might be confusing
     rather than useful.  Default is false.
 
+multimailhook.commitEmailFormat
+
+    The format of email messages for the individual commits, can be "text" or
+    "html". In the latter case, the emails will include diffs using colorized
+    HTML instead of plain text used by default. Note that this  currently the
+    ref change emails are always sent in plain text.
+
+    Note that when using "html", the formatting is done by parsing the
+    output of ``git log`` with ``-p``. When using
+    ``multimailhook.commitLogOpts`` to specify a ``--format`` for
+    ``git log``, one may get false positive (e.g. lines in the body of
+    the message starting with ``+++`` or ``---`` colored in red or
+    green).
+
 multimailhook.refchangeShowGraph
 
     If this option is set to true, then summary emails about reference
@@ -305,7 +349,7 @@
 
       * multimailhook.smtpEncryption
 
-        Set the security type. Allowed values: none, ssl.
+        Set the security type. Allowed values: none, ssl, tls.
         Default=none.
 
       * multimailhook.smtpServerDebugLevel
@@ -313,9 +357,26 @@
         Integer number. Set to greater than 0 to activate debugging.
 
 multimailhook.from
+multimailhook.fromCommit
+multimailhook.fromRefchange
 
-    If set, use this value in the From: field of generated emails.  If
-    unset, the value of the From: header is determined as follows:
+    If set, use this value in the From: field of generated emails.
+    ``fromCommit`` is used for commit emails, ``fromRefchange`` is
+    used for refchange emails, and ``from`` is used as fall-back in
+    all cases.
+
+    The value for these variables can be either:
+
+    - An email address, which will be used directly.
+
+    - The value ``pusher``, in which case the pusher's address (if
+      available) will be used.
+
+    - The value ``author`` (meaningful only for replyToCommit), in which
+      case the commit author's address will be used.
+
+    If config values are unset, the value of the From: header is
+    determined as follows:
 
     1. (gitolite environment only) Parse gitolite.conf, looking for a
        block of comments that looks like this::
@@ -425,6 +486,15 @@
     --stat -p --cc``.  Shell quoting is allowed; see
     multimailhook.logOpts for details.
 
+multimailhook.dateSubstitute
+
+    String to use as a substitute for ``Date:`` in the output of ``git
+    log`` while formatting commit messages. This is usefull to avoid
+    emitting a line that can be interpreted by mailers as the start of
+    a cited message (Zimbra webmail in particular). Defaults to
+    ``CommitDate: ``. Set to an empty string or ``none`` to deactivate
+    the behavior.
+
 multimailhook.emailDomain
 
     Domain name appended to the username of the person doing the push
@@ -440,21 +510,13 @@
     Addresses to use in the Reply-To: field for commit emails
     (replyToCommit) and refchange emails (replyToRefchange).
     multimailhook.replyTo is used as default when replyToCommit or
-    replyToRefchange is not set.  The value for these variables can be
-    either:
+    replyToRefchange is not set. The shortcuts ``pusher`` and
+    ``author`` are allowed with the same semantics as for
+    ``multimailhook.from``. In addition, the value ``none`` can be
+    used to omit the ``Reply-To:`` field.
 
-    - An email address, which will be used directly.
-
-    - The value `pusher`, in which case the pusher's address (if
-      available) will be used.  This is the default for refchange
-      emails.
-
-    - The value `author` (meaningful only for replyToCommit), in which
-      case the commit author's address will be used.  This is the
-      default for commit emails.
-
-    - The value `none`, in which case the Reply-To: field will be
-      omitted.
+    The default is ``pusher`` for refchange emails, and ``author`` for
+    commit emails.
 
 multimailhook.quiet
 
@@ -478,6 +540,63 @@
     single email.
     Default: true
 
+multimailhook.refFilterInclusionRegex
+multimailhook.refFilterExclusionRegex
+multimailhook.refFilterDoSendRegex
+multimailhook.refFilterDontSendRegex
+
+    **Warning:** these options are experimental. They should work, but
+    the user-interface is not stable yet (in particular, the option
+    names may change). If you want to participate in stabilizing the
+    feature, please contact the maintainers and/or send pull-requests.
+
+    Regular expressions that can be used to limit refs for which email
+    updates will be sent.  It is an error to specify both an inclusion
+    and an exclusion regex.  If a ``refFilterInclusionRegex`` is
+    specified, emails will only be sent for refs which match this
+    regex.  If a ``refFilterExclusionRegex`` regex is specified,
+    emails will be sent for all refs except those that match this
+    regex (or that match a predefined regex specific to the
+    environment, such as "^refs/notes" for most environments and
+    "^refs/notes|^refs/changes" for the gerrit environment).
+
+    The expressions are matched against the complete refname, and is
+    considered to match if any substring matches. For example, to
+    filter-out all tags, set ``refFilterExclusionRegex`` to
+    ``^refs/tags/`` (note the leading ``^`` but no trailing ``$``). If
+    you set ``refFilterExclusionRegex`` to ``master``, then any ref
+    containing ``master`` will be excluded (the ``master`` branch, but
+    also ``refs/tags/master`` or ``refs/heads/foo-master-bar``).
+
+    ``refFilterDoSendRegex`` and ``refFilterDontSendRegex`` are
+    analogous to ``refFilterInclusionRegex`` and
+    ``refFilterExclusionRegex`` with one difference: with
+    ``refFilterDoSendRegex`` and ``refFilterDontSendRegex``, commits
+    introduced by one excluded ref will not be considered as new when
+    they reach an included ref. Typically, if you add a branch ``foo``
+    to  ``refFilterDontSendRegex``, push commits to this branch, and
+    later merge branch ``foo`` into ``master``, then the notification
+    email for ``master`` will contain a commit email only for the
+    merge commit. If you include ``foo`` in
+    ``refFilterExclusionRegex``, then at the time of merge, you will
+    receive one commit email per commit in the branch.
+
+    These variables can be multi-valued, like::
+
+      [multimailhook]
+              refFilterExclusionRegex = ^refs/tags/
+              refFilterExclusionRegex = ^refs/heads/master$
+
+    You can also provide a whitespace-separated list like::
+
+      [multimailhook]
+              refFilterExclusionRegex = ^refs/tags/ ^refs/heads/master$
+
+    Both examples exclude tags and the master branch, and are
+    equivalent to::
+
+      [multimailhook]
+              refFilterExclusionRegex = ^refs/tags/|^refs/heads/master$
 
 Email filtering aids
 --------------------
@@ -547,35 +666,8 @@
 Getting involved
 ----------------
 
-git-multimail is an open-source project, built by volunteers. We would
-welcome your help!
-
-The current maintainers are Michael Haggerty <mhagger@alum.mit.edu>
-and Matthieu Moy <matthieu.moy@grenoble-inp.fr>.
-
-Please note that although a copy of git-multimail is distributed in
-the "contrib" section of the main Git project, development takes place
-in a separate git-multimail repository on GitHub:
-
-    https://github.com/git-multimail/git-multimail
-
-Whenever enough changes to git-multimail have accumulated, a new
-code-drop of git-multimail will be submitted for inclusion in the Git
-project.
-
-We use the GitHub issue tracker to keep track of bugs and feature
-requests, and we use GitHub pull requests to exchange patches (though,
-if you prefer, you can send patches via the Git mailing list with CC
-to the maintainers). Please sign off your patches as per the Git
-project practice.
-
-General discussion of git-multimail can take place on the main Git
-mailing list,
-
-    git@vger.kernel.org
-
-Please CC emails regarding git-multimail to the maintainers so that we
-don't overlook them.
+Please, read `<CONTRIBUTING.rst>`__ for instructions on how to
+contribute to git-multimail.
 
 
 Footnotes
diff --git a/contrib/hooks/multimail/README.Git b/contrib/hooks/multimail/README.Git
index f5d59a8..300a2a4 100644
--- a/contrib/hooks/multimail/README.Git
+++ b/contrib/hooks/multimail/README.Git
@@ -6,10 +6,10 @@
     https://github.com/git-multimail/git-multimail
 
 The version in this directory was obtained from the upstream project
-on July 03 2015 and consists of the "git-multimail" subdirectory from
+on October 11 2015 and consists of the "git-multimail" subdirectory from
 revision
 
-    6d6c9eb62a054143322cfaecde3949189c065b46 refs/tags/1.1.1
+    c0791b9ef5821a746fc3475c25765e640452eaae refs/tags/1.2.0
 
 Please see the README file in this directory for information about how
 to report bugs or contribute to git-multimail.
diff --git a/contrib/hooks/multimail/doc/gerrit.rst b/contrib/hooks/multimail/doc/gerrit.rst
new file mode 100644
index 0000000..8011d05
--- /dev/null
+++ b/contrib/hooks/multimail/doc/gerrit.rst
@@ -0,0 +1,56 @@
+Setting up git-multimail on Gerrit
+==================================
+
+Gerrit has its own email-sending system, but you may prefer using
+``git-multimail`` instead. It supports Gerrit natively as a Gerrit
+``ref-updated`` hook (Warning: `Gerrit hooks
+<https://gerrit-review.googlesource.com/Documentation/config-hooks.html>`__
+are distinct from Git hooks). Setting up ``git-multimail`` on a Gerrit
+installation can be done following the instructions below.
+
+The explanations show an easy way to set up ``git-multimail``,
+but leave ``git-multimail`` installed and unconfigured for a while. If
+you run Gerrit on a production server, it is advised that you
+execute the step "Set up the hook" last to avoid confusing your users
+in the meantime.
+
+Set up the hook
+---------------
+
+Create a directory ``$site_path/hooks/`` if it does not exist (if you
+don't know what ``$site_path`` is, run ``gerrit.sh status`` and look
+for a ``GERRIT_SITE`` line). Either copy ``git_multimail.py`` to
+``$site_path/hooks/ref-updated`` or create a wrapper script like
+this::
+
+  #! /bin/sh
+  exec /path/to/git_multimail.py "$@"
+
+In both cases, make sure the file is named exactly
+``$site_path/hooks/ref-updated`` and is executable.
+
+(Alternatively, you may configure the ``[hooks]`` section of
+gerrit.config)
+
+Configuration
+-------------
+
+Log on the gerrit server and edit ``$site_path/git/$project/config``
+to configure ``git-multimail``.
+
+Troubleshooting
+---------------
+
+Warning: this will disable ``git-multimail`` during the debug, and
+could confuse your users. Don't run on a production server.
+
+To debug configuration issues with ``git-multimail``, you can add the
+``--stdout`` option when calling ``git_multimail.py`` like this::
+
+  #!/bin/sh
+  exec /path/to/git-multimail/git-multimail/git_multimail.py \
+    --stdout "$@" >> /tmp/log.txt
+
+and try pushing from a test repository. You should see the source of
+the email that would have been sent in the output of ``git push`` in
+the file ``/tmp/log.txt``.
diff --git a/contrib/hooks/multimail/doc/gitolite.rst b/contrib/hooks/multimail/doc/gitolite.rst
new file mode 100644
index 0000000..00aedd9
--- /dev/null
+++ b/contrib/hooks/multimail/doc/gitolite.rst
@@ -0,0 +1,109 @@
+Setting up git-multimail on gitolite
+====================================
+
+``git-multimail`` supports gitolite 3 natively.
+The explanations below show an easy way to set up ``git-multimail``,
+but leave ``git-multimail`` installed and unconfigured for a while. If
+you run gitolite on a production server, it is advised that you
+execute the step "Set up the hook" last to avoid confusing your users
+in the meantime.
+
+Set up the hook
+---------------
+
+Log in as your gitolite user.
+
+Create a file ``.gitolite/hooks/common/post-receive`` on your gitolite
+account containing (adapt the path, obviously)::
+
+  #!/bin/sh
+  exec /path/to/git-multimail/git-multimail/git_multimail.py "$@"
+
+Make sure it's executable (``chmod +x``). Record the hook in
+gitolite::
+
+  gitolite setup
+
+Configuration
+-------------
+
+First, you have to allow the admin to set Git configuration variables.
+
+As gitolite user, edit the line containing ``GIT_CONFIG_KEYS`` in file
+``.gitolite.rc``, to make it look like::
+
+  GIT_CONFIG_KEYS                 =>  'multimailhook\..*',
+
+You can now log out and return to your normal user.
+
+In the ``gitolite-admin`` clone, edit the file ``conf/gitolite.conf``
+and add::
+
+  repo @all
+      # Not strictly needed as git_multimail.py will chose gitolite if
+      # $GL_USER is set.
+      config multimailhook.environment = gitolite
+      config multimailhook.mailingList = # Where emails should be sent
+      config multimailhook.from = # From address to use
+
+Obviously, you can customize all parameters on a per-repository basis by
+adding these ``config multimailhook.*`` lines in the section
+corresponding to a repository or set of repositories.
+
+To activate ``git-multimail`` on a per-repository basis, do not set
+``multimailhook.mailingList`` in the ``@all`` section and set it only
+for repositories for which you want ``git-multimail``.
+
+Alternatively, you can set up the ``From:`` field on a per-user basis
+by adding a ``BEGIN USER EMAILS``/``END USER EMAILS`` section (see
+``../README``).
+
+Specificities of Gitolite for Configuration
+-------------------------------------------
+
+Empty configuration variables
+.............................
+
+With gitolite, the syntax ``config multimailhook.commitList = ""``
+unsets the variable instead of setting it to an empty string (see
+`here
+<http://gitolite.com/gitolite/git-config.html#an-important-warning-about-deleting-a-config-line>`__).
+As a result, there is no way to set a variable to the empty string.
+In all most places where an empty value is required, git-multimail
+now allows to specify special ``"none"`` value (case-sensitive) to
+mean the same.
+
+Alternatively, one can use ``" "`` (a single space) instead of ``""``.
+In most cases (in particular ``multimailhook.*List`` variables), this
+will be equivalent to an empty string.
+
+If you have a use-case where ``"none"`` is not an acceptable value and
+you need ``" "`` or  ``""`` instead, please report it as a bug to
+git-multimail.
+
+Allowing Regular Expressions in Configuration
+.............................................
+
+gitolite has a mechanism to prevent unsafe configuration variable
+values, which prevent characters like ``|`` commonly used in regular
+expressions. If you do not need the safety feature of gitolite and
+need to use regular expressions in your configuration (e.g. for
+``multimailhook.refFilter*`` variables), set
+`UNSAFE_PATT
+<http://gitolite.com/gitolite/git-config.html#unsafe-patt>`__ to a
+less restrictive value.
+
+Troubleshooting
+---------------
+
+Warning: this will disable ``git-multimail`` during the debug, and
+could confuse your users. Don't run on a production server.
+
+To debug configuration issues with ``git-multimail``, you can add the
+``--stdout`` option when calling ``git_multimail.py`` like this::
+
+  #!/bin/sh
+  exec /path/to/git-multimail/git-multimail/git_multimail.py --stdout "$@"
+
+and try pushing from a test repository. You should see the source of
+the email that would have been sent in the output of ``git push``.
diff --git a/contrib/hooks/multimail/git_multimail.py b/contrib/hooks/multimail/git_multimail.py
index c06ce7a..0180dba 100755
--- a/contrib/hooks/multimail/git_multimail.py
+++ b/contrib/hooks/multimail/git_multimail.py
@@ -1,4 +1,6 @@
-#! /usr/bin/env python2
+#! /usr/bin/env python
+
+__version__ = '1.2.0'
 
 # Copyright (c) 2015 Matthieu Moy and others
 # Copyright (c) 2012-2014 Michael Haggerty and others
@@ -56,8 +58,54 @@
 import optparse
 import smtplib
 import time
+import cgi
+
+PYTHON3 = sys.version_info >= (3, 0)
+
+if sys.version_info <= (2, 5):
+    def all(iterable):
+        for element in iterable:
+            if not element:
+                return False
+            return True
+
+
+def is_ascii(s):
+    return all(ord(c) < 128 and ord(c) > 0 for c in s)
+
+
+if PYTHON3:
+    def str_to_bytes(s):
+        return s.encode(ENCODING)
+
+    def bytes_to_str(s):
+        return s.decode(ENCODING)
+
+    unicode = str
+
+    def write_str(f, msg):
+        # Try outputing with the default encoding. If it fails,
+        # try UTF-8.
+        try:
+            f.buffer.write(msg.encode(sys.getdefaultencoding()))
+        except UnicodeEncodeError:
+            f.buffer.write(msg.encode(ENCODING))
+else:
+    def str_to_bytes(s):
+        return s
+
+    def bytes_to_str(s):
+        return s
+
+    def write_str(f, msg):
+        f.write(msg)
+
+    def next(it):
+        return it.next()
+
 
 try:
+    from email.charset import Charset
     from email.utils import make_msgid
     from email.utils import getaddresses
     from email.utils import formataddr
@@ -65,6 +113,7 @@
     from email.header import Header
 except ImportError:
     # Prior to Python 2.5, the email module used different names:
+    from email.Charset import Charset
     from email.Utils import make_msgid
     from email.Utils import getaddresses
     from email.Utils import formataddr
@@ -109,7 +158,7 @@
 To: %(recipients)s
 Subject: %(subject)s
 MIME-Version: 1.0
-Content-Type: text/plain; charset=%(charset)s
+Content-Type: text/%(contenttype)s; charset=%(charset)s
 Content-Transfer-Encoding: 8bit
 Message-ID: %(msgid)s
 From: %(fromaddr)s
@@ -120,6 +169,8 @@
 X-Git-Reftype: %(refname_type)s
 X-Git-Oldrev: %(oldrev)s
 X-Git-Newrev: %(newrev)s
+X-Git-NotificationType: ref_changed
+X-Git-Multimail-Version: %(multimail_version)s
 Auto-Submitted: auto-generated
 """
 
@@ -238,7 +289,7 @@
 Cc: %(cc_recipients)s
 Subject: %(emailprefix)s%(num)02d/%(tot)02d: %(oneline)s
 MIME-Version: 1.0
-Content-Type: text/plain; charset=%(charset)s
+Content-Type: text/%(contenttype)s; charset=%(charset)s
 Content-Transfer-Encoding: 8bit
 From: %(fromaddr)s
 Reply-To: %(reply_to)s
@@ -249,6 +300,8 @@
 X-Git-Refname: %(refname)s
 X-Git-Reftype: %(refname_type)s
 X-Git-Rev: %(rev)s
+X-Git-NotificationType: diff
+X-Git-Multimail-Version: %(multimail_version)s
 Auto-Submitted: auto-generated
 """
 
@@ -270,7 +323,7 @@
 To: %(recipients)s
 Subject: %(subject)s
 MIME-Version: 1.0
-Content-Type: text/plain; charset=%(charset)s
+Content-Type: text/%(contenttype)s; charset=%(charset)s
 Content-Transfer-Encoding: 8bit
 Message-ID: %(msgid)s
 From: %(fromaddr)s
@@ -282,6 +335,8 @@
 X-Git-Oldrev: %(oldrev)s
 X-Git-Newrev: %(newrev)s
 X-Git-Rev: %(rev)s
+X-Git-NotificationType: ref_changed_plus_diff
+X-Git-Multimail-Version: %(multimail_version)s
 Auto-Submitted: auto-generated
 """
 
@@ -352,12 +407,14 @@
 def read_output(cmd, input=None, keepends=False, **kw):
     if input:
         stdin = subprocess.PIPE
+        input = str_to_bytes(input)
     else:
         stdin = None
     p = subprocess.Popen(
         cmd, stdin=stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kw
         )
     (out, err) = p.communicate(input)
+    out = bytes_to_str(out)
     retcode = p.wait()
     if retcode:
         raise CommandError(cmd, retcode)
@@ -418,26 +475,37 @@
 def header_encode(text, header_name=None):
     """Encode and line-wrap the value of an email header field."""
 
-    try:
-        if isinstance(text, str):
-            text = text.decode(ENCODING, 'replace')
-        return Header(text, header_name=header_name).encode()
-    except UnicodeEncodeError:
-        return Header(text, header_name=header_name, charset=CHARSET,
-                      errors='replace').encode()
+    # Convert to unicode, if required.
+    if not isinstance(text, unicode):
+        text = unicode(text, 'utf-8')
+
+    if is_ascii(text):
+        charset = 'ascii'
+    else:
+        charset = 'utf-8'
+
+    return Header(text, header_name=header_name, charset=Charset(charset)).encode()
 
 
 def addr_header_encode(text, header_name=None):
     """Encode and line-wrap the value of an email header field containing
     email addresses."""
 
-    return Header(
-        ', '.join(
-            formataddr((header_encode(name), emailaddr))
-            for name, emailaddr in getaddresses([text])
-            ),
-        header_name=header_name
-        ).encode()
+    # Convert to unicode, if required.
+    if not isinstance(text, unicode):
+        text = unicode(text, 'utf-8')
+
+    text = ', '.join(
+        formataddr((header_encode(name), emailaddr))
+        for name, emailaddr in getaddresses([text])
+        )
+
+    if is_ascii(text):
+        charset = 'ascii'
+    else:
+        charset = 'utf-8'
+
+    return Header(text, header_name=header_name, charset=Charset(charset)).encode()
 
 
 class Config(object):
@@ -496,7 +564,8 @@
                 ['config', '--get-all', '--null', '%s.%s' % (self.section, name)],
                 env=self.env, keepends=True,
                 ))
-        except CommandError, e:
+        except CommandError:
+            t, e, traceback = sys.exc_info()
             if e.retcode == 1:
                 # "the section or key is invalid"; i.e., there is no
                 # value for the specified key.
@@ -504,18 +573,6 @@
             else:
                 raise
 
-    def get_recipients(self, name, default=None):
-        """Read a recipients list from the configuration.
-
-        Return the result as a comma-separated list of email
-        addresses, or default if the option is unset.  If the setting
-        has multiple values, concatenate them with comma separators."""
-
-        lines = self.get_all(name, default=None)
-        if lines is None:
-            return default
-        return ', '.join(line.strip() for line in lines)
-
     def set(self, name, value):
         read_git_output(
             ['config', '%s.%s' % (self.section, name), value],
@@ -542,7 +599,8 @@
                 ['config', '--unset-all', '%s.%s' % (self.section, name)],
                 env=self.env,
                 )
-        except CommandError, e:
+        except CommandError:
+            t, e, traceback = sys.exc_info()
             if e.retcode == 5:
                 # The name doesn't exist, which is what we wanted anyway...
                 pass
@@ -636,7 +694,7 @@
         if not self.sha1:
             raise ValueError('Empty commit has no summary')
 
-        return iter(generate_summaries('--no-walk', self.sha1)).next()
+        return next(iter(generate_summaries('--no-walk', self.sha1)))
 
     def __eq__(self, other):
         return isinstance(other, GitObject) and self.sha1 == other.sha1
@@ -647,6 +705,10 @@
     def __nonzero__(self):
         return bool(self.sha1)
 
+    def __bool__(self):
+        """Python 2 backward compatibility"""
+        return self.__nonzero__()
+
     def __str__(self):
         return self.sha1 or ZEROS
 
@@ -661,6 +723,12 @@
     def __init__(self, environment):
         self.environment = environment
         self._values = None
+        self._contains_html_diff = False
+
+    def _contains_diff(self):
+        # We do contain a diff, should it be rendered in HTML?
+        if self.environment.commit_email_format == "html":
+            self._contains_html_diff = True
 
     def _compute_values(self):
         """Return a dictionary {keyword: expansion} for this Change.
@@ -670,7 +738,12 @@
         get_values().  The return value should always be a new
         dictionary."""
 
-        return self.environment.get_values()
+        values = self.environment.get_values()
+        fromaddr = self.environment.get_fromaddr(change=self)
+        if fromaddr is not None:
+            values['fromaddr'] = fromaddr
+        values['multimail_version'] = get_version()
+        return values
 
     def get_values(self, **extra_values):
         """Return a dictionary {keyword: expansion} for this Change.
@@ -713,12 +786,18 @@
         skip lines that contain references to unknown variables."""
 
         values = self.get_values(**extra_values)
+        if self._contains_html_diff:
+            values['contenttype'] = 'html'
+        else:
+            values['contenttype'] = 'plain'
+
         for line in template.splitlines():
-            (name, value) = line.split(':', 1)
+            (name, value) = line.split(': ', 1)
 
             try:
                 value = value % values
-            except KeyError, e:
+            except KeyError:
+                t, e, traceback = sys.exc_info()
                 if DEBUG:
                     self.environment.log_warning(
                         'Warning: unknown variable %r in the following line; line skipped:\n'
@@ -764,6 +843,24 @@
 
         raise NotImplementedError()
 
+    def _wrap_for_html(self, lines):
+        """Wrap the lines in HTML <pre> tag when using HTML format.
+
+        Escape special HTML characters and add <pre> and </pre> tags around
+        the given lines if we should be generating HTML as indicated by
+        self._contains_html_diff being set to true.
+        """
+        if self._contains_html_diff:
+            yield "<pre style='margin:0'>\n"
+
+            for line in lines:
+                yield cgi.escape(line)
+
+            yield '</pre>\n'
+        else:
+            for line in lines:
+                yield line
+
     def generate_email(self, push, body_filter=None, extra_header_values={}):
         """Generate an email describing this change.
 
@@ -779,17 +876,75 @@
         for line in self.generate_email_header(**extra_header_values):
             yield line
         yield '\n'
-        for line in self.generate_email_intro():
+        for line in self._wrap_for_html(self.generate_email_intro()):
             yield line
 
         body = self.generate_email_body(push)
         if body_filter is not None:
             body = body_filter(body)
+
+        diff_started = False
+        if self._contains_html_diff:
+            # "white-space: pre" is the default, but we need to
+            # specify it again in case the message is viewed in a
+            # webmail which wraps it in an element setting white-space
+            # to something else (Zimbra does this and sets
+            # white-space: pre-line).
+            yield '<pre style="white-space: pre; background: #F8F8F8">'
         for line in body:
+            if self._contains_html_diff:
+                # This is very, very naive. It would be much better to really
+                # parse the diff, i.e. look at how many lines do we have in
+                # the hunk headers instead of blindly highlighting everything
+                # that looks like it might be part of a diff.
+                bgcolor = ''
+                fgcolor = ''
+                if line.startswith('--- a/'):
+                    diff_started = True
+                    bgcolor = 'e0e0ff'
+                elif line.startswith('diff ') or line.startswith('index '):
+                    diff_started = True
+                    fgcolor = '808080'
+                elif diff_started:
+                    if line.startswith('+++ '):
+                        bgcolor = 'e0e0ff'
+                    elif line.startswith('@@'):
+                        bgcolor = 'e0e0e0'
+                    elif line.startswith('+'):
+                        bgcolor = 'e0ffe0'
+                    elif line.startswith('-'):
+                        bgcolor = 'ffe0e0'
+                elif line.startswith('commit '):
+                    fgcolor = '808000'
+                elif line.startswith('    '):
+                    fgcolor = '404040'
+
+                # Chop the trailing LF, we don't want it inside <pre>.
+                line = cgi.escape(line[:-1])
+
+                if bgcolor or fgcolor:
+                    style = 'display:block; white-space:pre;'
+                    if bgcolor:
+                        style += 'background:#' + bgcolor + ';'
+                    if fgcolor:
+                        style += 'color:#' + fgcolor + ';'
+                    # Use a <span style='display:block> to color the
+                    # whole line. The newline must be inside the span
+                    # to display properly both in Firefox and in
+                    # text-based browser.
+                    line = "<span style='%s'>%s\n</span>" % (style, line)
+                else:
+                    line = line + '\n'
+
+            yield line
+        if self._contains_html_diff:
+            yield '</pre>'
+
+        for line in self._wrap_for_html(self.generate_email_footer()):
             yield line
 
-        for line in self.generate_email_footer():
-            yield line
+    def get_alt_fromaddr(self):
+        return None
 
 
 class Revision(Change):
@@ -867,14 +1022,25 @@
     def generate_email_body(self, push):
         """Show this revision."""
 
-        return read_git_lines(
-            ['log'] + self.environment.commitlogopts + ['-1', self.rev.sha1],
-            keepends=True,
-            )
+        for line in read_git_lines(
+                ['log'] + self.environment.commitlogopts + ['-1', self.rev.sha1],
+                keepends=True,
+                ):
+            if line.startswith('Date:   ') and self.environment.date_substitute:
+                yield self.environment.date_substitute + line[len('Date:   '):]
+            else:
+                yield line
 
     def generate_email_footer(self):
         return self.expand_lines(REVISION_FOOTER_TEMPLATE)
 
+    def generate_email(self, push, body_filter=None, extra_header_values={}):
+        self._contains_diff()
+        return Change.generate_email(self, push, body_filter, extra_header_values)
+
+    def get_alt_fromaddr(self):
+        return self.environment.from_commit
+
 
 class ReferenceChange(Change):
     """A Change to a Git reference.
@@ -1096,10 +1262,10 @@
             yield '\n'
             yield 'Detailed log of new commits:\n\n'
             for line in read_git_lines(
-                    ['log', '--no-walk']
-                    + self.logopts
-                    + new_commits_list
-                    + ['--'],
+                    ['log', '--no-walk'] +
+                    self.logopts +
+                    new_commits_list +
+                    ['--'],
                     keepends=True,
                     ):
                 yield line
@@ -1253,9 +1419,9 @@
             yield '\n'
             yield 'Summary of changes:\n'
             for line in read_git_lines(
-                    ['diff-tree']
-                    + self.diffopts
-                    + ['%s..%s' % (self.old.commit_sha1, self.new.commit_sha1,)],
+                    ['diff-tree'] +
+                    self.diffopts +
+                    ['%s..%s' % (self.old.commit_sha1, self.new.commit_sha1,)],
                     keepends=True,
                     ):
                 yield line
@@ -1316,6 +1482,9 @@
             )
         yield '\n'
 
+    def get_alt_fromaddr(self):
+        return self.environment.from_refchange
+
 
 class BranchChange(ReferenceChange):
     refname_type = 'branch'
@@ -1397,9 +1566,9 @@
             # commit is a non-merge commit, though it may make sense to
             # combine if it is a merge as well.
             if not (
-                    len(new_commits) == 1
-                    and len(new_commits[0][1]) == 1
-                    and new_commits[0][0] in known_added_sha1s
+                    len(new_commits) == 1 and
+                    len(new_commits[0][1]) == 1 and
+                    new_commits[0][0] in known_added_sha1s
                     ):
                 return None
 
@@ -1432,6 +1601,7 @@
             values['subject'] = self.expand(COMBINED_REFCHANGE_REVISION_SUBJECT_TEMPLATE, **values)
 
         self._single_revision = revision
+        self._contains_diff()
         self.header_template = COMBINED_HEADER_TEMPLATE
         self.intro_template = COMBINED_INTRO_TEMPLATE
         self.footer_template = COMBINED_FOOTER_TEMPLATE
@@ -1690,17 +1860,18 @@
     def send(self, lines, to_addrs):
         try:
             p = subprocess.Popen(self.command, stdin=subprocess.PIPE)
-        except OSError, e:
+        except OSError:
             sys.stderr.write(
-                '*** Cannot execute command: %s\n' % ' '.join(self.command)
-                + '*** %s\n' % str(e)
-                + '*** Try setting multimailhook.mailer to "smtp"\n'
+                '*** Cannot execute command: %s\n' % ' '.join(self.command) +
+                '*** %s\n' % sys.exc_info()[1] +
+                '*** Try setting multimailhook.mailer to "smtp"\n' +
                 '*** to send emails without using the sendmail command.\n'
                 )
             sys.exit(1)
         try:
+            lines = (str_to_bytes(line) for line in lines)
             p.stdin.writelines(lines)
-        except Exception, e:
+        except Exception:
             sys.stderr.write(
                 '*** Error while generating commit email\n'
                 '***  - mail sending aborted.\n'
@@ -1710,7 +1881,7 @@
                 p.terminate()
             except AttributeError:
                 pass
-            raise e
+            raise
         else:
             p.stdin.close()
             retcode = p.wait()
@@ -1770,11 +1941,11 @@
                     "*** Setting debug on for SMTP server connection (%s) ***\n"
                     % self.smtpserverdebuglevel)
                 self.smtp.set_debuglevel(self.smtpserverdebuglevel)
-        except Exception, e:
+        except Exception:
             sys.stderr.write(
                 '*** Error establishing SMTP connection to %s ***\n'
                 % self.smtpserver)
-            sys.stderr.write('*** %s\n' % str(e))
+            sys.stderr.write('*** %s\n' % sys.exc_info()[1])
             sys.exit(1)
 
     def __del__(self):
@@ -1784,16 +1955,15 @@
     def send(self, lines, to_addrs):
         try:
             if self.username or self.password:
-                sys.stderr.write("*** Authenticating as %s ***\n" % self.username)
                 self.smtp.login(self.username, self.password)
             msg = ''.join(lines)
             # turn comma-separated list into Python list if needed.
             if isinstance(to_addrs, basestring):
                 to_addrs = [email for (name, email) in getaddresses([to_addrs])]
             self.smtp.sendmail(self.envelopesender, to_addrs, msg)
-        except Exception, e:
+        except Exception:
             sys.stderr.write('*** Error sending email ***\n')
-            sys.stderr.write('*** %s\n' % str(e))
+            sys.stderr.write('*** %s\n' % sys.exc_info()[1])
             self.smtp.quit()
             sys.exit(1)
 
@@ -1809,9 +1979,10 @@
         self.f = f
 
     def send(self, lines, to_addrs):
-        self.f.write(self.SEPARATOR)
-        self.f.writelines(lines)
-        self.f.write(self.SEPARATOR)
+        write_str(self.f, self.SEPARATOR)
+        for line in lines:
+            write_str(self.f, line)
+        write_str(self.f, self.SEPARATOR)
 
 
 def get_git_dir():
@@ -1877,11 +2048,13 @@
             Return the address to be used as the 'From' email address
             in the email envelope.
 
-        get_fromaddr()
+        get_fromaddr(change=None)
 
             Return the 'From' email address used in the email 'From:'
-            headers.  (May be a full RFC 2822 email address like 'Joe
-            User <user@example.com>'.)
+            headers.  If the change is known when this function is
+            called, it is passed in as the 'change' parameter.  (May
+            be a full RFC 2822 email address like 'Joe User
+            <user@example.com>'.)
 
         get_administrator()
 
@@ -1901,12 +2074,29 @@
             get_reply_to_commit() is used for individual commit
             emails.
 
+        get_ref_filter_regex()
+
+            Return a tuple -- a compiled regex, and a boolean indicating
+            whether the regex picks refs to include (if False, the regex
+            matches on refs to exclude).
+
+        get_default_ref_ignore_regex()
+
+            Return a regex that should be ignored for both what emails
+            to send and when computing what commits are considered new
+            to the repository.  Default is "^refs/notes/".
+
     They should also define the following attributes:
 
         announce_show_shortlog (bool)
 
             True iff announce emails should include a shortlog.
 
+        commit_email_format (string)
+
+            If "html", generate commit emails in HTML instead of plain text
+            used by default.
+
         refchange_showgraph (bool)
 
             True iff refchanges emails should include a detailed graph.
@@ -1939,6 +2129,11 @@
             commit mail.  The value should be a list of strings
             representing words to be passed to the command.
 
+        date_substitute (string)
+
+            String to be used in substitution for 'Date:' at start of
+            line in the output of 'git log'.
+
         quiet (bool)
             On success do not write to stderr
 
@@ -1950,6 +2145,13 @@
             True if a combined email should be produced when a single
             new commit is pushed to a branch, False otherwise.
 
+        from_refchange, from_commit (strings)
+
+            Addresses to use for the From: field for refchange emails
+            and commit emails respectively.  Set from
+            multimailhook.fromRefchange and multimailhook.fromCommit
+            by ConfigEnvironmentMixin.
+
     """
 
     REPO_NAME_RE = re.compile(r'^(?P<name>.+?)(?:\.git)$')
@@ -1957,6 +2159,7 @@
     def __init__(self, osenv=None):
         self.osenv = osenv or os.environ
         self.announce_show_shortlog = False
+        self.commit_email_format = "text"
         self.maxcommitemails = 500
         self.diffopts = ['--stat', '--summary', '--find-copies-harder']
         self.graphopts = ['--oneline', '--decorate']
@@ -1964,6 +2167,7 @@
         self.refchange_showgraph = False
         self.refchange_showlog = False
         self.commitlogopts = ['-C', '--stat', '-p', '--cc']
+        self.date_substitute = 'AuthorDate: '
         self.quiet = False
         self.stdout = False
         self.combine_when_single_commit = True
@@ -1972,7 +2176,6 @@
             'administrator',
             'charset',
             'emailprefix',
-            'fromaddr',
             'pusher',
             'pusher_email',
             'repo_path',
@@ -1998,7 +2201,7 @@
     def get_pusher_email(self):
         return None
 
-    def get_fromaddr(self):
+    def get_fromaddr(self, change=None):
         config = Config('user')
         fromname = config.get('name', default='')
         fromemail = config.get('email', default='')
@@ -2080,6 +2283,15 @@
     def get_reply_to_commit(self, revision):
         return revision.author
 
+    def get_default_ref_ignore_regex(self):
+        # The commit messages of git notes are essentially meaningless
+        # and "filenames" in git notes commits are an implementational
+        # detail that might surprise users at first.  As such, we
+        # would need a completely different method for handling emails
+        # of git notes in order for them to be of benefit for users,
+        # which we simply do not have right now.
+        return "^refs/notes/"
+
     def filter_body(self, lines):
         """Filter the lines intended for an email body.
 
@@ -2095,19 +2307,19 @@
         """Write the string msg on a log file or on stderr.
 
         Sends the text to stderr by default, override to change the behavior."""
-        sys.stderr.write(msg)
+        write_str(sys.stderr, msg)
 
     def log_warning(self, msg):
         """Write the string msg on a log file or on stderr.
 
         Sends the text to stderr by default, override to change the behavior."""
-        sys.stderr.write(msg)
+        write_str(sys.stderr, msg)
 
     def log_error(self, msg):
         """Write the string msg on a log file or on stderr.
 
         Sends the text to stderr by default, override to change the behavior."""
-        sys.stderr.write(msg)
+        write_str(sys.stderr, msg)
 
 
 class ConfigEnvironmentMixin(Environment):
@@ -2128,6 +2340,14 @@
 class ConfigOptionsEnvironmentMixin(ConfigEnvironmentMixin):
     """An Environment that reads most of its information from "git config"."""
 
+    @staticmethod
+    def forbid_field_values(name, value, forbidden):
+        for forbidden_val in forbidden:
+            if value is not None and value.lower() == forbidden:
+                raise ConfigurationException(
+                    '"%s" is not an allowed setting for %s' % (value, name)
+                    )
+
     def __init__(self, config, **kw):
         super(ConfigOptionsEnvironmentMixin, self).__init__(
             config=config, **kw
@@ -2144,14 +2364,26 @@
             if val is not None:
                 setattr(self, var, val)
 
+        commit_email_format = config.get('commitEmailFormat')
+        if commit_email_format is not None:
+            if commit_email_format != "html" and commit_email_format != "text":
+                self.log_warning(
+                    '*** Unknown value for multimailhook.commitEmailFormat: %s\n' %
+                    commit_email_format +
+                    '*** Expected either "text" or "html".  Ignoring.\n'
+                    )
+            else:
+                self.commit_email_format = commit_email_format
+
         maxcommitemails = config.get('maxcommitemails')
         if maxcommitemails is not None:
             try:
                 self.maxcommitemails = int(maxcommitemails)
             except ValueError:
                 self.log_warning(
-                    '*** Malformed value for multimailhook.maxCommitEmails: %s\n' % maxcommitemails
-                    + '*** Expected a number.  Ignoring.\n'
+                    '*** Malformed value for multimailhook.maxCommitEmails: %s\n'
+                    % maxcommitemails +
+                    '*** Expected a number.  Ignoring.\n'
                     )
 
         diffopts = config.get('diffopts')
@@ -2170,32 +2402,44 @@
         if commitlogopts is not None:
             self.commitlogopts = shlex.split(commitlogopts)
 
+        date_substitute = config.get('dateSubstitute')
+        if date_substitute == 'none':
+            self.date_substitute = None
+        elif date_substitute is not None:
+            self.date_substitute = date_substitute
+
         reply_to = config.get('replyTo')
         self.__reply_to_refchange = config.get('replyToRefchange', default=reply_to)
-        if (
-                self.__reply_to_refchange is not None
-                and self.__reply_to_refchange.lower() == 'author'
-                ):
-            raise ConfigurationException(
-                '"author" is not an allowed setting for replyToRefchange'
-                )
+        self.forbid_field_values('replyToRefchange',
+                                 self.__reply_to_refchange,
+                                 ['author'])
         self.__reply_to_commit = config.get('replyToCommit', default=reply_to)
 
+        from_addr = self.config.get('from')
+        self.from_refchange = config.get('fromRefchange')
+        self.forbid_field_values('fromRefchange',
+                                 self.from_refchange,
+                                 ['author', 'none'])
+        self.from_commit = config.get('fromCommit')
+        self.forbid_field_values('fromCommit',
+                                 self.from_commit,
+                                 ['none'])
+
         combine = config.get_bool('combineWhenSingleCommit')
         if combine is not None:
             self.combine_when_single_commit = combine
 
     def get_administrator(self):
         return (
-            self.config.get('administrator')
-            or self.get_sender()
-            or super(ConfigOptionsEnvironmentMixin, self).get_administrator()
+            self.config.get('administrator') or
+            self.get_sender() or
+            super(ConfigOptionsEnvironmentMixin, self).get_administrator()
             )
 
     def get_repo_shortname(self):
         return (
-            self.config.get('reponame')
-            or super(ConfigOptionsEnvironmentMixin, self).get_repo_shortname()
+            self.config.get('reponame') or
+            super(ConfigOptionsEnvironmentMixin, self).get_repo_shortname()
             )
 
     def get_emailprefix(self):
@@ -2212,33 +2456,42 @@
     def get_sender(self):
         return self.config.get('envelopesender')
 
-    def get_fromaddr(self):
+    def process_addr(self, addr, change):
+        if addr.lower() == 'author':
+            if hasattr(change, 'author'):
+                return change.author
+            else:
+                return None
+        elif addr.lower() == 'pusher':
+            return self.get_pusher_email()
+        elif addr.lower() == 'none':
+            return None
+        else:
+            return addr
+
+    def get_fromaddr(self, change=None):
         fromaddr = self.config.get('from')
+        if change:
+            alt_fromaddr = change.get_alt_fromaddr()
+            if alt_fromaddr:
+                fromaddr = alt_fromaddr
+        if fromaddr:
+            fromaddr = self.process_addr(fromaddr, change)
         if fromaddr:
             return fromaddr
-        return super(ConfigOptionsEnvironmentMixin, self).get_fromaddr()
+        return super(ConfigOptionsEnvironmentMixin, self).get_fromaddr(change)
 
     def get_reply_to_refchange(self, refchange):
         if self.__reply_to_refchange is None:
             return super(ConfigOptionsEnvironmentMixin, self).get_reply_to_refchange(refchange)
-        elif self.__reply_to_refchange.lower() == 'pusher':
-            return self.get_pusher_email()
-        elif self.__reply_to_refchange.lower() == 'none':
-            return None
         else:
-            return self.__reply_to_refchange
+            return self.process_addr(self.__reply_to_refchange, refchange)
 
     def get_reply_to_commit(self, revision):
         if self.__reply_to_commit is None:
             return super(ConfigOptionsEnvironmentMixin, self).get_reply_to_commit(revision)
-        elif self.__reply_to_commit.lower() == 'author':
-            return revision.author
-        elif self.__reply_to_commit.lower() == 'pusher':
-            return self.get_pusher_email()
-        elif self.__reply_to_commit.lower() == 'none':
-            return None
         else:
-            return self.__reply_to_commit
+            return self.process_addr(self.__reply_to_commit, revision)
 
     def get_scancommitforcc(self):
         return self.config.get('scancommitforcc')
@@ -2270,12 +2523,14 @@
     def filter_body(self, lines):
         lines = super(FilterLinesEnvironmentMixin, self).filter_body(lines)
         if self.__strict_utf8:
-            lines = (line.decode(ENCODING, 'replace') for line in lines)
+            if not PYTHON3:
+                lines = (line.decode(ENCODING, 'replace') for line in lines)
             # Limit the line length in Unicode-space to avoid
             # splitting characters:
             if self.__emailmaxlinelength:
                 lines = limit_linelength(lines, self.__emailmaxlinelength)
-            lines = (line.encode(ENCODING, 'replace') for line in lines)
+            if not PYTHON3:
+                lines = (line.encode(ENCODING, 'replace') for line in lines)
         elif self.__emailmaxlinelength:
             lines = limit_linelength(lines, self.__emailmaxlinelength)
 
@@ -2404,10 +2659,10 @@
         # actual *contents* of the change being reported, we only
         # choose based on the *type* of the change.  Therefore we can
         # compute them once and for all:
-        if not (refchange_recipients
-                or announce_recipients
-                or revision_recipients
-                or scancommitforcc):
+        if not (refchange_recipients or
+                announce_recipients or
+                revision_recipients or
+                scancommitforcc):
             raise ConfigurationException('No email recipients configured!')
         self.__refchange_recipients = refchange_recipients
         self.__announce_recipients = announce_recipients
@@ -2457,13 +2712,104 @@
         found, raise a ConfigurationException."""
 
         for name in names:
-            retval = config.get_recipients(name)
-            if retval is not None:
-                return retval
+            lines = config.get_all(name)
+            if lines is not None:
+                lines = [line.strip() for line in lines]
+                # Single "none" is a special value equivalen to empty string.
+                if lines == ['none']:
+                    lines = ['']
+                return ', '.join(lines)
         else:
             return ''
 
 
+class StaticRefFilterEnvironmentMixin(Environment):
+    """Set branch filter statically based on constructor parameters."""
+
+    def __init__(self, ref_filter_incl_regex, ref_filter_excl_regex,
+                 ref_filter_do_send_regex, ref_filter_dont_send_regex,
+                 **kw):
+        super(StaticRefFilterEnvironmentMixin, self).__init__(**kw)
+
+        if ref_filter_incl_regex and ref_filter_excl_regex:
+            raise ConfigurationException(
+                "Cannot specify both a ref inclusion and exclusion regex.")
+        self.__is_inclusion_filter = bool(ref_filter_incl_regex)
+        default_exclude = self.get_default_ref_ignore_regex()
+        if ref_filter_incl_regex:
+            ref_filter_regex = ref_filter_incl_regex
+        elif ref_filter_excl_regex:
+            ref_filter_regex = ref_filter_excl_regex + '|' + default_exclude
+        else:
+            ref_filter_regex = default_exclude
+        try:
+            self.__compiled_regex = re.compile(ref_filter_regex)
+        except Exception:
+            raise ConfigurationException(
+                'Invalid Ref Filter Regex "%s": %s' % (ref_filter_regex, sys.exc_info()[1]))
+
+        if ref_filter_do_send_regex and ref_filter_dont_send_regex:
+            raise ConfigurationException(
+                "Cannot specify both a ref doSend and dontSend regex.")
+        if ref_filter_do_send_regex or ref_filter_dont_send_regex:
+            self.__is_do_send_filter = bool(ref_filter_do_send_regex)
+            if ref_filter_incl_regex:
+                ref_filter_send_regex = ref_filter_incl_regex
+            elif ref_filter_excl_regex:
+                ref_filter_send_regex = ref_filter_excl_regex
+            else:
+                ref_filter_send_regex = '.*'
+                self.__is_do_send_filter = True
+            try:
+                self.__send_compiled_regex = re.compile(ref_filter_send_regex)
+            except Exception:
+                raise ConfigurationException(
+                    'Invalid Ref Filter Regex "%s": %s' %
+                    (ref_filter_send_regex, sys.exc_info()[1]))
+        else:
+            self.__send_compiled_regex = self.__compiled_regex
+            self.__is_do_send_filter = self.__is_inclusion_filter
+
+    def get_ref_filter_regex(self, send_filter=False):
+        if send_filter:
+            return self.__send_compiled_regex, self.__is_do_send_filter
+        else:
+            return self.__compiled_regex, self.__is_inclusion_filter
+
+
+class ConfigRefFilterEnvironmentMixin(
+        ConfigEnvironmentMixin,
+        StaticRefFilterEnvironmentMixin
+        ):
+    """Determine branch filtering statically based on config."""
+
+    def _get_regex(self, config, key):
+        """Get a list of whitespace-separated regex. The refFilter* config
+        variables are multivalued (hence the use of get_all), and we
+        allow each entry to be a whitespace-separated list (hence the
+        split on each line). The whole thing is glued into a single regex."""
+        values = config.get_all(key)
+        if values is None:
+            return values
+        items = []
+        for line in values:
+            for i in line.split():
+                items.append(i)
+        if items == []:
+            return None
+        return '|'.join(items)
+
+    def __init__(self, config, **kw):
+        super(ConfigRefFilterEnvironmentMixin, self).__init__(
+            config=config,
+            ref_filter_incl_regex=self._get_regex(config, 'refFilterInclusionRegex'),
+            ref_filter_excl_regex=self._get_regex(config, 'refFilterExclusionRegex'),
+            ref_filter_do_send_regex=self._get_regex(config, 'refFilterDoSendRegex'),
+            ref_filter_dont_send_regex=self._get_regex(config, 'refFilterDontSendRegex'),
+            **kw
+            )
+
+
 class ProjectdescEnvironmentMixin(Environment):
     """Make a "projectdesc" value available for templates.
 
@@ -2499,6 +2845,7 @@
         ComputeFQDNEnvironmentMixin,
         ConfigFilterLinesEnvironmentMixin,
         ConfigRecipientsEnvironmentMixin,
+        ConfigRefFilterEnvironmentMixin,
         PusherDomainEnvironmentMixin,
         ConfigOptionsEnvironmentMixin,
         GenericEnvironmentMixin,
@@ -2513,14 +2860,14 @@
         # repo_shortname (though it's probably not as good as a value
         # the user might have explicitly put in his config).
         return (
-            self.osenv.get('GL_REPO', None)
-            or super(GitoliteEnvironmentMixin, self).get_repo_shortname()
+            self.osenv.get('GL_REPO', None) or
+            super(GitoliteEnvironmentMixin, self).get_repo_shortname()
             )
 
     def get_pusher(self):
         return self.osenv.get('GL_USER', 'unknown user')
 
-    def get_fromaddr(self):
+    def get_fromaddr(self, change=None):
         GL_USER = self.osenv.get('GL_USER')
         if GL_USER is not None:
             # Find the path to gitolite.conf.  Note that gitolite v3
@@ -2536,9 +2883,9 @@
                 f = open(GL_CONF, 'rU')
                 try:
                     in_user_emails_section = False
-                    re_template = r'^\s*#\s*{}\s*$'
+                    re_template = r'^\s*#\s*%s\s*$'
                     re_begin, re_user, re_end = (
-                        re.compile(re_template.format(x))
+                        re.compile(re_template % x)
                         for x in (
                             r'BEGIN\s+USER\s+EMAILS',
                             re.escape(GL_USER) + r'\s+(.*)',
@@ -2557,7 +2904,7 @@
                             return m.group(1)
                 finally:
                     f.close()
-        return super(GitoliteEnvironmentMixin, self).get_fromaddr()
+        return super(GitoliteEnvironmentMixin, self).get_fromaddr(change)
 
 
 class IncrementalDateTime(object):
@@ -2570,8 +2917,9 @@
 
     def __init__(self):
         self.time = time.time()
+        self.next = self.__next__  # Python 2 backward compatibility
 
-    def next(self):
+    def __next__(self):
         formatted = formatdate(self.time, True)
         self.time += 1
         return formatted
@@ -2583,6 +2931,7 @@
         ComputeFQDNEnvironmentMixin,
         ConfigFilterLinesEnvironmentMixin,
         ConfigRecipientsEnvironmentMixin,
+        ConfigRefFilterEnvironmentMixin,
         PusherDomainEnvironmentMixin,
         ConfigOptionsEnvironmentMixin,
         GitoliteEnvironmentMixin,
@@ -2591,6 +2940,117 @@
     pass
 
 
+class StashEnvironmentMixin(Environment):
+    def __init__(self, user=None, repo=None, **kw):
+        super(StashEnvironmentMixin, self).__init__(**kw)
+        self.__user = user
+        self.__repo = repo
+
+    def get_repo_shortname(self):
+        return self.__repo
+
+    def get_pusher(self):
+        return re.match('(.*?)\s*<', self.__user).group(1)
+
+    def get_pusher_email(self):
+        return self.__user
+
+    def get_fromaddr(self, change=None):
+        return self.__user
+
+
+class StashEnvironment(
+        StashEnvironmentMixin,
+        ProjectdescEnvironmentMixin,
+        ConfigMaxlinesEnvironmentMixin,
+        ComputeFQDNEnvironmentMixin,
+        ConfigFilterLinesEnvironmentMixin,
+        ConfigRecipientsEnvironmentMixin,
+        ConfigRefFilterEnvironmentMixin,
+        PusherDomainEnvironmentMixin,
+        ConfigOptionsEnvironmentMixin,
+        Environment,
+        ):
+    pass
+
+
+class GerritEnvironmentMixin(Environment):
+    def __init__(self, project=None, submitter=None, update_method=None, **kw):
+        super(GerritEnvironmentMixin, self).__init__(**kw)
+        self.__project = project
+        self.__submitter = submitter
+        self.__update_method = update_method
+        "Make an 'update_method' value available for templates."
+        self.COMPUTED_KEYS += ['update_method']
+
+    def get_repo_shortname(self):
+        return self.__project
+
+    def get_pusher(self):
+        if self.__submitter:
+            if self.__submitter.find('<') != -1:
+                # Submitter has a configured email, we transformed
+                # __submitter into an RFC 2822 string already.
+                return re.match('(.*?)\s*<', self.__submitter).group(1)
+            else:
+                # Submitter has no configured email, it's just his name.
+                return self.__submitter
+        else:
+            # If we arrive here, this means someone pushed "Submit" from
+            # the gerrit web UI for the CR (or used one of the programmatic
+            # APIs to do the same, such as gerrit review) and the
+            # merge/push was done by the Gerrit user.  It was technically
+            # triggered by someone else, but sadly we have no way of
+            # determining who that someone else is at this point.
+            return 'Gerrit'  # 'unknown user'?
+
+    def get_pusher_email(self):
+        if self.__submitter:
+            return self.__submitter
+        else:
+            return super(GerritEnvironmentMixin, self).get_pusher_email()
+
+    def get_fromaddr(self, change=None):
+        if self.__submitter and self.__submitter.find('<') != -1:
+            return self.__submitter
+        else:
+            return super(GerritEnvironmentMixin, self).get_fromaddr(change)
+
+    def get_default_ref_ignore_regex(self):
+        default = super(GerritEnvironmentMixin, self).get_default_ref_ignore_regex()
+        return default + '|^refs/changes/|^refs/cache-automerge/|^refs/meta/'
+
+    def get_revision_recipients(self, revision):
+        # Merge commits created by Gerrit when users hit "Submit this patchset"
+        # in the Web UI (or do equivalently with REST APIs or the gerrit review
+        # command) are not something users want to see an individual email for.
+        # Filter them out.
+        committer = read_git_output(['log', '--no-walk', '--format=%cN',
+                                     revision.rev.sha1])
+        if committer == 'Gerrit Code Review':
+            return []
+        else:
+            return super(GerritEnvironmentMixin, self).get_revision_recipients(revision)
+
+    def get_update_method(self):
+        return self.__update_method
+
+
+class GerritEnvironment(
+        GerritEnvironmentMixin,
+        ProjectdescEnvironmentMixin,
+        ConfigMaxlinesEnvironmentMixin,
+        ComputeFQDNEnvironmentMixin,
+        ConfigFilterLinesEnvironmentMixin,
+        ConfigRecipientsEnvironmentMixin,
+        ConfigRefFilterEnvironmentMixin,
+        PusherDomainEnvironmentMixin,
+        ConfigOptionsEnvironmentMixin,
+        Environment,
+        ):
+    pass
+
+
 class Push(object):
     """Represent an entire push (i.e., a group of ReferenceChanges).
 
@@ -2673,10 +3133,11 @@
             ])
         )
 
-    def __init__(self, changes, ignore_other_refs=False):
+    def __init__(self, environment, changes, ignore_other_refs=False):
         self.changes = sorted(changes, key=self._sort_key)
         self.__other_ref_sha1s = None
         self.__cached_commits_spec = {}
+        self.environment = environment
 
         if ignore_other_refs:
             self.__other_ref_sha1s = set()
@@ -2703,10 +3164,14 @@
                 '%(objectname) %(objecttype) %(refname)\n'
                 '%(*objectname) %(*objecttype) %(refname)'
                 )
+            ref_filter_regex, is_inclusion_filter = \
+                self.environment.get_ref_filter_regex()
             for line in read_git_lines(
                     ['for-each-ref', '--format=%s' % (fmt,)]):
                 (sha1, type, name) = line.split(' ', 2)
-                if sha1 and type == 'commit' and name not in updated_refs:
+                if (sha1 and type == 'commit' and
+                        name not in updated_refs and
+                        include_ref(name, ref_filter_regex, is_inclusion_filter)):
                     sha1s.add(sha1)
 
             self.__other_ref_sha1s = sha1s
@@ -2856,7 +3321,7 @@
                 if not change.environment.quiet:
                     change.environment.log_msg(
                         'Sending notification emails to: %s\n' % (change.recipients,))
-                extra_values = {'send_date': send_date.next()}
+                extra_values = {'send_date': next(send_date)}
 
                 rev = change.send_single_combined_email(sha1s)
                 if rev:
@@ -2876,9 +3341,9 @@
             max_emails = change.environment.maxcommitemails
             if max_emails and len(sha1s) > max_emails:
                 change.environment.log_warning(
-                    '*** Too many new commits (%d), not sending commit emails.\n' % len(sha1s)
-                    + '*** Try setting multimailhook.maxCommitEmails to a greater value\n'
-                    + '*** Currently, multimailhook.maxCommitEmails=%d\n' % max_emails
+                    '*** Too many new commits (%d), not sending commit emails.\n' % len(sha1s) +
+                    '*** Try setting multimailhook.maxCommitEmails to a greater value\n' +
+                    '*** Currently, multimailhook.maxCommitEmails=%d\n' % max_emails
                     )
                 return
 
@@ -2889,7 +3354,7 @@
                     rev.recipients = rev.cc_recipients
                     rev.cc_recipients = None
                 if rev.recipients:
-                    extra_values = {'send_date': send_date.next()}
+                    extra_values = {'send_date': next(send_date)}
                     mailer.send(
                         rev.generate_email(self, body_filter, extra_values),
                         rev.recipients,
@@ -2904,18 +3369,33 @@
                 )
 
 
+def include_ref(refname, ref_filter_regex, is_inclusion_filter):
+    does_match = bool(ref_filter_regex.search(refname))
+    if is_inclusion_filter:
+        return does_match
+    else:  # exclusion filter -- we include the ref if the regex doesn't match
+        return not does_match
+
+
 def run_as_post_receive_hook(environment, mailer):
+    ref_filter_regex, is_inclusion_filter = environment.get_ref_filter_regex(True)
     changes = []
     for line in sys.stdin:
         (oldrev, newrev, refname) = line.strip().split(' ', 2)
+        if not include_ref(refname, ref_filter_regex, is_inclusion_filter):
+            continue
         changes.append(
             ReferenceChange.create(environment, oldrev, newrev, refname)
             )
-    push = Push(changes)
-    push.send_emails(mailer, body_filter=environment.filter_body)
+    if changes:
+        push = Push(environment, changes)
+        push.send_emails(mailer, body_filter=environment.filter_body)
 
 
 def run_as_update_hook(environment, mailer, refname, oldrev, newrev, force_send=False):
+    ref_filter_regex, is_inclusion_filter = environment.get_ref_filter_regex(True)
+    if not include_ref(refname, ref_filter_regex, is_inclusion_filter):
+        return
     changes = [
         ReferenceChange.create(
             environment,
@@ -2924,7 +3404,7 @@
             refname,
             ),
         ]
-    push = Push(changes, force_send)
+    push = Push(environment, changes, force_send)
     push.send_emails(mailer, body_filter=environment.filter_body)
 
 
@@ -2953,8 +3433,8 @@
         mailer = SendMailer(command=command, envelopesender=environment.get_sender())
     else:
         environment.log_error(
-            'fatal: multimailhook.mailer is set to an incorrect value: "%s"\n' % mailer
-            + 'please use one of "smtp" or "sendmail".\n'
+            'fatal: multimailhook.mailer is set to an incorrect value: "%s"\n' % mailer +
+            'please use one of "smtp" or "sendmail".\n'
             )
         sys.exit(1)
     return mailer
@@ -2963,14 +3443,18 @@
 KNOWN_ENVIRONMENTS = {
     'generic': GenericEnvironmentMixin,
     'gitolite': GitoliteEnvironmentMixin,
+    'stash': StashEnvironmentMixin,
+    'gerrit': GerritEnvironmentMixin,
     }
 
 
-def choose_environment(config, osenv=None, env=None, recipients=None):
+def choose_environment(config, osenv=None, env=None, recipients=None,
+                       hook_info=None):
     if not osenv:
         osenv = os.environ
 
     environment_mixins = [
+        ConfigRefFilterEnvironmentMixin,
         ProjectdescEnvironmentMixin,
         ConfigMaxlinesEnvironmentMixin,
         ComputeFQDNEnvironmentMixin,
@@ -2992,7 +3476,15 @@
         else:
             env = 'generic'
 
-    environment_mixins.append(KNOWN_ENVIRONMENTS[env])
+    environment_mixins.insert(0, KNOWN_ENVIRONMENTS[env])
+
+    if env == 'stash':
+        environment_kw['user'] = hook_info['stash_user']
+        environment_kw['repo'] = hook_info['stash_repo']
+    elif env == 'gerrit':
+        environment_kw['project'] = hook_info['project']
+        environment_kw['submitter'] = hook_info['submitter']
+        environment_kw['update_method'] = hook_info['update_method']
 
     if recipients:
         environment_mixins.insert(0, StaticRecipientsEnvironmentMixin)
@@ -3011,6 +3503,116 @@
     return environment_klass(**environment_kw)
 
 
+def get_version():
+    oldcwd = os.getcwd()
+    try:
+        try:
+            os.chdir(os.path.dirname(os.path.realpath(__file__)))
+            git_version = read_git_output(['describe', '--tags', 'HEAD'])
+            if git_version == __version__:
+                return git_version
+            else:
+                return '%s (%s)' % (__version__, git_version)
+        except:
+            pass
+    finally:
+        os.chdir(oldcwd)
+    return __version__
+
+
+def compute_gerrit_options(options, args, required_gerrit_options):
+    if None in required_gerrit_options:
+        raise SystemExit("Error: Specify all of --oldrev, --newrev, --refname, "
+                         "and --project; or none of them.")
+
+    if options.environment not in (None, 'gerrit'):
+        raise SystemExit("Non-gerrit environments incompatible with --oldrev, "
+                         "--newrev, --refname, and --project")
+    options.environment = 'gerrit'
+
+    if args:
+        raise SystemExit("Error: Positional parameters not allowed with "
+                         "--oldrev, --newrev, and --refname.")
+
+    # Gerrit oddly omits 'refs/heads/' in the refname when calling
+    # ref-updated hook; put it back.
+    git_dir = get_git_dir()
+    if (not os.path.exists(os.path.join(git_dir, options.refname)) and
+        os.path.exists(os.path.join(git_dir, 'refs', 'heads',
+                                    options.refname))):
+        options.refname = 'refs/heads/' + options.refname
+
+    # Convert each string option unicode for Python3.
+    if PYTHON3:
+        opts = ['environment', 'recipients', 'oldrev', 'newrev', 'refname',
+                'project', 'submitter', 'stash-user', 'stash-repo']
+        for opt in opts:
+            if not hasattr(options, opt):
+                continue
+            obj = getattr(options, opt)
+            if obj:
+                enc = obj.encode('utf-8', 'surrogateescape')
+                dec = enc.decode('utf-8', 'replace')
+                setattr(options, opt, dec)
+
+    # New revisions can appear in a gerrit repository either due to someone
+    # pushing directly (in which case options.submitter will be set), or they
+    # can press "Submit this patchset" in the web UI for some CR (in which
+    # case options.submitter will not be set and gerrit will not have provided
+    # us the information about who pressed the button).
+    #
+    # Note for the nit-picky: I'm lumping in REST API calls and the ssh
+    # gerrit review command in with "Submit this patchset" button, since they
+    # have the same effect.
+    if options.submitter:
+        update_method = 'pushed'
+        # The submitter argument is almost an RFC 2822 email address; change it
+        # from 'User Name (email@domain)' to 'User Name <email@domain>' so it is
+        options.submitter = options.submitter.replace('(', '<').replace(')', '>')
+    else:
+        update_method = 'submitted'
+        # Gerrit knew who submitted this patchset, but threw that information
+        # away when it invoked this hook.  However, *IF* Gerrit created a
+        # merge to bring the patchset in (project 'Submit Type' is either
+        # "Always Merge", or is "Merge if Necessary" and happens to be
+        # necessary for this particular CR), then it will have the committer
+        # of that merge be 'Gerrit Code Review' and the author will be the
+        # person who requested the submission of the CR.  Since this is fairly
+        # likely for most gerrit installations (of a reasonable size), it's
+        # worth the extra effort to try to determine the actual submitter.
+        rev_info = read_git_lines(['log', '--no-walk', '--merges',
+                                   '--format=%cN%n%aN <%aE>', options.newrev])
+        if rev_info and rev_info[0] == 'Gerrit Code Review':
+            options.submitter = rev_info[1]
+
+    # We pass back refname, oldrev, newrev as args because then the
+    # gerrit ref-updated hook is much like the git update hook
+    return (options,
+            [options.refname, options.oldrev, options.newrev],
+            {'project': options.project, 'submitter': options.submitter,
+             'update_method': update_method})
+
+
+def check_hook_specific_args(options, args):
+    # First check for stash arguments
+    if (options.stash_user is None) != (options.stash_repo is None):
+        raise SystemExit("Error: Specify both of --stash-user and "
+                         "--stash-repo or neither.")
+    if options.stash_user:
+        options.environment = 'stash'
+        return options, args, {'stash_user': options.stash_user,
+                               'stash_repo': options.stash_repo}
+
+    # Finally, check for gerrit specific arguments
+    required_gerrit_options = (options.oldrev, options.newrev, options.refname,
+                               options.project)
+    if required_gerrit_options != (None,) * 4:
+        return compute_gerrit_options(options, args, required_gerrit_options)
+
+    # No special options in use, just return what we started with
+    return options, args, {}
+
+
 def main(args):
     parser = optparse.OptionParser(
         description=__doc__,
@@ -3019,7 +3621,7 @@
 
     parser.add_option(
         '--environment', '--env', action='store', type='choice',
-        choices=['generic', 'gitolite'], default=None,
+        choices=list(KNOWN_ENVIRONMENTS.keys()), default=None,
         help=(
             'Choose type of environment is in use.  Default is taken from '
             'multimailhook.environment if set; otherwise "generic".'
@@ -3048,8 +3650,58 @@
             'detection in this mode.'
             ),
         )
+    parser.add_option(
+        '-c', metavar="<name>=<value>", action='append',
+        help=(
+            'Pass a configuration parameter through to git.  The value given '
+            'will override values from configuration files.  See the -c option '
+            'of git(1) for more details.  (Only works with git >= 1.7.3)'
+            ),
+        )
+    parser.add_option(
+        '--version', '-v', action='store_true', default=False,
+        help=(
+            "Display git-multimail's version"
+            ),
+        )
+    # The following options permit this script to be run as a gerrit
+    # ref-updated hook.  See e.g.
+    # code.google.com/p/gerrit/source/browse/Documentation/config-hooks.txt
+    # We suppress help for these items, since these are specific to gerrit,
+    # and we don't want users directly using them any way other than how the
+    # gerrit ref-updated hook is called.
+    parser.add_option('--oldrev', action='store', help=optparse.SUPPRESS_HELP)
+    parser.add_option('--newrev', action='store', help=optparse.SUPPRESS_HELP)
+    parser.add_option('--refname', action='store', help=optparse.SUPPRESS_HELP)
+    parser.add_option('--project', action='store', help=optparse.SUPPRESS_HELP)
+    parser.add_option('--submitter', action='store', help=optparse.SUPPRESS_HELP)
+
+    # The following allow this to be run as a stash asynchronous post-receive
+    # hook (almost identical to a git post-receive hook but triggered also for
+    # merges of pull requests from the UI).  We suppress help for these items,
+    # since these are specific to stash.
+    parser.add_option('--stash-user', action='store', help=optparse.SUPPRESS_HELP)
+    parser.add_option('--stash-repo', action='store', help=optparse.SUPPRESS_HELP)
 
     (options, args) = parser.parse_args(args)
+    (options, args, hook_info) = check_hook_specific_args(options, args)
+
+    if options.version:
+        sys.stdout.write('git-multimail version ' + get_version() + '\n')
+        return
+
+    if options.c:
+        parameters = os.environ.get('GIT_CONFIG_PARAMETERS', '')
+        if parameters:
+            parameters += ' '
+        # git expects GIT_CONFIG_PARAMETERS to be of the form
+        #    "'name1=value1' 'name2=value2' 'name3=value3'"
+        # including everything inside the double quotes (but not the double
+        # quotes themselves).  Spacing is critical.  Also, if a value contains
+        # a literal single quote that quote must be represented using the
+        # four character sequence: '\''
+        parameters += ' '.join("'" + x.replace("'", "'\\''") + "'" for x in options.c)
+        os.environ['GIT_CONFIG_PARAMETERS'] = parameters
 
     config = Config('multimailhook')
 
@@ -3058,6 +3710,7 @@
             config, osenv=os.environ,
             env=options.environment,
             recipients=options.recipients,
+            hook_info=hook_info,
             )
 
         if options.show_env:
@@ -3080,9 +3733,20 @@
             run_as_update_hook(environment, mailer, refname, oldrev, newrev, options.force_send)
         else:
             run_as_post_receive_hook(environment, mailer)
-    except ConfigurationException, e:
-        sys.exit(str(e))
-
+    except ConfigurationException:
+        sys.exit(sys.exc_info()[1])
+    except Exception:
+        t, e, tb = sys.exc_info()
+        import traceback
+        sys.stdout.write('\n')
+        sys.stdout.write('Exception \'' + t.__name__ +
+                         '\' raised. Please report this as a bug to\n')
+        sys.stdout.write('https://github.com/git-multimail/git-multimail/issues\n')
+        sys.stdout.write('with the information below:\n\n')
+        sys.stdout.write('git-multimail version ' + get_version() + '\n')
+        sys.stdout.write('Python version ' + sys.version + '\n')
+        traceback.print_exc(file=sys.stdout)
+        sys.exit(1)
 
 if __name__ == '__main__':
     main(sys.argv[1:])
diff --git a/contrib/hooks/multimail/migrate-mailhook-config b/contrib/hooks/multimail/migrate-mailhook-config
index d0e9b39..992657b 100755
--- a/contrib/hooks/multimail/migrate-mailhook-config
+++ b/contrib/hooks/multimail/migrate-mailhook-config
@@ -1,4 +1,4 @@
-#! /usr/bin/env python2
+#! /usr/bin/env python
 
 """Migrate a post-receive-email configuration to be usable with git_multimail.py.
 
diff --git a/contrib/hooks/multimail/post-receive.example b/contrib/hooks/multimail/post-receive.example
index 43f7b6b..9975df7 100755
--- a/contrib/hooks/multimail/post-receive.example
+++ b/contrib/hooks/multimail/post-receive.example
@@ -1,4 +1,4 @@
-#! /usr/bin/env python2
+#! /usr/bin/env python
 
 """Example post-receive hook based on git-multimail.
 
@@ -42,7 +42,6 @@
 
 import git_multimail
 
-
 # It is possible to modify the output templates here; e.g.:
 
 #git_multimail.FOOTER_TEMPLATE = """\
@@ -61,8 +60,9 @@
 try:
     environment = git_multimail.GenericEnvironment(config=config)
     #environment = git_multimail.GitoliteEnvironment(config=config)
-except git_multimail.ConfigurationException, e:
-    sys.exit(str(e))
+except git_multimail.ConfigurationException:
+    sys.stderr.write('*** %s\n' % sys.exc_info()[1])
+    sys.exit(1)
 
 
 # Choose the method of sending emails based on the git config:
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index 308b777..5c83727 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -90,7 +90,7 @@
 		--annotate) annotate="$1"; shift ;;
 		--no-annotate) annotate= ;;
 		-b) branch="$1"; shift ;;
-		-P) prefix="$1"; shift ;;
+		-P) prefix="${1%/}"; shift ;;
 		-m) message="$1"; shift ;;
 		--no-prefix) prefix= ;;
 		--onto) onto="$1"; shift ;;
@@ -479,8 +479,16 @@
 			p="$p -p $parent"
 		fi
 	done
-	
-	if [ -n "$identical" ]; then
+
+	copycommit=
+	if [ -n "$identical" ] && [ -n "$nonidentical" ]; then
+		extras=$(git rev-list --count $identical..$nonidentical)
+		if [ "$extras" -ne 0 ]; then
+			# we need to preserve history along the other branch
+			copycommit=1
+		fi
+	fi
+	if [ -n "$identical" ] && [ -z "$copycommit" ]; then
 		echo $identical
 	else
 		copy_commit $rev $tree "$p" || exit $?
diff --git a/contrib/subtree/t/Makefile b/contrib/subtree/t/Makefile
index c864810..276898e 100644
--- a/contrib/subtree/t/Makefile
+++ b/contrib/subtree/t/Makefile
@@ -13,11 +13,23 @@
 RM ?= rm -f
 PROVE ?= prove
 DEFAULT_TEST_TARGET ?= test
+TEST_LINT ?= test-lint
+
+ifdef TEST_OUTPUT_DIRECTORY
+TEST_RESULTS_DIRECTORY = $(TEST_OUTPUT_DIRECTORY)/test-results
+else
+TEST_RESULTS_DIRECTORY = ../../../t/test-results
+endif
 
 # Shell quote;
 SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
+PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
+TEST_RESULTS_DIRECTORY_SQ = $(subst ','\'',$(TEST_RESULTS_DIRECTORY))
 
-T = $(wildcard t[0-9][0-9][0-9][0-9]-*.sh)
+T = $(sort $(wildcard t[0-9][0-9][0-9][0-9]-*.sh))
+TSVN = $(sort $(wildcard t91[0-9][0-9]-*.sh))
+TGITWEB = $(sort $(wildcard t95[0-9][0-9]-*.sh))
+THELPERS = $(sort $(filter-out $(T),$(wildcard *.sh)))
 
 all: $(DEFAULT_TEST_TARGET)
 
@@ -26,20 +38,22 @@
 
 prove: pre-clean $(TEST_LINT)
 	@echo "*** prove ***"; GIT_CONFIG=.git/config $(PROVE) --exec '$(SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS)
-	$(MAKE) clean
+	$(MAKE) clean-except-prove-cache
 
 $(T):
 	@echo "*** $@ ***"; GIT_CONFIG=.git/config '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
 
 pre-clean:
-	$(RM) -r test-results
+	$(RM) -r '$(TEST_RESULTS_DIRECTORY_SQ)'
 
-clean:
-	$(RM) -r 'trash directory'.* test-results
+clean-except-prove-cache:
+	$(RM) -r 'trash directory'.* '$(TEST_RESULTS_DIRECTORY_SQ)'
 	$(RM) -r valgrind/bin
+
+clean: clean-except-prove-cache
 	$(RM) .prove
 
-test-lint: test-lint-duplicates test-lint-executable
+test-lint: test-lint-duplicates test-lint-executable test-lint-shell-syntax
 
 test-lint-duplicates:
 	@dups=`echo $(T) | tr ' ' '\n' | sed 's/-.*//' | sort | uniq -d` && \
@@ -51,12 +65,15 @@
 		test -z "$$bad" || { \
 		echo >&2 "non-executable tests:" $$bad; exit 1; }
 
+test-lint-shell-syntax:
+	@'$(PERL_PATH_SQ)' ../../../t/check-non-portable-shell.pl $(T) $(THELPERS)
+
 aggregate-results-and-cleanup: $(T)
 	$(MAKE) aggregate-results
 	$(MAKE) clean
 
 aggregate-results:
-	for f in ../../../t/test-results/t*-*.counts; do \
+	for f in '$(TEST_RESULTS_DIRECTORY_SQ)'/t*-*.counts; do \
 		echo "$$f"; \
 	done | '$(SHELL_PATH_SQ)' ../../../t/aggregate-results.sh
 
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index dfbe443..3bf96a9 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -5,7 +5,7 @@
 #
 test_description='Basic porcelain support for subtrees
 
-This test verifies the basic operation of the merge, pull, add
+This test verifies the basic operation of the add, pull, merge
 and split subcommands of git subtree.
 '
 
@@ -14,13 +14,21 @@
 
 . ../../../t/test-lib.sh
 
+subtree_test_create_repo()
+{
+	test_create_repo "$1"
+	(
+		cd $1
+		git config log.date relative
+	)
+}
+
 create()
 {
 	echo "$1" >"$1"
 	git add "$1"
 }
 
-
 check_equal()
 {
 	test_debug 'echo'
@@ -38,408 +46,15 @@
 	git reset --hard HEAD~
 }
 
-last_commit_message()
-{
-	git log --pretty=format:%s -1
-}
-
-test_expect_success 'init subproj' '
-	test_create_repo "sub proj"
-'
-
-# To the subproject!
-cd ./"sub proj"
-
-test_expect_success 'add sub1' '
-	create sub1 &&
-	git commit -m "sub1" &&
-	git branch sub1 &&
-	git branch -m master subproj
-'
-
-# Save this hash for testing later.
-
-subdir_hash=$(git rev-parse HEAD)
-
-test_expect_success 'add sub2' '
-	create sub2 &&
-	git commit -m "sub2" &&
-	git branch sub2
-'
-
-test_expect_success 'add sub3' '
-	create sub3 &&
-	git commit -m "sub3" &&
-	git branch sub3
-'
-
-# Back to mainline
-cd ..
-
-test_expect_success 'enable log.date=relative to catch errors' '
-	git config log.date relative
-'
-
-test_expect_success 'add main4' '
-	create main4 &&
-	git commit -m "main4" &&
-	git branch -m master mainline &&
-	git branch subdir
-'
-
-test_expect_success 'fetch subproj history' '
-	git fetch ./"sub proj" sub1 &&
-	git branch sub1 FETCH_HEAD
-'
-
-test_expect_success 'no subtree exists in main tree' '
-	test_must_fail git subtree merge --prefix="sub dir" sub1
-'
-
-test_expect_success 'no pull from non-existant subtree' '
-	test_must_fail git subtree pull --prefix="sub dir" ./"sub proj" sub1
-'
-
-test_expect_success 'check if --message works for add' '
-	git subtree add --prefix="sub dir" --message="Added subproject" sub1 &&
-	check_equal ''"$(last_commit_message)"'' "Added subproject" &&
-	undo
-'
-
-test_expect_success 'check if --message works as -m and --prefix as -P' '
-	git subtree add -P "sub dir" -m "Added subproject using git subtree" sub1 &&
-	check_equal ''"$(last_commit_message)"'' "Added subproject using git subtree" &&
-	undo
-'
-
-test_expect_success 'check if --message works with squash too' '
-	git subtree add -P "sub dir" -m "Added subproject with squash" --squash sub1 &&
-	check_equal ''"$(last_commit_message)"'' "Added subproject with squash" &&
-	undo
-'
-
-test_expect_success 'add subproj to mainline' '
-	git subtree add --prefix="sub dir"/ FETCH_HEAD &&
-	check_equal ''"$(last_commit_message)"'' "Add '"'sub dir/'"' from commit '"'"'''"$(git rev-parse sub1)"'''"'"'"
-'
-
-# this shouldn't actually do anything, since FETCH_HEAD is already a parent
-test_expect_success 'merge fetched subproj' '
-	git merge -m "merge -s -ours" -s ours FETCH_HEAD
-'
-
-test_expect_success 'add main-sub5' '
-	create "sub dir/main-sub5" &&
-	git commit -m "main-sub5"
-'
-
-test_expect_success 'add main6' '
-	create main6 &&
-	git commit -m "main6 boring"
-'
-
-test_expect_success 'add main-sub7' '
-	create "sub dir/main-sub7" &&
-	git commit -m "main-sub7"
-'
-
-test_expect_success 'fetch new subproj history' '
-	git fetch ./"sub proj" sub2 &&
-	git branch sub2 FETCH_HEAD
-'
-
-test_expect_success 'check if --message works for merge' '
-	git subtree merge --prefix="sub dir" -m "Merged changes from subproject" sub2 &&
-	check_equal ''"$(last_commit_message)"'' "Merged changes from subproject" &&
-	undo
-'
-
-test_expect_success 'check if --message for merge works with squash too' '
-	git subtree merge --prefix "sub dir" -m "Merged changes from subproject using squash" --squash sub2 &&
-	check_equal ''"$(last_commit_message)"'' "Merged changes from subproject using squash" &&
-	undo
-'
-
-test_expect_success 'merge new subproj history into subdir' '
-	git subtree merge --prefix="sub dir" FETCH_HEAD &&
-	git branch pre-split &&
-	check_equal ''"$(last_commit_message)"'' "Merge commit '"'"'"$(git rev-parse sub2)"'"'"' into mainline" &&
-	undo
-'
-
-test_expect_success 'Check that prefix argument is required for split' '
-	echo "You must provide the --prefix option." > expected &&
-	test_must_fail git subtree split > actual 2>&1 &&
-	test_debug "printf '"'"'expected: '"'"'" &&
-	test_debug "cat expected" &&
-	test_debug "printf '"'"'actual: '"'"'" &&
-	test_debug "cat actual" &&
-	test_cmp expected actual &&
-	rm -f expected actual
-'
-
-test_expect_success 'Check that the <prefix> exists for a split' '
-	echo "'"'"'non-existent-directory'"'"'" does not exist\; use "'"'"'git subtree add'"'"'" > expected &&
-	test_must_fail git subtree split --prefix=non-existent-directory > actual 2>&1 &&
-	test_debug "printf '"'"'expected: '"'"'" &&
-	test_debug "cat expected" &&
-	test_debug "printf '"'"'actual: '"'"'" &&
-	test_debug "cat actual" &&
-	test_cmp expected actual
-#	rm -f expected actual
-'
-
-test_expect_success 'check if --message works for split+rejoin' '
-	spl1=''"$(git subtree split --annotate='"'*'"' --prefix "sub dir" --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
-	git branch spl1 "$spl1" &&
-	check_equal ''"$(last_commit_message)"'' "Split & rejoin" &&
-	undo
-'
-
-test_expect_success 'check split with --branch' '
-	spl1=$(git subtree split --annotate='"'*'"' --prefix "sub dir" --onto FETCH_HEAD --message "Split & rejoin" --rejoin) &&
-	undo &&
-	git subtree split --annotate='"'*'"' --prefix "sub dir" --onto FETCH_HEAD --branch splitbr1 &&
-	check_equal ''"$(git rev-parse splitbr1)"'' "$spl1"
-'
-
-test_expect_success 'check hash of split' '
-	spl1=$(git subtree split --prefix "sub dir") &&
-	git subtree split --prefix "sub dir" --branch splitbr1test &&
-	check_equal ''"$(git rev-parse splitbr1test)"'' "$spl1" &&
-	new_hash=$(git rev-parse splitbr1test~2) &&
-	check_equal ''"$new_hash"'' "$subdir_hash"
-'
-
-test_expect_success 'check split with --branch for an existing branch' '
-	spl1=''"$(git subtree split --annotate='"'*'"' --prefix "sub dir" --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
-	undo &&
-	git branch splitbr2 sub1 &&
-	git subtree split --annotate='"'*'"' --prefix "sub dir" --onto FETCH_HEAD --branch splitbr2 &&
-	check_equal ''"$(git rev-parse splitbr2)"'' "$spl1"
-'
-
-test_expect_success 'check split with --branch for an incompatible branch' '
-	test_must_fail git subtree split --prefix "sub dir" --onto FETCH_HEAD --branch subdir
-'
-
-test_expect_success 'check split+rejoin' '
-	spl1=''"$(git subtree split --annotate='"'*'"' --prefix "sub dir" --onto FETCH_HEAD --message "Split & rejoin" --rejoin)"'' &&
-	undo &&
-	git subtree split --annotate='"'*'"' --prefix "sub dir" --onto FETCH_HEAD --rejoin &&
-	check_equal ''"$(last_commit_message)"'' "Split '"'"'sub dir/'"'"' into commit '"'"'"$spl1"'"'"'"
-'
-
-test_expect_success 'add main-sub8' '
-	create "sub dir/main-sub8" &&
-	git commit -m "main-sub8"
-'
-
-# To the subproject!
-cd ./"sub proj"
-
-test_expect_success 'merge split into subproj' '
-	git fetch .. spl1 &&
-	git branch spl1 FETCH_HEAD &&
-	git merge FETCH_HEAD
-'
-
-test_expect_success 'add sub9' '
-	create sub9 &&
-	git commit -m "sub9"
-'
-
-# Back to mainline
-cd ..
-
-test_expect_success 'split for sub8' '
-	split2=''"$(git subtree split --annotate='"'*'"' --prefix "sub dir/" --rejoin)"'' &&
-	git branch split2 "$split2"
-'
-
-test_expect_success 'add main-sub10' '
-	create "sub dir/main-sub10" &&
-	git commit -m "main-sub10"
-'
-
-test_expect_success 'split for sub10' '
-	spl3=''"$(git subtree split --annotate='"'*'"' --prefix "sub dir" --rejoin)"'' &&
-	git branch spl3 "$spl3"
-'
-
-# To the subproject!
-cd ./"sub proj"
-
-test_expect_success 'merge split into subproj' '
-	git fetch .. spl3 &&
-	git branch spl3 FETCH_HEAD &&
-	git merge FETCH_HEAD &&
-	git branch subproj-merge-spl3
-'
-
-chkm="main4
-main6"
-chkms="main-sub10
-main-sub5
-main-sub7
-main-sub8"
-chkms_sub=$(cat <<TXT | sed 's,^,sub dir/,'
-$chkms
-TXT
-)
-chks="sub1
-sub2
-sub3
-sub9"
-chks_sub=$(cat <<TXT | sed 's,^,sub dir/,'
-$chks
-TXT
-)
-
-test_expect_success 'make sure exactly the right set of files ends up in the subproj' '
-	subfiles="$(git ls-files)" &&
-	check_equal "$subfiles" "$chkms
-$chks"
-'
-test_expect_success 'make sure the subproj history *only* contains commits that affect the subdir' '
-	allchanges=''"$(git log --name-only --pretty=format:'"''"' | sort | sed "/^$/d")"'' &&
-	check_equal "$allchanges" "$chkms
-$chks"
-'
-
-# Back to mainline
-cd ..
-
-test_expect_success 'pull from subproj' '
-	git fetch ./"sub proj" subproj-merge-spl3 &&
-	git branch subproj-merge-spl3 FETCH_HEAD &&
-	git subtree pull --prefix="sub dir" ./"sub proj" subproj-merge-spl3
-'
-
-test_expect_success 'make sure exactly the right set of files ends up in the mainline' '
-	mainfiles=$(git ls-files) &&
-	check_equal "$mainfiles" "$chkm
-$chkms_sub
-$chks_sub"
-'
-
-test_expect_success 'make sure each filename changed exactly once in the entire history' '
-	# main-sub?? and /subdir/main-sub?? both change, because those are the
-	# changes that were split into their own history.  And subdir/sub?? never
-	# change, since they were *only* changed in the subtree branch.
-	allchanges=''"$(git log --name-only --pretty=format:'"''"' | sort | sed "/^$/d")"'' &&
-	check_equal "$allchanges" ''"$(cat <<TXT | sort
-$chkms
-$chkm
-$chks
-$chkms_sub
-TXT
-)"''
-'
-
-test_expect_success 'make sure the --rejoin commits never make it into subproj' '
-	check_equal ''"$(git log --pretty=format:'"'%s'"' HEAD^2 | grep -i split)"'' ""
-'
-
-test_expect_success 'make sure no "git subtree" tagged commits make it into subproj' '
-	# They are meaningless to subproj since one side of the merge refers to the mainline
-	check_equal ''"$(git log --pretty=format:'"'%s%n%b'"' HEAD^2 | grep "git-subtree.*:")"'' ""
-'
-
-# prepare second pair of repositories
-mkdir test2
-cd test2
-
-test_expect_success 'init main' '
-	test_create_repo main
-'
-
-cd main
-
-test_expect_success 'add main1' '
-	create main1 &&
-	git commit -m "main1"
-'
-
-cd ..
-
-test_expect_success 'init sub' '
-	test_create_repo sub
-'
-
-cd sub
-
-test_expect_success 'add sub2' '
-	create sub2 &&
-	git commit -m "sub2"
-'
-
-cd ../main
-
-# check if split can find proper base without --onto
-
-test_expect_success 'add sub as subdir in main' '
-	git fetch ../sub master &&
-	git branch sub2 FETCH_HEAD &&
-	git subtree add --prefix "sub dir" sub2
-'
-
-cd ../sub
-
-test_expect_success 'add sub3' '
-	create sub3 &&
-	git commit -m "sub3"
-'
-
-cd ../main
-
-test_expect_success 'merge from sub' '
-	git fetch ../sub master &&
-	git branch sub3 FETCH_HEAD &&
-	git subtree merge --prefix "sub dir" sub3
-'
-
-test_expect_success 'add main-sub4' '
-	create "sub dir/main-sub4" &&
-	git commit -m "main-sub4"
-'
-
-test_expect_success 'split for main-sub4 without --onto' '
-	git subtree split --prefix "sub dir" --branch mainsub4
-'
-
-# at this point, the new commit parent should be sub3 if it is not,
-# something went wrong (the "newparent" of "master~" commit should
-# have been sub3, but it was not, because its cache was not set to
-# itself)
-
-test_expect_success 'check that the commit parent is sub3' '
-	check_equal ''"$(git log --pretty=format:%P -1 mainsub4)"'' ''"$(git rev-parse sub3)"''
-'
-
-test_expect_success 'add main-sub5' '
-	mkdir subdir2 &&
-	create subdir2/main-sub5 &&
-	git commit -m "main-sub5"
-'
-
-test_expect_success 'split for main-sub5 without --onto' '
-	# also test that we still can split out an entirely new subtree
-	# if the parent of the first commit in the tree is not empty,
-	# then the new subtree has accidentally been attached to something
-	git subtree split --prefix subdir2 --branch mainsub5 &&
-	check_equal ''"$(git log --pretty=format:%P -1 mainsub5)"'' ""
-'
-
-# make sure no patch changes more than one file.  The original set of commits
-# changed only one file each.  A multi-file change would imply that we pruned
-# commits too aggressively.
-joincommits()
+# Make sure no patch changes more than one file.
+# The original set of commits changed only one file each.
+# A multi-file change would imply that we pruned commits
+# too aggressively.
+join_commits()
 {
 	commit=
 	all=
 	while read x y; do
-		#echo "{$x}" >&2
 		if [ -z "$x" ]; then
 			continue
 		elif [ "$x" = "commit:" ]; then
@@ -455,67 +70,1008 @@
 	echo "$commit $all"
 }
 
+test_create_commit() (
+	repo=$1
+	commit=$2
+	cd "$repo"
+	mkdir -p $(dirname "$commit") \
+	|| error "Could not create directory for commit"
+	echo "$commit" >"$commit"
+	git add "$commit" || error "Could not add commit"
+	git commit -m "$commit" || error "Could not commit"
+)
+
+last_commit_message()
+{
+	git log --pretty=format:%s -1
+}
+
+subtree_test_count=0
+next_test() {
+	subtree_test_count=$(($subtree_test_count+1))
+}
+
+#
+# Tests for 'git subtree add'
+#
+
+next_test
+test_expect_success 'no merge from non-existent subtree' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		test_must_fail git subtree merge --prefix="sub dir" FETCH_HEAD
+	)
+'
+
+next_test
+test_expect_success 'no pull from non-existent subtree' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		test_must_fail git subtree pull --prefix="sub dir" ./"sub proj" master
+	)'
+
+next_test
+test_expect_success 'add subproj as subtree into sub dir/ with --prefix' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD &&
+		check_equal "$(last_commit_message)" "Add '\''sub dir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''"
+	)
+'
+
+next_test
+test_expect_success 'add subproj as subtree into sub dir/ with --prefix and --message' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" --message="Added subproject" FETCH_HEAD &&
+		check_equal "$(last_commit_message)" "Added subproject"
+	)
+'
+
+next_test
+test_expect_success 'add subproj as subtree into sub dir/ with --prefix as -P and --message as -m' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add -P "sub dir" -m "Added subproject" FETCH_HEAD &&
+		check_equal "$(last_commit_message)" "Added subproject"
+	)
+'
+
+next_test
+test_expect_success 'add subproj as subtree into sub dir/ with --squash and --prefix and --message' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" --message="Added subproject with squash" --squash FETCH_HEAD &&
+		check_equal "$(last_commit_message)" "Added subproject with squash"
+	)
+'
+
+#
+# Tests for 'git subtree merge'
+#
+
+next_test
+test_expect_success 'merge new subproj history into sub dir/ with --prefix' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD &&
+		check_equal "$(last_commit_message)" "Merge commit '\''$(git rev-parse FETCH_HEAD)'\''"
+	)
+'
+
+next_test
+test_expect_success 'merge new subproj history into sub dir/ with --prefix and --message' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" --message="Merged changes from subproject" FETCH_HEAD &&
+		check_equal "$(last_commit_message)" "Merged changes from subproject"
+	)
+'
+
+next_test
+test_expect_success 'merge new subproj history into sub dir/ with --squash and --prefix and --message' '
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	subtree_test_create_repo "$subtree_test_count" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" --message="Merged changes from subproject using squash" --squash FETCH_HEAD &&
+		check_equal "$(last_commit_message)" "Merged changes from subproject using squash"
+	)
+'
+
+next_test
+test_expect_success 'merge the added subproj again, should do nothing' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD &&
+		# this shouldn not actually do anything, since FETCH_HEAD
+		# is already a parent
+		result=$(git merge -s ours -m "merge -s -ours" FETCH_HEAD) &&
+		check_equal "${result}" "Already up-to-date."
+	)
+'
+
+next_test
+test_expect_success 'merge new subproj history into subdir/ with a slash appended to the argument of --prefix' '
+	test_create_repo "$test_count" &&
+	test_create_repo "$test_count/subproj" &&
+	test_create_commit "$test_count" main1 &&
+	test_create_commit "$test_count/subproj" sub1 &&
+	(
+		cd "$test_count" &&
+		git fetch ./subproj master &&
+		git subtree add --prefix=subdir/ FETCH_HEAD
+	) &&
+	test_create_commit "$test_count/subproj" sub2 &&
+	(
+		cd "$test_count" &&
+		git fetch ./subproj master &&
+		git subtree merge --prefix=subdir/ FETCH_HEAD &&
+		check_equal "$(last_commit_message)" "Merge commit '\''$(git rev-parse FETCH_HEAD)'\''"
+	)
+'
+
+#
+# Tests for 'git subtree split'
+#
+
+next_test
+test_expect_success 'split requires option --prefix' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD &&
+		echo "You must provide the --prefix option." > expected &&
+		test_must_fail git subtree split > actual 2>&1 &&
+		test_debug "printf '"expected: "'" &&
+		test_debug "cat expected" &&
+		test_debug "printf '"actual: "'" &&
+		test_debug "cat actual" &&
+		test_cmp expected actual
+	)
+'
+
+next_test
+test_expect_success 'split requires path given by option --prefix must exist' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD &&
+		echo "'\''non-existent-directory'\'' does not exist; use '\''git subtree add'\''" > expected &&
+		test_must_fail git subtree split --prefix=non-existent-directory > actual 2>&1 &&
+		test_debug "printf '"expected: "'" &&
+		test_debug "cat expected" &&
+		test_debug "printf '"actual: "'" &&
+		test_debug "cat actual" &&
+		test_cmp expected actual
+	)
+'
+
+next_test
+test_expect_success 'split sub dir/ with --rejoin' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	test_create_commit "$subtree_test_count" main2 &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD &&
+		split_hash=$(git subtree split --prefix="sub dir" --annotate="*") &&
+		git subtree split --prefix="sub dir" --annotate="*" --rejoin &&
+		check_equal "$(last_commit_message)" "Split '\''sub dir/'\'' into commit '\''$split_hash'\''"
+	)
+ '
+
+next_test
+test_expect_success 'split sub dir/ with --rejoin and --message' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	test_create_commit "$subtree_test_count" main2 &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD &&
+		git subtree split --prefix="sub dir" --message="Split & rejoin" --annotate="*" --rejoin &&
+		check_equal "$(last_commit_message)" "Split & rejoin"
+	)
+'
+
+next_test
+test_expect_success 'split "sub dir"/ with --branch' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	test_create_commit "$subtree_test_count" main2 &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD &&
+		split_hash=$(git subtree split --prefix="sub dir" --annotate="*") &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br &&
+		check_equal "$(git rev-parse subproj-br)" "$split_hash"
+	)
+'
+
+next_test
+test_expect_success 'check hash of split' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	test_create_commit "$subtree_test_count" main2 &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD &&
+		split_hash=$(git subtree split --prefix="sub dir" --annotate="*") &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br &&
+		check_equal "$(git rev-parse subproj-br)" "$split_hash" &&
+		# Check hash of split
+		new_hash=$(git rev-parse subproj-br^2) &&
+		(
+			cd ./"sub proj" &&
+			subdir_hash=$(git rev-parse HEAD) &&
+			check_equal ''"$new_hash"'' "$subdir_hash"
+		)
+	)
+'
+
+next_test
+test_expect_success 'split "sub dir"/ with --branch for an existing branch' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git branch subproj-br FETCH_HEAD &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	test_create_commit "$subtree_test_count" main2 &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD &&
+		split_hash=$(git subtree split --prefix="sub dir" --annotate="*") &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br &&
+		check_equal "$(git rev-parse subproj-br)" "$split_hash"
+	)
+'
+
+next_test
+test_expect_success 'split "sub dir"/ with --branch for an incompatible branch' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git branch init HEAD &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	test_create_commit "$subtree_test_count" main2 &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD &&
+		test_must_fail git subtree split --prefix="sub dir" --branch init
+	)
+'
+
+#
+# Validity checking
+#
+
+next_test
+test_expect_success 'make sure exactly the right set of files ends up in the subproj' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	test_create_commit "$subtree_test_count" main2 &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub3 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub3 &&
+	(
+		cd "$subtree_test_count/sub proj" &&
+		git fetch .. subproj-br &&
+		git merge FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub4 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub4 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	(
+		cd "$subtree_test_count/sub proj" &&
+		git fetch .. subproj-br &&
+		git merge FETCH_HEAD &&
+
+		chks="sub1
+sub2
+sub3
+sub4" &&
+		chks_sub=$(cat <<TXT | sed '\''s,^,sub dir/,'\''
+$chks
+TXT
+) &&
+		chkms="main-sub1
+main-sub2
+main-sub3
+main-sub4" &&
+		chkms_sub=$(cat <<TXT | sed '\''s,^,sub dir/,'\''
+$chkms
+TXT
+) &&
+
+		subfiles=$(git ls-files) &&
+		check_equal "$subfiles" "$chkms
+$chks"
+	)
+'
+
+next_test
+test_expect_success 'make sure the subproj *only* contains commits that affect the "sub dir"' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	test_create_commit "$subtree_test_count" main2 &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub3 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub3 &&
+	(
+		cd "$subtree_test_count/sub proj" &&
+		git fetch .. subproj-br &&
+		git merge FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub4 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub4 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	(
+		cd "$subtree_test_count/sub proj" &&
+		git fetch .. subproj-br &&
+		git merge FETCH_HEAD &&
+
+		chks="sub1
+sub2
+sub3
+sub4" &&
+		chks_sub=$(cat <<TXT | sed '\''s,^,sub dir/,'\''
+$chks
+TXT
+) &&
+		chkms="main-sub1
+main-sub2
+main-sub3
+main-sub4" &&
+		chkms_sub=$(cat <<TXT | sed '\''s,^,sub dir/,'\''
+$chkms
+TXT
+) &&
+		allchanges=$(git log --name-only --pretty=format:"" | sort | sed "/^$/d") &&
+		check_equal "$allchanges" "$chkms
+$chks"
+	)
+'
+
+next_test
+test_expect_success 'make sure exactly the right set of files ends up in the mainline' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	test_create_commit "$subtree_test_count" main2 &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub3 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub3 &&
+	(
+		cd "$subtree_test_count/sub proj" &&
+		git fetch .. subproj-br &&
+		git merge FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub4 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub4 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	(
+		cd "$subtree_test_count/sub proj" &&
+		git fetch .. subproj-br &&
+		git merge FETCH_HEAD
+	) &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree pull --prefix="sub dir" ./"sub proj" master &&
+
+		chkm="main1
+main2" &&
+		chks="sub1
+sub2
+sub3
+sub4" &&
+		chks_sub=$(cat <<TXT | sed '\''s,^,sub dir/,'\''
+$chks
+TXT
+) &&
+		chkms="main-sub1
+main-sub2
+main-sub3
+main-sub4" &&
+		chkms_sub=$(cat <<TXT | sed '\''s,^,sub dir/,'\''
+$chkms
+TXT
+) &&
+		mainfiles=$(git ls-files) &&
+		check_equal "$mainfiles" "$chkm
+$chkms_sub
+$chks_sub"
+)
+'
+
+next_test
+test_expect_success 'make sure each filename changed exactly once in the entire history' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git config log.date relative
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	test_create_commit "$subtree_test_count" main2 &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub3 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub3 &&
+	(
+		cd "$subtree_test_count/sub proj" &&
+		git fetch .. subproj-br &&
+		git merge FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub4 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub4 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	(
+		cd "$subtree_test_count/sub proj" &&
+		git fetch .. subproj-br &&
+		git merge FETCH_HEAD
+	) &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree pull --prefix="sub dir" ./"sub proj" master &&
+
+		chkm="main1
+main2" &&
+		chks="sub1
+sub2
+sub3
+sub4" &&
+		chks_sub=$(cat <<TXT | sed '\''s,^,sub dir/,'\''
+$chks
+TXT
+) &&
+		chkms="main-sub1
+main-sub2
+main-sub3
+main-sub4" &&
+		chkms_sub=$(cat <<TXT | sed '\''s,^,sub dir/,'\''
+$chkms
+TXT
+) &&
+
+		# main-sub?? and /"sub dir"/main-sub?? both change, because those are the
+		# changes that were split into their own history.  And "sub dir"/sub?? never
+		# change, since they were *only* changed in the subtree branch.
+		allchanges=$(git log --name-only --pretty=format:"" | sort | sed "/^$/d") &&
+		expected=''"$(cat <<TXT | sort
+$chkms
+$chkm
+$chks
+$chkms_sub
+TXT
+)"'' &&
+		check_equal "$allchanges" "$expected"
+	)
+'
+
+next_test
+test_expect_success 'make sure the --rejoin commits never make it into subproj' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	test_create_commit "$subtree_test_count" main2 &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub3 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub3 &&
+	(
+		cd "$subtree_test_count/sub proj" &&
+		git fetch .. subproj-br &&
+		git merge FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub4 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub4 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	(
+		cd "$subtree_test_count/sub proj" &&
+		git fetch .. subproj-br &&
+		git merge FETCH_HEAD
+	) &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree pull --prefix="sub dir" ./"sub proj" master &&
+		check_equal "$(git log --pretty=format:"%s" HEAD^2 | grep -i split)" ""
+	)
+'
+
+next_test
+test_expect_success 'make sure no "git subtree" tagged commits make it into subproj' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	test_create_commit "$subtree_test_count" main2 &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub3 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub3 &&
+	(
+		cd "$subtree_test_count/sub proj" &&
+		git fetch .. subproj-br &&
+		 git merge FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub4 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub4 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --annotate="*" --branch subproj-br --rejoin
+	) &&
+	(
+		cd "$subtree_test_count/sub proj" &&
+		git fetch .. subproj-br &&
+		git merge FETCH_HEAD
+	) &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree pull --prefix="sub dir" ./"sub proj" master &&
+
+		# They are meaningless to subproj since one side of the merge refers to the mainline
+		check_equal "$(git log --pretty=format:"%s%n%b" HEAD^2 | grep "git-subtree.*:")" ""
+	)
+'
+
+#
+# A new set of tests
+#
+
+next_test
+test_expect_success 'make sure "git subtree split" find the correct parent' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git branch subproj-ref FETCH_HEAD &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --branch subproj-br &&
+
+		# at this point, the new commit parent should be subproj-ref, if it is
+		# not, something went wrong (the "newparent" of "master~" commit should
+		# have been sub2, but it was not, because its cache was not set to
+		# itself)
+		check_equal "$(git log --pretty=format:%P -1 subproj-br)" "$(git rev-parse subproj-ref)"
+	)
+'
+
+next_test
+test_expect_success 'split a new subtree without --onto option' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --branch subproj-br
+	) &&
+	mkdir "$subtree_test_count"/"sub dir2" &&
+	test_create_commit "$subtree_test_count" "sub dir2"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+
+		# also test that we still can split out an entirely new subtree
+		# if the parent of the first commit in the tree is not empty,
+		# then the new subtree has accidently been attached to something
+		git subtree split --prefix="sub dir2" --branch subproj2-br &&
+		check_equal "$(git log --pretty=format:%P -1 subproj2-br)" ""
+	)
+'
+
+next_test
 test_expect_success 'verify one file change per commit' '
-	x= &&
-	list=''"$(git log --pretty=format:'"'commit: %H'"' | joincommits)"'' &&
-#	test_debug "echo HERE" &&
-#	test_debug "echo ''"$list"''" &&
-	(git log --pretty=format:'"'commit: %H'"' | joincommits |
-	(	while read commit a b; do
-			test_debug "echo Verifying commit "''"$commit"''
-			test_debug "echo a: "''"$a"''
-			test_debug "echo b: "''"$b"''
-			check_equal "$b" ""
-			x=1
-		done
-		check_equal "$x" 1
-	))
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git branch sub1 FETCH_HEAD &&
+		git subtree add --prefix="sub dir" sub1
+	) &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir" --branch subproj-br
+	) &&
+	mkdir "$subtree_test_count"/"sub dir2" &&
+	test_create_commit "$subtree_test_count" "sub dir2"/main-sub2 &&
+	(
+		cd "$subtree_test_count" &&
+		git subtree split --prefix="sub dir2" --branch subproj2-br &&
+
+		x= &&
+		git log --pretty=format:"commit: %H" | join_commits |
+		(
+			while read commit a b; do
+				test_debug "echo Verifying commit $commit"
+				test_debug "echo a: $a"
+				test_debug "echo b: $b"
+				check_equal "$b" ""
+				x=1
+			done
+			check_equal "$x" 1
+		)
+	)
 '
 
-# test push
-
-cd ../..
-
-mkdir test-push
-
-cd test-push
-
-test_expect_success 'init main' '
-	test_create_repo main
+next_test
+test_expect_success 'push split to subproj' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	subtree_test_create_repo "$subtree_test_count/sub proj" &&
+	test_create_commit "$subtree_test_count" main1 &&
+	test_create_commit "$subtree_test_count/sub proj" sub1 &&
+	(
+		cd "$subtree_test_count" &&
+		git fetch ./"sub proj" master &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub1 &&
+	test_create_commit "$subtree_test_count" main2 &&
+	test_create_commit "$subtree_test_count/sub proj" sub2 &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub2 &&
+	(
+		cd $subtree_test_count/"sub proj" &&
+                git branch sub-branch-1 &&
+                cd .. &&
+		git fetch ./"sub proj" master &&
+		git subtree merge --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$subtree_test_count" "sub dir"/main-sub3 &&
+        (
+		cd "$subtree_test_count" &&
+	        git subtree push ./"sub proj" --prefix "sub dir" sub-branch-1 &&
+                cd ./"sub proj" &&
+                git checkout sub-branch-1 &&
+         	check_equal "$(last_commit_message)" "sub dir/main-sub3"
+	)
 '
 
-test_expect_success 'init sub' '
-	test_create_repo "sub project"
-'
+#
+# This test covers 2 cases in subtree split copy_or_skip code
+# 1) Merges where one parent is a superset of the changes of the other
+#    parent regarding changes to the subtree, in this case the merge
+#    commit should be copied
+# 2) Merges where only one parent operate on the subtree, and the merge
+#    commit should be skipped
+#
+# (1) is checked by ensuring subtree_tip is a descendent of subtree_branch
+# (2) should have a check added (not_a_subtree_change shouldn't be present
+#     on the produced subtree)
+#
+# Other related cases which are not tested (or currently handled correctly)
+# - Case (1) where there are more than 2 parents, it will sometimes correctly copy
+#   the merge, and sometimes not
+# - Merge commit where both parents have same tree as the merge, currently
+#   will always be skipped, even if they reached that state via different
+#   set of commits.
+#
 
-cd ./"sub project"
+next_test
+test_expect_success 'subtree descendant check' '
+	subtree_test_create_repo "$subtree_test_count" &&
+	test_create_commit "$subtree_test_count" folder_subtree/a &&
+	(
+		cd "$subtree_test_count" &&
+		git branch branch
+	) &&
+	test_create_commit "$subtree_test_count" folder_subtree/0 &&
+	test_create_commit "$subtree_test_count" folder_subtree/b &&
+	cherry=$(cd "$subtree_test_count"; git rev-parse HEAD) &&
+	(
+		cd "$subtree_test_count" &&
+		git checkout branch
+	) &&
+	test_create_commit "$subtree_test_count" commit_on_branch &&
+	(
+		cd "$subtree_test_count" &&
+		git cherry-pick $cherry &&
+		git checkout master &&
+		git merge -m "merge should be kept on subtree" branch &&
+		git branch no_subtree_work_branch
+	) &&
+	test_create_commit "$subtree_test_count" folder_subtree/d &&
+	(
+		cd "$subtree_test_count" &&
+		git checkout no_subtree_work_branch
+	) &&
+	test_create_commit "$subtree_test_count" not_a_subtree_change &&
+	(
+		cd "$subtree_test_count" &&
+		git checkout master &&
+		git merge -m "merge should be skipped on subtree" no_subtree_work_branch &&
 
-test_expect_success 'add subproject' '
-	create "sub project" &&
-	git commit -m "Sub project: 1" &&
-	git branch sub-branch-1
-'
-
-cd ../main
-
-test_expect_success 'make first commit and add subproject' '
-	create "main-1" &&
-	git commit -m "main: 1" &&
-	git subtree add "../sub project" --prefix "sub dir" --message "Added subproject" sub-branch-1 &&
-	check_equal "$(last_commit_message)" "Added subproject"
-'
-
-test_expect_success 'make second commit to a subproject file and push it into a sub project' '
-	create "sub dir/sub1" &&
-	git commit -m "Sub project: 2" &&
-	git subtree push "../sub project" --prefix "sub dir" sub-branch-1
-'
-
-cd ../"sub project"
-
-test_expect_success 'Test second commit is pushed' '
-	git checkout sub-branch-1 &&
-	check_equal "$(last_commit_message)" "Sub project: 2"
+		git subtree split --prefix folder_subtree/ --branch subtree_tip master &&
+		git subtree split --prefix folder_subtree/ --branch subtree_branch branch &&
+		check_equal $(git rev-list --count subtree_tip..subtree_branch) 0
+	)
 '
 
 test_done
diff --git a/contrib/subtree/todo b/contrib/subtree/todo
index 7e44b00..0d0e777 100644
--- a/contrib/subtree/todo
+++ b/contrib/subtree/todo
@@ -12,8 +12,6 @@
 		exactly the right subtree structure, rather than using
 		subtree merge...)
 
-	add a 'push' subcommand to parallel 'pull'
-	
 	add a 'log' subcommand to see what's new in a subtree?
 
 	add to-submodule and from-submodule commands
diff --git a/convert.c b/convert.c
index f3bd3e9..814e814 100644
--- a/convert.c
+++ b/convert.c
@@ -1289,7 +1289,8 @@
 {
 	struct ident_filter *ident = xmalloc(sizeof(*ident));
 
-	sprintf(ident->ident, ": %s $", sha1_to_hex(sha1));
+	xsnprintf(ident->ident, sizeof(ident->ident),
+		  ": %s $", sha1_to_hex(sha1));
 	strbuf_init(&ident->left, 0);
 	ident->filter.vtbl = &ident_vtbl;
 	ident->state = 0;
diff --git a/credential-cache--daemon.c b/credential-cache--daemon.c
index eef6fce..9365f2c 100644
--- a/credential-cache--daemon.c
+++ b/credential-cache--daemon.c
@@ -2,7 +2,6 @@
 #include "tempfile.h"
 #include "credential.h"
 #include "unix-socket.h"
-#include "sigchain.h"
 #include "parse-options.h"
 
 static struct tempfile socket_file;
@@ -245,6 +244,7 @@
 int main(int argc, const char **argv)
 {
 	const char *socket_path;
+	int ignore_sighup = 0;
 	static const char *usage[] = {
 		"git-credential-cache--daemon [opts] <socket_path>",
 		NULL
@@ -256,6 +256,8 @@
 		OPT_END()
 	};
 
+	git_config_get_bool("credentialcache.ignoresighup", &ignore_sighup);
+
 	argc = parse_options(argc, argv, NULL, options, usage, 0);
 	socket_path = argv[0];
 
@@ -264,6 +266,10 @@
 
 	check_socket_directory(socket_path);
 	register_tempfile(&socket_file, socket_path);
+
+	if (ignore_sighup)
+		signal(SIGHUP, SIG_IGN);
+
 	serve_cache(socket_path, debug);
 	delete_tempfile(&socket_file);
 
diff --git a/daemon.c b/daemon.c
index 77a2f03..1e258ac 100644
--- a/daemon.c
+++ b/daemon.c
@@ -808,12 +808,10 @@
 			cradle = &blanket->next;
 }
 
-static char **cld_argv;
+static struct argv_array cld_argv = ARGV_ARRAY_INIT;
 static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen)
 {
 	struct child_process cld = CHILD_PROCESS_INIT;
-	char addrbuf[300] = "REMOTE_ADDR=", portbuf[300];
-	char *env[] = { addrbuf, portbuf, NULL };
 
 	if (max_connections && live_children >= max_connections) {
 		kill_some_child();
@@ -827,28 +825,24 @@
 	}
 
 	if (addr->sa_family == AF_INET) {
+		char buf[128] = "";
 		struct sockaddr_in *sin_addr = (void *) addr;
-		inet_ntop(addr->sa_family, &sin_addr->sin_addr, addrbuf + 12,
-		    sizeof(addrbuf) - 12);
-		snprintf(portbuf, sizeof(portbuf), "REMOTE_PORT=%d",
-		    ntohs(sin_addr->sin_port));
+		inet_ntop(addr->sa_family, &sin_addr->sin_addr, buf, sizeof(buf));
+		argv_array_pushf(&cld.env_array, "REMOTE_ADDR=%s", buf);
+		argv_array_pushf(&cld.env_array, "REMOTE_PORT=%d",
+				 ntohs(sin_addr->sin_port));
 #ifndef NO_IPV6
 	} else if (addr->sa_family == AF_INET6) {
+		char buf[128] = "";
 		struct sockaddr_in6 *sin6_addr = (void *) addr;
-
-		char *buf = addrbuf + 12;
-		*buf++ = '['; *buf = '\0'; /* stpcpy() is cool */
-		inet_ntop(AF_INET6, &sin6_addr->sin6_addr, buf,
-		    sizeof(addrbuf) - 13);
-		strcat(buf, "]");
-
-		snprintf(portbuf, sizeof(portbuf), "REMOTE_PORT=%d",
-		    ntohs(sin6_addr->sin6_port));
+		inet_ntop(AF_INET6, &sin6_addr->sin6_addr, buf, sizeof(buf));
+		argv_array_pushf(&cld.env_array, "REMOTE_ADDR=[%s]", buf);
+		argv_array_pushf(&cld.env_array, "REMOTE_PORT=%d",
+				 ntohs(sin6_addr->sin6_port));
 #endif
 	}
 
-	cld.env = (const char **)env;
-	cld.argv = (const char **)cld_argv;
+	cld.argv = cld_argv.argv;
 	cld.in = incoming;
 	cld.out = dup(incoming);
 
@@ -902,7 +896,7 @@
 		inet_ntop(family, &((struct sockaddr_in*)sin)->sin_addr, ip, len);
 		break;
 	default:
-		strcpy(ip, "<unknown>");
+		xsnprintf(ip, sizeof(ip), "<unknown>");
 	}
 	return ip;
 }
@@ -917,7 +911,7 @@
 	int gai;
 	long flags;
 
-	sprintf(pbuf, "%d", listen_port);
+	xsnprintf(pbuf, sizeof(pbuf), "%d", listen_port);
 	memset(&hints, 0, sizeof(hints));
 	hints.ai_family = AF_UNSPEC;
 	hints.ai_socktype = SOCK_STREAM;
@@ -1380,12 +1374,10 @@
 		write_file(pid_file, "%"PRIuMAX, (uintmax_t) getpid());
 
 	/* prepare argv for serving-processes */
-	cld_argv = xmalloc(sizeof (char *) * (argc + 2));
-	cld_argv[0] = argv[0];	/* git-daemon */
-	cld_argv[1] = "--serve";
+	argv_array_push(&cld_argv, argv[0]); /* git-daemon */
+	argv_array_push(&cld_argv, "--serve");
 	for (i = 1; i < argc; ++i)
-		cld_argv[i+1] = argv[i];
-	cld_argv[argc+1] = NULL;
+		argv_array_push(&cld_argv, argv[i]);
 
 	return serve(&listen_addr, listen_port, cred);
 }
diff --git a/date.c b/date.c
index 8f91569..7c9f769 100644
--- a/date.c
+++ b/date.c
@@ -166,6 +166,7 @@
 	if (type == DATE_STRFTIME)
 		die("BUG: cannot create anonymous strftime date_mode struct");
 	mode.type = type;
+	mode.local = 0;
 	return &mode;
 }
 
@@ -174,6 +175,9 @@
 	struct tm *tm;
 	static struct strbuf timebuf = STRBUF_INIT;
 
+	if (mode->local)
+		tz = local_tzoffset(time);
+
 	if (mode->type == DATE_RAW) {
 		strbuf_reset(&timebuf);
 		strbuf_addf(&timebuf, "%lu %+05d", time, tz);
@@ -189,9 +193,6 @@
 		return timebuf.buf;
 	}
 
-	if (mode->type == DATE_LOCAL)
-		tz = local_tzoffset(time);
-
 	tm = time_to_tm(time, tz);
 	if (!tm) {
 		tm = time_to_tm(0, 0);
@@ -232,7 +233,7 @@
 				tm->tm_mday,
 				tm->tm_hour, tm->tm_min, tm->tm_sec,
 				tm->tm_year + 1900,
-				(mode->type == DATE_LOCAL) ? 0 : ' ',
+				mode->local ? 0 : ' ',
 				tz);
 	return timebuf.buf;
 }
@@ -770,31 +771,50 @@
 	return 0;
 }
 
+static enum date_mode_type parse_date_type(const char *format, const char **end)
+{
+	if (skip_prefix(format, "relative", end))
+		return DATE_RELATIVE;
+	if (skip_prefix(format, "iso8601-strict", end) ||
+	    skip_prefix(format, "iso-strict", end))
+		return DATE_ISO8601_STRICT;
+	if (skip_prefix(format, "iso8601", end) ||
+	    skip_prefix(format, "iso", end))
+		return DATE_ISO8601;
+	if (skip_prefix(format, "rfc2822", end) ||
+	    skip_prefix(format, "rfc", end))
+		return DATE_RFC2822;
+	if (skip_prefix(format, "short", end))
+		return DATE_SHORT;
+	if (skip_prefix(format, "default", end))
+		return DATE_NORMAL;
+	if (skip_prefix(format, "raw", end))
+		return DATE_RAW;
+	if (skip_prefix(format, "format", end))
+		return DATE_STRFTIME;
+
+	die("unknown date format %s", format);
+}
+
 void parse_date_format(const char *format, struct date_mode *mode)
 {
-	if (!strcmp(format, "relative"))
-		mode->type = DATE_RELATIVE;
-	else if (!strcmp(format, "iso8601") ||
-		 !strcmp(format, "iso"))
-		mode->type = DATE_ISO8601;
-	else if (!strcmp(format, "iso8601-strict") ||
-		 !strcmp(format, "iso-strict"))
-		mode->type = DATE_ISO8601_STRICT;
-	else if (!strcmp(format, "rfc2822") ||
-		 !strcmp(format, "rfc"))
-		mode->type = DATE_RFC2822;
-	else if (!strcmp(format, "short"))
-		mode->type = DATE_SHORT;
-	else if (!strcmp(format, "local"))
-		mode->type = DATE_LOCAL;
-	else if (!strcmp(format, "default"))
-		mode->type = DATE_NORMAL;
-	else if (!strcmp(format, "raw"))
-		mode->type = DATE_RAW;
-	else if (skip_prefix(format, "format:", &format)) {
-		mode->type = DATE_STRFTIME;
-		mode->strftime_fmt = xstrdup(format);
-	} else
+	const char *p;
+
+	/* historical alias */
+	if (!strcmp(format, "local"))
+		format = "default-local";
+
+	mode->type = parse_date_type(format, &p);
+	mode->local = 0;
+
+	if (skip_prefix(p, "-local", &p))
+		mode->local = 1;
+
+	if (mode->type == DATE_STRFTIME) {
+		if (!skip_prefix(p, ":", &p))
+			die("date format missing colon separator: %s", format);
+		mode->strftime_fmt = xstrdup(p);
+	} else if (*p)
 		die("unknown date format %s", format);
 }
 
diff --git a/decorate.c b/decorate.c
index b2aac90..270eb25 100644
--- a/decorate.c
+++ b/decorate.c
@@ -8,7 +8,7 @@
 
 static unsigned int hash_obj(const struct object *obj, unsigned int n)
 {
-	return sha1hash(obj->sha1) % n;
+	return sha1hash(obj->oid.hash) % n;
 }
 
 static void *insert_decoration(struct decoration *n, const struct object *base, void *decoration)
diff --git a/diff-lib.c b/diff-lib.c
index 241a843..bc49c70 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -493,7 +493,7 @@
 	struct object_array_entry *ent;
 
 	ent = revs->pending.objects;
-	if (diff_cache(revs, ent->item->sha1, ent->name, cached))
+	if (diff_cache(revs, ent->item->oid.hash, ent->name, cached))
 		exit(128);
 
 	diff_set_mnemonic_prefix(&revs->diffopt, "c/", cached ? "i/" : "w/");
diff --git a/diff-no-index.c b/diff-no-index.c
index 0320605..03daadb 100644
--- a/diff-no-index.c
+++ b/diff-no-index.c
@@ -136,15 +136,13 @@
 
 		if (name1) {
 			strbuf_addstr(&buffer1, name1);
-			if (buffer1.len && buffer1.buf[buffer1.len - 1] != '/')
-				strbuf_addch(&buffer1, '/');
+			strbuf_complete(&buffer1, '/');
 			len1 = buffer1.len;
 		}
 
 		if (name2) {
 			strbuf_addstr(&buffer2, name2);
-			if (buffer2.len && buffer2.buf[buffer2.len - 1] != '/')
-				strbuf_addch(&buffer2, '/');
+			strbuf_complete(&buffer2, '/');
 			len2 = buffer2.len;
 		}
 
@@ -239,12 +237,12 @@
 }
 
 void diff_no_index(struct rev_info *revs,
-		   int argc, const char **argv,
-		   const char *prefix)
+		   int argc, const char **argv)
 {
 	int i, prefixlen;
 	const char *paths[2];
 	struct strbuf replacement = STRBUF_INIT;
+	const char *prefix = revs->prefix;
 
 	diff_setup(&revs->diffopt);
 	for (i = 1; i < argc - 2; ) {
@@ -254,7 +252,8 @@
 		else if (!strcmp(argv[i], "--"))
 			i++;
 		else {
-			j = diff_opt_parse(&revs->diffopt, argv + i, argc - i);
+			j = diff_opt_parse(&revs->diffopt, argv + i, argc - i,
+					   revs->prefix);
 			if (j <= 0)
 				die("invalid diff option/value: %s", argv[i]);
 			i += j;
diff --git a/diff.c b/diff.c
index 46260ed..059123c 100644
--- a/diff.c
+++ b/diff.c
@@ -13,7 +13,6 @@
 #include "run-command.h"
 #include "utf8.h"
 #include "userdiff.h"
-#include "sigchain.h"
 #include "submodule-config.h"
 #include "submodule.h"
 #include "ll-merge.h"
@@ -322,7 +321,7 @@
 	 */
 	const char *name;
 
-	char hex[41];
+	char hex[GIT_SHA1_HEXSZ + 1];
 	char mode[10];
 
 	/*
@@ -2608,12 +2607,9 @@
 
 struct diff_filespec *alloc_filespec(const char *path)
 {
-	int namelen = strlen(path);
-	struct diff_filespec *spec = xmalloc(sizeof(*spec) + namelen + 1);
+	struct diff_filespec *spec;
 
-	memset(spec, 0, sizeof(*spec));
-	spec->path = (char *)(spec + 1);
-	memcpy(spec->path, path, namelen+1);
+	FLEXPTR_ALLOC_STR(spec, path, path);
 	spec->count = 1;
 	spec->is_binary = -1;
 	return spec;
@@ -2708,21 +2704,21 @@
 
 static int diff_populate_gitlink(struct diff_filespec *s, int size_only)
 {
-	int len;
-	char *data = xmalloc(100), *dirty = "";
+	struct strbuf buf = STRBUF_INIT;
+	char *dirty = "";
 
 	/* Are we looking at the work tree? */
 	if (s->dirty_submodule)
 		dirty = "-dirty";
 
-	len = snprintf(data, 100,
-		       "Subproject commit %s%s\n", sha1_to_hex(s->sha1), dirty);
-	s->data = data;
-	s->size = len;
-	s->should_free = 1;
+	strbuf_addf(&buf, "Subproject commit %s%s\n", sha1_to_hex(s->sha1), dirty);
+	s->size = buf.len;
 	if (size_only) {
 		s->data = NULL;
-		free(data);
+		strbuf_release(&buf);
+	} else {
+		s->data = strbuf_detach(&buf, NULL);
+		s->should_free = 1;
 	}
 	return 0;
 }
@@ -2882,9 +2878,8 @@
 		die_errno("unable to write temp-file");
 	close_tempfile(&temp->tempfile);
 	temp->name = get_tempfile_path(&temp->tempfile);
-	strcpy(temp->hex, sha1_to_hex(sha1));
-	temp->hex[40] = 0;
-	sprintf(temp->mode, "%06o", mode);
+	sha1_to_hex_r(temp->hex, sha1);
+	xsnprintf(temp->mode, sizeof(temp->mode), "%06o", mode);
 	strbuf_release(&buf);
 	strbuf_release(&template);
 	free(path_dup);
@@ -2901,8 +2896,8 @@
 		 * a '+' entry produces this for file-1.
 		 */
 		temp->name = "/dev/null";
-		strcpy(temp->hex, ".");
-		strcpy(temp->mode, ".");
+		xsnprintf(temp->hex, sizeof(temp->hex), ".");
+		xsnprintf(temp->mode, sizeof(temp->mode), ".");
 		return temp;
 	}
 
@@ -2930,16 +2925,16 @@
 			/* we can borrow from the file in the work tree */
 			temp->name = name;
 			if (!one->sha1_valid)
-				strcpy(temp->hex, sha1_to_hex(null_sha1));
+				sha1_to_hex_r(temp->hex, null_sha1);
 			else
-				strcpy(temp->hex, sha1_to_hex(one->sha1));
+				sha1_to_hex_r(temp->hex, one->sha1);
 			/* Even though we may sometimes borrow the
 			 * contents from the work tree, we always want
 			 * one->mode.  mode is trustworthy even when
 			 * !(one->sha1_valid), as long as
 			 * DIFF_FILE_VALID(one).
 			 */
-			sprintf(temp->mode, "%06o", one->mode);
+			xsnprintf(temp->mode, sizeof(temp->mode), "%06o", one->mode);
 		}
 		return temp;
 	}
@@ -3695,12 +3690,16 @@
 	return 1;
 }
 
-int diff_opt_parse(struct diff_options *options, const char **av, int ac)
+int diff_opt_parse(struct diff_options *options,
+		   const char **av, int ac, const char *prefix)
 {
 	const char *arg = av[0];
 	const char *optarg;
 	int argcount;
 
+	if (!prefix)
+		prefix = "";
+
 	/* Output format options */
 	if (!strcmp(arg, "-p") || !strcmp(arg, "-u") || !strcmp(arg, "--patch")
 	    || opt_arg(arg, 'U', "unified", &options->context))
@@ -3917,7 +3916,8 @@
 	else if (!strcmp(arg, "--pickaxe-regex"))
 		options->pickaxe_opts |= DIFF_PICKAXE_REGEX;
 	else if ((argcount = short_opt('O', av, &optarg))) {
-		options->orderfile = optarg;
+		const char *path = prefix_filename(prefix, strlen(prefix), optarg);
+		options->orderfile = xstrdup(path);
 		return argcount;
 	}
 	else if ((argcount = parse_long_opt("diff-filter", av, &optarg))) {
@@ -3956,9 +3956,10 @@
 	else if (!strcmp(arg, "--no-function-context"))
 		DIFF_OPT_CLR(options, FUNCCONTEXT);
 	else if ((argcount = parse_long_opt("output", av, &optarg))) {
-		options->file = fopen(optarg, "w");
+		const char *path = prefix_filename(prefix, strlen(prefix), optarg);
+		options->file = fopen(path, "w");
 		if (!options->file)
-			die_errno("Could not open '%s'", optarg);
+			die_errno("Could not open '%s'", path);
 		options->close_file = 1;
 		return argcount;
 	} else
@@ -4085,9 +4086,9 @@
 	if (abblen < 37) {
 		static char hex[41];
 		if (len < abblen && abblen <= len + 2)
-			sprintf(hex, "%s%.*s", abbrev, len+3-abblen, "..");
+			xsnprintf(hex, sizeof(hex), "%s%.*s", abbrev, len+3-abblen, "..");
 		else
-			sprintf(hex, "%s...", abbrev);
+			xsnprintf(hex, sizeof(hex), "%s...", abbrev);
 		return hex;
 	}
 	return sha1_to_hex(sha1);
@@ -5081,7 +5082,7 @@
 {
 	size_t size;
 
-	if (!driver || !driver->textconv) {
+	if (!driver) {
 		if (!DIFF_FILE_VALID(df)) {
 			*outbuf = "";
 			return 0;
@@ -5092,6 +5093,9 @@
 		return df->size;
 	}
 
+	if (!driver->textconv)
+		die("BUG: fill_textconv called with non-textconv driver");
+
 	if (driver->textconv_cache && df->sha1_valid) {
 		*outbuf = notes_cache_get(driver->textconv_cache, df->sha1,
 					  &size);
diff --git a/diff.h b/diff.h
index c6b66d5..e7d68ed 100644
--- a/diff.h
+++ b/diff.h
@@ -91,7 +91,7 @@
 #define DIFF_OPT_DIRSTAT_BY_LINE     (1 << 28)
 #define DIFF_OPT_FUNCCONTEXT         (1 << 29)
 #define DIFF_OPT_PICKAXE_IGNORE_CASE (1 << 30)
-#define DIFF_OPT_DEFAULT_FOLLOW_RENAMES (1 << 31)
+#define DIFF_OPT_DEFAULT_FOLLOW_RENAMES (1U << 31)
 
 #define DIFF_OPT_TST(opts, flag)    ((opts)->flags & DIFF_OPT_##flag)
 #define DIFF_OPT_TOUCHED(opts, flag)    ((opts)->touched_flags & DIFF_OPT_##flag)
@@ -268,7 +268,7 @@
 extern int git_diff_basic_config(const char *var, const char *value, void *cb);
 extern int git_diff_ui_config(const char *var, const char *value, void *cb);
 extern void diff_setup(struct diff_options *);
-extern int diff_opt_parse(struct diff_options *, const char **, int);
+extern int diff_opt_parse(struct diff_options *, const char **, int, const char *);
 extern void diff_setup_done(struct diff_options *);
 
 #define DIFF_DETECT_RENAME	1
@@ -345,14 +345,30 @@
 
 extern int diff_result_code(struct diff_options *, int);
 
-extern void diff_no_index(struct rev_info *, int, const char **, const char *);
+extern void diff_no_index(struct rev_info *, int, const char **);
 
 extern int index_differs_from(const char *def, int diff_flags);
 
+/*
+ * Fill the contents of the filespec "df", respecting any textconv defined by
+ * its userdiff driver.  The "driver" parameter must come from a
+ * previous call to get_textconv(), and therefore should either be NULL or have
+ * textconv enabled.
+ *
+ * Note that the memory ownership of the resulting buffer depends on whether
+ * the driver field is NULL. If it is, then the memory belongs to the filespec
+ * struct. If it is non-NULL, then "outbuf" points to a newly allocated buffer
+ * that should be freed by the caller.
+ */
 extern size_t fill_textconv(struct userdiff_driver *driver,
 			    struct diff_filespec *df,
 			    char **outbuf);
 
+/*
+ * Look up the userdiff driver for the given filespec, and return it if
+ * and only if it has textconv enabled (otherwise return NULL). The result
+ * can be passed to fill_textconv().
+ */
 extern struct userdiff_driver *get_textconv(struct diff_filespec *one);
 
 extern int parse_rename_score(const char **cp_p);
diff --git a/diffcore-delta.c b/diffcore-delta.c
index 7cf431d..4159748 100644
--- a/diffcore-delta.c
+++ b/diffcore-delta.c
@@ -53,7 +53,8 @@
 	int osz = 1 << orig->alloc_log2;
 	int sz = osz << 1;
 
-	new = xmalloc(sizeof(*orig) + sizeof(struct spanhash) * sz);
+	new = xmalloc(st_add(sizeof(*orig),
+			     st_mult(sizeof(struct spanhash), sz)));
 	new->alloc_log2 = orig->alloc_log2 + 1;
 	new->free = INITIAL_FREE(new->alloc_log2);
 	memset(new->data, 0, sizeof(struct spanhash) * sz);
@@ -130,7 +131,8 @@
 	int is_text = !diff_filespec_is_binary(one);
 
 	i = INITIAL_HASH_SIZE;
-	hash = xmalloc(sizeof(*hash) + sizeof(struct spanhash) * (1<<i));
+	hash = xmalloc(st_add(sizeof(*hash),
+			      st_mult(sizeof(struct spanhash), 1<<i)));
 	hash->alloc_log2 = i;
 	hash->free = INITIAL_FREE(i);
 	memset(hash->data, 0, sizeof(struct spanhash) * (1<<i));
diff --git a/diffcore-order.c b/diffcore-order.c
index 97dd3d0..69d41f7 100644
--- a/diffcore-order.c
+++ b/diffcore-order.c
@@ -52,7 +52,7 @@
 		}
 		if (pass == 0) {
 			order_cnt = cnt;
-			order = xmalloc(sizeof(*order) * cnt);
+			ALLOC_ARRAY(order, cnt);
 		}
 	}
 }
@@ -120,7 +120,7 @@
 	if (!q->nr)
 		return;
 
-	o = xmalloc(sizeof(*o) * q->nr);
+	ALLOC_ARRAY(o, q->nr);
 	for (i = 0; i < q->nr; i++)
 		o[i].obj = q->queue[i];
 	order_objects(orderfile, pair_pathtwo, o, q->nr);
diff --git a/diffcore-rename.c b/diffcore-rename.c
index af1fe08..3b3c1ed 100644
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -537,7 +537,7 @@
 				rename_dst_nr * rename_src_nr, 50, 1);
 	}
 
-	mx = xcalloc(num_create * NUM_CANDIDATE_PER_DST, sizeof(*mx));
+	mx = xcalloc(st_mult(num_create, NUM_CANDIDATE_PER_DST), sizeof(*mx));
 	for (dst_cnt = i = 0; i < rename_dst_nr; i++) {
 		struct diff_filespec *two = rename_dst[i].two;
 		struct diff_score *m;
diff --git a/dir.c b/dir.c
index 88e8958..3087b7e 100644
--- a/dir.c
+++ b/dir.c
@@ -503,12 +503,7 @@
 
 	parse_exclude_pattern(&string, &patternlen, &flags, &nowildcardlen);
 	if (flags & EXC_FLAG_MUSTBEDIR) {
-		char *s;
-		x = xmalloc(sizeof(*x) + patternlen + 1);
-		s = (char *)(x+1);
-		memcpy(s, string, patternlen);
-		s[patternlen] = '\0';
-		x->pattern = s;
+		FLEXPTR_ALLOC_MEM(x, pattern, string, patternlen);
 	} else {
 		x = xmalloc(sizeof(*x));
 		x->pattern = string;
@@ -564,9 +559,7 @@
 	free(el->excludes);
 	free(el->filebuf);
 
-	el->nr = 0;
-	el->excludes = NULL;
-	el->filebuf = NULL;
+	memset(el, 0, sizeof(*el));
 }
 
 static void trim_trailing_spaces(char *buf)
@@ -627,10 +620,7 @@
 	}
 
 	uc->dir_created++;
-	d = xmalloc(sizeof(*d) + len + 1);
-	memset(d, 0, sizeof(*d));
-	memcpy(d->name, name, len);
-	d->name[len] = '\0';
+	FLEX_ALLOC_MEM(d, name, name, len);
 
 	ALLOC_GROW(dir->dirs, dir->dirs_nr + 1, dir->dirs_alloc);
 	memmove(dir->dirs + first + 1, dir->dirs + first,
@@ -699,7 +689,7 @@
 			return 0;
 		}
 		if (buf[size-1] != '\n') {
-			buf = xrealloc(buf, size+1);
+			buf = xrealloc(buf, st_add(size, 1));
 			buf[size++] = '\n';
 		}
 	} else {
@@ -713,7 +703,7 @@
 			close(fd);
 			return 0;
 		}
-		buf = xmalloc(size+1);
+		buf = xmallocz(size);
 		if (read_in_full(fd, buf, size) != size) {
 			free(buf);
 			close(fd);
@@ -901,6 +891,7 @@
 						       int *dtype,
 						       struct exclude_list *el)
 {
+	struct exclude *exc = NULL; /* undecided */
 	int i;
 
 	if (!el->nr)
@@ -922,18 +913,22 @@
 			if (match_basename(basename,
 					   pathlen - (basename - pathname),
 					   exclude, prefix, x->patternlen,
-					   x->flags))
-				return x;
+					   x->flags)) {
+				exc = x;
+				break;
+			}
 			continue;
 		}
 
 		assert(x->baselen == 0 || x->base[x->baselen - 1] == '/');
 		if (match_pathname(pathname, pathlen,
 				   x->base, x->baselen ? x->baselen - 1 : 0,
-				   exclude, prefix, x->patternlen, x->flags))
-			return x;
+				   exclude, prefix, x->patternlen, x->flags)) {
+			exc = x;
+			break;
+		}
 	}
-	return NULL; /* undecided */
+	return exc;
 }
 
 /*
@@ -1164,10 +1159,8 @@
 {
 	struct dir_entry *ent;
 
-	ent = xmalloc(sizeof(*ent) + len + 1);
+	FLEX_ALLOC_MEM(ent, name, pathname, len);
 	ent->len = len;
-	memcpy(ent->name, pathname, len);
-	ent->name[len] = 0;
 	return ent;
 }
 
@@ -1505,8 +1498,7 @@
 	}
 	strbuf_addstr(path, cdir->ucd->name);
 	/* treat_one_path() does this before it calls treat_directory() */
-	if (path->buf[path->len - 1] != '/')
-		strbuf_addch(path, '/');
+	strbuf_complete(path, '/');
 	if (cdir->ucd->check_only)
 		/*
 		 * check_only is set as a result of treat_directory() getting
@@ -2121,8 +2113,7 @@
 		else
 			return -1;
 	}
-	if (path->buf[original_len - 1] != '/')
-		strbuf_addch(path, '/');
+	strbuf_complete(path, '/');
 
 	len = path->len;
 	while ((e = readdir(dir)) != NULL) {
@@ -2333,16 +2324,15 @@
 	struct ondisk_untracked_cache *ouc;
 	struct write_data wd;
 	unsigned char varbuf[16];
-	int len = 0, varint_len;
-	if (untracked->exclude_per_dir)
-		len = strlen(untracked->exclude_per_dir);
-	ouc = xmalloc(sizeof(*ouc) + len + 1);
+	int varint_len;
+	size_t len = strlen(untracked->exclude_per_dir);
+
+	FLEX_ALLOC_MEM(ouc, exclude_per_dir, untracked->exclude_per_dir, len);
 	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);
 	hashcpy(ouc->info_exclude_sha1, untracked->ss_info_exclude.sha1);
 	hashcpy(ouc->excludes_file_sha1, untracked->ss_excludes_file.sha1);
 	ouc->dir_flags = htonl(untracked->dir_flags);
-	memcpy(ouc->exclude_per_dir, untracked->exclude_per_dir, len + 1);
 
 	varint_len = encode_varint(untracked->ident.len, varbuf);
 	strbuf_add(out, varbuf, varint_len);
@@ -2447,21 +2437,21 @@
 	ud.untracked_alloc = value;
 	ud.untracked_nr	   = value;
 	if (ud.untracked_nr)
-		ud.untracked = xmalloc(sizeof(*ud.untracked) * ud.untracked_nr);
+		ALLOC_ARRAY(ud.untracked, ud.untracked_nr);
 	data = next;
 
 	next = data;
 	ud.dirs_alloc = ud.dirs_nr = decode_varint(&next);
 	if (next > end)
 		return -1;
-	ud.dirs = xmalloc(sizeof(*ud.dirs) * ud.dirs_nr);
+	ALLOC_ARRAY(ud.dirs, ud.dirs_nr);
 	data = next;
 
 	len = strlen((const char *)data);
 	next = data + len + 1;
 	if (next > rd->end)
 		return -1;
-	*untracked_ = untracked = xmalloc(sizeof(*untracked) + len);
+	*untracked_ = untracked = xmalloc(st_add(sizeof(*untracked), len));
 	memcpy(untracked, &ud, sizeof(ud));
 	memcpy(untracked->name, data, len + 1);
 	data = next;
@@ -2574,7 +2564,7 @@
 	rd.data	      = next;
 	rd.end	      = end;
 	rd.index      = 0;
-	rd.ucd        = xmalloc(sizeof(*rd.ucd) * len);
+	ALLOC_ARRAY(rd.ucd, len);
 
 	if (read_one_dir(&uc->root, &rd) || rd.index != len)
 		goto done;
diff --git a/entry.c b/entry.c
index 1eda8e9..a410957 100644
--- a/entry.c
+++ b/entry.c
@@ -6,7 +6,7 @@
 static void create_directories(const char *path, int path_len,
 			       const struct checkout *state)
 {
-	char *buf = xmalloc(path_len + 1);
+	char *buf = xmallocz(path_len);
 	int len = 0;
 
 	while (len < path_len) {
@@ -96,8 +96,8 @@
 {
 	int symlink = (ce->ce_mode & S_IFMT) != S_IFREG;
 	if (to_tempfile) {
-		strcpy(path, symlink
-		       ? ".merge_link_XXXXXX" : ".merge_file_XXXXXX");
+		xsnprintf(path, TEMPORARY_FILENAME_LENGTH, "%s",
+			  symlink ? ".merge_link_XXXXXX" : ".merge_file_XXXXXX");
 		return mkstemp(path);
 	} else {
 		return create_file(path, !symlink ? ce->ce_mode : 0666);
diff --git a/environment.c b/environment.c
index 23a38e4..1cc4aab 100644
--- a/environment.c
+++ b/environment.c
@@ -144,11 +144,8 @@
 			       const char *path, int *fromenv)
 {
 	const char *value = getenv(envvar);
-	if (!value) {
-		char *buf = xmalloc(strlen(git_dir) + strlen(path) + 2);
-		sprintf(buf, "%s/%s", git_dir, path);
-		return buf;
-	}
+	if (!value)
+		return xstrfmt("%s/%s", git_dir, path);
 	if (fromenv)
 		*fromenv = 1;
 	return xstrdup(value);
@@ -238,8 +235,6 @@
 	}
 	git_work_tree_initialized = 1;
 	work_tree = xstrdup(real_path(new_work_tree));
-	if (setenv(GIT_WORK_TREE_ENVIRONMENT, work_tree, 1))
-		die("could not set GIT_WORK_TREE to '%s'", work_tree);
 }
 
 const char *get_git_work_tree(void)
diff --git a/ewah/bitmap.c b/ewah/bitmap.c
index 47ad674..7103cee 100644
--- a/ewah/bitmap.c
+++ b/ewah/bitmap.c
@@ -17,7 +17,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-#include "git-compat-util.h"
+#include "cache.h"
 #include "ewok.h"
 
 #define EWAH_MASK(x) ((eword_t)1 << (x % BITS_IN_EWORD))
@@ -25,8 +25,8 @@
 
 struct bitmap *bitmap_new(void)
 {
-	struct bitmap *bitmap = ewah_malloc(sizeof(struct bitmap));
-	bitmap->words = ewah_calloc(32, sizeof(eword_t));
+	struct bitmap *bitmap = xmalloc(sizeof(struct bitmap));
+	bitmap->words = xcalloc(32, sizeof(eword_t));
 	bitmap->word_alloc = 32;
 	return bitmap;
 }
@@ -38,9 +38,7 @@
 	if (block >= self->word_alloc) {
 		size_t old_size = self->word_alloc;
 		self->word_alloc = block * 2;
-		self->words = ewah_realloc(self->words,
-			self->word_alloc * sizeof(eword_t));
-
+		REALLOC_ARRAY(self->words, self->word_alloc);
 		memset(self->words + old_size, 0x0,
 			(self->word_alloc - old_size) * sizeof(eword_t));
 	}
@@ -100,12 +98,7 @@
 	ewah_iterator_init(&it, ewah);
 
 	while (ewah_iterator_next(&blowup, &it)) {
-		if (i >= bitmap->word_alloc) {
-			bitmap->word_alloc *= 1.5;
-			bitmap->words = ewah_realloc(
-				bitmap->words, bitmap->word_alloc * sizeof(eword_t));
-		}
-
+		ALLOC_GROW(bitmap->words, i + 1, bitmap->word_alloc);
 		bitmap->words[i++] = blowup;
 	}
 
@@ -134,8 +127,7 @@
 
 	if (self->word_alloc < other_final) {
 		self->word_alloc = other_final;
-		self->words = ewah_realloc(self->words,
-			self->word_alloc * sizeof(eword_t));
+		REALLOC_ARRAY(self->words, self->word_alloc);
 		memset(self->words + original_size, 0x0,
 			(self->word_alloc - original_size) * sizeof(eword_t));
 	}
diff --git a/ewah/ewah_bitmap.c b/ewah/ewah_bitmap.c
index b522437..2dc9c82 100644
--- a/ewah/ewah_bitmap.c
+++ b/ewah/ewah_bitmap.c
@@ -39,8 +39,7 @@
 		return;
 
 	self->alloc_size = new_size;
-	self->buffer = ewah_realloc(self->buffer,
-		self->alloc_size * sizeof(eword_t));
+	REALLOC_ARRAY(self->buffer, self->alloc_size);
 	self->rlw = self->buffer + (rlw_offset / sizeof(eword_t));
 }
 
@@ -282,12 +281,9 @@
 {
 	struct ewah_bitmap *self;
 
-	self = ewah_malloc(sizeof(struct ewah_bitmap));
-	if (self == NULL)
-		return NULL;
-
-	self->buffer = ewah_malloc(32 * sizeof(eword_t));
+	self = xmalloc(sizeof(struct ewah_bitmap));
 	self->alloc_size = 32;
+	ALLOC_ARRAY(self->buffer, self->alloc_size);
 
 	ewah_clear(self);
 	return self;
diff --git a/ewah/ewah_io.c b/ewah/ewah_io.c
index 43481b9..61f6a43 100644
--- a/ewah/ewah_io.c
+++ b/ewah/ewah_io.c
@@ -134,11 +134,7 @@
 	self->buffer_size = self->alloc_size = get_be32(ptr);
 	ptr += sizeof(uint32_t);
 
-	self->buffer = ewah_realloc(self->buffer,
-		self->alloc_size * sizeof(eword_t));
-
-	if (!self->buffer)
-		return -1;
+	REALLOC_ARRAY(self->buffer, self->alloc_size);
 
 	/*
 	 * Copy the raw data for the bitmap as a whole chunk;
@@ -180,11 +176,7 @@
 		return -1;
 
 	self->buffer_size = self->alloc_size = (size_t)ntohl(word_count);
-	self->buffer = ewah_realloc(self->buffer,
-		self->alloc_size * sizeof(eword_t));
-
-	if (!self->buffer)
-		return -1;
+	REALLOC_ARRAY(self->buffer, self->alloc_size);
 
 	/** 64 bit x N -- compressed words */
 	buffer = self->buffer;
diff --git a/ewah/ewok.h b/ewah/ewok.h
index 6e2c5e1..269a1a8 100644
--- a/ewah/ewok.h
+++ b/ewah/ewok.h
@@ -20,16 +20,6 @@
 #ifndef __EWOK_BITMAP_H__
 #define __EWOK_BITMAP_H__
 
-#ifndef ewah_malloc
-#	define ewah_malloc xmalloc
-#endif
-#ifndef ewah_realloc
-#	define ewah_realloc xrealloc
-#endif
-#ifndef ewah_calloc
-#	define ewah_calloc xcalloc
-#endif
-
 struct strbuf;
 typedef uint64_t eword_t;
 #define BITS_IN_EWORD (sizeof(eword_t) * 8)
diff --git a/exec_cmd.c b/exec_cmd.c
index e85f0fd..9d5703a 100644
--- a/exec_cmd.c
+++ b/exec_cmd.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "exec_cmd.h"
 #include "quote.h"
+#include "argv-array.h"
 #define MAX_ARGS	32
 
 static const char *argv_exec_path;
@@ -43,12 +44,10 @@
 
 	if (!argv0 || !*argv0)
 		return NULL;
-	slash = argv0 + strlen(argv0);
 
-	while (argv0 <= slash && !is_dir_sep(*slash))
-		slash--;
+	slash = find_last_dir_sep(argv0);
 
-	if (slash >= argv0) {
+	if (slash) {
 		argv0_path = xstrndup(argv0, slash - argv0);
 		return slash + 1;
 	}
@@ -107,32 +106,25 @@
 	strbuf_release(&new_path);
 }
 
-const char **prepare_git_cmd(const char **argv)
+const char **prepare_git_cmd(struct argv_array *out, const char **argv)
 {
-	int argc;
-	const char **nargv;
-
-	for (argc = 0; argv[argc]; argc++)
-		; /* just counting */
-	nargv = xmalloc(sizeof(*nargv) * (argc + 2));
-
-	nargv[0] = "git";
-	for (argc = 0; argv[argc]; argc++)
-		nargv[argc + 1] = argv[argc];
-	nargv[argc + 1] = NULL;
-	return nargv;
+	argv_array_push(out, "git");
+	argv_array_pushv(out, argv);
+	return out->argv;
 }
 
 int execv_git_cmd(const char **argv) {
-	const char **nargv = prepare_git_cmd(argv);
-	trace_argv_printf(nargv, "trace: exec:");
+	struct argv_array nargv = ARGV_ARRAY_INIT;
+
+	prepare_git_cmd(&nargv, argv);
+	trace_argv_printf(nargv.argv, "trace: exec:");
 
 	/* execvp() can only ever return if it fails */
-	sane_execvp("git", (char **)nargv);
+	sane_execvp("git", (char **)nargv.argv);
 
 	trace_printf("trace: exec failed: %s\n", strerror(errno));
 
-	free(nargv);
+	argv_array_clear(&nargv);
 	return -1;
 }
 
diff --git a/exec_cmd.h b/exec_cmd.h
index 93b0c02..1f6b433 100644
--- a/exec_cmd.h
+++ b/exec_cmd.h
@@ -1,11 +1,13 @@
 #ifndef GIT_EXEC_CMD_H
 #define GIT_EXEC_CMD_H
 
+struct argv_array;
+
 extern void git_set_argv_exec_path(const char *exec_path);
 extern const char *git_extract_argv0_path(const char *path);
 extern const char *git_exec_path(void);
 extern void setup_path(void);
-extern const char **prepare_git_cmd(const char **argv);
+extern const char **prepare_git_cmd(struct argv_array *out, const char **argv);
 extern int execv_git_cmd(const char **argv); /* NULL terminated */
 LAST_ARG_MUST_BE_NULL
 extern int execl_git_cmd(const char *cmd, ...);
diff --git a/fast-import.c b/fast-import.c
index b141535..75f7748 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -424,7 +424,7 @@
 	fprintf(rpt, "fast-import crash report:\n");
 	fprintf(rpt, "    fast-import process: %"PRIuMAX"\n", (uintmax_t) getpid());
 	fprintf(rpt, "    parent process     : %"PRIuMAX"\n", (uintmax_t) getppid());
-	fprintf(rpt, "    at %s\n", show_date(time(NULL), 0, DATE_MODE(LOCAL)));
+	fprintf(rpt, "    at %s\n", show_date(time(NULL), 0, DATE_MODE(ISO8601)));
 	fputc('\n', rpt);
 
 	fputs("fatal: ", rpt);
@@ -622,7 +622,7 @@
 			return xmalloc(len);
 		}
 		total_allocd += sizeof(struct mem_pool) + mem_pool_alloc;
-		p = xmalloc(sizeof(struct mem_pool) + mem_pool_alloc);
+		p = xmalloc(st_add(sizeof(struct mem_pool), mem_pool_alloc));
 		p->next_pool = mem_pool;
 		p->next_free = (char *) p->space;
 		p->end = p->next_free + mem_pool_alloc;
@@ -644,8 +644,9 @@
 
 static char *pool_strdup(const char *s)
 {
-	char *r = pool_alloc(strlen(s) + 1);
-	strcpy(r, s);
+	size_t len = strlen(s) + 1;
+	char *r = pool_alloc(len);
+	memcpy(r, s, len);
 	return r;
 }
 
@@ -702,7 +703,7 @@
 
 	c = pool_alloc(sizeof(struct atom_str) + len + 1);
 	c->str_len = len;
-	strncpy(c->str_dat, s, len);
+	memcpy(c->str_dat, s, len);
 	c->str_dat[len] = 0;
 	c->next_atom = atom_table[hc];
 	atom_table[hc] = c;
@@ -813,7 +814,8 @@
 	if (!avail_tree_entry) {
 		unsigned int n = tree_entry_alloc;
 		total_allocd += n * sizeof(struct tree_entry);
-		avail_tree_entry = e = xmalloc(n * sizeof(struct tree_entry));
+		ALLOC_ARRAY(e, n);
+		avail_tree_entry = e;
 		while (n-- > 1) {
 			*((void**)e) = e + 1;
 			e++;
@@ -868,8 +870,7 @@
 
 	pack_fd = odb_mkstemp(tmp_file, sizeof(tmp_file),
 			      "pack/tmp_pack_XXXXXX");
-	p = xcalloc(1, sizeof(*p) + strlen(tmp_file) + 2);
-	strcpy(p->pack_name, tmp_file);
+	FLEX_ALLOC_STR(p, pack_name, tmp_file);
 	p->pack_fd = pack_fd;
 	p->do_not_close = 1;
 	pack_file = sha1fd(pack_fd, p->pack_name);
@@ -895,7 +896,7 @@
 	struct object_entry_pool *o;
 
 	/* Build the table of object IDs. */
-	idx = xmalloc(object_count * sizeof(*idx));
+	ALLOC_ARRAY(idx, object_count);
 	c = idx;
 	for (o = blocks; o; o = o->next_pool)
 		for (e = o->next_free; e-- != o->entries;)
@@ -1035,8 +1036,8 @@
 	git_SHA_CTX c;
 	git_zstream s;
 
-	hdrlen = sprintf((char *)hdr,"%s %lu", typename(type),
-		(unsigned long)dat->len) + 1;
+	hdrlen = xsnprintf((char *)hdr, sizeof(hdr), "%s %lu",
+			   typename(type), (unsigned long)dat->len) + 1;
 	git_SHA1_Init(&c);
 	git_SHA1_Update(&c, hdr, hdrlen);
 	git_SHA1_Update(&c, dat->buf, dat->len);
diff --git a/fetch-pack.c b/fetch-pack.c
index 820251a..f96f6df 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -15,6 +15,7 @@
 #include "version.h"
 #include "prio-queue.h"
 #include "sha1-array.h"
+#include "sigchain.h"
 
 static int transfer_unpack_limit = -1;
 static int fetch_unpack_limit = -1;
@@ -169,7 +170,7 @@
 		}
 	}
 
-	return commit->object.sha1;
+	return commit->object.oid.hash;
 }
 
 enum ack_type {
@@ -238,7 +239,7 @@
 
 static void insert_one_alternate_ref(const struct ref *ref, void *unused)
 {
-	rev_list_insert_ref(NULL, ref->old_sha1);
+	rev_list_insert_ref(NULL, ref->old_oid.hash);
 }
 
 #define INITIAL_FLUSH 16
@@ -280,7 +281,7 @@
 
 	fetching = 0;
 	for ( ; refs ; refs = refs->next) {
-		unsigned char *remote = refs->old_sha1;
+		unsigned char *remote = refs->old_oid.hash;
 		const char *remote_hex;
 		struct object *o;
 
@@ -487,7 +488,7 @@
 		if (!t->tagged)
 			break; /* broken repository */
 		o->flags |= COMPLETE;
-		o = parse_object(t->tagged->sha1);
+		o = parse_object(t->tagged->oid.hash);
 	}
 	if (o && o->type == OBJ_COMMIT) {
 		struct commit *commit = (struct commit *)o;
@@ -511,7 +512,7 @@
 	while (complete && cutoff <= complete->item->date) {
 		if (args->verbose)
 			fprintf(stderr, "Marking %s as complete\n",
-				sha1_to_hex(complete->item->object.sha1));
+				oid_to_hex(&complete->item->object.oid));
 		pop_most_recent_commit(&complete, COMPLETE);
 	}
 }
@@ -570,7 +571,7 @@
 				continue;
 			if (get_sha1_hex(ref->name, sha1) ||
 			    ref->name[40] != '\0' ||
-			    hashcmp(sha1, ref->old_sha1))
+			    hashcmp(sha1, ref->old_oid.hash))
 				continue;
 
 			ref->matched = 1;
@@ -583,7 +584,7 @@
 
 static void mark_alternate_complete(const struct ref *ref, void *unused)
 {
-	mark_complete(ref->old_sha1);
+	mark_complete(ref->old_oid.hash);
 }
 
 static int everything_local(struct fetch_pack_args *args,
@@ -599,10 +600,10 @@
 	for (ref = *refs; ref; ref = ref->next) {
 		struct object *o;
 
-		if (!has_sha1_file(ref->old_sha1))
+		if (!has_object_file(&ref->old_oid))
 			continue;
 
-		o = parse_object(ref->old_sha1);
+		o = parse_object(ref->old_oid.hash);
 		if (!o)
 			continue;
 
@@ -630,7 +631,7 @@
 	 * Don't mark them common yet; the server has to be told so first.
 	 */
 	for (ref = *refs; ref; ref = ref->next) {
-		struct object *o = deref_tag(lookup_object(ref->old_sha1),
+		struct object *o = deref_tag(lookup_object(ref->old_oid.hash),
 					     NULL, 0);
 
 		if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
@@ -646,7 +647,7 @@
 	filter_refs(args, refs, sought, nr_sought);
 
 	for (retval = 1, ref = *refs; ref ; ref = ref->next) {
-		const unsigned char *remote = ref->old_sha1;
+		const unsigned char *remote = ref->old_oid.hash;
 		struct object *o;
 
 		o = lookup_object(remote);
@@ -671,9 +672,12 @@
 static int sideband_demux(int in, int out, void *data)
 {
 	int *xd = data;
+	int ret;
 
-	int ret = recv_sideband("fetch-pack", xd[0], out);
+	sigchain_push(SIGPIPE, SIG_IGN);
+	ret = recv_sideband("fetch-pack", xd[0], out);
 	close(out);
+	sigchain_pop(SIGPIPE);
 	return ret;
 }
 
@@ -681,11 +685,10 @@
 		    int xd[2], char **pack_lockfile)
 {
 	struct async demux;
-	const char *argv[22];
-	char keep_arg[256];
-	char hdr_arg[256];
-	const char **av, *cmd_name;
 	int do_keep = args->keep_pack;
+	const char *cmd_name;
+	struct pack_header header;
+	int pass_header = 0;
 	struct child_process cmd = CHILD_PROCESS_INIT;
 	int ret;
 
@@ -705,17 +708,11 @@
 	else
 		demux.out = xd[0];
 
-	cmd.argv = argv;
-	av = argv;
-	*hdr_arg = 0;
 	if (!args->keep_pack && unpack_limit) {
-		struct pack_header header;
 
 		if (read_pack_header(demux.out, &header))
 			die("protocol error: bad pack header");
-		snprintf(hdr_arg, sizeof(hdr_arg),
-			 "--pack_header=%"PRIu32",%"PRIu32,
-			 ntohl(header.hdr_version), ntohl(header.hdr_entries));
+		pass_header = 1;
 		if (ntohl(header.hdr_entries) < unpack_limit)
 			do_keep = 0;
 		else
@@ -723,44 +720,49 @@
 	}
 
 	if (alternate_shallow_file) {
-		*av++ = "--shallow-file";
-		*av++ = alternate_shallow_file;
+		argv_array_push(&cmd.args, "--shallow-file");
+		argv_array_push(&cmd.args, alternate_shallow_file);
 	}
 
 	if (do_keep) {
 		if (pack_lockfile)
 			cmd.out = -1;
-		*av++ = cmd_name = "index-pack";
-		*av++ = "--stdin";
+		cmd_name = "index-pack";
+		argv_array_push(&cmd.args, cmd_name);
+		argv_array_push(&cmd.args, "--stdin");
 		if (!args->quiet && !args->no_progress)
-			*av++ = "-v";
+			argv_array_push(&cmd.args, "-v");
 		if (args->use_thin_pack)
-			*av++ = "--fix-thin";
+			argv_array_push(&cmd.args, "--fix-thin");
 		if (args->lock_pack || unpack_limit) {
-			int s = sprintf(keep_arg,
-					"--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
-			if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
-				strcpy(keep_arg + s, "localhost");
-			*av++ = keep_arg;
+			char hostname[256];
+			if (gethostname(hostname, sizeof(hostname)))
+				xsnprintf(hostname, sizeof(hostname), "localhost");
+			argv_array_pushf(&cmd.args,
+					"--keep=fetch-pack %"PRIuMAX " on %s",
+					(uintmax_t)getpid(), hostname);
 		}
 		if (args->check_self_contained_and_connected)
-			*av++ = "--check-self-contained-and-connected";
+			argv_array_push(&cmd.args, "--check-self-contained-and-connected");
 	}
 	else {
-		*av++ = cmd_name = "unpack-objects";
+		cmd_name = "unpack-objects";
+		argv_array_push(&cmd.args, cmd_name);
 		if (args->quiet || args->no_progress)
-			*av++ = "-q";
+			argv_array_push(&cmd.args, "-q");
 		args->check_self_contained_and_connected = 0;
 	}
-	if (*hdr_arg)
-		*av++ = hdr_arg;
+
+	if (pass_header)
+		argv_array_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)
-		*av++ = "--strict";
-	*av++ = NULL;
+		argv_array_push(&cmd.args, "--strict");
 
 	cmd.in = demux.out;
 	cmd.git_cmd = 1;
@@ -987,7 +989,7 @@
 	if (!si->nr_ours && !si->nr_theirs)
 		return;
 	for (i = 0; i < nr_sought; i++)
-		sha1_array_append(&ref, sought[i]->old_sha1);
+		sha1_array_append(&ref, sought[i]->old_oid.hash);
 	si->ref = &ref;
 
 	if (args->update_shallow) {
diff --git a/fsck.c b/fsck.c
index e41e753..ca4c685 100644
--- a/fsck.c
+++ b/fsck.c
@@ -199,7 +199,8 @@
 
 	if (!options->msg_type) {
 		int i;
-		int *msg_type = xmalloc(sizeof(int) * FSCK_MSG_MAX);
+		int *msg_type;
+		ALLOC_ARRAY(msg_type, FSCK_MSG_MAX);
 		for (i = 0; i < FSCK_MSG_MAX; i++)
 			msg_type[i] = fsck_msg_type(i, options);
 		options->msg_type = msg_type;
@@ -276,7 +277,7 @@
 		return 0;
 
 	if (options->skiplist && object &&
-			sha1_array_lookup(options->skiplist, object->sha1) >= 0)
+			sha1_array_lookup(options->skiplist, object->oid.hash) >= 0)
 		return 0;
 
 	if (msg_type == FSCK_FATAL)
@@ -316,7 +317,7 @@
 			result = options->walk(&lookup_blob(entry.sha1)->object, OBJ_BLOB, data, options);
 		else {
 			result = error("in tree %s: entry %s has bad mode %.6o",
-					sha1_to_hex(tree->object.sha1), entry.path, entry.mode);
+					oid_to_hex(&tree->object.oid), entry.path, entry.mode);
 		}
 		if (result < 0)
 			return result;
@@ -373,7 +374,7 @@
 	case OBJ_TAG:
 		return fsck_walk_tag((struct tag *)obj, data, options);
 	default:
-		error("Unknown object type for %s", sha1_to_hex(obj->sha1));
+		error("Unknown object type for %s", oid_to_hex(&obj->oid));
 		return -1;
 	}
 }
@@ -630,7 +631,7 @@
 		buffer += 41;
 		parent_line_count++;
 	}
-	graft = lookup_commit_graft(commit->object.sha1);
+	graft = lookup_commit_graft(commit->object.oid.hash);
 	parent_count = commit_list_count(commit->parents);
 	if (graft) {
 		if (graft->nr_parent == -1 && !parent_count)
@@ -696,7 +697,7 @@
 		enum object_type type;
 
 		buffer = to_free =
-			read_sha1_file(tag->object.sha1, &type, &size);
+			read_sha1_file(tag->object.oid.hash, &type, &size);
 		if (!buffer)
 			return report(options, &tag->object,
 				FSCK_MSG_MISSING_TAG_OBJECT,
@@ -711,7 +712,8 @@
 		}
 	}
 
-	if (verify_headers(buffer, size, &tag->object, options))
+	ret = verify_headers(buffer, size, &tag->object, options);
+	if (ret)
 		goto done;
 
 	if (!skip_prefix(buffer, "object ", &buffer)) {
@@ -809,9 +811,9 @@
 int fsck_error_function(struct object *obj, int msg_type, const char *message)
 {
 	if (msg_type == FSCK_WARN) {
-		warning("object %s: %s", sha1_to_hex(obj->sha1), message);
+		warning("object %s: %s", oid_to_hex(&obj->oid), message);
 		return 0;
 	}
-	error("object %s: %s", sha1_to_hex(obj->sha1), message);
+	error("object %s: %s", oid_to_hex(&obj->oid), message);
 	return 1;
 }
diff --git a/git-bisect.sh b/git-bisect.sh
index ea63223..5d1cb00 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -1,14 +1,19 @@
 #!/bin/sh
 
-USAGE='[help|start|bad|good|skip|next|reset|visualize|replay|log|run]'
+USAGE='[help|start|bad|good|new|old|terms|skip|next|reset|visualize|replay|log|run]'
 LONG_USAGE='git bisect help
 	print this long help message.
-git bisect start [--no-checkout] [<bad> [<good>...]] [--] [<pathspec>...]
+git bisect start [--term-{old,good}=<term> --term-{new,bad}=<term>]
+		 [--no-checkout] [<bad> [<good>...]] [--] [<pathspec>...]
 	reset bisect state and start bisection.
-git bisect bad [<rev>]
-	mark <rev> a known-bad revision.
-git bisect good [<rev>...]
-	mark <rev>... known-good revisions.
+git bisect (bad|new) [<rev>]
+	mark <rev> a known-bad revision/
+		a revision after change in a given property.
+git bisect (good|old) [<rev>...]
+	mark <rev>... known-good revisions/
+		revisions before change in a given property.
+git bisect terms [--term-good | --term-bad]
+	show the terms used for old and new commits (default: bad, good)
 git bisect skip [(<rev>|<range>)...]
 	mark <rev>... untestable revisions.
 git bisect next
@@ -95,6 +100,24 @@
 		--no-checkout)
 			mode=--no-checkout
 			shift ;;
+		--term-good|--term-old)
+			shift
+			must_write_terms=1
+			TERM_GOOD=$1
+			shift ;;
+		--term-good=*|--term-old=*)
+			must_write_terms=1
+			TERM_GOOD=${1#*=}
+			shift ;;
+		--term-bad|--term-new)
+			shift
+			must_write_terms=1
+			TERM_BAD=$1
+			shift ;;
+		--term-bad=*|--term-new=*)
+			must_write_terms=1
+			TERM_BAD=${1#*=}
+			shift ;;
 		--*)
 			die "$(eval_gettext "unrecognised option: '\$arg'")" ;;
 		*)
@@ -294,7 +317,7 @@
 		false
 		;;
 	t,,"$TERM_GOOD")
-		# have bad but not good.  we could bisect although
+		# have bad (or new) but not good (or old).  we could bisect although
 		# this is less optimum.
 		eval_gettextln "Warning: bisecting only with a \$TERM_BAD commit." >&2
 		if test -t 0
@@ -451,6 +474,8 @@
 			eval "$cmd" ;;
 		"$TERM_GOOD"|"$TERM_BAD"|skip)
 			bisect_write "$command" "$rev" ;;
+		terms)
+			bisect_terms $rev ;;
 		*)
 			die "$(gettext "?? what are you talking about?")" ;;
 		esac
@@ -535,9 +560,42 @@
 write_terms () {
 	TERM_BAD=$1
 	TERM_GOOD=$2
+	if test "$TERM_BAD" = "$TERM_GOOD"
+	then
+		die "$(gettext "please use two different terms")"
+	fi
+	check_term_format "$TERM_BAD" bad
+	check_term_format "$TERM_GOOD" good
 	printf '%s\n%s\n' "$TERM_BAD" "$TERM_GOOD" >"$GIT_DIR/BISECT_TERMS"
 }
 
+check_term_format () {
+	term=$1
+	git check-ref-format refs/bisect/"$term" ||
+	die "$(eval_gettext "'\$term' is not a valid term")"
+	case "$term" in
+	help|start|terms|skip|next|reset|visualize|replay|log|run)
+		die "$(eval_gettext "can't use the builtin command '\$term' as a term")"
+		;;
+	bad|new)
+		if test "$2" != bad
+		then
+			# In theory, nothing prevents swapping
+			# completely good and bad, but this situation
+			# could be confusing and hasn't been tested
+			# enough. Forbid it for now.
+			die "$(eval_gettext "can't change the meaning of term '\$term'")"
+		fi
+		;;
+	good|old)
+		if test "$2" != good
+		then
+			die "$(eval_gettext "can't change the meaning of term '\$term'")"
+		fi
+		;;
+	esac
+}
+
 check_and_set_terms () {
 	cmd="$1"
 	case "$cmd" in
@@ -554,14 +612,51 @@
 				write_terms bad good
 			fi
 			;;
+		new|old)
+			if ! test -s "$GIT_DIR/BISECT_TERMS"
+			then
+				write_terms new old
+			fi
+			;;
 		esac ;;
 	esac
 }
 
 bisect_voc () {
 	case "$1" in
-	bad) echo "bad" ;;
-	good) echo "good" ;;
+	bad) echo "bad|new" ;;
+	good) echo "good|old" ;;
+	esac
+}
+
+bisect_terms () {
+	get_terms
+	if ! test -s "$GIT_DIR/BISECT_TERMS"
+	then
+		die "$(gettext "no terms defined")"
+	fi
+	case "$#" in
+	0)
+		gettextln "Your current terms are $TERM_GOOD for the old state
+and $TERM_BAD for the new state."
+		;;
+	1)
+		arg=$1
+		case "$arg" in
+			--term-good|--term-old)
+				printf '%s\n' "$TERM_GOOD"
+				;;
+			--term-bad|--term-new)
+				printf '%s\n' "$TERM_BAD"
+				;;
+			*)
+				die "$(eval_gettext "invalid argument \$arg for 'git bisect terms'.
+Supported options are: --term-good|--term-old and --term-bad|--term-new.")"
+				;;
+		esac
+		;;
+	*)
+		usage ;;
 	esac
 }
 
@@ -577,7 +672,7 @@
 		git bisect -h ;;
 	start)
 		bisect_start "$@" ;;
-	bad|good|"$TERM_BAD"|"$TERM_GOOD")
+	bad|good|new|old|"$TERM_BAD"|"$TERM_GOOD")
 		bisect_state "$cmd" "$@" ;;
 	skip)
 		bisect_skip "$@" ;;
@@ -594,6 +689,8 @@
 		bisect_log ;;
 	run)
 		bisect_run "$@" ;;
+	terms)
+		bisect_terms "$@" ;;
 	*)
 		usage ;;
 	esac
diff --git a/git-compat-util.h b/git-compat-util.h
index f035363..4743954 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -237,7 +237,7 @@
 #else
 #define precompose_str(in,i_nfd2nfc)
 #define precompose_argv(c,v)
-#define probe_utf8_pathname_composition(a,b)
+#define probe_utf8_pathname_composition()
 #endif
 
 #ifdef MKDIR_WO_TRAILING_SLASH
@@ -261,6 +261,8 @@
 #else
 #define basename gitbasename
 extern char *gitbasename(char *);
+#define dirname gitdirname
+extern char *gitdirname(char *);
 #endif
 
 #ifndef NO_ICONV
@@ -331,10 +333,6 @@
 #define _PATH_DEFPATH "/usr/local/bin:/usr/bin:/bin"
 #endif
 
-#ifndef STRIP_EXTENSION
-#define STRIP_EXTENSION ""
-#endif
-
 #ifndef has_dos_drive_prefix
 static inline int git_has_dos_drive_prefix(const char *path)
 {
@@ -343,6 +341,14 @@
 #define has_dos_drive_prefix git_has_dos_drive_prefix
 #endif
 
+#ifndef skip_dos_drive_prefix
+static inline int git_skip_dos_drive_prefix(char **path)
+{
+	return 0;
+}
+#define skip_dos_drive_prefix git_skip_dos_drive_prefix
+#endif
+
 #ifndef is_dir_sep
 static inline int git_is_dir_sep(int c)
 {
@@ -671,7 +677,6 @@
 #ifdef __GLIBC_PREREQ
 #if __GLIBC_PREREQ(2, 1)
 #define HAVE_STRCHRNUL
-#define HAVE_MEMPCPY
 #endif
 #endif
 
@@ -685,14 +690,6 @@
 }
 #endif
 
-#ifndef HAVE_MEMPCPY
-#define mempcpy gitmempcpy
-static inline void *gitmempcpy(void *dest, const void *src, size_t n)
-{
-	return (char *)memcpy(dest, src, n) + n;
-}
-#endif
-
 #ifdef NO_INET_PTON
 int inet_pton(int af, const char *src, void *dst);
 #endif
@@ -718,8 +715,8 @@
 		    (uintmax_t)a, (uintmax_t)b);
 	return a + b;
 }
-#define st_add3(a,b,c)   st_add((a),st_add((b),(c)))
-#define st_add4(a,b,c,d) st_add((a),st_add3((b),(c),(d)))
+#define st_add3(a,b,c)   st_add(st_add((a),(b)),(c))
+#define st_add4(a,b,c,d) st_add(st_add3((a),(b),(c)),(d))
 
 static inline size_t st_mult(size_t a, size_t b)
 {
@@ -767,8 +764,72 @@
 extern int odb_mkstemp(char *template, size_t limit, const char *pattern);
 extern int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1);
 extern char *xgetcwd(void);
+extern FILE *fopen_for_writing(const char *path);
 
-#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), (alloc) * sizeof(*(x)))
+#define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc)))
+#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc)))
+
+/*
+ * These functions help you allocate structs with flex arrays, and copy
+ * the data directly into the array. For example, if you had:
+ *
+ *   struct foo {
+ *     int bar;
+ *     char name[FLEX_ARRAY];
+ *   };
+ *
+ * you can do:
+ *
+ *   struct foo *f;
+ *   FLEX_ALLOC_MEM(f, name, src, len);
+ *
+ * to allocate a "foo" with the contents of "src" in the "name" field.
+ * The resulting struct is automatically zero'd, and the flex-array field
+ * is NUL-terminated (whether the incoming src buffer was or not).
+ *
+ * The FLEXPTR_* variants operate on structs that don't use flex-arrays,
+ * but do want to store a pointer to some extra data in the same allocated
+ * block. For example, if you have:
+ *
+ *   struct foo {
+ *     char *name;
+ *     int bar;
+ *   };
+ *
+ * you can do:
+ *
+ *   struct foo *f;
+ *   FLEX_ALLOC_STR(f, name, src);
+ *
+ * and "name" will point to a block of memory after the struct, which will be
+ * freed along with the struct (but the pointer can be repointed anywhere).
+ *
+ * The *_STR variants accept a string parameter rather than a ptr/len
+ * combination.
+ *
+ * Note that these macros will evaluate the first parameter multiple
+ * times, and it must be assignable as an lvalue.
+ */
+#define FLEX_ALLOC_MEM(x, flexname, buf, len) do { \
+	(x) = NULL; /* silence -Wuninitialized for offset calculation */ \
+	(x) = xalloc_flex(sizeof(*(x)), (char *)(&((x)->flexname)) - (char *)(x), (buf), (len)); \
+} while (0)
+#define FLEXPTR_ALLOC_MEM(x, ptrname, buf, len) do { \
+	(x) = xalloc_flex(sizeof(*(x)), sizeof(*(x)), (buf), (len)); \
+	(x)->ptrname = (void *)((x)+1); \
+} while(0)
+#define FLEX_ALLOC_STR(x, flexname, str) \
+	FLEX_ALLOC_MEM((x), flexname, (str), strlen(str))
+#define FLEXPTR_ALLOC_STR(x, ptrname, str) \
+	FLEXPTR_ALLOC_MEM((x), ptrname, (str), strlen(str))
+
+static inline void *xalloc_flex(size_t base_len, size_t offset,
+				const void *src, size_t src_len)
+{
+	unsigned char *ret = xcalloc(1, st_add3(base_len, src_len, 1));
+	memcpy(ret + offset, src, src_len);
+	return ret;
+}
 
 static inline char *xstrdup_or_null(const char *str)
 {
@@ -782,6 +843,9 @@
 	return (size_t)len;
 }
 
+__attribute__((format (printf, 3, 4)))
+extern int xsnprintf(char *dst, size_t max, const char *fmt, ...);
+
 /* in ctype.c, for kwset users */
 extern const unsigned char tolower_trans_tbl[256];
 
@@ -852,6 +916,9 @@
 	char *p;
 
 	errno = 0;
+	/* negative values would be accepted by strtoul */
+	if (strchr(s, '-'))
+		return -1;
 	ul = strtoul(s, &p, base);
 	if (errno || *p || p == s || (unsigned int) ul != ul)
 		return -1;
diff --git a/git-cvsserver.perl b/git-cvsserver.perl
index 95e69b1..02c0445 100755
--- a/git-cvsserver.perl
+++ b/git-cvsserver.perl
@@ -2664,7 +2664,7 @@
     #   co  # Obtain list directly.
     #   remove # HERE: TEST: MAYBE client does the recursion for us,
     #          # since it only makes sense to remove stuff already in
-    #          # the sandobx?
+    #          # the sandbox?
     #   ci # HERE: Similar to remove...
     #      # Don't try to implement the confusing/weird
     #      # ci -r bug er.."feature".
diff --git a/git-filter-branch.sh b/git-filter-branch.sh
index ad24c8d..86b2ff1 100755
--- a/git-filter-branch.sh
+++ b/git-filter-branch.sh
@@ -275,15 +275,57 @@
 test $commits -eq 0 && die "Found nothing to rewrite"
 
 # Rewrite the commits
+report_progress ()
+{
+	if test -n "$progress" &&
+		test $git_filter_branch__commit_count -gt $next_sample_at
+	then
+		count=$git_filter_branch__commit_count
+
+		now=$(date +%s)
+		elapsed=$(($now - $start_timestamp))
+		remaining=$(( ($commits - $count) * $elapsed / $count ))
+		if test $elapsed -gt 0
+		then
+			next_sample_at=$(( ($elapsed + 1) * $count / $elapsed ))
+		else
+			next_sample_at=$(($next_sample_at + 1))
+		fi
+		progress=" ($elapsed seconds passed, remaining $remaining predicted)"
+	fi
+	printf "\rRewrite $commit ($count/$commits)$progress    "
+}
 
 git_filter_branch__commit_count=0
+
+progress= start_timestamp=
+if date '+%s' 2>/dev/null | grep -q '^[0-9][0-9]*$'
+then
+	next_sample_at=0
+	progress="dummy to ensure this is not empty"
+	start_timestamp=$(date '+%s')
+fi
+
+if test -n "$filter_index" ||
+   test -n "$filter_tree" ||
+   test -n "$filter_subdir"
+then
+	need_index=t
+else
+	need_index=
+fi
+
 while read commit parents; do
 	git_filter_branch__commit_count=$(($git_filter_branch__commit_count+1))
-	printf "\rRewrite $commit ($git_filter_branch__commit_count/$commits)"
+
+	report_progress
 
 	case "$filter_subdir" in
 	"")
-		GIT_ALLOW_NULL_SHA1=1 git read-tree -i -m $commit
+		if test -n "$need_index"
+		then
+			GIT_ALLOW_NULL_SHA1=1 git read-tree -i -m $commit
+		fi
 		;;
 	*)
 		# The commit may not have the subdirectory at all
@@ -357,8 +399,15 @@
 	} <../commit |
 		eval "$filter_msg" > ../message ||
 			die "msg filter failed: $filter_msg"
+
+	if test -n "$need_index"
+	then
+		tree=$(git write-tree)
+	else
+		tree=$(git rev-parse "$commit^{tree}")
+	fi
 	workdir=$workdir @SHELL_PATH@ -c "$filter_commit" "git commit-tree" \
-		$(git write-tree) $parentstr < ../message > ../map/$commit ||
+		"$tree" $parentstr < ../message > ../map/$commit ||
 			die "could not write rewritten commit"
 done <../revs
 
diff --git a/git-merge-one-file.sh b/git-merge-one-file.sh
index cdc02af..424b034 100755
--- a/git-merge-one-file.sh
+++ b/git-merge-one-file.sh
@@ -120,8 +120,7 @@
 	case "$1" in
 	'')
 		echo "Added $4 in both, but differently."
-		orig=$(git-unpack-file $2)
-		create_virtual_base "$orig" "$src2"
+		orig=$(git-unpack-file e69de29bb2d1d6434b8b29ae775ad8c2e48c5391)
 		;;
 	*)
 		echo "Auto-merging $4"
diff --git a/git-p4.py b/git-p4.py
index a7ec118..c33dece 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -22,6 +22,9 @@
 import re
 import shutil
 import stat
+import zipfile
+import zlib
+import ctypes
 
 try:
     from subprocess import CalledProcessError
@@ -104,6 +107,16 @@
         path = os.getcwd()
     os.environ['PWD'] = path
 
+def calcDiskFree():
+    """Return free space in bytes on the disk of the given dirname."""
+    if platform.system() == 'Windows':
+        free_bytes = ctypes.c_ulonglong(0)
+        ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(os.getcwd()), None, None, ctypes.pointer(free_bytes))
+        return free_bytes.value
+    else:
+        st = os.statvfs(os.getcwd())
+        return st.f_bavail * st.f_frsize
+
 def die(msg):
     if verbose:
         raise Exception(msg)
@@ -609,9 +622,12 @@
 
 _gitConfig = {}
 
-def gitConfig(key):
+def gitConfig(key, typeSpecifier=None):
     if not _gitConfig.has_key(key):
-        cmd = [ "git", "config", key ]
+        cmd = [ "git", "config" ]
+        if typeSpecifier:
+            cmd += [ typeSpecifier ]
+        cmd += [ key ]
         s = read_pipe(cmd, ignore_error=True)
         _gitConfig[key] = s.strip()
     return _gitConfig[key]
@@ -622,16 +638,26 @@
        in the config."""
 
     if not _gitConfig.has_key(key):
-        cmd = [ "git", "config", "--bool", key ]
+        _gitConfig[key] = gitConfig(key, '--bool') == "true"
+    return _gitConfig[key]
+
+def gitConfigInt(key):
+    if not _gitConfig.has_key(key):
+        cmd = [ "git", "config", "--int", key ]
         s = read_pipe(cmd, ignore_error=True)
         v = s.strip()
-        _gitConfig[key] = v == "true"
+        try:
+            _gitConfig[key] = int(gitConfig(key, '--int'))
+        except ValueError:
+            _gitConfig[key] = None
     return _gitConfig[key]
 
 def gitConfigList(key):
     if not _gitConfig.has_key(key):
         s = read_pipe(["git", "config", "--get-all", key], ignore_error=True)
         _gitConfig[key] = s.strip().split(os.linesep)
+        if _gitConfig[key] == ['']:
+            _gitConfig[key] = []
     return _gitConfig[key]
 
 def p4BranchesInGit(branchesAreInRemotes=True):
@@ -796,39 +822,37 @@
                 die("cannot use --changes-block-size with non-numeric revisions")
             block_size = None
 
-    # Accumulate change numbers in a dictionary to avoid duplicates
-    changes = {}
+    changes = []
 
-    for p in depotPaths:
-        # Retrieve changes a block at a time, to prevent running
-        # into a MaxResults/MaxScanRows error from the server.
+    # Retrieve changes a block at a time, to prevent running
+    # into a MaxResults/MaxScanRows error from the server.
 
-        while True:
-            cmd = ['changes']
+    while True:
+        cmd = ['changes']
 
-            if block_size:
-                end = min(changeEnd, changeStart + block_size)
-                revisionRange = "%d,%d" % (changeStart, end)
-            else:
-                revisionRange = "%s,%s" % (changeStart, changeEnd)
+        if block_size:
+            end = min(changeEnd, changeStart + block_size)
+            revisionRange = "%d,%d" % (changeStart, end)
+        else:
+            revisionRange = "%s,%s" % (changeStart, changeEnd)
 
+        for p in depotPaths:
             cmd += ["%s...@%s" % (p, revisionRange)]
 
-            for line in p4_read_pipe_lines(cmd):
-                changeNum = int(line.split(" ")[1])
-                changes[changeNum] = True
+        # Insert changes in chronological order
+        for line in reversed(p4_read_pipe_lines(cmd)):
+            changes.append(int(line.split(" ")[1]))
 
-            if not block_size:
-                break
+        if not block_size:
+            break
 
-            if end >= changeEnd:
-                break
+        if end >= changeEnd:
+            break
 
-            changeStart = end + 1
+        changeStart = end + 1
 
-    changelist = changes.keys()
-    changelist.sort()
-    return changelist
+    changes = sorted(changes)
+    return changes
 
 def p4PathStartsWith(path, prefix):
     # This method tries to remedy a potential mixed-case issue:
@@ -914,6 +938,182 @@
     m = re.search("[*#@%]", path)
     return m is not None
 
+class LargeFileSystem(object):
+    """Base class for large file system support."""
+
+    def __init__(self, writeToGitStream):
+        self.largeFiles = set()
+        self.writeToGitStream = writeToGitStream
+
+    def generatePointer(self, cloneDestination, contentFile):
+        """Return the content of a pointer file that is stored in Git instead of
+           the actual content."""
+        assert False, "Method 'generatePointer' required in " + self.__class__.__name__
+
+    def pushFile(self, localLargeFile):
+        """Push the actual content which is not stored in the Git repository to
+           a server."""
+        assert False, "Method 'pushFile' required in " + self.__class__.__name__
+
+    def hasLargeFileExtension(self, relPath):
+        return reduce(
+            lambda a, b: a or b,
+            [relPath.endswith('.' + e) for e in gitConfigList('git-p4.largeFileExtensions')],
+            False
+        )
+
+    def generateTempFile(self, contents):
+        contentFile = tempfile.NamedTemporaryFile(prefix='git-p4-large-file', delete=False)
+        for d in contents:
+            contentFile.write(d)
+        contentFile.close()
+        return contentFile.name
+
+    def exceedsLargeFileThreshold(self, relPath, contents):
+        if gitConfigInt('git-p4.largeFileThreshold'):
+            contentsSize = sum(len(d) for d in contents)
+            if contentsSize > gitConfigInt('git-p4.largeFileThreshold'):
+                return True
+        if gitConfigInt('git-p4.largeFileCompressedThreshold'):
+            contentsSize = sum(len(d) for d in contents)
+            if contentsSize <= gitConfigInt('git-p4.largeFileCompressedThreshold'):
+                return False
+            contentTempFile = self.generateTempFile(contents)
+            compressedContentFile = tempfile.NamedTemporaryFile(prefix='git-p4-large-file', delete=False)
+            zf = zipfile.ZipFile(compressedContentFile.name, mode='w')
+            zf.write(contentTempFile, compress_type=zipfile.ZIP_DEFLATED)
+            zf.close()
+            compressedContentsSize = zf.infolist()[0].compress_size
+            os.remove(contentTempFile)
+            os.remove(compressedContentFile.name)
+            if compressedContentsSize > gitConfigInt('git-p4.largeFileCompressedThreshold'):
+                return True
+        return False
+
+    def addLargeFile(self, relPath):
+        self.largeFiles.add(relPath)
+
+    def removeLargeFile(self, relPath):
+        self.largeFiles.remove(relPath)
+
+    def isLargeFile(self, relPath):
+        return relPath in self.largeFiles
+
+    def processContent(self, git_mode, relPath, contents):
+        """Processes the content of git fast import. This method decides if a
+           file is stored in the large file system and handles all necessary
+           steps."""
+        if self.exceedsLargeFileThreshold(relPath, contents) or self.hasLargeFileExtension(relPath):
+            contentTempFile = self.generateTempFile(contents)
+            (git_mode, contents, localLargeFile) = self.generatePointer(contentTempFile)
+
+            # Move temp file to final location in large file system
+            largeFileDir = os.path.dirname(localLargeFile)
+            if not os.path.isdir(largeFileDir):
+                os.makedirs(largeFileDir)
+            shutil.move(contentTempFile, localLargeFile)
+            self.addLargeFile(relPath)
+            if gitConfigBool('git-p4.largeFilePush'):
+                self.pushFile(localLargeFile)
+            if verbose:
+                sys.stderr.write("%s moved to large file system (%s)\n" % (relPath, localLargeFile))
+        return (git_mode, contents)
+
+class MockLFS(LargeFileSystem):
+    """Mock large file system for testing."""
+
+    def generatePointer(self, contentFile):
+        """The pointer content is the original content prefixed with "pointer-".
+           The local filename of the large file storage is derived from the file content.
+           """
+        with open(contentFile, 'r') as f:
+            content = next(f)
+            gitMode = '100644'
+            pointerContents = 'pointer-' + content
+            localLargeFile = os.path.join(os.getcwd(), '.git', 'mock-storage', 'local', content[:-1])
+            return (gitMode, pointerContents, localLargeFile)
+
+    def pushFile(self, localLargeFile):
+        """The remote filename of the large file storage is the same as the local
+           one but in a different directory.
+           """
+        remotePath = os.path.join(os.path.dirname(localLargeFile), '..', 'remote')
+        if not os.path.exists(remotePath):
+            os.makedirs(remotePath)
+        shutil.copyfile(localLargeFile, os.path.join(remotePath, os.path.basename(localLargeFile)))
+
+class GitLFS(LargeFileSystem):
+    """Git LFS as backend for the git-p4 large file system.
+       See https://git-lfs.github.com/ for details."""
+
+    def __init__(self, *args):
+        LargeFileSystem.__init__(self, *args)
+        self.baseGitAttributes = []
+
+    def generatePointer(self, contentFile):
+        """Generate a Git LFS pointer for the content. Return LFS Pointer file
+           mode and content which is stored in the Git repository instead of
+           the actual content. Return also the new location of the actual
+           content.
+           """
+        pointerProcess = subprocess.Popen(
+            ['git', 'lfs', 'pointer', '--file=' + contentFile],
+            stdout=subprocess.PIPE
+        )
+        pointerFile = pointerProcess.stdout.read()
+        if pointerProcess.wait():
+            os.remove(contentFile)
+            die('git-lfs pointer command failed. Did you install the extension?')
+        pointerContents = [i+'\n' for i in pointerFile.split('\n')[2:][:-1]]
+        oid = pointerContents[1].split(' ')[1].split(':')[1][:-1]
+        localLargeFile = os.path.join(
+            os.getcwd(),
+            '.git', 'lfs', 'objects', oid[:2], oid[2:4],
+            oid,
+        )
+        # LFS Spec states that pointer files should not have the executable bit set.
+        gitMode = '100644'
+        return (gitMode, pointerContents, localLargeFile)
+
+    def pushFile(self, localLargeFile):
+        uploadProcess = subprocess.Popen(
+            ['git', 'lfs', 'push', '--object-id', 'origin', os.path.basename(localLargeFile)]
+        )
+        if uploadProcess.wait():
+            die('git-lfs push command failed. Did you define a remote?')
+
+    def generateGitAttributes(self):
+        return (
+            self.baseGitAttributes +
+            [
+                '\n',
+                '#\n',
+                '# Git LFS (see https://git-lfs.github.com/)\n',
+                '#\n',
+            ] +
+            ['*.' + f.replace(' ', '[[:space:]]') + ' filter=lfs -text\n'
+                for f in sorted(gitConfigList('git-p4.largeFileExtensions'))
+            ] +
+            ['/' + f.replace(' ', '[[:space:]]') + ' filter=lfs -text\n'
+                for f in sorted(self.largeFiles) if not self.hasLargeFileExtension(f)
+            ]
+        )
+
+    def addLargeFile(self, relPath):
+        LargeFileSystem.addLargeFile(self, relPath)
+        self.writeToGitStream('100644', '.gitattributes', self.generateGitAttributes())
+
+    def removeLargeFile(self, relPath):
+        LargeFileSystem.removeLargeFile(self, relPath)
+        self.writeToGitStream('100644', '.gitattributes', self.generateGitAttributes())
+
+    def processContent(self, git_mode, relPath, contents):
+        if relPath == '.gitattributes':
+            self.baseGitAttributes = contents
+            return (git_mode, self.generateGitAttributes())
+        else:
+            return LargeFileSystem.processContent(self, git_mode, relPath, contents)
+
 class Command:
     def __init__(self):
         self.usage = "usage: %prog [options]"
@@ -1087,6 +1287,9 @@
         self.p4HasMoveCommand = p4_has_move_command()
         self.branch = None
 
+        if gitConfig('git-p4.largeFileSystem'):
+            die("Large file system not supported for git-p4 submit command. Please remove it from config.")
+
     def check(self):
         if len(p4CmdList("opened ...")) > 0:
             die("You have files opened with perforce! Close them before starting the sync.")
@@ -1253,6 +1456,8 @@
            Remove lines in the Files section that show changes to files
            outside the depot path we're committing into."""
 
+        [upstream, settings] = findUpstreamBranchPoint()
+
         template = ""
         inFilesSection = False
         for line in p4_read_pipe_lines(['change', '-o']):
@@ -1265,8 +1470,13 @@
                     lastTab = path.rfind("\t")
                     if lastTab != -1:
                         path = path[:lastTab]
-                        if not p4PathStartsWith(path, self.depotPath):
-                            continue
+                        if settings.has_key('depot-paths'):
+                            if not [p for p in settings['depot-paths']
+                                    if p4PathStartsWith(path, p)]:
+                                continue
+                        else:
+                            if not p4PathStartsWith(path, self.depotPath):
+                                continue
                 else:
                     inFilesSection = False
             else:
@@ -2044,6 +2254,13 @@
         self.clientSpecDirs = None
         self.tempBranches = []
         self.tempBranchLocation = "git-p4-tmp"
+        self.largeFileSystem = None
+
+        if gitConfig('git-p4.largeFileSystem'):
+            largeFileSystemConstructor = globals()[gitConfig('git-p4.largeFileSystem')]
+            self.largeFileSystem = largeFileSystemConstructor(
+                lambda git_mode, relPath, contents: self.writeToGitStream(git_mode, relPath, contents)
+            )
 
         if gitConfig("git-p4.syncFromOrigin") == "false":
             self.syncWithOrigin = False
@@ -2164,13 +2381,22 @@
 
         return branches
 
+    def writeToGitStream(self, gitMode, relPath, contents):
+        self.gitStream.write('M %s inline %s\n' % (gitMode, relPath))
+        self.gitStream.write('data %d\n' % sum(len(d) for d in contents))
+        for d in contents:
+            self.gitStream.write(d)
+        self.gitStream.write('\n')
+
     # output one file from the P4 stream
     # - helper for streamP4Files
 
     def streamOneP4File(self, file, contents):
         relPath = self.stripRepoPath(file['depotFile'], self.branchPrefixes)
         if verbose:
-            sys.stderr.write("%s\n" % relPath)
+            size = int(self.stream_file['fileSize'])
+            sys.stdout.write('\r%s --> %s (%i MB)\n' % (file['depotFile'], relPath, size/1024/1024))
+            sys.stdout.flush()
 
         (type_base, type_mods) = split_p4_type(file["type"])
 
@@ -2239,24 +2465,31 @@
             text = regexp.sub(r'$\1$', text)
             contents = [ text ]
 
-        self.gitStream.write("M %s inline %s\n" % (git_mode, relPath))
+        try:
+            relPath.decode('ascii')
+        except:
+            encoding = 'utf8'
+            if gitConfig('git-p4.pathEncoding'):
+                encoding = gitConfig('git-p4.pathEncoding')
+            relPath = relPath.decode(encoding, 'replace').encode('utf8', 'replace')
+            if self.verbose:
+                print 'Path with non-ASCII characters detected. Used %s to encode: %s ' % (encoding, relPath)
 
-        # total length...
-        length = 0
-        for d in contents:
-            length = length + len(d)
+        if self.largeFileSystem:
+            (git_mode, contents) = self.largeFileSystem.processContent(git_mode, relPath, contents)
 
-        self.gitStream.write("data %d\n" % length)
-        for d in contents:
-            self.gitStream.write(d)
-        self.gitStream.write("\n")
+        self.writeToGitStream(git_mode, relPath, contents)
 
     def streamOneP4Deletion(self, file):
         relPath = self.stripRepoPath(file['path'], self.branchPrefixes)
         if verbose:
-            sys.stderr.write("delete %s\n" % relPath)
+            sys.stdout.write("delete %s\n" % relPath)
+            sys.stdout.flush()
         self.gitStream.write("D %s\n" % relPath)
 
+        if self.largeFileSystem and self.largeFileSystem.isLargeFile(relPath):
+            self.largeFileSystem.removeLargeFile(relPath)
+
     # handle another chunk of streaming data
     def streamP4FilesCb(self, marshalled):
 
@@ -2266,6 +2499,14 @@
             if marshalled["code"] == "error":
                 if "data" in marshalled:
                     err = marshalled["data"].rstrip()
+
+        if not err and 'fileSize' in self.stream_file:
+            required_bytes = int((4 * int(self.stream_file["fileSize"])) - calcDiskFree())
+            if required_bytes > 0:
+                err = 'Not enough space left on %s! Free at least %i MB.' % (
+                    os.getcwd(), required_bytes/1024/1024
+                )
+
         if err:
             f = None
             if self.stream_have_file_info:
@@ -2294,10 +2535,23 @@
         # 'data' field we need to append to our array
         for k in marshalled.keys():
             if k == 'data':
+                if 'streamContentSize' not in self.stream_file:
+                    self.stream_file['streamContentSize'] = 0
+                self.stream_file['streamContentSize'] += len(marshalled['data'])
                 self.stream_contents.append(marshalled['data'])
             else:
                 self.stream_file[k] = marshalled[k]
 
+        if (verbose and
+            'streamContentSize' in self.stream_file and
+            'fileSize' in self.stream_file and
+            'depotFile' in self.stream_file):
+            size = int(self.stream_file["fileSize"])
+            if size > 0:
+                progress = 100*self.stream_file['streamContentSize']/size
+                sys.stdout.write('\r%s %d%% (%i MB)' % (self.stream_file['depotFile'], progress, int(size/1024/1024)))
+                sys.stdout.flush()
+
         self.stream_have_file_info = True
 
     # Stream directly from "p4 files" into "git fast-import"
diff --git a/git-quiltimport.sh b/git-quiltimport.sh
index 167d79f..6d3a88d 100755
--- a/git-quiltimport.sh
+++ b/git-quiltimport.sh
@@ -6,7 +6,8 @@
 --
 n,dry-run     dry run
 author=       author name and email address for patches without any
-patches=      path to the quilt series and patches
+patches=      path to the quilt patches
+series=       path to the quilt series file
 "
 SUBDIRECTORY_ON=Yes
 . git-sh-setup
@@ -27,6 +28,10 @@
 		shift
 		QUILT_PATCHES="$1"
 		;;
+	--series)
+		shift
+		QUILT_SERIES="$1"
+		;;
 	--)
 		shift
 		break;;
@@ -53,6 +58,13 @@
 	exit 1
 fi
 
+# Quilt series file
+: ${QUILT_SERIES:=$QUILT_PATCHES/series}
+if ! [ -e "$QUILT_SERIES" ] ; then
+	echo "The \"$QUILT_SERIES\" file does not exist."
+	exit 1
+fi
+
 # Temporary directories
 tmp_dir="$GIT_DIR"/rebase-apply
 tmp_msg="$tmp_dir/msg"
@@ -135,5 +147,5 @@
 		commit=$( (echo "$SUBJECT"; echo; cat "$tmp_msg") | git commit-tree $tree -p $commit) &&
 		git update-ref -m "quiltimport: $patch_name" HEAD $commit || exit 4
 	fi
-done 3<"$QUILT_PATCHES/series"
+done 3<"$QUILT_SERIES"
 rm -rf $tmp_dir || exit 5
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index b938a6d..c0cfe88 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -81,17 +81,13 @@
 # and leaves CR at the end instead.
 cr=$(printf "\015")
 
-strategy_args=
-if test -n "$do_merge"
-then
-	strategy_args=${strategy:+--strategy=$strategy}
-	eval '
-		for strategy_opt in '"$strategy_opts"'
-		do
-			strategy_args="$strategy_args -X$(git rev-parse --sq-quote "${strategy_opt#--}")"
-		done
-	'
-fi
+strategy_args=${strategy:+--strategy=$strategy}
+eval '
+	for strategy_opt in '"$strategy_opts"'
+	do
+		strategy_args="$strategy_args -X$(git rev-parse --sq-quote "${strategy_opt#--}")"
+	done
+'
 
 GIT_CHERRY_PICK_HELP="$resolvemsg"
 export GIT_CHERRY_PICK_HELP
diff --git a/git-rebase.sh b/git-rebase.sh
index af7ba5f..cf60c43 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -176,7 +176,7 @@
 
 finish_rebase () {
 	apply_autostash &&
-	git gc --auto &&
+	{ git gc --auto || true; } &&
 	rm -rf "$state_dir"
 }
 
diff --git a/git-send-email.perl b/git-send-email.perl
index 72508be..d356901 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -46,6 +46,7 @@
 sub usage {
 	print <<EOT;
 git send-email [options] <file | directory | rev-list options >
+git send-email --dump-aliases
 
   Composing:
     --from                  <str>  * Email From:
@@ -101,6 +102,9 @@
                                      `git format-patch` ones.
     --force                        * Send even if safety checks would prevent it.
 
+  Information:
+    --dump-aliases                 * Dump configured aliases and exit.
+
 EOT
 	exit(1);
 }
@@ -180,6 +184,7 @@
 my $format_patch;
 my $compose_filename;
 my $force = 0;
+my $dump_aliases = 0;
 
 # Handle interactive edition of files.
 my $multiedit;
@@ -239,7 +244,6 @@
     "smtpserveroption" => \@smtp_server_options,
     "smtpuser" => \$smtp_authuser,
     "smtppass" => \$smtp_authpass,
-    "smtpsslcertpath" => \$smtp_ssl_cert_path,
     "smtpdomain" => \$smtp_domain,
     "smtpauth" => \$smtp_auth,
     "to" => \@initial_to,
@@ -259,6 +263,7 @@
 
 my %config_path_settings = (
     "aliasesfile" => \@alias_files,
+    "smtpsslcertpath" => \$smtp_ssl_cert_path,
 );
 
 # Handle Uncouth Termination
@@ -291,6 +296,11 @@
 
 my $help;
 my $rc = GetOptions("h" => \$help,
+                    "dump-aliases" => \$dump_aliases);
+usage() unless $rc;
+die "--dump-aliases incompatible with other options\n"
+    if !$help and $dump_aliases and @ARGV;
+$rc = GetOptions(
 		    "sender|from=s" => \$sender,
                     "in-reply-to=s" => \$initial_reply_to,
 		    "subject=s" => \$initial_subject,
@@ -514,8 +524,13 @@
 		if (/^\s*alias\s+(?:-group\s+\S+\s+)*(\S+)\s+(.*)$/) {
 			my ($alias, $addr) = ($1, $2);
 			$addr =~ s/#.*$//; # mutt allows # comments
-			 # commas delimit multiple addresses
-			$aliases{$alias} = [ split_addrs($addr) ];
+			# commas delimit multiple addresses
+			my @addr = split_addrs($addr);
+
+			# quotes may be escaped in the file,
+			# unescape them so we do not double-escape them later.
+			s/\\"/"/g foreach @addr;
+			$aliases{$alias} = \@addr
 		}}},
 	mailrc => sub { my $fh = shift; while (<$fh>) {
 		if (/^alias\s+(\S+)\s+(.*)$/) {
@@ -551,6 +566,11 @@
 	}
 }
 
+if ($dump_aliases) {
+    print "$_\n" for (sort keys %aliases);
+    exit(0);
+}
+
 # is_format_patch_arg($f) returns 0 if $f names a patch, or 1 if
 # $f is a revision list specification to be passed to format-patch.
 sub is_format_patch_arg {
@@ -1196,8 +1216,7 @@
 		return (SSL_verify_mode => SSL_VERIFY_PEER(),
 			SSL_ca_file => $smtp_ssl_cert_path);
 	} else {
-		print STDERR "Not using SSL_VERIFY_PEER because the CA path does not exist.\n";
-		return (SSL_verify_mode => SSL_VERIFY_NONE());
+		die "CA path \"$smtp_ssl_cert_path\" does not exist";
 	}
 }
 
diff --git a/git-stash.sh b/git-stash.sh
index 1d5ba7a..c7c65e2 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -305,7 +305,25 @@
 	ALLOW_UNKNOWN_FLAGS=t
 	assert_stash_like "$@"
 
-	git diff ${FLAGS:---stat} $b_commit $w_commit
+	if test -z "$FLAGS"
+	then
+		if test "$(git config --bool stash.showStat || echo true)" = "true"
+		then
+			FLAGS=--stat
+		fi
+
+		if test "$(git config --bool stash.showPatch || echo false)" = "true"
+		then
+			FLAGS=${FLAGS}${FLAGS:+ }-p
+		fi
+
+		if test -z "$FLAGS"
+		then
+			return 0
+		fi
+	fi
+
+	git diff ${FLAGS} $b_commit $w_commit
 }
 
 show_help () {
diff --git a/git-submodule.sh b/git-submodule.sh
index 82e3558..9bc5c5f 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -154,48 +154,6 @@
 	echo "$result$target"
 }
 
-#
-# Get submodule info for registered submodules
-# $@ = path to limit submodule list
-#
-module_list()
-{
-	eval "set $(git rev-parse --sq --prefix "$wt_prefix" -- "$@")"
-	(
-		git ls-files -z --error-unmatch --stage -- "$@" ||
-		echo "unmatched pathspec exists"
-	) |
-	@@PERL@@ -e '
-	my %unmerged = ();
-	my ($null_sha1) = ("0" x 40);
-	my @out = ();
-	my $unmatched = 0;
-	$/ = "\0";
-	while (<STDIN>) {
-		if (/^unmatched pathspec/) {
-			$unmatched = 1;
-			next;
-		}
-		chomp;
-		my ($mode, $sha1, $stage, $path) =
-			/^([0-7]+) ([0-9a-f]{40}) ([0-3])\t(.*)$/;
-		next unless $mode eq "160000";
-		if ($stage ne "0") {
-			if (!$unmerged{$path}++) {
-				push @out, "$mode $null_sha1 U\t$path\n";
-			}
-			next;
-		}
-		push @out, "$_\n";
-	}
-	if ($unmatched) {
-		print "#unmatched\n";
-	} else {
-		print for (@out);
-	}
-	'
-}
-
 die_if_unmatched ()
 {
 	if test "$1" = "#unmatched"
@@ -229,98 +187,6 @@
 	printf '%s' "${value:-$default}"
 }
 
-
-#
-# Map submodule path to submodule name
-#
-# $1 = path
-#
-module_name()
-{
-	# Do we have "submodule.<something>.path = $1" defined in .gitmodules file?
-	sm_path="$1"
-	re=$(printf '%s\n' "$1" | sed -e 's/[].[^$\\*]/\\&/g')
-	name=$( git config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
-		sed -n -e 's|^submodule\.\(.*\)\.path '"$re"'$|\1|p' )
-	test -z "$name" &&
-	die "$(eval_gettext "No submodule mapping found in .gitmodules for path '\$sm_path'")"
-	printf '%s\n' "$name"
-}
-
-#
-# Clone a submodule
-#
-# $1 = submodule path
-# $2 = submodule name
-# $3 = URL to clone
-# $4 = reference repository to reuse (empty for independent)
-# $5 = depth argument for shallow clones (empty for deep)
-#
-# Prior to calling, cmd_update checks that a possibly existing
-# path is not a git repository.
-# Likewise, cmd_add checks that path does not exist at all,
-# since it is the location of a new submodule.
-#
-module_clone()
-{
-	sm_path=$1
-	name=$2
-	url=$3
-	reference="$4"
-	depth="$5"
-	quiet=
-	if test -n "$GIT_QUIET"
-	then
-		quiet=-q
-	fi
-
-	gitdir=
-	gitdir_base=
-	base_name=$(dirname "$name")
-
-	gitdir=$(git rev-parse --git-dir)
-	gitdir_base="$gitdir/modules/$base_name"
-	gitdir="$gitdir/modules/$name"
-
-	if test -d "$gitdir"
-	then
-		mkdir -p "$sm_path"
-		rm -f "$gitdir/index"
-	else
-		mkdir -p "$gitdir_base"
-		(
-			clear_local_git_env
-			git clone $quiet ${depth:+"$depth"} -n ${reference:+"$reference"} \
-				--separate-git-dir "$gitdir" "$url" "$sm_path"
-		) ||
-		die "$(eval_gettext "Clone of '\$url' into submodule path '\$sm_path' failed")"
-	fi
-
-	# We already are at the root of the work tree but cd_to_toplevel will
-	# resolve any symlinks that might be present in $PWD
-	a=$(cd_to_toplevel && cd "$gitdir" && pwd)/
-	b=$(cd_to_toplevel && cd "$sm_path" && pwd)/
-	# Remove all common leading directories after a sanity check
-	if test "${a#$b}" != "$a" || test "${b#$a}" != "$b"; then
-		die "$(eval_gettext "Gitdir '\$a' is part of the submodule path '\$b' or vice versa")"
-	fi
-	while test "${a%%/*}" = "${b%%/*}"
-	do
-		a=${a#*/}
-		b=${b#*/}
-	done
-	# Now chop off the trailing '/'s that were added in the beginning
-	a=${a%/}
-	b=${b%/}
-
-	# Turn each leading "*/" component into "../"
-	rel=$(printf '%s\n' "$b" | sed -e 's|[^/][^/]*|..|g')
-	printf '%s\n' "gitdir: $rel/$a" >"$sm_path/.git"
-
-	rel=$(printf '%s\n' "$a" | sed -e 's|[^/][^/]*|..|g')
-	(clear_local_git_env; cd "$sm_path" && GIT_WORK_TREE=. git config core.worktree "$rel/$b")
-}
-
 isnumber()
 {
 	n=$(($1 + 0)) 2>/dev/null && test "$n" = "$1"
@@ -481,7 +347,7 @@
 				echo "$(eval_gettext "Reactivating local git directory for submodule '\$sm_name'.")"
 			fi
 		fi
-		module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" "$depth" || exit
+		git submodule--helper clone ${GIT_QUIET:+--quiet} --prefix "$wt_prefix" --path "$sm_path" --name "$sm_name" --url "$realrepo" "$reference" "$depth" || exit
 		(
 			clear_local_git_env
 			cd "$sm_path" &&
@@ -541,7 +407,7 @@
 	# command in the subshell (and a recursive call to this function)
 	exec 3<&0
 
-	module_list |
+	git submodule--helper list --prefix "$wt_prefix"|
 	while read mode sha1 stage sm_path
 	do
 		die_if_unmatched "$mode"
@@ -549,7 +415,7 @@
 		then
 			displaypath=$(relative_path "$sm_path")
 			say "$(eval_gettext "Entering '\$prefix\$displaypath'")"
-			name=$(module_name "$sm_path")
+			name=$(git submodule--helper name "$sm_path")
 			(
 				prefix="$prefix$sm_path/"
 				clear_local_git_env
@@ -601,11 +467,11 @@
 		shift
 	done
 
-	module_list "$@" |
+	git submodule--helper list --prefix "$wt_prefix" "$@" |
 	while read mode sha1 stage sm_path
 	do
 		die_if_unmatched "$mode"
-		name=$(module_name "$sm_path") || exit
+		name=$(git submodule--helper name "$sm_path") || exit
 
 		displaypath=$(relative_path "$sm_path")
 
@@ -683,11 +549,11 @@
 		die "$(eval_gettext "Use '.' if you really want to deinitialize all submodules")"
 	fi
 
-	module_list "$@" |
+	git submodule--helper list --prefix "$wt_prefix" "$@" |
 	while read mode sha1 stage sm_path
 	do
 		die_if_unmatched "$mode"
-		name=$(module_name "$sm_path") || exit
+		name=$(git submodule--helper name "$sm_path") || exit
 
 		displaypath=$(relative_path "$sm_path")
 
@@ -799,7 +665,7 @@
 	fi
 
 	cloned_modules=
-	module_list "$@" | {
+	git submodule--helper list --prefix "$wt_prefix" "$@" | {
 	err=
 	while read mode sha1 stage sm_path
 	do
@@ -809,7 +675,7 @@
 			echo >&2 "Skipping unmerged submodule $prefix$sm_path"
 			continue
 		fi
-		name=$(module_name "$sm_path") || exit
+		name=$(git submodule--helper name "$sm_path") || exit
 		url=$(git config submodule."$name".url)
 		branch=$(get_submodule_config "$name" branch master)
 		if ! test -z "$update"
@@ -843,7 +709,7 @@
 
 		if ! test -d "$sm_path"/.git && ! test -f "$sm_path"/.git
 		then
-			module_clone "$sm_path" "$name" "$url" "$reference" "$depth" || exit
+			git submodule--helper clone ${GIT_QUIET:+--quiet} --prefix "$prefix" --path "$sm_path" --name "$name" --url "$url" "$reference" "$depth" || exit
 			cloned_modules="$cloned_modules;$name"
 			subsha1=
 		else
@@ -1073,7 +939,7 @@
 			# Respect the ignore setting for --for-status.
 			if test -n "$for_status"
 			then
-				name=$(module_name "$sm_path")
+				name=$(git submodule--helper name "$sm_path")
 				ignore_config=$(get_submodule_config "$name" ignore none)
 				test $status != A && test $ignore_config = all && continue
 			fi
@@ -1231,11 +1097,11 @@
 		shift
 	done
 
-	module_list "$@" |
+	git submodule--helper list --prefix "$wt_prefix" "$@" |
 	while read mode sha1 stage sm_path
 	do
 		die_if_unmatched "$mode"
-		name=$(module_name "$sm_path") || exit
+		name=$(git submodule--helper name "$sm_path") || exit
 		url=$(git config submodule."$name".url)
 		displaypath=$(relative_path "$prefix$sm_path")
 		if test "$stage" = U
@@ -1308,11 +1174,11 @@
 		esac
 	done
 	cd_to_toplevel
-	module_list "$@" |
+	git submodule--helper list --prefix "$wt_prefix" "$@" |
 	while read mode sha1 stage sm_path
 	do
 		die_if_unmatched "$mode"
-		name=$(module_name "$sm_path")
+		name=$(git submodule--helper name "$sm_path")
 		url=$(git config -f .gitmodules --get submodule."$name".url)
 
 		# Possibly a url relative to parent
diff --git a/git.c b/git.c
index 40f9df0..c19d6bf 100644
--- a/git.c
+++ b/git.c
@@ -239,19 +239,15 @@
 	alias_string = alias_lookup(alias_command);
 	if (alias_string) {
 		if (alias_string[0] == '!') {
-			const char **alias_argv;
-			int argc = *argcp, i;
+			struct child_process child = CHILD_PROCESS_INIT;
 
 			commit_pager_choice();
 
-			/* build alias_argv */
-			alias_argv = xmalloc(sizeof(*alias_argv) * (argc + 1));
-			alias_argv[0] = alias_string + 1;
-			for (i = 1; i < argc; ++i)
-				alias_argv[i] = (*argv)[i];
-			alias_argv[argc] = NULL;
+			child.use_shell = 1;
+			argv_array_push(&child.args, alias_string + 1);
+			argv_array_pushv(&child.args, (*argv) + 1);
 
-			ret = run_command_v_opt(alias_argv, RUN_USING_SHELL);
+			ret = run_command(&child);
 			if (ret >= 0)   /* normal exit */
 				exit(ret);
 
@@ -470,6 +466,7 @@
 	{ "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
 	{ "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
 	{ "stripspace", cmd_stripspace },
+	{ "submodule--helper", cmd_submodule__helper, RUN_SETUP },
 	{ "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
 	{ "tag", cmd_tag, RUN_SETUP },
 	{ "unpack-file", cmd_unpack_file, RUN_SETUP },
@@ -505,21 +502,25 @@
 	return !!get_builtin(s);
 }
 
+#ifdef STRIP_EXTENSION
+static void strip_extension(const char **argv)
+{
+	size_t len;
+
+	if (strip_suffix(argv[0], STRIP_EXTENSION, &len))
+		argv[0] = xmemdupz(argv[0], len);
+}
+#else
+#define strip_extension(cmd)
+#endif
+
 static void handle_builtin(int argc, const char **argv)
 {
-	const char *cmd = argv[0];
-	int i;
-	static const char ext[] = STRIP_EXTENSION;
+	const char *cmd;
 	struct cmd_struct *builtin;
 
-	if (sizeof(ext) > 1) {
-		i = strlen(argv[0]) - strlen(ext);
-		if (i > 0 && !strcmp(argv[0] + i, ext)) {
-			char *argv0 = xstrdup(argv[0]);
-			argv[0] = cmd = argv0;
-			argv0[i] = '\0';
-		}
-	}
+	strip_extension(argv);
+	cmd = argv[0];
 
 	/* Turn "git cmd --help" into "git help cmd" */
 	if (argc > 1 && !strcmp(argv[1], "--help")) {
diff --git a/gitk-git/gitk b/gitk-git/gitk
index 2028b55..5f1255c 100755
--- a/gitk-git/gitk
+++ b/gitk-git/gitk
@@ -1943,6 +1943,8 @@
 }
 
 proc setoptions {} {
+    global use_ttk
+
     if {[tk windowingsystem] ne "win32"} {
         option add *Panedwindow.showHandle 1 startupFile
         option add *Panedwindow.sashRelief raised startupFile
@@ -1965,6 +1967,18 @@
     option add *Listbox.font mainfont startupFile
 }
 
+proc setttkstyle {} {
+    eval font configure TkDefaultFont [fontflags mainfont]
+    eval font configure TkTextFont [fontflags textfont]
+    eval font configure TkHeadingFont [fontflags mainfont]
+    eval font configure TkCaptionFont [fontflags mainfont] -weight bold
+    eval font configure TkTooltipFont [fontflags uifont]
+    eval font configure TkFixedFont   [fontflags textfont]
+    eval font configure TkIconFont    [fontflags uifont]
+    eval font configure TkMenuFont    [fontflags uifont]
+    eval font configure TkSmallCaptionFont [fontflags uifont]
+}
+
 # Make a menu and submenus.
 # m is the window name for the menu, items is the list of menu items to add.
 # Each item is a list {mc label type description options...}
@@ -2251,7 +2265,7 @@
 	set h [expr {[font metrics uifont -linespace] + 2}]
 	set progresscanv .tf.bar.progress
 	canvas $progresscanv -relief sunken -height $h -borderwidth 2
-	set progressitem [$progresscanv create rect -1 0 0 $h -fill green]
+	set progressitem [$progresscanv create rect -1 0 0 $h -fill lime]
 	set fprogitem [$progresscanv create rect -1 0 0 $h -fill yellow]
 	set rprogitem [$progresscanv create rect -1 0 0 $h -fill red]
     }
@@ -2347,6 +2361,9 @@
     ${NS}::frame .bleft.mid
     ${NS}::frame .bleft.bottom
 
+    # gap between sub-widgets
+    set wgap [font measure uifont "i"]
+
     ${NS}::button .bleft.top.search -text [mc "Search"] -command dosearch
     pack .bleft.top.search -side left -padx 5
     set sstring .bleft.top.sstring
@@ -2361,8 +2378,9 @@
 	-command changediffdisp -variable diffelide -value {0 1}
     ${NS}::radiobutton .bleft.mid.new -text [mc "New version"] \
 	-command changediffdisp -variable diffelide -value {1 0}
+
     ${NS}::label .bleft.mid.labeldiffcontext -text "      [mc "Lines of context"]: "
-    pack .bleft.mid.diff .bleft.mid.old .bleft.mid.new -side left
+    pack .bleft.mid.diff .bleft.mid.old .bleft.mid.new -side left -ipadx $wgap
     spinbox .bleft.mid.diffcontext -width 5 \
 	-from 0 -increment 1 -to 10000000 \
 	-validate all -validatecommand "diffcontextvalidate %P" \
@@ -2370,7 +2388,7 @@
     .bleft.mid.diffcontext set $diffcontext
     trace add variable diffcontextstring write diffcontextchange
     lappend entries .bleft.mid.diffcontext
-    pack .bleft.mid.labeldiffcontext .bleft.mid.diffcontext -side left
+    pack .bleft.mid.labeldiffcontext .bleft.mid.diffcontext -side left -ipadx $wgap
     ${NS}::checkbutton .bleft.mid.ignspace -text [mc "Ignore space change"] \
 	-command changeignorespace -variable ignorespace
     pack .bleft.mid.ignspace -side left -padx 5
@@ -3379,7 +3397,7 @@
        0x00, 0x00, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f,
        0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0x00, 0x00};
 }
-image create bitmap reficon-H -background black -foreground green \
+image create bitmap reficon-H -background black -foreground lime \
     -data $rectdata -maskdata $rectmask
 image create bitmap reficon-o -background black -foreground "#ddddff" \
     -data $rectdata -maskdata $rectmask
@@ -12170,7 +12188,7 @@
     set extdifftool "meld"
 }
 
-set colors {green red blue magenta darkgrey brown orange}
+set colors {lime red blue magenta darkgrey brown orange}
 if {[tk windowingsystem] eq "win32"} {
     set uicolor SystemButtonFace
     set uifgcolor SystemButtonText
@@ -12188,12 +12206,12 @@
 }
 set diffcolors {red "#00a000" blue}
 set diffcontext 3
-set mergecolors {red blue green purple brown "#009090" magenta "#808000" "#009000" "#ff0080" cyan "#b07070" "#70b0f0" "#70f0b0" "#f0b070" "#ff70b0"}
+set mergecolors {red blue lime purple brown "#009090" magenta "#808000" "#009000" "#ff0080" cyan "#b07070" "#70b0f0" "#70f0b0" "#f0b070" "#ff70b0"}
 set ignorespace 0
 set worddiff ""
 set markbgcolor "#e0e0ff"
 
-set headbgcolor green
+set headbgcolor lime
 set headfgcolor black
 set headoutlinecolor black
 set remotebgcolor #ffddaa
@@ -12208,7 +12226,7 @@
 set linehoveroutlinecolor black
 set mainheadcirclecolor yellow
 set workingfilescirclecolor red
-set indexcirclecolor green
+set indexcirclecolor lime
 set circlecolors {white blue gray blue blue}
 set linkfgcolor blue
 set circleoutlinecolor $fgcolor
@@ -12356,6 +12374,10 @@
 set use_ttk [expr {$have_ttk && $want_ttk}]
 set NS [expr {$use_ttk ? "ttk" : ""}]
 
+if {$use_ttk} {
+    setttkstyle
+}
+
 regexp {^git version ([\d.]*\d)} [exec git version] _ git_version
 
 set show_notes {}
@@ -12452,8 +12474,8 @@
     set viewchanged(1) 0
     set vdatemode(1) 0
     addviewmenu 1
-    .bar.view entryconf [mca "Edit view..."] -state normal
-    .bar.view entryconf [mca "Delete view"] -state normal
+    .bar.view entryconf [mca "&Edit view..."] -state normal
+    .bar.view entryconf [mca "&Delete view"] -state normal
 }
 
 if {[info exists permviews]} {
diff --git a/gitk-git/po/bg.po b/gitk-git/po/bg.po
index 61073eb..909a564 100644
--- a/gitk-git/po/bg.po
+++ b/gitk-git/po/bg.po
@@ -89,71 +89,71 @@
 msgstr "Отказ"
 
 #: gitk:2069
-msgid "Update"
+msgid "&Update"
 msgstr "Обновяване"
 
 #: gitk:2070
-msgid "Reload"
+msgid "&Reload"
 msgstr "Презареждане"
 
 #: gitk:2071
-msgid "Reread references"
+msgid "Reread re&ferences"
 msgstr "Наново прочитане на настройките"
 
 #: gitk:2072
-msgid "List references"
+msgid "&List references"
 msgstr "Изброяване на указателите"
 
 #: gitk:2074
-msgid "Start git gui"
+msgid "Start git &gui"
 msgstr "Стартиране на „git gui“"
 
 #: gitk:2076
-msgid "Quit"
+msgid "&Quit"
 msgstr "Спиране на програмата"
 
 #: gitk:2068
-msgid "File"
+msgid "&File"
 msgstr "Файл"
 
 #: gitk:2080
-msgid "Preferences"
+msgid "&Preferences"
 msgstr "Настройки"
 
 #: gitk:2079
-msgid "Edit"
+msgid "&Edit"
 msgstr "Редактиране"
 
 #: gitk:2084
-msgid "New view..."
+msgid "&New view..."
 msgstr "Нов изглед…"
 
 #: gitk:2085
-msgid "Edit view..."
+msgid "&Edit view..."
 msgstr "Редактиране на изгледа…"
 
 #: gitk:2086
-msgid "Delete view"
+msgid "&Delete view"
 msgstr "Изтриване на изгледа"
 
 #: gitk:2088 gitk:4043
-msgid "All files"
+msgid "&All files"
 msgstr "Всички файлове"
 
 #: gitk:2083 gitk:4067
-msgid "View"
+msgid "&View"
 msgstr "Изглед"
 
 #: gitk:2093 gitk:2103 gitk:3012
-msgid "About gitk"
+msgid "&About gitk"
 msgstr "Относно gitk"
 
 #: gitk:2094 gitk:2108
-msgid "Key bindings"
+msgid "&Key bindings"
 msgstr "Клавишни комбинации"
 
 #: gitk:2092 gitk:2107
-msgid "Help"
+msgid "&Help"
 msgstr "Помощ"
 
 #: gitk:2185 gitk:8652
diff --git a/gitk-git/po/ca.po b/gitk-git/po/ca.po
index 976037a..5ad066f 100644
--- a/gitk-git/po/ca.po
+++ b/gitk-git/po/ca.po
@@ -9,7 +9,7 @@
 "Project-Id-Version: gitk\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-05-17 14:32+1000\n"
-"PO-Revision-Date: 2015-02-01 22:49-0700\n"
+"PO-Revision-Date: 2015-10-05 22:23-0600\n"
 "Last-Translator: Alex Henrie <alexhenrie24@gmail.com>\n"
 "Language-Team: Catalan\n"
 "Language: ca\n"
@@ -17,7 +17,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.7.3\n"
+"X-Generator: Poedit 1.8.5\n"
 
 #: gitk:140
 msgid "Couldn't get list of unmerged files:"
@@ -91,71 +91,71 @@
 msgstr "Cancel·la"
 
 #: gitk:2069
-msgid "Update"
+msgid "&Update"
 msgstr "Actualitza"
 
 #: gitk:2070
-msgid "Reload"
+msgid "&Reload"
 msgstr "Recarrega"
 
 #: gitk:2071
-msgid "Reread references"
+msgid "Reread re&ferences"
 msgstr "Rellegeix les referències"
 
 #: gitk:2072
-msgid "List references"
+msgid "&List references"
 msgstr "Llista les referències"
 
 #: gitk:2074
-msgid "Start git gui"
+msgid "Start git &gui"
 msgstr "Inicia el git gui"
 
 #: gitk:2076
-msgid "Quit"
+msgid "&Quit"
 msgstr "Surt"
 
 #: gitk:2068
-msgid "File"
+msgid "&File"
 msgstr "Fitxer"
 
 #: gitk:2080
-msgid "Preferences"
+msgid "&Preferences"
 msgstr "Preferències"
 
 #: gitk:2079
-msgid "Edit"
+msgid "&Edit"
 msgstr "Edita"
 
 #: gitk:2084
-msgid "New view..."
+msgid "&New view..."
 msgstr "Vista nova..."
 
 #: gitk:2085
-msgid "Edit view..."
+msgid "&Edit view..."
 msgstr "Edita la vista..."
 
 #: gitk:2086
-msgid "Delete view"
-msgstr "Suprimeix vista"
+msgid "&Delete view"
+msgstr "Suprimeix la vista"
 
 #: gitk:2088 gitk:4043
-msgid "All files"
+msgid "&All files"
 msgstr "Tots els fitxers"
 
 #: gitk:2083 gitk:4067
-msgid "View"
+msgid "&View"
 msgstr "Vista"
 
 #: gitk:2093 gitk:2103 gitk:3012
-msgid "About gitk"
+msgid "&About gitk"
 msgstr "Quant al gitk"
 
 #: gitk:2094 gitk:2108
-msgid "Key bindings"
+msgid "&Key bindings"
 msgstr "Associacions de tecles"
 
 #: gitk:2092 gitk:2107
-msgid "Help"
+msgid "&Help"
 msgstr "Ajuda"
 
 #: gitk:2185 gitk:8652
@@ -330,7 +330,7 @@
 
 #: gitk:2649
 msgid "Copy branch name"
-msgstr ""
+msgstr "Copia el nom de branca"
 
 #: gitk:2656
 msgid "Highlight this too"
@@ -350,7 +350,7 @@
 
 #: gitk:2660
 msgid "Copy path"
-msgstr ""
+msgstr "Copia el camí"
 
 #: gitk:2667
 msgid "Show origin of this line"
@@ -408,11 +408,11 @@
 
 #: gitk:3052
 msgid "<Up>, p, k\tMove up one commit"
-msgstr "<Amunt>, p, k\tMou-te una comissió amunt"
+msgstr "<Amunt>, p, k\tMou-te cap amunt per una comissió"
 
 #: gitk:3053
 msgid "<Down>, n, j\tMove down one commit"
-msgstr "<Avall>, n, j\tMou-te una comissió avall"
+msgstr "<Avall>, n, j\tMou-te cap avall per una comissió"
 
 #: gitk:3054
 msgid "<Left>, z, h\tGo back in history list"
@@ -430,11 +430,11 @@
 
 #: gitk:3057
 msgid "<PageUp>\tMove up one page in commit list"
-msgstr "<RePàg>\tBaixa una pàgina en la llista de comissions"
+msgstr "<RePàg>\tMou-te cap amunt per una pàgina en la llista de comissions"
 
 #: gitk:3058
 msgid "<PageDown>\tMove down one page in commit list"
-msgstr "<AvPàg>\tBaixa per una pàgina en la llista de comissions"
+msgstr "<AvPàg>\tMou-te cap avall per una pàgina en la llista de comissions"
 
 #: gitk:3059
 #, tcl-format
@@ -449,50 +449,50 @@
 #: gitk:3061
 #, tcl-format
 msgid "<%s-Up>\tScroll commit list up one line"
-msgstr "<%s-Amunt>\tDesplaça la llista de comissions una línia cap amunt"
+msgstr "<%s-Amunt>\tDesplaça la llista de comissions cap amunt per una línia"
 
 #: gitk:3062
 #, tcl-format
 msgid "<%s-Down>\tScroll commit list down one line"
-msgstr "<%s-Avall>\tDesplaça la llista de comissions una línia cap avall"
+msgstr "<%s-Avall>\tDesplaça la llista de comissions cap avall per una línia"
 
 #: gitk:3063
 #, tcl-format
 msgid "<%s-PageUp>\tScroll commit list up one page"
-msgstr "<%s-RePàg>\tDesplaça la llista de comissions amunt per una pàgina"
+msgstr "<%s-RePàg>\tDesplaça la llista de comissions cap amunt per una pàgina"
 
 #: gitk:3064
 #, tcl-format
 msgid "<%s-PageDown>\tScroll commit list down one page"
-msgstr "<%s-AvPàg>\tDesplaça la llista de comissions una pàgina cap avall"
+msgstr "<%s-AvPàg>\tDesplaça la llista de comissions cap avall per una pàgina"
 
 #: gitk:3065
 msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
-msgstr "<Maj-Amunt>\tCerca cap enrere (amunt, les comissions més noves)"
+msgstr "<Maj-Amunt>\tCerca cap enrere (cap amunt, les comissions més noves)"
 
 #: gitk:3066
 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
-msgstr "<Maj-Avall>\tCerca cap endavant (avall, les comissions més velles)"
+msgstr "<Maj-Avall>\tCerca cap endavant (cap avall, les comissions més velles)"
 
 #: gitk:3067
 msgid "<Delete>, b\tScroll diff view up one page"
-msgstr "<Supr>, b\tDesplaça la vista de diferència una pàgina cap amunt"
+msgstr "<Supr>, b\tDesplaça la vista de diferència cap amunt per una pàgina"
 
 #: gitk:3068
 msgid "<Backspace>\tScroll diff view up one page"
-msgstr "<Retrocés>\tDesplaça la vista de diferència una pàgina cap amunt"
+msgstr "<Retrocés>\tDesplaça la vista de diferència cap amunt per una pàgina"
 
 #: gitk:3069
 msgid "<Space>\t\tScroll diff view down one page"
-msgstr "<Espai>\t\tDesplaça la vista de diferència una pàgina cap avall"
+msgstr "<Espai>\t\tDesplaça la vista de diferència cap avall per una pàgina"
 
 #: gitk:3070
 msgid "u\t\tScroll diff view up 18 lines"
-msgstr "u\t\tDesplaça la vista de diferència 18 línies cap amunt"
+msgstr "u\t\tDesplaça la vista de diferència cap amunt per 18 línies"
 
 #: gitk:3071
 msgid "d\t\tScroll diff view down 18 lines"
-msgstr "d\t\tDesplaça la vista de diferència 18 línies cap avall "
+msgstr "d\t\tDesplaça la vista de diferència cap avall per 18 línies"
 
 #: gitk:3072
 #, tcl-format
@@ -509,9 +509,8 @@
 msgstr "<Retorn>\tMou-te a la propera coincidència de la cerca"
 
 #: gitk:3075
-#, fuzzy
 msgid "g\t\tGo to commit"
-msgstr "<Fi>\t\tVés a l'última comissió"
+msgstr "g\t\tVés a l'última comissió"
 
 #: gitk:3076
 msgid "/\t\tFocus the search box"
@@ -668,9 +667,8 @@
 msgstr "Coincideix amb tots els criteris d'informació de comissió"
 
 #: gitk:4086
-#, fuzzy
 msgid "Matches no Commit Info criteria"
-msgstr "Coincideix amb tots els criteris d'informació de comissió"
+msgstr "No coincideix amb cap criteri d'informació de comissió"
 
 #: gitk:4087
 msgid "Changes to Files:"
@@ -1310,7 +1308,7 @@
 
 #: gitk:11450
 msgid "Select bg"
-msgstr "fons de la selecció"
+msgstr "Fons de la selecció"
 
 #: gitk:11459
 msgid "Fonts: press to choose"
@@ -1354,6 +1352,8 @@
 "Sorry, gitk cannot run with this version of Tcl/Tk.\n"
 " Gitk requires at least Tcl/Tk 8.4."
 msgstr ""
+"Perdó, el gitk no pot executar-se amb aquesta versió de Tcl/Tk.\n"
+" El Gitk requereix com a mínim el Tcl/Tk 8.4."
 
 #: gitk:12269
 msgid "Cannot find a git repository here."
@@ -1367,6 +1367,3 @@
 #: gitk:12328
 msgid "Bad arguments to gitk:"
 msgstr "Paràmetres dolents al gitk:"
-
-#~ msgid "mc"
-#~ msgstr "mc"
diff --git a/gitk-git/po/de.po b/gitk-git/po/de.po
index 1a3264b..d9ba405 100644
--- a/gitk-git/po/de.po
+++ b/gitk-git/po/de.po
@@ -9,7 +9,7 @@
 "Project-Id-Version: git-gui\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-05-17 14:32+1000\n"
-"PO-Revision-Date: 2010-01-27 20:27+0100\n"
+"PO-Revision-Date: 2015-10-20 14:20+0200\n"
 "Last-Translator: Christian Stimming <stimming@tuhh.de>\n"
 "Language-Team: German\n"
 "Language: \n"
@@ -89,72 +89,72 @@
 msgstr "Abbrechen"
 
 #: gitk:2069
-msgid "Update"
-msgstr "Aktualisieren"
+msgid "&Update"
+msgstr "&Aktualisieren"
 
 #: gitk:2070
-msgid "Reload"
-msgstr "Neu laden"
+msgid "&Reload"
+msgstr "&Neu laden"
 
 #: gitk:2071
-msgid "Reread references"
-msgstr "Zweige neu laden"
+msgid "Reread re&ferences"
+msgstr "&Zweige neu laden"
 
 #: gitk:2072
-msgid "List references"
-msgstr "Zweige/Markierungen auflisten"
+msgid "&List references"
+msgstr "Zweige/Markierungen auf&listen"
 
 #: gitk:2074
-msgid "Start git gui"
-msgstr "»git gui« starten"
+msgid "Start git &gui"
+msgstr "»git &gui« starten"
 
 #: gitk:2076
-msgid "Quit"
-msgstr "Beenden"
+msgid "&Quit"
+msgstr "&Beenden"
 
 #: gitk:2068
-msgid "File"
-msgstr "Datei"
+msgid "&File"
+msgstr "&Datei"
 
 #: gitk:2080
-msgid "Preferences"
-msgstr "Einstellungen"
+msgid "&Preferences"
+msgstr "&Einstellungen"
 
 #: gitk:2079
-msgid "Edit"
-msgstr "Bearbeiten"
+msgid "&Edit"
+msgstr "&Bearbeiten"
 
 #: gitk:2084
-msgid "New view..."
-msgstr "Neue Ansicht ..."
+msgid "&New view..."
+msgstr "&Neue Ansicht ..."
 
 #: gitk:2085
-msgid "Edit view..."
-msgstr "Ansicht bearbeiten ..."
+msgid "&Edit view..."
+msgstr "Ansicht &bearbeiten ..."
 
 #: gitk:2086
-msgid "Delete view"
-msgstr "Ansicht entfernen"
+msgid "&Delete view"
+msgstr "Ansicht &entfernen"
 
 #: gitk:2088 gitk:4043
-msgid "All files"
-msgstr "Alle Dateien"
+msgid "&All files"
+msgstr "&Alle Dateien"
 
 #: gitk:2083 gitk:4067
-msgid "View"
-msgstr "Ansicht"
+msgid "&View"
+msgstr "&Ansicht"
 
 #: gitk:2093 gitk:2103 gitk:3012
-msgid "About gitk"
-msgstr "Über gitk"
+msgid "&About gitk"
+msgstr "Über &gitk"
 
 #: gitk:2094 gitk:2108
-msgid "Key bindings"
-msgstr "Tastenkürzel"
+msgid "&Key bindings"
+msgstr "&Tastenkürzel"
 
 #: gitk:2092 gitk:2107
-msgid "Help"
-msgstr "Hilfe"
+msgid "&Help"
+msgstr "&Hilfe"
 
 #: gitk:2185 gitk:8652
 msgid "SHA1 ID:"
diff --git a/gitk-git/po/es.po b/gitk-git/po/es.po
index 6402a41..ddcb0a5 100644
--- a/gitk-git/po/es.po
+++ b/gitk-git/po/es.po
@@ -91,71 +91,71 @@
 msgstr "Cancelar"
 
 #: gitk:2069
-msgid "Update"
+msgid "&Update"
 msgstr "Actualizar"
 
 #: gitk:2070
-msgid "Reload"
+msgid "&Reload"
 msgstr ""
 
 #: gitk:2071
-msgid "Reread references"
+msgid "Reread re&ferences"
 msgstr "Releer referencias"
 
 #: gitk:2072
-msgid "List references"
+msgid "&List references"
 msgstr "Lista de referencias"
 
 #: gitk:2074
-msgid "Start git gui"
+msgid "Start git &gui"
 msgstr ""
 
 #: gitk:2076
-msgid "Quit"
+msgid "&Quit"
 msgstr "Salir"
 
 #: gitk:2068
-msgid "File"
+msgid "&File"
 msgstr "Archivo"
 
 #: gitk:2080
-msgid "Preferences"
+msgid "&Preferences"
 msgstr "Preferencias"
 
 #: gitk:2079
-msgid "Edit"
+msgid "&Edit"
 msgstr "Editar"
 
 #: gitk:2084
-msgid "New view..."
+msgid "&New view..."
 msgstr "Nueva vista..."
 
 #: gitk:2085
-msgid "Edit view..."
+msgid "&Edit view..."
 msgstr "Modificar vista..."
 
 #: gitk:2086
-msgid "Delete view"
+msgid "&Delete view"
 msgstr "Eliminar vista"
 
 #: gitk:2088 gitk:4043
-msgid "All files"
+msgid "&All files"
 msgstr "Todos los archivos"
 
 #: gitk:2083 gitk:4067
-msgid "View"
+msgid "&View"
 msgstr "Vista"
 
 #: gitk:2093 gitk:2103 gitk:3012
-msgid "About gitk"
+msgid "&About gitk"
 msgstr "Acerca de gitk"
 
 #: gitk:2094 gitk:2108
-msgid "Key bindings"
+msgid "&Key bindings"
 msgstr "Combinaciones de teclas"
 
 #: gitk:2092 gitk:2107
-msgid "Help"
+msgid "&Help"
 msgstr "Ayuda"
 
 #: gitk:2185 gitk:8652
diff --git a/gitk-git/po/fr.po b/gitk-git/po/fr.po
index 6b1f05c..80f72fb 100644
--- a/gitk-git/po/fr.po
+++ b/gitk-git/po/fr.po
@@ -93,71 +93,71 @@
 msgstr "Annuler"
 
 #: gitk:2069
-msgid "Update"
+msgid "&Update"
 msgstr "Mise à jour"
 
 #: gitk:2070
-msgid "Reload"
+msgid "&Reload"
 msgstr "Recharger"
 
 #: gitk:2071
-msgid "Reread references"
+msgid "Reread re&ferences"
 msgstr "Relire les références"
 
 #: gitk:2072
-msgid "List references"
+msgid "&List references"
 msgstr "Lister les références"
 
 #: gitk:2074
-msgid "Start git gui"
+msgid "Start git &gui"
 msgstr "Démarrer git gui"
 
 #: gitk:2076
-msgid "Quit"
+msgid "&Quit"
 msgstr "Quitter"
 
 #: gitk:2068
-msgid "File"
+msgid "&File"
 msgstr "Fichier"
 
 #: gitk:2080
-msgid "Preferences"
+msgid "&Preferences"
 msgstr "Préférences"
 
 #: gitk:2079
-msgid "Edit"
+msgid "&Edit"
 msgstr "Éditer"
 
 #: gitk:2084
-msgid "New view..."
+msgid "&New view..."
 msgstr "Nouvelle vue..."
 
 #: gitk:2085
-msgid "Edit view..."
+msgid "&Edit view..."
 msgstr "Éditer la vue..."
 
 #: gitk:2086
-msgid "Delete view"
+msgid "&Delete view"
 msgstr "Supprimer la vue"
 
 #: gitk:2088 gitk:4043
-msgid "All files"
+msgid "&All files"
 msgstr "Tous les fichiers"
 
 #: gitk:2083 gitk:4067
-msgid "View"
+msgid "&View"
 msgstr "Vue"
 
 #: gitk:2093 gitk:2103 gitk:3012
-msgid "About gitk"
+msgid "&About gitk"
 msgstr "À propos de gitk"
 
 #: gitk:2094 gitk:2108
-msgid "Key bindings"
+msgid "&Key bindings"
 msgstr "Raccourcis clavier"
 
 #: gitk:2092 gitk:2107
-msgid "Help"
+msgid "&Help"
 msgstr "Aide"
 
 #: gitk:2185 gitk:8652
diff --git a/gitk-git/po/hu.po b/gitk-git/po/hu.po
index 00023f1..66fd75b 100644
--- a/gitk-git/po/hu.po
+++ b/gitk-git/po/hu.po
@@ -88,71 +88,71 @@
 msgstr "Visszavonás"
 
 #: gitk:2069
-msgid "Update"
+msgid "&Update"
 msgstr "Frissités"
 
 #: gitk:2070
-msgid "Reload"
+msgid "&Reload"
 msgstr "Újratöltés"
 
 #: gitk:2071
-msgid "Reread references"
+msgid "Reread re&ferences"
 msgstr "Referenciák újraolvasása"
 
 #: gitk:2072
-msgid "List references"
+msgid "&List references"
 msgstr "Referenciák listázása"
 
 #: gitk:2074
-msgid "Start git gui"
+msgid "Start git &gui"
 msgstr "Git gui indítása"
 
 #: gitk:2076
-msgid "Quit"
+msgid "&Quit"
 msgstr "Kilépés"
 
 #: gitk:2068
-msgid "File"
+msgid "&File"
 msgstr "Fájl"
 
 #: gitk:2080
-msgid "Preferences"
+msgid "&Preferences"
 msgstr "Beállítások"
 
 #: gitk:2079
-msgid "Edit"
+msgid "&Edit"
 msgstr "Szerkesztés"
 
 #: gitk:2084
-msgid "New view..."
+msgid "&New view..."
 msgstr "Új nézet ..."
 
 #: gitk:2085
-msgid "Edit view..."
+msgid "&Edit view..."
 msgstr "Nézet szerkesztése ..."
 
 #: gitk:2086
-msgid "Delete view"
+msgid "&Delete view"
 msgstr "Nézet törlése"
 
 #: gitk:2088 gitk:4043
-msgid "All files"
+msgid "&All files"
 msgstr "Minden fájl"
 
 #: gitk:2083 gitk:4067
-msgid "View"
+msgid "&View"
 msgstr "Nézet"
 
 #: gitk:2093 gitk:2103 gitk:3012
-msgid "About gitk"
+msgid "&About gitk"
 msgstr "Gitk névjegy"
 
 #: gitk:2094 gitk:2108
-msgid "Key bindings"
+msgid "&Key bindings"
 msgstr "Billentyűkombináció"
 
 #: gitk:2092 gitk:2107
-msgid "Help"
+msgid "&Help"
 msgstr "Segítség"
 
 #: gitk:2185 gitk:8652
diff --git a/gitk-git/po/it.po b/gitk-git/po/it.po
index b8212b1..b5f002d 100644
--- a/gitk-git/po/it.po
+++ b/gitk-git/po/it.po
@@ -89,71 +89,71 @@
 msgstr "Annulla"
 
 #: gitk:2069
-msgid "Update"
+msgid "&Update"
 msgstr "Aggiorna"
 
 #: gitk:2070
-msgid "Reload"
+msgid "&Reload"
 msgstr "Ricarica"
 
 #: gitk:2071
-msgid "Reread references"
+msgid "Reread re&ferences"
 msgstr "Rileggi riferimenti"
 
 #: gitk:2072
-msgid "List references"
+msgid "&List references"
 msgstr "Elenca riferimenti"
 
 #: gitk:2074
-msgid "Start git gui"
+msgid "Start git &gui"
 msgstr "Avvia git gui"
 
 #: gitk:2076
-msgid "Quit"
+msgid "&Quit"
 msgstr "Esci"
 
 #: gitk:2068
-msgid "File"
-msgstr "File"
+msgid "&File"
+msgstr "&File"
 
 #: gitk:2080
-msgid "Preferences"
+msgid "&Preferences"
 msgstr "Preferenze"
 
 #: gitk:2079
-msgid "Edit"
+msgid "&Edit"
 msgstr "Modifica"
 
 #: gitk:2084
-msgid "New view..."
+msgid "&New view..."
 msgstr "Nuova vista..."
 
 #: gitk:2085
-msgid "Edit view..."
+msgid "&Edit view..."
 msgstr "Modifica vista..."
 
 #: gitk:2086
-msgid "Delete view"
+msgid "&Delete view"
 msgstr "Elimina vista"
 
 #: gitk:2088 gitk:4043
-msgid "All files"
+msgid "&All files"
 msgstr "Tutti i file"
 
 #: gitk:2083 gitk:4067
-msgid "View"
+msgid "&View"
 msgstr "Vista"
 
 #: gitk:2093 gitk:2103 gitk:3012
-msgid "About gitk"
+msgid "&About gitk"
 msgstr "Informazioni su gitk"
 
 #: gitk:2094 gitk:2108
-msgid "Key bindings"
+msgid "&Key bindings"
 msgstr "Scorciatoie da tastiera"
 
 #: gitk:2092 gitk:2107
-msgid "Help"
+msgid "&Help"
 msgstr "Aiuto"
 
 #: gitk:2185 gitk:8652
diff --git a/gitk-git/po/ja.po b/gitk-git/po/ja.po
index 8bbc67f..f143753 100644
--- a/gitk-git/po/ja.po
+++ b/gitk-git/po/ja.po
@@ -1,7 +1,8 @@
 # Japanese translations for gitk package.
-# Copyright (C) 2005-2009 Paul Mackerras
+# Copyright (C) 2005-2015 Paul Mackerras
 # This file is distributed under the same license as the gitk package.
 #
+# YOKOTA Hiroshi <yokota@netlab.cs.tsukuba.ac.jp>, 2015.
 # Mizar <mizar.jp@gmail.com>, 2009.
 # Junio C Hamano <gitster@pobox.com>, 2009.
 msgid ""
@@ -9,10 +10,10 @@
 "Project-Id-Version: gitk\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-05-17 14:32+1000\n"
-"PO-Revision-Date: 2009-11-06 01:45+0900\n"
-"Last-Translator: Mizar <mizar.jp@gmail.com>\n"
+"PO-Revision-Date: 2015-11-12 13:00+0900\n"
+"Last-Translator: YOKOTA Hiroshi <yokota@netlab.cs.tsukuba.ac.jp>\n"
 "Language-Team: Japanese\n"
-"Language: \n"
+"Language: ja\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -24,11 +25,11 @@
 
 #: gitk:212 gitk:2381
 msgid "Color words"
-msgstr ""
+msgstr "変更を着色"
 
-#: gitk:217 gitk:2381 gitk:8220 gitk:8253
+#: gitk:217 gitk:2381 gitk:8221 gitk:8254
 msgid "Markup words"
-msgstr ""
+msgstr "変更をマークアップ"
 
 #: gitk:324
 msgid "Error parsing revisions:"
@@ -60,15 +61,15 @@
 msgid "Reading"
 msgstr "読み込み中"
 
-#: gitk:496 gitk:4525
+#: gitk:496 gitk:4526
 msgid "Reading commits..."
 msgstr "コミット読み込み中..."
 
-#: gitk:499 gitk:1637 gitk:4528
+#: gitk:499 gitk:1637 gitk:4529
 msgid "No commits selected"
 msgstr "コミットが選択されていません"
 
-#: gitk:1445 gitk:4045 gitk:12432
+#: gitk:1445 gitk:4046 gitk:12447
 msgid "Command line"
 msgstr "コマンド行"
 
@@ -80,84 +81,84 @@
 msgid "No commit information available"
 msgstr "有効なコミットの情報がありません"
 
-#: gitk:1903 gitk:1932 gitk:4315 gitk:9669 gitk:11241 gitk:11521
+#: gitk:1903 gitk:1932 gitk:4316 gitk:9684 gitk:11256 gitk:11536
 msgid "OK"
 msgstr "OK"
 
-#: gitk:1934 gitk:4317 gitk:9196 gitk:9275 gitk:9391 gitk:9440 gitk:9671
-#: gitk:11242 gitk:11522
+#: gitk:1934 gitk:4318 gitk:9197 gitk:9276 gitk:9406 gitk:9455 gitk:9686
+#: gitk:11257 gitk:11537
 msgid "Cancel"
 msgstr "キャンセル"
 
 #: gitk:2069
-msgid "Update"
-msgstr "更新"
+msgid "&Update"
+msgstr "更新(&U)"
 
 #: gitk:2070
-msgid "Reload"
-msgstr "リロード"
+msgid "&Reload"
+msgstr "リロード(&R)"
 
 #: gitk:2071
-msgid "Reread references"
-msgstr "リファレンスを再読み込み"
+msgid "Reread re&ferences"
+msgstr "リファレンスを再読み込み(&F)"
 
 #: gitk:2072
-msgid "List references"
-msgstr "リファレンスリストを表示"
+msgid "&List references"
+msgstr "リファレンスリストを表示(&L)"
 
 #: gitk:2074
-msgid "Start git gui"
-msgstr "git gui の開始"
+msgid "Start git &gui"
+msgstr "git gui の開始(&G)"
 
 #: gitk:2076
-msgid "Quit"
-msgstr "終了"
+msgid "&Quit"
+msgstr "終了(&Q)"
 
 #: gitk:2068
-msgid "File"
-msgstr "ファイル"
+msgid "&File"
+msgstr "ファイル(&F)"
 
 #: gitk:2080
-msgid "Preferences"
-msgstr "設定"
+msgid "&Preferences"
+msgstr "設定(&P)"
 
 #: gitk:2079
-msgid "Edit"
-msgstr "編集"
+msgid "&Edit"
+msgstr "編集(&E)"
 
 #: gitk:2084
-msgid "New view..."
-msgstr "新規ビュー..."
+msgid "&New view..."
+msgstr "新規ビュー(&N)..."
 
 #: gitk:2085
-msgid "Edit view..."
-msgstr "ビュー編集..."
+msgid "&Edit view..."
+msgstr "ビュー編集(&E)..."
 
 #: gitk:2086
-msgid "Delete view"
-msgstr "ビュー削除"
+msgid "&Delete view"
+msgstr "ビュー削除(&D)"
 
-#: gitk:2088 gitk:4043
-msgid "All files"
-msgstr "全てのファイル"
+#: gitk:2088
+msgid "&All files"
+msgstr "全てのファイル(&A)"
 
-#: gitk:2083 gitk:4067
-msgid "View"
-msgstr "ビュー"
+#: gitk:2083
+msgid "&View"
+msgstr "ビュー(&V)"
 
-#: gitk:2093 gitk:2103 gitk:3012
-msgid "About gitk"
-msgstr "gitk について"
+#: gitk:2093 gitk:2103
+msgid "&About gitk"
+msgstr "gitk について(&A)"
 
 #: gitk:2094 gitk:2108
-msgid "Key bindings"
-msgstr "キーバインディング"
+msgid "&Key bindings"
+msgstr "キーバインディング(&K)"
 
 #: gitk:2092 gitk:2107
-msgid "Help"
-msgstr "ヘルプ"
+msgid "&Help"
+msgstr "ヘルプ(&H)"
 
-#: gitk:2185 gitk:8652
+#: gitk:2185 gitk:8653
 msgid "SHA1 ID:"
 msgstr "SHA1 ID:"
 
@@ -173,53 +174,53 @@
 msgid "commit"
 msgstr "コミット"
 
-#: gitk:2299 gitk:2301 gitk:4687 gitk:4710 gitk:4734 gitk:6755 gitk:6827
-#: gitk:6912
+#: gitk:2299 gitk:2301 gitk:4688 gitk:4711 gitk:4735 gitk:6756 gitk:6828
+#: gitk:6913
 msgid "containing:"
 msgstr "含む:"
 
-#: gitk:2302 gitk:3526 gitk:3531 gitk:4763
+#: gitk:2302 gitk:3527 gitk:3532 gitk:4764
 msgid "touching paths:"
 msgstr "パスの一部:"
 
-#: gitk:2303 gitk:4777
+#: gitk:2303 gitk:4778
 msgid "adding/removing string:"
-msgstr "追加/除去する文字列:"
+msgstr "追加/除去される文字列:"
 
-#: gitk:2304 gitk:4779
+#: gitk:2304 gitk:4780
 msgid "changing lines matching:"
-msgstr ""
+msgstr "変更される文字列"
 
-#: gitk:2313 gitk:2315 gitk:4766
+#: gitk:2313 gitk:2315 gitk:4767
 msgid "Exact"
 msgstr "英字の大小を区別する"
 
-#: gitk:2315 gitk:4854 gitk:6723
+#: gitk:2315 gitk:4855 gitk:6724
 msgid "IgnCase"
 msgstr "英字の大小を区別しない"
 
-#: gitk:2315 gitk:4736 gitk:4852 gitk:6719
+#: gitk:2315 gitk:4737 gitk:4853 gitk:6720
 msgid "Regexp"
 msgstr "正規表現"
 
-#: gitk:2317 gitk:2318 gitk:4874 gitk:4904 gitk:4911 gitk:6848 gitk:6916
+#: gitk:2317 gitk:2318 gitk:4875 gitk:4905 gitk:4912 gitk:6849 gitk:6917
 msgid "All fields"
 msgstr "全ての項目"
 
-#: gitk:2318 gitk:4871 gitk:4904 gitk:6786
+#: gitk:2318 gitk:4872 gitk:4905 gitk:6787
 msgid "Headline"
 msgstr "ヘッドライン"
 
-#: gitk:2319 gitk:4871 gitk:6786 gitk:6916 gitk:7389
+#: gitk:2319 gitk:4872 gitk:6787 gitk:6917 gitk:7390
 msgid "Comments"
 msgstr "コメント"
 
-#: gitk:2319 gitk:4871 gitk:4876 gitk:4911 gitk:6786 gitk:7324 gitk:8830
-#: gitk:8845
+#: gitk:2319 gitk:4872 gitk:4877 gitk:4912 gitk:6787 gitk:7325 gitk:8831
+#: gitk:8846
 msgid "Author"
 msgstr "作者"
 
-#: gitk:2319 gitk:4871 gitk:6786 gitk:7326
+#: gitk:2319 gitk:4872 gitk:6787 gitk:7327
 msgid "Committer"
 msgstr "コミット者"
 
@@ -247,9 +248,9 @@
 msgid "Ignore space change"
 msgstr "空白の違いを無視"
 
-#: gitk:2378 gitk:2380 gitk:7959 gitk:8206
+#: gitk:2378 gitk:2380 gitk:7960 gitk:8207
 msgid "Line diff"
-msgstr ""
+msgstr "行毎のdiff"
 
 #: gitk:2445
 msgid "Patch"
@@ -259,111 +260,115 @@
 msgid "Tree"
 msgstr "ツリー"
 
-#: gitk:2617 gitk:2637
+#: gitk:2617 gitk:2638
 msgid "Diff this -> selected"
 msgstr "これと選択したコミットのdiffを見る"
 
-#: gitk:2618 gitk:2638
+#: gitk:2618 gitk:2639
 msgid "Diff selected -> this"
 msgstr "選択したコミットとこれのdiffを見る"
 
-#: gitk:2619 gitk:2639
+#: gitk:2619 gitk:2640
 msgid "Make patch"
 msgstr "パッチ作成"
 
-#: gitk:2620 gitk:9254
+#: gitk:2620 gitk:9255
 msgid "Create tag"
 msgstr "タグ生成"
 
-#: gitk:2621 gitk:9371
+#: gitk:2621
+msgid "Copy commit summary"
+msgstr "コミットの要約をコピーする"
+
+#: gitk:2622 gitk:9386
 msgid "Write commit to file"
 msgstr "コミットをファイルに書き出す"
 
-#: gitk:2622 gitk:9428
+#: gitk:2623 gitk:9443
 msgid "Create new branch"
 msgstr "新規ブランチ生成"
 
-#: gitk:2623
+#: gitk:2624
 msgid "Cherry-pick this commit"
 msgstr "このコミットをチェリーピックする"
 
-#: gitk:2624
+#: gitk:2625
 msgid "Reset HEAD branch to here"
 msgstr "ブランチのHEADをここにリセットする"
 
-#: gitk:2625
+#: gitk:2626
 msgid "Mark this commit"
 msgstr "このコミットにマークをつける"
 
-#: gitk:2626
+#: gitk:2627
 msgid "Return to mark"
 msgstr "マークを付けた所に戻る"
 
-#: gitk:2627
+#: gitk:2628
 msgid "Find descendant of this and mark"
 msgstr "これとマークをつけた所との子孫を見つける"
 
-#: gitk:2628
+#: gitk:2629
 msgid "Compare with marked commit"
 msgstr "マークを付けたコミットと比較する"
 
-#: gitk:2629 gitk:2640
-#, fuzzy
+#: gitk:2630 gitk:2641
 msgid "Diff this -> marked commit"
 msgstr "これと選択したコミットのdiffを見る"
 
-#: gitk:2630 gitk:2641
-#, fuzzy
+#: gitk:2631 gitk:2642
 msgid "Diff marked commit -> this"
 msgstr "選択したコミットとこれのdiffを見る"
 
-#: gitk:2631
-#, fuzzy
+#: gitk:2632
 msgid "Revert this commit"
-msgstr "このコミットにマークをつける"
+msgstr "このコミットを撤回する"
 
-#: gitk:2647
+#: gitk:2648
 msgid "Check out this branch"
 msgstr "このブランチをチェックアウトする"
 
-#: gitk:2648
+#: gitk:2649
 msgid "Remove this branch"
 msgstr "このブランチを除去する"
 
-#: gitk:2649
+#: gitk:2650
 msgid "Copy branch name"
-msgstr ""
+msgstr "ブランチ名をコピーする"
 
-#: gitk:2656
+#: gitk:2657
 msgid "Highlight this too"
 msgstr "これもハイライトさせる"
 
-#: gitk:2657
+#: gitk:2658
 msgid "Highlight this only"
 msgstr "これだけをハイライトさせる"
 
-#: gitk:2658
+#: gitk:2659
 msgid "External diff"
 msgstr "外部diffツール"
 
-#: gitk:2659
+#: gitk:2660
 msgid "Blame parent commit"
 msgstr "親コミットから blame をかける"
 
-#: gitk:2660
+#: gitk:2661
 msgid "Copy path"
-msgstr ""
+msgstr "パス名をコピーする"
 
-#: gitk:2667
+#: gitk:2668
 msgid "Show origin of this line"
 msgstr "この行の出自を表示する"
 
-#: gitk:2668
+#: gitk:2669
 msgid "Run git gui blame on this line"
 msgstr "この行に git gui で blame をかける"
 
-#: gitk:3014
-#, fuzzy
+#: gitk:3013
+msgid "About gitk"
+msgstr "gitk について"
+
+#: gitk:3015
 msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
@@ -375,324 +380,327 @@
 "\n"
 "Gitk - gitコミットビューア\n"
 "\n"
-"Copyright \\u00a9 2005-2010 Paul Mackerras\n"
+"Copyright © 2005-2014 Paul Mackerras\n"
 "\n"
 "使用および再配布は GNU General Public License に従ってください"
 
-#: gitk:3022 gitk:3089 gitk:9857
+#: gitk:3023 gitk:3090 gitk:9872
 msgid "Close"
 msgstr "閉じる"
 
-#: gitk:3043
+#: gitk:3044
 msgid "Gitk key bindings"
 msgstr "Gitk キーバインディング"
 
-#: gitk:3046
+#: gitk:3047
 msgid "Gitk key bindings:"
 msgstr "Gitk キーバインディング:"
 
-#: gitk:3048
+#: gitk:3049
 #, tcl-format
 msgid "<%s-Q>\t\tQuit"
 msgstr "<%s-Q>\t\t終了"
 
-#: gitk:3049
-#, fuzzy, tcl-format
-msgid "<%s-W>\t\tClose window"
-msgstr "<%s-F>\t\t検索"
-
 #: gitk:3050
+#, tcl-format
+msgid "<%s-W>\t\tClose window"
+msgstr "<%s-W>\t\tウィンドウを閉じる"
+
+#: gitk:3051
 msgid "<Home>\t\tMove to first commit"
 msgstr "<Home>\t\t最初のコミットに移動"
 
-#: gitk:3051
+#: gitk:3052
 msgid "<End>\t\tMove to last commit"
 msgstr "<End>\t\t最後のコミットに移動"
 
-#: gitk:3052
-#, fuzzy
-msgid "<Up>, p, k\tMove up one commit"
-msgstr "<Up>, p, i\t一つ上のコミットに移動"
-
 #: gitk:3053
-#, fuzzy
-msgid "<Down>, n, j\tMove down one commit"
-msgstr "<Down>, n, k\t一つ下のコミットに移動"
+msgid "<Up>, p, k\tMove up one commit"
+msgstr "<Up>, p, k\t一つ上のコミットに移動"
 
 #: gitk:3054
-#, fuzzy
-msgid "<Left>, z, h\tGo back in history list"
-msgstr "<Left>, z, j\t履歴の前に戻る"
+msgid "<Down>, n, j\tMove down one commit"
+msgstr "<Down>, n, j\t一つ下のコミットに移動"
 
 #: gitk:3055
+msgid "<Left>, z, h\tGo back in history list"
+msgstr "<Left>, z, h\t履歴の前に戻る"
+
+#: gitk:3056
 msgid "<Right>, x, l\tGo forward in history list"
 msgstr "<Right>, x, l\t履歴の次へ進む"
 
-#: gitk:3056
+#: gitk:3057
 #, tcl-format
 msgid "<%s-n>\tGo to n-th parent of current commit in history list"
-msgstr ""
+msgstr "<%s-n(数字)>\t履歴上で現在のコミットの親コミットの内のn(数字)番目のコミットへ移動"
 
-#: gitk:3057
+#: gitk:3058
 msgid "<PageUp>\tMove up one page in commit list"
 msgstr "<PageUp>\tコミットリストの一つ上のページに移動"
 
-#: gitk:3058
+#: gitk:3059
 msgid "<PageDown>\tMove down one page in commit list"
 msgstr "<PageDown>\tコミットリストの一つ下のページに移動"
 
-#: gitk:3059
+#: gitk:3060
 #, tcl-format
 msgid "<%s-Home>\tScroll to top of commit list"
 msgstr "<%s-Home>\tコミットリストの一番上にスクロールする"
 
-#: gitk:3060
+#: gitk:3061
 #, tcl-format
 msgid "<%s-End>\tScroll to bottom of commit list"
 msgstr "<%s-End>\tコミットリストの一番下にスクロールする"
 
-#: gitk:3061
+#: gitk:3062
 #, tcl-format
 msgid "<%s-Up>\tScroll commit list up one line"
 msgstr "<%s-Up>\tコミットリストの一つ下の行にスクロールする"
 
-#: gitk:3062
+#: gitk:3063
 #, tcl-format
 msgid "<%s-Down>\tScroll commit list down one line"
 msgstr "<%s-Down>\tコミットリストの一つ下の行にスクロールする"
 
-#: gitk:3063
+#: gitk:3064
 #, tcl-format
 msgid "<%s-PageUp>\tScroll commit list up one page"
 msgstr "<%s-PageUp>\tコミットリストの上のページにスクロールする"
 
-#: gitk:3064
+#: gitk:3065
 #, tcl-format
 msgid "<%s-PageDown>\tScroll commit list down one page"
 msgstr "<%s-PageDown>\tコミットリストの下のページにスクロールする"
 
-#: gitk:3065
+#: gitk:3066
 msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
 msgstr "<Shift-Up>\t後方を検索 (上方の・新しいコミット)"
 
-#: gitk:3066
+#: gitk:3067
 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
 msgstr "<Shift-Down>\t前方を検索(下方の・古いコミット)"
 
-#: gitk:3067
+#: gitk:3068
 msgid "<Delete>, b\tScroll diff view up one page"
 msgstr "<Delete>, b\tdiff画面を上のページにスクロールする"
 
-#: gitk:3068
+#: gitk:3069
 msgid "<Backspace>\tScroll diff view up one page"
 msgstr "<Backspace>\tdiff画面を上のページにスクロールする"
 
-#: gitk:3069
+#: gitk:3070
 msgid "<Space>\t\tScroll diff view down one page"
 msgstr "<Space>\t\tdiff画面を下のページにスクロールする"
 
-#: gitk:3070
+#: gitk:3071
 msgid "u\t\tScroll diff view up 18 lines"
 msgstr "u\t\tdiff画面を上に18行スクロールする"
 
-#: gitk:3071
+#: gitk:3072
 msgid "d\t\tScroll diff view down 18 lines"
 msgstr "d\t\tdiff画面を下に18行スクロールする"
 
-#: gitk:3072
+#: gitk:3073
 #, tcl-format
 msgid "<%s-F>\t\tFind"
 msgstr "<%s-F>\t\t検索"
 
-#: gitk:3073
+#: gitk:3074
 #, tcl-format
 msgid "<%s-G>\t\tMove to next find hit"
 msgstr "<%s-G>\t\t次を検索して移動"
 
-#: gitk:3074
+#: gitk:3075
 msgid "<Return>\tMove to next find hit"
 msgstr "<Return>\t次を検索して移動"
 
-#: gitk:3075
-#, fuzzy
-msgid "g\t\tGo to commit"
-msgstr "<End>\t\t最後のコミットに移動"
-
 #: gitk:3076
+msgid "g\t\tGo to commit"
+msgstr "g\t\t指定してコミットに移動"
+
+#: gitk:3077
 msgid "/\t\tFocus the search box"
 msgstr "/\t\t検索ボックスにフォーカス"
 
-#: gitk:3077
+#: gitk:3078
 msgid "?\t\tMove to previous find hit"
 msgstr "?\t\t前を検索して移動"
 
-#: gitk:3078
+#: gitk:3079
 msgid "f\t\tScroll diff view to next file"
 msgstr "f\t\t次のファイルにdiff画面をスクロールする"
 
-#: gitk:3079
+#: gitk:3080
 #, tcl-format
 msgid "<%s-S>\t\tSearch for next hit in diff view"
 msgstr "<%s-S>\t\tdiff画面の次を検索"
 
-#: gitk:3080
+#: gitk:3081
 #, tcl-format
 msgid "<%s-R>\t\tSearch for previous hit in diff view"
 msgstr "<%s-R>\t\tdiff画面の前を検索"
 
-#: gitk:3081
+#: gitk:3082
 #, tcl-format
 msgid "<%s-KP+>\tIncrease font size"
 msgstr "<%s-KP+>\t文字サイズを拡大"
 
-#: gitk:3082
+#: gitk:3083
 #, tcl-format
 msgid "<%s-plus>\tIncrease font size"
 msgstr "<%s-plus>\t文字サイズを拡大"
 
-#: gitk:3083
+#: gitk:3084
 #, tcl-format
 msgid "<%s-KP->\tDecrease font size"
 msgstr "<%s-KP->\t文字サイズを縮小"
 
-#: gitk:3084
+#: gitk:3085
 #, tcl-format
 msgid "<%s-minus>\tDecrease font size"
 msgstr "<%s-minus>\t文字サイズを縮小"
 
-#: gitk:3085
+#: gitk:3086
 msgid "<F5>\t\tUpdate"
 msgstr "<F5>\t\t更新"
 
-#: gitk:3550 gitk:3559
+#: gitk:3551 gitk:3560
 #, tcl-format
 msgid "Error creating temporary directory %s:"
 msgstr "一時ディレクトリ %s 生成時エラー:"
 
-#: gitk:3572
+#: gitk:3573
 #, tcl-format
 msgid "Error getting \"%s\" from %s:"
 msgstr "\"%s\" のエラーが %s に発生:"
 
-#: gitk:3635
+#: gitk:3636
 msgid "command failed:"
 msgstr "コマンド失敗:"
 
-#: gitk:3784
+#: gitk:3785
 msgid "No such commit"
 msgstr "そのようなコミットはありません"
 
-#: gitk:3798
+#: gitk:3799
 msgid "git gui blame: command failed:"
 msgstr "git gui blame: コマンド失敗:"
 
-#: gitk:3829
+#: gitk:3830
 #, tcl-format
 msgid "Couldn't read merge head: %s"
 msgstr "マージする HEAD を読み込めません: %s"
 
-#: gitk:3837
+#: gitk:3838
 #, tcl-format
 msgid "Error reading index: %s"
 msgstr "インデックス読み込みエラー: %s"
 
-#: gitk:3862
+#: gitk:3863
 #, tcl-format
 msgid "Couldn't start git blame: %s"
 msgstr "git blame を始められません: %s"
 
-#: gitk:3865 gitk:6754
+#: gitk:3866 gitk:6755
 msgid "Searching"
 msgstr "検索中"
 
-#: gitk:3897
+#: gitk:3898
 #, tcl-format
 msgid "Error running git blame: %s"
 msgstr "git blame 実行エラー: %s"
 
-#: gitk:3925
+#: gitk:3926
 #, tcl-format
 msgid "That line comes from commit %s,  which is not in this view"
 msgstr "コミット %s に由来するその行は、このビューに表示されていません"
 
-#: gitk:3939
+#: gitk:3940
 msgid "External diff viewer failed:"
 msgstr "外部diffビューアが失敗:"
 
-#: gitk:4070
+#: gitk:4044
+msgid "All files"
+msgstr "全てのファイル"
+
+#: gitk:4068
+msgid "View"
+msgstr "ビュー"
+
+#: gitk:4071
 msgid "Gitk view definition"
 msgstr "Gitk ビュー定義"
 
-#: gitk:4074
+#: gitk:4075
 msgid "Remember this view"
 msgstr "このビューを記憶する"
 
-#: gitk:4075
+#: gitk:4076
 msgid "References (space separated list):"
 msgstr "リファレンス(スペース区切りのリスト):"
 
-#: gitk:4076
+#: gitk:4077
 msgid "Branches & tags:"
 msgstr "ブランチ&タグ:"
 
-#: gitk:4077
+#: gitk:4078
 msgid "All refs"
 msgstr "全てのリファレンス"
 
-#: gitk:4078
+#: gitk:4079
 msgid "All (local) branches"
 msgstr "全ての(ローカルな)ブランチ"
 
-#: gitk:4079
+#: gitk:4080
 msgid "All tags"
 msgstr "全てのタグ"
 
-#: gitk:4080
+#: gitk:4081
 msgid "All remote-tracking branches"
 msgstr "全てのリモート追跡ブランチ"
 
-#: gitk:4081
+#: gitk:4082
 msgid "Commit Info (regular expressions):"
 msgstr "コミット情報(正規表現):"
 
-#: gitk:4082
+#: gitk:4083
 msgid "Author:"
 msgstr "作者:"
 
-#: gitk:4083
+#: gitk:4084
 msgid "Committer:"
 msgstr "コミット者:"
 
-#: gitk:4084
+#: gitk:4085
 msgid "Commit Message:"
 msgstr "コミットメッセージ:"
 
-#: gitk:4085
+#: gitk:4086
 msgid "Matches all Commit Info criteria"
 msgstr "コミット情報の全ての条件に一致"
 
-#: gitk:4086
-#, fuzzy
-msgid "Matches no Commit Info criteria"
-msgstr "コミット情報の全ての条件に一致"
-
 #: gitk:4087
+msgid "Matches no Commit Info criteria"
+msgstr "コミット情報の全ての条件に不一致"
+
+#: gitk:4088
 msgid "Changes to Files:"
 msgstr "変更したファイル:"
 
-#: gitk:4088
+#: gitk:4089
 msgid "Fixed String"
 msgstr "固定文字列"
 
-#: gitk:4089
+#: gitk:4090
 msgid "Regular Expression"
 msgstr "正規表現"
 
-#: gitk:4090
+#: gitk:4091
 msgid "Search string:"
 msgstr "検索文字列:"
 
-#: gitk:4091
+#: gitk:4092
 msgid ""
 "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
 "15:27:38\"):"
@@ -700,202 +708,201 @@
 "コミット日時 (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
 "15:27:38\"):"
 
-#: gitk:4092
+#: gitk:4093
 msgid "Since:"
 msgstr "期間の始め:"
 
-#: gitk:4093
+#: gitk:4094
 msgid "Until:"
 msgstr "期間の終わり:"
 
-#: gitk:4094
+#: gitk:4095
 msgid "Limit and/or skip a number of revisions (positive integer):"
 msgstr "制限・省略するリビジョンの数(正の整数):"
 
-#: gitk:4095
+#: gitk:4096
 msgid "Number to show:"
 msgstr "表示する数:"
 
-#: gitk:4096
+#: gitk:4097
 msgid "Number to skip:"
 msgstr "省略する数:"
 
-#: gitk:4097
+#: gitk:4098
 msgid "Miscellaneous options:"
 msgstr "その他のオプション:"
 
-#: gitk:4098
+#: gitk:4099
 msgid "Strictly sort by date"
 msgstr "厳密に日付順で並び替え"
 
-#: gitk:4099
+#: gitk:4100
 msgid "Mark branch sides"
 msgstr "側枝マーク"
 
-#: gitk:4100
+#: gitk:4101
 msgid "Limit to first parent"
 msgstr "最初の親に制限"
 
-#: gitk:4101
+#: gitk:4102
 msgid "Simple history"
 msgstr "簡易な履歴"
 
-#: gitk:4102
+#: gitk:4103
 msgid "Additional arguments to git log:"
 msgstr "git log への追加の引数:"
 
-#: gitk:4103
+#: gitk:4104
 msgid "Enter files and directories to include, one per line:"
 msgstr "含まれるファイル・ディレクトリを一行ごとに入力:"
 
-#: gitk:4104
+#: gitk:4105
 msgid "Command to generate more commits to include:"
 msgstr "コミット追加コマンド:"
 
-#: gitk:4228
+#: gitk:4229
 msgid "Gitk: edit view"
 msgstr "Gitk: ビュー編集"
 
-#: gitk:4236
+#: gitk:4237
 msgid "-- criteria for selecting revisions"
 msgstr "― リビジョンの選択条件"
 
-#: gitk:4241
-#, fuzzy
+#: gitk:4242
 msgid "View Name"
 msgstr "ビュー名:"
 
-#: gitk:4316
+#: gitk:4317
 msgid "Apply (F5)"
 msgstr "適用 (F5)"
 
-#: gitk:4354
+#: gitk:4355
 msgid "Error in commit selection arguments:"
 msgstr "コミット選択引数のエラー:"
 
-#: gitk:4409 gitk:4462 gitk:4924 gitk:4938 gitk:6208 gitk:12373 gitk:12374
+#: gitk:4410 gitk:4463 gitk:4925 gitk:4939 gitk:6209 gitk:12388 gitk:12389
 msgid "None"
 msgstr "無し"
 
-#: gitk:5021 gitk:5026
+#: gitk:5022 gitk:5027
 msgid "Descendant"
 msgstr "子孫"
 
-#: gitk:5022
+#: gitk:5023
 msgid "Not descendant"
 msgstr "非子孫"
 
-#: gitk:5029 gitk:5034
+#: gitk:5030 gitk:5035
 msgid "Ancestor"
 msgstr "祖先"
 
-#: gitk:5030
+#: gitk:5031
 msgid "Not ancestor"
 msgstr "非祖先"
 
-#: gitk:5324
+#: gitk:5325
 msgid "Local changes checked in to index but not committed"
 msgstr "ステージされた、コミット前のローカルな変更"
 
-#: gitk:5360
+#: gitk:5361
 msgid "Local uncommitted changes, not checked in to index"
 msgstr "ステージされていない、コミット前のローカルな変更"
 
-#: gitk:7134
+#: gitk:7135
 msgid "and many more"
-msgstr ""
+msgstr "他多数"
 
-#: gitk:7137
+#: gitk:7138
 msgid "many"
 msgstr "多数"
 
-#: gitk:7328
+#: gitk:7329
 msgid "Tags:"
 msgstr "タグ:"
 
-#: gitk:7345 gitk:7351 gitk:8825
+#: gitk:7346 gitk:7352 gitk:8826
 msgid "Parent"
 msgstr "親"
 
-#: gitk:7356
+#: gitk:7357
 msgid "Child"
 msgstr "子"
 
-#: gitk:7365
+#: gitk:7366
 msgid "Branch"
 msgstr "ブランチ"
 
-#: gitk:7368
+#: gitk:7369
 msgid "Follows"
 msgstr "下位"
 
-#: gitk:7371
+#: gitk:7372
 msgid "Precedes"
 msgstr "上位"
 
-#: gitk:7966
+#: gitk:7967
 #, tcl-format
 msgid "Error getting diffs: %s"
 msgstr "diff取得エラー: %s"
 
-#: gitk:8650
+#: gitk:8651
 msgid "Goto:"
 msgstr "Goto:"
 
-#: gitk:8671
+#: gitk:8672
 #, tcl-format
 msgid "Short SHA1 id %s is ambiguous"
 msgstr "%s を含む SHA1 ID は複数存在します"
 
-#: gitk:8678
+#: gitk:8679
 #, tcl-format
 msgid "Revision %s is not known"
 msgstr "リビジョン %s は不明です"
 
-#: gitk:8688
+#: gitk:8689
 #, tcl-format
 msgid "SHA1 id %s is not known"
 msgstr "SHA1 id %s は不明です"
 
-#: gitk:8690
+#: gitk:8691
 #, tcl-format
 msgid "Revision %s is not in the current view"
 msgstr "リビジョン %s は現在のビューにはありません"
 
-#: gitk:8832 gitk:8847
+#: gitk:8833 gitk:8848
 msgid "Date"
 msgstr "日付"
 
-#: gitk:8835
+#: gitk:8836
 msgid "Children"
 msgstr "子"
 
-#: gitk:8898
+#: gitk:8899
 #, tcl-format
 msgid "Reset %s branch to here"
 msgstr "%s ブランチをここにリセットする"
 
-#: gitk:8900
+#: gitk:8901
 msgid "Detached head: can't reset"
 msgstr "切り離されたHEAD: リセットできません"
 
-#: gitk:9005 gitk:9011
+#: gitk:9006 gitk:9012
 msgid "Skipping merge commit "
 msgstr "コミットマージをスキップ: "
 
-#: gitk:9020 gitk:9025
+#: gitk:9021 gitk:9026
 msgid "Error getting patch ID for "
 msgstr "パッチ取得エラー: ID "
 
-#: gitk:9021 gitk:9026
+#: gitk:9022 gitk:9027
 msgid " - stopping\n"
 msgstr " - 停止\n"
 
-#: gitk:9031 gitk:9034 gitk:9042 gitk:9056 gitk:9065
+#: gitk:9032 gitk:9035 gitk:9043 gitk:9057 gitk:9066
 msgid "Commit "
 msgstr "コミット "
 
-#: gitk:9035
+#: gitk:9036
 msgid ""
 " is the same patch as\n"
 "       "
@@ -903,7 +910,7 @@
 " は下記のパッチと同等\n"
 "       "
 
-#: gitk:9043
+#: gitk:9044
 msgid ""
 " differs from\n"
 "       "
@@ -911,7 +918,7 @@
 " 下記からのdiff\n"
 "       "
 
-#: gitk:9045
+#: gitk:9046
 msgid ""
 "Diff of commits:\n"
 "\n"
@@ -919,131 +926,130 @@
 "コミットのdiff:\n"
 "\n"
 
-#: gitk:9057 gitk:9066
+#: gitk:9058 gitk:9067
 #, tcl-format
 msgid " has %s children - stopping\n"
 msgstr " には %s の子があります - 停止\n"
 
-#: gitk:9085
+#: gitk:9086
 #, tcl-format
 msgid "Error writing commit to file: %s"
 msgstr "ファイルへのコミット書き出しエラー: %s"
 
-#: gitk:9091
+#: gitk:9092
 #, tcl-format
 msgid "Error diffing commits: %s"
 msgstr "コミットのdiff実行エラー: %s"
 
-#: gitk:9137
+#: gitk:9138
 msgid "Top"
 msgstr "Top"
 
-#: gitk:9138
+#: gitk:9139
 msgid "From"
 msgstr "From"
 
-#: gitk:9143
+#: gitk:9144
 msgid "To"
 msgstr "To"
 
-#: gitk:9167
+#: gitk:9168
 msgid "Generate patch"
 msgstr "パッチ生成"
 
-#: gitk:9169
+#: gitk:9170
 msgid "From:"
 msgstr "From:"
 
-#: gitk:9178
+#: gitk:9179
 msgid "To:"
 msgstr "To:"
 
-#: gitk:9187
+#: gitk:9188
 msgid "Reverse"
 msgstr "逆"
 
-#: gitk:9189 gitk:9385
+#: gitk:9190 gitk:9400
 msgid "Output file:"
 msgstr "出力ファイル:"
 
-#: gitk:9195
+#: gitk:9196
 msgid "Generate"
 msgstr "生成"
 
-#: gitk:9233
+#: gitk:9234
 msgid "Error creating patch:"
 msgstr "パッチ生成エラー:"
 
-#: gitk:9256 gitk:9373 gitk:9430
+#: gitk:9257 gitk:9388 gitk:9445
 msgid "ID:"
 msgstr "ID:"
 
-#: gitk:9265
+#: gitk:9266
 msgid "Tag name:"
 msgstr "タグ名:"
 
-#: gitk:9268
+#: gitk:9269
 msgid "Tag message is optional"
-msgstr ""
+msgstr "タグメッセージを付ける事も出来ます"
 
-#: gitk:9270
-#, fuzzy
+#: gitk:9271
 msgid "Tag message:"
-msgstr "タグ名:"
+msgstr "タグメッセージ:"
 
-#: gitk:9274 gitk:9439
+#: gitk:9275 gitk:9454
 msgid "Create"
 msgstr "生成"
 
-#: gitk:9292
+#: gitk:9293
 msgid "No tag name specified"
 msgstr "タグの名称が指定されていません"
 
-#: gitk:9296
+#: gitk:9297
 #, tcl-format
 msgid "Tag \"%s\" already exists"
 msgstr "タグ \"%s\" は既に存在します"
 
-#: gitk:9306
+#: gitk:9307
 msgid "Error creating tag:"
 msgstr "タグ生成エラー:"
 
-#: gitk:9382
+#: gitk:9397
 msgid "Command:"
 msgstr "コマンド:"
 
-#: gitk:9390
+#: gitk:9405
 msgid "Write"
 msgstr "書き出し"
 
-#: gitk:9408
+#: gitk:9423
 msgid "Error writing commit:"
 msgstr "コミット書き出しエラー:"
 
-#: gitk:9435
+#: gitk:9450
 msgid "Name:"
 msgstr "名前:"
 
-#: gitk:9458
+#: gitk:9473
 msgid "Please specify a name for the new branch"
 msgstr "新しいブランチの名前を指定してください"
 
-#: gitk:9463
+#: gitk:9478
 #, tcl-format
 msgid "Branch '%s' already exists. Overwrite?"
 msgstr "ブランチ '%s' は既に存在します。上書きしますか?"
 
-#: gitk:9530
+#: gitk:9545
 #, tcl-format
 msgid "Commit %s is already included in branch %s -- really re-apply it?"
 msgstr ""
 "コミット %s は既にブランチ %s に含まれています ― 本当にこれを再適用しますか?"
 
-#: gitk:9535
+#: gitk:9550
 msgid "Cherry-picking"
 msgstr "チェリーピック中"
 
-#: gitk:9544
+#: gitk:9559
 #, tcl-format
 msgid ""
 "Cherry-pick failed because of local changes to file '%s'.\n"
@@ -1053,7 +1059,7 @@
 "あなたの変更に commit, reset, stash のいずれかを行ってからやり直してくださ"
 "い。"
 
-#: gitk:9550
+#: gitk:9565
 msgid ""
 "Cherry-pick failed because of merge conflict.\n"
 "Do you wish to run git citool to resolve it?"
@@ -1061,62 +1067,56 @@
 "マージの衝突によってチェリーピックは失敗しました。\n"
 "この解決のために git citool を実行したいですか?"
 
-#: gitk:9566 gitk:9624
+#: gitk:9581 gitk:9639
 msgid "No changes committed"
 msgstr "何の変更もコミットされていません"
 
-#: gitk:9593
-#, fuzzy, tcl-format
+#: gitk:9608
+#, tcl-format
 msgid "Commit %s is not included in branch %s -- really revert it?"
-msgstr ""
-"コミット %s は既にブランチ %s に含まれています ― 本当にこれを再適用しますか?"
+msgstr "コミット %s は既にブランチ %s に含まれています ― 本当にこれを撤回しますか?"
 
-#: gitk:9598
-#, fuzzy
+#: gitk:9613
 msgid "Reverting"
-msgstr "リセット中"
+msgstr "撤回中"
 
-#: gitk:9606
-#, fuzzy, tcl-format
+#: gitk:9621
+#, tcl-format
 msgid ""
 "Revert failed because of local changes to the following files:%s Please "
 "commit, reset or stash  your changes and try again."
-msgstr ""
-"ファイル '%s' のローカルな変更のためにチェリーピックは失敗しました。\n"
-"あなたの変更に commit, reset, stash のいずれかを行ってからやり直してくださ"
-"い。"
+msgstr "ファイル '%s' のローカルな変更のために撤回は失敗しました。 あなたの変更に commit, reset, stash のいずれかを行ってからやり直してください。"
 
-#: gitk:9610
-#, fuzzy
+#: gitk:9625
 msgid ""
 "Revert failed because of merge conflict.\n"
 " Do you wish to run git citool to resolve it?"
 msgstr ""
-"マージの衝突によってチェリーピックは失敗しました。\n"
+"マージの衝突によって撤回は失敗しました。\n"
 "この解決のために git citool を実行したいですか?"
 
-#: gitk:9653
+#: gitk:9668
 msgid "Confirm reset"
 msgstr "確認を取り消す"
 
-#: gitk:9655
+#: gitk:9670
 #, tcl-format
 msgid "Reset branch %s to %s?"
 msgstr "ブランチ %s を %s にリセットしますか?"
 
-#: gitk:9657
+#: gitk:9672
 msgid "Reset type:"
 msgstr "Reset タイプ:"
 
-#: gitk:9660
+#: gitk:9675
 msgid "Soft: Leave working tree and index untouched"
 msgstr "Soft: 作業ツリーもインデックスもそのままにする"
 
-#: gitk:9663
+#: gitk:9678
 msgid "Mixed: Leave working tree untouched, reset index"
 msgstr "Mixed: 作業ツリーをそのままにして、インデックスをリセット"
 
-#: gitk:9666
+#: gitk:9681
 msgid ""
 "Hard: Reset working tree and index\n"
 "(discard ALL local changes)"
@@ -1124,19 +1124,19 @@
 "Hard: 作業ツリーやインデックスをリセット\n"
 "(「全ての」ローカルな変更を破棄)"
 
-#: gitk:9683
+#: gitk:9698
 msgid "Resetting"
 msgstr "リセット中"
 
-#: gitk:9743
+#: gitk:9758
 msgid "Checking out"
 msgstr "チェックアウト"
 
-#: gitk:9796
+#: gitk:9811
 msgid "Cannot delete the currently checked-out branch"
 msgstr "現在チェックアウトされているブランチを削除することはできません"
 
-#: gitk:9802
+#: gitk:9817
 #, tcl-format
 msgid ""
 "The commits on branch %s aren't on any other branch.\n"
@@ -1145,16 +1145,16 @@
 "ブランチ %s には他のブランチに存在しないコミットがあります。\n"
 "本当にブランチ %s を削除しますか?"
 
-#: gitk:9833
+#: gitk:9848
 #, tcl-format
 msgid "Tags and heads: %s"
 msgstr "タグとHEAD: %s"
 
-#: gitk:9850
+#: gitk:9865
 msgid "Filter"
 msgstr "フィルター"
 
-#: gitk:10146
+#: gitk:10161
 msgid ""
 "Error reading commit topology information; branch and preceding/following "
 "tag information will be incomplete."
@@ -1162,237 +1162,217 @@
 "コミット構造情報読み込みエラー; ブランチ及び上位/下位のタグ情報が不完全である"
 "ようです。"
 
-#: gitk:11123
+#: gitk:11138
 msgid "Tag"
 msgstr "タグ"
 
-#: gitk:11127
+#: gitk:11142
 msgid "Id"
 msgstr "ID"
 
-#: gitk:11210
+#: gitk:11225
 msgid "Gitk font chooser"
 msgstr "Gitk フォント選択"
 
-#: gitk:11227
+#: gitk:11242
 msgid "B"
 msgstr "B"
 
-#: gitk:11230
+#: gitk:11245
 msgid "I"
 msgstr "I"
 
-#: gitk:11348
+#: gitk:11363
 msgid "Commit list display options"
 msgstr "コミットリスト表示オプション"
 
-#: gitk:11351
+#: gitk:11366
 msgid "Maximum graph width (lines)"
 msgstr "最大グラフ幅(線の本数)"
 
-#: gitk:11355
+#: gitk:11370
 #, no-tcl-format
 msgid "Maximum graph width (% of pane)"
 msgstr "最大グラフ幅(ペインに対する%)"
 
-#: gitk:11358
+#: gitk:11373
 msgid "Show local changes"
 msgstr "ローカルな変更を表示"
 
-#: gitk:11361
-#, fuzzy
+#: gitk:11376
 msgid "Auto-select SHA1 (length)"
-msgstr "SHA1 の自動選択"
+msgstr "SHA1 の自動選択 (選択文字数指定)"
 
-#: gitk:11365
+#: gitk:11380
 msgid "Hide remote refs"
 msgstr "リモートリファレンスを隠す"
 
-#: gitk:11369
+#: gitk:11384
 msgid "Diff display options"
 msgstr "diff表示オプション"
 
-#: gitk:11371
+#: gitk:11386
 msgid "Tab spacing"
 msgstr "タブ空白幅"
 
-#: gitk:11374
-#, fuzzy
+#: gitk:11389
 msgid "Display nearby tags/heads"
-msgstr "近くのタグを表示する"
+msgstr "近くの タグ/head を表示する"
 
-#: gitk:11377
+#: gitk:11392
 msgid "Maximum # tags/heads to show"
-msgstr ""
+msgstr "タグ/head の最大表示数"
 
-#: gitk:11380
+#: gitk:11395
 msgid "Limit diffs to listed paths"
 msgstr "diff をリストのパスに制限"
 
-#: gitk:11383
+#: gitk:11398
 msgid "Support per-file encodings"
 msgstr "ファイルごとのエンコーディングのサポート"
 
-#: gitk:11389 gitk:11536
+#: gitk:11404 gitk:11551
 msgid "External diff tool"
 msgstr "外部diffツール"
 
-#: gitk:11390
+#: gitk:11405
 msgid "Choose..."
 msgstr "選択..."
 
-#: gitk:11395
-#, fuzzy
+#: gitk:11410
 msgid "General options"
-msgstr "パッチ生成"
-
-#: gitk:11398
-msgid "Use themed widgets"
-msgstr ""
-
-#: gitk:11400
-msgid "(change requires restart)"
-msgstr ""
-
-#: gitk:11402
-msgid "(currently unavailable)"
-msgstr ""
+msgstr "全体設定"
 
 #: gitk:11413
+msgid "Use themed widgets"
+msgstr "テーマウィジェットを使用する"
+
+#: gitk:11415
+msgid "(change requires restart)"
+msgstr "(変更には再起動が必要です)"
+
+#: gitk:11417
+msgid "(currently unavailable)"
+msgstr "(現在は使用出来ません)"
+
+#: gitk:11428
 msgid "Colors: press to choose"
 msgstr "色: ボタンを押して選択"
 
-#: gitk:11416
+#: gitk:11431
 msgid "Interface"
 msgstr "インターフェイス"
 
-#: gitk:11417
+#: gitk:11432
 msgid "interface"
 msgstr "インターフェイス"
 
-#: gitk:11420
+#: gitk:11435
 msgid "Background"
 msgstr "背景"
 
-#: gitk:11421 gitk:11451
+#: gitk:11436 gitk:11466
 msgid "background"
 msgstr "背景"
 
-#: gitk:11424
+#: gitk:11439
 msgid "Foreground"
 msgstr "前景"
 
-#: gitk:11425
+#: gitk:11440
 msgid "foreground"
 msgstr "前景"
 
-#: gitk:11428
+#: gitk:11443
 msgid "Diff: old lines"
 msgstr "Diff: 旧バージョン"
 
-#: gitk:11429
+#: gitk:11444
 msgid "diff old lines"
 msgstr "diff 旧バージョン"
 
-#: gitk:11433
+#: gitk:11448
 msgid "Diff: new lines"
 msgstr "Diff: 新バージョン"
 
-#: gitk:11434
+#: gitk:11449
 msgid "diff new lines"
 msgstr "diff 新バージョン"
 
-#: gitk:11438
+#: gitk:11453
 msgid "Diff: hunk header"
 msgstr "Diff: hunkヘッダ"
 
-#: gitk:11440
+#: gitk:11455
 msgid "diff hunk header"
 msgstr "diff hunkヘッダ"
 
-#: gitk:11444
+#: gitk:11459
 msgid "Marked line bg"
 msgstr "マーク行の背景"
 
-#: gitk:11446
+#: gitk:11461
 msgid "marked line background"
 msgstr "マーク行の背景"
 
-#: gitk:11450
+#: gitk:11465
 msgid "Select bg"
 msgstr "選択の背景"
 
-#: gitk:11459
+#: gitk:11474
 msgid "Fonts: press to choose"
 msgstr "フォント: ボタンを押して選択"
 
-#: gitk:11461
+#: gitk:11476
 msgid "Main font"
 msgstr "主フォント"
 
-#: gitk:11462
+#: gitk:11477
 msgid "Diff display font"
 msgstr "Diff表示用フォント"
 
-#: gitk:11463
+#: gitk:11478
 msgid "User interface font"
 msgstr "UI用フォント"
 
-#: gitk:11485
+#: gitk:11500
 msgid "Gitk preferences"
 msgstr "Gitk 設定"
 
-#: gitk:11494
-#, fuzzy
+#: gitk:11509
 msgid "General"
-msgstr "生成"
+msgstr "一般"
 
-#: gitk:11495
+#: gitk:11510
 msgid "Colors"
-msgstr ""
+msgstr "色"
 
-#: gitk:11496
+#: gitk:11511
 msgid "Fonts"
-msgstr ""
+msgstr "フォント"
 
-#: gitk:11546
+#: gitk:11561
 #, tcl-format
 msgid "Gitk: choose color for %s"
 msgstr "Gitk: 「%s」 の色を選択"
 
-#: gitk:12059
+#: gitk:12074
 msgid ""
 "Sorry, gitk cannot run with this version of Tcl/Tk.\n"
 " Gitk requires at least Tcl/Tk 8.4."
 msgstr ""
+"申し訳ありませんが、このバージョンの Tcl/Tk では gitk を実行出来ません。\n"
+"Gitkの実行には Tcl/Tk 8.4 以上が必要です。"
 
-#: gitk:12269
+#: gitk:12284
 msgid "Cannot find a git repository here."
 msgstr "ここにはgitリポジトリがありません。"
 
-#: gitk:12316
+#: gitk:12331
 #, tcl-format
 msgid "Ambiguous argument '%s': both revision and filename"
 msgstr "あいまいな引数 '%s': リビジョンとファイル名の両方に解釈できます"
 
-#: gitk:12328
+#: gitk:12343
 msgid "Bad arguments to gitk:"
 msgstr "gitkへの不正な引数:"
-
-#~ msgid "mc"
-#~ msgstr "mc"
-
-#~ msgid "SHA1 ID: "
-#~ msgstr "SHA1 ID: "
-
-#~ msgid "next"
-#~ msgstr "次"
-
-#~ msgid "prev"
-#~ msgstr "前"
-
-#~ msgid "CDate"
-#~ msgstr "作成日"
-
-#~ msgid "Cannot find the git directory \"%s\"."
-#~ msgstr "gitディレクトリ \"%s\" を見つけられません。"
diff --git a/gitk-git/po/pt_br.po b/gitk-git/po/pt_br.po
index 07e5d63..3f78f1b 100644
--- a/gitk-git/po/pt_br.po
+++ b/gitk-git/po/pt_br.po
@@ -90,71 +90,71 @@
 msgstr "Cancelar"
 
 #: gitk:2069
-msgid "Update"
+msgid "&Update"
 msgstr "Atualizar"
 
 #: gitk:2070
-msgid "Reload"
+msgid "&Reload"
 msgstr "Recarregar"
 
 #: gitk:2071
-msgid "Reread references"
+msgid "Reread re&ferences"
 msgstr "Ler as referências novamente"
 
 #: gitk:2072
-msgid "List references"
+msgid "&List references"
 msgstr "Listar referências"
 
 #: gitk:2074
-msgid "Start git gui"
+msgid "Start git &gui"
 msgstr "Iniciar Git GUI"
 
 #: gitk:2076
-msgid "Quit"
+msgid "&Quit"
 msgstr "Sair"
 
 #: gitk:2068
-msgid "File"
+msgid "&File"
 msgstr "Arquivo"
 
 #: gitk:2080
-msgid "Preferences"
+msgid "&Preferences"
 msgstr "Preferências"
 
 #: gitk:2079
-msgid "Edit"
+msgid "&Edit"
 msgstr "Editar"
 
 #: gitk:2084
-msgid "New view..."
+msgid "&New view..."
 msgstr "Nova vista..."
 
 #: gitk:2085
-msgid "Edit view..."
+msgid "&Edit view..."
 msgstr "Editar vista..."
 
 #: gitk:2086
-msgid "Delete view"
+msgid "&Delete view"
 msgstr "Apagar vista"
 
 #: gitk:2088 gitk:4043
-msgid "All files"
+msgid "&All files"
 msgstr "Todos os arquivos"
 
 #: gitk:2083 gitk:4067
-msgid "View"
+msgid "&View"
 msgstr "Exibir"
 
 #: gitk:2093 gitk:2103 gitk:3012
-msgid "About gitk"
+msgid "&About gitk"
 msgstr "Sobre o gitk"
 
 #: gitk:2094 gitk:2108
-msgid "Key bindings"
+msgid "&Key bindings"
 msgstr "Atalhos de teclado"
 
 #: gitk:2092 gitk:2107
-msgid "Help"
+msgid "&Help"
 msgstr "Ajuda"
 
 #: gitk:2185 gitk:8652
diff --git a/gitk-git/po/ru.po b/gitk-git/po/ru.po
index f1bac87..17ed026 100644
--- a/gitk-git/po/ru.po
+++ b/gitk-git/po/ru.po
@@ -1,18 +1,24 @@
-#
 # Translation of gitk to Russian.
 #
+# Translators:
+# 0xAX <kuleshovmail@gmail.com>, 2014
+# Alex Riesen <raa.lkml@gmail.com>, 2015
+# Dimitriy Ryazantcev <DJm00n@mail.ru>, 2015
+# Dmitry Potapov <dpotapov@gmail.com>, 2009
+# Skip <bsvskip@rambler.ru>, 2011
 msgid ""
 msgstr ""
-"Project-Id-Version: gitk\n"
+"Project-Id-Version: Git Russian Localization Project\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-05-17 14:32+1000\n"
-"PO-Revision-Date: 2009-04-24 16:00+0200\n"
-"Last-Translator: Alex Riesen <raa.lkml@gmail.com>\n"
-"Language-Team: Russian\n"
-"Language: \n"
+"PO-Revision-Date: 2015-10-12 10:14+0000\n"
+"Last-Translator: Dimitriy Ryazantcev <DJm00n@mail.ru>\n"
+"Language-Team: Russian (http://www.transifex.com/djm00n/git-po-ru/language/ru/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: ru\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
 
 #: gitk:140
 msgid "Couldn't get list of unmerged files:"
@@ -20,15 +26,15 @@
 
 #: gitk:212 gitk:2381
 msgid "Color words"
-msgstr ""
+msgstr "Цветные слова"
 
 #: gitk:217 gitk:2381 gitk:8220 gitk:8253
 msgid "Markup words"
-msgstr ""
+msgstr "Помеченые слова"
 
 #: gitk:324
 msgid "Error parsing revisions:"
-msgstr "Ошибка в идентификаторе версии:"
+msgstr "Ошибка при разборе редакции:"
 
 #: gitk:380
 msgid "Error executing --argscmd command:"
@@ -36,17 +42,13 @@
 
 #: gitk:393
 msgid "No files selected: --merge specified but no files are unmerged."
-msgstr ""
-"Файлы не выбраны: указан --merge, но не было найдено ни одного файла где эта "
-"операция должна быть завершена."
+msgstr "Файлы не выбраны: указан --merge, но не было найдено ни одного файла где эта операция должна быть завершена."
 
 #: gitk:396
 msgid ""
 "No files selected: --merge specified but no unmerged files are within file "
 "limit."
-msgstr ""
-"Файлы не выбраны: указан --merge, но в рамках указанного ограничения на "
-"имена файлов нет ни одного где эта операция должна быть завершена."
+msgstr "Файлы не выбраны: указан --merge, но в рамках указанного ограничения на имена файлов нет ни одного где эта операция должна быть завершена."
 
 #: gitk:418 gitk:566
 msgid "Error executing git log:"
@@ -58,7 +60,7 @@
 
 #: gitk:496 gitk:4525
 msgid "Reading commits..."
-msgstr "Чтение версий..."
+msgstr "Чтение коммитов..."
 
 #: gitk:499 gitk:1637 gitk:4528
 msgid "No commits selected"
@@ -74,7 +76,7 @@
 
 #: gitk:1740
 msgid "No commit information available"
-msgstr "Нет информации о состоянии"
+msgstr "Нет информации о коммите"
 
 #: gitk:1903 gitk:1932 gitk:4315 gitk:9669 gitk:11241 gitk:11521
 msgid "OK"
@@ -86,71 +88,71 @@
 msgstr "Отмена"
 
 #: gitk:2069
-msgid "Update"
+msgid "&Update"
 msgstr "Обновить"
 
 #: gitk:2070
-msgid "Reload"
+msgid "&Reload"
 msgstr "Перечитать"
 
 #: gitk:2071
-msgid "Reread references"
+msgid "Reread re&ferences"
 msgstr "Обновить список ссылок"
 
 #: gitk:2072
-msgid "List references"
+msgid "&List references"
 msgstr "Список ссылок"
 
 #: gitk:2074
-msgid "Start git gui"
+msgid "Start git &gui"
 msgstr "Запустить git gui"
 
 #: gitk:2076
-msgid "Quit"
+msgid "&Quit"
 msgstr "Завершить"
 
 #: gitk:2068
-msgid "File"
+msgid "&File"
 msgstr "Файл"
 
 #: gitk:2080
-msgid "Preferences"
+msgid "&Preferences"
 msgstr "Настройки"
 
 #: gitk:2079
-msgid "Edit"
+msgid "&Edit"
 msgstr "Редактировать"
 
 #: gitk:2084
-msgid "New view..."
+msgid "&New view..."
 msgstr "Новое представление..."
 
 #: gitk:2085
-msgid "Edit view..."
+msgid "&Edit view..."
 msgstr "Редактировать представление..."
 
 #: gitk:2086
-msgid "Delete view"
+msgid "&Delete view"
 msgstr "Удалить представление"
 
 #: gitk:2088 gitk:4043
-msgid "All files"
+msgid "&All files"
 msgstr "Все файлы"
 
 #: gitk:2083 gitk:4067
-msgid "View"
+msgid "&View"
 msgstr "Представление"
 
 #: gitk:2093 gitk:2103 gitk:3012
-msgid "About gitk"
+msgid "&About gitk"
 msgstr "О gitk"
 
 #: gitk:2094 gitk:2108
-msgid "Key bindings"
+msgid "&Key bindings"
 msgstr "Назначения клавиатуры"
 
 #: gitk:2092 gitk:2107
-msgid "Help"
+msgid "&Help"
 msgstr "Подсказка"
 
 #: gitk:2185 gitk:8652
@@ -167,7 +169,7 @@
 
 #: gitk:2295
 msgid "commit"
-msgstr "состояние"
+msgstr "коммит"
 
 #: gitk:2299 gitk:2301 gitk:4687 gitk:4710 gitk:4734 gitk:6755 gitk:6827
 #: gitk:6912
@@ -184,7 +186,7 @@
 
 #: gitk:2304 gitk:4779
 msgid "changing lines matching:"
-msgstr ""
+msgstr "изменяя совпадающие строки:"
 
 #: gitk:2313 gitk:2315 gitk:4766
 msgid "Exact"
@@ -217,7 +219,7 @@
 
 #: gitk:2319 gitk:4871 gitk:6786 gitk:7326
 msgid "Committer"
-msgstr "Сохранивший состояние"
+msgstr "Коммитер"
 
 #: gitk:2350
 msgid "Search"
@@ -245,7 +247,7 @@
 
 #: gitk:2378 gitk:2380 gitk:7959 gitk:8206
 msgid "Line diff"
-msgstr ""
+msgstr "Изменения строк"
 
 #: gitk:2445
 msgid "Patch"
@@ -257,11 +259,11 @@
 
 #: gitk:2617 gitk:2637
 msgid "Diff this -> selected"
-msgstr "Сравнить это состояние с выделенным"
+msgstr "Сравнить этот коммит с выделенным"
 
 #: gitk:2618 gitk:2638
 msgid "Diff selected -> this"
-msgstr "Сравнить выделенное с этим состоянием"
+msgstr "Сравнить выделенный с этим коммитом"
 
 #: gitk:2619 gitk:2639
 msgid "Make patch"
@@ -273,63 +275,59 @@
 
 #: gitk:2621 gitk:9371
 msgid "Write commit to file"
-msgstr "Сохранить изменения в файл"
+msgstr "Сохранить коммит в файл"
 
 #: gitk:2622 gitk:9428
 msgid "Create new branch"
-msgstr "Создать ветвь"
+msgstr "Создать ветку"
 
 #: gitk:2623
 msgid "Cherry-pick this commit"
-msgstr "Скопировать это состояние"
+msgstr "Отбор лучшего для этого коммита"
 
 #: gitk:2624
 msgid "Reset HEAD branch to here"
-msgstr "Установить HEAD на это состояние"
+msgstr "Установить HEAD на этот коммит"
 
 #: gitk:2625
-#, fuzzy
 msgid "Mark this commit"
-msgstr "Скопировать это состояние"
+msgstr "Пометить этот коммит"
 
 #: gitk:2626
 msgid "Return to mark"
-msgstr ""
+msgstr "Вернуться на пометку"
 
 #: gitk:2627
 msgid "Find descendant of this and mark"
-msgstr ""
+msgstr "Найти и пометить потомка этого коммита"
 
 #: gitk:2628
 msgid "Compare with marked commit"
-msgstr ""
+msgstr "Сравнить с помеченным коммитом"
 
 #: gitk:2629 gitk:2640
-#, fuzzy
 msgid "Diff this -> marked commit"
-msgstr "Сравнить это состояние с выделенным"
+msgstr "Сравнить выделенное с помеченным коммитом"
 
 #: gitk:2630 gitk:2641
-#, fuzzy
 msgid "Diff marked commit -> this"
-msgstr "Сравнить выделенное с этим состоянием"
+msgstr "Сравнить помеченный с этим коммитом"
 
 #: gitk:2631
-#, fuzzy
 msgid "Revert this commit"
-msgstr "Скопировать это состояние"
+msgstr "Возврат этого коммита"
 
 #: gitk:2647
 msgid "Check out this branch"
-msgstr "Перейти на эту ветвь"
+msgstr "Перейти на эту ветку"
 
 #: gitk:2648
 msgid "Remove this branch"
-msgstr "Удалить эту ветвь"
+msgstr "Удалить эту ветку"
 
 #: gitk:2649
 msgid "Copy branch name"
-msgstr ""
+msgstr "Копировать имя ветки"
 
 #: gitk:2656
 msgid "Highlight this too"
@@ -345,11 +343,11 @@
 
 #: gitk:2659
 msgid "Blame parent commit"
-msgstr "Аннотировать родительское состояние"
+msgstr "Авторы изменений родительского коммита"
 
 #: gitk:2660
 msgid "Copy path"
-msgstr ""
+msgstr "Копировать путь"
 
 #: gitk:2667
 msgid "Show origin of this line"
@@ -360,21 +358,14 @@
 msgstr "Запустить git gui blame для этой строки"
 
 #: gitk:3014
-#, fuzzy
 msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright  2005-2014 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
-msgstr ""
-"\n"
-"Gitk - программа просмотра истории репозиториев Git\n"
-"\n"
-"Copyright \\u00a9 2005-2010 Paul Mackerras\n"
-"\n"
-"Использование и распространение согласно условиям GNU General Public License"
+msgstr "\nGitk - программа просмотра истории репозиториев git\n\n©  2005-2014 Paul Mackerras\n\nИспользование и распространение согласно условиям GNU General Public License"
 
 #: gitk:3022 gitk:3089 gitk:9857
 msgid "Close"
@@ -394,87 +385,84 @@
 msgstr "<%s-Q>\t\tЗавершить"
 
 #: gitk:3049
-#, fuzzy, tcl-format
+#, tcl-format
 msgid "<%s-W>\t\tClose window"
-msgstr "<%s-F>\t\tПоиск"
+msgstr "<%s-W>\t\tЗакрыть окно"
 
 #: gitk:3050
 msgid "<Home>\t\tMove to first commit"
-msgstr "<Home>\t\tПерейти к первому состоянию"
+msgstr "<Home>\t\tПерейти к первому коммиту"
 
 #: gitk:3051
 msgid "<End>\t\tMove to last commit"
-msgstr "<End>\t\tПерейти к последнему состоянию"
+msgstr "<End>\t\tПерейти к последнему коммиту"
 
 #: gitk:3052
-#, fuzzy
 msgid "<Up>, p, k\tMove up one commit"
-msgstr "<Up>, p, i\tПерейти к следующему состоянию"
+msgstr "<Up>, p, k\tПерейти на один коммит вверх"
 
 #: gitk:3053
-#, fuzzy
 msgid "<Down>, n, j\tMove down one commit"
-msgstr "<Down>, n, k\tПерейти к предыдущему состоянию"
+msgstr "<Down>, n, j\tПерейти на один коммит вниз"
 
 #: gitk:3054
-#, fuzzy
 msgid "<Left>, z, h\tGo back in history list"
-msgstr "<Left>, z, j\tПоказать ранее посещённое состояние"
+msgstr "<Left>, z, h\tПоказать ранее посещённое состояние"
 
 #: gitk:3055
 msgid "<Right>, x, l\tGo forward in history list"
-msgstr "<Right>, x, l\tПоказать следующее посещённое состояние"
+msgstr "<Right>, x, l\tПоказать следующий посещённый коммит"
 
 #: gitk:3056
 #, tcl-format
 msgid "<%s-n>\tGo to n-th parent of current commit in history list"
-msgstr ""
+msgstr "<%s-n>\tПерейти на n родителя от текущего коммита"
 
 #: gitk:3057
 msgid "<PageUp>\tMove up one page in commit list"
-msgstr "<PageUp>\tПерейти на страницу выше в списке состояний"
+msgstr "<PageUp>\tПерейти на страницу выше в списке коммитов"
 
 #: gitk:3058
 msgid "<PageDown>\tMove down one page in commit list"
-msgstr "<PageDown>\tПерейти на страницу ниже в списке состояний"
+msgstr "<PageDown>\tПерейти на страницу ниже в списке коммитов"
 
 #: gitk:3059
 #, tcl-format
 msgid "<%s-Home>\tScroll to top of commit list"
-msgstr "<%s-Home>\tПоказать начало списка состояний"
+msgstr "<%s-Home>\tПерейти на начало списка коммитов"
 
 #: gitk:3060
 #, tcl-format
 msgid "<%s-End>\tScroll to bottom of commit list"
-msgstr "<%s-End>\tПоказать конец списка состояний"
+msgstr "<%s-End>\tПерейти на конец списка коммитов"
 
 #: gitk:3061
 #, tcl-format
 msgid "<%s-Up>\tScroll commit list up one line"
-msgstr "<%s-Up>\tПровернуть список состояний вверх"
+msgstr "<%s-Up>\tПровернуть список коммитов вверх"
 
 #: gitk:3062
 #, tcl-format
 msgid "<%s-Down>\tScroll commit list down one line"
-msgstr "<%s-Down>\tПровернуть список состояний вниз"
+msgstr "<%s-Down>\tПровернуть список коммитов вниз"
 
 #: gitk:3063
 #, tcl-format
 msgid "<%s-PageUp>\tScroll commit list up one page"
-msgstr "<%s-PageUp>\tПровернуть список состояний на страницу вверх"
+msgstr "<%s-PageUp>\tПровернуть список коммитов на страницу вверх"
 
 #: gitk:3064
 #, tcl-format
 msgid "<%s-PageDown>\tScroll commit list down one page"
-msgstr "<%s-PageDown>\tПровернуть список состояний на страницу вниз"
+msgstr "<%s-PageDown>\tПровернуть список коммитов на страницу вниз"
 
 #: gitk:3065
 msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
-msgstr "<Shift-Up>\tПоиск в обратном порядке (вверх, среди новых состояний)"
+msgstr "<Shift-Up>\tПоиск в обратном порядке (вверх, среди новых коммитов)"
 
 #: gitk:3066
 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
-msgstr "<Shift-Down>\tПоиск (вниз, среди старых состояний)"
+msgstr "<Shift-Down>\tПоиск (вниз, среди старых коммитов)"
 
 #: gitk:3067
 msgid "<Delete>, b\tScroll diff view up one page"
@@ -504,16 +492,15 @@
 #: gitk:3073
 #, tcl-format
 msgid "<%s-G>\t\tMove to next find hit"
-msgstr "<%s-G>\t\tПерейти к следующему найденному состоянию"
+msgstr "<%s-G>\t\tПерейти к следующему найденному коммиту"
 
 #: gitk:3074
 msgid "<Return>\tMove to next find hit"
-msgstr "<Return>\tПерейти к следующему найденному состоянию"
+msgstr "<Return>\tПерейти к следующему найденному коммиту"
 
 #: gitk:3075
-#, fuzzy
 msgid "g\t\tGo to commit"
-msgstr "<End>\t\tПерейти к последнему состоянию"
+msgstr "g\t\tПерейти на коммит"
 
 #: gitk:3076
 msgid "/\t\tFocus the search box"
@@ -521,7 +508,7 @@
 
 #: gitk:3077
 msgid "?\t\tMove to previous find hit"
-msgstr "?\t\tПерейти к предыдущему найденному состоянию"
+msgstr "?\t\tПерейти к предыдущему найденному коммиту"
 
 #: gitk:3078
 msgid "f\t\tScroll diff view to next file"
@@ -569,7 +556,7 @@
 #: gitk:3572
 #, tcl-format
 msgid "Error getting \"%s\" from %s:"
-msgstr "Ошибка получения \"%s\" из %s:"
+msgstr "Ошибка получения «%s» из %s:"
 
 #: gitk:3635
 msgid "command failed:"
@@ -577,7 +564,7 @@
 
 #: gitk:3784
 msgid "No such commit"
-msgstr "Состояние не найдено"
+msgstr "Коммит не найден"
 
 #: gitk:3798
 msgid "git gui blame: command failed:"
@@ -610,8 +597,7 @@
 #: gitk:3925
 #, tcl-format
 msgid "That line comes from commit %s,  which is not in this view"
-msgstr ""
-"Эта строка принадлежит состоянию %s, которое не показано в этом представлении"
+msgstr "Эта строка принадлежит коммиту %s, который не показан в этом представлении"
 
 #: gitk:3939
 msgid "External diff viewer failed:"
@@ -627,103 +613,97 @@
 
 #: gitk:4075
 msgid "References (space separated list):"
-msgstr ""
+msgstr "Ссылки (разделённые пробелом):"
 
 #: gitk:4076
 msgid "Branches & tags:"
-msgstr ""
+msgstr "Ветки и метки"
 
 #: gitk:4077
-#, fuzzy
 msgid "All refs"
-msgstr "Все файлы"
+msgstr "Все ссылки"
 
 #: gitk:4078
 msgid "All (local) branches"
-msgstr ""
+msgstr "Все (локальные) ветки"
 
 #: gitk:4079
 msgid "All tags"
-msgstr ""
+msgstr "Все метки"
 
 #: gitk:4080
 msgid "All remote-tracking branches"
-msgstr ""
+msgstr "Все внешние отслеживаемые ветки"
 
 #: gitk:4081
 msgid "Commit Info (regular expressions):"
-msgstr ""
+msgstr "Информация о коммите (регулярные выражения):"
 
 #: gitk:4082
-#, fuzzy
 msgid "Author:"
-msgstr "Автор"
+msgstr "Автор:"
 
 #: gitk:4083
-#, fuzzy
 msgid "Committer:"
-msgstr "Сохранивший состояние"
+msgstr "Коммитер:"
 
 #: gitk:4084
 msgid "Commit Message:"
-msgstr ""
+msgstr "Сообщение коммита:"
 
 #: gitk:4085
 msgid "Matches all Commit Info criteria"
-msgstr ""
+msgstr "Совпадает со всеми условиями информации о коммите"
 
 #: gitk:4086
 msgid "Matches no Commit Info criteria"
-msgstr ""
+msgstr "Не совпадает с условиями информации о коммите"
 
 #: gitk:4087
 msgid "Changes to Files:"
-msgstr ""
+msgstr "Изменения файлов:"
 
 #: gitk:4088
 msgid "Fixed String"
-msgstr ""
+msgstr "Обычная строка"
 
 #: gitk:4089
 msgid "Regular Expression"
-msgstr ""
+msgstr "Регулярное выражение:"
 
 #: gitk:4090
-#, fuzzy
 msgid "Search string:"
-msgstr "Поиск"
+msgstr "Строка для поиска:"
 
 #: gitk:4091
 msgid ""
 "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
 "15:27:38\"):"
-msgstr ""
+msgstr "Даты коммита («2 недели назад», «2009-03-17 15:27:38», «17 марта 2009 15:27:38»):"
 
 #: gitk:4092
-#, fuzzy
 msgid "Since:"
 msgstr "С даты:"
 
 #: gitk:4093
-#, fuzzy
 msgid "Until:"
 msgstr "По дату:"
 
 #: gitk:4094
 msgid "Limit and/or skip a number of revisions (positive integer):"
-msgstr ""
+msgstr "Ограничить и/или пропустить количество редакций (положительное число):"
 
 #: gitk:4095
 msgid "Number to show:"
-msgstr ""
+msgstr "Показать количество:"
 
 #: gitk:4096
 msgid "Number to skip:"
-msgstr ""
+msgstr "Пропустить количество:"
 
 #: gitk:4097
 msgid "Miscellaneous options:"
-msgstr ""
+msgstr "Различные опции:"
 
 #: gitk:4098
 msgid "Strictly sort by date"
@@ -731,7 +711,7 @@
 
 #: gitk:4099
 msgid "Mark branch sides"
-msgstr "Отметить стороны ветвей"
+msgstr "Отметить стороны веток"
 
 #: gitk:4100
 msgid "Limit to first parent"
@@ -739,12 +719,11 @@
 
 #: gitk:4101
 msgid "Simple history"
-msgstr ""
+msgstr "Упрощенная история"
 
 #: gitk:4102
-#, fuzzy
 msgid "Additional arguments to git log:"
-msgstr "Включить состояния (аргументы для git-log):"
+msgstr "Дополнительные аргументы для git log:"
 
 #: gitk:4103
 msgid "Enter files and directories to include, one per line:"
@@ -752,21 +731,19 @@
 
 #: gitk:4104
 msgid "Command to generate more commits to include:"
-msgstr "Дополнительная команда для списка состояний:"
+msgstr "Дополнительная команда для списка коммитов:"
 
 #: gitk:4228
 msgid "Gitk: edit view"
-msgstr ""
+msgstr "Gitk: изменить представление"
 
 #: gitk:4236
-#, fuzzy
 msgid "-- criteria for selecting revisions"
-msgstr "Ошибка в идентификаторе версии:"
+msgstr "— критерий поиска редакций"
 
 #: gitk:4241
-#, fuzzy
 msgid "View Name"
-msgstr "Представление"
+msgstr "Имя представления"
 
 #: gitk:4316
 msgid "Apply (F5)"
@@ -774,7 +751,7 @@
 
 #: gitk:4354
 msgid "Error in commit selection arguments:"
-msgstr "Ошибка в параметрах выбора состояний:"
+msgstr "Ошибка в параметрах выбора коммитов:"
 
 #: gitk:4409 gitk:4462 gitk:4924 gitk:4938 gitk:6208 gitk:12373 gitk:12374
 msgid "None"
@@ -798,23 +775,23 @@
 
 #: gitk:5324
 msgid "Local changes checked in to index but not committed"
-msgstr "Изменения зарегистрированные в индексе, но не сохранённые"
+msgstr "Проиндексированные изменения"
 
 #: gitk:5360
 msgid "Local uncommitted changes, not checked in to index"
-msgstr "Изменения в рабочем каталоге, не зарегистрированные в индексе"
+msgstr "Непроиндексированные изменения"
 
 #: gitk:7134
 msgid "and many more"
-msgstr ""
+msgstr "и многое другое"
 
 #: gitk:7137
 msgid "many"
-msgstr ""
+msgstr "много"
 
 #: gitk:7328
 msgid "Tags:"
-msgstr "Таги:"
+msgstr "Метки:"
 
 #: gitk:7345 gitk:7351 gitk:8825
 msgid "Parent"
@@ -826,7 +803,7 @@
 
 #: gitk:7365
 msgid "Branch"
-msgstr "Ветвь"
+msgstr "Ветка"
 
 #: gitk:7368
 msgid "Follows"
@@ -851,9 +828,9 @@
 msgstr "Сокращённый SHA1 идентификатор %s неоднозначен"
 
 #: gitk:8678
-#, fuzzy, tcl-format
+#, tcl-format
 msgid "Revision %s is not known"
-msgstr "SHA1 идентификатор %s не найден"
+msgstr "Редакция %s не найдена"
 
 #: gitk:8688
 #, tcl-format
@@ -863,7 +840,7 @@
 #: gitk:8690
 #, tcl-format
 msgid "Revision %s is not in the current view"
-msgstr ""
+msgstr "Редакция %s не найдена в текущем представлении"
 
 #: gitk:8832 gitk:8847
 msgid "Date"
@@ -876,62 +853,60 @@
 #: gitk:8898
 #, tcl-format
 msgid "Reset %s branch to here"
-msgstr "Установить ветвь %s на это состояние"
+msgstr "Сбросить ветку %s на этот коммит"
 
 #: gitk:8900
 msgid "Detached head: can't reset"
-msgstr "Состояние не принадлежит ни одной ветви, переход невозможен"
+msgstr "Коммит не принадлежит ни одной ветке, сбросить невозможно"
 
 #: gitk:9005 gitk:9011
 msgid "Skipping merge commit "
-msgstr ""
+msgstr "Пропускаю коммит-слияние"
 
 #: gitk:9020 gitk:9025
-#, fuzzy
 msgid "Error getting patch ID for "
-msgstr "Ошибка создания патча:"
+msgstr "Не удалось получить идентификатор патча для "
 
 #: gitk:9021 gitk:9026
 msgid " - stopping\n"
-msgstr ""
+msgstr " — останов\n"
 
 #: gitk:9031 gitk:9034 gitk:9042 gitk:9056 gitk:9065
-#, fuzzy
 msgid "Commit "
-msgstr "состояние"
+msgstr "Коммит"
 
 #: gitk:9035
 msgid ""
 " is the same patch as\n"
 "       "
-msgstr ""
+msgstr " такой же патч, как и\n       "
 
 #: gitk:9043
 msgid ""
 " differs from\n"
 "       "
-msgstr ""
+msgstr " отличается от\n       "
 
 #: gitk:9045
 msgid ""
 "Diff of commits:\n"
 "\n"
-msgstr ""
+msgstr "Различия коммитов:\n\n"
 
 #: gitk:9057 gitk:9066
 #, tcl-format
 msgid " has %s children - stopping\n"
-msgstr ""
+msgstr " является %s потомком — останов\n"
 
 #: gitk:9085
-#, fuzzy, tcl-format
+#, tcl-format
 msgid "Error writing commit to file: %s"
-msgstr "Ошибка сохранения состояния:"
+msgstr "Произошла ошибка при записи коммита в файл: %s"
 
 #: gitk:9091
-#, fuzzy, tcl-format
+#, tcl-format
 msgid "Error diffing commits: %s"
-msgstr "Ошибка сохранения состояния:"
+msgstr "Произошла ошибка при выводе различий коммитов: %s"
 
 #: gitk:9137
 msgid "Top"
@@ -983,12 +958,11 @@
 
 #: gitk:9268
 msgid "Tag message is optional"
-msgstr ""
+msgstr "Описание метки указывать не обязательно"
 
 #: gitk:9270
-#, fuzzy
 msgid "Tag message:"
-msgstr "Имя метки:"
+msgstr "Описание метки:"
 
 #: gitk:9274 gitk:9439
 msgid "Create"
@@ -1001,7 +975,7 @@
 #: gitk:9296
 #, tcl-format
 msgid "Tag \"%s\" already exists"
-msgstr "Метка \"%s\" уже существует"
+msgstr "Метка «%s» уже существует"
 
 #: gitk:9306
 msgid "Error creating tag:"
@@ -1017,7 +991,7 @@
 
 #: gitk:9408
 msgid "Error writing commit:"
-msgstr "Ошибка сохранения состояния:"
+msgstr "Произошла ошибка при записи коммита:"
 
 #: gitk:9435
 msgid "Name:"
@@ -1025,17 +999,17 @@
 
 #: gitk:9458
 msgid "Please specify a name for the new branch"
-msgstr "Укажите имя для новой ветви"
+msgstr "Укажите имя для новой ветки"
 
 #: gitk:9463
 #, tcl-format
 msgid "Branch '%s' already exists. Overwrite?"
-msgstr "Ветвь '%s' уже существует. Переписать?"
+msgstr "Ветка «%s» уже существует. Переписать?"
 
 #: gitk:9530
 #, tcl-format
 msgid "Commit %s is already included in branch %s -- really re-apply it?"
-msgstr "Состояние %s уже принадлежит ветви %s. Продолжить операцию?"
+msgstr "Коммит %s уже включён в ветку %s. Продолжить операцию?"
 
 #: gitk:9535
 msgid "Cherry-picking"
@@ -1046,49 +1020,39 @@
 msgid ""
 "Cherry-pick failed because of local changes to file '%s'.\n"
 "Please commit, reset or stash your changes and try again."
-msgstr ""
-"Копирование невозможно из-за изменений в файле '%s'.\n"
-"Сохраните или отмените изменения и повторите операцию."
+msgstr "Отбор лучшего невозможен из-за изменений в файле «%s».\nЗакомитьте, сбросьте или спрячьте изменения и повторите операцию."
 
 #: gitk:9550
 msgid ""
 "Cherry-pick failed because of merge conflict.\n"
 "Do you wish to run git citool to resolve it?"
-msgstr ""
-"Копирование изменений невозможно из-за незавершённой операции слияния.\n"
-"Запустить git citool для завершения этой операции?"
+msgstr "Копирование изменений невозможно из-за незавершённой операции слияния.\nЗапустить git citool для завершения этой операции?"
 
 #: gitk:9566 gitk:9624
 msgid "No changes committed"
-msgstr "Изменения не сохранены"
+msgstr "Изменения не закоммичены"
 
 #: gitk:9593
-#, fuzzy, tcl-format
+#, tcl-format
 msgid "Commit %s is not included in branch %s -- really revert it?"
-msgstr "Состояние %s уже принадлежит ветви %s. Продолжить операцию?"
+msgstr "Коммит %s не включён в ветку %s. Продолжить операцию?"
 
 #: gitk:9598
-#, fuzzy
 msgid "Reverting"
-msgstr "Установка"
+msgstr "Возврат изменений"
 
 #: gitk:9606
-#, fuzzy, tcl-format
+#, tcl-format
 msgid ""
 "Revert failed because of local changes to the following files:%s Please "
 "commit, reset or stash  your changes and try again."
-msgstr ""
-"Копирование невозможно из-за изменений в файле '%s'.\n"
-"Сохраните или отмените изменения и повторите операцию."
+msgstr "Возврат изменений коммита не удался из-за локальных изменений в указанных файлах: %s\nЗакомитьте, сбросьте или спрячьте изменения и повторите операцию."
 
 #: gitk:9610
-#, fuzzy
 msgid ""
 "Revert failed because of merge conflict.\n"
 " Do you wish to run git citool to resolve it?"
-msgstr ""
-"Копирование изменений невозможно из-за незавершённой операции слияния.\n"
-"Запустить git citool для завершения этой операции?"
+msgstr "Возврат изменений невозможен из-за незавершённой операции слияния.\nЗапустить git citool для завершения этой операции?"
 
 #: gitk:9653
 msgid "Confirm reset"
@@ -1097,7 +1061,7 @@
 #: gitk:9655
 #, tcl-format
 msgid "Reset branch %s to %s?"
-msgstr "Установить ветвь %s на состояние %s?"
+msgstr "Сбросить ветку %s на коммит %s?"
 
 #: gitk:9657
 msgid "Reset type:"
@@ -1115,13 +1079,11 @@
 msgid ""
 "Hard: Reset working tree and index\n"
 "(discard ALL local changes)"
-msgstr ""
-"Жесткий: переписать индекс и рабочий каталог\n"
-"(все изменения в рабочем каталоге будут потеряны)"
+msgstr "Жесткий: переписать индекс и рабочий каталог\n(все изменения в рабочем каталоге будут потеряны)"
 
 #: gitk:9683
 msgid "Resetting"
-msgstr "Установка"
+msgstr "Сброс"
 
 #: gitk:9743
 msgid "Checking out"
@@ -1129,21 +1091,19 @@
 
 #: gitk:9796
 msgid "Cannot delete the currently checked-out branch"
-msgstr "Активная ветвь не может быть удалена"
+msgstr "Активная ветка не может быть удалена"
 
 #: gitk:9802
 #, tcl-format
 msgid ""
 "The commits on branch %s aren't on any other branch.\n"
 "Really delete branch %s?"
-msgstr ""
-"Состояния ветви %s больше не принадлежат никакой другой ветви.\n"
-"Действительно удалить ветвь %s?"
+msgstr "Коммиты из ветки %s не принадлежат больше никакой другой ветке.\nДействительно удалить ветку %s?"
 
 #: gitk:9833
 #, tcl-format
 msgid "Tags and heads: %s"
-msgstr "Метки и ветви: %s"
+msgstr "Метки и ветки: %s"
 
 #: gitk:9850
 msgid "Filter"
@@ -1153,9 +1113,7 @@
 msgid ""
 "Error reading commit topology information; branch and preceding/following "
 "tag information will be incomplete."
-msgstr ""
-"Ошибка чтения истории проекта; информация о ветвях и состояниях вокруг меток "
-"(до/после) может быть неполной."
+msgstr "Ошибка чтения истории проекта; информация о ветках и коммитах вокруг меток (до/после) может быть неполной."
 
 #: gitk:11123
 msgid "Tag"
@@ -1179,7 +1137,7 @@
 
 #: gitk:11348
 msgid "Commit list display options"
-msgstr "Параметры показа списка состояний"
+msgstr "Параметры показа списка коммитов"
 
 #: gitk:11351
 msgid "Maximum graph width (lines)"
@@ -1195,13 +1153,12 @@
 msgstr "Показывать изменения в рабочем каталоге"
 
 #: gitk:11361
-#, fuzzy
 msgid "Auto-select SHA1 (length)"
-msgstr "Выделить SHA1"
+msgstr "Автоматически выделить SHA1 (длинна)"
 
 #: gitk:11365
 msgid "Hide remote refs"
-msgstr ""
+msgstr "Скрыть внешние ссылки"
 
 #: gitk:11369
 msgid "Diff display options"
@@ -1212,13 +1169,12 @@
 msgstr "Ширина табуляции"
 
 #: gitk:11374
-#, fuzzy
 msgid "Display nearby tags/heads"
-msgstr "Показывать близкие метки"
+msgstr "Показывать близкие метки/ветки"
 
 #: gitk:11377
 msgid "Maximum # tags/heads to show"
-msgstr ""
+msgstr "Показывать максимальное количество меток/веток"
 
 #: gitk:11380
 msgid "Limit diffs to listed paths"
@@ -1237,21 +1193,20 @@
 msgstr "Выберите..."
 
 #: gitk:11395
-#, fuzzy
 msgid "General options"
-msgstr "Создать патч"
+msgstr "Общие опции"
 
 #: gitk:11398
 msgid "Use themed widgets"
-msgstr ""
+msgstr "Использовать стили виджетов"
 
 #: gitk:11400
 msgid "(change requires restart)"
-msgstr ""
+msgstr "(изменение потребует перезапуск)"
 
 #: gitk:11402
 msgid "(currently unavailable)"
-msgstr ""
+msgstr "(недоступно в данный момент)"
 
 #: gitk:11413
 msgid "Colors: press to choose"
@@ -1259,12 +1214,11 @@
 
 #: gitk:11416
 msgid "Interface"
-msgstr ""
+msgstr "Интерфейс"
 
 #: gitk:11417
-#, fuzzy
 msgid "interface"
-msgstr "Шрифт интерфейса"
+msgstr "интерфейс"
 
 #: gitk:11420
 msgid "Background"
@@ -1339,17 +1293,16 @@
 msgstr "Настройки Gitk"
 
 #: gitk:11494
-#, fuzzy
 msgid "General"
-msgstr "Создать"
+msgstr "Общие"
 
 #: gitk:11495
 msgid "Colors"
-msgstr ""
+msgstr "Цвета"
 
 #: gitk:11496
 msgid "Fonts"
-msgstr ""
+msgstr "Шрифты"
 
 #: gitk:11546
 #, tcl-format
@@ -1360,9 +1313,7 @@
 msgid ""
 "Sorry, gitk cannot run with this version of Tcl/Tk.\n"
 " Gitk requires at least Tcl/Tk 8.4."
-msgstr ""
-"К сожалению gitk не может работать с этой версий Tcl/Tk.\n"
-"Требуется как минимум Tcl/Tk 8.4."
+msgstr "К сожалению gitk не может работать с этой версий Tcl/Tk.\nТребуется как минимум Tcl/Tk 8.4."
 
 #: gitk:12269
 msgid "Cannot find a git repository here."
@@ -1371,38 +1322,8 @@
 #: gitk:12316
 #, tcl-format
 msgid "Ambiguous argument '%s': both revision and filename"
-msgstr "Неоднозначный аргумент '%s': существует как версия и имя файла"
+msgstr "Неоднозначный аргумент «%s»: существует как редакция и как имя файла"
 
 #: gitk:12328
 msgid "Bad arguments to gitk:"
 msgstr "Неправильные аргументы для gitk:"
-
-#~ msgid "SHA1 ID: "
-#~ msgstr "SHA1:"
-
-#~ msgid "next"
-#~ msgstr "След."
-
-#~ msgid "prev"
-#~ msgstr "Пред."
-
-#~ msgid "Use all refs"
-#~ msgstr "Использовать все ветви"
-
-#~ msgid "Max count:"
-#~ msgstr "Макс. количество:"
-
-#~ msgid "Skip:"
-#~ msgstr "Пропустить:"
-
-#~ msgid "Name"
-#~ msgstr "Имя"
-
-#~ msgid "CDate"
-#~ msgstr "Дата ввода"
-
-#~ msgid "Tag/Head %s is not known"
-#~ msgstr "Метка или ветвь %s не найдена"
-
-#~ msgid "Cannot find the git directory \"%s\"."
-#~ msgstr "Git-репозитарий \"%s\" не найден."
diff --git a/gitk-git/po/sv.po b/gitk-git/po/sv.po
index 0bd46d7..d9d4e87 100644
--- a/gitk-git/po/sv.po
+++ b/gitk-git/po/sv.po
@@ -1,5 +1,5 @@
 # Swedish translation for gitk
-# Copyright (C) 2005-2013 Paul Mackerras
+# Copyright (C) 2005-2015 Paul Mackerras
 # This file is distributed under the same license as the gitk package.
 #
 # Mikael Magnusson <mikachu@gmail.com>, 2008.
@@ -9,8 +9,8 @@
 msgstr ""
 "Project-Id-Version: sv\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-05-17 14:32+1000\n"
-"PO-Revision-Date: 2015-03-27 10:31+0100\n"
+"POT-Creation-Date: 2015-12-09 09:40+0100\n"
+"PO-Revision-Date: 2015-12-11 09:46+0100\n"
 "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 "Language: sv\n"
@@ -28,7 +28,7 @@
 msgid "Color words"
 msgstr "Färga ord"
 
-#: gitk:217 gitk:2381 gitk:8220 gitk:8253
+#: gitk:217 gitk:2381 gitk:8221 gitk:8254
 msgid "Markup words"
 msgstr "Märk upp ord"
 
@@ -62,15 +62,15 @@
 msgid "Reading"
 msgstr "Läser"
 
-#: gitk:496 gitk:4525
+#: gitk:496 gitk:4526
 msgid "Reading commits..."
 msgstr "Läser incheckningar..."
 
-#: gitk:499 gitk:1637 gitk:4528
+#: gitk:499 gitk:1637 gitk:4529
 msgid "No commits selected"
 msgstr "Inga incheckningar markerade"
 
-#: gitk:1445 gitk:4045 gitk:12432
+#: gitk:1445 gitk:4046 gitk:12447
 msgid "Command line"
 msgstr "Kommandorad"
 
@@ -82,84 +82,84 @@
 msgid "No commit information available"
 msgstr "Ingen incheckningsinformation är tillgänglig"
 
-#: gitk:1903 gitk:1932 gitk:4315 gitk:9669 gitk:11241 gitk:11521
+#: gitk:1903 gitk:1932 gitk:4316 gitk:9684 gitk:11256 gitk:11536
 msgid "OK"
 msgstr "OK"
 
-#: gitk:1934 gitk:4317 gitk:9196 gitk:9275 gitk:9391 gitk:9440 gitk:9671
-#: gitk:11242 gitk:11522
+#: gitk:1934 gitk:4318 gitk:9197 gitk:9276 gitk:9406 gitk:9455 gitk:9686
+#: gitk:11257 gitk:11537
 msgid "Cancel"
 msgstr "Avbryt"
 
 #: gitk:2069
-msgid "Update"
-msgstr "Uppdatera"
+msgid "&Update"
+msgstr "&Uppdatera"
 
 #: gitk:2070
-msgid "Reload"
-msgstr "Ladda om"
+msgid "&Reload"
+msgstr "Läs &om"
 
 #: gitk:2071
-msgid "Reread references"
-msgstr "Läs om referenser"
+msgid "Reread re&ferences"
+msgstr "Läs om &referenser"
 
 #: gitk:2072
-msgid "List references"
-msgstr "Visa referenser"
+msgid "&List references"
+msgstr "&Visa referenser"
 
 #: gitk:2074
-msgid "Start git gui"
-msgstr "Starta git gui"
+msgid "Start git &gui"
+msgstr "Starta git &gui"
 
 #: gitk:2076
-msgid "Quit"
-msgstr "Avsluta"
+msgid "&Quit"
+msgstr "&Avsluta"
 
 #: gitk:2068
-msgid "File"
-msgstr "Arkiv"
+msgid "&File"
+msgstr "&Arkiv"
 
 #: gitk:2080
-msgid "Preferences"
-msgstr "Inställningar"
+msgid "&Preferences"
+msgstr "&Inställningar"
 
 #: gitk:2079
-msgid "Edit"
-msgstr "Redigera"
+msgid "&Edit"
+msgstr "&Redigera"
 
 #: gitk:2084
-msgid "New view..."
-msgstr "Ny vy..."
+msgid "&New view..."
+msgstr "&Ny vy..."
 
 #: gitk:2085
-msgid "Edit view..."
-msgstr "Ändra vy..."
+msgid "&Edit view..."
+msgstr "&Ändra vy..."
 
 #: gitk:2086
-msgid "Delete view"
-msgstr "Ta bort vy"
+msgid "&Delete view"
+msgstr "&Ta bort vy"
 
-#: gitk:2088 gitk:4043
-msgid "All files"
-msgstr "Alla filer"
+#: gitk:2088
+msgid "&All files"
+msgstr "&Alla filer"
 
-#: gitk:2083 gitk:4067
-msgid "View"
-msgstr "Visa"
+#: gitk:2083
+msgid "&View"
+msgstr "&Visa"
 
-#: gitk:2093 gitk:2103 gitk:3012
-msgid "About gitk"
-msgstr "Om gitk"
+#: gitk:2093 gitk:2103
+msgid "&About gitk"
+msgstr "&Om gitk"
 
 #: gitk:2094 gitk:2108
-msgid "Key bindings"
-msgstr "Tangentbordsbindningar"
+msgid "&Key bindings"
+msgstr "&Tangentbordsbindningar"
 
 #: gitk:2092 gitk:2107
-msgid "Help"
-msgstr "Hjälp"
+msgid "&Help"
+msgstr "&Hjälp"
 
-#: gitk:2185 gitk:8652
+#: gitk:2185 gitk:8653
 msgid "SHA1 ID:"
 msgstr "SHA1-id:"
 
@@ -175,53 +175,53 @@
 msgid "commit"
 msgstr "incheckning"
 
-#: gitk:2299 gitk:2301 gitk:4687 gitk:4710 gitk:4734 gitk:6755 gitk:6827
-#: gitk:6912
+#: gitk:2299 gitk:2301 gitk:4688 gitk:4711 gitk:4735 gitk:6756 gitk:6828
+#: gitk:6913
 msgid "containing:"
 msgstr "som innehåller:"
 
-#: gitk:2302 gitk:3526 gitk:3531 gitk:4763
+#: gitk:2302 gitk:3527 gitk:3532 gitk:4764
 msgid "touching paths:"
 msgstr "som rör sökväg:"
 
-#: gitk:2303 gitk:4777
+#: gitk:2303 gitk:4778
 msgid "adding/removing string:"
 msgstr "som lägger/till tar bort sträng:"
 
-#: gitk:2304 gitk:4779
+#: gitk:2304 gitk:4780
 msgid "changing lines matching:"
 msgstr "ändrar rader som matchar:"
 
-#: gitk:2313 gitk:2315 gitk:4766
+#: gitk:2313 gitk:2315 gitk:4767
 msgid "Exact"
 msgstr "Exakt"
 
-#: gitk:2315 gitk:4854 gitk:6723
+#: gitk:2315 gitk:4855 gitk:6724
 msgid "IgnCase"
 msgstr "IgnVersaler"
 
-#: gitk:2315 gitk:4736 gitk:4852 gitk:6719
+#: gitk:2315 gitk:4737 gitk:4853 gitk:6720
 msgid "Regexp"
 msgstr "Reg.uttr."
 
-#: gitk:2317 gitk:2318 gitk:4874 gitk:4904 gitk:4911 gitk:6848 gitk:6916
+#: gitk:2317 gitk:2318 gitk:4875 gitk:4905 gitk:4912 gitk:6849 gitk:6917
 msgid "All fields"
 msgstr "Alla fält"
 
-#: gitk:2318 gitk:4871 gitk:4904 gitk:6786
+#: gitk:2318 gitk:4872 gitk:4905 gitk:6787
 msgid "Headline"
 msgstr "Rubrik"
 
-#: gitk:2319 gitk:4871 gitk:6786 gitk:6916 gitk:7389
+#: gitk:2319 gitk:4872 gitk:6787 gitk:6917 gitk:7390
 msgid "Comments"
 msgstr "Kommentarer"
 
-#: gitk:2319 gitk:4871 gitk:4876 gitk:4911 gitk:6786 gitk:7324 gitk:8830
-#: gitk:8845
+#: gitk:2319 gitk:4872 gitk:4877 gitk:4912 gitk:6787 gitk:7325 gitk:8831
+#: gitk:8846
 msgid "Author"
 msgstr "Författare"
 
-#: gitk:2319 gitk:4871 gitk:6786 gitk:7326
+#: gitk:2319 gitk:4872 gitk:6787 gitk:7327
 msgid "Committer"
 msgstr "Incheckare"
 
@@ -249,7 +249,7 @@
 msgid "Ignore space change"
 msgstr "Ignorera ändringar i blanksteg"
 
-#: gitk:2378 gitk:2380 gitk:7959 gitk:8206
+#: gitk:2378 gitk:2380 gitk:7960 gitk:8207
 msgid "Line diff"
 msgstr "Rad-diff"
 
@@ -261,107 +261,115 @@
 msgid "Tree"
 msgstr "Träd"
 
-#: gitk:2617 gitk:2637
+#: gitk:2617 gitk:2638
 msgid "Diff this -> selected"
 msgstr "Diff denna -> markerad"
 
-#: gitk:2618 gitk:2638
+#: gitk:2618 gitk:2639
 msgid "Diff selected -> this"
 msgstr "Diff markerad -> denna"
 
-#: gitk:2619 gitk:2639
+#: gitk:2619 gitk:2640
 msgid "Make patch"
 msgstr "Skapa patch"
 
-#: gitk:2620 gitk:9254
+#: gitk:2620 gitk:9255
 msgid "Create tag"
 msgstr "Skapa tagg"
 
-#: gitk:2621 gitk:9371
+#: gitk:2621
+msgid "Copy commit summary"
+msgstr "Kopiera incheckningssammanfattning"
+
+#: gitk:2622 gitk:9386
 msgid "Write commit to file"
 msgstr "Skriv incheckning till fil"
 
-#: gitk:2622 gitk:9428
+#: gitk:2623 gitk:9443
 msgid "Create new branch"
 msgstr "Skapa ny gren"
 
-#: gitk:2623
+#: gitk:2624
 msgid "Cherry-pick this commit"
 msgstr "Plocka denna incheckning"
 
-#: gitk:2624
+#: gitk:2625
 msgid "Reset HEAD branch to here"
 msgstr "Återställ HEAD-grenen hit"
 
-#: gitk:2625
+#: gitk:2626
 msgid "Mark this commit"
 msgstr "Markera denna incheckning"
 
-#: gitk:2626
+#: gitk:2627
 msgid "Return to mark"
 msgstr "Återgå till markering"
 
-#: gitk:2627
+#: gitk:2628
 msgid "Find descendant of this and mark"
 msgstr "Hitta efterföljare till denna och markera"
 
-#: gitk:2628
+#: gitk:2629
 msgid "Compare with marked commit"
 msgstr "Jämför med markerad incheckning"
 
-#: gitk:2629 gitk:2640
+#: gitk:2630 gitk:2641
 msgid "Diff this -> marked commit"
 msgstr "Diff denna -> markerad incheckning"
 
-#: gitk:2630 gitk:2641
+#: gitk:2631 gitk:2642
 msgid "Diff marked commit -> this"
 msgstr "Diff markerad incheckning -> denna"
 
-#: gitk:2631
+#: gitk:2632
 msgid "Revert this commit"
 msgstr "Ångra denna incheckning"
 
-#: gitk:2647
+#: gitk:2648
 msgid "Check out this branch"
 msgstr "Checka ut denna gren"
 
-#: gitk:2648
+#: gitk:2649
 msgid "Remove this branch"
 msgstr "Ta bort denna gren"
 
-#: gitk:2649
+#: gitk:2650
 msgid "Copy branch name"
-msgstr ""
+msgstr "Kopiera namn på gren"
 
-#: gitk:2656
+#: gitk:2657
 msgid "Highlight this too"
 msgstr "Markera även detta"
 
-#: gitk:2657
+#: gitk:2658
 msgid "Highlight this only"
 msgstr "Markera bara detta"
 
-#: gitk:2658
+#: gitk:2659
 msgid "External diff"
 msgstr "Extern diff"
 
-#: gitk:2659
+#: gitk:2660
 msgid "Blame parent commit"
 msgstr "Klandra föräldraincheckning"
 
-#: gitk:2660
+#: gitk:2661
 msgid "Copy path"
-msgstr ""
+msgstr "Kopiera sökväg"
 
-#: gitk:2667
+#: gitk:2668
 msgid "Show origin of this line"
 msgstr "Visa ursprunget för den här raden"
 
-#: gitk:2668
+#: gitk:2669
 msgid "Run git gui blame on this line"
 msgstr "Kör git gui blame på den här raden"
 
-#: gitk:3014
+#: gitk:3013
+msgid "About gitk"
+msgstr "Om gitk"
+
+#: gitk:3015
 msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
@@ -377,317 +385,323 @@
 "\n"
 "Använd och vidareförmedla enligt villkoren i GNU General Public License"
 
-#: gitk:3022 gitk:3089 gitk:9857
+#: gitk:3023 gitk:3090 gitk:9872
 msgid "Close"
 msgstr "Stäng"
 
-#: gitk:3043
+#: gitk:3044
 msgid "Gitk key bindings"
 msgstr "Tangentbordsbindningar för Gitk"
 
-#: gitk:3046
+#: gitk:3047
 msgid "Gitk key bindings:"
 msgstr "Tangentbordsbindningar för Gitk:"
 
-#: gitk:3048
+#: gitk:3049
 #, tcl-format
 msgid "<%s-Q>\t\tQuit"
 msgstr "<%s-Q>\t\tAvsluta"
 
-#: gitk:3049
+#: gitk:3050
 #, tcl-format
 msgid "<%s-W>\t\tClose window"
 msgstr "<%s-W>\t\tStäng fönster"
 
-#: gitk:3050
+#: gitk:3051
 msgid "<Home>\t\tMove to first commit"
 msgstr "<Home>\t\tGå till första incheckning"
 
-#: gitk:3051
+#: gitk:3052
 msgid "<End>\t\tMove to last commit"
 msgstr "<End>\t\tGå till sista incheckning"
 
-#: gitk:3052
+#: gitk:3053
 msgid "<Up>, p, k\tMove up one commit"
 msgstr "<Upp>, p, k\tGå en incheckning upp"
 
-#: gitk:3053
+#: gitk:3054
 msgid "<Down>, n, j\tMove down one commit"
 msgstr "<Ned>, n, j\tGå en incheckning ned"
 
-#: gitk:3054
+#: gitk:3055
 msgid "<Left>, z, h\tGo back in history list"
 msgstr "<Vänster>, z, h\tGå bakåt i historiken"
 
-#: gitk:3055
+#: gitk:3056
 msgid "<Right>, x, l\tGo forward in history list"
 msgstr "<Höger>, x, l\tGå framåt i historiken"
 
-#: gitk:3056
+#: gitk:3057
 #, tcl-format
 msgid "<%s-n>\tGo to n-th parent of current commit in history list"
 msgstr "<%s-n>\tGå till aktuell inchecknings n:te förälder i historielistan"
 
-#: gitk:3057
+#: gitk:3058
 msgid "<PageUp>\tMove up one page in commit list"
 msgstr "<PageUp>\tGå upp en sida i incheckningslistan"
 
-#: gitk:3058
+#: gitk:3059
 msgid "<PageDown>\tMove down one page in commit list"
 msgstr "<PageDown>\tGå ned en sida i incheckningslistan"
 
-#: gitk:3059
+#: gitk:3060
 #, tcl-format
 msgid "<%s-Home>\tScroll to top of commit list"
 msgstr "<%s-Home>\tRulla till början av incheckningslistan"
 
-#: gitk:3060
+#: gitk:3061
 #, tcl-format
 msgid "<%s-End>\tScroll to bottom of commit list"
 msgstr "<%s-End>\tRulla till slutet av incheckningslistan"
 
-#: gitk:3061
+#: gitk:3062
 #, tcl-format
 msgid "<%s-Up>\tScroll commit list up one line"
 msgstr "<%s-Upp>\tRulla incheckningslistan upp ett steg"
 
-#: gitk:3062
+#: gitk:3063
 #, tcl-format
 msgid "<%s-Down>\tScroll commit list down one line"
 msgstr "<%s-Ned>\tRulla incheckningslistan ned ett steg"
 
-#: gitk:3063
+#: gitk:3064
 #, tcl-format
 msgid "<%s-PageUp>\tScroll commit list up one page"
 msgstr "<%s-PageUp>\tRulla incheckningslistan upp en sida"
 
-#: gitk:3064
+#: gitk:3065
 #, tcl-format
 msgid "<%s-PageDown>\tScroll commit list down one page"
 msgstr "<%s-PageDown>\tRulla incheckningslistan ned en sida"
 
-#: gitk:3065
+#: gitk:3066
 msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
 msgstr "<Skift-Upp>\tSök bakåt (uppåt, senare incheckningar)"
 
-#: gitk:3066
+#: gitk:3067
 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
 msgstr "<Skift-Ned>\tSök framåt (nedåt, tidigare incheckningar)"
 
-#: gitk:3067
+#: gitk:3068
 msgid "<Delete>, b\tScroll diff view up one page"
 msgstr "<Delete>, b\tRulla diffvisningen upp en sida"
 
-#: gitk:3068
+#: gitk:3069
 msgid "<Backspace>\tScroll diff view up one page"
 msgstr "<Baksteg>\tRulla diffvisningen upp en sida"
 
-#: gitk:3069
+#: gitk:3070
 msgid "<Space>\t\tScroll diff view down one page"
 msgstr "<Blanksteg>\tRulla diffvisningen ned en sida"
 
-#: gitk:3070
+#: gitk:3071
 msgid "u\t\tScroll diff view up 18 lines"
 msgstr "u\t\tRulla diffvisningen upp 18 rader"
 
-#: gitk:3071
+#: gitk:3072
 msgid "d\t\tScroll diff view down 18 lines"
 msgstr "d\t\tRulla diffvisningen ned 18 rader"
 
-#: gitk:3072
+#: gitk:3073
 #, tcl-format
 msgid "<%s-F>\t\tFind"
 msgstr "<%s-F>\t\tSök"
 
-#: gitk:3073
+#: gitk:3074
 #, tcl-format
 msgid "<%s-G>\t\tMove to next find hit"
 msgstr "<%s-G>\t\tGå till nästa sökträff"
 
-#: gitk:3074
+#: gitk:3075
 msgid "<Return>\tMove to next find hit"
 msgstr "<Return>\t\tGå till nästa sökträff"
 
-#: gitk:3075
-#, fuzzy
-msgid "g\t\tGo to commit"
-msgstr "<End>\t\tGå till sista incheckning"
-
 #: gitk:3076
+msgid "g\t\tGo to commit"
+msgstr "g\t\tGå till incheckning"
+
+#: gitk:3077
 msgid "/\t\tFocus the search box"
 msgstr "/\t\tFokusera sökrutan"
 
-#: gitk:3077
+#: gitk:3078
 msgid "?\t\tMove to previous find hit"
 msgstr "?\t\tGå till föregående sökträff"
 
-#: gitk:3078
+#: gitk:3079
 msgid "f\t\tScroll diff view to next file"
 msgstr "f\t\tRulla diffvisningen till nästa fil"
 
-#: gitk:3079
+#: gitk:3080
 #, tcl-format
 msgid "<%s-S>\t\tSearch for next hit in diff view"
 msgstr "<%s-S>\t\tGå till nästa sökträff i diffvisningen"
 
-#: gitk:3080
+#: gitk:3081
 #, tcl-format
 msgid "<%s-R>\t\tSearch for previous hit in diff view"
 msgstr "<%s-R>\t\tGå till föregående sökträff i diffvisningen"
 
-#: gitk:3081
+#: gitk:3082
 #, tcl-format
 msgid "<%s-KP+>\tIncrease font size"
 msgstr "<%s-Num+>\tÖka teckenstorlek"
 
-#: gitk:3082
+#: gitk:3083
 #, tcl-format
 msgid "<%s-plus>\tIncrease font size"
 msgstr "<%s-plus>\tÖka teckenstorlek"
 
-#: gitk:3083
+#: gitk:3084
 #, tcl-format
 msgid "<%s-KP->\tDecrease font size"
 msgstr "<%s-Num->\tMinska teckenstorlek"
 
-#: gitk:3084
+#: gitk:3085
 #, tcl-format
 msgid "<%s-minus>\tDecrease font size"
 msgstr "<%s-minus>\tMinska teckenstorlek"
 
-#: gitk:3085
+#: gitk:3086
 msgid "<F5>\t\tUpdate"
 msgstr "<F5>\t\tUppdatera"
 
-#: gitk:3550 gitk:3559
+#: gitk:3551 gitk:3560
 #, tcl-format
 msgid "Error creating temporary directory %s:"
 msgstr "Fel vid skapande av temporär katalog %s:"
 
-#: gitk:3572
+#: gitk:3573
 #, tcl-format
 msgid "Error getting \"%s\" from %s:"
 msgstr "Fel vid hämtning av  \"%s\" från %s:"
 
-#: gitk:3635
+#: gitk:3636
 msgid "command failed:"
 msgstr "kommando misslyckades:"
 
-#: gitk:3784
+#: gitk:3785
 msgid "No such commit"
 msgstr "Incheckning saknas"
 
-#: gitk:3798
+#: gitk:3799
 msgid "git gui blame: command failed:"
 msgstr "git gui blame: kommando misslyckades:"
 
-#: gitk:3829
+#: gitk:3830
 #, tcl-format
 msgid "Couldn't read merge head: %s"
 msgstr "Kunde inte läsa sammanslagningshuvud: %s"
 
-#: gitk:3837
+#: gitk:3838
 #, tcl-format
 msgid "Error reading index: %s"
 msgstr "Fel vid läsning av index: %s"
 
-#: gitk:3862
+#: gitk:3863
 #, tcl-format
 msgid "Couldn't start git blame: %s"
 msgstr "Kunde inte starta git blame: %s"
 
-#: gitk:3865 gitk:6754
+#: gitk:3866 gitk:6755
 msgid "Searching"
 msgstr "Söker"
 
-#: gitk:3897
+#: gitk:3898
 #, tcl-format
 msgid "Error running git blame: %s"
 msgstr "Fel vid körning av git blame: %s"
 
-#: gitk:3925
+#: gitk:3926
 #, tcl-format
 msgid "That line comes from commit %s,  which is not in this view"
 msgstr "Raden kommer från incheckningen %s, som inte finns i denna vy"
 
-#: gitk:3939
+#: gitk:3940
 msgid "External diff viewer failed:"
 msgstr "Externt diff-verktyg misslyckades:"
 
-#: gitk:4070
+#: gitk:4044
+msgid "All files"
+msgstr "Alla filer"
+
+#: gitk:4068
+msgid "View"
+msgstr "Visa"
+
+#: gitk:4071
 msgid "Gitk view definition"
 msgstr "Definition av Gitk-vy"
 
-#: gitk:4074
+#: gitk:4075
 msgid "Remember this view"
 msgstr "Spara denna vy"
 
-#: gitk:4075
+#: gitk:4076
 msgid "References (space separated list):"
 msgstr "Referenser (blankstegsavdelad lista):"
 
-#: gitk:4076
+#: gitk:4077
 msgid "Branches & tags:"
 msgstr "Grenar & taggar:"
 
-#: gitk:4077
+#: gitk:4078
 msgid "All refs"
 msgstr "Alla referenser"
 
-#: gitk:4078
+#: gitk:4079
 msgid "All (local) branches"
 msgstr "Alla (lokala) grenar"
 
-#: gitk:4079
+#: gitk:4080
 msgid "All tags"
 msgstr "Alla taggar"
 
-#: gitk:4080
+#: gitk:4081
 msgid "All remote-tracking branches"
 msgstr "Alla fjärrspårande grenar"
 
-#: gitk:4081
+#: gitk:4082
 msgid "Commit Info (regular expressions):"
 msgstr "Incheckningsinfo (reguljära uttryck):"
 
-#: gitk:4082
+#: gitk:4083
 msgid "Author:"
 msgstr "Författare:"
 
-#: gitk:4083
+#: gitk:4084
 msgid "Committer:"
 msgstr "Incheckare:"
 
-#: gitk:4084
+#: gitk:4085
 msgid "Commit Message:"
 msgstr "Incheckningsmeddelande:"
 
-#: gitk:4085
+#: gitk:4086
 msgid "Matches all Commit Info criteria"
 msgstr "Motsvarar alla kriterier för incheckningsinfo"
 
-#: gitk:4086
-#, fuzzy
+#: gitk:4087
 msgid "Matches no Commit Info criteria"
 msgstr "Motsvarar inga kriterier för incheckningsinfo"
 
-#: gitk:4087
+#: gitk:4088
 msgid "Changes to Files:"
 msgstr "Ändringar av filer:"
 
-#: gitk:4088
+#: gitk:4089
 msgid "Fixed String"
 msgstr "Fast sträng"
 
-#: gitk:4089
+#: gitk:4090
 msgid "Regular Expression"
 msgstr "Reguljärt uttryck"
 
-#: gitk:4090
+#: gitk:4091
 msgid "Search string:"
 msgstr "Söksträng:"
 
-#: gitk:4091
+#: gitk:4092
 msgid ""
 "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
 "15:27:38\"):"
@@ -695,201 +709,201 @@
 "Incheckingsdatum (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
 "15:27:38\"):"
 
-#: gitk:4092
+#: gitk:4093
 msgid "Since:"
 msgstr "Från:"
 
-#: gitk:4093
+#: gitk:4094
 msgid "Until:"
 msgstr "Till:"
 
-#: gitk:4094
+#: gitk:4095
 msgid "Limit and/or skip a number of revisions (positive integer):"
 msgstr "Begränsa och/eller hoppa över ett antal revisioner (positivt heltal):"
 
-#: gitk:4095
+#: gitk:4096
 msgid "Number to show:"
 msgstr "Antal att visa:"
 
-#: gitk:4096
+#: gitk:4097
 msgid "Number to skip:"
 msgstr "Antal att hoppa över:"
 
-#: gitk:4097
+#: gitk:4098
 msgid "Miscellaneous options:"
 msgstr "Diverse alternativ:"
 
-#: gitk:4098
+#: gitk:4099
 msgid "Strictly sort by date"
 msgstr "Strikt datumsortering"
 
-#: gitk:4099
+#: gitk:4100
 msgid "Mark branch sides"
 msgstr "Markera sidogrenar"
 
-#: gitk:4100
+#: gitk:4101
 msgid "Limit to first parent"
 msgstr "Begränsa till första förälder"
 
-#: gitk:4101
+#: gitk:4102
 msgid "Simple history"
 msgstr "Enkel historik"
 
-#: gitk:4102
+#: gitk:4103
 msgid "Additional arguments to git log:"
 msgstr "Ytterligare argument till git log:"
 
-#: gitk:4103
+#: gitk:4104
 msgid "Enter files and directories to include, one per line:"
 msgstr "Ange filer och kataloger att ta med, en per rad:"
 
-#: gitk:4104
+#: gitk:4105
 msgid "Command to generate more commits to include:"
 msgstr "Kommando för att generera fler incheckningar att ta med:"
 
-#: gitk:4228
+#: gitk:4229
 msgid "Gitk: edit view"
 msgstr "Gitk: redigera vy"
 
-#: gitk:4236
+#: gitk:4237
 msgid "-- criteria for selecting revisions"
 msgstr " - kriterier för val av revisioner"
 
-#: gitk:4241
+#: gitk:4242
 msgid "View Name"
 msgstr "Namn på vy"
 
-#: gitk:4316
+#: gitk:4317
 msgid "Apply (F5)"
 msgstr "Använd (F5)"
 
-#: gitk:4354
+#: gitk:4355
 msgid "Error in commit selection arguments:"
 msgstr "Fel i argument för val av incheckningar:"
 
-#: gitk:4409 gitk:4462 gitk:4924 gitk:4938 gitk:6208 gitk:12373 gitk:12374
+#: gitk:4410 gitk:4463 gitk:4925 gitk:4939 gitk:6209 gitk:12388 gitk:12389
 msgid "None"
 msgstr "Inget"
 
-#: gitk:5021 gitk:5026
+#: gitk:5022 gitk:5027
 msgid "Descendant"
 msgstr "Avkomling"
 
-#: gitk:5022
+#: gitk:5023
 msgid "Not descendant"
 msgstr "Inte avkomling"
 
-#: gitk:5029 gitk:5034
+#: gitk:5030 gitk:5035
 msgid "Ancestor"
 msgstr "Förfader"
 
-#: gitk:5030
+#: gitk:5031
 msgid "Not ancestor"
 msgstr "Inte förfader"
 
-#: gitk:5324
+#: gitk:5325
 msgid "Local changes checked in to index but not committed"
 msgstr "Lokala ändringar sparade i indexet men inte incheckade"
 
-#: gitk:5360
+#: gitk:5361
 msgid "Local uncommitted changes, not checked in to index"
 msgstr "Lokala ändringar, ej sparade i indexet"
 
-#: gitk:7134
+#: gitk:7135
 msgid "and many more"
 msgstr "med många flera"
 
-#: gitk:7137
+#: gitk:7138
 msgid "many"
 msgstr "många"
 
-#: gitk:7328
+#: gitk:7329
 msgid "Tags:"
 msgstr "Taggar:"
 
-#: gitk:7345 gitk:7351 gitk:8825
+#: gitk:7346 gitk:7352 gitk:8826
 msgid "Parent"
 msgstr "Förälder"
 
-#: gitk:7356
+#: gitk:7357
 msgid "Child"
 msgstr "Barn"
 
-#: gitk:7365
+#: gitk:7366
 msgid "Branch"
 msgstr "Gren"
 
-#: gitk:7368
+#: gitk:7369
 msgid "Follows"
 msgstr "Följer"
 
-#: gitk:7371
+#: gitk:7372
 msgid "Precedes"
 msgstr "Föregår"
 
-#: gitk:7966
+#: gitk:7967
 #, tcl-format
 msgid "Error getting diffs: %s"
 msgstr "Fel vid hämtning av diff: %s"
 
-#: gitk:8650
+#: gitk:8651
 msgid "Goto:"
 msgstr "Gå till:"
 
-#: gitk:8671
+#: gitk:8672
 #, tcl-format
 msgid "Short SHA1 id %s is ambiguous"
 msgstr "Förkortat SHA1-id %s är tvetydigt"
 
-#: gitk:8678
+#: gitk:8679
 #, tcl-format
 msgid "Revision %s is not known"
 msgstr "Revisionen %s är inte känd"
 
-#: gitk:8688
+#: gitk:8689
 #, tcl-format
 msgid "SHA1 id %s is not known"
 msgstr "SHA-id:t %s är inte känt"
 
-#: gitk:8690
+#: gitk:8691
 #, tcl-format
 msgid "Revision %s is not in the current view"
 msgstr "Revisionen %s finns inte i den nuvarande vyn"
 
-#: gitk:8832 gitk:8847
+#: gitk:8833 gitk:8848
 msgid "Date"
 msgstr "Datum"
 
-#: gitk:8835
+#: gitk:8836
 msgid "Children"
 msgstr "Barn"
 
-#: gitk:8898
+#: gitk:8899
 #, tcl-format
 msgid "Reset %s branch to here"
 msgstr "Återställ grenen %s hit"
 
-#: gitk:8900
+#: gitk:8901
 msgid "Detached head: can't reset"
 msgstr "Frånkopplad head: kan inte återställa"
 
-#: gitk:9005 gitk:9011
+#: gitk:9006 gitk:9012
 msgid "Skipping merge commit "
 msgstr "Hoppar över sammanslagningsincheckning "
 
-#: gitk:9020 gitk:9025
+#: gitk:9021 gitk:9026
 msgid "Error getting patch ID for "
 msgstr "Fel vid hämtning av patch-id för "
 
-#: gitk:9021 gitk:9026
+#: gitk:9022 gitk:9027
 msgid " - stopping\n"
 msgstr " - stannar\n"
 
-#: gitk:9031 gitk:9034 gitk:9042 gitk:9056 gitk:9065
+#: gitk:9032 gitk:9035 gitk:9043 gitk:9057 gitk:9066
 msgid "Commit "
 msgstr "Incheckning "
 
-#: gitk:9035
+#: gitk:9036
 msgid ""
 " is the same patch as\n"
 "       "
@@ -897,7 +911,7 @@
 " är samma patch som\n"
 "       "
 
-#: gitk:9043
+#: gitk:9044
 msgid ""
 " differs from\n"
 "       "
@@ -905,7 +919,7 @@
 " skiljer sig från\n"
 "       "
 
-#: gitk:9045
+#: gitk:9046
 msgid ""
 "Diff of commits:\n"
 "\n"
@@ -913,131 +927,131 @@
 "Skillnad mellan incheckningar:\n"
 "\n"
 
-#: gitk:9057 gitk:9066
+#: gitk:9058 gitk:9067
 #, tcl-format
 msgid " has %s children - stopping\n"
 msgstr " har %s barn - stannar\n"
 
-#: gitk:9085
+#: gitk:9086
 #, tcl-format
 msgid "Error writing commit to file: %s"
 msgstr "Fel vid skrivning av incheckning till fil: %s"
 
-#: gitk:9091
+#: gitk:9092
 #, tcl-format
 msgid "Error diffing commits: %s"
 msgstr "Fel vid jämförelse av incheckningar: %s"
 
-#: gitk:9137
+#: gitk:9138
 msgid "Top"
 msgstr "Topp"
 
-#: gitk:9138
+#: gitk:9139
 msgid "From"
 msgstr "Från"
 
-#: gitk:9143
+#: gitk:9144
 msgid "To"
 msgstr "Till"
 
-#: gitk:9167
+#: gitk:9168
 msgid "Generate patch"
 msgstr "Generera patch"
 
-#: gitk:9169
+#: gitk:9170
 msgid "From:"
 msgstr "Från:"
 
-#: gitk:9178
+#: gitk:9179
 msgid "To:"
 msgstr "Till:"
 
-#: gitk:9187
+#: gitk:9188
 msgid "Reverse"
 msgstr "Vänd"
 
-#: gitk:9189 gitk:9385
+#: gitk:9190 gitk:9400
 msgid "Output file:"
 msgstr "Utdatafil:"
 
-#: gitk:9195
+#: gitk:9196
 msgid "Generate"
 msgstr "Generera"
 
-#: gitk:9233
+#: gitk:9234
 msgid "Error creating patch:"
 msgstr "Fel vid generering av patch:"
 
-#: gitk:9256 gitk:9373 gitk:9430
+#: gitk:9257 gitk:9388 gitk:9445
 msgid "ID:"
 msgstr "Id:"
 
-#: gitk:9265
+#: gitk:9266
 msgid "Tag name:"
 msgstr "Taggnamn:"
 
-#: gitk:9268
+#: gitk:9269
 msgid "Tag message is optional"
 msgstr "Taggmeddelandet är valfritt"
 
-#: gitk:9270
+#: gitk:9271
 msgid "Tag message:"
 msgstr "Taggmeddelande:"
 
-#: gitk:9274 gitk:9439
+#: gitk:9275 gitk:9454
 msgid "Create"
 msgstr "Skapa"
 
-#: gitk:9292
+#: gitk:9293
 msgid "No tag name specified"
 msgstr "Inget taggnamn angavs"
 
-#: gitk:9296
+#: gitk:9297
 #, tcl-format
 msgid "Tag \"%s\" already exists"
 msgstr "Taggen \"%s\" finns redan"
 
-#: gitk:9306
+#: gitk:9307
 msgid "Error creating tag:"
 msgstr "Fel vid skapande av tagg:"
 
-#: gitk:9382
+#: gitk:9397
 msgid "Command:"
 msgstr "Kommando:"
 
-#: gitk:9390
+#: gitk:9405
 msgid "Write"
 msgstr "Skriv"
 
-#: gitk:9408
+#: gitk:9423
 msgid "Error writing commit:"
 msgstr "Fel vid skrivning av incheckning:"
 
-#: gitk:9435
+#: gitk:9450
 msgid "Name:"
 msgstr "Namn:"
 
-#: gitk:9458
+#: gitk:9473
 msgid "Please specify a name for the new branch"
 msgstr "Ange ett namn för den nya grenen"
 
-#: gitk:9463
+#: gitk:9478
 #, tcl-format
 msgid "Branch '%s' already exists. Overwrite?"
 msgstr "Grenen \"%s\" finns redan. Skriva över?"
 
-#: gitk:9530
+#: gitk:9545
 #, tcl-format
 msgid "Commit %s is already included in branch %s -- really re-apply it?"
 msgstr ""
 "Incheckningen %s finns redan på grenen %s -- skall den verkligen appliceras "
 "på nytt?"
 
-#: gitk:9535
+#: gitk:9550
 msgid "Cherry-picking"
 msgstr "Plockar"
 
-#: gitk:9544
+#: gitk:9559
 #, tcl-format
 msgid ""
 "Cherry-pick failed because of local changes to file '%s'.\n"
@@ -1047,7 +1061,7 @@
 "Checka in, återställ eller spara undan (stash) dina ändringar och försök "
 "igen."
 
-#: gitk:9550
+#: gitk:9565
 msgid ""
 "Cherry-pick failed because of merge conflict.\n"
 "Do you wish to run git citool to resolve it?"
@@ -1055,20 +1069,20 @@
 "Cherry-pick misslyckades på grund av en sammanslagningskonflikt.\n"
 "Vill du köra git citool för att lösa den?"
 
-#: gitk:9566 gitk:9624
+#: gitk:9581 gitk:9639
 msgid "No changes committed"
 msgstr "Inga ändringar incheckade"
 
-#: gitk:9593
+#: gitk:9608
 #, tcl-format
 msgid "Commit %s is not included in branch %s -- really revert it?"
 msgstr "Incheckningen %s finns inte på grenen %s -- vill du verkligen ångra?"
 
-#: gitk:9598
+#: gitk:9613
 msgid "Reverting"
 msgstr "Ångrar"
 
-#: gitk:9606
+#: gitk:9621
 #, tcl-format
 msgid ""
 "Revert failed because of local changes to the following files:%s Please "
@@ -1078,7 +1092,7 @@
 "Checka in, återställ eller spara undan (stash) dina ändringar och försök "
 "igen."
 
-#: gitk:9610
+#: gitk:9625
 msgid ""
 "Revert failed because of merge conflict.\n"
 " Do you wish to run git citool to resolve it?"
@@ -1086,28 +1100,28 @@
 "Misslyckades med att ångra på grund av en sammanslagningskonflikt.\n"
 " Vill du köra git citool för att lösa den?"
 
-#: gitk:9653
+#: gitk:9668
 msgid "Confirm reset"
 msgstr "Bekräfta återställning"
 
-#: gitk:9655
+#: gitk:9670
 #, tcl-format
 msgid "Reset branch %s to %s?"
 msgstr "Återställa grenen %s till %s?"
 
-#: gitk:9657
+#: gitk:9672
 msgid "Reset type:"
 msgstr "Typ av återställning:"
 
-#: gitk:9660
+#: gitk:9675
 msgid "Soft: Leave working tree and index untouched"
 msgstr "Mjuk: Rör inte utcheckning och index"
 
-#: gitk:9663
+#: gitk:9678
 msgid "Mixed: Leave working tree untouched, reset index"
 msgstr "Blandad: Rör inte utcheckning, återställ index"
 
-#: gitk:9666
+#: gitk:9681
 msgid ""
 "Hard: Reset working tree and index\n"
 "(discard ALL local changes)"
@@ -1115,19 +1129,19 @@
 "Hård: Återställ utcheckning och index\n"
 "(förkastar ALLA lokala ändringar)"
 
-#: gitk:9683
+#: gitk:9698
 msgid "Resetting"
 msgstr "Återställer"
 
-#: gitk:9743
+#: gitk:9758
 msgid "Checking out"
 msgstr "Checkar ut"
 
-#: gitk:9796
+#: gitk:9811
 msgid "Cannot delete the currently checked-out branch"
 msgstr "Kan inte ta bort den just nu utcheckade grenen"
 
-#: gitk:9802
+#: gitk:9817
 #, tcl-format
 msgid ""
 "The commits on branch %s aren't on any other branch.\n"
@@ -1136,16 +1150,16 @@
 "Incheckningarna på grenen %s existerar inte på någon annan gren.\n"
 "Vill du verkligen ta bort grenen %s?"
 
-#: gitk:9833
+#: gitk:9848
 #, tcl-format
 msgid "Tags and heads: %s"
 msgstr "Taggar och huvuden: %s"
 
-#: gitk:9850
+#: gitk:9865
 msgid "Filter"
 msgstr "Filter"
 
-#: gitk:10146
+#: gitk:10161
 msgid ""
 "Error reading commit topology information; branch and preceding/following "
 "tag information will be incomplete."
@@ -1153,201 +1167,201 @@
 "Fel vid läsning av information om incheckningstopologi; information om "
 "grenar och föregående/senare taggar kommer inte vara komplett."
 
-#: gitk:11123
+#: gitk:11138
 msgid "Tag"
 msgstr "Tagg"
 
-#: gitk:11127
+#: gitk:11142
 msgid "Id"
 msgstr "Id"
 
-#: gitk:11210
+#: gitk:11225
 msgid "Gitk font chooser"
 msgstr "Teckensnittsväljare för Gitk"
 
-#: gitk:11227
+#: gitk:11242
 msgid "B"
 msgstr "F"
 
-#: gitk:11230
+#: gitk:11245
 msgid "I"
 msgstr "K"
 
-#: gitk:11348
+#: gitk:11363
 msgid "Commit list display options"
 msgstr "Alternativ för incheckningslistvy"
 
-#: gitk:11351
+#: gitk:11366
 msgid "Maximum graph width (lines)"
 msgstr "Maximal grafbredd (rader)"
 
-#: gitk:11355
+#: gitk:11370
 #, no-tcl-format
 msgid "Maximum graph width (% of pane)"
 msgstr "Maximal grafbredd (% av ruta)"
 
-#: gitk:11358
+#: gitk:11373
 msgid "Show local changes"
 msgstr "Visa lokala ändringar"
 
-#: gitk:11361
+#: gitk:11376
 msgid "Auto-select SHA1 (length)"
 msgstr "Välj SHA1 (längd) automatiskt"
 
-#: gitk:11365
+#: gitk:11380
 msgid "Hide remote refs"
 msgstr "Dölj fjärr-referenser"
 
-#: gitk:11369
+#: gitk:11384
 msgid "Diff display options"
 msgstr "Alternativ för diffvy"
 
-#: gitk:11371
+#: gitk:11386
 msgid "Tab spacing"
 msgstr "Blanksteg för tabulatortecken"
 
-#: gitk:11374
+#: gitk:11389
 msgid "Display nearby tags/heads"
 msgstr "Visa närliggande taggar/huvuden"
 
-#: gitk:11377
+#: gitk:11392
 msgid "Maximum # tags/heads to show"
 msgstr "Maximalt antal taggar/huvuden att visa"
 
-#: gitk:11380
+#: gitk:11395
 msgid "Limit diffs to listed paths"
 msgstr "Begränsa diff till listade sökvägar"
 
-#: gitk:11383
+#: gitk:11398
 msgid "Support per-file encodings"
 msgstr "Stöd för filspecifika teckenkodningar"
 
-#: gitk:11389 gitk:11536
+#: gitk:11404 gitk:11551
 msgid "External diff tool"
 msgstr "Externt diff-verktyg"
 
-#: gitk:11390
+#: gitk:11405
 msgid "Choose..."
 msgstr "Välj..."
 
-#: gitk:11395
+#: gitk:11410
 msgid "General options"
 msgstr "Allmänna inställningar"
 
-#: gitk:11398
+#: gitk:11413
 msgid "Use themed widgets"
 msgstr "Använd tema på fönsterelement"
 
-#: gitk:11400
+#: gitk:11415
 msgid "(change requires restart)"
 msgstr "(ändringen kräver omstart)"
 
-#: gitk:11402
+#: gitk:11417
 msgid "(currently unavailable)"
 msgstr "(för närvarande inte tillgängligt)"
 
-#: gitk:11413
+#: gitk:11428
 msgid "Colors: press to choose"
 msgstr "Färger: tryck för att välja"
 
-#: gitk:11416
+#: gitk:11431
 msgid "Interface"
 msgstr "Gränssnitt"
 
-#: gitk:11417
+#: gitk:11432
 msgid "interface"
 msgstr "gränssnitt"
 
-#: gitk:11420
+#: gitk:11435
 msgid "Background"
 msgstr "Bakgrund"
 
-#: gitk:11421 gitk:11451
+#: gitk:11436 gitk:11466
 msgid "background"
 msgstr "bakgrund"
 
-#: gitk:11424
+#: gitk:11439
 msgid "Foreground"
 msgstr "Förgrund"
 
-#: gitk:11425
+#: gitk:11440
 msgid "foreground"
 msgstr "förgrund"
 
-#: gitk:11428
+#: gitk:11443
 msgid "Diff: old lines"
 msgstr "Diff: gamla rader"
 
-#: gitk:11429
+#: gitk:11444
 msgid "diff old lines"
 msgstr "diff gamla rader"
 
-#: gitk:11433
+#: gitk:11448
 msgid "Diff: new lines"
 msgstr "Diff: nya rader"
 
-#: gitk:11434
+#: gitk:11449
 msgid "diff new lines"
 msgstr "diff nya rader"
 
-#: gitk:11438
+#: gitk:11453
 msgid "Diff: hunk header"
 msgstr "Diff: delhuvud"
 
-#: gitk:11440
+#: gitk:11455
 msgid "diff hunk header"
 msgstr "diff delhuvud"
 
-#: gitk:11444
+#: gitk:11459
 msgid "Marked line bg"
 msgstr "Markerad rad bakgrund"
 
-#: gitk:11446
+#: gitk:11461
 msgid "marked line background"
 msgstr "markerad rad bakgrund"
 
-#: gitk:11450
+#: gitk:11465
 msgid "Select bg"
 msgstr "Markerad bakgrund"
 
-#: gitk:11459
+#: gitk:11474
 msgid "Fonts: press to choose"
 msgstr "Teckensnitt: tryck för att välja"
 
-#: gitk:11461
+#: gitk:11476
 msgid "Main font"
 msgstr "Huvudteckensnitt"
 
-#: gitk:11462
+#: gitk:11477
 msgid "Diff display font"
 msgstr "Teckensnitt för diffvisning"
 
-#: gitk:11463
+#: gitk:11478
 msgid "User interface font"
 msgstr "Teckensnitt för användargränssnitt"
 
-#: gitk:11485
+#: gitk:11500
 msgid "Gitk preferences"
 msgstr "Inställningar för Gitk"
 
-#: gitk:11494
+#: gitk:11509
 msgid "General"
 msgstr "Allmänt"
 
-#: gitk:11495
+#: gitk:11510
 msgid "Colors"
 msgstr "Färger"
 
-#: gitk:11496
+#: gitk:11511
 msgid "Fonts"
 msgstr "Teckensnitt"
 
-#: gitk:11546
+#: gitk:11561
 #, tcl-format
 msgid "Gitk: choose color for %s"
 msgstr "Gitk: välj färg för %s"
 
-#: gitk:12059
+#: gitk:12074
 msgid ""
 "Sorry, gitk cannot run with this version of Tcl/Tk.\n"
 " Gitk requires at least Tcl/Tk 8.4."
@@ -1355,16 +1369,16 @@
 "Gitk kan tyvärr inte köra med denna version av Tcl/Tk.\n"
 " Gitk kräver åtminstone Tcl/Tk 8.4."
 
-#: gitk:12269
+#: gitk:12284
 msgid "Cannot find a git repository here."
 msgstr "Hittar inget git-arkiv här."
 
-#: gitk:12316
+#: gitk:12331
 #, tcl-format
 msgid "Ambiguous argument '%s': both revision and filename"
 msgstr "Tvetydigt argument \"%s\": både revision och filnamn"
 
-#: gitk:12328
+#: gitk:12343
 msgid "Bad arguments to gitk:"
 msgstr "Felaktiga argument till gitk:"
 
diff --git a/gitk-git/po/vi.po b/gitk-git/po/vi.po
index 7133c42..8966812 100644
--- a/gitk-git/po/vi.po
+++ b/gitk-git/po/vi.po
@@ -1,14 +1,14 @@
 # Vietnamese translations for gitk package.
 # Bản dịch tiếng Việt cho gói gitk.
 # This file is distributed under the same license as the gitk package.
-# Trần Ngọc Quân <vnwildman@gmail.com>, 2013.
+# Trần Ngọc Quân <vnwildman@gmail.com>, 2013, 2015.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: gitk @@GIT_VERSION@@\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-05-17 14:32+1000\n"
-"PO-Revision-Date: 2013-12-14 14:40+0700\n"
+"PO-Revision-Date: 2015-09-15 07:33+0700\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
 "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
 "Language: vi\n"
@@ -16,6 +16,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Gtranslator 2.91.7\n"
 
 #: gitk:140
 msgid "Couldn't get list of unmerged files:"
@@ -60,7 +61,7 @@
 
 #: gitk:496 gitk:4525
 msgid "Reading commits..."
-msgstr "Đang đọc các lần chuyển giao..."
+msgstr "Đang đọc các lần chuyển giao…"
 
 #: gitk:499 gitk:1637 gitk:4528
 msgid "No commits selected"
@@ -88,71 +89,71 @@
 msgstr "Thôi"
 
 #: gitk:2069
-msgid "Update"
+msgid "&Update"
 msgstr "Cập nhật"
 
 #: gitk:2070
-msgid "Reload"
+msgid "&Reload"
 msgstr "Tải lại"
 
 #: gitk:2071
-msgid "Reread references"
+msgid "Reread re&ferences"
 msgstr "Đọc lại tham chiếu"
 
 #: gitk:2072
-msgid "List references"
+msgid "&List references"
 msgstr "Liệt kê các tham chiếu"
 
 #: gitk:2074
-msgid "Start git gui"
+msgid "Start git &gui"
 msgstr "Khởi chạy git gui"
 
 #: gitk:2076
-msgid "Quit"
+msgid "&Quit"
 msgstr "Thoát"
 
 #: gitk:2068
-msgid "File"
+msgid "&File"
 msgstr "Chính"
 
 #: gitk:2080
-msgid "Preferences"
-msgstr "Cá nhân hóa"
+msgid "&Preferences"
+msgstr "Tùy thích"
 
 #: gitk:2079
-msgid "Edit"
+msgid "&Edit"
 msgstr "Chỉnh sửa"
 
 #: gitk:2084
-msgid "New view..."
-msgstr "Thêm trình bày mới..."
+msgid "&New view..."
+msgstr "Thêm trình bày mới…"
 
 #: gitk:2085
-msgid "Edit view..."
-msgstr "Sửa cách trình bày..."
+msgid "&Edit view..."
+msgstr "Sửa cách trình bày…"
 
 #: gitk:2086
-msgid "Delete view"
+msgid "&Delete view"
 msgstr "Xóa cách trình bày"
 
 #: gitk:2088 gitk:4043
-msgid "All files"
+msgid "&All files"
 msgstr "Mọi tập tin"
 
 #: gitk:2083 gitk:4067
-msgid "View"
+msgid "&View"
 msgstr "Trình bày"
 
 #: gitk:2093 gitk:2103 gitk:3012
-msgid "About gitk"
+msgid "&About gitk"
 msgstr "Giới thiệu về gitk"
 
 #: gitk:2094 gitk:2108
-msgid "Key bindings"
+msgid "&Key bindings"
 msgstr "Tổ hợp phím"
 
 #: gitk:2092 gitk:2107
-msgid "Help"
+msgid "&Help"
 msgstr "Trợ giúp"
 
 #: gitk:2185 gitk:8652
@@ -319,7 +320,7 @@
 
 #: gitk:2647
 msgid "Check out this branch"
-msgstr "Checkout nhánh này"
+msgstr "Lấy ra nhánh này"
 
 #: gitk:2648
 msgid "Remove this branch"
@@ -327,7 +328,7 @@
 
 #: gitk:2649
 msgid "Copy branch name"
-msgstr ""
+msgstr "Chép tên nhánh"
 
 #: gitk:2656
 msgid "Highlight this too"
@@ -347,7 +348,7 @@
 
 #: gitk:2660
 msgid "Copy path"
-msgstr ""
+msgstr "Chép đường dẫn"
 
 #: gitk:2667
 msgid "Show origin of this line"
@@ -358,7 +359,6 @@
 msgstr "Chạy lệnh git gui blame cho dòng này"
 
 #: gitk:3014
-#, fuzzy
 msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
@@ -368,9 +368,9 @@
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
-"Gitk - phần mềm xem các lần chuyển giao dành cho git\n"
+"Gitk - ứng dụng để xem các lần chuyển giao dành cho git\n"
 "\n"
-"Bản quyền © 2005-2011 Paul Mackerras\n"
+"Bản quyền © 2005-2014 Paul Mackerras\n"
 "\n"
 "Dùng và phân phối lại phần mềm này theo các điều khoản của Giấy Phép Công GNU"
 
@@ -424,6 +424,7 @@
 #, tcl-format
 msgid "<%s-n>\tGo to n-th parent of current commit in history list"
 msgstr ""
+"<%s-n>\tĐến cha thứ n của lần chuyển giao hiện tại trong danh sách lịch sử"
 
 #: gitk:3057
 msgid "<PageUp>\tMove up one page in commit list"
@@ -507,9 +508,8 @@
 msgstr "<Return>\t\tDi chuyển đến chỗ gặp kế tiếp"
 
 #: gitk:3075
-#, fuzzy
 msgid "g\t\tGo to commit"
-msgstr "<End>\t\tChuyển đến lần chuyển giao cuối"
+msgstr "g\t\tChuyển đến lần chuyển giao"
 
 #: gitk:3076
 msgid "/\t\tFocus the search box"
@@ -666,9 +666,8 @@
 msgstr "Khớp mọi điều kiện Thông tin Chuyển giao"
 
 #: gitk:4086
-#, fuzzy
 msgid "Matches no Commit Info criteria"
-msgstr "Khớp mọi điều kiện Thông tin Chuyển giao"
+msgstr "Khớp không điều kiện Thông tin Chuyển giao"
 
 #: gitk:4087
 msgid "Changes to Files:"
@@ -716,7 +715,7 @@
 
 #: gitk:4097
 msgid "Miscellaneous options:"
-msgstr "Tuỳ chọn hỗn hợp:"
+msgstr "Tùy chọn hỗn hợp:"
 
 #: gitk:4098
 msgid "Strictly sort by date"
@@ -971,7 +970,7 @@
 
 #: gitk:9256 gitk:9373 gitk:9430
 msgid "ID:"
-msgstr "ID:"
+msgstr "Mã số:"
 
 #: gitk:9265
 msgid "Tag name:"
@@ -1186,7 +1185,7 @@
 #: gitk:11355
 #, no-tcl-format
 msgid "Maximum graph width (% of pane)"
-msgstr "Độ rộng biểu đồ tối đa (% của bảng)"
+msgstr "Độ rộng đồ thị tối đa (% của bảng)"
 
 #: gitk:11358
 msgid "Show local changes"
@@ -1194,7 +1193,7 @@
 
 #: gitk:11361
 msgid "Auto-select SHA1 (length)"
-msgstr "Tự chọn SHA1 (độ dài)"
+msgstr "Tự chọn (độ dài) SHA1"
 
 #: gitk:11365
 msgid "Hide remote refs"
@@ -1230,7 +1229,7 @@
 
 #: gitk:11390
 msgid "Choose..."
-msgstr "Chọn..."
+msgstr "Chọn…"
 
 #: gitk:11395
 msgid "General options"
@@ -1354,6 +1353,8 @@
 "Sorry, gitk cannot run with this version of Tcl/Tk.\n"
 " Gitk requires at least Tcl/Tk 8.4."
 msgstr ""
+"Rất tiếc, gitk không thể chạy Tcl/Tk phiên bản này.\n"
+" Gitk cần ít nhất là Tcl/Tk 8.4."
 
 #: gitk:12269
 msgid "Cannot find a git repository here."
@@ -1366,7 +1367,7 @@
 
 #: gitk:12328
 msgid "Bad arguments to gitk:"
-msgstr "Đối số không hợp lệ cho gitk:"
+msgstr "Đối số cho gitk không hợp lệ:"
 
 #~ msgid "mc"
 #~ msgstr "mc"
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 7a5b23a..05d7910 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -7576,7 +7576,7 @@
 			git_cmd(), 'cat-file', '-t', $object_id) . ' 2> /dev/null'
 			or die_error(404, "Object does not exist");
 		$type = <$fd>;
-		chomp $type;
+		defined $type && chomp $type;
 		close $fd
 			or die_error(404, "Object does not exist");
 
diff --git a/graph.c b/graph.c
index c25a09a..1350bdd 100644
--- a/graph.c
+++ b/graph.c
@@ -234,12 +234,10 @@
 	 * We'll automatically grow columns later if we need more room.
 	 */
 	graph->column_capacity = 30;
-	graph->columns = xmalloc(sizeof(struct column) *
-				 graph->column_capacity);
-	graph->new_columns = xmalloc(sizeof(struct column) *
-				     graph->column_capacity);
-	graph->mapping = xmalloc(sizeof(int) * 2 * graph->column_capacity);
-	graph->new_mapping = xmalloc(sizeof(int) * 2 * graph->column_capacity);
+	ALLOC_ARRAY(graph->columns, graph->column_capacity);
+	ALLOC_ARRAY(graph->new_columns, graph->column_capacity);
+	ALLOC_ARRAY(graph->mapping, 2 * graph->column_capacity);
+	ALLOC_ARRAY(graph->new_mapping, 2 * graph->column_capacity);
 
 	/*
 	 * The diff output prefix callback, with this we can make
diff --git a/grep.c b/grep.c
index b58c7c6..528b652 100644
--- a/grep.c
+++ b/grep.c
@@ -31,14 +31,14 @@
 	opt->max_depth = -1;
 	opt->pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED;
 	opt->extended_regexp_option = 0;
-	strcpy(opt->color_context, "");
-	strcpy(opt->color_filename, "");
-	strcpy(opt->color_function, "");
-	strcpy(opt->color_lineno, "");
-	strcpy(opt->color_match_context, GIT_COLOR_BOLD_RED);
-	strcpy(opt->color_match_selected, GIT_COLOR_BOLD_RED);
-	strcpy(opt->color_selected, "");
-	strcpy(opt->color_sep, GIT_COLOR_CYAN);
+	color_set(opt->color_context, "");
+	color_set(opt->color_filename, "");
+	color_set(opt->color_function, "");
+	color_set(opt->color_lineno, "");
+	color_set(opt->color_match_context, GIT_COLOR_BOLD_RED);
+	color_set(opt->color_match_selected, GIT_COLOR_BOLD_RED);
+	color_set(opt->color_selected, "");
+	color_set(opt->color_sep, GIT_COLOR_CYAN);
 	opt->color = -1;
 }
 
@@ -151,14 +151,14 @@
 	opt->regflags = def->regflags;
 	opt->relative = def->relative;
 
-	strcpy(opt->color_context, def->color_context);
-	strcpy(opt->color_filename, def->color_filename);
-	strcpy(opt->color_function, def->color_function);
-	strcpy(opt->color_lineno, def->color_lineno);
-	strcpy(opt->color_match_context, def->color_match_context);
-	strcpy(opt->color_match_selected, def->color_match_selected);
-	strcpy(opt->color_selected, def->color_selected);
-	strcpy(opt->color_sep, def->color_sep);
+	color_set(opt->color_context, def->color_context);
+	color_set(opt->color_filename, def->color_filename);
+	color_set(opt->color_function, def->color_function);
+	color_set(opt->color_lineno, def->color_lineno);
+	color_set(opt->color_match_context, def->color_match_context);
+	color_set(opt->color_match_selected, def->color_match_selected);
+	color_set(opt->color_selected, def->color_selected);
+	color_set(opt->color_sep, def->color_sep);
 }
 
 void grep_commit_pattern_type(enum grep_pattern_type pattern_type, struct grep_opt *opt)
@@ -306,9 +306,9 @@
 	char where[1024];
 
 	if (p->no)
-		sprintf(where, "In '%s' at %d, ", p->origin, p->no);
+		xsnprintf(where, sizeof(where), "In '%s' at %d, ", p->origin, p->no);
 	else if (p->origin)
-		sprintf(where, "%s, ", p->origin);
+		xsnprintf(where, sizeof(where), "%s, ", p->origin);
 	else
 		where[0] = 0;
 
@@ -1741,7 +1741,7 @@
 	i = open(filename, O_RDONLY);
 	if (i < 0)
 		goto err_ret;
-	data = xmalloc(size + 1);
+	data = xmallocz(size);
 	if (st.st_size != read_in_full(i, data, size)) {
 		error(_("'%s': short read %s"), filename, strerror(errno));
 		close(i);
@@ -1749,7 +1749,6 @@
 		return -1;
 	}
 	close(i);
-	data[size] = 0;
 
 	gs->buf = data;
 	gs->size = size;
diff --git a/hashmap.c b/hashmap.c
index f693839..b10b642 100644
--- a/hashmap.c
+++ b/hashmap.c
@@ -256,10 +256,9 @@
 	e = hashmap_get(&map, &key, data);
 	if (!e) {
 		/* not found: create it */
-		e = xmallocz(sizeof(struct pool_entry) + len);
+		FLEX_ALLOC_MEM(e, data, data, len);
 		hashmap_entry_init(e, key.ent.hash);
 		e->len = len;
-		memcpy(e->data, data, len);
 		hashmap_add(&map, e);
 	}
 	return e->data;
diff --git a/help.c b/help.c
index d996b34..19328ea 100644
--- a/help.c
+++ b/help.c
@@ -11,11 +11,9 @@
 
 void add_cmdname(struct cmdnames *cmds, const char *name, int len)
 {
-	struct cmdname *ent = xmalloc(sizeof(*ent) + len + 1);
-
+	struct cmdname *ent;
+	FLEX_ALLOC_MEM(ent, name, name, len);
 	ent->len = len;
-	memcpy(ent->name, name, len);
-	ent->name[len] = 0;
 
 	ALLOC_GROW(cmds->names, cmds->cnt + 1, cmds->alloc);
 	cmds->names[cmds->cnt++] = ent;
diff --git a/hex.c b/hex.c
index 899b74a..0519f85 100644
--- a/hex.c
+++ b/hex.c
@@ -61,12 +61,10 @@
 	return get_sha1_hex(hex, oid->hash);
 }
 
-char *sha1_to_hex(const unsigned char *sha1)
+char *sha1_to_hex_r(char *buffer, const unsigned char *sha1)
 {
-	static int bufno;
-	static char hexbuffer[4][GIT_SHA1_HEXSZ + 1];
 	static const char hex[] = "0123456789abcdef";
-	char *buffer = hexbuffer[3 & ++bufno], *buf = buffer;
+	char *buf = buffer;
 	int i;
 
 	for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
@@ -79,6 +77,13 @@
 	return buffer;
 }
 
+char *sha1_to_hex(const unsigned char *sha1)
+{
+	static int bufno;
+	static char hexbuffer[4][GIT_SHA1_HEXSZ + 1];
+	return sha1_to_hex_r(hexbuffer[3 & ++bufno], sha1);
+}
+
 char *oid_to_hex(const struct object_id *oid)
 {
 	return sha1_to_hex(oid->hash);
diff --git a/http-backend.c b/http-backend.c
index bac40ef..8870a26 100644
--- a/http-backend.c
+++ b/http-backend.c
@@ -436,7 +436,7 @@
 		o = deref_tag(o, name, 0);
 		if (!o)
 			return 0;
-		strbuf_addf(buf, "%s\t%s^{}\n", sha1_to_hex(o->sha1),
+		strbuf_addf(buf, "%s\t%s^{}\n", oid_to_hex(&o->oid),
 			    name_nons);
 	}
 	return 0;
diff --git a/http-push.c b/http-push.c
index 8341909..bd60668 100644
--- a/http-push.c
+++ b/http-push.c
@@ -10,6 +10,7 @@
 #include "remote.h"
 #include "list-objects.h"
 #include "sigchain.h"
+#include "argv-array.h"
 
 #ifdef EXPAT_NEEDS_XMLPARSE_H
 #include <xmlparse.h>
@@ -250,7 +251,7 @@
 	struct active_request_slot *slot;
 	struct http_object_request *obj_req;
 
-	obj_req = new_http_object_request(repo->url, request->obj->sha1);
+	obj_req = new_http_object_request(repo->url, request->obj->oid.hash);
 	if (obj_req == NULL) {
 		request->state = ABORTED;
 		return;
@@ -274,7 +275,7 @@
 
 static void start_mkcol(struct transfer_request *request)
 {
-	char *hex = sha1_to_hex(request->obj->sha1);
+	char *hex = oid_to_hex(&request->obj->oid);
 	struct active_request_slot *slot;
 
 	request->url = get_remote_object_url(repo->url, hex, 1);
@@ -303,16 +304,16 @@
 	struct transfer_request *check_request = request_queue_head;
 	struct http_pack_request *preq;
 
-	target = find_sha1_pack(request->obj->sha1, repo->packs);
+	target = find_sha1_pack(request->obj->oid.hash, repo->packs);
 	if (!target) {
-		fprintf(stderr, "Unable to fetch %s, will not be able to update server info refs\n", sha1_to_hex(request->obj->sha1));
+		fprintf(stderr, "Unable to fetch %s, will not be able to update server info refs\n", oid_to_hex(&request->obj->oid));
 		repo->can_update_info_refs = 0;
 		release_request(request);
 		return;
 	}
 
 	fprintf(stderr,	"Fetching pack %s\n", sha1_to_hex(target->sha1));
-	fprintf(stderr, " which contains %s\n", sha1_to_hex(request->obj->sha1));
+	fprintf(stderr, " which contains %s\n", oid_to_hex(&request->obj->oid));
 
 	preq = new_http_pack_request(target, repo->url);
 	if (preq == NULL) {
@@ -349,7 +350,7 @@
 
 static void start_put(struct transfer_request *request)
 {
-	char *hex = sha1_to_hex(request->obj->sha1);
+	char *hex = oid_to_hex(&request->obj->oid);
 	struct active_request_slot *slot;
 	struct strbuf buf = STRBUF_INIT;
 	enum object_type type;
@@ -360,8 +361,8 @@
 	ssize_t size;
 	git_zstream stream;
 
-	unpacked = read_sha1_file(request->obj->sha1, &type, &len);
-	hdrlen = sprintf(hdr, "%s %lu", typename(type), len) + 1;
+	unpacked = read_sha1_file(request->obj->oid.hash, &type, &len);
+	hdrlen = xsnprintf(hdr, sizeof(hdr), "%s %lu", typename(type), len) + 1;
 
 	/* Set it up */
 	git_deflate_init(&stream, zlib_compression_level);
@@ -532,11 +533,11 @@
 	if (request->state == RUN_MKCOL) {
 		if (request->curl_result == CURLE_OK ||
 		    request->http_code == 405) {
-			remote_dir_exists[request->obj->sha1[0]] = 1;
+			remote_dir_exists[request->obj->oid.hash[0]] = 1;
 			start_put(request);
 		} else {
 			fprintf(stderr, "MKCOL %s failed, aborting (%d/%ld)\n",
-				sha1_to_hex(request->obj->sha1),
+				oid_to_hex(&request->obj->oid),
 				request->curl_result, request->http_code);
 			request->state = ABORTED;
 			aborted = 1;
@@ -546,7 +547,7 @@
 			start_move(request);
 		} else {
 			fprintf(stderr,	"PUT %s failed, aborting (%d/%ld)\n",
-				sha1_to_hex(request->obj->sha1),
+				oid_to_hex(&request->obj->oid),
 				request->curl_result, request->http_code);
 			request->state = ABORTED;
 			aborted = 1;
@@ -555,12 +556,12 @@
 		if (request->curl_result == CURLE_OK) {
 			if (push_verbosely)
 				fprintf(stderr, "    sent %s\n",
-					sha1_to_hex(request->obj->sha1));
+					oid_to_hex(&request->obj->oid));
 			request->obj->flags |= REMOTE;
 			release_request(request);
 		} else {
 			fprintf(stderr, "MOVE %s failed, aborting (%d/%ld)\n",
-				sha1_to_hex(request->obj->sha1),
+				oid_to_hex(&request->obj->oid),
 				request->curl_result, request->http_code);
 			request->state = ABORTED;
 			aborted = 1;
@@ -613,7 +614,7 @@
 			start_fetch_loose(request);
 			return 1;
 		} else if (pushing && request->state == NEED_PUSH) {
-			if (remote_dir_exists[request->obj->sha1[0]] == 1) {
+			if (remote_dir_exists[request->obj->oid.hash[0]] == 1) {
 				start_put(request);
 			} else {
 				start_mkcol(request);
@@ -637,8 +638,8 @@
 	 * Don't fetch the object if it's known to exist locally
 	 * or is already in the request queue
 	 */
-	if (remote_dir_exists[obj->sha1[0]] == -1)
-		get_remote_object_list(obj->sha1[0]);
+	if (remote_dir_exists[obj->oid.hash[0]] == -1)
+		get_remote_object_list(obj->oid.hash[0]);
 	if (obj->flags & (LOCAL | FETCHING))
 		return;
 
@@ -670,11 +671,11 @@
 	 * Don't push the object if it's known to exist on the remote
 	 * or is already in the request queue
 	 */
-	if (remote_dir_exists[obj->sha1[0]] == -1)
-		get_remote_object_list(obj->sha1[0]);
+	if (remote_dir_exists[obj->oid.hash[0]] == -1)
+		get_remote_object_list(obj->oid.hash[0]);
 	if (obj->flags & (REMOTE | PUSHING))
 		return 0;
-	target = find_sha1_pack(obj->sha1, repo->packs);
+	target = find_sha1_pack(obj->oid.hash, repo->packs);
 	if (target) {
 		obj->flags |= REMOTE;
 		return 0;
@@ -786,21 +787,21 @@
 {
 	struct xml_ctx *ctx = (struct xml_ctx *)userData;
 	const char *c = strchr(name, ':');
-	int new_len;
+	int old_namelen, new_len;
 
 	if (c == NULL)
 		c = name;
 	else
 		c++;
 
-	new_len = strlen(ctx->name) + strlen(c) + 2;
+	old_namelen = strlen(ctx->name);
+	new_len = old_namelen + strlen(c) + 2;
 
 	if (new_len > ctx->len) {
 		ctx->name = xrealloc(ctx->name, new_len);
 		ctx->len = new_len;
 	}
-	strcat(ctx->name, ".");
-	strcat(ctx->name, c);
+	xsnprintf(ctx->name + old_namelen, ctx->len - old_namelen, ".%s", c);
 
 	free(ctx->cdata);
 	ctx->cdata = NULL;
@@ -881,7 +882,7 @@
 	strbuf_addf(&out_buffer.buf, LOCK_REQUEST, escaped);
 	free(escaped);
 
-	sprintf(timeout_header, "Timeout: Second-%ld", timeout);
+	xsnprintf(timeout_header, sizeof(timeout_header), "Timeout: Second-%ld", timeout);
 	dav_headers = curl_slist_append(dav_headers, timeout_header);
 	dav_headers = curl_slist_append(dav_headers, "Content-Type: text/xml");
 
@@ -1301,7 +1302,7 @@
 	if (obj->flags & (UNINTERESTING | SEEN))
 		return p;
 	if (parse_tree(tree) < 0)
-		die("bad tree object %s", sha1_to_hex(obj->sha1));
+		die("bad tree object %s", oid_to_hex(&obj->oid));
 
 	obj->flags |= SEEN;
 	p = add_one_object(obj, p);
@@ -1359,7 +1360,7 @@
 			p = process_blob((struct blob *)obj, p);
 			continue;
 		}
-		die("unknown pending object %s (%s)", sha1_to_hex(obj->sha1), name);
+		die("unknown pending object %s (%s)", oid_to_hex(&obj->oid), name);
 	}
 
 	while (objects) {
@@ -1428,11 +1429,11 @@
 	 * Fetch a copy of the object if it doesn't exist locally - it
 	 * may be required for updating server info later.
 	 */
-	if (repo->can_update_info_refs && !has_sha1_file(ref->old_sha1)) {
-		obj = lookup_unknown_object(ref->old_sha1);
+	if (repo->can_update_info_refs && !has_object_file(&ref->old_oid)) {
+		obj = lookup_unknown_object(ref->old_oid.hash);
 		if (obj) {
 			fprintf(stderr,	"  fetch %s for %s\n",
-				sha1_to_hex(ref->old_sha1), refname);
+				oid_to_hex(&ref->old_oid), refname);
 			add_fetch_request(obj);
 		}
 	}
@@ -1450,8 +1451,6 @@
 {
 	struct strbuf *buf = (struct strbuf *)ls->userData;
 	struct object *o;
-	int len;
-	char *ref_info;
 	struct ref *ref;
 
 	ref = alloc_ref(ls->dentry_name);
@@ -1465,33 +1464,24 @@
 		return;
 	}
 
-	o = parse_object(ref->old_sha1);
+	o = parse_object(ref->old_oid.hash);
 	if (!o) {
 		fprintf(stderr,
 			"Unable to parse object %s for remote ref %s\n",
-			sha1_to_hex(ref->old_sha1), ls->dentry_name);
+			oid_to_hex(&ref->old_oid), ls->dentry_name);
 		aborted = 1;
 		free(ref);
 		return;
 	}
 
-	len = strlen(ls->dentry_name) + 42;
-	ref_info = xcalloc(len + 1, 1);
-	sprintf(ref_info, "%s	%s\n",
-		sha1_to_hex(ref->old_sha1), ls->dentry_name);
-	fwrite_buffer(ref_info, 1, len, buf);
-	free(ref_info);
+	strbuf_addf(buf, "%s\t%s\n",
+		    oid_to_hex(&ref->old_oid), ls->dentry_name);
 
 	if (o->type == OBJ_TAG) {
 		o = deref_tag(o, ls->dentry_name, 0);
-		if (o) {
-			len = strlen(ls->dentry_name) + 45;
-			ref_info = xcalloc(len + 1, 1);
-			sprintf(ref_info, "%s	%s^{}\n",
-				sha1_to_hex(o->sha1), ls->dentry_name);
-			fwrite_buffer(ref_info, 1, len, buf);
-			free(ref_info);
-		}
+		if (o)
+			strbuf_addf(buf, "%s\t%s^{}\n",
+				    oid_to_hex(&o->oid), ls->dentry_name);
 	}
 	free(ref);
 }
@@ -1582,7 +1572,7 @@
 static int verify_merge_base(unsigned char *head_sha1, struct ref *remote)
 {
 	struct commit *head = lookup_commit_or_die(head_sha1, "HEAD");
-	struct commit *branch = lookup_commit_or_die(remote->old_sha1, remote->name);
+	struct commit *branch = lookup_commit_or_die(remote->old_oid.hash, remote->name);
 
 	return in_merge_bases(branch, head);
 }
@@ -1645,11 +1635,11 @@
 			return error("Remote HEAD resolves to object %s\nwhich does not exist locally, perhaps you need to fetch?", sha1_to_hex(head_sha1));
 
 		/* Remote branch must resolve to a known object */
-		if (is_null_sha1(remote_ref->old_sha1))
+		if (is_null_oid(&remote_ref->old_oid))
 			return error("Unable to resolve remote branch %s",
 				     remote_ref->name);
-		if (!has_sha1_file(remote_ref->old_sha1))
-			return error("Remote branch %s resolves to object %s\nwhich does not exist locally, perhaps you need to fetch?", remote_ref->name, sha1_to_hex(remote_ref->old_sha1));
+		if (!has_object_file(&remote_ref->old_oid))
+			return error("Remote branch %s resolves to object %s\nwhich does not exist locally, perhaps you need to fetch?", remote_ref->name, oid_to_hex(&remote_ref->old_oid));
 
 		/* Remote branch must be an ancestor of remote HEAD */
 		if (!verify_merge_base(head_sha1, remote_ref)) {
@@ -1857,15 +1847,12 @@
 
 	new_refs = 0;
 	for (ref = remote_refs; ref; ref = ref->next) {
-		char old_hex[60], *new_hex;
-		const char *commit_argv[5];
-		int commit_argc;
-		char *new_sha1_hex, *old_sha1_hex;
+		struct argv_array commit_argv = ARGV_ARRAY_INIT;
 
 		if (!ref->peer_ref)
 			continue;
 
-		if (is_null_sha1(ref->peer_ref->new_sha1)) {
+		if (is_null_oid(&ref->peer_ref->new_oid)) {
 			if (delete_remote_branch(ref->name, 1) == -1) {
 				error("Could not remove %s", ref->name);
 				if (helper_status)
@@ -1878,7 +1865,7 @@
 			continue;
 		}
 
-		if (!hashcmp(ref->old_sha1, ref->peer_ref->new_sha1)) {
+		if (!oidcmp(&ref->old_oid, &ref->peer_ref->new_oid)) {
 			if (push_verbosely)
 				fprintf(stderr, "'%s': up-to-date\n", ref->name);
 			if (helper_status)
@@ -1887,11 +1874,11 @@
 		}
 
 		if (!force_all &&
-		    !is_null_sha1(ref->old_sha1) &&
+		    !is_null_oid(&ref->old_oid) &&
 		    !ref->force) {
-			if (!has_sha1_file(ref->old_sha1) ||
-			    !ref_newer(ref->peer_ref->new_sha1,
-				       ref->old_sha1)) {
+			if (!has_object_file(&ref->old_oid) ||
+			    !ref_newer(&ref->peer_ref->new_oid,
+				       &ref->old_oid)) {
 				/*
 				 * We do not have the remote ref, or
 				 * we know that the remote ref is not
@@ -1912,15 +1899,14 @@
 				continue;
 			}
 		}
-		hashcpy(ref->new_sha1, ref->peer_ref->new_sha1);
+		oidcpy(&ref->new_oid, &ref->peer_ref->new_oid);
 		new_refs++;
-		strcpy(old_hex, sha1_to_hex(ref->old_sha1));
-		new_hex = sha1_to_hex(ref->new_sha1);
 
 		fprintf(stderr, "updating '%s'", ref->name);
 		if (strcmp(ref->name, ref->peer_ref->name))
 			fprintf(stderr, " using '%s'", ref->peer_ref->name);
-		fprintf(stderr, "\n  from %s\n  to   %s\n", old_hex, new_hex);
+		fprintf(stderr, "\n  from %s\n  to   %s\n",
+			oid_to_hex(&ref->old_oid), oid_to_hex(&ref->new_oid));
 		if (dry_run) {
 			if (helper_status)
 				printf("ok %s\n", ref->name);
@@ -1939,27 +1925,15 @@
 		}
 
 		/* Set up revision info for this refspec */
-		commit_argc = 3;
-		new_sha1_hex = xstrdup(sha1_to_hex(ref->new_sha1));
-		old_sha1_hex = NULL;
-		commit_argv[1] = "--objects";
-		commit_argv[2] = new_sha1_hex;
-		if (!push_all && !is_null_sha1(ref->old_sha1)) {
-			old_sha1_hex = xmalloc(42);
-			sprintf(old_sha1_hex, "^%s",
-				sha1_to_hex(ref->old_sha1));
-			commit_argv[3] = old_sha1_hex;
-			commit_argc++;
-		}
-		commit_argv[commit_argc] = NULL;
+		argv_array_push(&commit_argv, ""); /* ignored */
+		argv_array_push(&commit_argv, "--objects");
+		argv_array_push(&commit_argv, oid_to_hex(&ref->new_oid));
+		if (!push_all && !is_null_oid(&ref->old_oid))
+			argv_array_pushf(&commit_argv, "^%s",
+					 oid_to_hex(&ref->old_oid));
 		init_revisions(&revs, setup_git_directory());
-		setup_revisions(commit_argc, commit_argv, &revs, NULL);
+		setup_revisions(commit_argv.argc, commit_argv.argv, &revs, NULL);
 		revs.edge_hint = 0; /* just in case */
-		free(new_sha1_hex);
-		if (old_sha1_hex) {
-			free(old_sha1_hex);
-			commit_argv[1] = NULL;
-		}
 
 		/* Generate a list of objects that need to be pushed */
 		pushing = 0;
@@ -1979,7 +1953,7 @@
 		run_request_queue();
 
 		/* Update the remote branch if all went well */
-		if (aborted || !update_remote(ref->new_sha1, ref_lock))
+		if (aborted || !update_remote(ref->new_oid.hash, ref_lock))
 			rc = 1;
 
 		if (!rc)
@@ -1988,6 +1962,7 @@
 			printf("%s %s\n", !rc ? "ok" : "error", ref->name);
 		unlock_remote(ref_lock);
 		check_locks();
+		argv_array_clear(&commit_argv);
 	}
 
 	/* Update remote server info if appropriate */
diff --git a/http-walker.c b/http-walker.c
index 88da546..2c721f0 100644
--- a/http-walker.c
+++ b/http-walker.c
@@ -29,7 +29,7 @@
 struct alternates_request {
 	struct walker *walker;
 	const char *base;
-	char *url;
+	struct strbuf *url;
 	struct strbuf *buffer;
 	struct active_request_slot *slot;
 	int http_specific;
@@ -195,10 +195,11 @@
 
 			/* Try reusing the slot to get non-http alternates */
 			alt_req->http_specific = 0;
-			sprintf(alt_req->url, "%s/objects/info/alternates",
-				base);
+			strbuf_reset(alt_req->url);
+			strbuf_addf(alt_req->url, "%s/objects/info/alternates",
+				    base);
 			curl_easy_setopt(slot->curl, CURLOPT_URL,
-					 alt_req->url);
+					 alt_req->url->buf);
 			active_requests++;
 			slot->in_use = 1;
 			if (slot->finished != NULL)
@@ -312,7 +313,7 @@
 static void fetch_alternates(struct walker *walker, const char *base)
 {
 	struct strbuf buffer = STRBUF_INIT;
-	char *url;
+	struct strbuf url = STRBUF_INIT;
 	struct active_request_slot *slot;
 	struct alternates_request alt_req;
 	struct walker_data *cdata = walker->data;
@@ -338,7 +339,7 @@
 	if (walker->get_verbosely)
 		fprintf(stderr, "Getting alternates list for %s\n", base);
 
-	url = xstrfmt("%s/objects/info/http-alternates", base);
+	strbuf_addf(&url, "%s/objects/info/http-alternates", base);
 
 	/*
 	 * Use a callback to process the result, since another request
@@ -351,10 +352,10 @@
 
 	curl_easy_setopt(slot->curl, CURLOPT_FILE, &buffer);
 	curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer);
-	curl_easy_setopt(slot->curl, CURLOPT_URL, url);
+	curl_easy_setopt(slot->curl, CURLOPT_URL, url.buf);
 
 	alt_req.base = base;
-	alt_req.url = url;
+	alt_req.url = &url;
 	alt_req.buffer = &buffer;
 	alt_req.http_specific = 1;
 	alt_req.slot = slot;
@@ -365,7 +366,7 @@
 		cdata->got_alternates = -1;
 
 	strbuf_release(&buffer);
-	free(url);
+	strbuf_release(&url);
 }
 
 static int fetch_indices(struct walker *walker, struct alt_base *repo)
diff --git a/http.c b/http.c
index c29ce81..0da9e66 100644
--- a/http.c
+++ b/http.c
@@ -30,7 +30,6 @@
 #endif
 
 #define PREV_BUF_SIZE 4096
-#define RANGE_HEADER_SIZE 30
 
 char curl_errorstr[CURL_ERROR_SIZE];
 
@@ -692,6 +691,7 @@
 	curl_easy_setopt(slot->curl, CURLOPT_UPLOAD, 0);
 	curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1);
 	curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 1);
+	curl_easy_setopt(slot->curl, CURLOPT_RANGE, NULL);
 #ifdef LIBCURL_CAN_HANDLE_AUTH_ANY
 	curl_easy_setopt(slot->curl, CURLOPT_HTTPAUTH, http_auth_methods);
 #endif
@@ -1133,7 +1133,7 @@
 		     decimal_places++, max_q *= 10)
 			;
 
-		sprintf(q_format, ";q=0.%%0%dd", decimal_places);
+		xsnprintf(q_format, sizeof(q_format), ";q=0.%%0%dd", decimal_places);
 
 		strbuf_addstr(buf, "Accept-Language: ");
 
@@ -1184,6 +1184,13 @@
 	return cached_accept_language;
 }
 
+static void http_opt_request_remainder(CURL *curl, off_t pos)
+{
+	char buf[128];
+	xsnprintf(buf, sizeof(buf), "%"PRIuMAX"-", (uintmax_t)pos);
+	curl_easy_setopt(curl, CURLOPT_RANGE, buf);
+}
+
 /* http_request() targets */
 #define HTTP_REQUEST_STRBUF	0
 #define HTTP_REQUEST_FILE	1
@@ -1209,14 +1216,11 @@
 		curl_easy_setopt(slot->curl, CURLOPT_FILE, result);
 
 		if (target == HTTP_REQUEST_FILE) {
-			long posn = ftell(result);
+			off_t posn = ftello(result);
 			curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION,
 					 fwrite);
-			if (posn > 0) {
-				strbuf_addf(&buf, "Range: bytes=%ld-", posn);
-				headers = curl_slist_append(headers, buf.buf);
-				strbuf_reset(&buf);
-			}
+			if (posn > 0)
+				http_opt_request_remainder(slot->curl, posn);
 		} else
 			curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION,
 					 fwrite_buffer);
@@ -1398,7 +1402,7 @@
 	if (http_get_strbuf(url, &buffer, &options) == HTTP_OK) {
 		strbuf_rtrim(&buffer);
 		if (buffer.len == 40)
-			ret = get_sha1_hex(buffer.buf, ref->old_sha1);
+			ret = get_oid_hex(buffer.buf, &ref->old_oid);
 		else if (starts_with(buffer.buf, "ref: ")) {
 			ref->symref = xstrdup(buffer.buf + 5);
 			ret = 0;
@@ -1526,10 +1530,6 @@
 		fclose(preq->packfile);
 		preq->packfile = NULL;
 	}
-	if (preq->range_header != NULL) {
-		curl_slist_free_all(preq->range_header);
-		preq->range_header = NULL;
-	}
 	preq->slot = NULL;
 	free(preq->url);
 	free(preq);
@@ -1540,6 +1540,7 @@
 	struct packed_git **lst;
 	struct packed_git *p = preq->target;
 	char *tmp_idx;
+	size_t len;
 	struct child_process ip = CHILD_PROCESS_INIT;
 	const char *ip_argv[8];
 
@@ -1553,9 +1554,9 @@
 		lst = &((*lst)->next);
 	*lst = (*lst)->next;
 
-	tmp_idx = xstrdup(preq->tmpfile);
-	strcpy(tmp_idx + strlen(tmp_idx) - strlen(".pack.temp"),
-	       ".idx.temp");
+	if (!strip_suffix(preq->tmpfile, ".pack.temp", &len))
+		die("BUG: pack tmpfile does not end in .pack.temp?");
+	tmp_idx = xstrfmt("%.*s.idx.temp", (int)len, preq->tmpfile);
 
 	ip_argv[0] = "index-pack";
 	ip_argv[1] = "-o";
@@ -1591,8 +1592,7 @@
 struct http_pack_request *new_http_pack_request(
 	struct packed_git *target, const char *base_url)
 {
-	long prev_posn = 0;
-	char range[RANGE_HEADER_SIZE];
+	off_t prev_posn = 0;
 	struct strbuf buf = STRBUF_INIT;
 	struct http_pack_request *preq;
 
@@ -1624,16 +1624,13 @@
 	 * If there is data present from a previous transfer attempt,
 	 * resume where it left off
 	 */
-	prev_posn = ftell(preq->packfile);
+	prev_posn = ftello(preq->packfile);
 	if (prev_posn>0) {
 		if (http_is_verbose)
 			fprintf(stderr,
-				"Resuming fetch of pack %s at byte %ld\n",
-				sha1_to_hex(target->sha1), prev_posn);
-		sprintf(range, "Range: bytes=%ld-", prev_posn);
-		preq->range_header = curl_slist_append(NULL, range);
-		curl_easy_setopt(preq->slot->curl, CURLOPT_HTTPHEADER,
-			preq->range_header);
+				"Resuming fetch of pack %s at byte %"PRIuMAX"\n",
+				sha1_to_hex(target->sha1), (uintmax_t)prev_posn);
+		http_opt_request_remainder(preq->slot->curl, prev_posn);
 	}
 
 	return preq;
@@ -1682,9 +1679,7 @@
 	int prevlocal;
 	char prev_buf[PREV_BUF_SIZE];
 	ssize_t prev_read = 0;
-	long prev_posn = 0;
-	char range[RANGE_HEADER_SIZE];
-	struct curl_slist *range_header = NULL;
+	off_t prev_posn = 0;
 	struct http_object_request *freq;
 
 	freq = xcalloc(1, sizeof(*freq));
@@ -1788,12 +1783,9 @@
 	if (prev_posn>0) {
 		if (http_is_verbose)
 			fprintf(stderr,
-				"Resuming fetch of object %s at byte %ld\n",
-				hex, prev_posn);
-		sprintf(range, "Range: bytes=%ld-", prev_posn);
-		range_header = curl_slist_append(range_header, range);
-		curl_easy_setopt(freq->slot->curl,
-				 CURLOPT_HTTPHEADER, range_header);
+				"Resuming fetch of object %s at byte %"PRIuMAX"\n",
+				hex, (uintmax_t)prev_posn);
+		http_opt_request_remainder(freq->slot->curl, prev_posn);
 	}
 
 	return freq;
diff --git a/http.h b/http.h
index 49afe39..4f97b60 100644
--- a/http.h
+++ b/http.h
@@ -190,7 +190,6 @@
 	struct packed_git **lst;
 	FILE *packfile;
 	char tmpfile[PATH_MAX];
-	struct curl_slist *range_header;
 	struct active_request_slot *slot;
 };
 
diff --git a/imap-send.c b/imap-send.c
index 8c3fc21..2c52027 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -889,16 +889,14 @@
 	}
 
 	/* response: "<user> <digest in hex>" */
-	resp_len = strlen(user) + 1 + strlen(hex) + 1;
-	response = xmalloc(resp_len);
-	sprintf(response, "%s %s", user, hex);
+	response = xstrfmt("%s %s", user, hex);
+	resp_len = strlen(response) + 1;
 
-	response_64 = xmalloc(ENCODED_SIZE(resp_len) + 1);
+	response_64 = xmallocz(ENCODED_SIZE(resp_len));
 	encoded_len = EVP_EncodeBlock((unsigned char *)response_64,
 				      (unsigned char *)response, resp_len);
 	if (encoded_len < 0)
 		die("EVP_EncodeBlock error");
-	response_64[encoded_len] = '\0';
 	return (char *)response_64;
 }
 
@@ -1189,7 +1187,7 @@
 		j++;
 	}
 
-	new = xmalloc(j + 1);
+	new = xmallocz(j);
 
 	/*
 	 * Second pass: write the new string.  Note that this loop is
diff --git a/khash.h b/khash.h
index 376475a..c0da40d 100644
--- a/khash.h
+++ b/khash.h
@@ -117,7 +117,7 @@
 			if (new_n_buckets < 4) new_n_buckets = 4;					\
 			if (h->size >= (khint_t)(new_n_buckets * __ac_HASH_UPPER + 0.5)) j = 0;	/* requested size is too small */ \
 			else { /* hash table size to be changed (shrink or expand); rehash */ \
-				new_flags = (khint32_t*)xmalloc(__ac_fsize(new_n_buckets) * sizeof(khint32_t));	\
+				ALLOC_ARRAY(new_flags, __ac_fsize(new_n_buckets)); \
 				if (!new_flags) return -1;								\
 				memset(new_flags, 0xaa, __ac_fsize(new_n_buckets) * sizeof(khint32_t)); \
 				if (h->n_buckets < new_n_buckets) {	/* expand */		\
diff --git a/levenshtein.c b/levenshtein.c
index fc28159..d263269 100644
--- a/levenshtein.c
+++ b/levenshtein.c
@@ -42,11 +42,13 @@
 		int w, int s, int a, int d)
 {
 	int len1 = strlen(string1), len2 = strlen(string2);
-	int *row0 = xmalloc(sizeof(int) * (len2 + 1));
-	int *row1 = xmalloc(sizeof(int) * (len2 + 1));
-	int *row2 = xmalloc(sizeof(int) * (len2 + 1));
+	int *row0, *row1, *row2;
 	int i, j;
 
+	ALLOC_ARRAY(row0, len2 + 1);
+	ALLOC_ARRAY(row1, len2 + 1);
+	ALLOC_ARRAY(row2, len2 + 1);
+
 	for (j = 0; j <= len2; j++)
 		row1[j] = j * a;
 	for (i = 0; i < len1; i++) {
diff --git a/line-log.c b/line-log.c
index 626b22c..bbe31ed 100644
--- a/line-log.c
+++ b/line-log.c
@@ -14,6 +14,7 @@
 #include "graph.h"
 #include "userdiff.h"
 #include "line-log.h"
+#include "argv-array.h"
 
 static void range_set_grow(struct range_set *rs, size_t extra)
 {
@@ -502,7 +503,7 @@
 	unsigned mode;
 	unsigned char sha1[20];
 
-	if (get_tree_entry(commit->object.sha1, spec->path,
+	if (get_tree_entry(commit->object.oid.hash, spec->path,
 			   sha1, &mode))
 		die("There is no path %s in the commit", spec->path);
 	fill_filespec(spec, sha1, 1, mode);
@@ -521,7 +522,7 @@
 	if (diff_populate_filespec(spec, 0))
 		die("Cannot read blob %s", sha1_to_hex(spec->sha1));
 
-	ends = xmalloc(size * sizeof(*ends));
+	ALLOC_ARRAY(ends, size);
 	ends[cur++] = 0;
 	data = spec->data;
 	while (num < spec->size) {
@@ -746,22 +747,17 @@
 	add_line_range(rev, commit, range);
 
 	if (!rev->diffopt.detect_rename) {
-		int i, count = 0;
-		struct line_log_data *r = range;
+		struct line_log_data *r;
+		struct argv_array array = ARGV_ARRAY_INIT;
 		const char **paths;
-		while (r) {
-			count++;
-			r = r->next;
-		}
-		paths = xmalloc((count+1)*sizeof(char *));
-		r = range;
-		for (i = 0; i < count; i++) {
-			paths[i] = xstrdup(r->path);
-			r = r->next;
-		}
-		paths[count] = NULL;
+
+		for (r = range; r; r = r->next)
+			argv_array_push(&array, r->path);
+		paths = argv_array_detach(&array);
+
 		parse_pathspec(&rev->diffopt.pathspec, 0,
 			       PATHSPEC_PREFER_FULL, "", paths);
+		/* strings are now owned by pathspec */
 		free(paths);
 	}
 }
@@ -824,8 +820,8 @@
 	assert(commit);
 
 	DIFF_QUEUE_CLEAR(&diff_queued_diff);
-	diff_tree_sha1(parent ? parent->tree->object.sha1 : NULL,
-			commit->tree->object.sha1, "", opt);
+	diff_tree_sha1(parent ? parent->tree->object.oid.hash : NULL,
+			commit->tree->object.oid.hash, "", opt);
 	if (opt->detect_rename) {
 		filter_diffs_for_paths(range, 1);
 		if (diff_might_be_rename())
@@ -1146,9 +1142,9 @@
 	if (nparents > 1 && rev->first_parent_only)
 		nparents = 1;
 
-	diffqueues = xmalloc(nparents * sizeof(*diffqueues));
-	cand = xmalloc(nparents * sizeof(*cand));
-	parents = xmalloc(nparents * sizeof(*parents));
+	ALLOC_ARRAY(diffqueues, nparents);
+	ALLOC_ARRAY(cand, nparents);
+	ALLOC_ARRAY(parents, nparents);
 
 	p = commit->parents;
 	for (i = 0; i < nparents; i++) {
diff --git a/list-objects.c b/list-objects.c
index 37d0d10..917cc5d 100644
--- a/list-objects.c
+++ b/list-objects.c
@@ -87,7 +87,7 @@
 	if (parse_tree_gently(tree, revs->ignore_missing_links) < 0) {
 		if (revs->ignore_missing_links)
 			return;
-		die("bad tree object %s", sha1_to_hex(obj->sha1));
+		die("bad tree object %s", oid_to_hex(&obj->oid));
 	}
 
 	obj->flags |= SEEN;
@@ -227,7 +227,7 @@
 			continue;
 		}
 		die("unknown pending object %s (%s)",
-		    sha1_to_hex(obj->sha1), name);
+		    oid_to_hex(&obj->oid), name);
 	}
 	object_array_clear(&revs->pending);
 	strbuf_release(&base);
diff --git a/ll-merge.c b/ll-merge.c
index bf83290..ff4a43a 100644
--- a/ll-merge.c
+++ b/ll-merge.c
@@ -145,11 +145,11 @@
 	{ "union", "built-in union merge", ll_union_merge },
 };
 
-static void create_temp(mmfile_t *src, char *path)
+static void create_temp(mmfile_t *src, char *path, size_t len)
 {
 	int fd;
 
-	strcpy(path, ".merge_file_XXXXXX");
+	xsnprintf(path, len, ".merge_file_XXXXXX");
 	fd = xmkstemp(path);
 	if (write_in_full(fd, src->ptr, src->size) != src->size)
 		die_errno("unable to write temp-file");
@@ -190,10 +190,10 @@
 
 	result->ptr = NULL;
 	result->size = 0;
-	create_temp(orig, temp[0]);
-	create_temp(src1, temp[1]);
-	create_temp(src2, temp[2]);
-	sprintf(temp[3], "%d", marker_size);
+	create_temp(orig, temp[0], sizeof(temp[0]));
+	create_temp(src1, temp[1], sizeof(temp[1]));
+	create_temp(src2, temp[2], sizeof(temp[2]));
+	xsnprintf(temp[3], sizeof(temp[3]), "%d", marker_size);
 
 	strbuf_expand(&cmd, fn->cmdline, strbuf_expand_dict_cb, &dict);
 
@@ -205,7 +205,7 @@
 	if (fstat(fd, &st))
 		goto close_bad;
 	result->size = st.st_size;
-	result->ptr = xmalloc(result->size + 1);
+	result->ptr = xmallocz(result->size);
 	if (read_in_full(fd, result->ptr, result->size) != result->size) {
 		free(result->ptr);
 		result->ptr = NULL;
diff --git a/log-tree.c b/log-tree.c
index 7b1b57a..60f9839 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -77,9 +77,8 @@
 
 void add_name_decoration(enum decoration_type type, const char *name, struct object *obj)
 {
-	int nlen = strlen(name);
-	struct name_decoration *res = xmalloc(sizeof(*res) + nlen + 1);
-	memcpy(res->name, name, nlen + 1);
+	struct name_decoration *res;
+	FLEX_ALLOC_STR(res, name, name);
 	res->type = type;
 	res->next = add_decoration(&name_decoration, obj, res);
 }
@@ -133,7 +132,7 @@
 		if (!obj)
 			break;
 		if (!obj->parsed)
-			parse_object(obj->sha1);
+			parse_object(obj->oid.hash);
 		add_name_decoration(DECORATION_REF_TAG, refname, obj);
 	}
 	return 0;
@@ -165,7 +164,7 @@
 	struct commit_list *p;
 	for (p = commit->parents; p ; p = p->next) {
 		struct commit *parent = p->item;
-		printf(" %s", find_unique_abbrev(parent->object.sha1, abbrev));
+		printf(" %s", find_unique_abbrev(parent->object.oid.hash, abbrev));
 	}
 }
 
@@ -173,7 +172,7 @@
 {
 	struct commit_list *p = lookup_decoration(&opt->children, &commit->object);
 	for ( ; p; p = p->next) {
-		printf(" %s", find_unique_abbrev(p->item->object.sha1, abbrev));
+		printf(" %s", find_unique_abbrev(p->item->object.oid.hash, abbrev));
 	}
 }
 
@@ -342,7 +341,8 @@
 {
 	const char *subject = NULL;
 	const char *extra_headers = opt->extra_headers;
-	const char *name = sha1_to_hex(commit->object.sha1);
+	const char *name = oid_to_hex(opt->zero_commit ?
+				      &null_oid : &commit->object.oid);
 
 	*need_8bit_cte_p = 0; /* unknown */
 	if (opt->total > 0) {
@@ -469,7 +469,7 @@
 	const struct commit_list *parent;
 
 	for (nth = 0, parent = commit->parents; parent; parent = parent->next) {
-		if (!hashcmp(parent->item->object.sha1, sha1))
+		if (!hashcmp(parent->item->object.oid.hash, sha1))
 			return nth;
 		nth++;
 	}
@@ -503,13 +503,13 @@
 	if (parse_tag_buffer(tag, extra->value, extra->len))
 		strbuf_addstr(&verify_message, "malformed mergetag\n");
 	else if (is_common_merge(commit) &&
-		 !hashcmp(tag->tagged->sha1,
-			  commit->parents->next->item->object.sha1))
+		 !oidcmp(&tag->tagged->oid,
+			  &commit->parents->next->item->object.oid))
 		strbuf_addf(&verify_message,
 			    "merged tag '%s'\n", tag->tag);
-	else if ((nth = which_parent(tag->tagged->sha1, commit)) < 0)
+	else if ((nth = which_parent(tag->tagged->oid.hash, commit)) < 0)
 		strbuf_addf(&verify_message, "tag %s names a non-parent %s\n",
-				    tag->tag, tag->tagged->sha1);
+				    tag->tag, tag->tagged->oid.hash);
 	else
 		strbuf_addf(&verify_message,
 			    "parent #%d, tagged '%s'\n", nth + 1, tag->tag);
@@ -553,7 +553,7 @@
 
 		if (!opt->graph)
 			put_revision_mark(opt, commit);
-		fputs(find_unique_abbrev(commit->object.sha1, abbrev_commit), stdout);
+		fputs(find_unique_abbrev(commit->object.oid.hash, abbrev_commit), stdout);
 		if (opt->print_parents)
 			show_parents(commit, abbrev_commit);
 		if (opt->children.name)
@@ -613,7 +613,7 @@
 
 		if (!opt->graph)
 			put_revision_mark(opt, commit);
-		fputs(find_unique_abbrev(commit->object.sha1, abbrev_commit),
+		fputs(find_unique_abbrev(commit->object.oid.hash, abbrev_commit),
 		      stdout);
 		if (opt->print_parents)
 			show_parents(commit, abbrev_commit);
@@ -621,7 +621,7 @@
 			show_children(opt, commit, abbrev_commit);
 		if (parent)
 			printf(" (from %s)",
-			       find_unique_abbrev(parent->object.sha1,
+			       find_unique_abbrev(parent->object.oid.hash,
 						  abbrev_commit));
 		fputs(diff_get_color_opt(&opt->diffopt, DIFF_RESET), stdout);
 		show_decorations(opt, commit);
@@ -660,7 +660,7 @@
 		struct strbuf notebuf = STRBUF_INIT;
 
 		raw = (opt->commit_format == CMIT_FMT_USERFORMAT);
-		format_display_notes(commit->object.sha1, &notebuf,
+		format_display_notes(commit->object.oid.hash, &notebuf,
 				     get_log_output_encoding(), raw);
 		ctx.notes_message = notebuf.len
 			? strbuf_detach(&notebuf, NULL)
@@ -796,19 +796,19 @@
 {
 	int showed_log;
 	struct commit_list *parents;
-	unsigned const char *sha1;
+	struct object_id *oid;
 
 	if (!opt->diff && !DIFF_OPT_TST(&opt->diffopt, EXIT_WITH_STATUS))
 		return 0;
 
 	parse_commit_or_die(commit);
-	sha1 = commit->tree->object.sha1;
+	oid = &commit->tree->object.oid;
 
 	/* Root commit? */
 	parents = get_saved_parents(opt, commit);
 	if (!parents) {
 		if (opt->show_root_diff) {
-			diff_root_tree_sha1(sha1, "", &opt->diffopt);
+			diff_root_tree_sha1(oid->hash, "", &opt->diffopt);
 			log_tree_diff_flush(opt);
 		}
 		return !opt->loginfo;
@@ -827,8 +827,8 @@
 			 * we merged _in_.
 			 */
 			parse_commit_or_die(parents->item);
-			diff_tree_sha1(parents->item->tree->object.sha1,
-				       sha1, "", &opt->diffopt);
+			diff_tree_sha1(parents->item->tree->object.oid.hash,
+				       oid->hash, "", &opt->diffopt);
 			log_tree_diff_flush(opt);
 			return !opt->loginfo;
 		}
@@ -842,8 +842,8 @@
 		struct commit *parent = parents->item;
 
 		parse_commit_or_die(parent);
-		diff_tree_sha1(parent->tree->object.sha1,
-			       sha1, "", &opt->diffopt);
+		diff_tree_sha1(parent->tree->object.oid.hash,
+			       oid->hash, "", &opt->diffopt);
 		log_tree_diff_flush(opt);
 
 		showed_log |= !opt->loginfo;
diff --git a/mailinfo.c b/mailinfo.c
new file mode 100644
index 0000000..f289941
--- /dev/null
+++ b/mailinfo.c
@@ -0,0 +1,1037 @@
+#include "cache.h"
+#include "utf8.h"
+#include "strbuf.h"
+#include "mailinfo.h"
+
+static void cleanup_space(struct strbuf *sb)
+{
+	size_t pos, cnt;
+	for (pos = 0; pos < sb->len; pos++) {
+		if (isspace(sb->buf[pos])) {
+			sb->buf[pos] = ' ';
+			for (cnt = 0; isspace(sb->buf[pos + cnt + 1]); cnt++);
+			strbuf_remove(sb, pos + 1, cnt);
+		}
+	}
+}
+
+static void get_sane_name(struct strbuf *out, struct strbuf *name, struct strbuf *email)
+{
+	struct strbuf *src = name;
+	if (name->len < 3 || 60 < name->len || strchr(name->buf, '@') ||
+		strchr(name->buf, '<') || strchr(name->buf, '>'))
+		src = email;
+	else if (name == out)
+		return;
+	strbuf_reset(out);
+	strbuf_addbuf(out, src);
+}
+
+static void parse_bogus_from(struct mailinfo *mi, const struct strbuf *line)
+{
+	/* John Doe <johndoe> */
+
+	char *bra, *ket;
+	/* This is fallback, so do not bother if we already have an
+	 * e-mail address.
+	 */
+	if (mi->email.len)
+		return;
+
+	bra = strchr(line->buf, '<');
+	if (!bra)
+		return;
+	ket = strchr(bra, '>');
+	if (!ket)
+		return;
+
+	strbuf_reset(&mi->email);
+	strbuf_add(&mi->email, bra + 1, ket - bra - 1);
+
+	strbuf_reset(&mi->name);
+	strbuf_add(&mi->name, line->buf, bra - line->buf);
+	strbuf_trim(&mi->name);
+	get_sane_name(&mi->name, &mi->name, &mi->email);
+}
+
+static void handle_from(struct mailinfo *mi, const struct strbuf *from)
+{
+	char *at;
+	size_t el;
+	struct strbuf f;
+
+	strbuf_init(&f, from->len);
+	strbuf_addbuf(&f, from);
+
+	at = strchr(f.buf, '@');
+	if (!at) {
+		parse_bogus_from(mi, from);
+		return;
+	}
+
+	/*
+	 * If we already have one email, don't take any confusing lines
+	 */
+	if (mi->email.len && strchr(at + 1, '@')) {
+		strbuf_release(&f);
+		return;
+	}
+
+	/* Pick up the string around '@', possibly delimited with <>
+	 * pair; that is the email part.
+	 */
+	while (at > f.buf) {
+		char c = at[-1];
+		if (isspace(c))
+			break;
+		if (c == '<') {
+			at[-1] = ' ';
+			break;
+		}
+		at--;
+	}
+	el = strcspn(at, " \n\t\r\v\f>");
+	strbuf_reset(&mi->email);
+	strbuf_add(&mi->email, at, el);
+	strbuf_remove(&f, at - f.buf, el + (at[el] ? 1 : 0));
+
+	/* The remainder is name.  It could be
+	 *
+	 * - "John Doe <john.doe@xz>"			(a), or
+	 * - "john.doe@xz (John Doe)"			(b), or
+	 * - "John (zzz) Doe <john.doe@xz> (Comment)"	(c)
+	 *
+	 * but we have removed the email part, so
+	 *
+	 * - remove extra spaces which could stay after email (case 'c'), and
+	 * - trim from both ends, possibly removing the () pair at the end
+	 *   (cases 'a' and 'b').
+	 */
+	cleanup_space(&f);
+	strbuf_trim(&f);
+	if (f.buf[0] == '(' && f.len && f.buf[f.len - 1] == ')') {
+		strbuf_remove(&f, 0, 1);
+		strbuf_setlen(&f, f.len - 1);
+	}
+
+	get_sane_name(&mi->name, &f, &mi->email);
+	strbuf_release(&f);
+}
+
+static void handle_header(struct strbuf **out, const struct strbuf *line)
+{
+	if (!*out) {
+		*out = xmalloc(sizeof(struct strbuf));
+		strbuf_init(*out, line->len);
+	} else
+		strbuf_reset(*out);
+
+	strbuf_addbuf(*out, line);
+}
+
+/* NOTE NOTE NOTE.  We do not claim we do full MIME.  We just attempt
+ * to have enough heuristics to grok MIME encoded patches often found
+ * on our mailing lists.  For example, we do not even treat header lines
+ * case insensitively.
+ */
+
+static int slurp_attr(const char *line, const char *name, struct strbuf *attr)
+{
+	const char *ends, *ap = strcasestr(line, name);
+	size_t sz;
+
+	strbuf_setlen(attr, 0);
+	if (!ap)
+		return 0;
+	ap += strlen(name);
+	if (*ap == '"') {
+		ap++;
+		ends = "\"";
+	}
+	else
+		ends = "; \t";
+	sz = strcspn(ap, ends);
+	strbuf_add(attr, ap, sz);
+	return 1;
+}
+
+static void handle_content_type(struct mailinfo *mi, struct strbuf *line)
+{
+	struct strbuf *boundary = xmalloc(sizeof(struct strbuf));
+	strbuf_init(boundary, line->len);
+
+	if (slurp_attr(line->buf, "boundary=", boundary)) {
+		strbuf_insert(boundary, 0, "--", 2);
+		if (++mi->content_top >= &mi->content[MAX_BOUNDARIES]) {
+			error("Too many boundaries to handle");
+			mi->input_error = -1;
+			mi->content_top = &mi->content[MAX_BOUNDARIES] - 1;
+			return;
+		}
+		*(mi->content_top) = boundary;
+		boundary = NULL;
+	}
+	slurp_attr(line->buf, "charset=", &mi->charset);
+
+	if (boundary) {
+		strbuf_release(boundary);
+		free(boundary);
+	}
+}
+
+static void handle_message_id(struct mailinfo *mi, const struct strbuf *line)
+{
+	if (mi->add_message_id)
+		mi->message_id = strdup(line->buf);
+}
+
+static void handle_content_transfer_encoding(struct mailinfo *mi,
+					     const struct strbuf *line)
+{
+	if (strcasestr(line->buf, "base64"))
+		mi->transfer_encoding = TE_BASE64;
+	else if (strcasestr(line->buf, "quoted-printable"))
+		mi->transfer_encoding = TE_QP;
+	else
+		mi->transfer_encoding = TE_DONTCARE;
+}
+
+static int is_multipart_boundary(struct mailinfo *mi, const struct strbuf *line)
+{
+	struct strbuf *content_top = *(mi->content_top);
+
+	return ((content_top->len <= line->len) &&
+		!memcmp(line->buf, content_top->buf, content_top->len));
+}
+
+static void cleanup_subject(struct mailinfo *mi, struct strbuf *subject)
+{
+	size_t at = 0;
+
+	while (at < subject->len) {
+		char *pos;
+		size_t remove;
+
+		switch (subject->buf[at]) {
+		case 'r': case 'R':
+			if (subject->len <= at + 3)
+				break;
+			if ((subject->buf[at + 1] == 'e' ||
+			     subject->buf[at + 1] == 'E') &&
+			    subject->buf[at + 2] == ':') {
+				strbuf_remove(subject, at, 3);
+				continue;
+			}
+			at++;
+			break;
+		case ' ': case '\t': case ':':
+			strbuf_remove(subject, at, 1);
+			continue;
+		case '[':
+			pos = strchr(subject->buf + at, ']');
+			if (!pos)
+				break;
+			remove = pos - subject->buf + at + 1;
+			if (!mi->keep_non_patch_brackets_in_subject ||
+			    (7 <= remove &&
+			     memmem(subject->buf + at, remove, "PATCH", 5)))
+				strbuf_remove(subject, at, remove);
+			else {
+				at += remove;
+				/*
+				 * If the input had a space after the ], keep
+				 * it.  We don't bother with finding the end of
+				 * the space, since we later normalize it
+				 * anyway.
+				 */
+				if (isspace(subject->buf[at]))
+					at += 1;
+			}
+			continue;
+		}
+		break;
+	}
+	strbuf_trim(subject);
+}
+
+#define MAX_HDR_PARSED 10
+static const char *header[MAX_HDR_PARSED] = {
+	"From","Subject","Date",
+};
+
+static inline int cmp_header(const struct strbuf *line, const char *hdr)
+{
+	int len = strlen(hdr);
+	return !strncasecmp(line->buf, hdr, len) && line->len > len &&
+			line->buf[len] == ':' && isspace(line->buf[len + 1]);
+}
+
+static int is_format_patch_separator(const char *line, int len)
+{
+	static const char SAMPLE[] =
+		"From e6807f3efca28b30decfecb1732a56c7db1137ee Mon Sep 17 00:00:00 2001\n";
+	const char *cp;
+
+	if (len != strlen(SAMPLE))
+		return 0;
+	if (!skip_prefix(line, "From ", &cp))
+		return 0;
+	if (strspn(cp, "0123456789abcdef") != 40)
+		return 0;
+	cp += 40;
+	return !memcmp(SAMPLE + (cp - line), cp, strlen(SAMPLE) - (cp - line));
+}
+
+static struct strbuf *decode_q_segment(const struct strbuf *q_seg, int rfc2047)
+{
+	const char *in = q_seg->buf;
+	int c;
+	struct strbuf *out = xmalloc(sizeof(struct strbuf));
+	strbuf_init(out, q_seg->len);
+
+	while ((c = *in++) != 0) {
+		if (c == '=') {
+			int d = *in++;
+			if (d == '\n' || !d)
+				break; /* drop trailing newline */
+			strbuf_addch(out, (hexval(d) << 4) | hexval(*in++));
+			continue;
+		}
+		if (rfc2047 && c == '_') /* rfc2047 4.2 (2) */
+			c = 0x20;
+		strbuf_addch(out, c);
+	}
+	return out;
+}
+
+static struct strbuf *decode_b_segment(const struct strbuf *b_seg)
+{
+	/* Decode in..ep, possibly in-place to ot */
+	int c, pos = 0, acc = 0;
+	const char *in = b_seg->buf;
+	struct strbuf *out = xmalloc(sizeof(struct strbuf));
+	strbuf_init(out, b_seg->len);
+
+	while ((c = *in++) != 0) {
+		if (c == '+')
+			c = 62;
+		else if (c == '/')
+			c = 63;
+		else if ('A' <= c && c <= 'Z')
+			c -= 'A';
+		else if ('a' <= c && c <= 'z')
+			c -= 'a' - 26;
+		else if ('0' <= c && c <= '9')
+			c -= '0' - 52;
+		else
+			continue; /* garbage */
+		switch (pos++) {
+		case 0:
+			acc = (c << 2);
+			break;
+		case 1:
+			strbuf_addch(out, (acc | (c >> 4)));
+			acc = (c & 15) << 4;
+			break;
+		case 2:
+			strbuf_addch(out, (acc | (c >> 2)));
+			acc = (c & 3) << 6;
+			break;
+		case 3:
+			strbuf_addch(out, (acc | c));
+			acc = pos = 0;
+			break;
+		}
+	}
+	return out;
+}
+
+static int convert_to_utf8(struct mailinfo *mi,
+			   struct strbuf *line, const char *charset)
+{
+	char *out;
+
+	if (!mi->metainfo_charset || !charset || !*charset)
+		return 0;
+
+	if (same_encoding(mi->metainfo_charset, charset))
+		return 0;
+	out = reencode_string(line->buf, mi->metainfo_charset, charset);
+	if (!out) {
+		mi->input_error = -1;
+		return error("cannot convert from %s to %s",
+			     charset, mi->metainfo_charset);
+	}
+	strbuf_attach(line, out, strlen(out), strlen(out));
+	return 0;
+}
+
+static void decode_header(struct mailinfo *mi, struct strbuf *it)
+{
+	char *in, *ep, *cp;
+	struct strbuf outbuf = STRBUF_INIT, *dec;
+	struct strbuf charset_q = STRBUF_INIT, piecebuf = STRBUF_INIT;
+	int found_error = 1; /* pessimism */
+
+	in = it->buf;
+	while (in - it->buf <= it->len && (ep = strstr(in, "=?")) != NULL) {
+		int encoding;
+		strbuf_reset(&charset_q);
+		strbuf_reset(&piecebuf);
+
+		if (in != ep) {
+			/*
+			 * We are about to process an encoded-word
+			 * that begins at ep, but there is something
+			 * before the encoded word.
+			 */
+			char *scan;
+			for (scan = in; scan < ep; scan++)
+				if (!isspace(*scan))
+					break;
+
+			if (scan != ep || in == it->buf) {
+				/*
+				 * We should not lose that "something",
+				 * unless we have just processed an
+				 * encoded-word, and there is only LWS
+				 * before the one we are about to process.
+				 */
+				strbuf_add(&outbuf, in, ep - in);
+			}
+		}
+		/* E.g.
+		 * ep : "=?iso-2022-jp?B?GyR...?= foo"
+		 * ep : "=?ISO-8859-1?Q?Foo=FCbar?= baz"
+		 */
+		ep += 2;
+
+		if (ep - it->buf >= it->len || !(cp = strchr(ep, '?')))
+			goto release_return;
+
+		if (cp + 3 - it->buf > it->len)
+			goto release_return;
+		strbuf_add(&charset_q, ep, cp - ep);
+
+		encoding = cp[1];
+		if (!encoding || cp[2] != '?')
+			goto release_return;
+		ep = strstr(cp + 3, "?=");
+		if (!ep)
+			goto release_return;
+		strbuf_add(&piecebuf, cp + 3, ep - cp - 3);
+		switch (tolower(encoding)) {
+		default:
+			goto release_return;
+		case 'b':
+			dec = decode_b_segment(&piecebuf);
+			break;
+		case 'q':
+			dec = decode_q_segment(&piecebuf, 1);
+			break;
+		}
+		if (convert_to_utf8(mi, dec, charset_q.buf))
+			goto release_return;
+
+		strbuf_addbuf(&outbuf, dec);
+		strbuf_release(dec);
+		free(dec);
+		in = ep + 2;
+	}
+	strbuf_addstr(&outbuf, in);
+	strbuf_reset(it);
+	strbuf_addbuf(it, &outbuf);
+	found_error = 0;
+release_return:
+	strbuf_release(&outbuf);
+	strbuf_release(&charset_q);
+	strbuf_release(&piecebuf);
+
+	if (found_error)
+		mi->input_error = -1;
+}
+
+static int check_header(struct mailinfo *mi,
+			const struct strbuf *line,
+			struct strbuf *hdr_data[], int overwrite)
+{
+	int i, ret = 0, len;
+	struct strbuf sb = STRBUF_INIT;
+
+	/* search for the interesting parts */
+	for (i = 0; header[i]; i++) {
+		int len = strlen(header[i]);
+		if ((!hdr_data[i] || overwrite) && cmp_header(line, header[i])) {
+			/* Unwrap inline B and Q encoding, and optionally
+			 * normalize the meta information to utf8.
+			 */
+			strbuf_add(&sb, line->buf + len + 2, line->len - len - 2);
+			decode_header(mi, &sb);
+			handle_header(&hdr_data[i], &sb);
+			ret = 1;
+			goto check_header_out;
+		}
+	}
+
+	/* Content stuff */
+	if (cmp_header(line, "Content-Type")) {
+		len = strlen("Content-Type: ");
+		strbuf_add(&sb, line->buf + len, line->len - len);
+		decode_header(mi, &sb);
+		strbuf_insert(&sb, 0, "Content-Type: ", len);
+		handle_content_type(mi, &sb);
+		ret = 1;
+		goto check_header_out;
+	}
+	if (cmp_header(line, "Content-Transfer-Encoding")) {
+		len = strlen("Content-Transfer-Encoding: ");
+		strbuf_add(&sb, line->buf + len, line->len - len);
+		decode_header(mi, &sb);
+		handle_content_transfer_encoding(mi, &sb);
+		ret = 1;
+		goto check_header_out;
+	}
+	if (cmp_header(line, "Message-Id")) {
+		len = strlen("Message-Id: ");
+		strbuf_add(&sb, line->buf + len, line->len - len);
+		decode_header(mi, &sb);
+		handle_message_id(mi, &sb);
+		ret = 1;
+		goto check_header_out;
+	}
+
+	/* for inbody stuff */
+	if (starts_with(line->buf, ">From") && isspace(line->buf[5])) {
+		ret = is_format_patch_separator(line->buf + 1, line->len - 1);
+		goto check_header_out;
+	}
+	if (starts_with(line->buf, "[PATCH]") && isspace(line->buf[7])) {
+		for (i = 0; header[i]; i++) {
+			if (!strcmp("Subject", header[i])) {
+				handle_header(&hdr_data[i], line);
+				ret = 1;
+				goto check_header_out;
+			}
+		}
+	}
+
+check_header_out:
+	strbuf_release(&sb);
+	return ret;
+}
+
+static void decode_transfer_encoding(struct mailinfo *mi, struct strbuf *line)
+{
+	struct strbuf *ret;
+
+	switch (mi->transfer_encoding) {
+	case TE_QP:
+		ret = decode_q_segment(line, 0);
+		break;
+	case TE_BASE64:
+		ret = decode_b_segment(line);
+		break;
+	case TE_DONTCARE:
+	default:
+		return;
+	}
+	strbuf_reset(line);
+	strbuf_addbuf(line, ret);
+	strbuf_release(ret);
+	free(ret);
+}
+
+static inline int patchbreak(const struct strbuf *line)
+{
+	size_t i;
+
+	/* Beginning of a "diff -" header? */
+	if (starts_with(line->buf, "diff -"))
+		return 1;
+
+	/* CVS "Index: " line? */
+	if (starts_with(line->buf, "Index: "))
+		return 1;
+
+	/*
+	 * "--- <filename>" starts patches without headers
+	 * "---<sp>*" is a manual separator
+	 */
+	if (line->len < 4)
+		return 0;
+
+	if (starts_with(line->buf, "---")) {
+		/* space followed by a filename? */
+		if (line->buf[3] == ' ' && !isspace(line->buf[4]))
+			return 1;
+		/* Just whitespace? */
+		for (i = 3; i < line->len; i++) {
+			unsigned char c = line->buf[i];
+			if (c == '\n')
+				return 1;
+			if (!isspace(c))
+				break;
+		}
+		return 0;
+	}
+	return 0;
+}
+
+static int is_scissors_line(const struct strbuf *line)
+{
+	size_t i, len = line->len;
+	int scissors = 0, gap = 0;
+	int first_nonblank = -1;
+	int last_nonblank = 0, visible, perforation = 0, in_perforation = 0;
+	const char *buf = line->buf;
+
+	for (i = 0; i < len; i++) {
+		if (isspace(buf[i])) {
+			if (in_perforation) {
+				perforation++;
+				gap++;
+			}
+			continue;
+		}
+		last_nonblank = i;
+		if (first_nonblank < 0)
+			first_nonblank = i;
+		if (buf[i] == '-') {
+			in_perforation = 1;
+			perforation++;
+			continue;
+		}
+		if (i + 1 < len &&
+		    (!memcmp(buf + i, ">8", 2) || !memcmp(buf + i, "8<", 2) ||
+		     !memcmp(buf + i, ">%", 2) || !memcmp(buf + i, "%<", 2))) {
+			in_perforation = 1;
+			perforation += 2;
+			scissors += 2;
+			i++;
+			continue;
+		}
+		in_perforation = 0;
+	}
+
+	/*
+	 * The mark must be at least 8 bytes long (e.g. "-- >8 --").
+	 * Even though there can be arbitrary cruft on the same line
+	 * (e.g. "cut here"), in order to avoid misidentification, the
+	 * perforation must occupy more than a third of the visible
+	 * width of the line, and dashes and scissors must occupy more
+	 * than half of the perforation.
+	 */
+
+	visible = last_nonblank - first_nonblank + 1;
+	return (scissors && 8 <= visible &&
+		visible < perforation * 3 &&
+		gap * 2 < perforation);
+}
+
+static int handle_commit_msg(struct mailinfo *mi, struct strbuf *line)
+{
+	assert(!mi->filter_stage);
+
+	if (mi->header_stage) {
+		if (!line->len || (line->len == 1 && line->buf[0] == '\n'))
+			return 0;
+	}
+
+	if (mi->use_inbody_headers && mi->header_stage) {
+		mi->header_stage = check_header(mi, line, mi->s_hdr_data, 0);
+		if (mi->header_stage)
+			return 0;
+	} else
+		/* Only trim the first (blank) line of the commit message
+		 * when ignoring in-body headers.
+		 */
+		mi->header_stage = 0;
+
+	/* normalize the log message to UTF-8. */
+	if (convert_to_utf8(mi, line, mi->charset.buf))
+		return 0; /* mi->input_error already set */
+
+	if (mi->use_scissors && is_scissors_line(line)) {
+		int i;
+
+		strbuf_setlen(&mi->log_message, 0);
+		mi->header_stage = 1;
+
+		/*
+		 * We may have already read "secondary headers"; purge
+		 * them to give ourselves a clean restart.
+		 */
+		for (i = 0; header[i]; i++) {
+			if (mi->s_hdr_data[i])
+				strbuf_release(mi->s_hdr_data[i]);
+			mi->s_hdr_data[i] = NULL;
+		}
+		return 0;
+	}
+
+	if (patchbreak(line)) {
+		if (mi->message_id)
+			strbuf_addf(&mi->log_message,
+				    "Message-Id: %s\n", mi->message_id);
+		return 1;
+	}
+
+	strbuf_addbuf(&mi->log_message, line);
+	return 0;
+}
+
+static void handle_patch(struct mailinfo *mi, const struct strbuf *line)
+{
+	fwrite(line->buf, 1, line->len, mi->patchfile);
+	mi->patch_lines++;
+}
+
+static void handle_filter(struct mailinfo *mi, struct strbuf *line)
+{
+	switch (mi->filter_stage) {
+	case 0:
+		if (!handle_commit_msg(mi, line))
+			break;
+		mi->filter_stage++;
+	case 1:
+		handle_patch(mi, line);
+		break;
+	}
+}
+
+static int is_rfc2822_header(const struct strbuf *line)
+{
+	/*
+	 * The section that defines the loosest possible
+	 * field name is "3.6.8 Optional fields".
+	 *
+	 * optional-field = field-name ":" unstructured CRLF
+	 * field-name = 1*ftext
+	 * ftext = %d33-57 / %59-126
+	 */
+	int ch;
+	char *cp = line->buf;
+
+	/* Count mbox From headers as headers */
+	if (starts_with(cp, "From ") || starts_with(cp, ">From "))
+		return 1;
+
+	while ((ch = *cp++)) {
+		if (ch == ':')
+			return 1;
+		if ((33 <= ch && ch <= 57) ||
+		    (59 <= ch && ch <= 126))
+			continue;
+		break;
+	}
+	return 0;
+}
+
+static int read_one_header_line(struct strbuf *line, FILE *in)
+{
+	struct strbuf continuation = STRBUF_INIT;
+
+	/* Get the first part of the line. */
+	if (strbuf_getline(line, in, '\n'))
+		return 0;
+
+	/*
+	 * Is it an empty line or not a valid rfc2822 header?
+	 * If so, stop here, and return false ("not a header")
+	 */
+	strbuf_rtrim(line);
+	if (!line->len || !is_rfc2822_header(line)) {
+		/* Re-add the newline */
+		strbuf_addch(line, '\n');
+		return 0;
+	}
+
+	/*
+	 * Now we need to eat all the continuation lines..
+	 * Yuck, 2822 header "folding"
+	 */
+	for (;;) {
+		int peek;
+
+		peek = fgetc(in); ungetc(peek, in);
+		if (peek != ' ' && peek != '\t')
+			break;
+		if (strbuf_getline(&continuation, in, '\n'))
+			break;
+		continuation.buf[0] = ' ';
+		strbuf_rtrim(&continuation);
+		strbuf_addbuf(line, &continuation);
+	}
+	strbuf_release(&continuation);
+
+	return 1;
+}
+
+static int find_boundary(struct mailinfo *mi, struct strbuf *line)
+{
+	while (!strbuf_getline(line, mi->input, '\n')) {
+		if (*(mi->content_top) && is_multipart_boundary(mi, line))
+			return 1;
+	}
+	return 0;
+}
+
+static int handle_boundary(struct mailinfo *mi, struct strbuf *line)
+{
+	struct strbuf newline = STRBUF_INIT;
+
+	strbuf_addch(&newline, '\n');
+again:
+	if (line->len >= (*(mi->content_top))->len + 2 &&
+	    !memcmp(line->buf + (*(mi->content_top))->len, "--", 2)) {
+		/* we hit an end boundary */
+		/* pop the current boundary off the stack */
+		strbuf_release(*(mi->content_top));
+		free(*(mi->content_top));
+		*(mi->content_top) = NULL;
+
+		/* technically won't happen as is_multipart_boundary()
+		   will fail first.  But just in case..
+		 */
+		if (--mi->content_top < mi->content) {
+			error("Detected mismatched boundaries, can't recover");
+			mi->input_error = -1;
+			mi->content_top = mi->content;
+			return 0;
+		}
+		handle_filter(mi, &newline);
+		strbuf_release(&newline);
+		if (mi->input_error)
+			return 0;
+
+		/* skip to the next boundary */
+		if (!find_boundary(mi, line))
+			return 0;
+		goto again;
+	}
+
+	/* set some defaults */
+	mi->transfer_encoding = TE_DONTCARE;
+	strbuf_reset(&mi->charset);
+
+	/* slurp in this section's info */
+	while (read_one_header_line(line, mi->input))
+		check_header(mi, line, mi->p_hdr_data, 0);
+
+	strbuf_release(&newline);
+	/* replenish line */
+	if (strbuf_getline(line, mi->input, '\n'))
+		return 0;
+	strbuf_addch(line, '\n');
+	return 1;
+}
+
+static void handle_body(struct mailinfo *mi, struct strbuf *line)
+{
+	struct strbuf prev = STRBUF_INIT;
+
+	/* Skip up to the first boundary */
+	if (*(mi->content_top)) {
+		if (!find_boundary(mi, line))
+			goto handle_body_out;
+	}
+
+	do {
+		/* process any boundary lines */
+		if (*(mi->content_top) && is_multipart_boundary(mi, line)) {
+			/* flush any leftover */
+			if (prev.len) {
+				handle_filter(mi, &prev);
+				strbuf_reset(&prev);
+			}
+			if (!handle_boundary(mi, line))
+				goto handle_body_out;
+		}
+
+		/* Unwrap transfer encoding */
+		decode_transfer_encoding(mi, line);
+
+		switch (mi->transfer_encoding) {
+		case TE_BASE64:
+		case TE_QP:
+		{
+			struct strbuf **lines, **it, *sb;
+
+			/* Prepend any previous partial lines */
+			strbuf_insert(line, 0, prev.buf, prev.len);
+			strbuf_reset(&prev);
+
+			/*
+			 * This is a decoded line that may contain
+			 * multiple new lines.  Pass only one chunk
+			 * at a time to handle_filter()
+			 */
+			lines = strbuf_split(line, '\n');
+			for (it = lines; (sb = *it); it++) {
+				if (*(it + 1) == NULL) /* The last line */
+					if (sb->buf[sb->len - 1] != '\n') {
+						/* Partial line, save it for later. */
+						strbuf_addbuf(&prev, sb);
+						break;
+					}
+				handle_filter(mi, sb);
+			}
+			/*
+			 * The partial chunk is saved in "prev" and will be
+			 * appended by the next iteration of read_line_with_nul().
+			 */
+			strbuf_list_free(lines);
+			break;
+		}
+		default:
+			handle_filter(mi, line);
+		}
+
+		if (mi->input_error)
+			break;
+	} while (!strbuf_getwholeline(line, mi->input, '\n'));
+
+handle_body_out:
+	strbuf_release(&prev);
+}
+
+static void output_header_lines(FILE *fout, const char *hdr, const struct strbuf *data)
+{
+	const char *sp = data->buf;
+	while (1) {
+		char *ep = strchr(sp, '\n');
+		int len;
+		if (!ep)
+			len = strlen(sp);
+		else
+			len = ep - sp;
+		fprintf(fout, "%s: %.*s\n", hdr, len, sp);
+		if (!ep)
+			break;
+		sp = ep + 1;
+	}
+}
+
+static void handle_info(struct mailinfo *mi)
+{
+	struct strbuf *hdr;
+	int i;
+
+	for (i = 0; header[i]; i++) {
+		/* only print inbody headers if we output a patch file */
+		if (mi->patch_lines && mi->s_hdr_data[i])
+			hdr = mi->s_hdr_data[i];
+		else if (mi->p_hdr_data[i])
+			hdr = mi->p_hdr_data[i];
+		else
+			continue;
+
+		if (!strcmp(header[i], "Subject")) {
+			if (!mi->keep_subject) {
+				cleanup_subject(mi, hdr);
+				cleanup_space(hdr);
+			}
+			output_header_lines(mi->output, "Subject", hdr);
+		} else if (!strcmp(header[i], "From")) {
+			cleanup_space(hdr);
+			handle_from(mi, hdr);
+			fprintf(mi->output, "Author: %s\n", mi->name.buf);
+			fprintf(mi->output, "Email: %s\n", mi->email.buf);
+		} else {
+			cleanup_space(hdr);
+			fprintf(mi->output, "%s: %s\n", header[i], hdr->buf);
+		}
+	}
+	fprintf(mi->output, "\n");
+}
+
+int mailinfo(struct mailinfo *mi, const char *msg, const char *patch)
+{
+	FILE *cmitmsg;
+	int peek;
+	struct strbuf line = STRBUF_INIT;
+
+	cmitmsg = fopen(msg, "w");
+	if (!cmitmsg) {
+		perror(msg);
+		return -1;
+	}
+	mi->patchfile = fopen(patch, "w");
+	if (!mi->patchfile) {
+		perror(patch);
+		fclose(cmitmsg);
+		return -1;
+	}
+
+	mi->p_hdr_data = xcalloc(MAX_HDR_PARSED, sizeof(*(mi->p_hdr_data)));
+	mi->s_hdr_data = xcalloc(MAX_HDR_PARSED, sizeof(*(mi->s_hdr_data)));
+
+	do {
+		peek = fgetc(mi->input);
+	} while (isspace(peek));
+	ungetc(peek, mi->input);
+
+	/* process the email header */
+	while (read_one_header_line(&line, mi->input))
+		check_header(mi, &line, mi->p_hdr_data, 1);
+
+	handle_body(mi, &line);
+	fwrite(mi->log_message.buf, 1, mi->log_message.len, cmitmsg);
+	fclose(cmitmsg);
+	fclose(mi->patchfile);
+
+	handle_info(mi);
+	strbuf_release(&line);
+	return mi->input_error;
+}
+
+static int git_mailinfo_config(const char *var, const char *value, void *mi_)
+{
+	struct mailinfo *mi = mi_;
+
+	if (!starts_with(var, "mailinfo."))
+		return git_default_config(var, value, NULL);
+	if (!strcmp(var, "mailinfo.scissors")) {
+		mi->use_scissors = git_config_bool(var, value);
+		return 0;
+	}
+	/* perhaps others here */
+	return 0;
+}
+
+void setup_mailinfo(struct mailinfo *mi)
+{
+	memset(mi, 0, sizeof(*mi));
+	strbuf_init(&mi->name, 0);
+	strbuf_init(&mi->email, 0);
+	strbuf_init(&mi->charset, 0);
+	strbuf_init(&mi->log_message, 0);
+	mi->header_stage = 1;
+	mi->use_inbody_headers = 1;
+	mi->content_top = mi->content;
+	git_config(git_mailinfo_config, mi);
+}
+
+void clear_mailinfo(struct mailinfo *mi)
+{
+	int i;
+
+	strbuf_release(&mi->name);
+	strbuf_release(&mi->email);
+	strbuf_release(&mi->charset);
+	free(mi->message_id);
+
+	for (i = 0; mi->p_hdr_data[i]; i++)
+		strbuf_release(mi->p_hdr_data[i]);
+	free(mi->p_hdr_data);
+	for (i = 0; mi->s_hdr_data[i]; i++)
+		strbuf_release(mi->s_hdr_data[i]);
+	free(mi->s_hdr_data);
+
+	while (mi->content < mi->content_top) {
+		free(*(mi->content_top));
+		mi->content_top--;
+	}
+
+	strbuf_release(&mi->log_message);
+}
diff --git a/mailinfo.h b/mailinfo.h
new file mode 100644
index 0000000..93776a7
--- /dev/null
+++ b/mailinfo.h
@@ -0,0 +1,41 @@
+#ifndef MAILINFO_H
+#define MAILINFO_H
+
+#define MAX_BOUNDARIES 5
+
+struct mailinfo {
+	FILE *input;
+	FILE *output;
+	FILE *patchfile;
+
+	struct strbuf name;
+	struct strbuf email;
+	int keep_subject;
+	int keep_non_patch_brackets_in_subject;
+	int add_message_id;
+	int use_scissors;
+	int use_inbody_headers;
+	const char *metainfo_charset;
+
+	struct strbuf *content[MAX_BOUNDARIES];
+	struct strbuf **content_top;
+	struct strbuf charset;
+	char *message_id;
+	enum  {
+		TE_DONTCARE, TE_QP, TE_BASE64
+	} transfer_encoding;
+	int patch_lines;
+	int filter_stage; /* still reading log or are we copying patch? */
+	int header_stage; /* still checking in-body headers? */
+	struct strbuf **p_hdr_data;
+	struct strbuf **s_hdr_data;
+
+	struct strbuf log_message;
+	int input_error;
+};
+
+extern void setup_mailinfo(struct mailinfo *);
+extern int mailinfo(struct mailinfo *, const char *msg, const char *patch);
+extern void clear_mailinfo(struct mailinfo *);
+
+#endif /* MAILINFO_H */
diff --git a/mailmap.c b/mailmap.c
index 9e95897..f4a0f1c 100644
--- a/mailmap.c
+++ b/mailmap.c
@@ -162,11 +162,10 @@
 			char *cp;
 
 			free(*repo_abbrev);
-			*repo_abbrev = xmalloc(len);
 
 			for (cp = buffer + abblen; isspace(*cp); cp++)
 				; /* nothing */
-			strcpy(*repo_abbrev, cp);
+			*repo_abbrev = xstrdup(cp);
 		}
 		return;
 	}
diff --git a/merge-blobs.c b/merge-blobs.c
index 7abb894..9b6eac2 100644
--- a/merge-blobs.c
+++ b/merge-blobs.c
@@ -11,7 +11,7 @@
 	unsigned long size;
 	enum object_type type;
 
-	buf = read_sha1_file(obj->object.sha1, &type, &size);
+	buf = read_sha1_file(obj->object.oid.hash, &type, &size);
 	if (!buf)
 		return -1;
 	if (type != OBJ_BLOB) {
@@ -48,40 +48,6 @@
 	return res.ptr;
 }
 
-static int common_outf(void *priv_, mmbuffer_t *mb, int nbuf)
-{
-	int i;
-	mmfile_t *dst = priv_;
-
-	for (i = 0; i < nbuf; i++) {
-		memcpy(dst->ptr + dst->size, mb[i].ptr, mb[i].size);
-		dst->size += mb[i].size;
-	}
-	return 0;
-}
-
-static int generate_common_file(mmfile_t *res, mmfile_t *f1, mmfile_t *f2)
-{
-	unsigned long size = f1->size < f2->size ? f1->size : f2->size;
-	void *ptr = xmalloc(size);
-	xpparam_t xpp;
-	xdemitconf_t xecfg;
-	xdemitcb_t ecb;
-
-	memset(&xpp, 0, sizeof(xpp));
-	xpp.flags = 0;
-	memset(&xecfg, 0, sizeof(xecfg));
-	xecfg.ctxlen = 3;
-	xecfg.flags = XDL_EMIT_COMMON;
-	ecb.outf = common_outf;
-
-	res->ptr = ptr;
-	res->size = 0;
-
-	ecb.priv = res;
-	return xdi_diff(f1, f2, &xpp, &xecfg, &ecb);
-}
-
 void *merge_blobs(const char *path, struct blob *base, struct blob *our, struct blob *their, unsigned long *size)
 {
 	void *res = NULL;
@@ -100,7 +66,7 @@
 			return NULL;
 		if (!our)
 			our = their;
-		return read_sha1_file(our->object.sha1, &type, size);
+		return read_sha1_file(our->object.oid.hash, &type, size);
 	}
 
 	if (fill_mmfile_blob(&f1, our) < 0)
@@ -112,8 +78,8 @@
 		if (fill_mmfile_blob(&common, base) < 0)
 			goto out_free_f2_f1;
 	} else {
-		if (generate_common_file(&common, &f1, &f2) < 0)
-			goto out_free_f2_f1;
+		common.ptr = xstrdup("");
+		common.size = 0;
 	}
 	res = three_way_filemerge(path, &common, &f1, &f2, size);
 	free_mmfile(&common);
diff --git a/merge-recursive.c b/merge-recursive.c
index b446df9..8eabde2 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -26,17 +26,17 @@
 static struct tree *shift_tree_object(struct tree *one, struct tree *two,
 				      const char *subtree_shift)
 {
-	unsigned char shifted[20];
+	struct object_id shifted;
 
 	if (!*subtree_shift) {
-		shift_tree(one->object.sha1, two->object.sha1, shifted, 0);
+		shift_tree(one->object.oid.hash, two->object.oid.hash, shifted.hash, 0);
 	} else {
-		shift_tree_by(one->object.sha1, two->object.sha1, shifted,
+		shift_tree_by(one->object.oid.hash, two->object.oid.hash, shifted.hash,
 			      subtree_shift);
 	}
-	if (!hashcmp(two->object.sha1, shifted))
+	if (!oidcmp(&two->object.oid, &shifted))
 		return two;
-	return lookup_tree(shifted);
+	return lookup_tree(shifted.hash);
 }
 
 static struct commit *make_virtual_commit(struct tree *tree, const char *comment)
@@ -184,7 +184,7 @@
 	if (commit->util)
 		printf("virtual %s\n", merge_remote_util(commit)->name);
 	else {
-		printf("%s ", find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV));
+		printf("%s ", find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV));
 		if (parse_commit(commit) != 0)
 			printf(_("(bad commit)\n"));
 		else {
@@ -313,11 +313,11 @@
 {
 	struct string_list_item *item;
 	struct stage_data *e = xcalloc(1, sizeof(struct stage_data));
-	get_tree_entry(o->object.sha1, path,
+	get_tree_entry(o->object.oid.hash, path,
 			e->stages[1].sha, &e->stages[1].mode);
-	get_tree_entry(a->object.sha1, path,
+	get_tree_entry(a->object.oid.hash, path,
 			e->stages[2].sha, &e->stages[2].mode);
-	get_tree_entry(b->object.sha1, path,
+	get_tree_entry(b->object.oid.hash, path,
 			e->stages[3].sha, &e->stages[3].mode);
 	item = string_list_insert(entries, path);
 	item->util = e;
@@ -493,7 +493,7 @@
 	opts.show_rename_progress = o->show_rename_progress;
 	opts.output_format = DIFF_FORMAT_NO_OUTPUT;
 	diff_setup_done(&opts);
-	diff_tree_sha1(o_tree->object.sha1, tree->object.sha1, "", &opts);
+	diff_tree_sha1(o_tree->object.oid.hash, tree->object.oid.hash, "", &opts);
 	diffcore_std(&opts);
 	if (opts.needed_rename_limit > o->needed_rename_limit)
 		o->needed_rename_limit = opts.needed_rename_limit;
@@ -630,25 +630,24 @@
 
 static int dir_in_way(const char *path, int check_working_copy)
 {
-	int pos, pathlen = strlen(path);
-	char *dirpath = xmalloc(pathlen + 2);
+	int pos;
+	struct strbuf dirpath = STRBUF_INIT;
 	struct stat st;
 
-	strcpy(dirpath, path);
-	dirpath[pathlen] = '/';
-	dirpath[pathlen+1] = '\0';
+	strbuf_addstr(&dirpath, path);
+	strbuf_addch(&dirpath, '/');
 
-	pos = cache_name_pos(dirpath, pathlen+1);
+	pos = cache_name_pos(dirpath.buf, dirpath.len);
 
 	if (pos < 0)
 		pos = -1 - pos;
 	if (pos < active_nr &&
-	    !strncmp(dirpath, active_cache[pos]->name, pathlen+1)) {
-		free(dirpath);
+	    !strncmp(dirpath.buf, active_cache[pos]->name, dirpath.len)) {
+		strbuf_release(&dirpath);
 		return 1;
 	}
 
-	free(dirpath);
+	strbuf_release(&dirpath);
 	return check_working_copy && !lstat(path, &st) && S_ISDIR(st.st_mode);
 }
 
@@ -1813,7 +1812,7 @@
 		common = shift_tree_object(head, common, o->subtree_shift);
 	}
 
-	if (sha_eq(common->object.sha1, merge->object.sha1)) {
+	if (sha_eq(common->object.oid.hash, merge->object.oid.hash)) {
 		output(o, 0, _("Already up-to-date!"));
 		*result = head;
 		return 1;
@@ -1824,8 +1823,8 @@
 	if (code != 0) {
 		if (show(o, 4) || o->call_depth)
 			die(_("merging of trees %s and %s failed"),
-			    sha1_to_hex(head->object.sha1),
-			    sha1_to_hex(merge->object.sha1));
+			    oid_to_hex(&head->object.oid),
+			    oid_to_hex(&merge->object.oid));
 		else
 			exit(128);
 	}
diff --git a/merge.c b/merge.c
index fcff632..5db7d56 100644
--- a/merge.c
+++ b/merge.c
@@ -10,7 +10,7 @@
 static const char *merge_argument(struct commit *commit)
 {
 	if (commit)
-		return sha1_to_hex(commit->object.sha1);
+		return oid_to_hex(&commit->object.oid);
 	else
 		return EMPTY_TREE_SHA1_HEX;
 }
diff --git a/mergetools/vimdiff b/mergetools/vimdiff
index 1ddfbfc..74ea6d5 100644
--- a/mergetools/vimdiff
+++ b/mergetools/vimdiff
@@ -9,8 +9,8 @@
 	gvimdiff|vimdiff)
 		if $base_present
 		then
-			"$merge_tool_path" -f -d -c 'wincmd J' \
-				"$MERGED" "$LOCAL" "$BASE" "$REMOTE"
+			"$merge_tool_path" -f -d -c '4wincmd w | wincmd J' \
+				"$LOCAL" "$BASE" "$REMOTE" "$MERGED"
 		else
 			"$merge_tool_path" -f -d -c 'wincmd l' \
 				"$LOCAL" "$MERGED" "$REMOTE"
diff --git a/name-hash.c b/name-hash.c
index 332ba95..6d9f23e 100644
--- a/name-hash.c
+++ b/name-hash.c
@@ -55,10 +55,9 @@
 	dir = find_dir_entry(istate, ce->name, namelen);
 	if (!dir) {
 		/* not found, create it and add to hash table */
-		dir = xcalloc(1, sizeof(struct dir_entry) + namelen + 1);
+		FLEX_ALLOC_MEM(dir, name, ce->name, namelen);
 		hashmap_entry_init(dir, memihash(ce->name, namelen));
 		dir->namelen = namelen;
-		strncpy(dir->name, ce->name, namelen);
 		hashmap_add(&istate->dir_hash, dir);
 
 		/* recursively add missing parent directories */
diff --git a/notes-merge.c b/notes-merge.c
index b3d1dab..34bfac0 100644
--- a/notes-merge.c
+++ b/notes-merge.c
@@ -602,15 +602,15 @@
 		if (o->verbosity >= 4)
 			printf("No merge base found; doing history-less merge\n");
 	} else if (!bases->next) {
-		base_sha1 = bases->item->object.sha1;
-		base_tree_sha1 = bases->item->tree->object.sha1;
+		base_sha1 = bases->item->object.oid.hash;
+		base_tree_sha1 = bases->item->tree->object.oid.hash;
 		if (o->verbosity >= 4)
 			printf("One merge base found (%.7s)\n",
 				sha1_to_hex(base_sha1));
 	} else {
 		/* TODO: How to handle multiple merge-bases? */
-		base_sha1 = bases->item->object.sha1;
-		base_tree_sha1 = bases->item->tree->object.sha1;
+		base_sha1 = bases->item->object.oid.hash;
+		base_tree_sha1 = bases->item->tree->object.oid.hash;
 		if (o->verbosity >= 3)
 			printf("Multiple merge bases found. Using the first "
 				"(%.7s)\n", sha1_to_hex(base_sha1));
@@ -618,27 +618,27 @@
 
 	if (o->verbosity >= 4)
 		printf("Merging remote commit %.7s into local commit %.7s with "
-			"merge-base %.7s\n", sha1_to_hex(remote->object.sha1),
-			sha1_to_hex(local->object.sha1),
+			"merge-base %.7s\n", oid_to_hex(&remote->object.oid),
+			oid_to_hex(&local->object.oid),
 			sha1_to_hex(base_sha1));
 
-	if (!hashcmp(remote->object.sha1, base_sha1)) {
+	if (!hashcmp(remote->object.oid.hash, base_sha1)) {
 		/* Already merged; result == local commit */
 		if (o->verbosity >= 2)
 			printf("Already up-to-date!\n");
-		hashcpy(result_sha1, local->object.sha1);
+		hashcpy(result_sha1, local->object.oid.hash);
 		goto found_result;
 	}
-	if (!hashcmp(local->object.sha1, base_sha1)) {
+	if (!hashcmp(local->object.oid.hash, base_sha1)) {
 		/* Fast-forward; result == remote commit */
 		if (o->verbosity >= 2)
 			printf("Fast-forward\n");
-		hashcpy(result_sha1, remote->object.sha1);
+		hashcpy(result_sha1, remote->object.oid.hash);
 		goto found_result;
 	}
 
-	result = merge_from_diffs(o, base_tree_sha1, local->tree->object.sha1,
-				  remote->tree->object.sha1, local_tree);
+	result = merge_from_diffs(o, base_tree_sha1, local->tree->object.oid.hash,
+				  remote->tree->object.oid.hash, local_tree);
 
 	if (result != 0) { /* non-trivial merge (with or without conflicts) */
 		/* Commit (partial) result */
diff --git a/notes.c b/notes.c
index eacd2a6..8b59ccd 100644
--- a/notes.c
+++ b/notes.c
@@ -539,6 +539,9 @@
 	return fanout + 1;
 }
 
+/* hex SHA1 + 19 * '/' + NUL */
+#define FANOUT_PATH_MAX 40 + 19 + 1
+
 static void construct_path_with_fanout(const unsigned char *sha1,
 		unsigned char fanout, char *path)
 {
@@ -551,7 +554,7 @@
 		path[i++] = '/';
 		fanout--;
 	}
-	strcpy(path + i, hex_sha1 + j);
+	xsnprintf(path + i, FANOUT_PATH_MAX - i, "%s", hex_sha1 + j);
 }
 
 static int for_each_note_helper(struct notes_tree *t, struct int_node *tree,
@@ -562,7 +565,7 @@
 	void *p;
 	int ret = 0;
 	struct leaf_node *l;
-	static char path[40 + 19 + 1];  /* hex SHA1 + 19 * '/' + NUL */
+	static char path[FANOUT_PATH_MAX];
 
 	fanout = determine_fanout(tree, n, fanout);
 	for (i = 0; i < 16; i++) {
@@ -595,7 +598,7 @@
 				/* invoke callback with subtree */
 				unsigned int path_len =
 					l->key_sha1[19] * 2 + fanout;
-				assert(path_len < 40 + 19);
+				assert(path_len < FANOUT_PATH_MAX - 1);
 				construct_path_with_fanout(l->key_sha1, fanout,
 							   path);
 				/* Create trailing slash, if needed */
@@ -1029,7 +1032,7 @@
 	struct string_list_item *item;
 	int counter = 0;
 	struct notes_tree **trees;
-	trees = xmalloc((refs->nr+1) * sizeof(struct notes_tree *));
+	ALLOC_ARRAY(trees, refs->nr + 1);
 	for_each_string_list_item(item, refs) {
 		struct notes_tree *t = xcalloc(1, sizeof(struct notes_tree));
 		init_notes(t, item->string, combine_notes_ignore, 0);
diff --git a/object.c b/object.c
index 980ac5f..67d9a9e 100644
--- a/object.c
+++ b/object.c
@@ -68,7 +68,7 @@
  */
 static void insert_obj_hash(struct object *obj, struct object **hash, unsigned int size)
 {
-	unsigned int j = hash_obj(obj->sha1, size);
+	unsigned int j = hash_obj(obj->oid.hash, size);
 
 	while (hash[j]) {
 		j++;
@@ -92,7 +92,7 @@
 
 	first = i = hash_obj(sha1, obj_hash_size);
 	while ((obj = obj_hash[i]) != NULL) {
-		if (!hashcmp(sha1, obj->sha1))
+		if (!hashcmp(sha1, obj->oid.hash))
 			break;
 		i++;
 		if (i == obj_hash_size)
@@ -145,7 +145,7 @@
 	obj->parsed = 0;
 	obj->used = 0;
 	obj->flags = 0;
-	hashcpy(obj->sha1, sha1);
+	hashcpy(obj->oid.hash, sha1);
 
 	if (obj_hash_size - 1 <= nr_objs * 2)
 		grow_object_hash();
@@ -168,7 +168,7 @@
 	else {
 		if (!quiet)
 			error("object %s is a %s, not a %s",
-			      sha1_to_hex(obj->sha1),
+			      oid_to_hex(&obj->oid),
 			      typename(obj->type), typename(type));
 		return NULL;
 	}
diff --git a/object.h b/object.h
index 6416247..f8b6442 100644
--- a/object.h
+++ b/object.h
@@ -49,7 +49,7 @@
 	unsigned used : 1;
 	unsigned type : TYPE_BITS;
 	unsigned flags : FLAG_BITS;
-	unsigned char sha1[20];
+	struct object_id oid;
 };
 
 extern const char *typename(unsigned int type);
diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c
index b2f6cb5..c30bcd0 100644
--- a/pack-bitmap-write.c
+++ b/pack-bitmap-write.c
@@ -151,7 +151,7 @@
 static void show_object(struct object *object, const char *name, void *data)
 {
 	struct bitmap *base = data;
-	bitmap_set(base, find_object_pos(object->sha1));
+	bitmap_set(base, find_object_pos(object->oid.hash));
 	mark_as_seen(object);
 }
 
@@ -164,12 +164,12 @@
 add_to_include_set(struct bitmap *base, struct commit *commit)
 {
 	khiter_t hash_pos;
-	uint32_t bitmap_pos = find_object_pos(commit->object.sha1);
+	uint32_t bitmap_pos = find_object_pos(commit->object.oid.hash);
 
 	if (bitmap_get(base, bitmap_pos))
 		return 0;
 
-	hash_pos = kh_get_sha1(writer.bitmaps, commit->object.sha1);
+	hash_pos = kh_get_sha1(writer.bitmaps, commit->object.oid.hash);
 	if (hash_pos < kh_end(writer.bitmaps)) {
 		struct bitmapped_commit *bc = kh_value(writer.bitmaps, hash_pos);
 		bitmap_or_ewah(base, bc->bitmap);
@@ -307,10 +307,10 @@
 		if (i >= reuse_after)
 			stored->flags |= BITMAP_FLAG_REUSE;
 
-		hash_pos = kh_put_sha1(writer.bitmaps, object->sha1, &hash_ret);
+		hash_pos = kh_put_sha1(writer.bitmaps, object->oid.hash, &hash_ret);
 		if (hash_ret == 0)
 			die("Duplicate entry when writing index: %s",
-			    sha1_to_hex(object->sha1));
+			    oid_to_hex(&object->oid));
 
 		kh_value(writer.bitmaps, hash_pos) = stored;
 		display_progress(writer.progress, writer.selected_nr - i);
@@ -413,14 +413,14 @@
 
 		if (next == 0) {
 			chosen = indexed_commits[i];
-			reused_bitmap = find_reused_bitmap(chosen->object.sha1);
+			reused_bitmap = find_reused_bitmap(chosen->object.oid.hash);
 		} 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.sha1);
+				reused_bitmap = find_reused_bitmap(cm->object.oid.hash);
 				if (reused_bitmap || (cm->object.flags & NEEDS_BITMAP) != 0) {
 					chosen = cm;
 					break;
@@ -473,7 +473,7 @@
 		struct bitmapped_commit *stored = &writer.selected[i];
 
 		int commit_pos =
-			sha1_pos(stored->commit->object.sha1, index, index_nr, sha1_access);
+			sha1_pos(stored->commit->object.oid.hash, index, index_nr, sha1_access);
 
 		if (commit_pos < 0)
 			die("BUG: trying to write commit not in index");
diff --git a/pack-bitmap.c b/pack-bitmap.c
index aee7acf..d923946 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -252,16 +252,11 @@
 
 static char *pack_bitmap_filename(struct packed_git *p)
 {
-	char *idx_name;
-	int len;
+	size_t len;
 
-	len = strlen(p->pack_name) - strlen(".pack");
-	idx_name = xmalloc(len + strlen(".bitmap") + 1);
-
-	memcpy(idx_name, p->pack_name, len);
-	memcpy(idx_name + len, ".bitmap", strlen(".bitmap") + 1);
-
-	return idx_name;
+	if (!strip_suffix(p->pack_name, ".pack", &len))
+		die("BUG: pack_name does not end in .pack");
+	return xstrfmt("%.*s.bitmap", (int)len, p->pack_name);
 }
 
 static int open_pack_bitmap_1(struct packed_git *packfile)
@@ -402,7 +397,7 @@
 	int hash_ret;
 	int bitmap_pos;
 
-	hash_pos = kh_put_sha1_pos(eindex->positions, object->sha1, &hash_ret);
+	hash_pos = kh_put_sha1_pos(eindex->positions, object->oid.hash, &hash_ret);
 	if (hash_ret > 0) {
 		if (eindex->count >= eindex->alloc) {
 			eindex->alloc = (eindex->alloc + 16) * 3 / 2;
@@ -427,7 +422,7 @@
 	struct bitmap *base = data;
 	int bitmap_pos;
 
-	bitmap_pos = bitmap_position(object->sha1);
+	bitmap_pos = bitmap_position(object->oid.hash);
 
 	if (bitmap_pos < 0)
 		bitmap_pos = ext_index_add_object(object, name);
@@ -467,11 +462,11 @@
 	struct include_data *data = _data;
 	int bitmap_pos;
 
-	bitmap_pos = bitmap_position(commit->object.sha1);
+	bitmap_pos = bitmap_position(commit->object.oid.hash);
 	if (bitmap_pos < 0)
 		bitmap_pos = ext_index_add_object((struct object *)commit, NULL);
 
-	if (!add_to_include_set(data, commit->object.sha1, bitmap_pos)) {
+	if (!add_to_include_set(data, commit->object.oid.hash, bitmap_pos)) {
 		struct commit_list *parent = commit->parents;
 
 		while (parent) {
@@ -507,7 +502,7 @@
 		roots = roots->next;
 
 		if (object->type == OBJ_COMMIT) {
-			khiter_t pos = kh_get_sha1(bitmap_git.bitmaps, object->sha1);
+			khiter_t pos = kh_get_sha1(bitmap_git.bitmaps, object->oid.hash);
 
 			if (pos < kh_end(bitmap_git.bitmaps)) {
 				struct stored_bitmap *st = kh_value(bitmap_git.bitmaps, pos);
@@ -549,7 +544,7 @@
 		int pos;
 
 		roots = roots->next;
-		pos = bitmap_position(object->sha1);
+		pos = bitmap_position(object->oid.hash);
 
 		if (pos < 0 || base == NULL || !bitmap_get(base, pos)) {
 			object->flags &= ~UNINTERESTING;
@@ -594,7 +589,7 @@
 			continue;
 
 		obj = eindex->objects[i];
-		show_reach(obj->sha1, obj->type, 0, eindex->hashes[i], NULL, 0);
+		show_reach(obj->oid.hash, obj->type, 0, eindex->hashes[i], NULL, 0);
 	}
 }
 
@@ -651,7 +646,7 @@
 		struct object *object = roots->item;
 		roots = roots->next;
 
-		if (find_pack_entry_one(object->sha1, bitmap_git.pack) > 0)
+		if (find_pack_entry_one(object->oid.hash, bitmap_git.pack) > 0)
 			return 1;
 	}
 
@@ -681,7 +676,7 @@
 		struct object *object = pending_e[i].item;
 
 		if (object->type == OBJ_NONE)
-			parse_object_or_die(object->sha1, NULL);
+			parse_object_or_die(object->oid.hash, NULL);
 
 		while (object->type == OBJ_TAG) {
 			struct tag *tag = (struct tag *) object;
@@ -693,7 +688,7 @@
 
 			if (!tag->tagged)
 				die("bad tag");
-			object = parse_object_or_die(tag->tagged->sha1, NULL);
+			object = parse_object_or_die(tag->tagged->oid.hash, NULL);
 		}
 
 		if (object->flags & UNINTERESTING)
@@ -904,9 +899,9 @@
 	struct bitmap_test_data *tdata = data;
 	int bitmap_pos;
 
-	bitmap_pos = bitmap_position(object->sha1);
+	bitmap_pos = bitmap_position(object->oid.hash);
 	if (bitmap_pos < 0)
-		die("Object not in bitmap: %s\n", sha1_to_hex(object->sha1));
+		die("Object not in bitmap: %s\n", oid_to_hex(&object->oid));
 
 	bitmap_set(tdata->base, bitmap_pos);
 	display_progress(tdata->prg, ++tdata->seen);
@@ -917,9 +912,9 @@
 	struct bitmap_test_data *tdata = data;
 	int bitmap_pos;
 
-	bitmap_pos = bitmap_position(commit->object.sha1);
+	bitmap_pos = bitmap_position(commit->object.oid.hash);
 	if (bitmap_pos < 0)
-		die("Object not in bitmap: %s\n", sha1_to_hex(commit->object.sha1));
+		die("Object not in bitmap: %s\n", oid_to_hex(&commit->object.oid));
 
 	bitmap_set(tdata->base, bitmap_pos);
 	display_progress(tdata->prg, ++tdata->seen);
@@ -943,20 +938,20 @@
 		bitmap_git.version, bitmap_git.entry_count);
 
 	root = revs->pending.objects[0].item;
-	pos = kh_get_sha1(bitmap_git.bitmaps, root->sha1);
+	pos = kh_get_sha1(bitmap_git.bitmaps, root->oid.hash);
 
 	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);
 
 		fprintf(stderr, "Found bitmap for %s. %d bits / %08x checksum\n",
-			sha1_to_hex(root->sha1), (int)bm->bit_size, ewah_checksum(bm));
+			oid_to_hex(&root->oid), (int)bm->bit_size, ewah_checksum(bm));
 
 		result = ewah_to_bitmap(bm);
 	}
 
 	if (result == NULL)
-		die("Commit %s doesn't have an indexed bitmap", sha1_to_hex(root->sha1));
+		die("Commit %s doesn't have an indexed bitmap", oid_to_hex(&root->oid));
 
 	revs->tag_objects = 1;
 	revs->tree_objects = 1;
diff --git a/pack-check.c b/pack-check.c
index 433bd86..1da89a4 100644
--- a/pack-check.c
+++ b/pack-check.c
@@ -89,7 +89,7 @@
 	 * we do not do scan-streaming check on the pack file.
 	 */
 	nr_objects = p->num_objects;
-	entries = xmalloc((nr_objects + 1) * sizeof(*entries));
+	ALLOC_ARRAY(entries, nr_objects + 1);
 	entries[nr_objects].offset = pack_sig_ofs;
 	/* first sort entries by pack offset, since unpacking them is more efficient that way */
 	for (i = 0; i < nr_objects; i++) {
diff --git a/pack-revindex.c b/pack-revindex.c
index e542ea7..f6a3613 100644
--- a/pack-revindex.c
+++ b/pack-revindex.c
@@ -83,10 +83,14 @@
 	 * keep track of them with alias pointers, always sorting from "from"
 	 * to "to".
 	 */
-	struct revindex_entry *tmp = xmalloc(n * sizeof(*tmp));
-	struct revindex_entry *from = entries, *to = tmp;
+	struct revindex_entry *tmp, *from, *to;
 	int bits;
-	unsigned *pos = xmalloc(BUCKETS * sizeof(*pos));
+	unsigned *pos;
+
+	ALLOC_ARRAY(pos, BUCKETS);
+	ALLOC_ARRAY(tmp, n);
+	from = entries;
+	to = tmp;
 
 	/*
 	 * If (max >> bits) is zero, then we know that the radix digit we are
@@ -161,7 +165,7 @@
 	unsigned i;
 	const char *index = p->index_data;
 
-	rix->revindex = xmalloc(sizeof(*rix->revindex) * (num_ent + 1));
+	ALLOC_ARRAY(rix->revindex, num_ent + 1);
 	index += 4 * 256;
 
 	if (p->index_version > 1) {
diff --git a/pager.c b/pager.c
index e425070..4bc0481 100644
--- a/pager.c
+++ b/pager.c
@@ -11,7 +11,6 @@
  * something different on Windows.
  */
 
-static const char *pager_argv[] = { NULL, NULL };
 static struct child_process pager_process = CHILD_PROCESS_INIT;
 
 static void wait_for_pager(int in_signal)
@@ -64,6 +63,16 @@
 	return pager;
 }
 
+void prepare_pager_args(struct child_process *pager_process, const char *pager)
+{
+	argv_array_push(&pager_process->args, pager);
+	pager_process->use_shell = 1;
+	if (!getenv("LESS"))
+		argv_array_push(&pager_process->env_array, "LESS=FRX");
+	if (!getenv("LV"))
+		argv_array_push(&pager_process->env_array, "LV=-c");
+}
+
 void setup_pager(void)
 {
 	const char *pager = git_pager(isatty(1));
@@ -80,14 +89,8 @@
 	setenv("GIT_PAGER_IN_USE", "true", 1);
 
 	/* spawn the pager */
-	pager_argv[0] = pager;
-	pager_process.use_shell = 1;
-	pager_process.argv = pager_argv;
+	prepare_pager_args(&pager_process, pager);
 	pager_process.in = -1;
-	if (!getenv("LESS"))
-		argv_array_push(&pager_process.env_array, "LESS=FRX");
-	if (!getenv("LV"))
-		argv_array_push(&pager_process.env_array, "LV=-c");
 	argv_array_push(&pager_process.env_array, "GIT_PAGER_IN_USE");
 	if (start_command(&pager_process))
 		return;
diff --git a/parse-options-cb.c b/parse-options-cb.c
index 5ab6ed6..239898d 100644
--- a/parse-options-cb.c
+++ b/parse-options-cb.c
@@ -5,6 +5,7 @@
 #include "color.h"
 #include "string-list.h"
 #include "argv-array.h"
+#include "sha1-array.h"
 
 /*----- some often used options -----*/
 
@@ -77,7 +78,7 @@
 	return 0;
 }
 
-int parse_opt_with_commit(const struct option *opt, const char *arg, int unset)
+int parse_opt_commits(const struct option *opt, const char *arg, int unset)
 {
 	unsigned char sha1[20];
 	struct commit *commit;
@@ -93,6 +94,22 @@
 	return 0;
 }
 
+int parse_opt_object_name(const struct option *opt, const char *arg, int unset)
+{
+	unsigned char sha1[20];
+
+	if (unset) {
+		sha1_array_clear(opt->value);
+		return 0;
+	}
+	if (!arg)
+		return -1;
+	if (get_sha1(arg, sha1))
+		return error(_("malformed object name '%s'"), arg);
+	sha1_array_append(opt->value, sha1);
+	return 0;
+}
+
 int parse_opt_tertiary(const struct option *opt, const char *arg, int unset)
 {
 	int *target = opt->value;
diff --git a/parse-options.c b/parse-options.c
index 3eceba4..47a9192 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -5,10 +5,6 @@
 #include "color.h"
 #include "utf8.h"
 
-static int parse_options_usage(struct parse_opt_ctx_t *ctx,
-			       const char * const *usagestr,
-			       const struct option *opts, int err);
-
 #define OPT_SHORT 1
 #define OPT_UNSET 2
 
@@ -414,7 +410,7 @@
 			 const struct option *options, int flags)
 {
 	memset(ctx, 0, sizeof(*ctx));
-	ctx->argc = argc - 1;
+	ctx->argc = ctx->total = argc - 1;
 	ctx->argv = argv + 1;
 	ctx->out  = argv;
 	ctx->prefix = prefix;
@@ -435,6 +431,7 @@
 		       const char * const usagestr[])
 {
 	int internal_help = !(ctx->flags & PARSE_OPT_NO_INTERNAL_HELP);
+	int err = 0;
 
 	/* we must reset ->opt, unknown short option leave it dangling */
 	ctx->opt = NULL;
@@ -451,27 +448,32 @@
 			continue;
 		}
 
+		/* lone -h asks for help */
+		if (internal_help && ctx->total == 1 && !strcmp(arg + 1, "h"))
+			goto show_usage;
+
 		if (arg[1] != '-') {
 			ctx->opt = arg + 1;
-			if (internal_help && *ctx->opt == 'h')
-				return parse_options_usage(ctx, usagestr, options, 0);
 			switch (parse_short_opt(ctx, options)) {
 			case -1:
-				return parse_options_usage(ctx, usagestr, options, 1);
+				goto show_usage_error;
 			case -2:
 				if (ctx->opt)
 					check_typos(arg + 1, options);
+				if (internal_help && *ctx->opt == 'h')
+					goto show_usage;
 				goto unknown;
 			}
 			if (ctx->opt)
 				check_typos(arg + 1, options);
 			while (ctx->opt) {
-				if (internal_help && *ctx->opt == 'h')
-					return parse_options_usage(ctx, usagestr, options, 0);
 				switch (parse_short_opt(ctx, options)) {
 				case -1:
-					return parse_options_usage(ctx, usagestr, options, 1);
+					goto show_usage_error;
 				case -2:
+					if (internal_help && *ctx->opt == 'h')
+						goto show_usage;
+
 					/* fake a short option thing to hide the fact that we may have
 					 * started to parse aggregated stuff
 					 *
@@ -496,10 +498,10 @@
 		if (internal_help && !strcmp(arg + 2, "help-all"))
 			return usage_with_options_internal(ctx, usagestr, options, 1, 0);
 		if (internal_help && !strcmp(arg + 2, "help"))
-			return parse_options_usage(ctx, usagestr, options, 0);
+			goto show_usage;
 		switch (parse_long_opt(ctx, arg + 2, options)) {
 		case -1:
-			return parse_options_usage(ctx, usagestr, options, 1);
+			goto show_usage_error;
 		case -2:
 			goto unknown;
 		}
@@ -511,6 +513,11 @@
 		ctx->opt = NULL;
 	}
 	return PARSE_OPT_DONE;
+
+ show_usage_error:
+	err = 1;
+ show_usage:
+	return usage_with_options_internal(ctx, usagestr, options, 0, err);
 }
 
 int parse_options_end(struct parse_opt_ctx_t *ctx)
@@ -656,13 +663,6 @@
 	usage_with_options(usagestr, options);
 }
 
-static int parse_options_usage(struct parse_opt_ctx_t *ctx,
-			       const char * const *usagestr,
-			       const struct option *opts, int err)
-{
-	return usage_with_options_internal(ctx, usagestr, opts, 0, err);
-}
-
 #undef opterror
 int opterror(const struct option *opt, const char *reason, int flags)
 {
diff --git a/parse-options.h b/parse-options.h
index 3f1cc3a..ea4af92 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -199,7 +199,7 @@
 struct parse_opt_ctx_t {
 	const char **argv;
 	const char **out;
-	int argc, cpidx;
+	int argc, cpidx, total;
 	const char *opt;
 	int flags;
 	const char *prefix;
@@ -223,7 +223,8 @@
 extern int parse_opt_expiry_date_cb(const struct option *, const char *, int);
 extern int parse_opt_color_flag_cb(const struct option *, const char *, int);
 extern int parse_opt_verbosity_cb(const struct option *, const char *, int);
-extern int parse_opt_with_commit(const struct option *, const char *, int);
+extern int parse_opt_object_name(const struct option *, const char *, int);
+extern int parse_opt_commits(const struct option *, const char *, int);
 extern int parse_opt_tertiary(const struct option *, const char *, int);
 extern int parse_opt_string_list(const struct option *, const char *, int);
 extern int parse_opt_noop_cb(const struct option *, const char *, int);
@@ -251,5 +252,12 @@
 	{ OPTION_CALLBACK, (s), (l), (v), (a), (h), (f), parse_opt_passthru }
 #define OPT_PASSTHRU_ARGV(s, l, v, a, h, f) \
 	{ OPTION_CALLBACK, (s), (l), (v), (a), (h), (f), parse_opt_passthru_argv }
+#define _OPT_CONTAINS_OR_WITH(name, variable, help, flag) \
+	{ OPTION_CALLBACK, 0, name, (variable), N_("commit"), (help), \
+	  PARSE_OPT_LASTARG_DEFAULT | flag, \
+	  parse_opt_commits, (intptr_t) "HEAD" \
+	}
+#define OPT_CONTAINS(v, h) _OPT_CONTAINS_OR_WITH("contains", v, h, 0)
+#define OPT_WITH(v, h) _OPT_CONTAINS_OR_WITH("with", v, h, PARSE_OPT_HIDDEN)
 
 #endif
diff --git a/patch-ids.c b/patch-ids.c
index bf81b92..b7b3e5a 100644
--- a/patch-ids.c
+++ b/patch-ids.c
@@ -8,10 +8,10 @@
 		    unsigned char *sha1)
 {
 	if (commit->parents)
-		diff_tree_sha1(commit->parents->item->object.sha1,
-		               commit->object.sha1, "", options);
+		diff_tree_sha1(commit->parents->item->object.oid.hash,
+			       commit->object.oid.hash, "", options);
 	else
-		diff_root_tree_sha1(commit->object.sha1, "", options);
+		diff_root_tree_sha1(commit->object.oid.hash, "", options);
 	diffcore_std(options);
 	return diff_flush_patch_id(options, sha1);
 }
diff --git a/path.c b/path.c
index 38f2ebd..8b7e168 100644
--- a/path.c
+++ b/path.c
@@ -91,58 +91,274 @@
 		buf->buf[newlen] = '/';
 }
 
-static const char *common_list[] = {
-	"/branches", "/hooks", "/info", "!/logs", "/lost-found",
-	"/objects", "/refs", "/remotes", "/worktrees", "/rr-cache", "/svn",
-	"config", "!gc.pid", "packed-refs", "shallow",
-	NULL
+struct common_dir {
+	/* Not considered garbage for report_linked_checkout_garbage */
+	unsigned ignore_garbage:1;
+	unsigned is_dir:1;
+	/* Not common even though its parent is */
+	unsigned exclude:1;
+	const char *dirname;
 };
 
-static void update_common_dir(struct strbuf *buf, int git_dir_len, const char *common_dir)
+static struct common_dir common_list[] = {
+	{ 0, 1, 0, "branches" },
+	{ 0, 1, 0, "hooks" },
+	{ 0, 1, 0, "info" },
+	{ 0, 0, 1, "info/sparse-checkout" },
+	{ 1, 1, 0, "logs" },
+	{ 1, 1, 1, "logs/HEAD" },
+	{ 0, 1, 1, "logs/refs/bisect" },
+	{ 0, 1, 0, "lost-found" },
+	{ 0, 1, 0, "objects" },
+	{ 0, 1, 0, "refs" },
+	{ 0, 1, 1, "refs/bisect" },
+	{ 0, 1, 0, "remotes" },
+	{ 0, 1, 0, "worktrees" },
+	{ 0, 1, 0, "rr-cache" },
+	{ 0, 1, 0, "svn" },
+	{ 0, 0, 0, "config" },
+	{ 1, 0, 0, "gc.pid" },
+	{ 0, 0, 0, "packed-refs" },
+	{ 0, 0, 0, "shallow" },
+	{ 0, 0, 0, NULL }
+};
+
+/*
+ * A compressed trie.  A trie node consists of zero or more characters that
+ * are common to all elements with this prefix, optionally followed by some
+ * children.  If value is not NULL, the trie node is a terminal node.
+ *
+ * For example, consider the following set of strings:
+ * abc
+ * def
+ * definite
+ * definition
+ *
+ * The trie would look look like:
+ * root: len = 0, children a and d non-NULL, value = NULL.
+ *    a: len = 2, contents = bc, value = (data for "abc")
+ *    d: len = 2, contents = ef, children i non-NULL, value = (data for "def")
+ *       i: len = 3, contents = nit, children e and i non-NULL, value = NULL
+ *           e: len = 0, children all NULL, value = (data for "definite")
+ *           i: len = 2, contents = on, children all NULL,
+ *              value = (data for "definition")
+ */
+struct trie {
+	struct trie *children[256];
+	int len;
+	char *contents;
+	void *value;
+};
+
+static struct trie *make_trie_node(const char *key, void *value)
 {
-	char *base = buf->buf + git_dir_len;
-	const char **p;
+	struct trie *new_node = xcalloc(1, sizeof(*new_node));
+	new_node->len = strlen(key);
+	if (new_node->len) {
+		new_node->contents = xmalloc(new_node->len);
+		memcpy(new_node->contents, key, new_node->len);
+	}
+	new_node->value = value;
+	return new_node;
+}
 
-	if (is_dir_file(base, "logs", "HEAD") ||
-	    is_dir_file(base, "info", "sparse-checkout"))
-		return;	/* keep this in $GIT_DIR */
-	for (p = common_list; *p; p++) {
-		const char *path = *p;
-		int is_dir = 0;
-		if (*path == '!')
-			path++;
-		if (*path == '/') {
-			path++;
-			is_dir = 1;
+/*
+ * Add a key/value pair to a trie.  The key is assumed to be \0-terminated.
+ * If there was an existing value for this key, return it.
+ */
+static void *add_to_trie(struct trie *root, const char *key, void *value)
+{
+	struct trie *child;
+	void *old;
+	int i;
+
+	if (!*key) {
+		/* we have reached the end of the key */
+		old = root->value;
+		root->value = value;
+		return old;
+	}
+
+	for (i = 0; i < root->len; i++) {
+		if (root->contents[i] == key[i])
+			continue;
+
+		/*
+		 * Split this node: child will contain this node's
+		 * existing children.
+		 */
+		child = malloc(sizeof(*child));
+		memcpy(child->children, root->children, sizeof(root->children));
+
+		child->len = root->len - i - 1;
+		if (child->len) {
+			child->contents = xstrndup(root->contents + i + 1,
+						   child->len);
 		}
+		child->value = root->value;
+		root->value = NULL;
+		root->len = i;
 
-		if (!common_dir)
-			common_dir = get_git_common_dir();
+		memset(root->children, 0, sizeof(root->children));
+		root->children[(unsigned char)root->contents[i]] = child;
 
-		if (is_dir && dir_prefix(base, path)) {
-			replace_dir(buf, git_dir_len, common_dir);
-			return;
-		}
-		if (!is_dir && !strcmp(base, path)) {
-			replace_dir(buf, git_dir_len, common_dir);
-			return;
+		/* This is the newly-added child. */
+		root->children[(unsigned char)key[i]] =
+			make_trie_node(key + i + 1, value);
+		return NULL;
+	}
+
+	/* We have matched the entire compressed section */
+	if (key[i]) {
+		child = root->children[(unsigned char)key[root->len]];
+		if (child) {
+			return add_to_trie(child, key + root->len + 1, value);
+		} else {
+			child = make_trie_node(key + root->len + 1, value);
+			root->children[(unsigned char)key[root->len]] = child;
+			return NULL;
 		}
 	}
+
+	old = root->value;
+	root->value = value;
+	return old;
+}
+
+typedef int (*match_fn)(const char *unmatched, void *data, void *baton);
+
+/*
+ * Search a trie for some key.  Find the longest /-or-\0-terminated
+ * prefix of the key for which the trie contains a value.  Call fn
+ * with the unmatched portion of the key and the found value, and
+ * return its return value.  If there is no such prefix, return -1.
+ *
+ * The key is partially normalized: consecutive slashes are skipped.
+ *
+ * For example, consider the trie containing only [refs,
+ * refs/worktree] (both with values).
+ *
+ * | key             | unmatched  | val from node | return value |
+ * |-----------------|------------|---------------|--------------|
+ * | a               | not called | n/a           | -1           |
+ * | refs            | \0         | refs          | as per fn    |
+ * | refs/           | /          | refs          | as per fn    |
+ * | refs/w          | /w         | refs          | as per fn    |
+ * | refs/worktree   | \0         | refs/worktree | as per fn    |
+ * | refs/worktree/  | /          | refs/worktree | as per fn    |
+ * | refs/worktree/a | /a         | refs/worktree | as per fn    |
+ * |-----------------|------------|---------------|--------------|
+ *
+ */
+static int trie_find(struct trie *root, const char *key, match_fn fn,
+		     void *baton)
+{
+	int i;
+	int result;
+	struct trie *child;
+
+	if (!*key) {
+		/* we have reached the end of the key */
+		if (root->value && !root->len)
+			return fn(key, root->value, baton);
+		else
+			return -1;
+	}
+
+	for (i = 0; i < root->len; i++) {
+		/* Partial path normalization: skip consecutive slashes. */
+		if (key[i] == '/' && key[i+1] == '/') {
+			key++;
+			continue;
+		}
+		if (root->contents[i] != key[i])
+			return -1;
+	}
+
+	/* Matched the entire compressed section */
+	key += i;
+	if (!*key)
+		/* End of key */
+		return fn(key, root->value, baton);
+
+	/* Partial path normalization: skip consecutive slashes */
+	while (key[0] == '/' && key[1] == '/')
+		key++;
+
+	child = root->children[(unsigned char)*key];
+	if (child)
+		result = trie_find(child, key + 1, fn, baton);
+	else
+		result = -1;
+
+	if (result >= 0 || (*key != '/' && *key != 0))
+		return result;
+	if (root->value)
+		return fn(key, root->value, baton);
+	else
+		return -1;
+}
+
+static struct trie common_trie;
+static int common_trie_done_setup;
+
+static void init_common_trie(void)
+{
+	struct common_dir *p;
+
+	if (common_trie_done_setup)
+		return;
+
+	for (p = common_list; p->dirname; p++)
+		add_to_trie(&common_trie, p->dirname, p);
+
+	common_trie_done_setup = 1;
+}
+
+/*
+ * Helper function for update_common_dir: returns 1 if the dir
+ * prefix is common.
+ */
+static int check_common(const char *unmatched, void *value, void *baton)
+{
+	struct common_dir *dir = value;
+
+	if (!dir)
+		return 0;
+
+	if (dir->is_dir && (unmatched[0] == 0 || unmatched[0] == '/'))
+		return !dir->exclude;
+
+	if (!dir->is_dir && unmatched[0] == 0)
+		return !dir->exclude;
+
+	return 0;
+}
+
+static void update_common_dir(struct strbuf *buf, int git_dir_len,
+			      const char *common_dir)
+{
+	char *base = buf->buf + git_dir_len;
+	init_common_trie();
+	if (!common_dir)
+		common_dir = get_git_common_dir();
+	if (trie_find(&common_trie, base, check_common, NULL) > 0)
+		replace_dir(buf, git_dir_len, common_dir);
 }
 
 void report_linked_checkout_garbage(void)
 {
 	struct strbuf sb = STRBUF_INIT;
-	const char **p;
+	const struct common_dir *p;
 	int len;
 
 	if (!git_common_dir_env)
 		return;
 	strbuf_addf(&sb, "%s/", get_git_dir());
 	len = sb.len;
-	for (p = common_list; *p; p++) {
-		const char *path = *p;
-		if (*path == '!')
+	for (p = common_list; p->dirname; p++) {
+		const char *path = p->dirname;
+		if (p->ignore_garbage)
 			continue;
 		strbuf_setlen(&sb, len);
 		strbuf_addstr(&sb, path);
@@ -179,6 +395,16 @@
 	strbuf_cleanup_path(buf);
 }
 
+char *git_path_buf(struct strbuf *buf, const char *fmt, ...)
+{
+	va_list args;
+	strbuf_reset(buf);
+	va_start(args, fmt);
+	do_git_path(buf, fmt, args);
+	va_end(args);
+	return buf->buf;
+}
+
 void strbuf_git_path(struct strbuf *sb, const char *fmt, ...)
 {
 	va_list args;
@@ -236,8 +462,7 @@
 	struct strbuf git_submodule_dir = STRBUF_INIT;
 
 	strbuf_addstr(buf, path);
-	if (buf->len && buf->buf[buf->len - 1] != '/')
-		strbuf_addch(buf, '/');
+	strbuf_complete(buf, '/');
 	strbuf_addstr(buf, ".git");
 
 	git_dir = read_gitfile(buf->buf);
@@ -395,8 +620,8 @@
  */
 const char *enter_repo(const char *path, int strict)
 {
-	static char used_path[PATH_MAX];
-	static char validated_path[PATH_MAX];
+	static struct strbuf validated_path = STRBUF_INIT;
+	static struct strbuf used_path = STRBUF_INIT;
 
 	if (!path)
 		return NULL;
@@ -411,46 +636,47 @@
 		while ((1 < len) && (path[len-1] == '/'))
 			len--;
 
+		/*
+		 * We can handle arbitrary-sized buffers, but this remains as a
+		 * sanity check on untrusted input.
+		 */
 		if (PATH_MAX <= len)
 			return NULL;
-		strncpy(used_path, path, len); used_path[len] = 0 ;
-		strcpy(validated_path, used_path);
 
-		if (used_path[0] == '~') {
-			char *newpath = expand_user_path(used_path);
-			if (!newpath || (PATH_MAX - 10 < strlen(newpath))) {
-				free(newpath);
+		strbuf_reset(&used_path);
+		strbuf_reset(&validated_path);
+		strbuf_add(&used_path, path, len);
+		strbuf_add(&validated_path, path, len);
+
+		if (used_path.buf[0] == '~') {
+			char *newpath = expand_user_path(used_path.buf);
+			if (!newpath)
 				return NULL;
-			}
-			/*
-			 * Copy back into the static buffer. A pity
-			 * since newpath was not bounded, but other
-			 * branches of the if are limited by PATH_MAX
-			 * anyway.
-			 */
-			strcpy(used_path, newpath); free(newpath);
+			strbuf_attach(&used_path, newpath, strlen(newpath),
+				      strlen(newpath));
 		}
-		else if (PATH_MAX - 10 < len)
-			return NULL;
-		len = strlen(used_path);
 		for (i = 0; suffix[i]; i++) {
 			struct stat st;
-			strcpy(used_path + len, suffix[i]);
-			if (!stat(used_path, &st) &&
+			size_t baselen = used_path.len;
+			strbuf_addstr(&used_path, suffix[i]);
+			if (!stat(used_path.buf, &st) &&
 			    (S_ISREG(st.st_mode) ||
-			    (S_ISDIR(st.st_mode) && is_git_directory(used_path)))) {
-				strcat(validated_path, suffix[i]);
+			    (S_ISDIR(st.st_mode) && is_git_directory(used_path.buf)))) {
+				strbuf_addstr(&validated_path, suffix[i]);
 				break;
 			}
+			strbuf_setlen(&used_path, baselen);
 		}
 		if (!suffix[i])
 			return NULL;
-		gitfile = read_gitfile(used_path);
-		if (gitfile)
-			strcpy(used_path, gitfile);
-		if (chdir(used_path))
+		gitfile = read_gitfile(used_path.buf);
+		if (gitfile) {
+			strbuf_reset(&used_path);
+			strbuf_addstr(&used_path, gitfile);
+		}
+		if (chdir(used_path.buf))
 			return NULL;
-		path = validated_path;
+		path = validated_path.buf;
 	}
 	else {
 		const char *gitfile = read_gitfile(path);
@@ -514,6 +740,18 @@
 	return 0;
 }
 
+void safe_create_dir(const char *dir, int share)
+{
+	if (mkdir(dir, 0777) < 0) {
+		if (errno != EEXIST) {
+			perror(dir);
+			exit(1);
+		}
+	}
+	else if (share && adjust_shared_perm(dir))
+		die(_("Could not make %s writable by group"), dir);
+}
+
 static int have_same_root(const char *path1, const char *path2)
 {
 	int is_abs1, is_abs2;
@@ -544,13 +782,10 @@
 	else if (!prefix_len)
 		return in;
 
-	if (have_same_root(in, prefix)) {
+	if (have_same_root(in, prefix))
 		/* bypass dos_drive, for "c:" is identical to "C:" */
-		if (has_dos_drive_prefix(in)) {
-			i = 2;
-			j = 2;
-		}
-	} else {
+		i = j = has_dos_drive_prefix(in);
+	else {
 		return in;
 	}
 
@@ -639,7 +874,7 @@
  */
 const char *remove_leading_path(const char *in, const char *prefix)
 {
-	static char buf[PATH_MAX + 1];
+	static struct strbuf buf = STRBUF_INIT;
 	int i = 0, j = 0;
 
 	if (!prefix || !prefix[0])
@@ -668,11 +903,13 @@
 		return in;
 	while (is_dir_sep(in[j]))
 		j++;
+
+	strbuf_reset(&buf);
 	if (!in[j])
-		strcpy(buf, ".");
+		strbuf_addstr(&buf, ".");
 	else
-		strcpy(buf, in + j);
-	return buf;
+		strbuf_addstr(&buf, in + j);
+	return buf.buf;
 }
 
 /*
@@ -703,11 +940,10 @@
 int normalize_path_copy_len(char *dst, const char *src, int *prefix_len)
 {
 	char *dst0;
+	int i;
 
-	if (has_dos_drive_prefix(src)) {
+	for (i = has_dos_drive_prefix(src); i > 0; i--)
 		*dst++ = *src++;
-		*dst++ = *src++;
-	}
 	dst0 = dst;
 
 	if (is_dir_sep(*src)) {
diff --git a/pathspec.c b/pathspec.c
index 9304ee3..c9e9b6c 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -406,7 +406,8 @@
 		n++;
 
 	pathspec->nr = n;
-	pathspec->items = item = xmalloc(sizeof(*item) * n);
+	ALLOC_ARRAY(pathspec->items, n);
+	item = pathspec->items;
 	pathspec->_raw = argv;
 	prefixlen = prefix ? strlen(prefix) : 0;
 
@@ -483,7 +484,7 @@
 void copy_pathspec(struct pathspec *dst, const struct pathspec *src)
 {
 	*dst = *src;
-	dst->items = xmalloc(sizeof(struct pathspec_item) * dst->nr);
+	ALLOC_ARRAY(dst->items, dst->nr);
 	memcpy(dst->items, src->items,
 	       sizeof(struct pathspec_item) * dst->nr);
 }
diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm
index 152fb7e..b2c14e2 100644
--- a/perl/Git/SVN.pm
+++ b/perl/Git/SVN.pm
@@ -1211,20 +1211,87 @@
 sub mkemptydirs {
 	my ($self, $r) = @_;
 
+	# add/remove/collect a paths table
+	#
+	# Paths are split into a tree of nodes, stored as a hash of hashes.
+	#
+	# Each node contains a 'path' entry for the path (if any) associated
+	# with that node and a 'children' entry for any nodes under that
+	# location.
+	#
+	# Removing a path requires a hash lookup for each component then
+	# dropping that node (and anything under it), which is substantially
+	# faster than a grep slice into a single hash of paths for large
+	# numbers of paths.
+	#
+	# For a large (200K) number of empty_dir directives this reduces
+	# scanning time to 3 seconds vs 10 minutes for grep+delete on a single
+	# hash of paths.
+	sub add_path {
+		my ($paths_table, $path) = @_;
+		my $node_ref;
+
+		foreach my $x (split('/', $path)) {
+			if (!exists($paths_table->{$x})) {
+				$paths_table->{$x} = { children => {} };
+			}
+
+			$node_ref = $paths_table->{$x};
+			$paths_table = $paths_table->{$x}->{children};
+		}
+
+		$node_ref->{path} = $path;
+	}
+
+	sub remove_path {
+		my ($paths_table, $path) = @_;
+		my $nodes_ref;
+		my $node_name;
+
+		foreach my $x (split('/', $path)) {
+			if (!exists($paths_table->{$x})) {
+				return;
+			}
+
+			$nodes_ref = $paths_table;
+			$node_name = $x;
+
+			$paths_table = $paths_table->{$x}->{children};
+		}
+
+		delete($nodes_ref->{$node_name});
+	}
+
+	sub collect_paths {
+		my ($paths_table, $paths_ref) = @_;
+
+		foreach my $v (values %$paths_table) {
+			my $p = $v->{path};
+			my $c = $v->{children};
+
+			collect_paths($c, $paths_ref);
+
+			if (defined($p)) {
+				push(@$paths_ref, $p);
+			}
+		}
+	}
+
 	sub scan {
-		my ($r, $empty_dirs, $line) = @_;
+		my ($r, $paths_table, $line) = @_;
 		if (defined $r && $line =~ /^r(\d+)$/) {
 			return 0 if $1 > $r;
 		} elsif ($line =~ /^  \+empty_dir: (.+)$/) {
-			$empty_dirs->{$1} = 1;
+			add_path($paths_table, $1);
 		} elsif ($line =~ /^  \-empty_dir: (.+)$/) {
-			my @d = grep {m[^\Q$1\E(/|$)]} (keys %$empty_dirs);
-			delete @$empty_dirs{@d};
+			remove_path($paths_table, $1);
 		}
 		1; # continue
 	};
 
-	my %empty_dirs = ();
+	my @empty_dirs;
+	my %paths_table;
+
 	my $gz_file = "$self->{dir}/unhandled.log.gz";
 	if (-f $gz_file) {
 		if (!can_compress()) {
@@ -1235,7 +1302,7 @@
 				die "Unable to open $gz_file: $!\n";
 			my $line;
 			while ($gz->gzreadline($line) > 0) {
-				scan($r, \%empty_dirs, $line) or last;
+				scan($r, \%paths_table, $line) or last;
 			}
 			$gz->gzclose;
 		}
@@ -1244,13 +1311,14 @@
 	if (open my $fh, '<', "$self->{dir}/unhandled.log") {
 		binmode $fh or croak "binmode: $!";
 		while (<$fh>) {
-			scan($r, \%empty_dirs, $_) or last;
+			scan($r, \%paths_table, $_) or last;
 		}
 		close $fh;
 	}
 
+	collect_paths(\%paths_table, \@empty_dirs);
 	my $strip = qr/\A\Q@{[$self->path]}\E(?:\/|$)/;
-	foreach my $d (sort keys %empty_dirs) {
+	foreach my $d (sort @empty_dirs) {
 		$d = uri_decode($d);
 		$d =~ s/$strip//;
 		next unless length($d);
diff --git a/perl/Git/SVN/Ra.pm b/perl/Git/SVN/Ra.pm
index 4a499fc..e764696 100644
--- a/perl/Git/SVN/Ra.pm
+++ b/perl/Git/SVN/Ra.pm
@@ -81,7 +81,6 @@
 	SVN::_Core::svn_config_ensure($config_dir, undef);
 	my ($baton, $callbacks) = SVN::Core::auth_open_helper(_auth_providers);
 	my $config = SVN::Core::config_get_config($config_dir);
-	my $dont_store_passwords = 1;
 	my $conf_t = $config->{'config'};
 
 	no warnings 'once';
@@ -93,9 +92,14 @@
 	    $SVN::_Core::SVN_CONFIG_SECTION_AUTH,
 	    $SVN::_Core::SVN_CONFIG_OPTION_STORE_PASSWORDS,
 	    1) == 0) {
+		my $val = '1';
+		if (::compare_svn_version('1.9.0') < 0) { # pre-SVN r1553823
+			my $dont_store_passwords = 1;
+			$val = bless \$dont_store_passwords, "_p_void";
+		}
 		SVN::_Core::svn_auth_set_parameter($baton,
 		    $SVN::_Core::SVN_AUTH_PARAM_DONT_STORE_PASSWORDS,
-		    bless (\$dont_store_passwords, "_p_void"));
+		    $val);
 	}
 	if (SVN::_Core::svn_config_get_bool($conf_t,
 	    $SVN::_Core::SVN_CONFIG_SECTION_AUTH,
diff --git a/pkt-line.c b/pkt-line.c
index 08a1427..62fdb37 100644
--- a/pkt-line.c
+++ b/pkt-line.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "pkt-line.h"
+#include "run-command.h"
 
 char packet_buffer[LARGE_PACKET_MAX];
 static const char *packet_trace_prefix = "git";
@@ -11,6 +12,11 @@
 	packet_trace_prefix = xstrdup(prog);
 }
 
+static const char *get_trace_prefix(void)
+{
+	return in_async() ? "sideband" : packet_trace_prefix;
+}
+
 static int packet_trace_pack(const char *buf, unsigned int len, int sideband)
 {
 	if (!sideband) {
@@ -57,7 +63,7 @@
 	strbuf_init(&out, len+32);
 
 	strbuf_addf(&out, "packet: %12s%c ",
-		    packet_trace_prefix, write ? '>' : '<');
+		    get_trace_prefix(), write ? '>' : '<');
 
 	/* XXX we should really handle printable utf8 */
 	for (i = 0; i < len; i++) {
diff --git a/po/TEAMS b/po/TEAMS
index 5e1f7e0..df12b58 100644
--- a/po/TEAMS
+++ b/po/TEAMS
@@ -32,6 +32,10 @@
 Leader:		Marco Paolone <marcopaolone AT gmail.com>
 Members:	Stefano Lattarini <stefano.lattarini AT gmail.com>
 
+Language:	ko (Korean)
+Repository:	https://github.com/changwoo/git-l10n-ko/
+Leader:		Changwoo Ryu <cwryu@debian.org>
+
 Language:	pt_PT (Portuguese - Portugal)
 Repository:	https://github.com/marcomsousa/git-l10n-pt_PT/
 Leader:		Marco Sousa <marcomsousa AT gmail.com>
diff --git a/po/bg.po b/po/bg.po
index 164a766..ac6f103 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -60,17 +60,18 @@
 # untracked cache кеш за неследените файлове
 # broken/corrupt повреден
 # restore възстановявам
+# precious objects repo хранилище с важни обекти
+# linked checkout свързано изтегляне
+# term управляваща дума (за git-bisect)
+# mergetag етикет при сливане
+# delta - разлика, делта, обект-разлика
 # ----
-# FAILED to parse неуспешен анализ на... -> неразпозната стойност на
-# blob обект BLOB
+# „$var“ - може да не сработва за shell  има gettext и eval_gettext - проверка - намират се лесно по „$
 # ========================
 # „“…— ●≫ѝ→
 #
-# stressed a
-# форма̀та
-# delta - разлика или делта
 # consistency between stdout - standard output/ stdin - standard input/ stderr - standard error
-# mergetag етикет при сливане
+#
 #
 # ========================
 # RECHECK
@@ -108,8 +109,8 @@
 msgstr ""
 "Project-Id-Version: git master\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2015-07-14 07:19+0800\n"
-"PO-Revision-Date: 2015-07-14 19:05+0300\n"
+"POT-Creation-Date: 2015-12-22 22:50+0800\n"
+"PO-Revision-Date: 2015-12-28 11:32+0200\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
 "Language: bg\n"
@@ -132,95 +133,107 @@
 "Редактирайте ги в работното дърво, и тогава ползвайте „git add/rm ФАЙЛ“\n"
 "за да отбележите коригирането им. След това извършете подаването."
 
-#: archive.c:11
+#: advice.c:101 builtin/merge.c:1225
+msgid "You have not concluded your merge (MERGE_HEAD exists)."
+msgstr "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува)."
+
+#: advice.c:103
+msgid "Please, commit your changes before merging."
+msgstr "Промените трябва да се подадат преди сливане."
+
+#: advice.c:104
+msgid "Exiting because of unfinished merge."
+msgstr "Изход от програмата заради незавършено сливане."
+
+#: archive.c:12
 msgid "git archive [<options>] <tree-ish> [<path>...]"
 msgstr "git archive [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]"
 
-#: archive.c:12
+#: archive.c:13
 msgid "git archive --list"
 msgstr "git archive --list"
 
-#: archive.c:13
+#: archive.c:14
 msgid ""
 "git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
 msgstr ""
 "git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО "
 "[ПЪТ…]"
 
-#: archive.c:14
+#: archive.c:15
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] --list"
 
-#: archive.c:342 builtin/add.c:137 builtin/add.c:428 builtin/rm.c:327
+#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "пътят „%s“ не съвпада с никой файл"
 
-#: archive.c:427
+#: archive.c:429
 msgid "fmt"
 msgstr "ФОРМАТ"
 
-#: archive.c:427
+#: archive.c:429
 msgid "archive format"
 msgstr "ФОРМАТ на архива"
 
-#: archive.c:428 builtin/log.c:1204
+#: archive.c:430 builtin/log.c:1229
 msgid "prefix"
 msgstr "префикс"
 
-#: archive.c:429
+#: archive.c:431
 msgid "prepend prefix to each pathname in the archive"
 msgstr "добавяне на този префикс към всеки път в архива"
 
-#: archive.c:430 builtin/archive.c:88 builtin/blame.c:2516
-#: builtin/blame.c:2517 builtin/config.c:57 builtin/fast-export.c:986
-#: builtin/fast-export.c:988 builtin/grep.c:712 builtin/hash-object.c:99
-#: builtin/ls-files.c:446 builtin/ls-files.c:449 builtin/notes.c:394
-#: builtin/notes.c:557 builtin/read-tree.c:109 parse-options.h:150
+#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535 builtin/blame.c:2536
+#: builtin/config.c:58 builtin/fast-export.c:987 builtin/fast-export.c:989
+#: builtin/grep.c:707 builtin/hash-object.c:99 builtin/ls-files.c:446
+#: builtin/ls-files.c:449 builtin/notes.c:395 builtin/notes.c:558
+#: builtin/read-tree.c:109 parse-options.h:153
 msgid "file"
 msgstr "файл"
 
-#: archive.c:431 builtin/archive.c:89
+#: archive.c:433 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "запазване на архива в този файл"
 
-#: archive.c:433
+#: archive.c:435
 msgid "read .gitattributes in working directory"
 msgstr "изчитане на „.gitattributes“ в работната директория"
 
-#: archive.c:434
+#: archive.c:436
 msgid "report archived files on stderr"
 msgstr "извеждане на архивираните файлове на стандартната грешка"
 
-#: archive.c:435
+#: archive.c:437
 msgid "store only"
 msgstr "само съхранение без компресиране"
 
-#: archive.c:436
+#: archive.c:438
 msgid "compress faster"
 msgstr "бързо компресиране"
 
-#: archive.c:444
+#: archive.c:446
 msgid "compress better"
 msgstr "добро компресиране"
 
-#: archive.c:447
+#: archive.c:449
 msgid "list supported archive formats"
 msgstr "извеждане на списъка с поддържаните формати"
 
-#: archive.c:449 builtin/archive.c:90 builtin/clone.c:77
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77
 msgid "repo"
 msgstr "хранилище"
 
-#: archive.c:450 builtin/archive.c:91
+#: archive.c:452 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "изтегляне на архива от отдалеченото ХРАНИЛИЩЕ"
 
-#: archive.c:451 builtin/archive.c:92 builtin/notes.c:478
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479
 msgid "command"
 msgstr "команда"
 
-#: archive.c:452 builtin/archive.c:93
+#: archive.c:454 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "път към отдалечената команда „git-upload-archive“"
 
@@ -232,85 +245,85 @@
 "Отрицателните шаблони се игнорират в атрибутите на git.\n"
 "Ако ви трябва начална удивителна, ползвайте „\\!“."
 
-#: branch.c:60
+#: branch.c:61
 #, c-format
 msgid "Not setting branch %s as its own upstream."
 msgstr ""
 "Клонът „%s“ не може да служи като източник за собствената си синхронизация."
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
 "Клонът „%s“ ще следи клона „%s“ от отдалеченото хранилище „%s“ чрез "
 "пребазиране."
 
-#: branch.c:84
+#: branch.c:85
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr "Клонът „%s“ ще следи клона „%s“ от отдалеченото хранилище „%s“."
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr ""
 "Клонът „%s“ ще следи клона „%s“ от локалното хранилище чрез пребазиране."
 
-#: branch.c:89
+#: branch.c:90
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "Клонът „%s“ ще следи клона „%s“ от локалното хранилище."
 
-#: branch.c:94
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr "Клонът „%s“ ще следи отдалечения указател „%s“ чрез пребазиране."
 
-#: branch.c:95
+#: branch.c:96
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "Клонът „%s“ ще следи отдалечения указател „%s“."
 
-#: branch.c:99
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr "Клонът „%s“ ще следи локалния указател „%s“ чрез пребазиране."
 
-#: branch.c:100
+#: branch.c:101
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "Клонът „%s“ ще следи локалния указател „%s“."
 
-#: branch.c:133
+#: branch.c:134
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "Няма следене: двусмислена информация за указателя „%s“"
 
-#: branch.c:162
+#: branch.c:163
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "„%s“ не е позволено име за клон."
 
-#: branch.c:167
+#: branch.c:168
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Вече съществува клон с име „%s“."
 
-#: branch.c:175
+#: branch.c:176
 msgid "Cannot force update the current branch."
 msgstr "Текущият клон не може да бъде принудително обновен."
 
-#: branch.c:195
+#: branch.c:196
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr "Зададените настройки за следенето са грешни — началото „%s“ не е клон."
 
-#: branch.c:197
+#: branch.c:198
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "заявеният отдалечен клон „%s“ не съществува"
 
-#: branch.c:199
+#: branch.c:200
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -329,21 +342,26 @@
 "може да използвате „git push -u“, за да настроите към кой клон да се "
 "изтласква."
 
-#: branch.c:243
+#: branch.c:244
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Неправилно име на обект: „%s“"
 
-#: branch.c:263
+#: branch.c:264
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Двусмислено име на обект: „%s“"
 
-#: branch.c:268
+#: branch.c:269
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Неправилно място за начало на клон: „%s“"
 
+#: branch.c:322
+#, c-format
+msgid "'%s' is already checked out at '%s'"
+msgstr "„%s“ вече е изтеглен в „%s“"
+
 #: bundle.c:34
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
@@ -363,9 +381,9 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr "В хранилището липсват следните необходими подавания:"
 
-#: bundle.c:163 sequencer.c:650 sequencer.c:1105 builtin/blame.c:2705
-#: builtin/branch.c:651 builtin/commit.c:1045 builtin/log.c:330
-#: builtin/log.c:825 builtin/log.c:1432 builtin/log.c:1666 builtin/merge.c:358
+#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083
+#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334
+#: builtin/log.c:849 builtin/log.c:1461 builtin/log.c:1694 builtin/merge.c:358
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "неуспешно настройване на обхождането на версиите"
@@ -388,51 +406,49 @@
 msgstr[0] "Пратката изисква следния указател:"
 msgstr[1] "Пратката изисква следните %d указатели:"
 
-#: bundle.c:251
+#: bundle.c:253
 msgid "Could not spawn pack-objects"
 msgstr "Командата „git pack-objects“ не може да бъде стартирана"
 
-# FIXME better message
-#: bundle.c:269
+#: bundle.c:264
 msgid "pack-objects died"
 msgstr "Командата „git pack-objects“ не завърши успешно"
 
-# FIXME better message
-#: bundle.c:309
+#: bundle.c:304
 msgid "rev-list died"
 msgstr "Командата „git rev-list“ не завърши успешно"
 
-#: bundle.c:358
+#: bundle.c:353
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr ""
 "указателят „%s“ не е бил включен поради опциите зададени на „git rev-list“"
 
-#: bundle.c:437 builtin/log.c:153 builtin/log.c:1342 builtin/shortlog.c:261
+#: bundle.c:443 builtin/log.c:157 builtin/log.c:1369 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "непознат аргумент: %s"
 
-#: bundle.c:443
+#: bundle.c:449
 msgid "Refusing to create empty bundle."
 msgstr "Създаването на празна пратка е невъзможно."
 
-#: bundle.c:453
+#: bundle.c:459
 #, c-format
 msgid "cannot create '%s'"
 msgstr "Файлът „%s“ не може да бъде създаден"
 
-# FIXME better message
-#: bundle.c:474
+#: bundle.c:480
 msgid "index-pack died"
 msgstr "Командата „git index-pack“ не завърши успешно"
 
-#: color.c:260
+#: color.c:275
 #, c-format
 msgid "invalid color value: %.*s"
 msgstr "неправилна стойност за цвят: %.*s"
 
-#: commit.c:40
+#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520
+#: builtin/am.c:2149
 #, c-format
 msgid "could not parse %s"
 msgstr "„%s“ не може да се анализира"
@@ -591,24 +607,24 @@
 msgid "Performing inexact rename detection"
 msgstr "Търсене на преименувания на обекти съчетани с промени"
 
-#: diff.c:114
+#: diff.c:115
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
 "  Неуспешно разпознаване на „%s“ като процент-праг за статистиката по "
 "директории\n"
 
-#: diff.c:119
+#: diff.c:120
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Непознат параметър „%s“ за статистиката по директории'\n"
 
-#: diff.c:214
+#: diff.c:215
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Непозната стойност „%s“ за настройката „diff.submodule“"
 
-#: diff.c:266
+#: diff.c:267
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -617,17 +633,17 @@
 "Грешки в настройката „diff.dirstat“:\n"
 "%s"
 
-#: diff.c:2997
+#: diff.c:3000
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr ""
 "външната програма за разлики завърши неуспешно. Спиране на работата при „%s“"
 
-#: diff.c:3393
+#: diff.c:3396
 msgid "--follow requires exactly one pathspec"
 msgstr "Опцията „--follow“ изисква точно един път"
 
-#: diff.c:3556
+#: diff.c:3559
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -636,37 +652,37 @@
 "Неразпознат параметър към опцията „--dirstat/-X“:\n"
 "%s"
 
-#: diff.c:3570
+#: diff.c:3573
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Неразпознат параметър към опцията „--submodule“: „%s“"
 
-#: dir.c:1852
+#: dir.c:1915
 msgid "failed to get kernel name and information"
 msgstr "името и версията на ядрото не бяха получени"
 
-#: dir.c:1945
+#: dir.c:1998
 msgid "Untracked cache is disabled on this system."
 msgstr "Кеша за неследените файлове е изключен на тази система"
 
-#: gpg-interface.c:129 gpg-interface.c:200
+#: gpg-interface.c:166 gpg-interface.c:237
 msgid "could not run gpg."
 msgstr "Програмата „gpg“ не може да бъде стартирана."
 
-#: gpg-interface.c:141
+#: gpg-interface.c:178
 msgid "gpg did not accept the data"
 msgstr "Програмата „gpg“ не прие подадените данни."
 
-#: gpg-interface.c:152
+#: gpg-interface.c:189
 msgid "gpg failed to sign the data"
 msgstr "Програмата „gpg“ не подписа данните."
 
-#: gpg-interface.c:185
+#: gpg-interface.c:222
 #, c-format
 msgid "could not create temporary file '%s': %s"
 msgstr "Програмата „gpg“ не успя да създаде временния файл „%s“: %s"
 
-#: gpg-interface.c:188
+#: gpg-interface.c:225
 #, c-format
 msgid "failed writing detached signature to '%s': %s"
 msgstr "Програмата „gpg“ не успя да запише самостоятелния подпис към „%s“: %s"
@@ -708,7 +724,6 @@
 "Изглежда, че „%s“ е команда на git, но тя не може да\n"
 "бъде изпълнена. Вероятно пакетът „git-%s“ е повреден."
 
-# FIXME bad message
 #: help.c:368
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "Странно, изглежда, че на системата ви няма нито една команда на git."
@@ -753,20 +768,12 @@
 msgid "%s: %s - %s"
 msgstr "%s: %s — %s"
 
-#: lockfile.c:345
-msgid "BUG: reopen a lockfile that is still open"
-msgstr "ГРЕШКА В GIT: преотваряне на файл-ключалка"
-
-#: lockfile.c:347
-msgid "BUG: reopen a lockfile that has been committed"
-msgstr "ГРЕШКА В GIT: преотваряне на файл-ключалка, който е подаден"
-
 #: merge.c:41
 msgid "failed to read the cache"
 msgstr "кешът не може да бъде прочетен"
 
-#: merge.c:94 builtin/checkout.c:376 builtin/checkout.c:587
-#: builtin/clone.c:647
+#: merge.c:94 builtin/am.c:2022 builtin/am.c:2057 builtin/checkout.c:376
+#: builtin/checkout.c:587 builtin/clone.c:722
 msgid "unable to write new index file"
 msgstr "неуспешно записване на новия индекс"
 
@@ -784,67 +791,66 @@
 msgid "error building trees"
 msgstr "грешка при изграждане на дърветата"
 
-#: merge-recursive.c:687
+#: merge-recursive.c:686
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "грешка при създаването на пътя „%s“%s"
 
-#: merge-recursive.c:698
+#: merge-recursive.c:697
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Изтриване на „%s“, за да се освободи място за поддиректория\n"
 
-# FIXME better message
-#: merge-recursive.c:712 merge-recursive.c:733
+#: merge-recursive.c:711 merge-recursive.c:732
 msgid ": perhaps a D/F conflict?"
 msgstr ": възможно е да има конфликт директория/файл."
 
-#: merge-recursive.c:723
+#: merge-recursive.c:722
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr ""
 "преустановяване на действието, за да не се изтрие неследеният файл „%s“"
 
-#: merge-recursive.c:763
+#: merge-recursive.c:762
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "обектът „%s“ (%s) не може да бъде прочетен"
 
-#: merge-recursive.c:765
+#: merge-recursive.c:764
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "обектът „%s“ (%s) се очакваше да е BLOB, а не е"
 
-#: merge-recursive.c:788 builtin/clone.c:306
+#: merge-recursive.c:787 builtin/clone.c:369
 #, c-format
 msgid "failed to open '%s'"
 msgstr "директорията „%s“ не може да бъде отворена"
 
-#: merge-recursive.c:796
+#: merge-recursive.c:795
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "неуспешно създаване на символната връзка „%s“"
 
-#: merge-recursive.c:799
+#: merge-recursive.c:798
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr ""
 "не е ясно какво да се прави с обекта „%2$s“ (%3$s) с права за достъп „%1$06o“"
 
-#: merge-recursive.c:937
+#: merge-recursive.c:936
 msgid "Failed to execute internal merge"
 msgstr "Неуспешно вътрешно сливане"
 
-#: merge-recursive.c:941
+#: merge-recursive.c:940
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "„%s“ не може да се добави в базата с данни"
 
-#: merge-recursive.c:957
+#: merge-recursive.c:956
 msgid "unsupported object type in the tree"
 msgstr "в дървото има неподдържан вид обект"
 
-#: merge-recursive.c:1032 merge-recursive.c:1046
+#: merge-recursive.c:1031 merge-recursive.c:1045
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -853,7 +859,7 @@
 "КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ "
 "е оставена в дървото."
 
-#: merge-recursive.c:1038 merge-recursive.c:1051
+#: merge-recursive.c:1037 merge-recursive.c:1050
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -862,20 +868,20 @@
 "КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ "
 "е оставена в дървото: %s."
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "rename"
 msgstr "преименуване"
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "renamed"
 msgstr "преименуван"
 
-#: merge-recursive.c:1148
+#: merge-recursive.c:1147
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "„%s“ е директория в „%s“, затова се добавя като „%s“"
 
-#: merge-recursive.c:1170
+#: merge-recursive.c:1169
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -884,151 +890,150 @@
 "КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
 "„%s“, а „%s“ е преименуван на „%s“ в „%s“/%s."
 
-#: merge-recursive.c:1175
+#: merge-recursive.c:1174
 msgid " (left unresolved)"
 msgstr " (некоригиран конфликт)"
 
-#: merge-recursive.c:1229
+#: merge-recursive.c:1228
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 "КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
 "„%s“, а „%s“ е преименуван на „%s“ в „%s“"
 
-#: merge-recursive.c:1259
+#: merge-recursive.c:1258
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Преименуване на „%s“ на „%s“, а „%s“ на „%s“"
 
-#: merge-recursive.c:1458
+#: merge-recursive.c:1457
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 "КОНФЛИКТ (преименуване/добавяне): „%s“ е преименуван на „%s“ в клон „%s“, а "
 "„%s“ е добавен в „%s“"
 
-#: merge-recursive.c:1468
+#: merge-recursive.c:1467
 #, c-format
 msgid "Adding merged %s"
 msgstr "Добавяне на слетия „%s“"
 
-#: merge-recursive.c:1473 merge-recursive.c:1671
+#: merge-recursive.c:1472 merge-recursive.c:1674
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Добавяне като „%s“"
 
-#: merge-recursive.c:1524
+#: merge-recursive.c:1523
 #, c-format
 msgid "cannot read object %s"
 msgstr "обектът „%s“ не може да се прочете"
 
-#: merge-recursive.c:1527
+#: merge-recursive.c:1526
 #, c-format
 msgid "object %s is not a blob"
 msgstr "обектът „%s“ не е BLOB"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modify"
 msgstr "промяна"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modified"
 msgstr "променен"
 
-#: merge-recursive.c:1585
+#: merge-recursive.c:1588
 msgid "content"
 msgstr "съдържание"
 
-#: merge-recursive.c:1592
+#: merge-recursive.c:1595
 msgid "add/add"
 msgstr "добавяне/добавяне"
 
-#: merge-recursive.c:1626
+#: merge-recursive.c:1629
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Прескачане на „%s“ (слетият резултат е идентичен със сегашния)"
 
-#: merge-recursive.c:1640
+#: merge-recursive.c:1643
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Автоматично сливане на „%s“"
 
-#: merge-recursive.c:1644 git-submodule.sh:1150
+#: merge-recursive.c:1647 git-submodule.sh:1025
 msgid "submodule"
 msgstr "ПОДМОДУЛ"
 
-#: merge-recursive.c:1645
+#: merge-recursive.c:1648
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "КОНФЛИКТ (%s): Конфликт при сливане на „%s“"
 
-#: merge-recursive.c:1731
+#: merge-recursive.c:1734
 #, c-format
 msgid "Removing %s"
 msgstr "Изтриване на „%s“"
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1759
 msgid "file/directory"
 msgstr "файл/директория"
 
-#: merge-recursive.c:1762
+#: merge-recursive.c:1765
 msgid "directory/file"
 msgstr "директория/файл"
 
-#: merge-recursive.c:1767
+#: merge-recursive.c:1770
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 "КОНФЛИКТ (%s): Съществува директория на име „%s“ в „%s“. Добавяне на „%s“ "
 "като „%s“"
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1780
 #, c-format
 msgid "Adding %s"
 msgstr "Добавяне на „%s“"
 
-#: merge-recursive.c:1794
+#: merge-recursive.c:1797
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Фатална грешка при сливане, а такава не трябва да възниква!"
 
-#: merge-recursive.c:1813
+#: merge-recursive.c:1816
 msgid "Already up-to-date!"
 msgstr "Вече е обновено!"
 
-#: merge-recursive.c:1822
+#: merge-recursive.c:1825
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "неуспешно сливане на дърветата „%s“ и „%s“"
 
-# FIXME message
-#: merge-recursive.c:1852
+#: merge-recursive.c:1855
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr ""
 "Пътят „%s“ не е обработен, това е грешка в Git, докладвайте я на "
 "разработчиците, като пратите е-писмо на адрес: „git@vger.kernel.org“."
 
-#: merge-recursive.c:1900
+#: merge-recursive.c:1903
 msgid "Merging:"
 msgstr "Сливане:"
 
-#: merge-recursive.c:1913
+#: merge-recursive.c:1916
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "открит е %u общ предшественик:"
 msgstr[1] "открити са %u общи предшественици:"
 
-#: merge-recursive.c:1950
+#: merge-recursive.c:1953
 msgid "merge returned no commit"
 msgstr "сливането не върна подаване"
 
-#: merge-recursive.c:2007
+#: merge-recursive.c:2010
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Неуспешен анализ на обекта „%s“"
 
-#: merge-recursive.c:2018 builtin/merge.c:645
+#: merge-recursive.c:2021 builtin/merge.c:645
 msgid "Unable to write index."
 msgstr "Индексът не може да бъде прочетен"
 
@@ -1037,12 +1042,12 @@
 msgstr ""
 "Неинициализирано или нереферирано дърво за бележки не може да бъде подадено"
 
-#: notes-utils.c:82
+#: notes-utils.c:100
 #, c-format
 msgid "Bad notes.rewriteMode value: '%s'"
 msgstr "Неправилна стойност за „notes.rewriteMode“: „%s“"
 
-#: notes-utils.c:92
+#: notes-utils.c:110
 #, c-format
 msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
 msgstr ""
@@ -1050,7 +1055,7 @@
 
 #. TRANSLATORS: The first %s is the name of the
 #. environment variable, the second %s is its value
-#: notes-utils.c:119
+#: notes-utils.c:137
 #, c-format
 msgid "Bad %s value: '%s'"
 msgstr "Зададена е лоша стойност на променливата „%s“: „%s“"
@@ -1060,31 +1065,41 @@
 msgid "unable to parse object: %s"
 msgstr "обектът „%s“ не може да бъде анализиран"
 
-#: parse-options.c:546
+#: parse-options.c:570
 msgid "..."
 msgstr "…"
 
-#: parse-options.c:564
+#: parse-options.c:588
 #, c-format
 msgid "usage: %s"
 msgstr "употреба: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:568
+#: parse-options.c:592
 #, c-format
 msgid "   or: %s"
 msgstr "     или: %s"
 
-#: parse-options.c:571
+#: parse-options.c:595
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:605
+#: parse-options.c:629
 msgid "-NUM"
 msgstr "-ЧИСЛО"
 
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "неправилно име на обект „%s“"
+
+#: path.c:752
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "Не могат да се дадат права за запис в директорията „%s“ на групата"
+
 #: pathspec.c:133
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr "глобалните настройки за пътища „glob“ и „noglob“ са несъвместими"
@@ -1149,15 +1164,15 @@
 "Нищо не се изключва от шаблоните за изключване.\n"
 "Това често се случва, ако сте забравили да добавите „:/“ или „.“."
 
-#: pretty.c:968
+#: pretty.c:969
 msgid "unable to parse --pretty format"
 msgstr "аргументът към опцията „--pretty“ не може да се анализира"
 
-#: progress.c:236
+#: progress.c:235
 msgid "done"
 msgstr "действието завърши"
 
-#: read-cache.c:1295
+#: read-cache.c:1281
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -1166,7 +1181,7 @@
 "Зададена е неправилна стойност на настройката „index.version“.\n"
 "Ще се ползва версия %i"
 
-#: read-cache.c:1305
+#: read-cache.c:1291
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1176,95 +1191,165 @@
 "„GIT_INDEX_VERSION“.\n"
 "Ще се ползва версия %i"
 
-#: remote.c:792
+#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
+#: builtin/merge.c:983
+#, c-format
+msgid "Could not open '%s' for writing"
+msgstr "„%s“ не може да бъде отворен за запис"
+
+#: refs/files-backend.c:2359
+#, c-format
+msgid "could not delete reference %s: %s"
+msgstr "Указателят „%s“ не може да бъде изтрит: %s"
+
+#: refs/files-backend.c:2362
+#, c-format
+msgid "could not delete references: %s"
+msgstr "Указателите не може да бъдат изтрити: %s"
+
+#: refs/files-backend.c:2371
+#, c-format
+msgid "could not remove reference %s"
+msgstr "Указателят „%s“ не може да бъде изтрит"
+
+#: ref-filter.c:245
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "грешка във форма̀та: лексемата %%(end) е използвана без съответната ѝ"
+
+#: ref-filter.c:704
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "очаква се положителна стойност за „contents:lines=%s“"
+
+#: ref-filter.c:833
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "очакван формат: %%(color:ЦВЯТ)"
+
+#: ref-filter.c:835
+msgid "unable to parse format"
+msgstr "форматът не може да бъде анализиран"
+
+#: ref-filter.c:870
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "очакван формат: %%(align:ШИРОЧИНА,ПОЗИЦИЯ)"
+
+#: ref-filter.c:893
+#, c-format
+msgid "improper format entered align:%s"
+msgstr "въведен е неправилен формат align:%s"
+
+#: ref-filter.c:898
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "очаква се положителна широчина с лексемата „%%(align)“"
+
+#: ref-filter.c:1219
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "обект със сгрешен формат при „%s“"
+
+#: ref-filter.c:1561
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "грешка във форма̀та: липсва лексемата %%(end)"
+
+#: ref-filter.c:1615
+#, c-format
+msgid "malformed object name %s"
+msgstr "неправилно име на обект „%s“"
+
+#: remote.c:756
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "Невъзможно е да се доставят едновременно и „%s“, и „%s“ към „%s“"
 
-#: remote.c:796
+#: remote.c:760
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "„%s“ обикновено следи „%s“, а не „%s“"
 
-#: remote.c:800
+#: remote.c:764
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "„%s“ следи както „%s“, така и „%s“"
 
-#: remote.c:808
+#: remote.c:772
 msgid "Internal error"
 msgstr "Вътрешна грешка"
 
-#: remote.c:1723 remote.c:1766
+#: remote.c:1687 remote.c:1730
 msgid "HEAD does not point to a branch"
 msgstr "Указателят „HEAD“ не сочи към клон"
 
-#: remote.c:1732
+#: remote.c:1696
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "няма клон на име „%s“"
 
-#: remote.c:1735
+#: remote.c:1699
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "не е зададен клон-източник за клона „%s“"
 
-#: remote.c:1741
+#: remote.c:1705
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "клонът-източник „%s“ не е съхранен като следящ клон"
 
-#: remote.c:1756
+#: remote.c:1720
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
 "липсва локален следящ клон за местоположението за изтласкване „%s“ в "
 "хранилището „%s“"
 
-#: remote.c:1771
+#: remote.c:1735
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "няма информация клонът „%s“ да следи някой друг"
 
-#: remote.c:1782
+#: remote.c:1746
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "указателят за изтласкване на „%s“ не включва „%s“"
 
-#: remote.c:1795
+#: remote.c:1759
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "указателят за изтласкване не включва цел („push.default“ е „nothing“)"
 
-#: remote.c:1817
+#: remote.c:1781
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "простото (simple) изтласкване не съответства на една цел"
 
-#: remote.c:2124
+#: remote.c:2083
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "Този клон следи „%s“, но следеният клон е изтрит.\n"
 
-#: remote.c:2128
+#: remote.c:2087
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (за да коригирате това, използвайте „git branch --unset-upstream“)\n"
 
-#: remote.c:2131
+#: remote.c:2090
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "Клонът е актуализиран към „%s“.\n"
 
-#: remote.c:2135
+#: remote.c:2094
 #, 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:2141
+#: remote.c:2100
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (публикувайте локалните си промени чрез „git push“)\n"
 
-#: remote.c:2144
+#: remote.c:2103
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1274,11 +1359,11 @@
 msgstr[1] ""
 "Клонът ви е с %2$d подавания зад „%1$s“ и може да бъде тривиално слят.\n"
 
-#: remote.c:2152
+#: remote.c:2111
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (обновете локалния си клон чрез „git pull“)\n"
 
-#: remote.c:2155
+#: remote.c:2114
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1293,49 +1378,54 @@
 "Текущият клон се е отделил от „%s“,\n"
 "двата имат съответно по %d и %d несъвпадащи подавания.\n"
 
-#: remote.c:2165
+#: remote.c:2124
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (слейте отдалечения клон в локалния чрез „git pull“)\n"
 
-#: revision.c:2366
+#: revision.c:2193
+msgid "your current branch appears to be broken"
+msgstr "Текущият клон е повреден"
+
+#: revision.c:2196
+#, c-format
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "Текущият клон „%s“ е без подавания "
+
+#: revision.c:2390
 msgid "--first-parent is incompatible with --bisect"
 msgstr "опциите „--first-parent“ и „--bisect“ са несъвместими"
 
-#: run-command.c:83
+#: run-command.c:90
 msgid "open /dev/null failed"
 msgstr "неуспешно отваряне на „/dev/null“"
 
-#: run-command.c:85
+#: run-command.c:92
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "неуспешно изпълнение на dup2(%d,%d)"
 
-#: send-pack.c:272
+#: send-pack.c:295
 msgid "failed to sign the push certificate"
 msgstr "сертификатът за изтласкване не може да бъде подписан"
 
-#: send-pack.c:378
+#: send-pack.c:404
 msgid "the receiving end does not support --signed push"
 msgstr "отсрещната страна не поддържа изтласкване с опцията „--signed“"
 
-#: send-pack.c:389
+#: send-pack.c:406
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
+msgstr ""
+"отсрещната страна не поддържа изтласкване с опцията „--signed“, затова не се "
+"използва сертификат"
+
+#: send-pack.c:418
 msgid "the receiving end does not support --atomic push"
 msgstr "получаващата страна не поддържа изтласкване с опцията „--atomic“"
 
-#: sequencer.c:172 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
-#: builtin/merge.c:983
-#, c-format
-msgid "Could not open '%s' for writing"
-msgstr "„%s“ не може да бъде отворен за запис"
-
-#: sequencer.c:174 builtin/merge.c:344 builtin/merge.c:763 builtin/merge.c:975
-#: builtin/merge.c:988
-#, c-format
-msgid "Could not write to '%s'"
-msgstr "„%s“ не може да бъде записан"
-
 # FIXME git add <path…> for consistence
-#: sequencer.c:195
+#: sequencer.c:183
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
@@ -1343,7 +1433,7 @@
 "след коригирането на конфликтите, отбележете съответните\n"
 "пътища с „git add ПЪТ…“ или „git rm ПЪТ…“."
 
-#: sequencer.c:198
+#: sequencer.c:186
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'\n"
@@ -1354,237 +1444,236 @@
 "подайте резултата с командата „git commit'“."
 
 # FIXME - must be the same as Could not write to '%s' above
-#: sequencer.c:211 sequencer.c:861 sequencer.c:944
+#: sequencer.c:199 sequencer.c:842 sequencer.c:922
 #, c-format
 msgid "Could not write to %s"
 msgstr "„%s“ не може да бъде записан"
 
-# FIXME wrap up as ffinishing the work on, in fact, full stop at end for consistency with below
-#: sequencer.c:214
+#: sequencer.c:202
 #, c-format
 msgid "Error wrapping up %s"
 msgstr "Обработката на „%s“ не завърши успешно."
 
-#: sequencer.c:229
+#: sequencer.c:217
 msgid "Your local changes would be overwritten by cherry-pick."
 msgstr "Локалните ви промени ще бъдат презаписани при отбирането на подавания."
 
-#: sequencer.c:231
+#: sequencer.c:219
 msgid "Your local changes would be overwritten by revert."
 msgstr "Локалните ви промени ще бъдат презаписани при отмяната на подавания."
 
-#: sequencer.c:234
+#: sequencer.c:222
 msgid "Commit your changes or stash them to proceed."
 msgstr "Подайте или скатайте промените, за да продължите"
 
 #. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:321
+#: sequencer.c:309
 #, c-format
 msgid "%s: Unable to write new index file"
 msgstr "%s: новият индекс не може да бъде запазен"
 
-#: sequencer.c:339
+#: sequencer.c:327
 msgid "Could not resolve HEAD commit\n"
 msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито\n"
 
-#: sequencer.c:359
+#: sequencer.c:347
 msgid "Unable to update cache tree\n"
 msgstr "Дървото на кеша не може да бъде обновено\n"
 
-#: sequencer.c:411
+#: sequencer.c:399
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr "Подаването „%s“ не може да бъде анализирано\n"
 
-#: sequencer.c:416
+#: sequencer.c:404
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr "Родителското подаване „%s“ не може да бъде анализирано\n"
 
-#: sequencer.c:482
+#: sequencer.c:469
 msgid "Your index file is unmerged."
 msgstr "Индексът не е слят."
 
-#: sequencer.c:501
+#: sequencer.c:488
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr "Подаването „%s“ е сливане, но не е дадена опцията „-m“"
 
-#: sequencer.c:509
+#: sequencer.c:496
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr "Подаването „%s“ няма родител %d"
 
-#: sequencer.c:513
+#: sequencer.c:500
 #, c-format
 msgid "Mainline was specified but commit %s is not a merge."
 msgstr "Указано е базово подаване, но подаването „%s“ не е сливане."
 
 #. TRANSLATORS: The first %s will be "revert" or
 #. "cherry-pick", the second %s a SHA1
-#: sequencer.c:526
+#: sequencer.c:513
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s: неразпозната стойност за родителското подаване „%s“"
 
-#: sequencer.c:530
+#: sequencer.c:517
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr "Неуспешно извличане на съобщението за подаване на „%s“"
 
-#: sequencer.c:616
+#: sequencer.c:603
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "подаването „%s“… не може да бъде отменено: „%s“"
 
-#: sequencer.c:617
+#: sequencer.c:604
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "подаването „%s“… не може да бъде приложено: „%s“"
 
-#: sequencer.c:653
+#: sequencer.c:639
 msgid "empty commit set passed"
 msgstr "зададено е празно множество от подавания"
 
-#: sequencer.c:661
+#: sequencer.c:647
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: неуспешно изчитане на индекса"
 
-#: sequencer.c:665
+#: sequencer.c:651
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: неуспешно обновяване на индекса"
 
-#: sequencer.c:725
+#: sequencer.c:711
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "По време на „%1$s“ не може да се извърши „%2$s“"
 
-#: sequencer.c:747
+#: sequencer.c:733
 #, c-format
 msgid "Could not parse line %d."
 msgstr "%d-ят ред не може да се анализира."
 
-#: sequencer.c:752
+#: sequencer.c:738
 msgid "No commits parsed."
 msgstr "Никое от подаванията не може да се разпознае."
 
 # FIXME Could not open %s. - full stop for consistence with next message
-#: sequencer.c:765
+#: sequencer.c:750
 #, c-format
 msgid "Could not open %s"
 msgstr "„%s“ не може да се прочете."
 
-#: sequencer.c:769
+#: sequencer.c:754
 #, c-format
 msgid "Could not read %s."
 msgstr "„%s“ не може да се отвори."
 
-#: sequencer.c:776
+#: sequencer.c:761
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "Файлът с описание на предстоящите действия — „%s“ не може да се ползва"
 
-#: sequencer.c:806
+#: sequencer.c:791
 #, c-format
 msgid "Invalid key: %s"
 msgstr "Неправилен ключ: „%s“"
 
-#: sequencer.c:809
+#: sequencer.c:794 builtin/pull.c:47 builtin/pull.c:49
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "Неправилна стойност за „%s“: „%s“"
 
-#: sequencer.c:821
+#: sequencer.c:804
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "Неправилно съдържание на файла с опции: „%s“"
 
-#: sequencer.c:842
+#: sequencer.c:823
 msgid "a cherry-pick or revert is already in progress"
 msgstr ""
 "в момента вече се извършва отбиране на подавания или пребазиране на клона"
 
-#: sequencer.c:843
+#: sequencer.c:824
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "използвайте „git cherry-pick (--continue | --quit | --abort)“"
 
-#: sequencer.c:847
+#: sequencer.c:828
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr "Директорията за секвенсора „%s“ не може да бъде създадена"
 
-#: sequencer.c:863 sequencer.c:948
+#: sequencer.c:844 sequencer.c:926
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "Обработката на „%s“ не завърши успешно."
 
-#: sequencer.c:882 sequencer.c:1018
+#: sequencer.c:863 sequencer.c:996
 msgid "no cherry-pick or revert in progress"
 msgstr ""
 "в момента не се извършва отбиране на подавания или пребазиране на клона"
 
-#: sequencer.c:884
+#: sequencer.c:865
 msgid "cannot resolve HEAD"
 msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито"
 
-#: sequencer.c:886
+#: sequencer.c:867
 msgid "cannot abort from a branch yet to be born"
 msgstr ""
 "действието не може да бъде преустановено, когато сте на клон, който тепърва "
 "предстои да бъде създаден"
 
-#: sequencer.c:908 builtin/apply.c:4291
+#: sequencer.c:887 builtin/apply.c:4287
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "файлът „%s“ не може да бъде отворен: %s"
 
-#: sequencer.c:911
+#: sequencer.c:890
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "файлът „%s“ не може да бъде прочетен: %s"
 
-#: sequencer.c:912
+#: sequencer.c:891
 msgid "unexpected end of file"
 msgstr "неочакван край на файл"
 
-#: sequencer.c:918
+#: sequencer.c:897
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr ""
 "запазеният преди започването на отбирането файл за указателя „HEAD“ — „%s“ е "
 "повреден"
 
-#: sequencer.c:941
+#: sequencer.c:919
 #, c-format
 msgid "Could not format %s."
 msgstr "Файлът „%s“ не може да се форматира по подходящия начин."
 
-#: sequencer.c:1086
+#: sequencer.c:1064
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s: не може да се отбере „%s“"
 
-#: sequencer.c:1089
+#: sequencer.c:1067
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s: неправилна версия"
 
-#: sequencer.c:1123
+#: sequencer.c:1101
 msgid "Can't revert as initial commit"
 msgstr "Първоначалното подаване не може да бъде отменено"
 
-#: sequencer.c:1124
+#: sequencer.c:1102
 msgid "Can't cherry-pick into empty head"
 msgstr "При празен връх не могат да се отбират подавания"
 
-#: setup.c:243
+#: setup.c:248
 #, c-format
 msgid "failed to read %s"
 msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: sha1_name.c:453
+#: sha1_name.c:463
 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"
@@ -1608,32 +1697,32 @@
 "спрете това съобщение като изпълните командата:\n"
 "„git config advice.objectNameWarning false“"
 
-#: submodule.c:64 submodule.c:98
+#: submodule.c:61 submodule.c:95
 msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
 msgstr ""
 "Неслетите файлове „.gitmodules“ не могат да бъдат променяни. Първо "
 "коригирайте конфликтите"
 
-#: submodule.c:68 submodule.c:102
+#: submodule.c:65 submodule.c:99
 #, c-format
 msgid "Could not find section in .gitmodules where path=%s"
 msgstr "Във файла „.gitmodules“ липсва раздел за директория „path=%s“"
 
-#: submodule.c:76
+#: submodule.c:73
 #, c-format
 msgid "Could not update .gitmodules entry %s"
 msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде променен"
 
-#: submodule.c:109
+#: submodule.c:106
 #, c-format
 msgid "Could not remove .gitmodules entry for %s"
 msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде изтрит"
 
-#: submodule.c:120
+#: submodule.c:117
 msgid "staging updated .gitmodules failed"
 msgstr "неуспешно добавяне на променения файл „.gitmodules“ в индекса"
 
-#: submodule.c:1115
+#: submodule.c:1040
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Настройката „core.worktree“ не може да се зададе в „%s“"
@@ -1644,7 +1733,7 @@
 msgid "unknown value '%s' for key '%s'"
 msgstr "неправилна стойност „%s“ за настройката „%s“"
 
-#: trailer.c:543 trailer.c:548 builtin/remote.c:290
+#: trailer.c:543 trailer.c:548 builtin/remote.c:296
 #, c-format
 msgid "more than one %s"
 msgstr "стойността „%s“ се повтаря в настройките"
@@ -1663,6 +1752,11 @@
 msgid "could not read from stdin"
 msgstr "от стандартния вход не може да се чете"
 
+#: transport-helper.c:1025
+#, c-format
+msgid "Could not read ref %s"
+msgstr "Указателят „%s“ не може да се прочете."
+
 #: unpack-trees.c:203
 msgid "Checking out files"
 msgstr "Изтегляне на файлове"
@@ -1696,203 +1790,210 @@
 msgid "invalid '..' path segment"
 msgstr "неправилна част от пътя „..“"
 
-#: wrapper.c:523
+#: wrapper.c:219 wrapper.c:362
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "„%s“ не може да бъде отворен и за четене, и за запис"
+
+#: wrapper.c:221 wrapper.c:364
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "„%s“ не може да бъде отворен за запис"
+
+#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691
+#: builtin/merge.c:1074 builtin/pull.c:380
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "файлът не може да бъде прочетен: „%s“"
+
+#: wrapper.c:579
 #, c-format
 msgid "unable to access '%s': %s"
 msgstr "няма достъп до „%s“: %s"
 
-#: wrapper.c:544
+#: wrapper.c:600
 #, c-format
 msgid "unable to access '%s'"
 msgstr "няма достъп до „%s“"
 
-#: wrapper.c:555
-#, c-format
-msgid "unable to look up current user in the passwd file: %s"
-msgstr "текущият потребител не може да бъде открит във файла „/etc/passwd“: %s"
-
-#: wrapper.c:556
-msgid "no such user"
-msgstr "такъв потребител не съществува"
-
-#: wrapper.c:564
+#: wrapper.c:608
 msgid "unable to get current working directory"
 msgstr "текущата работна директория е недостъпна"
 
-#: wrapper.c:575
+#: wrapper.c:635
 #, c-format
 msgid "could not open %s for writing"
 msgstr "„%s“ не може да бъде отворен за запис"
 
 # FIXME - must be the same as Could not write to '%s' above
-#: wrapper.c:587
+#: wrapper.c:646 builtin/am.c:425
 #, c-format
 msgid "could not write to %s"
 msgstr "„%s“ не може да бъде записан"
 
-#: wrapper.c:593
+#: wrapper.c:652
 #, c-format
 msgid "could not close %s"
 msgstr "„%s“ не може да се затвори"
 
-#: wt-status.c:150
+#: wt-status.c:149
 msgid "Unmerged paths:"
 msgstr "Неслети пътища:"
 
-#: wt-status.c:177 wt-status.c:204
+#: wt-status.c:176 wt-status.c:203
 #, c-format
 msgid "  (use \"git reset %s <file>...\" to unstage)"
 msgstr "  (използвайте „git reset %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
 
-#: wt-status.c:179 wt-status.c:206
+#: wt-status.c:178 wt-status.c:205
 msgid "  (use \"git rm --cached <file>...\" to unstage)"
 msgstr ""
 "  (използвайте „git rm --cached %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
 
-#: wt-status.c:183
+#: wt-status.c:182
 msgid "  (use \"git add <file>...\" to mark resolution)"
 msgstr ""
 "  (използвайте „git add ФАЙЛ…“, за да укажете разрешаването на конфликта)"
 
-#: wt-status.c:185 wt-status.c:189
+#: wt-status.c:184 wt-status.c:188
 msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
 msgstr ""
 "  (използвайте „git add/rm ФАЙЛ…“, според решението, което избирате за "
 "конфликта)"
 
-#: wt-status.c:187
+#: wt-status.c:186
 msgid "  (use \"git rm <file>...\" to mark resolution)"
 msgstr ""
 "  (използвайте „git rm ФАЙЛ…“, за да укажете разрешаването на конфликта)"
 
-#: wt-status.c:198 wt-status.c:881
+#: wt-status.c:197 wt-status.c:880
 msgid "Changes to be committed:"
 msgstr "Промени, които ще бъдат подадени:"
 
-#: wt-status.c:216 wt-status.c:890
+#: wt-status.c:215 wt-status.c:889
 msgid "Changes not staged for commit:"
 msgstr "Промени, които не са в индекса за подаване:"
 
-#: wt-status.c:220
+#: wt-status.c:219
 msgid "  (use \"git add <file>...\" to update what will be committed)"
 msgstr ""
 "  (използвайте „git add ФАЙЛ…“, за да обновите съдържанието за подаване)"
 
-#: wt-status.c:222
+#: wt-status.c:221
 msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
 msgstr ""
 "  (използвайте „git add/rm ФАЙЛ…“, за да обновите съдържанието за подаване)"
 
-#: wt-status.c:223
+#: wt-status.c:222
 msgid ""
 "  (use \"git checkout -- <file>...\" to discard changes in working directory)"
 msgstr ""
 "  (използвайте „git checkout -- ФАЙЛ…“, за да отхвърлите промените в "
 "работното дърво)"
 
-#: wt-status.c:225
+#: wt-status.c:224
 msgid "  (commit or discard the untracked or modified content in submodules)"
 msgstr ""
 "  (подайте или отхвърлете неследеното или промененото съдържание в "
 "подмодулите)"
 
-#: wt-status.c:237
+#: wt-status.c:236
 #, c-format
 msgid "  (use \"git %s <file>...\" to include in what will be committed)"
 msgstr ""
 "  (използвайте „git %s ФАЙЛ…“, за да определите какво включвате в подаването)"
 
-#: wt-status.c:252
+#: wt-status.c:251
 msgid "both deleted:"
 msgstr "изтрити в двата случая:"
 
-#: wt-status.c:254
+#: wt-status.c:253
 msgid "added by us:"
 msgstr "добавени от вас:"
 
-#: wt-status.c:256
+#: wt-status.c:255
 msgid "deleted by them:"
 msgstr "изтрити от тях:"
 
-#: wt-status.c:258
+#: wt-status.c:257
 msgid "added by them:"
 msgstr "добавени от тях:"
 
-#: wt-status.c:260
+#: wt-status.c:259
 msgid "deleted by us:"
 msgstr "изтрити от вас:"
 
-#: wt-status.c:262
+#: wt-status.c:261
 msgid "both added:"
 msgstr "добавени и в двата случая:"
 
-#: wt-status.c:264
+#: wt-status.c:263
 msgid "both modified:"
 msgstr "променени и в двата случая:"
 
-#: wt-status.c:266
+#: wt-status.c:265
 #, c-format
 msgid "bug: unhandled unmerged status %x"
 msgstr "грешка: състоянието на промяната „%x“ не може да бъде обработено"
 
-#: wt-status.c:274
+#: wt-status.c:273
 msgid "new file:"
 msgstr "нов файл:"
 
-#: wt-status.c:276
+#: wt-status.c:275
 msgid "copied:"
 msgstr "копиран:"
 
-#: wt-status.c:278
+#: wt-status.c:277
 msgid "deleted:"
 msgstr "изтрит:"
 
-#: wt-status.c:280
+#: wt-status.c:279
 msgid "modified:"
 msgstr "променен:"
 
-#: wt-status.c:282
+#: wt-status.c:281
 msgid "renamed:"
 msgstr "преименуван:"
 
-#: wt-status.c:284
+#: wt-status.c:283
 msgid "typechange:"
 msgstr "смяна на вида:"
 
-#: wt-status.c:286
+#: wt-status.c:285
 msgid "unknown:"
 msgstr "непозната промяна:"
 
-#: wt-status.c:288
+#: wt-status.c:287
 msgid "unmerged:"
 msgstr "неслят:"
 
-#: wt-status.c:370
+#: wt-status.c:369
 msgid "new commits, "
 msgstr "нови подавания, "
 
-#: wt-status.c:372
+#: wt-status.c:371
 msgid "modified content, "
 msgstr "променено съдържание, "
 
-#: wt-status.c:374
+#: wt-status.c:373
 msgid "untracked content, "
 msgstr "неследено съдържание, "
 
-#: wt-status.c:391
+#: wt-status.c:390
 #, c-format
 msgid "bug: unhandled diff status %c"
 msgstr "грешка: състоянието на промяната „%c“ не може да бъде обработено"
 
-#: wt-status.c:755
+#: wt-status.c:754
 msgid "Submodules changed but not updated:"
 msgstr "Подмодулите са променени, но не са обновени:"
 
-#: wt-status.c:757
+#: wt-status.c:756
 msgid "Submodule changes to be committed:"
 msgstr "Промени в подмодулите за подаване:"
 
-#: wt-status.c:838
+#: wt-status.c:837
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
@@ -1900,193 +2001,229 @@
 "Не променяйте горния ред.\n"
 "Всичко отдолу ще бъде изтрито."
 
-#: wt-status.c:949
+#: wt-status.c:948
 msgid "You have unmerged paths."
 msgstr "Някои пътища не са слети."
 
-#: wt-status.c:952
+#: wt-status.c:951
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git commit“)"
 
-#: wt-status.c:955
+#: wt-status.c:954
 msgid "All conflicts fixed but you are still merging."
 msgstr "Всички конфликти са решени, но продължавате сливането."
 
-#: wt-status.c:958
+#: wt-status.c:957
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (използвайте „git commit“, за да завършите сливането)"
 
-#: wt-status.c:968
+#: wt-status.c:967
 msgid "You are in the middle of an am session."
 msgstr "В момента прилагате поредица от кръпки чрез „git am“."
 
-#: wt-status.c:971
+#: wt-status.c:970
 msgid "The current patch is empty."
 msgstr "Текущата кръпка е празна."
 
-#: wt-status.c:975
+#: wt-status.c:974
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git am --continue“)"
 
-#: wt-status.c:977
+#: wt-status.c:976
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (използвайте „git am --skip“, за да пропуснете тази кръпка)"
 
-#: wt-status.c:979
+#: wt-status.c:978
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
 "  (използвайте „git am --abort“, за да възстановите първоначалния клон)"
 
-#: wt-status.c:1039 wt-status.c:1056
+#: wt-status.c:1105
+msgid "No commands done."
+msgstr "Не са изпълнени команди."
+
+#: wt-status.c:1108
+#, 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:1119
+#, c-format
+msgid "  (see more in file %s)"
+msgstr "  повече информация има във файла „%s“)"
+
+#: wt-status.c:1124
+msgid "No commands remaining."
+msgstr "Не остават повече команди."
+
+#: wt-status.c:1127
+#, c-format
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "Следваща команда за изпълнение (остава още %d команда):"
+msgstr[1] "Следваща команда за изпълнение (остават още %d команди):"
+
+#: wt-status.c:1135
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr ""
+"  (използвайте „git rebase --edit-todo“, за да разгледате и редактирате)"
+
+#: wt-status.c:1148
 #, c-format
 msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr "В момента пребазирате клона „%s“ върху „%s“."
 
-#: wt-status.c:1044 wt-status.c:1061
+#: wt-status.c:1153
 msgid "You are currently rebasing."
 msgstr "В момента пребазирате."
 
-#: wt-status.c:1047
+#: wt-status.c:1167
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr "  (коригирайте конфликтите и използвайте „git rebase --continue“)"
 
-#: wt-status.c:1049
+#: wt-status.c:1169
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr "  (използвайте „git rebase --skip“, за да пропуснете тази кръпка)"
 
-#: wt-status.c:1051
+#: wt-status.c:1171
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
 "  (използвайте „git rebase --abort“, за да възстановите първоначалния клон)"
 
-#: wt-status.c:1064
+#: wt-status.c:1177
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr "  (всички конфликти са коригирани: изпълнете „git rebase --continue“)"
 
-#: wt-status.c:1068
+#: wt-status.c:1181
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
 msgstr "В момента разделяте подаване докато пребазирате клона „%s“ върху „%s“."
 
-#: wt-status.c:1073
+#: wt-status.c:1186
 msgid "You are currently splitting a commit during a rebase."
 msgstr "В момента разделяте подаване докато пребазирате."
 
-#: wt-status.c:1076
+#: wt-status.c:1189
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
 "  (След като работното ви дърво стане чисто, използвайте „git rebase --"
 "continue“)"
 
-#: wt-status.c:1080
+#: wt-status.c:1193
 #, c-format
 msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 "В момента редактирате подаване докато пребазирате клона „%s“ върху „%s“."
 
-#: wt-status.c:1085
+#: wt-status.c:1198
 msgid "You are currently editing a commit during a rebase."
 msgstr "В момента редактирате подаване докато пребазирате."
 
-#: wt-status.c:1088
+#: wt-status.c:1201
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr ""
 "  (използвайте „git commit --amend“, за да редактирате текущото подаване)"
 
-#: wt-status.c:1090
+#: wt-status.c:1203
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
 "  (използвайте „git rebase --continue“, след като завършите промените си)"
 
-#: wt-status.c:1100
+#: wt-status.c:1213
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr "В момента отбирате подаването „%s“."
 
-#: wt-status.c:1105
+#: wt-status.c:1218
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git cherry-pick --continue“)"
 
-#: wt-status.c:1108
+#: wt-status.c:1221
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
 "  (всички конфликти са коригирани, изпълнете „git cherry-pick --continue“)"
 
-#: wt-status.c:1110
+#: wt-status.c:1223
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr ""
 "  (използвайте „git cherry-pick --abort“, за да отмените всички действия с "
 "отбиране)"
 
-#: wt-status.c:1119
+#: wt-status.c:1232
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr "В момента отменяте подаване „%s“."
 
-#: wt-status.c:1124
+#: wt-status.c:1237
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git revert --continue“)"
 
-#: wt-status.c:1127
+#: wt-status.c:1240
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr "  (всички конфликти са коригирани, изпълнете „git revert --continue“)"
 
-#: wt-status.c:1129
+#: wt-status.c:1242
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
 "  (използвайте „git revert --abort“, за да преустановите отмяната на "
 "подаване)"
 
-#: wt-status.c:1140
+#: wt-status.c:1253
 #, c-format
 msgid "You are currently bisecting, started from branch '%s'."
 msgstr "В момента търсите двоично, като сте стартирали от клон „%s“."
 
-#: wt-status.c:1144
+#: wt-status.c:1257
 msgid "You are currently bisecting."
 msgstr "В момента търсите двоично."
 
-#: wt-status.c:1147
+#: wt-status.c:1260
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
 "  (използвайте „git bisect reset“, за да се върнете към първоначалното "
 "състояние и клон)"
 
-#: wt-status.c:1324
+#: wt-status.c:1438
 msgid "On branch "
 msgstr "На клон "
 
-#: wt-status.c:1331
+#: wt-status.c:1444
+msgid "interactive rebase in progress; onto "
+msgstr "извършвате интерактивно пребазиране върху "
+
+#: wt-status.c:1446
 msgid "rebase in progress; onto "
 msgstr "извършвате пребазиране върху "
 
-#: wt-status.c:1336
+#: wt-status.c:1451
 msgid "HEAD detached at "
 msgstr "Указателят „HEAD“ не е свързан и е при "
 
-#: wt-status.c:1338
+#: wt-status.c:1453
 msgid "HEAD detached from "
 msgstr "Указателят „HEAD“ не е свързан и е отделѐн от "
 
-#: wt-status.c:1341
+#: wt-status.c:1456
 msgid "Not currently on any branch."
 msgstr "Извън всички клони."
 
-#: wt-status.c:1358
+#: wt-status.c:1474
 msgid "Initial commit"
 msgstr "Първоначално подаване"
 
-#: wt-status.c:1372
+#: wt-status.c:1488
 msgid "Untracked files"
 msgstr "Неследени файлове"
 
-#: wt-status.c:1374
+#: wt-status.c:1490
 msgid "Ignored files"
 msgstr "Игнорирани файлове"
 
-#: wt-status.c:1378
+#: wt-status.c:1494
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -2098,32 +2235,32 @@
 "изпълнението, но не трябва да забравяте ръчно да добавяте новите файлове.\n"
 "За повече подробности погледнете „git status help“."
 
-#: wt-status.c:1384
+#: wt-status.c:1500
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "Неследените файлове не са изведени%s"
 
-#: wt-status.c:1386
+#: wt-status.c:1502
 msgid " (use -u option to show untracked files)"
 msgstr " (използвайте опцията „-u“, за да изведете неследените файлове)"
 
-#: wt-status.c:1392
+#: wt-status.c:1508
 msgid "No changes"
 msgstr "Няма промени"
 
-#: wt-status.c:1397
+#: wt-status.c:1513
 #, 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:1400
+#: wt-status.c:1516
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "към индекса за подаване не са добавени промени\n"
 
-#: wt-status.c:1403
+#: wt-status.c:1519
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -2132,52 +2269,52 @@
 "към индекса за подаване не са добавени промени, но има нови файлове "
 "(използвайте „git add“, за да започне тяхното следене)\n"
 
-#: wt-status.c:1406
+#: wt-status.c:1522
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr "към индекса за подаване не са добавени промени, но има нови файлове\n"
 
-#: wt-status.c:1409
+#: wt-status.c:1525
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 "липсват каквито и да е промени (създайте или копирайте файлове и използвайте "
 "„git add“, за да започне тяхното следене)\n"
 
-#: wt-status.c:1412 wt-status.c:1417
+#: wt-status.c:1528 wt-status.c:1533
 #, c-format
 msgid "nothing to commit\n"
 msgstr "липсват каквито и да е промени\n"
 
-#: wt-status.c:1415
+#: wt-status.c:1531
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
 "липсват каквито и да е промени (използвайте опцията „-u“, за да се изведат и "
 "неследените файлове)\n"
 
-#: wt-status.c:1419
+#: wt-status.c:1535
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr "липсват каквито и да е промени, работното дърво е чисто\n"
 
-#: wt-status.c:1528
-msgid "HEAD (no branch)"
-msgstr "HEAD (извън клон)"
-
-#: wt-status.c:1534
+#: wt-status.c:1642
 msgid "Initial commit on "
 msgstr "Първоначално подаване на клон"
 
-#: wt-status.c:1561
+#: wt-status.c:1646
+msgid "HEAD (no branch)"
+msgstr "HEAD (извън клон)"
+
+#: wt-status.c:1675
 msgid "gone"
 msgstr "изтрит"
 
-#: wt-status.c:1563 wt-status.c:1571
+#: wt-status.c:1677 wt-status.c:1685
 msgid "behind "
 msgstr "назад с "
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:345
+#: compat/precompose_utf8.c:56 builtin/clone.c:408
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "неуспешно изтриване на „%s“"
@@ -2191,7 +2328,7 @@
 msgid "unexpected diff status %c"
 msgstr "неочакван изходен код при генериране на разлика: %c"
 
-#: builtin/add.c:70 builtin/commit.c:277
+#: builtin/add.c:70 builtin/commit.c:278
 msgid "updating files failed"
 msgstr "неуспешно обновяване на файловете"
 
@@ -2240,15 +2377,15 @@
 msgstr ""
 "Следните пътища ще бъдат игнорирани според някой от файловете „.gitignore“:\n"
 
-#: builtin/add.c:249 builtin/clean.c:874 builtin/fetch.c:107 builtin/mv.c:110
-#: builtin/prune-packed.c:55 builtin/push.c:508 builtin/remote.c:1369
-#: builtin/rm.c:268
+#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:543
+#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162
 msgid "dry run"
 msgstr "пробно изпълнeние"
 
-#: builtin/add.c:250 builtin/apply.c:4580 builtin/check-ignore.c:19
-#: builtin/commit.c:1322 builtin/count-objects.c:63 builtin/fsck.c:616
-#: builtin/log.c:1617 builtin/mv.c:109 builtin/read-tree.c:114
+#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19
+#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
+#: builtin/log.c:1645 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr "повече подробности"
 
@@ -2256,7 +2393,7 @@
 msgid "interactive picking"
 msgstr "интерактивно отбиране на промени"
 
-#: builtin/add.c:253 builtin/checkout.c:1221 builtin/reset.c:286
+#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "интерактивен избор на парчета код"
 
@@ -2318,93 +2455,515 @@
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "Опцията „--ignore-missing“ е съвместима само с „--dry-run“"
 
-#: builtin/add.c:358
+#: builtin/add.c:352
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Нищо не е зададено и нищо не е добавено.\n"
 
-#: builtin/add.c:359
+#: builtin/add.c:353
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Вероятно искахте да използвате „git add .“?\n"
 
-#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:918
-#: builtin/commit.c:335 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938
+#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:40
 msgid "index file corrupt"
 msgstr "файлът с индекса е повреден"
 
-#: builtin/add.c:447 builtin/apply.c:4678 builtin/mv.c:279 builtin/rm.c:430
+#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430
 msgid "Unable to write new index file"
 msgstr "Новият индекс не може да бъде записан"
 
+#: builtin/am.c:42
+#, c-format
+msgid "could not stat %s"
+msgstr "Не може да се получи информация чрез „stat“ за „%s“"
+
+#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077
+#, c-format
+msgid "could not read '%s'"
+msgstr "файлът „%s“ не може да бъде прочетен"
+
+#: builtin/am.c:445
+msgid "could not parse author script"
+msgstr "скриптът за автор не може да се анализира"
+
+#: builtin/am.c:522
+#, c-format
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "„%s“ бе изтрит от куката „applypatch-msg“"
+
+#: builtin/am.c:563 builtin/notes.c:300
+#, c-format
+msgid "Malformed input line: '%s'."
+msgstr "Даденият входен ред е с неправилен формат: „%s“."
+
+#: builtin/am.c:600 builtin/notes.c:315
+#, c-format
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Бележката не може да се копира от „%s“ към „%s“"
+
+#: builtin/am.c:626
+msgid "fseek failed"
+msgstr "неуспешно изпълнение на „fseek“"
+
+#: builtin/am.c:787 builtin/am.c:875
+#, c-format
+msgid "could not open '%s' for reading: %s"
+msgstr "„%s“ не може да бъде отворен за четене: %s"
+
+#: builtin/am.c:794
+#, c-format
+msgid "could not open '%s' for writing: %s"
+msgstr "„%s“ не може да бъде отворен за запис: %s"
+
+#: builtin/am.c:803
+#, c-format
+msgid "could not parse patch '%s'"
+msgstr "кръпката „%s“ не може да се анализира"
+
+#: builtin/am.c:868
+msgid "Only one StGIT patch series can be applied at once"
+msgstr ""
+"Само една серия кръпки от „StGIT“ може да бъде прилагана в даден момент"
+
+#: builtin/am.c:916
+msgid "invalid timestamp"
+msgstr "неправилна стойност за време"
+
+#: builtin/am.c:919 builtin/am.c:927
+msgid "invalid Date line"
+msgstr "неправилен ред за дата „Date“"
+
+#: builtin/am.c:924
+msgid "invalid timezone offset"
+msgstr "неправилно отместване на часовия пояс"
+
+#: builtin/am.c:1011
+msgid "Patch format detection failed."
+msgstr "Форматът на кръпката не може да бъде определен."
+
+#: builtin/am.c:1016 builtin/clone.c:373
+#, c-format
+msgid "failed to create directory '%s'"
+msgstr "директорията „%s“ не може да бъде създадена"
+
+#: builtin/am.c:1020
+msgid "Failed to split patches."
+msgstr "Кръпките не могат да бъдат разделени."
+
+#: builtin/am.c:1152 builtin/commit.c:363
+msgid "unable to write index file"
+msgstr "индексът не може да бъде записан"
+
+#: builtin/am.c:1203
+#, c-format
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "След коригирането на този проблем изпълнете „%s --continue“."
+
+#: builtin/am.c:1204
+#, c-format
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr "Ако предпочитате да прескочите тази кръпка, изпълнете „%s --skip“."
+
+#: builtin/am.c:1205
+#, c-format
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr "За да се върнете към първоначалното състояние, изпълнете „%s --abort“."
+
+#: builtin/am.c:1343
+msgid "Patch is empty. Was it split wrong?"
+msgstr "Празна кръпка. Дали не е разделена погрешно?"
+
+#: builtin/am.c:1417 builtin/log.c:1347
+#, c-format
+msgid "invalid ident line: %s"
+msgstr "грешна идентичност: %s"
+
+#: builtin/am.c:1444
+#, c-format
+msgid "unable to parse commit %s"
+msgstr "подаването не може да бъде анализирано: %s"
+
+#: builtin/am.c:1646
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr ""
+"В хранилището липсват необходимите обекти BLOB, за да се премине към тройно "
+"сливане."
+
+#: builtin/am.c:1648
+msgid "Using index info to reconstruct a base tree..."
+msgstr "Базовото дърво се реконструира от информацията в индекса…"
+
+#: builtin/am.c:1667
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"Кръпката не може да се приложи към обектите BLOB в индекса.\n"
+"Да не би да сте я редактирали на ръка?"
+
+#: builtin/am.c:1673
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "Преминаване към прилагане на кръпка към базата и тройно сливане…"
+
+#: builtin/am.c:1688
+msgid "Failed to merge in the changes."
+msgstr "Неуспешно сливане на промените."
+
+#: builtin/am.c:1712 builtin/merge.c:632
+msgid "git write-tree failed to write a tree"
+msgstr "Командата „git write-tree“ не успя да запише обект-дърво"
+
+#: builtin/am.c:1719
+msgid "applying to an empty history"
+msgstr "прилагане върху празна история"
+
+#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829
+#: builtin/merge.c:854
+msgid "failed to write commit object"
+msgstr "обектът за подаването не може да бъде записан"
+
+#: builtin/am.c:1764 builtin/am.c:1768
+#, c-format
+msgid "cannot resume: %s does not exist."
+msgstr "не може да се продължи — „%s“ не съществува."
+
+#: builtin/am.c:1784
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr ""
+"За интерактивно изпълнение е необходимо стандартният\n"
+"изход да е свързан с терминал, а в момента не е."
+
+#: builtin/am.c:1789
+msgid "Commit Body is:"
+msgstr "Тялото на кръпката за прилагане е:"
+
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1799
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr ""
+"Прилагане? „y“ — да/„n“ — не/„e“ — редактиране/„v“ — преглед/„a“ — приемане "
+"на всичко:"
+
+#: builtin/am.c:1849
+#, c-format
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr ""
+"Индексът не е чист: кръпките не могат да бъдат приложени (замърсени са: %s)"
+
+#: builtin/am.c:1884 builtin/am.c:1955
+#, c-format
+msgid "Applying: %.*s"
+msgstr "Прилагане: %.*s"
+
+#: builtin/am.c:1900
+msgid "No changes -- Patch already applied."
+msgstr "Без промени — кръпката вече е приложена."
+
+#: builtin/am.c:1908
+#, c-format
+msgid "Patch failed at %s %.*s"
+msgstr "Неуспешно прилагане на кръпка при %s %.*s“"
+
+#: builtin/am.c:1914
+#, c-format
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "Дубликат на проблемната кръпка се намира в: %s"
+
+#: builtin/am.c:1958
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr ""
+"Без промени — възможно е да не сте изпълнили „git add“.\n"
+"Ако няма друга промяна за включване в индекса, най-вероятно някоя друга\n"
+"кръпка е довела до същите промени и в такъв случай просто пропуснете тази."
+
+#: builtin/am.c:1965
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"Индексът все още съдържа неслети промени.\n"
+"Възможно е да не сте изпълнили „git add“."
+
+#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308
+#: builtin/reset.c:316
+#, c-format
+msgid "Could not parse object '%s'."
+msgstr "„%s“ не е разпознат като обект."
+
+#: builtin/am.c:2125
+msgid "failed to clean index"
+msgstr "индексът не може да бъде изчистен"
+
+#: builtin/am.c:2159
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"Изглежда указателят „HEAD“ е променен и не сочи към същия обект както по "
+"времето\n"
+"на последното неуспешно изпълнение на „git am“. Указателят се задава да сочи "
+"към\n"
+"„ORIG_HEAD“"
+
+#: builtin/am.c:2220
+#, c-format
+msgid "Invalid value for --patch-format: %s"
+msgstr "Неправилна стойност за „--patch-format“: „%s“"
+
+#: builtin/am.c:2253
+msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
+msgstr "git am [ОПЦИЯ…] [ФАЙЛ_С_ПОЩА|ДИРЕКТОРИЯ_С_ПОЩА]…"
+
+#: builtin/am.c:2254
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [ОПЦИЯ…] (--continue | --quit | --abort)"
+
+#: builtin/am.c:2260
+msgid "run interactively"
+msgstr "интерактивна работа"
+
+#: builtin/am.c:2262
+msgid "historical option -- no-op"
+msgstr "изоставена опция, съществува по исторически причини, нищо не прави"
+
+#: builtin/am.c:2264
+msgid "allow fall back on 3way merging if needed"
+msgstr "да се преминава към тройно сливане при нужда."
+
+#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57
+#: builtin/repack.c:171
+msgid "be quiet"
+msgstr "без извеждане на информация"
+
+#: builtin/am.c:2267
+msgid "add a Signed-off-by line to the commit message"
+msgstr "добавяне на ред за подпис „Signed-off-by“ в съобщението за подаване"
+
+#: builtin/am.c:2270
+msgid "recode into utf8 (default)"
+msgstr "прекодиране в UTF-8 (стандартно)"
+
+#: builtin/am.c:2272
+msgid "pass -k flag to git-mailinfo"
+msgstr "подаване на опцията „-k“ на командата „git-mailinfo“"
+
+#: builtin/am.c:2274
+msgid "pass -b flag to git-mailinfo"
+msgstr "подаване на опцията „-b“ на командата „git-mailinfo“"
+
+#: builtin/am.c:2276
+msgid "pass -m flag to git-mailinfo"
+msgstr "подаване на опцията „-m“ на командата „git-mailinfo“"
+
+#: builtin/am.c:2278
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr ""
+"подаване на опцията „--keep-cr“ на командата „git-mailsplit“ за формат „mbox“"
+
+#: builtin/am.c:2281
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr ""
+"без подаване на опцията „--keep-cr“ на командата „git-mailsplit“ независимо "
+"от „am.keepcr“"
+
+#: builtin/am.c:2284
+msgid "strip everything before a scissors line"
+msgstr "пропускане на всичко преди реда за отрязване"
+
+#: builtin/am.c:2285 builtin/apply.c:4554
+msgid "action"
+msgstr "действие"
+
+#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295
+#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307
+#: builtin/am.c:2313
+msgid "pass it through git-apply"
+msgstr "прекарване през „git-apply“"
+
+#: builtin/am.c:2294 builtin/apply.c:4578
+msgid "root"
+msgstr "НАЧАЛНА_ДИРЕКТОРИЯ"
+
+#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516
+#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93
+#: builtin/pull.c:167 builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
+msgid "path"
+msgstr "път"
+
+#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
+#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127
+#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645
+#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
+#: parse-options.h:134 parse-options.h:244
+msgid "n"
+msgstr "БРОЙ"
+
+#: builtin/am.c:2306 builtin/apply.c:4522
+msgid "num"
+msgstr "БРОЙ"
+
+#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "ФОРМАТ"
+
+#: builtin/am.c:2310
+msgid "format the patch(es) are in"
+msgstr "формат на кръпките"
+
+#: builtin/am.c:2316
+msgid "override error message when patch failure occurs"
+msgstr "избрано от вас съобщение за грешка при прилагане на кръпки"
+
+#: builtin/am.c:2318
+msgid "continue applying patches after resolving a conflict"
+msgstr "продължаване на прилагането на кръпки след коригирането на конфликт"
+
+#: builtin/am.c:2321
+msgid "synonyms for --continue"
+msgstr "синоними на „--continue“"
+
+#: builtin/am.c:2324
+msgid "skip the current patch"
+msgstr "прескачане на текущата кръпка"
+
+#: builtin/am.c:2327
+msgid "restore the original branch and abort the patching operation."
+msgstr ""
+"възстановяване на първоначалното състояние на клона и преустановяване на "
+"прилагането на кръпката."
+
+#: builtin/am.c:2331
+msgid "lie about committer date"
+msgstr "дата за подаване различна от първоначалнота"
+
+#: builtin/am.c:2333
+msgid "use current timestamp for author date"
+msgstr "използване на текущото време като това за автор"
+
+#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225
+#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355
+msgid "key-id"
+msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ"
+
+#: builtin/am.c:2336
+msgid "GPG-sign commits"
+msgstr "подписване на подаванията с GPG"
+
+#: builtin/am.c:2339
+msgid "(internal use for git-rebase)"
+msgstr "(ползва се вътрешно за „git-rebase“)"
+
+#: builtin/am.c:2354
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr ""
+"Опциите „-b“/„--binary“ отдавна не правят нищо и\n"
+"ще бъдат премахнати в бъдеще. Не ги ползвайте."
+
+#: builtin/am.c:2361
+msgid "failed to read the index"
+msgstr "неуспешно изчитане на индекса"
+
+#: builtin/am.c:2376
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr ""
+"предишната директория за пребазиране „%s“ все още съществува, а е зададен "
+"файл „mbox“."
+
+#: builtin/am.c:2400
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"Открита е излишна директория „%s“.\n"
+"Можете да я изтриете с командата „git am --abort“."
+
+#: builtin/am.c:2406
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "В момента не тече операция по коригиране и няма как да се продължи."
+
 #: builtin/apply.c:59
 msgid "git apply [<options>] [<patch>...]"
 msgstr "git apply [ОПЦИЯ…] [КРЪПКА…]"
 
-#: builtin/apply.c:112
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
 msgstr "непозната опция за знаците за интервали „%s“"
 
-#: builtin/apply.c:127
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "непозната опция за игнориране на знаците за интервали „%s“"
 
-#: builtin/apply.c:822
+#: builtin/apply.c:818
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "Регулярният израз за времето „%s“ не може за бъде компилиран"
 
-#: builtin/apply.c:831
+#: builtin/apply.c:827
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "Регулярният израз върна %d при подадена последователност „%s“ на входа"
 
-#: builtin/apply.c:912
+#: builtin/apply.c:908
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "Липсва име на файл на ред %d от кръпката"
 
-#: builtin/apply.c:944
+#: builtin/apply.c:940
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
 "git apply: лош изход от командата „git-diff“ — на ред %2$d се очакваше „/dev/"
 "null“, а бе получен „%1$s“"
 
-#: builtin/apply.c:948
+#: builtin/apply.c:944
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr ""
 "git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
 "неправилно име на нов файл"
 
-#: builtin/apply.c:949
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr ""
 "git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
 "неправилно име на стар файл"
 
-#: builtin/apply.c:956
+#: builtin/apply.c:952
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr ""
 "git apply: лош изход от командата „git-diff“ — на ред %d се очакваше „/dev/"
 "null“"
 
-#: builtin/apply.c:1419
+#: builtin/apply.c:1415
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "при повторното преброяване бе получен неочакван ред: „%.*s“"
 
-#: builtin/apply.c:1476
+#: builtin/apply.c:1472
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "част от кръпка без заглавна част на ред %d: %.*s"
 
-#: builtin/apply.c:1493
+#: builtin/apply.c:1489
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2419,66 +2978,65 @@
 "След съкращаването на първите %d части от компонентите на пътя, в заглавната "
 "част на „git diff“ липсва информация за име на файл (ред: %d)"
 
-#: builtin/apply.c:1659
+#: builtin/apply.c:1655
 msgid "new file depends on old contents"
 msgstr "новият файл зависи от старото съдържание на файла"
 
-#: builtin/apply.c:1661
+#: builtin/apply.c:1657
 msgid "deleted file still has contents"
 msgstr "изтритият файл не е празен"
 
-#: builtin/apply.c:1687
+#: builtin/apply.c:1683
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "грешка в кръпката на ред %d"
 
-#: builtin/apply.c:1723
+#: builtin/apply.c:1719
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "новият файл „%s“ зависи от старото съдържание на файла"
 
-#: builtin/apply.c:1725
+#: builtin/apply.c:1721
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "изтритият файл „%s“ не е празен"
 
-# FIXME - double **??
-#: builtin/apply.c:1728
+#: builtin/apply.c:1724
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "●● предупреждение: файлът „%s“ вече е празен, но не е изтрит"
+msgstr "● предупреждение: файлът „%s“ вече е празен, но не е изтрит"
 
-#: builtin/apply.c:1874
+#: builtin/apply.c:1870
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "грешка в двоичната кръпка на ред %d: %.*s"
 
-#: builtin/apply.c:1903
+#: builtin/apply.c:1899
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "неразпозната двоичната кръпка на ред %d"
 
-#: builtin/apply.c:2054
+#: builtin/apply.c:2050
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "кръпката е с изцяло повредени данни на ред %d"
 
-#: builtin/apply.c:2144
+#: builtin/apply.c:2140
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "символната връзка „%s“ не може да бъде прочетена"
 
-#: builtin/apply.c:2148
+#: builtin/apply.c:2144
 #, c-format
 msgid "unable to open or read %s"
 msgstr "файлът „%s“ не може да бъде отворен или прочетен"
 
-#: builtin/apply.c:2781
+#: builtin/apply.c:2777
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "неправилно начало на ред: „%c“"
 
-#: builtin/apply.c:2900
+#: builtin/apply.c:2896
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
@@ -2487,13 +3045,13 @@
 msgstr[1] ""
 "%d-то парче код бе успешно приложено на ред %d (отместване от %d реда)."
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2908
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr ""
 "Контекстът е намален на (%ld/%ld) за прилагането на парчето код на ред %d"
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2914
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -2502,345 +3060,328 @@
 "при търсене за:\n"
 "%.*s"
 
-#: builtin/apply.c:2938
+#: builtin/apply.c:2934
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "липсват данните за двоичната кръпка за „%s“"
 
-#: builtin/apply.c:3039
+#: builtin/apply.c:3035
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "двоичната кръпка не може да бъде приложена върху „%s“"
 
-#: builtin/apply.c:3045
+#: builtin/apply.c:3041
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
 "двоичната кръпка за „%s“ води до неправилни резултати (очакваше се SHA1: "
 "„%s“, а бе получено: „%s“)"
 
-#: builtin/apply.c:3066
+#: builtin/apply.c:3062
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "неуспешно прилагане на кръпка: „%s:%ld“"
 
-#: builtin/apply.c:3190
+#: builtin/apply.c:3186
 #, c-format
 msgid "cannot checkout %s"
 msgstr "„%s“ не може да се изтегли"
 
-#: builtin/apply.c:3235 builtin/apply.c:3246 builtin/apply.c:3291
+#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
 #, c-format
 msgid "read of %s failed"
 msgstr "неуспешно прочитане на „%s“"
 
-#: builtin/apply.c:3243
+#: builtin/apply.c:3239
 #, c-format
 msgid "reading from '%s' beyond a symbolic link"
 msgstr "изчитане на „%s“ след проследяване на символна връзка"
 
-#: builtin/apply.c:3271 builtin/apply.c:3493
+#: builtin/apply.c:3267 builtin/apply.c:3489
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "обектът с път „%s“ е преименуван или изтрит"
 
-#: builtin/apply.c:3352 builtin/apply.c:3507
+#: builtin/apply.c:3348 builtin/apply.c:3503
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "„%s“ не съществува в индекса"
 
-#: builtin/apply.c:3356 builtin/apply.c:3499 builtin/apply.c:3521
+#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
 #, c-format
 msgid "%s: %s"
 msgstr "„%s“: %s"
 
-#: builtin/apply.c:3361 builtin/apply.c:3515
+#: builtin/apply.c:3357 builtin/apply.c:3511
 #, c-format
 msgid "%s: does not match index"
 msgstr "„%s“ не съответства на индекса"
 
-#: builtin/apply.c:3463
+#: builtin/apply.c:3459
 msgid "removal patch leaves file contents"
 msgstr "изтриващата кръпка оставя файла непразен"
 
-#: builtin/apply.c:3532
+#: builtin/apply.c:3528
 #, c-format
 msgid "%s: wrong type"
 msgstr "„%s“: неправилен вид"
 
-#: builtin/apply.c:3534
+#: builtin/apply.c:3530
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "„%s“ е от вид „%o“, а се очакваше „%o“"
 
-#: builtin/apply.c:3693 builtin/apply.c:3695
+#: builtin/apply.c:3689 builtin/apply.c:3691
 #, c-format
 msgid "invalid path '%s'"
 msgstr "неправилен път: „%s“"
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3746
 #, c-format
 msgid "%s: already exists in index"
 msgstr "„%s“: вече съществува в индекса"
 
-#: builtin/apply.c:3753
+#: builtin/apply.c:3749
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "„%s“: вече съществува в работното дърво"
 
-#: builtin/apply.c:3773
+#: builtin/apply.c:3769
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "новите права за достъп (%o) на „%s“ не съвпадат със старите (%o)"
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3774
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr ""
 "новите права за достъп (%o) на „%s“ не съвпадат със старите (%o) на „%s“"
 
-#: builtin/apply.c:3798
+#: builtin/apply.c:3794
 #, c-format
 msgid "affected file '%s' is beyond a symbolic link"
 msgstr "засегнатият файл „%s“ е след символна връзка"
 
-#: builtin/apply.c:3802
+#: builtin/apply.c:3798
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "Кръпката „%s“ не може да бъде приложена"
 
-#: builtin/apply.c:3816
+#: builtin/apply.c:3812
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Проверяване на кръпката „%s“…"
 
-#: builtin/apply.c:3909 builtin/checkout.c:233 builtin/reset.c:135
+#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "неуспешно създаване на запис в кеша чрез „make_cache_entry“ за „%s“"
 
-#: builtin/apply.c:4052
+#: builtin/apply.c:4048
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "„%s“ не може да се извади от индекса"
 
-#: builtin/apply.c:4081
+#: builtin/apply.c:4077
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "повредена кръпка за модула „%s“"
 
-#: builtin/apply.c:4085
+#: builtin/apply.c:4081
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr ""
 "не може да се получи информация чрез „stat“ за новосъздадения файл „%s“"
 
-#: builtin/apply.c:4090
+#: builtin/apply.c:4086
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr ""
 "не може да се за създаде мястото за съхранение на новосъздадения файл „%s“"
 
-#: builtin/apply.c:4093 builtin/apply.c:4201
+#: builtin/apply.c:4089 builtin/apply.c:4197
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "не може да се добави запис в кеша за „%s“"
 
-#: builtin/apply.c:4126
+#: builtin/apply.c:4122
 #, c-format
 msgid "closing file '%s'"
 msgstr "затваряне на файла „%s“"
 
-#: builtin/apply.c:4175
+#: builtin/apply.c:4171
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "файлът „%s“ не може да се запише с режим на достъп „%o“"
 
-#: builtin/apply.c:4262
+#: builtin/apply.c:4258
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Кръпката „%s“ бе приложена чисто."
 
-#: builtin/apply.c:4270
+#: builtin/apply.c:4266
 msgid "internal error"
 msgstr "вътрешна грешка"
 
-#: builtin/apply.c:4273
+#: builtin/apply.c:4269
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] "Прилагане на кръпката „%%s“ с %d отхвърлено парче…"
 msgstr[1] "Прилагане на кръпката „%%s“ с %d отхвърлени парчета…"
 
-#: builtin/apply.c:4283
+#: builtin/apply.c:4279
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "съкращаване на името на файла с отхвърлените парчета на „ %.*s.rej“"
 
-#: builtin/apply.c:4304
+#: builtin/apply.c:4300
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "%d-то парче бе успешно приложено."
 
-#: builtin/apply.c:4307
+#: builtin/apply.c:4303
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "%d-то парче бе отхвърлено."
 
-#: builtin/apply.c:4397
+#: builtin/apply.c:4393
 msgid "unrecognized input"
 msgstr "непознат вход"
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4404
 msgid "unable to read index file"
 msgstr "индексът не може да бъде записан"
 
-#: builtin/apply.c:4525 builtin/apply.c:4528 builtin/clone.c:85
-#: builtin/fetch.c:92
-msgid "path"
-msgstr "път"
-
-#: builtin/apply.c:4526
+#: builtin/apply.c:4517
 msgid "don't apply changes matching the given path"
 msgstr "без прилагане на промените напасващи на дадения път"
 
-#: builtin/apply.c:4529
+#: builtin/apply.c:4520
 msgid "apply changes matching the given path"
 msgstr "прилагане на промените напасващи на дадения път"
 
-#: builtin/apply.c:4531
-msgid "num"
-msgstr "БРОЙ"
-
-#: builtin/apply.c:4532
+#: builtin/apply.c:4523
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "премахване на този БРОЙ водещи елементи от пътищата в разликата"
 
-#: builtin/apply.c:4535
+#: builtin/apply.c:4526
 msgid "ignore additions made by the patch"
 msgstr "игнориране на редовете добавени от тази кръпка"
 
-#: builtin/apply.c:4537
+#: builtin/apply.c:4528
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr "извеждане на статистика на промените без прилагане на кръпката"
 
-#: builtin/apply.c:4541
+#: builtin/apply.c:4532
 msgid "show number of added and deleted lines in decimal notation"
 msgstr "извеждане на броя на добавените и изтритите редове"
 
-#: builtin/apply.c:4543
+#: builtin/apply.c:4534
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "извеждане на статистика на входните данни без прилагане на кръпката"
 
-#: builtin/apply.c:4545
+#: builtin/apply.c:4536
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "проверка дали кръпката може да се приложи, без действително прилагане"
 
-#: builtin/apply.c:4547
+#: builtin/apply.c:4538
 msgid "make sure the patch is applicable to the current index"
 msgstr "проверка дали кръпката може да бъде приложена към текущия индекс"
 
-#: builtin/apply.c:4549
+#: builtin/apply.c:4540
 msgid "apply a patch without touching the working tree"
 msgstr "прилагане на кръпката без промяна на работното дърво"
 
-#: builtin/apply.c:4551
+#: builtin/apply.c:4542
 msgid "accept a patch that touches outside the working area"
 msgstr "прилагане на кръпка, която променя и файлове извън работното дърво"
 
-#: builtin/apply.c:4553
+#: builtin/apply.c:4544
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr ""
 "кръпката да бъде приложена. Опцията се комбинира с „--check“/„--stat“/„--"
 "summary“"
 
-#: builtin/apply.c:4555
+#: builtin/apply.c:4546
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "пробване с тройно сливане, ако кръпката не може да се приложи директно"
 
-#: builtin/apply.c:4557
+#: builtin/apply.c:4548
 msgid "build a temporary index based on embedded index information"
 msgstr ""
 "създаване на временен индекс на база на включената информация за индекса"
 
-#: builtin/apply.c:4559 builtin/checkout-index.c:198 builtin/ls-files.c:412
+#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412
 msgid "paths are separated with NUL character"
 msgstr "разделяне на пътищата с нулевия знак „NUL“"
 
-#: builtin/apply.c:4562
+#: builtin/apply.c:4553
 msgid "ensure at least <n> lines of context match"
 msgstr "да се осигури контекст от поне такъв БРОЙ съвпадащи редове"
 
-#: builtin/apply.c:4563
-msgid "action"
-msgstr "действие"
-
-#: builtin/apply.c:4564
+#: builtin/apply.c:4555
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "засичане на нови или променени редове с грешки в знаците за интервали"
 
-#: builtin/apply.c:4567 builtin/apply.c:4570
+#: builtin/apply.c:4558 builtin/apply.c:4561
 msgid "ignore changes in whitespace when finding context"
 msgstr ""
 "игнориране на промените в знаците за интервали при откриване на контекста"
 
-#: builtin/apply.c:4573
+#: builtin/apply.c:4564
 msgid "apply the patch in reverse"
 msgstr "прилагане на кръпката в обратна посока"
 
-#: builtin/apply.c:4575
+#: builtin/apply.c:4566
 msgid "don't expect at least one line of context"
 msgstr "без изискване на дори и един ред контекст"
 
-#: builtin/apply.c:4577
+#: builtin/apply.c:4568
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "оставяне на отхвърлените парчета във файлове с разширение „.rej“"
 
-#: builtin/apply.c:4579
+#: builtin/apply.c:4570
 msgid "allow overlapping hunks"
 msgstr "позволяване на застъпващи се парчета"
 
-#: builtin/apply.c:4582
+#: builtin/apply.c:4573
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr "пренебрегване на неправилно липсващ знак за нов ред в края на файл"
 
-#: builtin/apply.c:4585
+#: builtin/apply.c:4576
 msgid "do not trust the line counts in the hunk headers"
 msgstr "без доверяване на номерата на редовете в заглавните части на парчетата"
 
-#: builtin/apply.c:4587
-msgid "root"
-msgstr "НАЧАЛНА_ДИРЕКТОРИЯ"
-
-#: builtin/apply.c:4588
+#: builtin/apply.c:4579
 msgid "prepend <root> to all filenames"
 msgstr "добавяне на тази НАЧАЛНА_ДИРЕКТОРИЯ към имената на всички файлове"
 
-#: builtin/apply.c:4610
+#: builtin/apply.c:4601
 msgid "--3way outside a repository"
 msgstr "като „--3way“, но извън хранилище"
 
-#: builtin/apply.c:4618
+#: builtin/apply.c:4609
 msgid "--index outside a repository"
 msgstr "като „--index“, но извън хранилище"
 
-#: builtin/apply.c:4621
+#: builtin/apply.c:4612
 msgid "--cached outside a repository"
 msgstr "като „--cached“, но извън хранилище"
 
-#: builtin/apply.c:4640
+#: builtin/apply.c:4631
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "кръпката „%s“ не може да бъде отворена"
 
-#: builtin/apply.c:4654
+#: builtin/apply.c:4645
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "пренебрегната е %d грешка в знаците за интервали"
 msgstr[1] "пренебрегнати са %d грешки в знаците за интервали"
 
-#: builtin/apply.c:4660 builtin/apply.c:4670
+#: builtin/apply.c:4651 builtin/apply.c:4661
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -2895,120 +3436,120 @@
 msgstr ""
 "обновяване на указателя „BISECT_HEAD“ вместо да се използва текущото подаване"
 
-#: builtin/blame.c:31
+#: builtin/blame.c:32
 msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
 msgstr "git blame [ОПЦИЯ…] [ОПЦИЯ_ЗА_ВЕРСИЯТА…] [ВЕРСИЯ] [--] ФАЙЛ"
 
-#: builtin/blame.c:36
+#: builtin/blame.c:37
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "ОПЦИИте_ЗА_ВЕРСИЯТА са документирани в ръководството git-rev-list(1)"
 
-#: builtin/blame.c:2500
+#: builtin/blame.c:2519
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Извеждане на анотациите с намирането им, последователно"
 
 # FIXME SHA-1 -> SHA1
-#: builtin/blame.c:2501
+#: builtin/blame.c:2520
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
 "Извеждане на празни суми по SHA1 за граничните подавания (стандартно опцията "
 "е изключена)"
 
-#: builtin/blame.c:2502
+#: builtin/blame.c:2521
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
 "Началните подавания да не се считат за гранични (стандартно опцията е "
 "изключена)"
 
-#: builtin/blame.c:2503
+#: builtin/blame.c:2522
 msgid "Show work cost statistics"
 msgstr "Извеждане на статистика за извършените действия"
 
-#: builtin/blame.c:2504
+#: builtin/blame.c:2523
 msgid "Show output score for blame entries"
 msgstr "Извеждане на допълнителна информация за определянето на анотациите"
 
-#: builtin/blame.c:2505
+#: builtin/blame.c:2524
 msgid "Show original filename (Default: auto)"
 msgstr ""
 "Извеждане на първоначалното име на файл (стандартно това е автоматично)"
 
-#: builtin/blame.c:2506
+#: builtin/blame.c:2525
 msgid "Show original linenumber (Default: off)"
 msgstr ""
 "Извеждане на първоначалният номер на ред (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2507
+#: builtin/blame.c:2526
 msgid "Show in a format designed for machine consumption"
 msgstr "Извеждане във формат за по-нататъшна обработка"
 
-#: builtin/blame.c:2508
+#: builtin/blame.c:2527
 msgid "Show porcelain format with per-line commit information"
 msgstr ""
 "Извеждане във формат за команди от потребителско ниво с информация на всеки "
 "ред"
 
-#: builtin/blame.c:2509
+#: builtin/blame.c:2528
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 "Използване на същия формат като „git-annotate“ (стандартно опцията е "
 "изключена)"
 
-#: builtin/blame.c:2510
+#: builtin/blame.c:2529
 msgid "Show raw timestamp (Default: off)"
 msgstr "Извеждане на неформатирани времена (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2511
+#: builtin/blame.c:2530
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Извеждане на пълните суми по SHA1 (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2512
+#: builtin/blame.c:2531
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Без име на автор и време на промяна (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2513
+#: builtin/blame.c:2532
 msgid "Show author email instead of name (Default: off)"
 msgstr ""
 "Извеждане на е-пощата на автора, а не името му (стандартно опцията е "
 "изключена)"
 
-#: builtin/blame.c:2514
+#: builtin/blame.c:2533
 msgid "Ignore whitespace differences"
 msgstr "Без разлики в знаците за интервали"
 
-#: builtin/blame.c:2515
+#: builtin/blame.c:2534
 msgid "Spend extra cycles to find better match"
 msgstr "Допълнителни изчисления за по-добри резултати"
 
-#: builtin/blame.c:2516
+#: builtin/blame.c:2535
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Изчитане на версиите от ФАЙЛ, а не чрез изпълнение на „git-rev-list“"
 
-#: builtin/blame.c:2517
+#: builtin/blame.c:2536
 msgid "Use <file>'s contents as the final image"
 msgstr "Използване на съдържанието на ФАЙЛа като крайно положение"
 
-#: builtin/blame.c:2518 builtin/blame.c:2519
+#: builtin/blame.c:2537 builtin/blame.c:2538
 msgid "score"
 msgstr "напасване на редовете"
 
-#: builtin/blame.c:2518
+#: builtin/blame.c:2537
 msgid "Find line copies within and across files"
 msgstr ""
 "Търсене на копирани редове както в рамките на един файл, така и от един файл "
 "към друг"
 
-#: builtin/blame.c:2519
+#: builtin/blame.c:2538
 msgid "Find line movements within and across files"
 msgstr ""
 "Търсене на преместени редове както в рамките на един файл, така и от един "
 "файл към друг"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "Process only line range n,m, counting from 1"
 msgstr ""
 "Информация само за редовете в интервала от n до m включително. Броенето "
@@ -3020,27 +3561,31 @@
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2601
+#: builtin/blame.c:2620
 msgid "4 years, 11 months ago"
 msgstr "преди 4 години и 11 месеца"
 
-#: builtin/branch.c:24
+#: builtin/branch.c:25
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [ОПЦИЯ…] [-r | -a] [--merged | --no-merged]"
 
-#: builtin/branch.c:25
+#: builtin/branch.c:26
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [ОПЦИЯ…] [-l] [-f] ИМЕ_НА_КЛОН [НАЧАЛО]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [ОПЦИЯ…] [-r] (-d | -D) ИМЕ_НА_КЛОН…"
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [ОПЦИЯ…] (-m | -M) [СТАР_КЛОН] НОВ_КЛОН"
 
-#: builtin/branch.c:150
+#: builtin/branch.c:29
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr "git branch [ОПЦИЯ…] [-r | -a] [--points-at]"
+
+#: builtin/branch.c:142
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -3049,7 +3594,7 @@
 "изтриване на клона „%s“, който е слят към „%s“,\n"
 "         но още не е слят към върха „HEAD“."
 
-#: builtin/branch.c:154
+#: builtin/branch.c:146
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -3058,12 +3603,12 @@
 "отказване на изтриване на клона „%s“, който не е слят към\n"
 "         „%s“, но е слят към върха „HEAD“."
 
-#: builtin/branch.c:168
+#: builtin/branch.c:160
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Обектът-подаване за „%s“ не може да бъде открит"
 
-#: builtin/branch.c:172
+#: builtin/branch.c:164
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -3072,310 +3617,301 @@
 "Клонът „%s“ не е слят напълно. Ако сте сигурни, че искате\n"
 "да го изтриете, изпълнете „git branch -D %s“."
 
-#: builtin/branch.c:185
+#: builtin/branch.c:177
 msgid "Update of config-file failed"
 msgstr "Неуспешно обновяване на конфигурационния файл"
 
-#: builtin/branch.c:213
+#: builtin/branch.c:205
 msgid "cannot use -a with -d"
 msgstr "Опцията „-a“ е несъвместима с опцията „-d“"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:211
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Обектът-подаване, сочен от указателя „HEAD“, не може да бъде открит"
 
-#: builtin/branch.c:227
+#: builtin/branch.c:219
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr "Не можете да изтриете клона „%s“, защото в момента е текущ."
+msgstr "Не можете да изтриете текущия клон „%s“"
 
-#: builtin/branch.c:243
+#: builtin/branch.c:235
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "следящият клон „%s“ не може да бъде открит."
 
-#: builtin/branch.c:244
+#: builtin/branch.c:236
 #, c-format
 msgid "branch '%s' not found."
 msgstr "клонът „%s“ не може да бъде открит."
 
-#: builtin/branch.c:258
+#: builtin/branch.c:251
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Грешка при изтриването на следящия клон „%s“"
 
-#: builtin/branch.c:259
+#: builtin/branch.c:252
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Грешка при изтриването на клона „%s“"
 
-#: builtin/branch.c:266
+#: builtin/branch.c:259
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Изтрит следящ клон „%s“ (той сочеше към „%s“).\n"
 
-#: builtin/branch.c:267
+#: builtin/branch.c:260
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Изтрит клон „%s“ (той сочеше към „%s“).\n"
 
-#: builtin/branch.c:368
-#, c-format
-msgid "branch '%s' does not point at a commit"
-msgstr "клонът „%s“ не сочи към подаване"
-
-#: builtin/branch.c:451
+#: builtin/branch.c:303
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: изтрит]"
 
-#: builtin/branch.c:456
+#: builtin/branch.c:308
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:461
+#: builtin/branch.c:313
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: назад с %d]"
 
-#: builtin/branch.c:463
+#: builtin/branch.c:315
 #, c-format
 msgid "[behind %d]"
 msgstr "[назад с %d]"
 
-#: builtin/branch.c:467
+#: builtin/branch.c:319
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: напред с %d]"
 
-#: builtin/branch.c:469
+#: builtin/branch.c:321
 #, c-format
 msgid "[ahead %d]"
 msgstr "[напред с %d]"
 
-#: builtin/branch.c:472
+#: builtin/branch.c:324
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: напред с %d, назад с %d]"
 
-#: builtin/branch.c:475
+#: builtin/branch.c:327
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[напред с %d, назад с %d]"
 
-# FIXME ** how many??
-#: builtin/branch.c:488
+#: builtin/branch.c:340
 msgid " **** invalid ref ****"
-msgstr " ●●●● неправилен указател ●●●●"
+msgstr " ●●● неправилен указател ●●●"
 
-#: builtin/branch.c:579
+#: builtin/branch.c:366
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(извън клон, пребазиране на „%s“)"
 
-#: builtin/branch.c:582
+#: builtin/branch.c:369
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(извън клон, двоично търсене от „%s“)"
 
-#: builtin/branch.c:588
+#: builtin/branch.c:375
 #, c-format
 msgid "(HEAD detached at %s)"
 msgstr "(Указателят „HEAD“ не е свързан и е при „%s“)"
 
-#: builtin/branch.c:591
+#: builtin/branch.c:378
 #, c-format
 msgid "(HEAD detached from %s)"
 msgstr "Указателят „HEAD“ не е свързан и е отделѐн от „%s“"
 
-#: builtin/branch.c:595
+#: builtin/branch.c:382
 msgid "(no branch)"
 msgstr "(извън клон)"
 
-#: builtin/branch.c:642
-#, c-format
-msgid "object '%s' does not point to a commit"
-msgstr "обектът „%s“ не сочи към подаване"
-
-#: builtin/branch.c:690
-msgid "some refs could not be read"
-msgstr "някои указатели не могат да бъдат прочетени"
-
-#: builtin/branch.c:703
+#: builtin/branch.c:524
 msgid "cannot rename the current branch while not on any."
 msgstr ""
 "не можете да преименувате текущия клон, защото сте извън който и да е клон"
 
-#: builtin/branch.c:713
+#: builtin/branch.c:534
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Неправилно име на клон: „%s“"
 
-#: builtin/branch.c:728
+#: builtin/branch.c:549
 msgid "Branch rename failed"
 msgstr "Неуспешно преименуване на клон"
 
-#: builtin/branch.c:732
+#: builtin/branch.c:553
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "На клона с неправилно име „%s“ е дадено служебно име"
 
-#: builtin/branch.c:736
+#: builtin/branch.c:557
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Клонът е преименуван на „%s“, но указателят „HEAD“ не е обновен"
 
-#: builtin/branch.c:743
+#: builtin/branch.c:564
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "Клонът е преименуван, но конфигурационният файл не е обновен"
 
-#: builtin/branch.c:758
-#, c-format
-msgid "malformed object name %s"
-msgstr "неправилно име на обект „%s“"
-
-#: builtin/branch.c:780
+#: builtin/branch.c:587
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr "шаблонът за описание на клон не бе записан: „%s“"
 
-#: builtin/branch.c:810
+#: builtin/branch.c:616
 msgid "Generic options"
 msgstr "Общи настройки"
 
-#: builtin/branch.c:812
+#: builtin/branch.c:618
 msgid "show hash and subject, give twice for upstream branch"
 msgstr ""
 "извеждане на хеша и темата. Повтарянето на опцията прибавя отдалечените клони"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:619
 msgid "suppress informational messages"
 msgstr "без информационни съобщения"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:620
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "задаване на режима на следене (виж git-pull(1))"
 
-#: builtin/branch.c:816
+#: builtin/branch.c:622
 msgid "change upstream info"
 msgstr "смяна на следения клон"
 
-#: builtin/branch.c:820
+#: builtin/branch.c:626
 msgid "use colored output"
 msgstr "цветен изход"
 
-#: builtin/branch.c:821
+#: builtin/branch.c:627
 msgid "act on remote-tracking branches"
 msgstr "действие върху следящите клони"
 
-#: builtin/branch.c:824 builtin/branch.c:830 builtin/branch.c:851
-#: builtin/branch.c:857 builtin/commit.c:1581 builtin/commit.c:1582
-#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/tag.c:616
-#: builtin/tag.c:622
-msgid "commit"
-msgstr "подаване"
-
-#: builtin/branch.c:825 builtin/branch.c:831
+#: builtin/branch.c:629 builtin/branch.c:630
 msgid "print only branches that contain the commit"
 msgstr "извеждане само на клоните, които съдържат това подаване"
 
-#: builtin/branch.c:837
+#: builtin/branch.c:633
 msgid "Specific git-branch actions:"
 msgstr "Специални действия на „git-branch“:"
 
-#: builtin/branch.c:838
+#: builtin/branch.c:634
 msgid "list both remote-tracking and local branches"
 msgstr "извеждане както на следящите, така и на локалните клони"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:636
 msgid "delete fully merged branch"
 msgstr "изтриване на клони, които са напълно слети"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:637
 msgid "delete branch (even if not merged)"
 msgstr "изтриване и на клони, които не са напълно слети"
 
-#: builtin/branch.c:842
+#: builtin/branch.c:638
 msgid "move/rename a branch and its reflog"
 msgstr ""
 "преместване/преименуване на клон и принадлежащият му журнал на указателите"
 
-#: builtin/branch.c:843
+#: builtin/branch.c:639
 msgid "move/rename a branch, even if target exists"
 msgstr "преместване/преименуване на клон, дори ако има вече клон с такова име"
 
-#: builtin/branch.c:844
+#: builtin/branch.c:640
 msgid "list branch names"
 msgstr "извеждане на имената на клоните"
 
-#: builtin/branch.c:845
+#: builtin/branch.c:641
 msgid "create the branch's reflog"
 msgstr "създаване на журнала на указателите на клона"
 
-#: builtin/branch.c:847
+#: builtin/branch.c:643
 msgid "edit the description for the branch"
 msgstr "редактиране на описанието на клона"
 
-#: builtin/branch.c:848
+#: builtin/branch.c:644
 msgid "force creation, move/rename, deletion"
 msgstr "принудително създаване, преместване, преименуване, изтриване"
 
-#: builtin/branch.c:851
-msgid "print only not merged branches"
-msgstr "извеждане само на неслетите клони"
-
-#: builtin/branch.c:857
-msgid "print only merged branches"
+#: builtin/branch.c:645
+msgid "print only branches that are merged"
 msgstr "извеждане само на слетите клони"
 
-#: builtin/branch.c:861
+#: builtin/branch.c:646
+msgid "print only branches that are not merged"
+msgstr "извеждане само на неслетите клони"
+
+#: builtin/branch.c:647
 msgid "list branches in columns"
 msgstr "извеждане по колони"
 
-#: builtin/branch.c:874
+#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
+msgstr "ключ"
+
+#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
+msgstr "име на полето, по което да е подредбата"
+
+#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398
+#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564
+#: builtin/tag.c:369
+msgid "object"
+msgstr "обект"
+
+#: builtin/branch.c:652
+msgid "print only branches of the object"
+msgstr "извеждане само на клоните на обекта"
+
+#: builtin/branch.c:670
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Не може да се открие към какво сочи указателят „HEAD“"
 
-#: builtin/branch.c:878 builtin/clone.c:622
+#: builtin/branch.c:674 builtin/clone.c:697
 msgid "HEAD not found below refs/heads!"
 msgstr "В директорията „refs/heads“ липсва файл „HEAD“"
 
-#: builtin/branch.c:900
+#: builtin/branch.c:694
 msgid "--column and --verbose are incompatible"
 msgstr "Опциите „--column“ и „--verbose“ са несъвместими"
 
-#: builtin/branch.c:911 builtin/branch.c:950
+#: builtin/branch.c:705 builtin/branch.c:747
 msgid "branch name required"
 msgstr "Необходимо е име на клон"
 
-#: builtin/branch.c:926
+#: builtin/branch.c:723
 msgid "Cannot give description to detached HEAD"
 msgstr "Не може да зададете описание на „HEAD“ извън клон"
 
-#: builtin/branch.c:931
+#: builtin/branch.c:728
 msgid "cannot edit description of more than one branch"
 msgstr "Не може да редактирате описанието на повече от един клон едновременно"
 
-#: builtin/branch.c:938
+#: builtin/branch.c:735
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "В клона „%s“ все още няма подавания."
 
-#: builtin/branch.c:941
+#: builtin/branch.c:738
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Липсва клон на име „%s“."
 
-#: builtin/branch.c:956
+#: builtin/branch.c:753
 msgid "too many branches for a rename operation"
 msgstr "Прекалено много клони за преименуване"
 
-#: builtin/branch.c:961
+#: builtin/branch.c:758
 msgid "too many branches to set new upstream"
-msgstr "Прекалено много клони за задаване на следене"
+msgstr "Зададени са прекалено много клони за следене"
 
-#: builtin/branch.c:965
+#: builtin/branch.c:762
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -3383,39 +3919,39 @@
 "Следеното от „HEAD“ не може да се зададе да е „%s“, защото то не сочи към "
 "никой клон."
 
-#: builtin/branch.c:968 builtin/branch.c:990 builtin/branch.c:1011
+#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808
 #, c-format
 msgid "no such branch '%s'"
 msgstr "Няма клон на име „%s“."
 
-#: builtin/branch.c:972
+#: builtin/branch.c:769
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "Не съществува клон на име „%s“."
 
-#: builtin/branch.c:984
+#: builtin/branch.c:781
 msgid "too many branches to unset upstream"
 msgstr "Прекалено много клони за махане на следене"
 
-#: builtin/branch.c:988
+#: builtin/branch.c:785
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "Следеното от „HEAD“ не може да махне, защото то не сочи към никой клон."
 
-#: builtin/branch.c:994
+#: builtin/branch.c:791
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Няма информация клонът „%s“ да следи някой друг"
 
-#: builtin/branch.c:1008
+#: builtin/branch.c:805
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "Няма никакъв смисъл ръчно да създавате „HEAD“."
 
-#: builtin/branch.c:1014
+#: builtin/branch.c:811
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr "Опциите „-a“ и „-r“ на „git branch“ са несъвместими с име на клон"
 
-#: builtin/branch.c:1017
+#: builtin/branch.c:814
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3424,7 +3960,7 @@
 "Опцията „--set-upstream“ вече е остаряла и предстои да бъде махната. "
 "Използвайте „--track“ или „--set-upstream-to“\n"
 
-#: builtin/branch.c:1034
+#: builtin/branch.c:831
 #, c-format
 msgid ""
 "\n"
@@ -3435,12 +3971,12 @@
 "За да накарате „%s“ да следи „%s“, изпълнете следната команда:\n"
 "\n"
 
-#: builtin/branch.c:1035
+#: builtin/branch.c:832
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr "    git branch -d %s\n"
 
-#: builtin/branch.c:1036
+#: builtin/branch.c:833
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr "    git branch --set-upstream-to %s\n"
@@ -3458,7 +3994,7 @@
 msgid "Need a repository to unbundle."
 msgstr "За приемането на пратка е необходимо хранилище."
 
-#: builtin/cat-file.c:369
+#: builtin/cat-file.c:428
 msgid ""
 "git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
 "<type>|--textconv) <object>"
@@ -3466,67 +4002,72 @@
 "git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
 "p | ВИД | --textconv) ОБЕКТ"
 
-#: builtin/cat-file.c:370
-msgid ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <list-of-"
-"objects>"
-msgstr ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < СПИСЪК_С_ОБЕКТИ"
+#: builtin/cat-file.c:429
+msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
 
-#: builtin/cat-file.c:407
+#: builtin/cat-file.c:466
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr ""
 "ВИДът може да е: „blob“ (обект BLOB), „tree“ (дърво), „commit“ (подаване), "
 "„tag“ (етикет)"
 
-#: builtin/cat-file.c:408
+#: builtin/cat-file.c:467
 msgid "show object type"
 msgstr "извеждане на вида на обект"
 
-#: builtin/cat-file.c:409
+#: builtin/cat-file.c:468
 msgid "show object size"
 msgstr "извеждане на размера на обект"
 
-#: builtin/cat-file.c:411
+#: builtin/cat-file.c:470
 msgid "exit with zero when there's no error"
 msgstr "изход с 0, когато няма грешка"
 
-#: builtin/cat-file.c:412
+#: builtin/cat-file.c:471
 msgid "pretty-print object's content"
 msgstr "форматирано извеждане на съдържанието на обекта"
 
-#: builtin/cat-file.c:414
+#: builtin/cat-file.c:473
 msgid "for blob objects, run textconv on object's content"
 msgstr ""
 "да се стартира програмата зададена в настройката „textconv“ за преобразуване "
-"на съдържанието на обекта"
+"на съдържанието на обекта BLOB"
 
-#: builtin/cat-file.c:416
+#: builtin/cat-file.c:475
 msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr "позволяване на опциите „-s“ и „-t“ да работят с повредени обекти"
 
-#: builtin/cat-file.c:418
+#: builtin/cat-file.c:476
+msgid "buffer --batch output"
+msgstr "буфериране на изхода от „--batch“"
+
+#: builtin/cat-file.c:478
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
 "извеждане на информация и съдържание на обектите подадени на стандартния вход"
 
-#: builtin/cat-file.c:421
+#: builtin/cat-file.c:481
 msgid "show info about objects fed from the standard input"
 msgstr "извеждане на информация за обектите подадени на стандартния вход"
 
-#: builtin/cat-file.c:424
+#: builtin/cat-file.c:484
 msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr ""
 "следване на символните връзки сочещи в дървото (ползва се с „--batch“ или „--"
 "batch-check“)"
 
+#: builtin/cat-file.c:486
+msgid "show all objects with --batch or --batch-check"
+msgstr "извеждане на всички обекти с „--batch“ или „--batch-check“"
+
 #: builtin/check-attr.c:11
 msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
 msgstr "git check-attr [-a | --all | АТРИБУТ…] [--] ПЪТ…"
 
 #: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...] < <list-of-paths>"
-msgstr "git check-attr --stdin [-z] [-a | --all | АТРИБУТ…] < СПИСЪК_С_ПЪТИЩА"
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+msgstr "git check-attr --stdin [-z] [-a | --all | АТРИБУТ…]"
 
 #: builtin/check-attr.c:19
 msgid "report all attributes set on file"
@@ -3544,7 +4085,7 @@
 msgid "terminate input and output records by a NUL character"
 msgstr "разделяне на входните и изходните записи с нулевия знак „NUL“"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1202 builtin/gc.c:279
+#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "без показване на напредъка"
 
@@ -3560,7 +4101,6 @@
 msgid "cannot specify pathnames with --stdin"
 msgstr "опцията „--stdin“ е несъвместима с имена на пътища"
 
-# FIXME options
 #: builtin/check-ignore.c:157
 msgid "-z only makes sense with --stdin"
 msgstr "опцията „-z“ изисква „--stdin“"
@@ -3573,12 +4113,10 @@
 msgid "--quiet is only valid with a single pathname"
 msgstr "опцията „--quiet“ изисква да е подаден точно един път"
 
-# FIXME options
 #: builtin/check-ignore.c:165
 msgid "cannot have both --quiet and --verbose"
 msgstr "опциите „--quiet“ и „--verbose“ са несъвместими"
 
-# FIXME options
 #: builtin/check-ignore.c:168
 msgid "--non-matching is only valid with --verbose"
 msgstr "опцията „--non-matching“ изисква „--verbose“"
@@ -3633,6 +4171,8 @@
 msgstr "записване на съдържанието във временни файлове"
 
 #: builtin/checkout-index.c:204 builtin/column.c:30
+#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181
 msgid "string"
 msgstr "НИЗ"
 
@@ -3644,11 +4184,11 @@
 msgid "copy out the files from named stage"
 msgstr "копиране на файловете от това състояние на сливане"
 
-#: builtin/checkout.c:24
+#: builtin/checkout.c:25
 msgid "git checkout [<options>] <branch>"
 msgstr "git checkout [ОПЦИЯ…] КЛОН"
 
-#: builtin/checkout.c:25
+#: builtin/checkout.c:26
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [ОПЦИЯ…] [КЛОН] -- ФАЙЛ…"
 
@@ -3662,13 +4202,11 @@
 msgid "path '%s' does not have their version"
 msgstr "чуждата версия липсва в пътя „%s“"
 
-# FIXME SAME AS [1]
 #: builtin/checkout.c:152
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "някоя от необходимите версии липсва в пътя „%s“"
 
-# FIXME SAME AS [1]
 #: builtin/checkout.c:196
 #, c-format
 msgid "path '%s' does not have necessary versions"
@@ -3714,46 +4252,46 @@
 msgid "you need to resolve your current index first"
 msgstr "първо трябва да коригирате индекса си"
 
-#: builtin/checkout.c:627
+#: builtin/checkout.c:623
 #, c-format
-msgid "Can not do reflog for '%s'\n"
-msgstr "Журналът на указателите за „%s“ не може да бъде създаден\n"
+msgid "Can not do reflog for '%s': %s\n"
+msgstr "Журналът на указателите за „%s“ не може да се проследи: %s\n"
 
-#: builtin/checkout.c:663
+#: builtin/checkout.c:661
 msgid "HEAD is now at"
 msgstr "Указателят „HEAD“ в момента сочи към"
 
-#: builtin/checkout.c:670
+#: builtin/checkout.c:668
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Зануляване на клона „%s“\n"
 
-#: builtin/checkout.c:673
+#: builtin/checkout.c:671
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Вече сте на „%s“\n"
 
-#: builtin/checkout.c:677
+#: builtin/checkout.c:675
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Преминаване към клона „%s“ и зануляване на промените\n"
 
-#: builtin/checkout.c:679 builtin/checkout.c:1134
+#: builtin/checkout.c:677 builtin/checkout.c:1066
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Преминахте към новия клон „%s“\n"
 
-#: builtin/checkout.c:681
+#: builtin/checkout.c:679
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Преминахте към клона „%s“\n"
 
-#: builtin/checkout.c:733
+#: builtin/checkout.c:731
 #, c-format
 msgid " ... and %d more.\n"
 msgstr "… и още %d.\n"
 
-#: builtin/checkout.c:739
+#: builtin/checkout.c:737
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -3775,7 +4313,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:758
+#: builtin/checkout.c:756
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -3802,153 +4340,154 @@
 " git branch ИМЕ_НА_НОВИЯ_КЛОН %s\n"
 "\n"
 
-#: builtin/checkout.c:794
+#: builtin/checkout.c:792
 msgid "internal error in revision walk"
 msgstr "вътрешна грешка при обхождането на версиите"
 
-#: builtin/checkout.c:798
+#: builtin/checkout.c:796
 msgid "Previous HEAD position was"
 msgstr "Преди това „HEAD“ сочеше към"
 
-#: builtin/checkout.c:825 builtin/checkout.c:1129
+#: builtin/checkout.c:823 builtin/checkout.c:1061
 msgid "You are on a branch yet to be born"
 msgstr "В момента сте на клон, който предстои да бъде създаден"
 
-#: builtin/checkout.c:931
-#, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "„%s“ вече е изтеглен в „%s“"
-
-#: builtin/checkout.c:1036
+#: builtin/checkout.c:968
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "очакваше се един указател, а сте подали %d."
 
-#: builtin/checkout.c:1075
+#: builtin/checkout.c:1007 builtin/worktree.c:213
 #, c-format
 msgid "invalid reference: %s"
 msgstr "неправилен указател: %s"
 
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1036
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "указателят не сочи към обект-дърво: %s"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1075
 msgid "paths cannot be used with switching branches"
 msgstr "задаването на път е несъвместимо с преминаването от един клон към друг"
 
-#: builtin/checkout.c:1146 builtin/checkout.c:1150
+#: builtin/checkout.c:1078 builtin/checkout.c:1082
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "опцията „%s“ е несъвместима с преминаването от един клон към друг"
 
-#: builtin/checkout.c:1154 builtin/checkout.c:1157 builtin/checkout.c:1162
-#: builtin/checkout.c:1165
+#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094
+#: builtin/checkout.c:1097
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "опцията „%s“ е несъвместима с „%s“"
 
-#: builtin/checkout.c:1170
+#: builtin/checkout.c:1102
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr ""
 "За да преминете към клон, подайте указател, който сочи към подаване. „%s“ не "
 "е такъв"
 
-#: builtin/checkout.c:1203 builtin/checkout.c:1205 builtin/clone.c:83
-#: builtin/remote.c:159 builtin/remote.c:161 builtin/worktree.c:282
-#: builtin/worktree.c:284
+#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320
+#: builtin/worktree.c:322
 msgid "branch"
 msgstr "клон"
 
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1136
 msgid "create and checkout a new branch"
 msgstr "създаване и преминаване към нов клон"
 
-#: builtin/checkout.c:1206
+#: builtin/checkout.c:1138
 msgid "create/reset and checkout a branch"
 msgstr "създаване/зануляване на клон и преминаване към него"
 
-#: builtin/checkout.c:1207
+#: builtin/checkout.c:1139
 msgid "create reflog for new branch"
 msgstr "създаване на журнал на указателите за нов клон"
 
-#: builtin/checkout.c:1208
+#: builtin/checkout.c:1140
 msgid "detach the HEAD at named commit"
 msgstr "отделяне на указателя „HEAD“ към указаното подаване"
 
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1141
 msgid "set upstream info for new branch"
 msgstr "задаване на кой клон бива следен при създаването на новия клон"
 
-#: builtin/checkout.c:1211
+#: builtin/checkout.c:1143
 msgid "new-branch"
 msgstr "НОВ_КЛОН"
 
-#: builtin/checkout.c:1211
+#: builtin/checkout.c:1143
 msgid "new unparented branch"
 msgstr "нов клон без родител"
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1144
 msgid "checkout our version for unmerged files"
 msgstr "изтегляне на вашата версия на неслетите файлове"
 
-#: builtin/checkout.c:1214
+#: builtin/checkout.c:1146
 msgid "checkout their version for unmerged files"
 msgstr "изтегляне на чуждата версия на неслетите файлове"
 
-#: builtin/checkout.c:1216
+#: builtin/checkout.c:1148
 msgid "force checkout (throw away local modifications)"
 msgstr "принудително изтегляне (вашите промени ще бъдат занулени)"
 
-#: builtin/checkout.c:1217
+#: builtin/checkout.c:1149
 msgid "perform a 3-way merge with the new branch"
 msgstr "извършване на тройно сливане с новия клон"
 
-#: builtin/checkout.c:1218 builtin/merge.c:227
+#: builtin/checkout.c:1150 builtin/merge.c:227
 msgid "update ignored files (default)"
 msgstr "обновяване на игнорираните файлове (стандартно)"
 
-#: builtin/checkout.c:1219 builtin/log.c:1239 parse-options.h:244
+#: builtin/checkout.c:1151 builtin/log.c:1266 parse-options.h:250
 msgid "style"
 msgstr "стил"
 
-#: builtin/checkout.c:1220
+#: builtin/checkout.c:1152
 msgid "conflict style (merge or diff3)"
 msgstr "действие при конфликт (сливане или тройна разлика)"
 
-#: builtin/checkout.c:1223
+#: builtin/checkout.c:1155
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "без ограничаване на изброените пътища само до частично изтеглените"
 
-#: builtin/checkout.c:1225
+#: builtin/checkout.c:1157
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr ""
 "опит за отгатване на име на клон след неуспешен опит с „git checkout "
 "НЕСЪЩЕСТВУВАЩ_КЛОН“"
 
-#: builtin/checkout.c:1227
+#: builtin/checkout.c:1159
 msgid "do not check if another worktree is holding the given ref"
 msgstr "без проверка дали друго работно дърво държи указателя"
 
-#: builtin/checkout.c:1252
+#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112
+#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:558
+#: builtin/send-pack.c:168
+msgid "force progress reporting"
+msgstr "извеждане на напредъка"
+
+#: builtin/checkout.c:1191
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "Опциите „-b“, „-B“ и „--orphan“ са несъвместими една с друга"
 
-#: builtin/checkout.c:1269
+#: builtin/checkout.c:1208
 msgid "--track needs a branch name"
 msgstr "опцията „--track“ изисква име на клон"
 
-#: builtin/checkout.c:1274
+#: builtin/checkout.c:1213
 msgid "Missing branch name; try -b"
 msgstr "Липсва име на клон, използвайте опцията „-b“"
 
-#: builtin/checkout.c:1310
+#: builtin/checkout.c:1249
 msgid "invalid path specification"
 msgstr "указан е неправилен път"
 
-#: builtin/checkout.c:1317
+#: builtin/checkout.c:1256
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3957,12 +4496,12 @@
 "Не можете едновременно да обновявате пътища и да преминете към клона „%s“.\n"
 "Дали не искате да изтеглите „%s“, който не сочи към подаване?"
 
-#: builtin/checkout.c:1322
+#: builtin/checkout.c:1261
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: опцията „--detach“ не приема аргумент-път „%s“"
 
-#: builtin/checkout.c:1326
+#: builtin/checkout.c:1265
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -3970,37 +4509,37 @@
 "git checkout: опциите „--ours“/„--theirs“, „--force“ и „--merge“\n"
 "са несъвместими с изтегляне от индекса."
 
-#: builtin/clean.c:26
+#: builtin/clean.c:25
 msgid ""
 "git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
 msgstr "git clean [-d] [-f] [-i] [-n] [-q] [-e ШАБЛОН] [-x | -X] [--] ПЪТ…"
 
-#: builtin/clean.c:30
+#: builtin/clean.c:29
 #, c-format
 msgid "Removing %s\n"
 msgstr "Изтриване на „%s“\n"
 
-#: builtin/clean.c:31
+#: builtin/clean.c:30
 #, c-format
 msgid "Would remove %s\n"
 msgstr "Файлът „%s“ ще бъде изтрит\n"
 
-#: builtin/clean.c:32
+#: builtin/clean.c:31
 #, c-format
 msgid "Skipping repository %s\n"
 msgstr "Прескачане на хранилището „%s“\n"
 
-#: builtin/clean.c:33
+#: builtin/clean.c:32
 #, c-format
 msgid "Would skip repository %s\n"
 msgstr "Хранилището „%s“ ще бъде прескочено\n"
 
-#: builtin/clean.c:34
+#: builtin/clean.c:33
 #, c-format
 msgid "failed to remove %s"
 msgstr "файлът „%s“ не може да бъде изтрит"
 
-#: builtin/clean.c:295
+#: builtin/clean.c:315
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -4012,7 +4551,7 @@
 "ПРЕФИКС    — избор на единствен обект по този уникален префикс\n"
 "           — (празно) нищо да не се избира"
 
-#: builtin/clean.c:299
+#: builtin/clean.c:319
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -4032,39 +4571,38 @@
 "*          — избиране на всички обекти\n"
 "           — (празно) завършване на избирането"
 
-# FIXME WTF does this mean
-#: builtin/clean.c:515
+#: builtin/clean.c:535
 #, c-format
 msgid "Huh (%s)?"
 msgstr "Неправилен избор (%s). Изберете отново."
 
 # FIXME - should we use >> or sth else
-#: builtin/clean.c:657
+#: builtin/clean.c:677
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Шаблони за игнорирани елементи≫ "
 
-#: builtin/clean.c:694
+#: builtin/clean.c:714
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "ПРЕДУПРЕЖДЕНИЕ: Никой обект не напасва на „%s“"
 
-#: builtin/clean.c:715
+#: builtin/clean.c:735
 msgid "Select items to delete"
 msgstr "Избиране на обекти за изтриване"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:756
+#: builtin/clean.c:776
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "Да се изтрие ли „%s“? „y“ —  да, „N“ — НЕ"
 
 # FIXME improve message
-#: builtin/clean.c:781
+#: builtin/clean.c:801
 msgid "Bye."
 msgstr "Изход."
 
-#: builtin/clean.c:789
+#: builtin/clean.c:809
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -4082,64 +4620,63 @@
 "help                — този край\n"
 "?                   — подсказка за шаблоните"
 
-# FIXME how many ***
-#: builtin/clean.c:816
+#: builtin/clean.c:836
 msgid "*** Commands ***"
 msgstr "●●● Команди ●●●"
 
 # FIXME improve message
-#: builtin/clean.c:817
+#: builtin/clean.c:837
 msgid "What now"
 msgstr "Избор на следващо действие"
 
-#: builtin/clean.c:825
+#: builtin/clean.c:845
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Следният обект ще бъде изтрит:"
 msgstr[1] "Следните обекти ще бъдат изтрити:"
 
-#: builtin/clean.c:842
+#: builtin/clean.c:862
 msgid "No more files to clean, exiting."
 msgstr "Файловете за изчистване свършиха. Изход от програмата."
 
-#: builtin/clean.c:873
+#: builtin/clean.c:893
 msgid "do not print names of files removed"
 msgstr "без извеждане на имената на файловете, които ще бъдат изтрити"
 
-#: builtin/clean.c:875
+#: builtin/clean.c:895
 msgid "force"
 msgstr "принудително изтриване"
 
-#: builtin/clean.c:876
+#: builtin/clean.c:896
 msgid "interactive cleaning"
 msgstr "интерактивно изтриване"
 
-#: builtin/clean.c:878
+#: builtin/clean.c:898
 msgid "remove whole directories"
 msgstr "изтриване на цели директории"
 
-#: builtin/clean.c:879 builtin/describe.c:407 builtin/grep.c:714
-#: builtin/ls-files.c:443 builtin/name-rev.c:311 builtin/show-ref.c:187
+#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709
+#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182
 msgid "pattern"
 msgstr "шаблон"
 
-#: builtin/clean.c:880
+#: builtin/clean.c:900
 msgid "add <pattern> to ignore rules"
 msgstr "добавяне на ШАБЛОН от файлове, които да не се трият"
 
-#: builtin/clean.c:881
+#: builtin/clean.c:901
 msgid "remove ignored files, too"
 msgstr "изтриване и на игнорираните файлове"
 
-#: builtin/clean.c:883
+#: builtin/clean.c:903
 msgid "remove only ignored files"
 msgstr "изтриване само на игнорирани файлове"
 
-#: builtin/clean.c:901
+#: builtin/clean.c:921
 msgid "-x and -X cannot be used together"
 msgstr "опциите „-x“ и „-X“ са несъвместими"
 
-#: builtin/clean.c:905
+#: builtin/clean.c:925
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -4147,7 +4684,7 @@
 "Настройката „clean.requireForce“ е зададена като истина, което изисква някоя "
 "от опциите „-i“, „-n“ или „-f“. Няма да се извърши изчистване"
 
-#: builtin/clean.c:908
+#: builtin/clean.c:928
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -4160,16 +4697,11 @@
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [ОПЦИЯ…] [--] ХРАНИЛИЩЕ [ДИРЕКТОРИЯ]"
 
-#: builtin/clone.c:57 builtin/fetch.c:111 builtin/merge.c:224
-#: builtin/push.c:523
-msgid "force progress reporting"
-msgstr "извеждане на напредъка"
-
 #: builtin/clone.c:59
 msgid "don't create a checkout"
 msgstr "без създаване на работно дърво"
 
-#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:503
+#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469
 msgid "create a bare repository"
 msgstr "създаване на голо хранилище"
 
@@ -4194,15 +4726,15 @@
 msgid "initialize submodules in the clone"
 msgstr "инициализиране на подмодулите при това клониране"
 
-#: builtin/clone.c:75 builtin/init-db.c:500
+#: builtin/clone.c:75 builtin/init-db.c:466
 msgid "template-directory"
 msgstr "директория с шаблони"
 
-#: builtin/clone.c:76 builtin/init-db.c:501
+#: builtin/clone.c:76 builtin/init-db.c:467
 msgid "directory from which templates will be used"
 msgstr "директория, която съдържа шаблоните, които да се ползват"
 
-#: builtin/clone.c:78
+#: builtin/clone.c:78 builtin/submodule--helper.c:179
 msgid "reference repository"
 msgstr "еталонно хранилище"
 
@@ -4226,7 +4758,7 @@
 msgid "path to git-upload-pack on the remote"
 msgstr "път към командата „git-upload-pack“ на отдалеченото хранилище"
 
-#: builtin/clone.c:87 builtin/fetch.c:112 builtin/grep.c:659
+#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654 builtin/pull.c:186
 msgid "depth"
 msgstr "ДЪЛБОЧИНА"
 
@@ -4240,11 +4772,11 @@
 "клониране само на един клон — или сочения от отдалечения „HEAD“, или изрично "
 "зададения с „--branch“"
 
-#: builtin/clone.c:91 builtin/init-db.c:509
+#: builtin/clone.c:91 builtin/init-db.c:475
 msgid "gitdir"
 msgstr "СЛУЖЕБНА_ДИРЕКТОРИЯ"
 
-#: builtin/clone.c:92 builtin/init-db.c:510
+#: builtin/clone.c:92 builtin/init-db.c:476
 msgid "separate git dir from working tree"
 msgstr "отделна СЛУЖЕБНА_ДИРЕКТОРИЯ за git извън работното дърво"
 
@@ -4256,57 +4788,57 @@
 msgid "set config inside the new repository"
 msgstr "задаване на настройките на новото хранилище"
 
-#: builtin/clone.c:240
+#: builtin/clone.c:300
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "все още не се поддържа еталонно хранилище „%s“ като свързано."
+
+#: builtin/clone.c:302
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr "еталонното хранилище „%s“ не е локално"
 
-#: builtin/clone.c:244
+#: builtin/clone.c:307
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "еталонното хранилище „%s“ е плитко"
 
-#: builtin/clone.c:247
+#: builtin/clone.c:310
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "еталонното хранилище „%s“ е с присаждане"
 
-#: builtin/clone.c:310
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr "директорията „%s“ не може да бъде създадена"
-
-#: builtin/clone.c:312 builtin/diff.c:84
+#: builtin/clone.c:375 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
 
-#: builtin/clone.c:314
+#: builtin/clone.c:377
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "„%s“ съществува и не е директория"
 
-#: builtin/clone.c:328
+#: builtin/clone.c:391
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "не може да бъде получена информация чрез „stat“ за „%s“\n"
 
-#: builtin/clone.c:350
+#: builtin/clone.c:413
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "връзката „%s“ не може да бъде създадена"
 
-#: builtin/clone.c:354
+#: builtin/clone.c:417
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "файлът не може да бъде копиран като „%s“"
 
-#: builtin/clone.c:377 builtin/clone.c:551
+#: builtin/clone.c:442 builtin/clone.c:626
 #, c-format
 msgid "done.\n"
 msgstr "действието завърши.\n"
 
-#: builtin/clone.c:389
+#: builtin/clone.c:454
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -4317,7 +4849,7 @@
 "клон в момента са изтеглени с командата „git status“. Можете да\n"
 "завършите изтеглянето на клона с командата „git checkout -f HEAD“.\n"
 
-#: builtin/clone.c:466
+#: builtin/clone.c:531
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr ""
@@ -4325,120 +4857,116 @@
 "и който следва да бъде изтеглен, не съществува."
 
 # FIXME translator note that the space at end is necesssary
-#: builtin/clone.c:546
+#: builtin/clone.c:621
 #, c-format
 msgid "Checking connectivity... "
 msgstr "Проверка на връзката… "
 
-#: builtin/clone.c:549
+#: builtin/clone.c:624
 msgid "remote did not send all necessary objects"
 msgstr "отдалеченото хранилище не изпрати всички необходими обекти."
 
-#: builtin/clone.c:613
+#: builtin/clone.c:688
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "указателят „HEAD“ от отдалеченото хранилище сочи към нещо,\n"
 "което не съществува. Не може да се изтегли определен клон.\n"
 
-#: builtin/clone.c:644
+#: builtin/clone.c:719
 msgid "unable to checkout working tree"
 msgstr "работното дърво не може да бъде подготвено"
 
-#: builtin/clone.c:731
+#: builtin/clone.c:808
 msgid "cannot repack to clean up"
 msgstr "не може да се извърши пакетиране за изчистване на файловете"
 
-#: builtin/clone.c:733
+#: builtin/clone.c:810
 msgid "cannot unlink temporary alternates file"
 msgstr "временният файл за алтернативни обекти не може да бъде изтрит"
 
-#: builtin/clone.c:763
+#: builtin/clone.c:842
 msgid "Too many arguments."
 msgstr "Прекалено много аргументи."
 
-#: builtin/clone.c:767
+#: builtin/clone.c:846
 msgid "You must specify a repository to clone."
 msgstr "Трябва да укажете кое хранилище искате да клонирате."
 
-#: builtin/clone.c:778
+#: builtin/clone.c:857
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "опциите „--bare“ и „--origin %s“ са несъвместими."
 
-#: builtin/clone.c:781
+#: builtin/clone.c:860
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "опциите „--bare“ и „--separate-git-dir“ са несъвместими."
 
-#: builtin/clone.c:794
+#: builtin/clone.c:873
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "не съществува хранилище „%s“"
 
-#: builtin/clone.c:800 builtin/fetch.c:1160
+#: builtin/clone.c:879 builtin/fetch.c:1166
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "дълбочината трябва да е положително цяло число, а не „%s“"
 
-#: builtin/clone.c:810
+#: builtin/clone.c:889
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "целевият път „%s“ съществува и не е празна директория."
 
-#: builtin/clone.c:820
+#: builtin/clone.c:899
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "в „%s“ вече съществува работно дърво."
 
-#: builtin/clone.c:835 builtin/clone.c:846 builtin/worktree.c:193
-#: builtin/worktree.c:220
+#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224
+#: builtin/worktree.c:221 builtin/worktree.c:248
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "родителските директории на „%s“ не могат да бъдат създадени"
 
-#: builtin/clone.c:838
+#: builtin/clone.c:917
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "работното дърво в „%s“ не може да бъде създадено."
 
-#: builtin/clone.c:856
+#: builtin/clone.c:935
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Клониране и създаване на голо хранилище в „%s“…\n"
 
-#: builtin/clone.c:858
+#: builtin/clone.c:937
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Клониране и създаване на хранилище в „%s“…\n"
 
-#: builtin/clone.c:883
-msgid "--dissociate given, but there is no --reference"
-msgstr "Опцията „--dissociate“ е несъвместима с „--reference“"
-
-#: builtin/clone.c:900
+#: builtin/clone.c:975
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 "При локално клониране опцията „--depth“ се игнорира. Ползвайте схемата "
 "„file://“."
 
-#: builtin/clone.c:903
+#: builtin/clone.c:978
 msgid "source repository is shallow, ignoring --local"
 msgstr "клонираното хранилище е плитко, затова опцията „--local“ се игнорира"
 
-#: builtin/clone.c:908
+#: builtin/clone.c:983
 msgid "--local is ignored"
 msgstr "опцията „--local“ се игнорира"
 
-#: builtin/clone.c:912
+#: builtin/clone.c:987
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Не се поддържа клониране на връзки от вида „%s“ "
 
-#: builtin/clone.c:961 builtin/clone.c:969
+#: builtin/clone.c:1036 builtin/clone.c:1044
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Отдалеченият клон „%s“ липсва в клонираното хранилище „%s“"
 
-#: builtin/clone.c:972
+#: builtin/clone.c:1047
 msgid "You appear to have cloned an empty repository."
 msgstr "Изглежда клонирахте празно хранилище."
 
@@ -4474,15 +5002,15 @@
 msgid "--command must be the first argument"
 msgstr "опцията „--command“ трябва да е първият аргумент"
 
-#: builtin/commit.c:37
+#: builtin/commit.c:38
 msgid "git commit [<options>] [--] <pathspec>..."
 msgstr "git commit [ОПЦИЯ…] [--] ПЪТ…"
 
-#: builtin/commit.c:42
+#: builtin/commit.c:43
 msgid "git status [<options>] [--] <pathspec>..."
 msgstr "git status [ОПЦИЯ…] [--] ПЪТ…"
 
-#: builtin/commit.c:47
+#: builtin/commit.c:48
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4510,7 +5038,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:60
+#: builtin/commit.c:61
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4535,7 +5063,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:72
+#: builtin/commit.c:73
 msgid ""
 "You asked to amend the most recent commit, but doing so would make\n"
 "it empty. You can repeat your command with --allow-empty, or you can\n"
@@ -4547,7 +5075,7 @@
 "с опцията „--allow-empty“, или да го изтриете от историята с командата:\n"
 "„git reset HEAD^“.\n"
 
-#: builtin/commit.c:77
+#: builtin/commit.c:78
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4562,11 +5090,11 @@
 "    git commit --allow-empty\n"
 "\n"
 
-#: builtin/commit.c:84
+#: builtin/commit.c:85
 msgid "Otherwise, please use 'git reset'\n"
 msgstr "В противен случай използвайте командата „git reset“\n"
 
-#: builtin/commit.c:87
+#: builtin/commit.c:88
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4582,31 +5110,27 @@
 "Чрез командата „git cherry-pick --continue“ ще продължите отбирането на\n"
 "останалите подавания.\n"
 
-#: builtin/commit.c:304
+#: builtin/commit.c:305
 msgid "failed to unpack HEAD tree object"
 msgstr "върховото дърво (HEAD tree object) не може да бъде извадено от пакет"
 
-#: builtin/commit.c:344
+#: builtin/commit.c:346
 msgid "unable to create temporary index"
 msgstr "временният индекс не може да бъде създаден"
 
-#: builtin/commit.c:350
+#: builtin/commit.c:352
 msgid "interactive add failed"
 msgstr "неуспешно интерактивно добавяне"
 
-#: builtin/commit.c:361
-msgid "unable to write index file"
-msgstr "индексът не може да бъде записан"
-
-#: builtin/commit.c:363
+#: builtin/commit.c:365
 msgid "unable to update temporary index"
 msgstr "временният индекс не може да бъде обновен"
 
-#: builtin/commit.c:365
+#: builtin/commit.c:367
 msgid "Failed to update main cache tree"
 msgstr "Дървото на основния кеш не може да бъде обновено"
 
-#: builtin/commit.c:389 builtin/commit.c:414 builtin/commit.c:463
+#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
 msgid "unable to write new_index file"
 msgstr "новият индекс не може да бъде записан"
 
@@ -4680,11 +5204,6 @@
 msgid "could not read SQUASH_MSG"
 msgstr "съобщението за смачкване SQUASH_MSG не може да бъде прочетено"
 
-#: builtin/commit.c:738 builtin/merge.c:1079
-#, c-format
-msgid "could not read '%s'"
-msgstr "файлът „%s“ не може да бъде прочетен"
-
 #: builtin/commit.c:785
 msgid "could not write commit template"
 msgstr "шаблонът за подаване не може да бъде запазен"
@@ -4765,7 +5284,7 @@
 msgid "Error building trees"
 msgstr "Грешка при изграждане на дърветата"
 
-#: builtin/commit.c:953 builtin/tag.c:495
+#: builtin/commit.c:953 builtin/tag.c:266
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Подайте съобщението с някоя от опциите „-m“ или „-F“.\n"
@@ -4846,7 +5365,7 @@
 "сте\n"
 "ползвали опцията „--only“ с ПЪТища…"
 
-#: builtin/commit.c:1209 builtin/tag.c:728
+#: builtin/commit.c:1209 builtin/tag.c:475
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Несъществуващ режим на изчистване „%s“"
@@ -4855,32 +5374,33 @@
 msgid "Paths with -a does not make sense."
 msgstr "Опцията „-a“ е несъвместима със задаването на пътища."
 
-#: builtin/commit.c:1324 builtin/commit.c:1603
+#: builtin/commit.c:1324 builtin/commit.c:1605
 msgid "show status concisely"
 msgstr "кратка информация за състоянието"
 
-#: builtin/commit.c:1326 builtin/commit.c:1605
+#: builtin/commit.c:1326 builtin/commit.c:1607
 msgid "show branch information"
 msgstr "информация за клоните"
 
-#: builtin/commit.c:1328 builtin/commit.c:1607 builtin/push.c:509
+#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:544
+#: builtin/worktree.c:423
 msgid "machine-readable output"
 msgstr "формат на изхода за четене от програма"
 
-#: builtin/commit.c:1331 builtin/commit.c:1609
+#: builtin/commit.c:1331 builtin/commit.c:1611
 msgid "show status in long format (default)"
 msgstr "подробна информация за състоянието (стандартно)"
 
-#: builtin/commit.c:1334 builtin/commit.c:1612
+#: builtin/commit.c:1334 builtin/commit.c:1614
 msgid "terminate entries with NUL"
 msgstr "разделяне на елементите с нулевия знак „NUL“"
 
-#: builtin/commit.c:1336 builtin/commit.c:1615 builtin/fast-export.c:980
-#: builtin/fast-export.c:983 builtin/tag.c:603
+#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:353
 msgid "mode"
 msgstr "режим"
 
-#: builtin/commit.c:1337 builtin/commit.c:1615
+#: builtin/commit.c:1337 builtin/commit.c:1617
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "извеждане на неследените файлове. Възможните режими са „all“ (подробна\n"
@@ -4891,7 +5411,7 @@
 msgid "show ignored files"
 msgstr "извеждане на игнорираните файлове"
 
-#: builtin/commit.c:1341 parse-options.h:152
+#: builtin/commit.c:1341 parse-options.h:155
 msgid "when"
 msgstr "кога"
 
@@ -4924,193 +5444,185 @@
 msgid " (root-commit)"
 msgstr " (начално подаване)"
 
-#: builtin/commit.c:1573
+#: builtin/commit.c:1575
 msgid "suppress summary after successful commit"
 msgstr "без информация след успешно подаване"
 
-#: builtin/commit.c:1574
+#: builtin/commit.c:1576
 msgid "show diff in commit message template"
 msgstr "добавяне на разликата към шаблона за съобщението при подаване"
 
-#: builtin/commit.c:1576
+#: builtin/commit.c:1578
 msgid "Commit message options"
 msgstr "Опции за съобщението при подаване"
 
-#: builtin/commit.c:1577 builtin/tag.c:601
+#: builtin/commit.c:1579 builtin/tag.c:351
 msgid "read message from file"
 msgstr "взимане на съобщението от файл"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1580
 msgid "author"
 msgstr "автор"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1580
 msgid "override author for commit"
 msgstr "задаване на автор за подаването"
 
-#: builtin/commit.c:1579 builtin/gc.c:280
+#: builtin/commit.c:1581 builtin/gc.c:326
 msgid "date"
 msgstr "дата"
 
-#: builtin/commit.c:1579
+#: builtin/commit.c:1581
 msgid "override date for commit"
 msgstr "задаване на дата за подаването"
 
-#: builtin/commit.c:1580 builtin/merge.c:218 builtin/notes.c:391
-#: builtin/notes.c:554 builtin/tag.c:599
+#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392
+#: builtin/notes.c:555 builtin/tag.c:349
 msgid "message"
 msgstr "съобщение"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1582
 msgid "commit message"
 msgstr "съобщение при подаване"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
+#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
+msgid "commit"
+msgstr "подаване"
+
+#: builtin/commit.c:1583
 msgid "reuse and edit message from specified commit"
 msgstr "преизползване и редактиране на съобщението от указаното подаване"
 
-#: builtin/commit.c:1582
+#: builtin/commit.c:1584
 msgid "reuse message from specified commit"
 msgstr "преизползване на съобщението от указаното подаване"
 
-#: builtin/commit.c:1583
+#: builtin/commit.c:1585
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "използване на автоматичното съобщение при смачкване за вкарване на "
 "указаното\n"
 "подаване в предното без следа"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1586
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "използване на автоматичното съобщение при смачкване за смачкване на "
 "указаното\n"
 "подаване в предното"
 
-#: builtin/commit.c:1585
+#: builtin/commit.c:1587
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
 "смяна на автора да съвпада с подаващия (използва се с „-C“/„-c“/„--amend“)"
 
-#: builtin/commit.c:1586 builtin/log.c:1191 builtin/revert.c:86
+#: builtin/commit.c:1588 builtin/log.c:1216 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "добавяне на поле за подпис — „Signed-off-by:“"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1589
 msgid "use specified template file"
 msgstr "използване на указания шаблонен файл"
 
-#: builtin/commit.c:1588
+#: builtin/commit.c:1590
 msgid "force edit of commit"
 msgstr "редактиране на подаване"
 
-#: builtin/commit.c:1589
+#: builtin/commit.c:1591
 msgid "default"
 msgstr "стандартно"
 
-#: builtin/commit.c:1589 builtin/tag.c:604
+#: builtin/commit.c:1591 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "кои празни знаци и #коментари да се махат от съобщенията"
 
-#: builtin/commit.c:1590
+#: builtin/commit.c:1592
 msgid "include status in commit message template"
 msgstr "вмъкване на състоянието в шаблона за съобщението при подаване"
 
-#: builtin/commit.c:1591 builtin/merge.c:225 builtin/revert.c:92
-#: builtin/tag.c:605
-msgid "key-id"
-msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ"
-
-#: builtin/commit.c:1592 builtin/merge.c:226 builtin/revert.c:93
+#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156
+#: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "подписване на подаването с GPG"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1597
 msgid "Commit contents options"
 msgstr "Опции за избор на файлове при подаване"
 
-#: builtin/commit.c:1596
+#: builtin/commit.c:1598
 msgid "commit all changed files"
 msgstr "подаване на всички променени файлове"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1599
 msgid "add specified files to index for commit"
 msgstr "добавяне на указаните файлове към индекса за подаване"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1600
 msgid "interactively add files"
 msgstr "интерактивно добавяне на файлове"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1601
 msgid "interactively add changes"
 msgstr "интерактивно добавяне на промени"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1602
 msgid "commit only specified files"
 msgstr "подаване само на указаните файлове"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1603
 msgid "bypass pre-commit hook"
 msgstr "без изпълнение на куката преди подаване (pre-commit)"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1604
 msgid "show what would be committed"
 msgstr "отпечатване на това, което би било подадено"
 
-#: builtin/commit.c:1613
+#: builtin/commit.c:1615
 msgid "amend previous commit"
 msgstr "поправяне на предишното подаване"
 
-#: builtin/commit.c:1614
+#: builtin/commit.c:1616
 msgid "bypass post-rewrite hook"
 msgstr "без изпълнение на куката след презаписване (post-rewrite)"
 
-#: builtin/commit.c:1619
+#: builtin/commit.c:1621
 msgid "ok to record an empty change"
 msgstr "позволяване на празни подавания"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1623
 msgid "ok to record a change with an empty message"
 msgstr "позволяване на подавания с празни съобщения"
 
-#: builtin/commit.c:1650
+#: builtin/commit.c:1652
 msgid "could not parse HEAD commit"
 msgstr "върховото подаване „HEAD“ не може да бъде прочетено"
 
-#: builtin/commit.c:1689 builtin/merge.c:1076
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr "файлът не може да бъде прочетен: „%s“"
-
-#: builtin/commit.c:1696
+#: builtin/commit.c:1698
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Повреден файл за върха за сливането „MERGE_HEAD“ (%s)"
 
-#: builtin/commit.c:1703
+#: builtin/commit.c:1705
 msgid "could not read MERGE_MODE"
 msgstr "режимът на сливане „MERGE_MODE“ не може да бъде прочетен"
 
-#: builtin/commit.c:1722
+#: builtin/commit.c:1724
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "съобщението за подаване не може да бъде прочетено: %s"
 
-#: builtin/commit.c:1733
+#: builtin/commit.c:1735
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Неизвършване на подаване поради нередактирано съобщение.\n"
 
-#: builtin/commit.c:1738
+#: builtin/commit.c:1740
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Неизвършване на подаване поради празно съобщение.\n"
 
-#: builtin/commit.c:1753 builtin/merge.c:829 builtin/merge.c:854
-msgid "failed to write commit object"
-msgstr "обектът за подаването не може да бъде записан"
-
-#: builtin/commit.c:1786
+#: builtin/commit.c:1788
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -5124,137 +5636,141 @@
 msgid "git config [<options>]"
 msgstr "git config [ОПЦИЯ…]"
 
-#: builtin/config.c:53
+#: builtin/config.c:54
 msgid "Config file location"
 msgstr "Местоположение на конфигурационния файл"
 
-#: builtin/config.c:54
+#: builtin/config.c:55
 msgid "use global config file"
 msgstr "използване на глобалния конфигурационен файл"
 
-#: builtin/config.c:55
+#: builtin/config.c:56
 msgid "use system config file"
 msgstr "използване на системния конфигурационен файл"
 
-#: builtin/config.c:56
+#: builtin/config.c:57
 msgid "use repository config file"
 msgstr "използване на конфигурационния файл на хранилището"
 
-#: builtin/config.c:57
+#: builtin/config.c:58
 msgid "use given config file"
 msgstr "използване на зададения конфигурационен файл"
 
-#: builtin/config.c:58
+#: builtin/config.c:59
 msgid "blob-id"
 msgstr "идентификатор на BLOB"
 
-#: builtin/config.c:58
+#: builtin/config.c:59
 msgid "read config from given blob object"
 msgstr ""
 "изчитане на конфигурацията от BLOB с този идентификатор на съдържанието"
 
-#: builtin/config.c:59
+#: builtin/config.c:60
 msgid "Action"
 msgstr "Действие"
 
-#: builtin/config.c:60
+#: builtin/config.c:61
 msgid "get value: name [value-regex]"
 msgstr "извеждане на стойност: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:61
+#: builtin/config.c:62
 msgid "get all values: key [value-regex]"
 msgstr "извеждане на всички стойности: ключ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:62
+#: builtin/config.c:63
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr ""
 "извеждане на стойностите за РЕГУЛЯРНия_ИЗРАЗ: РЕГУЛЯРЕН_ИЗРАЗ_ЗА_ИМЕТО "
 "[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:63
+#: builtin/config.c:64
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "извеждане на стойността за указания адрес: РАЗДЕЛ[.ПРОМЕНЛИВА] АДРЕС"
 
-#: builtin/config.c:64
+#: builtin/config.c:65
 msgid "replace all matching variables: name value [value_regex]"
 msgstr ""
 "замяна на всички съвпадащи променливи: ИМЕ СТОЙНОСТ "
 "[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:65
+#: builtin/config.c:66
 msgid "add a new variable: name value"
 msgstr "добавяне на нова променлива: ИМЕ СТОЙНОСТ"
 
-#: builtin/config.c:66
+#: builtin/config.c:67
 msgid "remove a variable: name [value-regex]"
 msgstr "изтриване на променлива: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:67
+#: builtin/config.c:68
 msgid "remove all matches: name [value-regex]"
 msgstr "изтриване на всички съвпадащи: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:68
+#: builtin/config.c:69
 msgid "rename section: old-name new-name"
 msgstr "преименуване на раздел: СТАРО_ИМЕ НОВО_ИМЕ"
 
-#: builtin/config.c:69
+#: builtin/config.c:70
 msgid "remove a section: name"
 msgstr "изтриване на раздел: ИМЕ"
 
-#: builtin/config.c:70
+#: builtin/config.c:71
 msgid "list all"
 msgstr "изброяване на всички"
 
-#: builtin/config.c:71
+#: builtin/config.c:72
 msgid "open an editor"
 msgstr "отваряне на редактор"
 
-#: builtin/config.c:72
+#: builtin/config.c:73
 msgid "find the color configured: slot [default]"
 msgstr "извеждане на зададения цвят: номер [стандартно]"
 
-#: builtin/config.c:73
+#: builtin/config.c:74
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "извеждане на зададения цвят: номер [стандартният изход е терминал]"
 
-#: builtin/config.c:74
+#: builtin/config.c:75
 msgid "Type"
 msgstr "Вид"
 
-#: builtin/config.c:75
+#: builtin/config.c:76
 msgid "value is \"true\" or \"false\""
 msgstr "СТОЙНОСТТА е „true“ (истина) или „false“ (лъжа)"
 
-#: builtin/config.c:76
+#: builtin/config.c:77
 msgid "value is decimal number"
 msgstr "СТОЙНОСТТА е цяло, десетично число"
 
-#: builtin/config.c:77
+#: builtin/config.c:78
 msgid "value is --bool or --int"
 msgstr "СТОЙНОСТТА е „--bool“ (булева) или „--int“ (десетично цяло число)"
 
-#: builtin/config.c:78
+#: builtin/config.c:79
 msgid "value is a path (file or directory name)"
 msgstr "СТОЙНОСТТА е път (до файл или директория)"
 
-#: builtin/config.c:79
+#: builtin/config.c:80
 msgid "Other"
 msgstr "Други"
 
 # FIXME NUL byte to null char, terminate -> razdelitel - da stane ednakvo
-#: builtin/config.c:80
+#: builtin/config.c:81
 msgid "terminate values with NUL byte"
 msgstr "разделяне на стойностите с нулевия знак „NUL“"
 
-#: builtin/config.c:81
+#: builtin/config.c:82
+msgid "show variable names only"
+msgstr "извеждане на имената на променливите"
+
+#: builtin/config.c:83
 msgid "respect include directives on lookup"
 msgstr "при търсене да се уважат и директивите за включване"
 
-#: builtin/config.c:316
+#: builtin/config.c:303
 msgid "unable to parse default color value"
 msgstr "неразпозната стойност на стандартния цвят"
 
-#: builtin/config.c:457
+#: builtin/config.c:441
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5269,16 +5785,16 @@
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:587
+#: builtin/config.c:575
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "конфигурационният файл „%s“ не може да бъде създаден"
 
-#: builtin/count-objects.c:55
+#: builtin/count-objects.c:77
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:65
+#: builtin/count-objects.c:87
 msgid "print sizes in human readable format"
 msgstr "извеждане на размерите на обектите във формат лесно четим от хора"
 
@@ -5306,7 +5822,7 @@
 msgid "tag '%s' is really '%s' here"
 msgstr "етикетът „%s“ тук е всъщност „%s“"
 
-#: builtin/describe.c:250 builtin/log.c:452
+#: builtin/describe.c:250 builtin/log.c:459
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "Неправилно име на обект „%s“"
@@ -5402,7 +5918,7 @@
 msgid "only consider tags matching <pattern>"
 msgstr "да се търси само измежду етикетите напасващи този ШАБЛОН"
 
-#: builtin/describe.c:410 builtin/name-rev.c:318
+#: builtin/describe.c:410 builtin/name-rev.c:314
 msgid "show abbreviated commit object as fallback"
 msgstr "извеждане на съкратено име на обект като резервен вариант"
 
@@ -5448,239 +5964,239 @@
 #: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
-msgstr "зададени са повече от 2 обекта: „%s“"
+msgstr "зададени са повече от 2 обекта BLOB: „%s“"
 
 #: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "зададен е неподдържан обект „%s“."
 
-#: builtin/fast-export.c:24
+#: builtin/fast-export.c:25
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [ОПЦИИ_ЗА_СПИСЪКА_С_ВЕРСИИ]"
 
-#: builtin/fast-export.c:979
+#: builtin/fast-export.c:980
 msgid "show progress after <n> objects"
 msgstr "Съобщение за напредъка на всеки такъв БРОЙ обекта"
 
-#: builtin/fast-export.c:981
+#: builtin/fast-export.c:982
 msgid "select handling of signed tags"
 msgstr "Как да се обработват подписаните етикети"
 
-#: builtin/fast-export.c:984
+#: builtin/fast-export.c:985
 msgid "select handling of tags that tag filtered objects"
 msgstr "Как да се обработват етикетите на филтрираните обекти"
 
-#: builtin/fast-export.c:987
+#: builtin/fast-export.c:988
 msgid "Dump marks to this file"
 msgstr "Запазване на маркерите в този файл"
 
-#: builtin/fast-export.c:989
+#: builtin/fast-export.c:990
 msgid "Import marks from this file"
 msgstr "Внасяне на маркерите от този файл"
 
-#: builtin/fast-export.c:991
+#: builtin/fast-export.c:992
 msgid "Fake a tagger when tags lack one"
 msgstr "Да се използва изкуствено име на човек при липса на задаващ етикета"
 
-#: builtin/fast-export.c:993
+#: builtin/fast-export.c:994
 msgid "Output full tree for each commit"
 msgstr "Извеждане на цялото дърво за всяко подаване"
 
-#: builtin/fast-export.c:995
+#: builtin/fast-export.c:996
 msgid "Use the done feature to terminate the stream"
 msgstr "Използване на маркер за завършване на потока"
 
-#: builtin/fast-export.c:996
+#: builtin/fast-export.c:997
 msgid "Skip output of blob data"
 msgstr "Без извеждане на съдържанието на обектите BLOB"
 
-#: builtin/fast-export.c:997
+#: builtin/fast-export.c:998
 msgid "refspec"
 msgstr "указател на версия"
 
-#: builtin/fast-export.c:998
+#: builtin/fast-export.c:999
 msgid "Apply refspec to exported refs"
 msgstr "Прилагане на указателя на версия към изнесените указатели"
 
-#: builtin/fast-export.c:999
+#: builtin/fast-export.c:1000
 msgid "anonymize output"
 msgstr "анонимизиране на извежданата информация"
 
-#: builtin/fetch.c:19
+#: builtin/fetch.c:20
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr "git fetch [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]"
 
-#: builtin/fetch.c:20
+#: builtin/fetch.c:21
 msgid "git fetch [<options>] <group>"
 msgstr "git fetch [ОПЦИЯ…] ГРУПА"
 
-#: builtin/fetch.c:21
+#: builtin/fetch.c:22
 msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
 msgstr "git fetch --multiple [ОПЦИЯ…] [(ХРАНИЛИЩЕ | ГРУПА)…]"
 
-#: builtin/fetch.c:22
+#: builtin/fetch.c:23
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [ОПЦИЯ…]"
 
-#: builtin/fetch.c:89
+#: builtin/fetch.c:90 builtin/pull.c:162
 msgid "fetch from all remotes"
 msgstr "доставяне от всички отдалечени хранилища"
 
-#: builtin/fetch.c:91
+#: builtin/fetch.c:92 builtin/pull.c:165
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "добавяне към „.git/FETCH_HEAD“ вместо замяна"
 
-#: builtin/fetch.c:93
+#: builtin/fetch.c:94 builtin/pull.c:168
 msgid "path to upload pack on remote end"
 msgstr "отдалечен път, където да се качи пакетът"
 
-#: builtin/fetch.c:94
+#: builtin/fetch.c:95 builtin/pull.c:170
 msgid "force overwrite of local branch"
 msgstr "принудително презаписване на локалния клон"
 
-#: builtin/fetch.c:96
+#: builtin/fetch.c:97
 msgid "fetch from multiple remotes"
 msgstr "доставяне от множество отдалечени хранилища"
 
-#: builtin/fetch.c:98
+#: builtin/fetch.c:99 builtin/pull.c:172
 msgid "fetch all tags and associated objects"
 msgstr "доставяне на всички етикети и принадлежащи обекти"
 
-#: builtin/fetch.c:100
+#: builtin/fetch.c:101
 msgid "do not fetch all tags (--no-tags)"
 msgstr "без доставянето на всички етикети „--no-tags“"
 
-#: builtin/fetch.c:102
+#: builtin/fetch.c:103 builtin/pull.c:175
 msgid "prune remote-tracking branches no longer on remote"
 msgstr "окастряне на клоните следящи вече несъществуващи отдалечени клони"
 
-#: builtin/fetch.c:103
+#: builtin/fetch.c:104 builtin/pull.c:178
 msgid "on-demand"
 msgstr "при нужда"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:105 builtin/pull.c:179
 msgid "control recursive fetching of submodules"
 msgstr "управление на рекурсивното доставяне на подмодулите"
 
-#: builtin/fetch.c:108
+#: builtin/fetch.c:109 builtin/pull.c:184
 msgid "keep downloaded pack"
 msgstr "запазване на изтеглените пакети с обекти"
 
-#: builtin/fetch.c:110
+#: builtin/fetch.c:111
 msgid "allow updating of HEAD ref"
 msgstr "позволяване на обновяването на указателя „HEAD“"
 
-#: builtin/fetch.c:113
+#: builtin/fetch.c:114 builtin/pull.c:187
 msgid "deepen history of shallow clone"
 msgstr "задълбочаване на историята на плитко хранилище"
 
-#: builtin/fetch.c:115
+#: builtin/fetch.c:116 builtin/pull.c:190
 msgid "convert to a complete repository"
 msgstr "превръщане в пълно хранилище"
 
-#: builtin/fetch.c:117 builtin/log.c:1208
+#: builtin/fetch.c:118 builtin/log.c:1233
 msgid "dir"
 msgstr "директория"
 
-#: builtin/fetch.c:118
+#: builtin/fetch.c:119
 msgid "prepend this to submodule path output"
 msgstr "добавяне на това пред пътя на подмодула"
 
-#: builtin/fetch.c:121
+#: builtin/fetch.c:122
 msgid "default mode for recursion"
 msgstr "стандартен режим на рекурсия"
 
-#: builtin/fetch.c:123
+#: builtin/fetch.c:124 builtin/pull.c:193
 msgid "accept refs that update .git/shallow"
 msgstr "приемане на указатели, които обновяват „.git/shallow“"
 
-#: builtin/fetch.c:124
+#: builtin/fetch.c:125 builtin/pull.c:195
 msgid "refmap"
 msgstr "карта с указатели"
 
-#: builtin/fetch.c:125
+#: builtin/fetch.c:126 builtin/pull.c:196
 msgid "specify fetch refmap"
 msgstr "указване на картата с указатели за доставяне"
 
-#: builtin/fetch.c:377
+#: builtin/fetch.c:378
 msgid "Couldn't find remote ref HEAD"
 msgstr "Указателят „HEAD“ в отдалеченото хранилище не може да бъде открит"
 
-#: builtin/fetch.c:457
+#: builtin/fetch.c:458
 #, c-format
 msgid "object %s not found"
 msgstr "обектът „%s“ липсва"
 
-#: builtin/fetch.c:462
+#: builtin/fetch.c:463
 msgid "[up to date]"
 msgstr "[актуализиран]"
 
-#: builtin/fetch.c:476
+#: builtin/fetch.c:477
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s → %s  (в текущия клон не може да се доставя)"
 
-#: builtin/fetch.c:477 builtin/fetch.c:563
+#: builtin/fetch.c:478 builtin/fetch.c:566
 msgid "[rejected]"
 msgstr "[отхвърлен]"
 
-#: builtin/fetch.c:488
+#: builtin/fetch.c:489
 msgid "[tag update]"
 msgstr "[обновяване на етикетите]"
 
-#: builtin/fetch.c:490 builtin/fetch.c:525 builtin/fetch.c:543
+#: builtin/fetch.c:491 builtin/fetch.c:526 builtin/fetch.c:544
 msgid "  (unable to update local ref)"
 msgstr "  (локалните указатели не могат да бъдат обновени)"
 
-#: builtin/fetch.c:508
+#: builtin/fetch.c:509
 msgid "[new tag]"
 msgstr "[нов етикет]"
 
-#: builtin/fetch.c:511
+#: builtin/fetch.c:512
 msgid "[new branch]"
 msgstr "[нов клон]"
 
-#: builtin/fetch.c:514
+#: builtin/fetch.c:515
 msgid "[new ref]"
 msgstr "[нов указател]"
 
-#: builtin/fetch.c:559
+#: builtin/fetch.c:561
 msgid "unable to update local ref"
 msgstr "локален указател не може да бъде обновен"
 
-#: builtin/fetch.c:559
+#: builtin/fetch.c:561
 msgid "forced update"
 msgstr "принудително обновяване"
 
-#: builtin/fetch.c:565
+#: builtin/fetch.c:568
 msgid "(non-fast-forward)"
 msgstr "(сливането не е тривиално)"
 
-#: builtin/fetch.c:599 builtin/fetch.c:832
+#: builtin/fetch.c:602 builtin/fetch.c:843
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "файлът „%s“ не може да бъде отворен: %s\n"
 
-#: builtin/fetch.c:608
+#: builtin/fetch.c:611
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "хранилището „%s“ не изпрати всички необходими обекти\n"
 
-#: builtin/fetch.c:626
+#: builtin/fetch.c:629
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 "отхвърляне на върха „%s“, защото плитките хранилища не могат да бъдат "
 "обновявани"
 
-#: builtin/fetch.c:714 builtin/fetch.c:797
+#: builtin/fetch.c:716 builtin/fetch.c:808
 #, c-format
 msgid "From %.*s\n"
 msgstr "От %.*s\n"
 
 # FIXME - is the space necessary
-#: builtin/fetch.c:725
+#: builtin/fetch.c:727
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -5690,55 +6206,55 @@
 "„git remote prune %s“, за да премахнете остарелите клони, които\n"
 "предизвикват конфликта"
 
-#: builtin/fetch.c:777
+#: builtin/fetch.c:779
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (обектът „%s“ ще се окаже извън клон)"
 
-#: builtin/fetch.c:778
+#: builtin/fetch.c:780
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (обектът „%s“ вече е извън клон)"
 
-#: builtin/fetch.c:802
+#: builtin/fetch.c:812
 msgid "[deleted]"
 msgstr "[изтрит]"
 
-#: builtin/fetch.c:803 builtin/remote.c:1057
+#: builtin/fetch.c:813 builtin/remote.c:1040
 msgid "(none)"
 msgstr "(нищо)"
 
-#: builtin/fetch.c:822
+#: builtin/fetch.c:833
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
-msgstr "Не може да изтегляте в текущия клон „%s“ на хранилище, което не е голо"
+msgstr "Не може да доставите в текущия клон „%s“ на хранилище, което не е голо"
 
-#: builtin/fetch.c:841
+#: builtin/fetch.c:852
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Стойността „%2$s“ за опцията „%1$s“ не е съвместима с „%3$s“"
 
-#: builtin/fetch.c:844
+#: builtin/fetch.c:855
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Опцията „%s“ се игнорира при „%s“\n"
 
-#: builtin/fetch.c:900
+#: builtin/fetch.c:911
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Не се поддържа доставяне от „%s“"
 
-#: builtin/fetch.c:1063
+#: builtin/fetch.c:1072
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Доставяне на „%s“\n"
 
-#: builtin/fetch.c:1065 builtin/remote.c:90
+#: builtin/fetch.c:1074 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "„%s“ не може да се достави"
 
-#: builtin/fetch.c:1083
+#: builtin/fetch.c:1092
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -5746,225 +6262,251 @@
 "Не сте указали отдалечено хранилище. Задайте или адрес, или име\n"
 "на отдалечено хранилище, откъдето да се доставят новите версии."
 
-#: builtin/fetch.c:1106
+#: builtin/fetch.c:1115
 msgid "You need to specify a tag name."
 msgstr "Трябва да укажете име на етикет."
 
-#: builtin/fetch.c:1148
+#: builtin/fetch.c:1157
 msgid "--depth and --unshallow cannot be used together"
 msgstr "опциите „--depth“ и „--unshallow“ са несъвместими"
 
-#: builtin/fetch.c:1150
+#: builtin/fetch.c:1159
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "не можете да използвате опцията „--unshallow“ върху пълно хранилище"
 
-#: builtin/fetch.c:1173
+#: builtin/fetch.c:1179
 msgid "fetch --all does not take a repository argument"
 msgstr "към „git fetch --all“ не можете да добавите аргумент — хранилище"
 
-#: builtin/fetch.c:1175
+#: builtin/fetch.c:1181
 msgid "fetch --all does not make sense with refspecs"
 msgstr ""
 "към „git fetch --all“ не можете да добавите аргумент — указател на версия"
 
-#: builtin/fetch.c:1186
+#: builtin/fetch.c:1192
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Няма нито отдалечено хранилище, нито група от хранилища на име „%s“"
 
-#: builtin/fetch.c:1194
+#: builtin/fetch.c:1200
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Указването на група и указването на версия са несъвместими"
 
-#: builtin/fmt-merge-msg.c:13
+#: builtin/fmt-merge-msg.c:14
 msgid ""
 "git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
 msgstr ""
 "git fmt-merge-msg [-m СЪОБЩЕНИЕ] [--log[=БРОЙ] | --no-log] [--file ФАЙЛ]"
 
-#: builtin/fmt-merge-msg.c:668 builtin/fmt-merge-msg.c:671 builtin/grep.c:698
-#: builtin/merge.c:198 builtin/repack.c:178 builtin/repack.c:182
-#: builtin/show-branch.c:664 builtin/show-ref.c:180 builtin/tag.c:590
-#: parse-options.h:131 parse-options.h:238
-msgid "n"
-msgstr "БРОЙ"
-
-#: builtin/fmt-merge-msg.c:669
+#: builtin/fmt-merge-msg.c:667
 msgid "populate log with at most <n> entries from shortlog"
 msgstr ""
 "вмъкване на журнал състоящ се от не повече от БРОЙ записа от съкратения "
 "журнал"
 
-#: builtin/fmt-merge-msg.c:672
+#: builtin/fmt-merge-msg.c:670
 msgid "alias for --log (deprecated)"
 msgstr "синоним на „--log“ (остаряло)"
 
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:673
 msgid "text"
 msgstr "ТЕКСТ"
 
-#: builtin/fmt-merge-msg.c:676
+#: builtin/fmt-merge-msg.c:674
 msgid "use <text> as start of message"
 msgstr "за начало на съобщението да се ползва ТЕКСТ"
 
-#: builtin/fmt-merge-msg.c:677
+#: builtin/fmt-merge-msg.c:675
 msgid "file to read from"
 msgstr "файл, от който да се чете"
 
-#: builtin/for-each-ref.c:687
-msgid "unable to parse format"
-msgstr "форматът не може да бъде анализиран"
-
-#: builtin/for-each-ref.c:1083
+#: builtin/for-each-ref.c:9
 msgid "git for-each-ref [<options>] [<pattern>]"
 msgstr "git for-each-ref [ОПЦИЯ…] [ШАБЛОН]"
 
-#: builtin/for-each-ref.c:1098
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
+msgstr "git for-each-ref [--points ОБЕКТ]"
+
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+msgstr "git for-each-ref[(--merged | --no-merged) [ОБЕКТ]]"
+
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
+msgstr "git for-each-ref [--contains ОБЕКТ]"
+
+#: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
 msgstr "цитиране подходящо за командни интерпретатори на обвивката"
 
-#: builtin/for-each-ref.c:1100
+#: builtin/for-each-ref.c:29
 msgid "quote placeholders suitably for perl"
 msgstr "цитиране подходящо за perl"
 
-#: builtin/for-each-ref.c:1102
+#: builtin/for-each-ref.c:31
 msgid "quote placeholders suitably for python"
 msgstr "цитиране подходящо за python"
 
-#: builtin/for-each-ref.c:1104
+#: builtin/for-each-ref.c:33
 msgid "quote placeholders suitably for Tcl"
 msgstr "цитиране подходящо за tcl"
 
-#: builtin/for-each-ref.c:1107
+#: builtin/for-each-ref.c:36
 msgid "show only <n> matched refs"
 msgstr "извеждане само на този БРОЙ напаснати указатели"
 
-#: builtin/for-each-ref.c:1108 builtin/replace.c:438
-msgid "format"
-msgstr "ФОРМАТ"
-
-#: builtin/for-each-ref.c:1108
+#: builtin/for-each-ref.c:37 builtin/tag.c:372
 msgid "format to use for the output"
 msgstr "ФОРМАТ за изхода"
 
-#: builtin/for-each-ref.c:1109
-msgid "key"
-msgstr "ключ"
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
+msgstr "извеждане само на указателите, сочещи към обекта"
 
-#: builtin/for-each-ref.c:1110
-msgid "field name to sort on"
-msgstr "име на полето, по което да е подредбата"
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
+msgstr "извеждане само на слетите указатели"
 
-#: builtin/fsck.c:147 builtin/prune.c:137
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr "извеждане само на неслетите указатели"
+
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
+msgstr "извеждане само на указателите, които съдържат това подаване"
+
+#: builtin/fsck.c:156 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr "Проверка на връзката"
 
-#: builtin/fsck.c:548
+#: builtin/fsck.c:486
 msgid "Checking object directories"
 msgstr "Проверка на директориите с обекти"
 
-#: builtin/fsck.c:611
+#: builtin/fsck.c:553
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [ОПЦИЯ…] [ОБЕКТ…]"
 
-#: builtin/fsck.c:617
+#: builtin/fsck.c:559
 msgid "show unreachable objects"
 msgstr "показване на недостижимите обекти"
 
-#: builtin/fsck.c:618
+#: builtin/fsck.c:560
 msgid "show dangling objects"
 msgstr "показване на обектите извън клоните"
 
-#: builtin/fsck.c:619
+#: builtin/fsck.c:561
 msgid "report tags"
 msgstr "показване на етикетите"
 
-#: builtin/fsck.c:620
+#: builtin/fsck.c:562
 msgid "report root nodes"
 msgstr "показване на кореновите възли"
 
-#: builtin/fsck.c:621
+#: builtin/fsck.c:563
 msgid "make index objects head nodes"
 msgstr "задаване на обекти от индекса да са коренови"
 
 # FIXME bad message
-#: builtin/fsck.c:622
+#: builtin/fsck.c:564
 msgid "make reflogs head nodes (default)"
 msgstr "проследяване на указателите от журнала като глави (стандартно)"
 
-#: builtin/fsck.c:623
+#: builtin/fsck.c:565
 msgid "also consider packs and alternate objects"
 msgstr "допълнително да се проверяват пакетите и алтернативните обекти"
 
-#: builtin/fsck.c:624
+#: builtin/fsck.c:566
+msgid "check only connectivity"
+msgstr "проверка само на връзката"
+
+#: builtin/fsck.c:567
 msgid "enable more strict checking"
 msgstr "по-строги проверки"
 
-#: builtin/fsck.c:626
+#: builtin/fsck.c:569
 msgid "write dangling objects in .git/lost-found"
 msgstr "запазване на обектите извън клоните в директорията „.git/lost-found“"
 
-#: builtin/fsck.c:627 builtin/prune.c:107
+#: builtin/fsck.c:570 builtin/prune.c:107
 msgid "show progress"
 msgstr "показване на напредъка"
 
-#: builtin/fsck.c:677
+#: builtin/fsck.c:631
 msgid "Checking objects"
 msgstr "Проверка на обектите"
 
 # FIXME plural with ...
-#: builtin/gc.c:24
+#: builtin/gc.c:25
 msgid "git gc [<options>]"
 msgstr "git gc [ОПЦИЯ…]"
 
-#: builtin/gc.c:67
+#: builtin/gc.c:72
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "Неправилен %s: „%s“"
 
-#: builtin/gc.c:112
+#: builtin/gc.c:139
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "прекалено дълга директория с обекти „%.*s“"
 
-#: builtin/gc.c:281
+#: builtin/gc.c:290
+#, c-format
+msgid ""
+"The last gc run reported the following. Please correct the root cause\n"
+"and remove %s.\n"
+"Automatic cleanup will not be performed until the file is removed.\n"
+"\n"
+"%s"
+msgstr ""
+"При последното изпълнение на „git gc“ бе докладвана грешка. Коригирайте "
+"причината за\n"
+"нея и изтрийте „%s“.\n"
+"Автоматичното изчистване на боклука няма да работи, преди да изтриете "
+"файла.\n"
+"\n"
+"%s"
+
+#: builtin/gc.c:327
 msgid "prune unreferenced objects"
 msgstr "окастряне на обектите, към които нищо не сочи"
 
-#: builtin/gc.c:283
+#: builtin/gc.c:329
 msgid "be more thorough (increased runtime)"
 msgstr "изчерпателно търсене на боклука (за сметка на повече време работа)"
 
-#: builtin/gc.c:284
+#: builtin/gc.c:330
 msgid "enable auto-gc mode"
 msgstr "включване на автоматичното събиране на боклука (auto-gc)"
 
-#: builtin/gc.c:285
+#: builtin/gc.c:331
 msgid "force running gc even if there may be another gc running"
 msgstr ""
 "изрично стартиране на събирането на боклука, дори и ако вече работи друго "
 "събиране"
 
-#: builtin/gc.c:327
+#: builtin/gc.c:373
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 "Автоматично пакетиране на заден фон на хранилището за по-добра "
 "производителност.\n"
 
-#: builtin/gc.c:329
+#: builtin/gc.c:375
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "Автоматично пакетиране на хранилището за по-добра производителност.\n"
 
-#: builtin/gc.c:330
+#: builtin/gc.c:376
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr ""
 "Погледнете ръководството за повече информация как да изпълните „git help "
 "gc“.\n"
 
-#: builtin/gc.c:348
+#: builtin/gc.c:397
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5973,7 +6515,7 @@
 "процеса: %<PRIuMAX> (ако сте сигурни, че това не е вярно, това използвайте\n"
 "опцията „--force“)"
 
-#: builtin/gc.c:376
+#: builtin/gc.c:441
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -6010,214 +6552,210 @@
 msgid "cannot open '%s'"
 msgstr "„%s“ не може да бъде отворен"
 
-#: builtin/grep.c:638
+#: builtin/grep.c:633
 msgid "search in index instead of in the work tree"
 msgstr "търсене в индекса, а не в работното дърво"
 
-#: builtin/grep.c:640
+#: builtin/grep.c:635
 msgid "find in contents not managed by git"
 msgstr "търсене и във файловете, които не са под управлението на git"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:637
 msgid "search in both tracked and untracked files"
 msgstr "търсене и в следените, и в неследените файлове"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:639
 msgid "ignore files specified via '.gitignore'"
 msgstr "игнориране на файловете указани в „.gitignore“"
 
-#: builtin/grep.c:647
+#: builtin/grep.c:642
 msgid "show non-matching lines"
 msgstr "извеждане на редовете, които не съвпадат"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:644
 msgid "case insensitive matching"
 msgstr "без значение на регистъра на буквите (главни/малки)"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:646
 msgid "match patterns only at word boundaries"
 msgstr "напасване на шаблоните само по границите на думите"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:648
 msgid "process binary files as text"
 msgstr "обработване на двоичните файлове като текстови"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:650
 msgid "don't match patterns in binary files"
 msgstr "прескачане на двоичните файлове"
 
-#: builtin/grep.c:658
+#: builtin/grep.c:653
 msgid "process binary files with textconv filters"
 msgstr ""
 "обработване на двоичните файлове чрез филтри за преобразуване към текст"
 
-#: builtin/grep.c:660
+#: builtin/grep.c:655
 msgid "descend at most <depth> levels"
 msgstr "навлизане максимално на тази ДЪЛБОЧИНА в дървото"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:659
 msgid "use extended POSIX regular expressions"
 msgstr "разширени регулярни изрази по POSIX"
 
-#: builtin/grep.c:667
+#: builtin/grep.c:662
 msgid "use basic POSIX regular expressions (default)"
 msgstr "основни регулярни изрази по POSIX (стандартно)"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:665
 msgid "interpret patterns as fixed strings"
 msgstr "шаблоните са дословни низове"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:668
 msgid "use Perl-compatible regular expressions"
 msgstr "регулярни изрази на Perl"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:671
 msgid "show line numbers"
 msgstr "извеждане на номерата на редовете"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:672
 msgid "don't show filenames"
 msgstr "без извеждане на имената на файловете"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:673
 msgid "show filenames"
 msgstr "извеждане на имената на файловете"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:675
 msgid "show filenames relative to top directory"
 msgstr ""
 "извеждане на относителните имена на файловете спрямо основната директория на "
 "хранилището"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:677
 msgid "show only filenames instead of matching lines"
 msgstr "извеждане само на имената на файловете без напасващите редове"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:679
 msgid "synonym for --files-with-matches"
 msgstr "синоним на „--files-with-matches“"
 
-#: builtin/grep.c:687
+#: builtin/grep.c:682
 msgid "show only the names of files without match"
 msgstr ""
 "извеждане само на имената на файловете, които не съдържат ред, напасващ на "
 "шаблона"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:684
 msgid "print NUL after filenames"
 msgstr "извеждане на нулевия знак „NUL“ след всяко име на файл"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:686
 msgid "show the number of matches instead of matching lines"
 msgstr "извеждане на броя на съвпаденията вместо напасващите редове"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:687
 msgid "highlight matches"
 msgstr "оцветяване на напасванията"
 
-#: builtin/grep.c:694
+#: builtin/grep.c:689
 msgid "print empty line between matches from different files"
 msgstr "извеждане на празен ред между напасванията от различни файлове"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:691
 msgid "show filename only once above matches from same file"
 msgstr ""
 "извеждане на името на файла само веднъж за всички напасвания от този файл"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:694
 msgid "show <n> context lines before and after matches"
 msgstr "извеждане на такъв БРОЙ редове преди и след напасванията"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:697
 msgid "show <n> context lines before matches"
 msgstr "извеждане на такъв БРОЙ редове преди напасванията"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:699
 msgid "show <n> context lines after matches"
 msgstr "извеждане на такъв БРОЙ редове след напасванията"
 
-#: builtin/grep.c:705
+#: builtin/grep.c:700
 msgid "shortcut for -C NUM"
 msgstr "синоним на „-C БРОЙ“"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:703
 msgid "show a line with the function name before matches"
 msgstr "извеждане на ред с името на функцията, в която е напаснат шаблона"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:705
 msgid "show the surrounding function"
 msgstr "извеждане на обхващащата функция"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:708
 msgid "read patterns from file"
 msgstr "изчитане на шаблоните от файл"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:710
 msgid "match <pattern>"
 msgstr "напасване на ШАБЛОН"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:712
 msgid "combine patterns specified with -e"
 msgstr "комбиниране на шаблоните указани с опцията „-e“"
 
-#: builtin/grep.c:729
+#: builtin/grep.c:724
 msgid "indicate hit with exit status without output"
 msgstr ""
 "без извеждане на стандартния изход. Изходният код указва наличието на "
 "напасване"
 
-#: builtin/grep.c:731
+#: builtin/grep.c:726
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "извеждане на редове само от файловете, които напасват на всички шаблони"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:728
 msgid "show parse tree for grep expression"
 msgstr "извеждане на дървото за анализ на регулярния израз"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "pager"
 msgstr "програма за преглед по страници"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "show matching files in the pager"
 msgstr "извеждане на съвпадащите файлове в програма за преглед по страници"
 
-#: builtin/grep.c:740
+#: builtin/grep.c:735
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr ""
 "позволяване на стартирането на grep(1) (текущият компилат пренебрегва тази "
 "опция)"
 
-#: builtin/grep.c:741 builtin/show-ref.c:189
-msgid "show usage"
-msgstr "извеждане на начина на употреба на командата"
-
-#: builtin/grep.c:808
+#: builtin/grep.c:793
 msgid "no pattern given."
 msgstr "липсва шаблон."
 
-#: builtin/grep.c:866
+#: builtin/grep.c:851
 msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
 "опцията „--open-files-in-pager“ е съвместима само с търсене в работното дърво"
 
-#: builtin/grep.c:892
+#: builtin/grep.c:877
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "опциите „--cached“ и „--untracked“ са несъвместими с „--no-index“."
 
-#: builtin/grep.c:897
+#: builtin/grep.c:882
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr ""
 "опциите „--cached“ и „--untracked“ са несъвместими с търсене във версии."
 
-#: builtin/grep.c:900
+#: builtin/grep.c:885
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 "опциите „--(no-)exclude-standard“ са несъвместими с търсене по следени "
 "файлове."
 
-#: builtin/grep.c:908
+#: builtin/grep.c:893
 msgid "both --cached and trees are given."
 msgstr "опцията „--cached“ е несъвместима със задаване на дърво."
 
@@ -6229,12 +6767,11 @@
 "git hash-object [-t ВИД] [-w] [--path=ФАЙЛ | --no-filters] [--stdin] [--] "
 "ФАЙЛ…"
 
-# FIXME - list of paths or path...
 #: builtin/hash-object.c:81
-msgid "git hash-object  --stdin-paths < <list-of-paths>"
-msgstr "git hash-object  --stdin-paths < ПЪТ…"
+msgid "git hash-object  --stdin-paths"
+msgstr "git hash-object --stdin-paths"
 
-#: builtin/hash-object.c:92 builtin/tag.c:612
+#: builtin/hash-object.c:92
 msgid "type"
 msgstr "ВИД"
 
@@ -6307,12 +6844,12 @@
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "Прекалено стара версия на „emacsclient“ — %d (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
+#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "неуспешно изпълнение на „%s“: %s"
 
-#: builtin/help.c:215
+#: builtin/help.c:208
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -6321,7 +6858,7 @@
 "„%s“: път към неподдържана програма за преглед на\n"
 " ръководството. Вместо нея пробвайте „man.<tool>.cmd“."
 
-#: builtin/help.c:227
+#: builtin/help.c:220
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -6330,194 +6867,194 @@
 "„%s“: команда за поддържана програма за преглед на\n"
 " ръководството. Вместо нея пробвайте „man.<tool>.path“."
 
-#: builtin/help.c:354
+#: builtin/help.c:337
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "„%s“: непозната програма за преглед на ръководството."
 
-#: builtin/help.c:371
+#: builtin/help.c:354
 msgid "no man viewer handled the request"
 msgstr "никоя програма за преглед на ръководство не успя да обработи заявката"
 
-#: builtin/help.c:379
+#: builtin/help.c:362
 msgid "no info viewer handled the request"
 msgstr ""
 "никоя програма за преглед на информационните страници не успя да обработи "
 "заявката"
 
-#: builtin/help.c:428
+#: builtin/help.c:411
 msgid "Defining attributes per path"
 msgstr "Указване на атрибути към път"
 
-#: builtin/help.c:429
+#: builtin/help.c:412
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Ежедневието в Git в рамките на 20-ина команди"
 
-#: builtin/help.c:430
+#: builtin/help.c:413
 msgid "A Git glossary"
 msgstr "Речник с термините на Git"
 
-#: builtin/help.c:431
+#: builtin/help.c:414
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Указване на неследени файлове, които да бъдат нарочно пренебрегвани"
 
-#: builtin/help.c:432
+#: builtin/help.c:415
 msgid "Defining submodule properties"
 msgstr "Дефиниране на свойствата на подмодулите"
 
-#: builtin/help.c:433
+#: builtin/help.c:416
 msgid "Specifying revisions and ranges for Git"
 msgstr "Указване на версии и интервали в Git"
 
-#: builtin/help.c:434
+#: builtin/help.c:417
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Въвеждащ урок за Git (версии поне 1.5.1)"
 
-#: builtin/help.c:435
+#: builtin/help.c:418
 msgid "An overview of recommended workflows with Git"
 msgstr "Общ преглед на препоръчваните начини за работа с Git"
 
-#: builtin/help.c:447
+#: builtin/help.c:430
 msgid "The common Git guides are:\n"
 msgstr "Популярните пътеводители в Git са:\n"
 
-#: builtin/help.c:468 builtin/help.c:485
+#: builtin/help.c:451 builtin/help.c:468
 #, c-format
 msgid "usage: %s%s"
 msgstr "употреба: %s%s"
 
-#: builtin/help.c:501
+#: builtin/help.c:484
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "„git %s“ е синоним на „%s“"
 
 # FIXME merge with next?
-#: builtin/index-pack.c:151
+#: builtin/index-pack.c:152
 #, c-format
 msgid "unable to open %s"
 msgstr "обектът „%s“ не може да бъде отворен"
 
-#: builtin/index-pack.c:201
+#: builtin/index-pack.c:202
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "неправилен вид на обекта „%s“"
 
-#: builtin/index-pack.c:221
+#: builtin/index-pack.c:222
 #, c-format
 msgid "did not receive expected object %s"
 msgstr "очакваният обект „%s“ не бе получен"
 
-#: builtin/index-pack.c:224
+#: builtin/index-pack.c:225
 #, c-format
 msgid "object %s: expected type %s, found %s"
 msgstr "неправилен вид на обекта „%s“: очакваше се „%s“, а бе получен „%s“"
 
-#: builtin/index-pack.c:266
+#: builtin/index-pack.c:267
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "не може да се запълни %d байт"
 msgstr[1] "не може да се запълнят %d байта"
 
-#: builtin/index-pack.c:276
+#: builtin/index-pack.c:277
 msgid "early EOF"
 msgstr "неочакван край на файл"
 
-#: builtin/index-pack.c:277
+#: builtin/index-pack.c:278
 msgid "read error on input"
 msgstr "грешка при четене на входните данни"
 
-#: builtin/index-pack.c:289
+#: builtin/index-pack.c:290
 msgid "used more bytes than were available"
 msgstr "използвани са повече от наличните байтове"
 
-#: builtin/index-pack.c:296
+#: builtin/index-pack.c:297
 msgid "pack too large for current definition of off_t"
 msgstr "пакетният файл е прекалено голям за текущата стойност на типа „off_t“"
 
-#: builtin/index-pack.c:312
+#: builtin/index-pack.c:313
 #, c-format
 msgid "unable to create '%s'"
 msgstr "пакетният файл „%s“ не може да бъде създаден"
 
-#: builtin/index-pack.c:317
+#: builtin/index-pack.c:318
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "пакетният файл „%s“ не може да бъде отворен"
 
-#: builtin/index-pack.c:331
+#: builtin/index-pack.c:332
 msgid "pack signature mismatch"
 msgstr "несъответствие в подписа към пакетния файл"
 
-#: builtin/index-pack.c:333
+#: builtin/index-pack.c:334
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "не се поддържа пакетиране вeрсия „%<PRIu32>“"
 
-#: builtin/index-pack.c:351
+#: builtin/index-pack.c:352
 #, c-format
 msgid "pack has bad object at offset %lu: %s"
 msgstr "повреден обект в пакетния файл при отместване %lu: %s"
 
-#: builtin/index-pack.c:472
+#: builtin/index-pack.c:473
 #, c-format
 msgid "inflate returned %d"
 msgstr "декомпресирането с „inflate“ върна %d"
 
-#: builtin/index-pack.c:521
+#: builtin/index-pack.c:522
 msgid "offset value overflow for delta base object"
 msgstr "стойността на отместването за обекта-разлика води до препълване"
 
-#: builtin/index-pack.c:529
+#: builtin/index-pack.c:530
 msgid "delta base offset is out of bound"
 msgstr "стойността на отместването за обекта-разлика е извън диапазона"
 
-#: builtin/index-pack.c:537
+#: builtin/index-pack.c:538
 #, c-format
 msgid "unknown object type %d"
 msgstr "непознат вид обект %d"
 
-#: builtin/index-pack.c:568
+#: builtin/index-pack.c:569
 msgid "cannot pread pack file"
 msgstr "пакетният файл не може да бъде прочетен"
 
-#: builtin/index-pack.c:570
+#: builtin/index-pack.c:571
 #, c-format
 msgid "premature end of pack file, %lu byte missing"
 msgid_plural "premature end of pack file, %lu bytes missing"
 msgstr[0] "неочакван край на файл, липсва %lu байт"
 msgstr[1] "неочакван край на файл, липсват %lu байта"
 
-#: builtin/index-pack.c:596
+#: builtin/index-pack.c:597
 msgid "serious inflate inconsistency"
 msgstr "сериозна грешка при декомпресиране с „inflate“"
 
-#: builtin/index-pack.c:742 builtin/index-pack.c:748 builtin/index-pack.c:771
-#: builtin/index-pack.c:805 builtin/index-pack.c:814
+#: builtin/index-pack.c:743 builtin/index-pack.c:749 builtin/index-pack.c:772
+#: builtin/index-pack.c:806 builtin/index-pack.c:815
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr ""
 "СЪВПАДЕНИЕ НА СТОЙНОСТИТЕ ЗА СУМИТЕ ЗА SHA1: „%s“ НА ДВА РАЗЛИЧНИ ОБЕКТА!"
 
 # FIXME merge with next?
-#: builtin/index-pack.c:745 builtin/pack-objects.c:162
+#: builtin/index-pack.c:746 builtin/pack-objects.c:162
 #: builtin/pack-objects.c:254
 #, c-format
 msgid "unable to read %s"
 msgstr "обектът „%s“ не може да бъде прочетен"
 
-#: builtin/index-pack.c:811
+#: builtin/index-pack.c:812
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "съществуващият обект „%s“ не може да бъде прочетен"
 
-#: builtin/index-pack.c:825
+#: builtin/index-pack.c:826
 #, c-format
 msgid "invalid blob object %s"
 msgstr "неправилен обект BLOB „%s“"
 
 # FIXME perhaps invalid object
-#: builtin/index-pack.c:839
+#: builtin/index-pack.c:840
 #, c-format
 msgid "invalid %s"
 msgstr "неправилен обект „%s“"
@@ -6644,7 +7181,7 @@
 msgid "invalid number of threads specified (%d)"
 msgstr "зададен е неправилен брой нишки: %d"
 
-#: builtin/index-pack.c:1479 builtin/index-pack.c:1658
+#: builtin/index-pack.c:1479 builtin/index-pack.c:1663
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "липсва поддръжка за нишки. „%s“ ще се пренебрегне"
@@ -6674,114 +7211,86 @@
 msgstr[1] "дължината на веригата е %d: %lu обекта"
 
 # FIXME it is not the cwd it is the previous cwd
-#: builtin/index-pack.c:1622
+#: builtin/index-pack.c:1623
 msgid "Cannot come back to cwd"
 msgstr "Процесът не може да се върне към предишната работна директория"
 
-#: builtin/index-pack.c:1670 builtin/index-pack.c:1673
-#: builtin/index-pack.c:1685 builtin/index-pack.c:1689
+#: builtin/index-pack.c:1675 builtin/index-pack.c:1678
+#: builtin/index-pack.c:1690 builtin/index-pack.c:1694
 #, c-format
 msgid "bad %s"
 msgstr "неправилна стойност „%s“"
 
-#: builtin/index-pack.c:1703
+#: builtin/index-pack.c:1708
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "опцията „--fix-thin“ изисква „--stdin“"
 
-#: builtin/index-pack.c:1707 builtin/index-pack.c:1716
+#: builtin/index-pack.c:1712 builtin/index-pack.c:1721
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "името на пакетния файл „%s“ не завършва на „.pack“"
 
-#: builtin/index-pack.c:1724
+#: builtin/index-pack.c:1729
 msgid "--verify with no packfile name given"
 msgstr "опцията „--verify“ изисква име на пакетен файл"
 
-#: builtin/init-db.c:35
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr "Не могат да се дадат права за запис в директорията „%s“ на групата"
-
-# FIXME - bad wording insanely
-#: builtin/init-db.c:62
-#, c-format
-msgid "insanely long template name %s"
-msgstr "твърде дълго име на шаблон: „%s“"
-
-#: builtin/init-db.c:67
+#: builtin/init-db.c:55
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "не може да се получи информация чрез „stat“ за директорията „%s“"
 
-#: builtin/init-db.c:73
+#: builtin/init-db.c:61
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "не може да се получи информация чрез „stat“ за шаблона „%s“"
 
-#: builtin/init-db.c:80
+#: builtin/init-db.c:66
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "директорията „%s“ не може да бъде отворена"
 
-#: builtin/init-db.c:97
+#: builtin/init-db.c:77
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "връзката „%s“ не може да бъде прочетена"
 
-# FIXME - bad wording insanely
-#: builtin/init-db.c:99
-#, c-format
-msgid "insanely long symlink %s"
-msgstr "твърде дълго име на символна връзка: „%s“"
-
-#: builtin/init-db.c:102
+#: builtin/init-db.c:79
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "не може да се създаде символна връзка „%s“ в „%s“"
 
-#: builtin/init-db.c:106
+#: builtin/init-db.c:85
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "„%s“ не може да се копира в „%s“"
 
-#: builtin/init-db.c:110
+#: builtin/init-db.c:89
 #, c-format
 msgid "ignoring template %s"
 msgstr "игнориране на шаблона „%s“"
 
-# FIXME bad word insanely
-#: builtin/init-db.c:136
-#, c-format
-msgid "insanely long template path %s"
-msgstr "твърде дълъг път към шаблон: „%s“"
-
-#: builtin/init-db.c:144
+#: builtin/init-db.c:118
 #, c-format
 msgid "templates not found %s"
 msgstr "директорията с шаблоните не е открита: „%s“"
 
-#: builtin/init-db.c:157
+#: builtin/init-db.c:131
 #, c-format
 msgid "not copying templates of a wrong format version %d from '%s'"
 msgstr ""
-"шаблоните с неправилен номер на формата %d няма да бъдат копирани от „%s“"
+"шаблоните с неправилен номер на форма̀та %d няма да бъдат копирани от „%s“"
 
-#: builtin/init-db.c:211
-#, c-format
-msgid "insane git directory %s"
-msgstr "твърде дълго име на директория на Git: „%s“"
-
-#: builtin/init-db.c:343 builtin/init-db.c:346
+#: builtin/init-db.c:309 builtin/init-db.c:312
 #, c-format
 msgid "%s already exists"
 msgstr "Директорията „%s“ вече съществува"
 
-#: builtin/init-db.c:374
+#: builtin/init-db.c:340
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "файлове от вид %d не се поддържат"
 
-#: builtin/init-db.c:377
+#: builtin/init-db.c:343
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "„%s“ не може да се премести в „%s“"
@@ -6789,24 +7298,24 @@
 #. TRANSLATORS: The first '%s' is either "Reinitialized
 #. existing" or "Initialized empty", the second " shared" or
 #. "", and the last '%s%s' is the verbatim directory name.
-#: builtin/init-db.c:433
+#: builtin/init-db.c:399
 #, c-format
 msgid "%s%s Git repository in %s%s\n"
 msgstr "%s%s хранилище на Git в „%s%s“\n"
 
-#: builtin/init-db.c:434
+#: builtin/init-db.c:400
 msgid "Reinitialized existing"
 msgstr "Наново инициализирано, съществуващо"
 
-#: builtin/init-db.c:434
+#: builtin/init-db.c:400
 msgid "Initialized empty"
 msgstr "Инициализирано празно"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:401
 msgid " shared"
 msgstr ", споделено"
 
-#: builtin/init-db.c:482
+#: builtin/init-db.c:448
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -6814,31 +7323,27 @@
 "git init [-q | --quiet] [--bare] [--template=ДИРЕКТОРИЯ_С_ШАБЛОНИ] [--"
 "shared[=ПРАВА]] [ДИРЕКТОРИЯ]"
 
-#: builtin/init-db.c:505
+#: builtin/init-db.c:471
 msgid "permissions"
 msgstr "права"
 
-#: builtin/init-db.c:506
+#: builtin/init-db.c:472
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr ""
 "указване, че хранилището на Git ще бъде споделено от повече от един "
 "потребител"
 
-#: builtin/init-db.c:508 builtin/prune-packed.c:57 builtin/repack.c:171
-msgid "be quiet"
-msgstr "без извеждане на информация"
-
-#: builtin/init-db.c:540 builtin/init-db.c:545
+#: builtin/init-db.c:506 builtin/init-db.c:511
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "директорията „%s“ не може да бъде създадена"
 
-#: builtin/init-db.c:549
+#: builtin/init-db.c:515
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "не може да се влезе в директорията „%s“"
 
-#: builtin/init-db.c:570
+#: builtin/init-db.c:536
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6847,7 +7352,7 @@
 "%s (или --work-tree=ДИРЕКТОРИЯ) изисква указването на %s (или --git-"
 "dir=ДИРЕКТОРИЯ)"
 
-#: builtin/init-db.c:598
+#: builtin/init-db.c:564
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Работното дърво в „%s“ е недостъпно"
@@ -6872,291 +7377,290 @@
 msgid "trailer(s) to add"
 msgstr "епилог(зи) за добавяне"
 
-#: builtin/log.c:41
+#: builtin/log.c:43
 msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
 msgstr "git log [ОПЦИЯ…] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] ПЪТ…]"
 
-#: builtin/log.c:42
+#: builtin/log.c:44
 msgid "git show [<options>] <object>..."
 msgstr "git show [ОПЦИЯ…] ОБЕКТ…"
 
-#: builtin/log.c:81
+#: builtin/log.c:83
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "неправилна опция „--decorate“: %s"
 
-#: builtin/log.c:127
+#: builtin/log.c:131
 msgid "suppress diff output"
 msgstr "без извеждане на разликите"
 
-#: builtin/log.c:128
+#: builtin/log.c:132
 msgid "show source"
 msgstr "извеждане на изходния код"
 
-#: builtin/log.c:129
+#: builtin/log.c:133
 msgid "Use mail map file"
 msgstr ""
 "Използване на файл за съответствията на имената и адресите на е-поща („."
 "mailmap“)"
 
-#: builtin/log.c:130
+#: builtin/log.c:134
 msgid "decorate options"
 msgstr "настройки на форма̀та на извежданата информация"
 
-#: builtin/log.c:133
+#: builtin/log.c:137
 msgid "Process line range n,m in file, counting from 1"
 msgstr ""
 "Обработване само на редовете във файла в интервала от n до m включително. "
 "Броенето започва от 1"
 
-#: builtin/log.c:229
+#: builtin/log.c:233
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Резултат: %d %s\n"
 
-#: builtin/log.c:458
+#: builtin/log.c:465
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: повреден файл"
 
-#: builtin/log.c:472 builtin/log.c:564
+#: builtin/log.c:479 builtin/log.c:572
 #, c-format
 msgid "Could not read object %s"
 msgstr "Обектът не може да бъде прочетен: %s"
 
-#: builtin/log.c:588
+#: builtin/log.c:596
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Неизвестен вид: %d"
 
-#: builtin/log.c:689
+#: builtin/log.c:714
 msgid "format.headers without value"
 msgstr "не е зададена стойност на „format.headers“"
 
-#: builtin/log.c:773
+#: builtin/log.c:798
 msgid "name of output directory is too long"
 msgstr "прекалено дълго име на директорията за изходната информация"
 
-#: builtin/log.c:789
+#: builtin/log.c:813
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Файлът-кръпка „%s“ не може да бъде отворен"
 
-#: builtin/log.c:803
+#: builtin/log.c:827
 msgid "Need exactly one range."
 msgstr "Трябва да зададете точно един диапазон."
 
-#: builtin/log.c:813
+#: builtin/log.c:837
 msgid "Not a range."
 msgstr "Не е диапазон."
 
-#: builtin/log.c:919
+#: builtin/log.c:943
 msgid "Cover letter needs email format"
 msgstr "Придружаващото писмо трябва да е форматирано като е-писмо"
 
 # FIXME bad wording insanely
-#: builtin/log.c:998
+#: builtin/log.c:1022
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "неправилен формат на заглавната част за отговор „in-reply-to“: %s"
 
-#: builtin/log.c:1026
+#: builtin/log.c:1050
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [ОПЦИЯ…] [ОТ | ДИАПАЗОН_НА_ВЕРСИИТЕ]"
 
 # FIXME message WTF why ask it
-#: builtin/log.c:1071
+#: builtin/log.c:1095
 msgid "Two output directories?"
 msgstr "Можете да укажете максимум една директория за изход."
 
-#: builtin/log.c:1186
+#: builtin/log.c:1211
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "номерация „[PATCH n/m]“ дори и при единствена кръпка"
 
-#: builtin/log.c:1189
+#: builtin/log.c:1214
 msgid "use [PATCH] even with multiple patches"
 msgstr "номерация „[PATCH]“ дори и при множество кръпки"
 
-#: builtin/log.c:1193
+#: builtin/log.c:1218
 msgid "print patches to standard out"
 msgstr "извеждане на кръпките на стандартния изход"
 
-#: builtin/log.c:1195
+#: builtin/log.c:1220
 msgid "generate a cover letter"
 msgstr "създаване на придружаващо писмо"
 
-#: builtin/log.c:1197
+#: builtin/log.c:1222
 msgid "use simple number sequence for output file names"
 msgstr "проста числова последователност за имената на файловете-кръпки"
 
-#: builtin/log.c:1198
+#: builtin/log.c:1223
 msgid "sfx"
 msgstr "ЗНАЦИ"
 
-#: builtin/log.c:1199
+#: builtin/log.c:1224
 msgid "use <sfx> instead of '.patch'"
 msgstr "използване на тези ЗНАЦИ за суфикс вместо „.patch“"
 
-#: builtin/log.c:1201
+#: builtin/log.c:1226
 msgid "start numbering patches at <n> instead of 1"
 msgstr "номерирането на кръпките да започва от този БРОЙ, а не с 1"
 
-#: builtin/log.c:1203
+#: builtin/log.c:1228
 msgid "mark the series as Nth re-roll"
 msgstr "отбелязване, че това е N-тата поредна редакция на поредицата от кръпки"
 
-#: builtin/log.c:1205
+#: builtin/log.c:1230
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "Използване на този „[ПРЕФИКС]“ вместо „[PATCH]“"
 
-#: builtin/log.c:1208
+#: builtin/log.c:1233
 msgid "store resulting files in <dir>"
 msgstr "запазване на изходните файлове в тази ДИРЕКТОРИЯ"
 
-#: builtin/log.c:1211
+#: builtin/log.c:1236
 msgid "don't strip/add [PATCH]"
 msgstr "без добавяне/махане на префикса „[PATCH]“"
 
-#: builtin/log.c:1214
+#: builtin/log.c:1239
 msgid "don't output binary diffs"
 msgstr "без извеждане на разлики между двоични файлове"
 
-#: builtin/log.c:1216
+#: builtin/log.c:1241
+msgid "output all-zero hash in From header"
+msgstr "в заглавната част „From:“ (от) хешът да е само от нули"
+
+#: builtin/log.c:1243
 msgid "don't include a patch matching a commit upstream"
 msgstr "да не се включват кръпки, които присъстват в следения клон"
 
-#: builtin/log.c:1218
+#: builtin/log.c:1245
 msgid "show patch format instead of default (patch + stat)"
 msgstr ""
 "извеждане във формат за кръпки, а на в стандартния (кръпка и статистика)"
 
-#: builtin/log.c:1220
+#: builtin/log.c:1247
 msgid "Messaging"
 msgstr "Опции при изпращане"
 
-#: builtin/log.c:1221
+#: builtin/log.c:1248
 msgid "header"
 msgstr "ЗАГЛАВНА_ЧАСТ"
 
-#: builtin/log.c:1222
+#: builtin/log.c:1249
 msgid "add email header"
 msgstr "добавяне на тази ЗАГЛАВНА_ЧАСТ"
 
-#: builtin/log.c:1223 builtin/log.c:1225
+#: builtin/log.c:1250 builtin/log.c:1252
 msgid "email"
 msgstr "Е-ПОЩА"
 
-#: builtin/log.c:1223
+#: builtin/log.c:1250
 msgid "add To: header"
 msgstr "добавяне на заглавна част „To:“ (до)"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1252
 msgid "add Cc: header"
 msgstr "добавяне на заглавна част „Cc:“ (и до)"
 
-#: builtin/log.c:1227
+#: builtin/log.c:1254
 msgid "ident"
 msgstr "ИДЕНТИЧНОСТ"
 
-#: builtin/log.c:1228
+#: builtin/log.c:1255
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
-"задаване на адреса в заглавната част „From“ да е тази ИДЕНТИЧНОСТ. Ако не е "
-"зададена такава, се взима адреса на подаващия"
+"задаване на адреса в заглавната част „From“ (от) да е тази ИДЕНТИЧНОСТ. Ако "
+"не е зададена такава, се взима адреса на подаващия"
 
-#: builtin/log.c:1230
+#: builtin/log.c:1257
 msgid "message-id"
 msgstr "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
 
-#: builtin/log.c:1231
+#: builtin/log.c:1258
 msgid "make first mail a reply to <message-id>"
 msgstr ""
 "първото съобщение да е в отговор на е-писмото с този "
 "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
 
-#: builtin/log.c:1232 builtin/log.c:1235
+#: builtin/log.c:1259 builtin/log.c:1262
 msgid "boundary"
 msgstr "граница"
 
-#: builtin/log.c:1233
+#: builtin/log.c:1260
 msgid "attach the patch"
 msgstr "прикрепяне на кръпката"
 
-#: builtin/log.c:1236
+#: builtin/log.c:1263
 msgid "inline the patch"
 msgstr "включване на кръпката в текста на писмата"
 
-#: builtin/log.c:1240
+#: builtin/log.c:1267
 msgid "enable message threading, styles: shallow, deep"
 msgstr ""
 "използване на нишки за съобщенията. Стилът е „shallow“ (плитък) или "
 "„deep“ (дълбок)"
 
-#: builtin/log.c:1242
+#: builtin/log.c:1269
 msgid "signature"
 msgstr "подпис"
 
-#: builtin/log.c:1243
+#: builtin/log.c:1270
 msgid "add a signature"
 msgstr "добавяне на поле за подпис"
 
-#: builtin/log.c:1245
+#: builtin/log.c:1272
 msgid "add a signature from a file"
 msgstr "добавяне на подпис от файл"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1273
 msgid "don't print the patch filenames"
 msgstr "без извеждане на имената на кръпките"
 
-#: builtin/log.c:1320
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "грешна идентичност: %s"
-
-#: builtin/log.c:1335
+#: builtin/log.c:1362
 msgid "-n and -k are mutually exclusive."
 msgstr "опциите „-n“ и „-k“ са несъвместими."
 
-#: builtin/log.c:1337
+#: builtin/log.c:1364
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "опциите „--subject-prefix“ и „-k“ са несъвместими."
 
-#: builtin/log.c:1345
+#: builtin/log.c:1372
 msgid "--name-only does not make sense"
 msgstr "опцията „--name-only“ е несъвместима с генерирането на кръпки"
 
-#: builtin/log.c:1347
+#: builtin/log.c:1374
 msgid "--name-status does not make sense"
 msgstr "опцията „--name-status“ е несъвместима с генерирането на кръпки"
 
-#: builtin/log.c:1349
+#: builtin/log.c:1376
 msgid "--check does not make sense"
 msgstr "опцията „--check“ е несъвместима с генерирането на кръпки"
 
-#: builtin/log.c:1372
+#: builtin/log.c:1401
 msgid "standard output, or directory, which one?"
 msgstr ""
 "изходът може да или стандартният, или да е в директория, но не и двете."
 
-#: builtin/log.c:1374
+#: builtin/log.c:1403
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Директорията „%s“ не може да бъде създадена"
 
-#: builtin/log.c:1472
+#: builtin/log.c:1500
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "файлът „%s“ с подпис не може да бъде прочетен"
 
-#: builtin/log.c:1535
+#: builtin/log.c:1563
 msgid "Failed to create output files"
 msgstr "Изходните файлове не могат да бъдат създадени"
 
-#: builtin/log.c:1583
+#: builtin/log.c:1611
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [ОТДАЛЕЧЕН_КЛОН [ВРЪХ [ПРЕДЕЛ]]]"
 
-#: builtin/log.c:1637
+#: builtin/log.c:1665
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -7164,7 +7668,7 @@
 "Следеният отдалечен клон не бе открит, затова изрично задайте "
 "ОТДАЛЕЧЕН_КЛОН.\n"
 
-#: builtin/log.c:1648 builtin/log.c:1650 builtin/log.c:1662
+#: builtin/log.c:1676 builtin/log.c:1678 builtin/log.c:1690
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Непознато подаване „%s“"
@@ -7268,35 +7772,35 @@
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]"
 
-#: builtin/ls-tree.c:127
+#: builtin/ls-tree.c:128
 msgid "only show trees"
 msgstr "извеждане само на дървета"
 
-#: builtin/ls-tree.c:129
+#: builtin/ls-tree.c:130
 msgid "recurse into subtrees"
 msgstr "рекурсивно обхождане поддърветата"
 
-#: builtin/ls-tree.c:131
+#: builtin/ls-tree.c:132
 msgid "show trees when recursing"
 msgstr "извеждане на дърветата при рекурсивното обхождане"
 
-#: builtin/ls-tree.c:134
+#: builtin/ls-tree.c:135
 msgid "terminate entries with NUL byte"
 msgstr "разделяне на обектите с нулевия знак „NUL“"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:136
 msgid "include object size"
 msgstr "извеждане на размера на обекта"
 
-#: builtin/ls-tree.c:137 builtin/ls-tree.c:139
+#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
 msgid "list only filenames"
 msgstr "извеждане само имената на файловете"
 
-#: builtin/ls-tree.c:142
+#: builtin/ls-tree.c:143
 msgid "use full path names"
 msgstr "използване на пълните имена на пътищата"
 
-#: builtin/ls-tree.c:144
+#: builtin/ls-tree.c:145
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr ""
 "извеждане на цялото дърво, не само на текущата директория (включва опцията "
@@ -7334,33 +7838,33 @@
 msgid "Available custom strategies are:"
 msgstr "Допълнителните стратегии са:"
 
-#: builtin/merge.c:193
+#: builtin/merge.c:193 builtin/pull.c:119
 msgid "do not show a diffstat at the end of the merge"
 msgstr "без извеждане на статистиката след завършване на сливане"
 
-#: builtin/merge.c:196
+#: builtin/merge.c:196 builtin/pull.c:122
 msgid "show a diffstat at the end of the merge"
 msgstr "извеждане на статистиката след завършване на сливане"
 
-#: builtin/merge.c:197
+#: builtin/merge.c:197 builtin/pull.c:125
 msgid "(synonym to --stat)"
 msgstr "(синоним на „--stat“)"
 
-#: builtin/merge.c:199
+#: builtin/merge.c:199 builtin/pull.c:128
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "добавяне (на максимум такъв БРОЙ) записи от съкратения журнал в съобщението "
 "за подаване"
 
-#: builtin/merge.c:202
+#: builtin/merge.c:202 builtin/pull.c:131
 msgid "create a single commit instead of doing a merge"
 msgstr "създаване на едно подаване вместо извършване на сливане"
 
-#: builtin/merge.c:204
+#: builtin/merge.c:204 builtin/pull.c:134
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "извършване на подаване при успешно сливане (стандартно действие)"
 
-#: builtin/merge.c:206
+#: builtin/merge.c:206 builtin/pull.c:137
 msgid "edit message before committing"
 msgstr "редактиране на съобщението преди подаване"
 
@@ -7368,7 +7872,7 @@
 msgid "allow fast-forward (default)"
 msgstr "позволяване на тривиално сливане (стандартно действие)"
 
-#: builtin/merge.c:209
+#: builtin/merge.c:209 builtin/pull.c:143
 msgid "abort if fast-forward is not possible"
 msgstr "преустановяване, ако сливането не е тривиално"
 
@@ -7376,19 +7880,20 @@
 msgid "Verify that the named commit has a valid GPG signature"
 msgstr "Проверка, че именуваното подаване е с правилен подпис на GPG"
 
-#: builtin/merge.c:214 builtin/notes.c:753 builtin/revert.c:89
+#: builtin/merge.c:214 builtin/notes.c:767 builtin/pull.c:148
+#: builtin/revert.c:89
 msgid "strategy"
 msgstr "стратегия"
 
-#: builtin/merge.c:215
+#: builtin/merge.c:215 builtin/pull.c:149
 msgid "merge strategy to use"
 msgstr "стратегия за сливане, която да се ползва"
 
-#: builtin/merge.c:216
+#: builtin/merge.c:216 builtin/pull.c:152
 msgid "option=value"
 msgstr "опция=стойност"
 
-#: builtin/merge.c:217
+#: builtin/merge.c:217 builtin/pull.c:153
 msgid "option for selected merge strategy"
 msgstr "опция за избраната стратегия за сливане"
 
@@ -7426,6 +7931,12 @@
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Подаване със смачкване — указателят „HEAD“ няма да бъде обновен\n"
 
+#: builtin/merge.c:344 builtin/merge.c:763 builtin/merge.c:975
+#: builtin/merge.c:988
+#, c-format
+msgid "Could not write to '%s'"
+msgstr "„%s“ не може да бъде записан"
+
 #: builtin/merge.c:372
 msgid "Writing SQUASH_MSG"
 msgstr "Записване на съобщението за смачкване SQUASH_MSG"
@@ -7450,10 +7961,6 @@
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Неправилен низ за настройката „branch.%s.mergeoptions“: „%s“"
 
-#: builtin/merge.c:632
-msgid "git write-tree failed to write a tree"
-msgstr "Командата „git write-tree“ не успя да запише обект-дърво"
-
 #: builtin/merge.c:656
 msgid "Not handling anything other than two heads merge."
 msgstr "Поддържа се само сливане на точно две истории."
@@ -7532,18 +8039,18 @@
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Никой клон не следи клона „%s“ от хранилището „%s“"
 
-#: builtin/merge.c:1081
+#: builtin/merge.c:1079
 #, c-format
 msgid "could not close '%s'"
 msgstr "„%s“ не може да се затвори"
 
-#: builtin/merge.c:1208
+#: builtin/merge.c:1206
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr ""
 "Не може да преустановите сливане, защото в момента не се извършва такова "
 "(липсва указател „MERGE_HEAD“)."
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1222
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7551,11 +8058,7 @@
 "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува).\n"
 "Подайте промените си, преди да започнете ново сливане."
 
-#: builtin/merge.c:1227 git-pull.sh:74
-msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува)."
-
-#: builtin/merge.c:1231
+#: builtin/merge.c:1229
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7563,58 +8066,58 @@
 "Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
 "съществува). Подайте промените си, преди да започнете ново сливане."
 
-#: builtin/merge.c:1234
+#: builtin/merge.c:1232
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr ""
 "Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
 "съществува)."
 
-#: builtin/merge.c:1243
+#: builtin/merge.c:1241
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Опцията „--squash“ е несъвместима с „--no-ff“."
 
-#: builtin/merge.c:1251
+#: builtin/merge.c:1249
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 "Не е указано подаване и настройката „merge.defaultToUpstream“ не е зададена."
 
-#: builtin/merge.c:1268
+#: builtin/merge.c:1266
 msgid "Squash commit into empty head not supported yet"
 msgstr "Подаване със смачкване във връх без история все още не се поддържа"
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1268
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 "Понеже върхът е без история, всички сливания са тривиални, не може да се "
 "извърши нетривиално сливане изисквано от опцията „--no-ff“"
 
-#: builtin/merge.c:1276
+#: builtin/merge.c:1274
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "„%s“ — не е нещо, което може да се слее"
 
-#: builtin/merge.c:1278
+#: builtin/merge.c:1276
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Можете да слеете точно едно подаване във връх без история"
 
-#: builtin/merge.c:1333
+#: builtin/merge.c:1331
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 "Подаването „%s“ е с недоверен подпис от GPG, който твърди, че е на „%s“."
 
-#: builtin/merge.c:1336
+#: builtin/merge.c:1334
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
 "Подаването „%s“ е с неправилен подпис от GPG, който твърди, че е на „%s“."
 
-#: builtin/merge.c:1339
+#: builtin/merge.c:1337
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Подаването „%s“ е без подпис от GPG."
 
-#: builtin/merge.c:1342
+#: builtin/merge.c:1340
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Подаването „%s“ е с коректен подпис от GPG на „%s“.\n"
@@ -7624,50 +8127,50 @@
 msgid "Updating %s..%s\n"
 msgstr "Обновяване „%s..%s“\n"
 
-#: builtin/merge.c:1462
+#: builtin/merge.c:1460
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Проба с най-тривиалното сливане в рамките на индекса…\n"
 
 # FIXME WTF message
-#: builtin/merge.c:1469
+#: builtin/merge.c:1467
 #, c-format
 msgid "Nope.\n"
 msgstr "Неуспешно сливане.\n"
 
-#: builtin/merge.c:1501
+#: builtin/merge.c:1499
 msgid "Not possible to fast-forward, aborting."
 msgstr ""
 "Не може да се извърши тривиално сливане, преустановяване на действието."
 
-#: builtin/merge.c:1524 builtin/merge.c:1603
+#: builtin/merge.c:1522 builtin/merge.c:1601
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Привеждане на дървото към първоначалното…\n"
 
-#: builtin/merge.c:1528
+#: builtin/merge.c:1526
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Пробване със стратегията за сливане „%s“…\n"
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1592
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Никоя стратегия за сливане не може да извърши сливането.\n"
 
-#: builtin/merge.c:1596
+#: builtin/merge.c:1594
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Неуспешно сливане със стратегия „%s“.\n"
 
-#: builtin/merge.c:1605
+#: builtin/merge.c:1603
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr ""
 "Ползва се стратегията „%s“, която ще подготви дървото за коригиране на "
 "ръка.\n"
 
-#: builtin/merge.c:1617
+#: builtin/merge.c:1615
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -7862,59 +8365,59 @@
 msgid "Renaming %s to %s\n"
 msgstr "Преименуване на „%s“ на „%s“\n"
 
-#: builtin/mv.c:256 builtin/remote.c:725 builtin/repack.c:361
+#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "неуспешно преименуване на „%s“"
 
-#: builtin/name-rev.c:255
+#: builtin/name-rev.c:251
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [ОПЦИЯ…] ПОДАВАНЕ…"
 
-#: builtin/name-rev.c:256
+#: builtin/name-rev.c:252
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [ОПЦИЯ…] --all"
 
-#: builtin/name-rev.c:257
+#: builtin/name-rev.c:253
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [ОПЦИЯ…] --stdin"
 
 # FIXME sha
-#: builtin/name-rev.c:309
+#: builtin/name-rev.c:305
 msgid "print only names (no SHA-1)"
 msgstr "извеждане само на имената (без сумите по SHA1)"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:306
 msgid "only use tags to name the commits"
 msgstr "използване само на етикетите за именуване на подаванията"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:308
 msgid "only use refs matching <pattern>"
 msgstr "използване само на шаблоните напасващи на ШАБЛОНа"
 
-#: builtin/name-rev.c:314
+#: builtin/name-rev.c:310
 msgid "list all commits reachable from all refs"
 msgstr ""
 "извеждане на всички подавания, които могат да бъдат достигнати от всички "
 "указатели"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:311
 msgid "read from stdin"
 msgstr "четене от стандартния вход"
 
-#: builtin/name-rev.c:316
+#: builtin/name-rev.c:312
 msgid "allow to print `undefined` names (default)"
 msgstr "да се извеждат и недефинираните имена (стандартна стойност на опцията)"
 
-#: builtin/name-rev.c:322
+#: builtin/name-rev.c:318
 msgid "dereference tags in the input (internal use)"
 msgstr "извеждане на идентификаторите на обекти-етикети (за вътрешни нужди)"
 
-#: builtin/notes.c:24
+#: builtin/notes.c:25
 msgid "git notes [--ref <notes-ref>] [list [<object>]]"
 msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] [list [ОБЕКТ]]"
 
-#: builtin/notes.c:25
+#: builtin/notes.c:26
 msgid ""
 "git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> "
 "| (-c | -C) <object>] [<object>]"
@@ -7922,12 +8425,12 @@
 "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] add [-f] [--allow-empty] [-m СЪОБЩЕНИЕ "
 "| -F ФАЙЛ | (-c | -C) ОБЕКТ] [ОБЕКТ]"
 
-#: builtin/notes.c:26
+#: builtin/notes.c:27
 msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
 msgstr ""
 "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] copy [-f] ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ"
 
-#: builtin/notes.c:27
+#: builtin/notes.c:28
 msgid ""
 "git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | "
 "(-c | -C) <object>] [<object>]"
@@ -7935,205 +8438,190 @@
 "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] append [--allow-empty] [-m СЪОБЩЕНИЕ | "
 "-F ФАЙЛ | (-c | -C) ОБЕКТ] [ОБЕКТ]"
 
-#: builtin/notes.c:28
+#: builtin/notes.c:29
 msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
 msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] edit [--allow-empty] [ОБЕКТ]"
 
-#: builtin/notes.c:29
+#: builtin/notes.c:30
 msgid "git notes [--ref <notes-ref>] show [<object>]"
 msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] show [ОБЕКТ]"
 
-#: builtin/notes.c:30
+#: builtin/notes.c:31
 msgid ""
 "git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
 msgstr ""
 "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] merge [-v | -q] [-s СТРАТЕГИЯ] "
 "УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
 
-#: builtin/notes.c:31
+#: builtin/notes.c:32
 msgid "git notes merge --commit [-v | -q]"
 msgstr "git notes merge --commit [-v | -q]"
 
-#: builtin/notes.c:32
+#: builtin/notes.c:33
 msgid "git notes merge --abort [-v | -q]"
 msgstr "git notes merge --abort [-v | -q]"
 
-#: builtin/notes.c:33
+#: builtin/notes.c:34
 msgid "git notes [--ref <notes-ref>] remove [<object>...]"
 msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] remove [ОБЕКТ…]"
 
-#: builtin/notes.c:34
+#: builtin/notes.c:35
 msgid "git notes [--ref <notes-ref>] prune [-n | -v]"
 msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] prune [-n | -v]"
 
-#: builtin/notes.c:35
+#: builtin/notes.c:36
 msgid "git notes [--ref <notes-ref>] get-ref"
 msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] get-ref"
 
-#: builtin/notes.c:40
+#: builtin/notes.c:41
 msgid "git notes [list [<object>]]"
 msgstr "git notes [list [ОБЕКТ]]"
 
-#: builtin/notes.c:45
+#: builtin/notes.c:46
 msgid "git notes add [<options>] [<object>]"
 msgstr "git notes add [ОПЦИЯ…] [ОБЕКТ]"
 
-#: builtin/notes.c:50
+#: builtin/notes.c:51
 msgid "git notes copy [<options>] <from-object> <to-object>"
 msgstr "git notes copy [ОПЦИЯ…] ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ"
 
-#: builtin/notes.c:51
+#: builtin/notes.c:52
 msgid "git notes copy --stdin [<from-object> <to-object>]..."
 msgstr "git notes copy --stdin [ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ]…"
 
-#: builtin/notes.c:56
+#: builtin/notes.c:57
 msgid "git notes append [<options>] [<object>]"
 msgstr "git notes append [ОПЦИЯ…] [ОБЕКТ]"
 
-#: builtin/notes.c:61
+#: builtin/notes.c:62
 msgid "git notes edit [<object>]"
 msgstr "git notes edit [ОБЕКТ]"
 
-#: builtin/notes.c:66
+#: builtin/notes.c:67
 msgid "git notes show [<object>]"
 msgstr "git notes show [ОБЕКТ]"
 
-#: builtin/notes.c:71
+#: builtin/notes.c:72
 msgid "git notes merge [<options>] <notes-ref>"
 msgstr "git notes merge [ОПЦИЯ…] УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
 
-#: builtin/notes.c:72
+#: builtin/notes.c:73
 msgid "git notes merge --commit [<options>]"
 msgstr "git notes merge --commit [ОПЦИЯ…]"
 
-#: builtin/notes.c:73
+#: builtin/notes.c:74
 msgid "git notes merge --abort [<options>]"
 msgstr "git notes merge --abort [ОПЦИЯ…]"
 
-#: builtin/notes.c:78
+#: builtin/notes.c:79
 msgid "git notes remove [<object>]"
 msgstr "git notes remove [ОБЕКТ]"
 
-#: builtin/notes.c:83
+#: builtin/notes.c:84
 msgid "git notes prune [<options>]"
 msgstr "git notes prune [ОПЦИЯ…]"
 
-#: builtin/notes.c:88
+#: builtin/notes.c:89
 msgid "git notes get-ref"
 msgstr "git notes get-ref"
 
-#: builtin/notes.c:146
+#: builtin/notes.c:147
 #, c-format
 msgid "unable to start 'show' for object '%s'"
 msgstr "действието „show“ не може да се изпълни за обект „%s“"
 
-#: builtin/notes.c:150
+#: builtin/notes.c:151
 msgid "could not read 'show' output"
 msgstr "изведената информация от действието „show“ не може да се прочете"
 
-#: builtin/notes.c:158
+#: builtin/notes.c:159
 #, c-format
 msgid "failed to finish 'show' for object '%s'"
 msgstr "действието „show“ не може да се завърши за обект „%s“"
 
-#: builtin/notes.c:173 builtin/tag.c:477
+#: builtin/notes.c:174 builtin/tag.c:248
 #, c-format
 msgid "could not create file '%s'"
 msgstr "файлът „%s“ не може да бъде създаден"
 
-#: builtin/notes.c:192
+#: builtin/notes.c:193
 msgid "Please supply the note contents using either -m or -F option"
 msgstr "Задайте съдържанието на бележката с някоя от опциите „-m“ или „-F“"
 
-#: builtin/notes.c:201
+#: builtin/notes.c:202
 msgid "unable to write note object"
 msgstr "обектът-бележка не може да бъде записан"
 
-#: builtin/notes.c:203
+#: builtin/notes.c:204
 #, c-format
 msgid "The note contents have been left in %s"
 msgstr "Съдържанието на бележката е във файла „%s“"
 
-#: builtin/notes.c:231 builtin/tag.c:693
+#: builtin/notes.c:232 builtin/tag.c:440
 #, c-format
 msgid "cannot read '%s'"
 msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: builtin/notes.c:233 builtin/tag.c:696
+#: builtin/notes.c:234 builtin/tag.c:443
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "файлът „%s“ не може да бъде отворен или прочетен"
 
-#: builtin/notes.c:252 builtin/notes.c:303 builtin/notes.c:305
-#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:506
-#: builtin/notes.c:511 builtin/notes.c:589 builtin/notes.c:652
-#: builtin/notes.c:854 builtin/tag.c:709
+#: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306
+#: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507
+#: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653
+#: builtin/notes.c:877 builtin/tag.c:456
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Не може да се открие към какво сочи „%s“."
 
-#: builtin/notes.c:255
+#: builtin/notes.c:256
 #, c-format
 msgid "Failed to read object '%s'."
 msgstr "Обектът „%s“ не може да бъде прочетен."
 
-#: builtin/notes.c:259
+#: builtin/notes.c:260
 #, c-format
 msgid "Cannot read note data from non-blob object '%s'."
 msgstr ""
 "Съдържанието на бележка не може да се вземе от обект, който не е BLOB: „%s“."
 
-#: builtin/notes.c:299
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Даденият входен ред е с неправилен формат: „%s“."
-
-#: builtin/notes.c:314
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Бележката не може да се копира от „%s“ към „%s“"
-
-#: builtin/notes.c:358 builtin/notes.c:413 builtin/notes.c:489
-#: builtin/notes.c:501 builtin/notes.c:577 builtin/notes.c:645
-#: builtin/notes.c:919
+#: builtin/notes.c:359 builtin/notes.c:414 builtin/notes.c:490
+#: builtin/notes.c:502 builtin/notes.c:578 builtin/notes.c:646
+#: builtin/notes.c:942
 msgid "too many parameters"
 msgstr "прекалено много параметри"
 
-#: builtin/notes.c:371 builtin/notes.c:658
+#: builtin/notes.c:372 builtin/notes.c:659
 #, c-format
 msgid "No note found for object %s."
 msgstr "Няма бележки за обекта „%s“."
 
-#: builtin/notes.c:392 builtin/notes.c:555
+#: builtin/notes.c:393 builtin/notes.c:556
 msgid "note contents as a string"
 msgstr "низ, който е съдържанието на бележката"
 
-#: builtin/notes.c:395 builtin/notes.c:558
+#: builtin/notes.c:396 builtin/notes.c:559
 msgid "note contents in a file"
 msgstr "файл със съдържанието на бележката"
 
-#: builtin/notes.c:397 builtin/notes.c:400 builtin/notes.c:560
-#: builtin/notes.c:563 builtin/tag.c:628
-msgid "object"
-msgstr "обект"
-
-#: builtin/notes.c:398 builtin/notes.c:561
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "reuse and edit specified note object"
 msgstr "преизползване и редактиране на указания обект-бележка"
 
-#: builtin/notes.c:401 builtin/notes.c:564
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "reuse specified note object"
 msgstr "преизползване на указания обект-бележка"
 
-#: builtin/notes.c:404 builtin/notes.c:567
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "allow storing empty note"
 msgstr "приемане и на празни бележки"
 
-#: builtin/notes.c:405 builtin/notes.c:476
+#: builtin/notes.c:406 builtin/notes.c:477
 msgid "replace existing notes"
 msgstr "замяна на съществуващите бележки"
 
-#: builtin/notes.c:430
+#: builtin/notes.c:431
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -8142,32 +8630,32 @@
 "Не може да се добави бележка, защото такава вече съществува за обекта „%s“. "
 "Използвайте опцията „-f“, за да презапишете съществуващи бележки."
 
-#: builtin/notes.c:445 builtin/notes.c:524
+#: builtin/notes.c:446 builtin/notes.c:525
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Презаписване на съществуващите бележки за обекта „%s“\n"
 
-#: builtin/notes.c:456 builtin/notes.c:617 builtin/notes.c:859
+#: builtin/notes.c:457 builtin/notes.c:618 builtin/notes.c:882
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Изтриване на бележката за обекта „%s“\n"
 
-#: builtin/notes.c:477
+#: builtin/notes.c:478
 msgid "read objects from stdin"
 msgstr "изчитане на обектите от стандартния вход"
 
 # FIXME imporve message
-#: builtin/notes.c:479
+#: builtin/notes.c:480
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 "зареждане на настройките за КОМАНДАта, която презаписва подавания (включва "
 "опцията „--stdin“)"
 
-#: builtin/notes.c:497
+#: builtin/notes.c:498
 msgid "too few parameters"
 msgstr "прекалено малко параметри"
 
-#: builtin/notes.c:518
+#: builtin/notes.c:519
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -8176,14 +8664,14 @@
 "Не може да се копира бележка, защото такава вече съществува за обекта „%s“. "
 "Използвайте опцията „-f“, за да презапишете съществуващи бележки."
 
-#: builtin/notes.c:530
+#: builtin/notes.c:531
 #, c-format
 msgid "Missing notes on source object %s. Cannot copy."
 msgstr ""
 "Не може да се копира бележка, която не съществува — няма бележки за обекта-"
 "източник „%s“."
 
-#: builtin/notes.c:582
+#: builtin/notes.c:583
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -8191,18 +8679,18 @@
 msgstr ""
 "Задаването на опциите „-m“/„-F“/„-c“/„-C“ с командата „edit“ вече е "
 "остаряло.\n"
-"Вместо това ги използвайте с командата „add“: „git notes add -f -m/-F/-c/-"
+"Вместо това ги използвайте с подкомандата „add“: „git notes add -f -m/-F/-c/-"
 "C“.\n"
 
-#: builtin/notes.c:750
+#: builtin/notes.c:764
 msgid "General options"
 msgstr "Общи опции"
 
-#: builtin/notes.c:752
+#: builtin/notes.c:766
 msgid "Merge options"
 msgstr "Опции при сливане"
 
-#: builtin/notes.c:754
+#: builtin/notes.c:768
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -8212,58 +8700,65 @@
 "„union“ (обединяване), „cat_sort_uniq“ (обединяване, подреждане, уникални "
 "резултати)"
 
-#: builtin/notes.c:756
+#: builtin/notes.c:770
 msgid "Committing unmerged notes"
 msgstr "Подаване на неслети бележки"
 
-#: builtin/notes.c:758
+#: builtin/notes.c:772
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "завършване на сливането чрез подаване на неслети бележки"
 
-#: builtin/notes.c:760
+#: builtin/notes.c:774
 msgid "Aborting notes merge resolution"
 msgstr "Преустановяване на корекцията при сливането на бележки"
 
-#: builtin/notes.c:762
+#: builtin/notes.c:776
 msgid "abort notes merge"
 msgstr "преустановяване на сливането на бележки"
 
-#: builtin/notes.c:857
+#: builtin/notes.c:853
+#, c-format
+msgid "A notes merge into %s is already in-progress at %s"
+msgstr "В момента се извършва сливане на бележките в „%s“ при „%s“"
+
+#: builtin/notes.c:880
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Няма бележки за обекта „%s“\n"
 
-#: builtin/notes.c:869
+#: builtin/notes.c:892
 msgid "attempt to remove non-existent note is not an error"
 msgstr "опитът за изтриването на несъществуваща бележка не се счита за грешка"
 
-#: builtin/notes.c:872
+#: builtin/notes.c:895
 msgid "read object names from the standard input"
 msgstr "изчитане на имената на обектите от стандартния вход"
 
-#: builtin/notes.c:953
+#: builtin/notes.c:976
 msgid "notes-ref"
 msgstr "УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
 
-#: builtin/notes.c:954
+#: builtin/notes.c:977
 msgid "use notes from <notes-ref>"
 msgstr "да се използва бележката сочена от този УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
 
-#: builtin/notes.c:989 builtin/remote.c:1618
+#: builtin/notes.c:1012 builtin/remote.c:1647
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Непозната подкоманда: %s"
 
 #: builtin/pack-objects.c:28
-msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
+msgid ""
+"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr ""
-"git pack-objects --stdout [ОПЦИЯ…] [< СПИСЪК_С_ВЕРСИИ | < СПИСЪК_С_ОБЕКТИ]"
+"git pack-objects --stdout [ОПЦИЯ…] [< СПИСЪК_С_УКАЗАТЕЛИ | < СПИСЪК_С_ОБЕКТИ]"
 
 # FIXME [options] vs [options...]
 #: builtin/pack-objects.c:29
-msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
+msgid ""
+"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr ""
-"git pack-objects [ОПЦИЯ…] ПРЕФИКС_НА_ИМЕТО [< СПИСЪК_С_ВЕРСИИ | < "
+"git pack-objects [ОПЦИЯ…] ПРЕФИКС_НА_ИМЕТО [< СПИСЪК_С_УКАЗАТЕЛИ | < "
 "СПИСЪК_С_ОБЕКТИ]"
 
 #: builtin/pack-objects.c:175 builtin/pack-objects.c:178
@@ -8295,167 +8790,157 @@
 msgid "bad index version '%s'"
 msgstr "неправилна версия на индекса „%s“"
 
-#: builtin/pack-objects.c:2595
-#, c-format
-msgid "option %s does not accept negative form"
-msgstr "опцията „%s“ не притежава отрицателна версия"
-
-#: builtin/pack-objects.c:2599
-#, c-format
-msgid "unable to parse value '%s' for option %s"
-msgstr "неразпозната стойност „%s“ за опцията „%s“"
-
-#: builtin/pack-objects.c:2619
+#: builtin/pack-objects.c:2602
 msgid "do not show progress meter"
 msgstr "без извеждане на напредъка"
 
-#: builtin/pack-objects.c:2621
+#: builtin/pack-objects.c:2604
 msgid "show progress meter"
 msgstr "извеждане на напредъка"
 
-#: builtin/pack-objects.c:2623
+#: builtin/pack-objects.c:2606
 msgid "show progress meter during object writing phase"
 msgstr "извеждане на напредъка във фазата на запазване на обектите"
 
-#: builtin/pack-objects.c:2626
+#: builtin/pack-objects.c:2609
 msgid "similar to --all-progress when progress meter is shown"
 msgstr ""
 "същото действие като опцията „--all-progress“ при извеждането на напредъка"
 
-#: builtin/pack-objects.c:2627
+#: builtin/pack-objects.c:2610
 msgid "version[,offset]"
 msgstr "ВЕРСИЯ[,ОТМЕСТВАНЕ]"
 
-#: builtin/pack-objects.c:2628
+#: builtin/pack-objects.c:2611
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 "запазване на индекса на пакетните файлове във форма̀та с указаната версия"
 
-#: builtin/pack-objects.c:2631
+#: builtin/pack-objects.c:2614
 msgid "maximum size of each output pack file"
 msgstr "максимален размер на всеки пакетен файл"
 
-#: builtin/pack-objects.c:2633
+#: builtin/pack-objects.c:2616
 msgid "ignore borrowed objects from alternate object store"
 msgstr "игнориране на обектите заети от други хранилища на обекти"
 
-#: builtin/pack-objects.c:2635
+#: builtin/pack-objects.c:2618
 msgid "ignore packed objects"
 msgstr "игнориране на пакетираните обекти"
 
-#: builtin/pack-objects.c:2637
+#: builtin/pack-objects.c:2620
 msgid "limit pack window by objects"
 msgstr "ограничаване на прозореца за пакетиране по брой обекти"
 
-#: builtin/pack-objects.c:2639
+#: builtin/pack-objects.c:2622
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 "ограничаване на прозореца за пакетиране и по памет освен по брой обекти"
 
-#: builtin/pack-objects.c:2641
+#: builtin/pack-objects.c:2624
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 "максимална дължина на веригата от разлики, която е позволена в пакетния файл"
 
-#: builtin/pack-objects.c:2643
+#: builtin/pack-objects.c:2626
 msgid "reuse existing deltas"
 msgstr "преизползване на съществуващите разлики"
 
-#: builtin/pack-objects.c:2645
+#: builtin/pack-objects.c:2628
 msgid "reuse existing objects"
 msgstr "преизползване на съществуващите обекти"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2630
 msgid "use OFS_DELTA objects"
 msgstr "използване на обекти „OFS_DELTA“"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2632
 msgid "use threads when searching for best delta matches"
 msgstr ""
 "стартиране на нишки за претърсване на най-добрите съвпадения на разликите"
 
-#: builtin/pack-objects.c:2651
+#: builtin/pack-objects.c:2634
 msgid "do not create an empty pack output"
 msgstr "без създаване на празен пакетен файл"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2636
 msgid "read revision arguments from standard input"
 msgstr "изчитане на версиите от стандартния вход"
 
-#: builtin/pack-objects.c:2655
+#: builtin/pack-objects.c:2638
 msgid "limit the objects to those that are not yet packed"
 msgstr "ограничаване до все още непакетираните обекти"
 
-#: builtin/pack-objects.c:2658
+#: builtin/pack-objects.c:2641
 msgid "include objects reachable from any reference"
 msgstr ""
 "включване на всички обекти, които могат да се достигнат от произволен "
 "указател"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2644
 msgid "include objects referred by reflog entries"
 msgstr "включване и на обектите сочени от записите в журнала на указателите"
 
-#: builtin/pack-objects.c:2664
+#: builtin/pack-objects.c:2647
 msgid "include objects referred to by the index"
 msgstr "включване и на обектите сочени от индекса"
 
-#: builtin/pack-objects.c:2667
+#: builtin/pack-objects.c:2650
 msgid "output pack to stdout"
 msgstr "извеждане на пакета на стандартния изход"
 
-#: builtin/pack-objects.c:2669
+#: builtin/pack-objects.c:2652
 msgid "include tag objects that refer to objects to be packed"
 msgstr ""
 "включване и на обектите-етикети, които сочат към обектите, които ще бъдат "
 "пакетирани"
 
-#: builtin/pack-objects.c:2671
+#: builtin/pack-objects.c:2654
 msgid "keep unreachable objects"
 msgstr "запазване на недостижимите обекти"
 
-#: builtin/pack-objects.c:2672 parse-options.h:139
+#: builtin/pack-objects.c:2655 parse-options.h:142
 msgid "time"
 msgstr "ВРЕМЕ"
 
-#: builtin/pack-objects.c:2673
+#: builtin/pack-objects.c:2656
 msgid "unpack unreachable objects newer than <time>"
 msgstr "разпакетиране на недостижимите обекти, които са по-нови от това ВРЕМЕ"
 
-#: builtin/pack-objects.c:2676
+#: builtin/pack-objects.c:2659
 msgid "create thin packs"
 msgstr "създаване на съкратени пакети"
 
-#: builtin/pack-objects.c:2678
+#: builtin/pack-objects.c:2661
 msgid "create packs suitable for shallow fetches"
 msgstr "пакетиране подходящо за плитко доставяне"
 
-#: builtin/pack-objects.c:2680
+#: builtin/pack-objects.c:2663
 msgid "ignore packs that have companion .keep file"
 msgstr "игнориране на пакетите, които са придружени от файл „.keep“"
 
-#: builtin/pack-objects.c:2682
+#: builtin/pack-objects.c:2665
 msgid "pack compression level"
 msgstr "ниво на компресиране при пакетиране"
 
-#: builtin/pack-objects.c:2684
+#: builtin/pack-objects.c:2667
 msgid "do not hide commits by grafts"
 msgstr ""
 "извеждане на всички родители — дори и тези, които нормално са скрити при "
 "присажданията"
 
-#: builtin/pack-objects.c:2686
+#: builtin/pack-objects.c:2669
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 "използване на съществуващи индекси на база битови маски за ускоряване на "
 "преброяването на обектите"
 
-#: builtin/pack-objects.c:2688
+#: builtin/pack-objects.c:2671
 msgid "write a bitmap index together with the pack index"
 msgstr ""
 "запазване и на индекс на база побитова маска, заедно с индекса за пакета"
 
-#: builtin/pack-objects.c:2779
+#: builtin/pack-objects.c:2762
 msgid "Counting objects"
 msgstr "Преброяване на обектите"
 
@@ -8483,31 +8968,195 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire ВРЕМЕ] [--] [ВРЪХ…]"
 
-#: builtin/prune.c:105 builtin/worktree.c:112
+#: builtin/prune.c:105 builtin/worktree.c:124
 msgid "do not remove, show only"
 msgstr "само извеждане без действително окастряне"
 
-#: builtin/prune.c:106 builtin/worktree.c:113
+#: builtin/prune.c:106 builtin/worktree.c:125
 msgid "report pruned objects"
 msgstr "информация за окастрените обекти"
 
-#: builtin/prune.c:109 builtin/worktree.c:115
+#: builtin/prune.c:109 builtin/worktree.c:127
 msgid "expire objects older than <time>"
 msgstr "окастряне на обектите по-стари от това ВРЕМЕ"
 
-#: builtin/push.c:14
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
+msgstr "хранилище с важни обекти не може да се окастря"
+
+#: builtin/pull.c:69
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
+msgstr "git push [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ_НА_ВЕРСИЯ…]]"
+
+#: builtin/pull.c:113
+msgid "Options related to merging"
+msgstr "Опции при сливане"
+
+#: builtin/pull.c:116
+msgid "incorporate changes by rebasing rather than merging"
+msgstr "внасяне на промените чрез пребазиране, а не чрез сливане"
+
+#: builtin/pull.c:140 builtin/revert.c:105
+msgid "allow fast-forward"
+msgstr "позволяване на тривиални сливания"
+
+#: builtin/pull.c:146
+msgid "verify that the named commit has a valid GPG signature"
+msgstr "Проверка, че указаното подаване е с правилен подпис на GPG"
+
+#: builtin/pull.c:160
+msgid "Options related to fetching"
+msgstr "Опции при доставяне"
+
+#: builtin/pull.c:268
+#, c-format
+msgid "Invalid value for pull.ff: %s"
+msgstr "Неправилна стойност за „pull.ff“: „%s“"
+
+#: builtin/pull.c:352
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr ""
+"Не можете да издърпвате при това пребазиране, защото има промени, които не "
+"са в индекса"
+
+#: builtin/pull.c:358
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "Освен това в индекса има неподадени промени."
+
+#: builtin/pull.c:360
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr ""
+"Не можете да издърпвате при това пребазиране, защото в индекса има "
+"неподадени промени."
+
+#: builtin/pull.c:436
+msgid ""
+"There is no candidate for rebasing against among the refs that you just "
+"fetched."
+msgstr ""
+"Между указателите, които току що доставихте, няма подходящ кандидат, върху "
+"който да пребазирате."
+
+#: builtin/pull.c:438
+msgid ""
+"There are no candidates for merging among the refs that you just fetched."
+msgstr ""
+"Между указателите, които току що доставихте, няма подходящ кандидат, който "
+"да слеете."
+
+#: builtin/pull.c:439
+msgid ""
+"Generally this means that you provided a wildcard refspec which had no\n"
+"matches on the remote end."
+msgstr ""
+"Най вероятно сте подали шаблон за указатели, който не е напаснал с нищо в "
+"отдалеченото хранилище."
+
+#: builtin/pull.c:442
+#, 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:447
+msgid "You are not currently on a branch."
+msgstr "Извън всички клони."
+
+#: builtin/pull.c:449 builtin/pull.c:464
+msgid "Please specify which branch you want to rebase against."
+msgstr "Укажете върху кой клон искате да пребазирате."
+
+#: builtin/pull.c:451 builtin/pull.c:466
+msgid "Please specify which branch you want to merge with."
+msgstr "Укажете кой клон искате да слеете."
+
+#: builtin/pull.c:452 builtin/pull.c:467
+msgid "See git-pull(1) for details."
+msgstr "За повече информация погледнете ръководството „git-pull(1)“"
+
+#: builtin/pull.c:462
+msgid "There is no tracking information for the current branch."
+msgstr "Текущият клон не следи никой."
+
+#: builtin/pull.c:471
+#, c-format
+msgid ""
+"If you wish to set tracking information for this branch you can do so with:\n"
+"\n"
+"    git branch --set-upstream-to=%s/<branch> %s\n"
+msgstr ""
+"Ако все пак искате да зададете информация за следен клон,\n"
+"можете да направите това с командата:\n"
+"\n"
+" git branch --set-upstream-to=%s/СЛЕДЕН_КЛОН %s\n"
+"\n"
+
+#: builtin/pull.c:476
+#, 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:830
+msgid "Updating an unborn branch with changes added to the index."
+msgstr "Обновяване на все още несъздаден клон с промените от индекса"
+
+#: builtin/pull.c:859
+#, c-format
+msgid ""
+"fetch updated the current branch head.\n"
+"fast-forwarding your working tree from\n"
+"commit %s."
+msgstr ""
+"доставянето обнови върха на текущия клон. Работното\n"
+"ви копие бе тривиално слято от подаване „%s“."
+
+#: builtin/pull.c:864
+#, c-format
+msgid ""
+"Cannot fast-forward your working tree.\n"
+"After making sure that you saved anything precious from\n"
+"$ git diff %s\n"
+"output, run\n"
+"$ git reset --hard\n"
+"to recover."
+msgstr ""
+"Работното ви копие не може да бъде тривиално слято.\n"
+"След като запазите всичко необходимо посочено от командата:\n"
+"  $ git diff %s\n"
+"изпълнете:\n"
+"  $ git reset --hard\n"
+"за връщане към нормално състояние."
+
+#: builtin/pull.c:879
+msgid "Cannot merge multiple branches into empty head."
+msgstr "Не може да сливате множество клони в празен върхов указател."
+
+#: builtin/pull.c:883
+msgid "Cannot rebase onto multiple branches."
+msgstr "Не може да пребазирате върху повече от един клон."
+
+#: builtin/push.c:16
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ_НА_ВЕРСИЯ…]]"
 
-#: builtin/push.c:85
+#: builtin/push.c:88
 msgid "tag shorthand without <tag>"
 msgstr "съкращение за етикет без ЕТИКЕТ"
 
-#: builtin/push.c:95
+#: builtin/push.c:98
 msgid "--delete only accepts plain target ref names"
 msgstr "опцията „--delete“ приема за цел само прости имена на указатели"
 
-#: builtin/push.c:139
+#: builtin/push.c:142
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -8516,7 +9165,7 @@
 "За да включите тази опция за постоянно, погледнете документацията за "
 "настройката „push.default“ в „git help config“."
 
-#: builtin/push.c:142
+#: builtin/push.c:145
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -8541,7 +9190,7 @@
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:157
+#: builtin/push.c:160
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -8555,7 +9204,7 @@
 "\n"
 "    git push %s HEAD:ИМЕ_НА_ОТДАЛЕЧЕНИЯ_КЛОН\n"
 
-#: builtin/push.c:171
+#: builtin/push.c:174
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -8569,14 +9218,14 @@
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:179
+#: builtin/push.c:182
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr ""
 "Текущият клон „%s“ следи няколко отдалечени клона, не можете просто да "
 "изтласкате."
 
-#: builtin/push.c:182
+#: builtin/push.c:185
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -8588,7 +9237,7 @@
 "Трябва да укажете коя версия да се изтласка, за обновяване на отдалечения "
 "клон."
 
-#: builtin/push.c:205
+#: builtin/push.c:208
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -8641,14 +9290,14 @@
 "Новата стойност „simple“ бе въведена с версия 1.7.11 на Git. Ако понякога\n"
 "ползвате стари версии на Git, задайте стойност „current“ вместо „simple“."
 
-#: builtin/push.c:272
+#: builtin/push.c:275
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "Не сте указали версия за подаване, а настройката „push.default“ е "
 "„nothing“ (нищо без изрично указана версия да не се изтласква)"
 
-#: builtin/push.c:279
+#: builtin/push.c:282
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -8662,7 +9311,7 @@
 "преди отново да изтласкате промените. За повече информация вижте раздела\n"
 "„Note about fast-forwards“ в страницата от ръководството „git push --help“."
 
-#: builtin/push.c:285
+#: builtin/push.c:288
 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"
@@ -8675,7 +9324,7 @@
 "информация погледнете раздела „Note about fast-forwards“ в страницата от\n"
 "ръководството „git push --help“."
 
-#: builtin/push.c:291
+#: builtin/push.c:294
 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"
@@ -8694,14 +9343,14 @@
 "страницата\n"
 "от ръководството „git push --help“."
 
-#: builtin/push.c:298
+#: builtin/push.c:301
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 "Изтласкването е отхвърлено, защото в отдалеченото хранилище съществува "
 "етикет,\n"
 "който ще припокриете с етикет от вашето хранилище."
 
-#: builtin/push.c:301
+#: builtin/push.c:304
 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"
@@ -8711,22 +9360,22 @@
 "указател, който вече сочи към обект, който не е подаване, както и тепърва\n"
 "да го промените да сочи към подобен обект.\n"
 
-#: builtin/push.c:360
+#: builtin/push.c:363
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Изтласкване към „%s“\n"
 
-#: builtin/push.c:364
+#: builtin/push.c:367
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "част от указателите не бяха изтласкани към „%s“"
 
-#: builtin/push.c:394
+#: builtin/push.c:397
 #, c-format
 msgid "bad repository '%s'"
 msgstr "неправилно указано хранилище „%s“"
 
-#: builtin/push.c:395
+#: builtin/push.c:398
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -8748,113 +9397,118 @@
 "\n"
 "    git push ИМЕ\n"
 
-#: builtin/push.c:410
+#: builtin/push.c:413
 msgid "--all and --tags are incompatible"
 msgstr "опциите „--all“ и „--tags“ са несъвместими"
 
-#: builtin/push.c:411
+#: builtin/push.c:414
 msgid "--all can't be combined with refspecs"
 msgstr "опцията „--all“ е несъвместима с указването на версия"
 
-#: builtin/push.c:416
+#: builtin/push.c:419
 msgid "--mirror and --tags are incompatible"
 msgstr "опциите „--mirror“ и „--tags“ са несъвместими"
 
-#: builtin/push.c:417
+#: builtin/push.c:420
 msgid "--mirror can't be combined with refspecs"
 msgstr "опцията „--mirror“ е несъвместима с указването на версия"
 
-#: builtin/push.c:422
+#: builtin/push.c:425
 msgid "--all and --mirror are incompatible"
 msgstr "опциите „--all“ и „--mirror“ са несъвместими"
 
-#: builtin/push.c:502
+#: builtin/push.c:537
 msgid "repository"
 msgstr "хранилище"
 
-#: builtin/push.c:503
+#: builtin/push.c:538 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "изтласкване на всички указатели"
 
-#: builtin/push.c:504
+#: builtin/push.c:539 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "огледално копие на всички указатели"
 
-#: builtin/push.c:506
+#: builtin/push.c:541
 msgid "delete refs"
 msgstr "изтриване на указателите"
 
-#: builtin/push.c:507
+#: builtin/push.c:542
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "изтласкване на етикетите (несъвместимо с опциите „--all“ и „--mirror“)"
 
-#: builtin/push.c:510
+#: builtin/push.c:545 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "принудително обновяване"
 
 # FIXME double check this
-#: builtin/push.c:512
+#: builtin/push.c:547 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "УКАЗАТЕЛ>:<ОЧАКВАНА_СТОЙНОСТ"
 
-#: builtin/push.c:513
+#: builtin/push.c:548 builtin/send-pack.c:176
 msgid "require old value of ref to be at this value"
 msgstr "УКАЗАТЕЛят трябва първоначално да е с тази ОЧАКВАНА_СТОЙНОСТ"
 
-#: builtin/push.c:516
+#: builtin/push.c:550
+msgid "check|on-demand|no"
+msgstr "„check“ (проверка), „on-demand“ (при нужда) или „no“ (без)"
+
+#: builtin/push.c:551
 msgid "control recursive pushing of submodules"
 msgstr "управление на рекурсивното изтласкване на подмодулите"
 
-#: builtin/push.c:518
+#: builtin/push.c:553 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "използване на съкратени пакети"
 
-#: builtin/push.c:519 builtin/push.c:520
+#: builtin/push.c:554 builtin/push.c:555 builtin/send-pack.c:158
+#: builtin/send-pack.c:159
 msgid "receive pack program"
 msgstr "програма за получаването на пакети"
 
-#: builtin/push.c:521
+#: builtin/push.c:556
 msgid "set upstream for git pull/status"
 msgstr "задаване на отдалеченото хранилище за командите „git pull/status“"
 
-#: builtin/push.c:524
+#: builtin/push.c:559
 msgid "prune locally removed refs"
 msgstr "окастряне на указателите, които са премахнати от локалното хранилище"
 
-#: builtin/push.c:526
+#: builtin/push.c:561
 msgid "bypass pre-push hook"
 msgstr "без изпълнение на куката преди изтласкване (pre-push)"
 
-#: builtin/push.c:527
+#: builtin/push.c:562
 msgid "push missing but relevant tags"
 msgstr ""
 "изтласкване на липсващите в отдалеченото хранилище, но свързани с текущото "
 "изтласкване, етикети"
 
-#: builtin/push.c:529
+#: builtin/push.c:565 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "подписване на изтласкването с GPG"
 
-#: builtin/push.c:530
+#: builtin/push.c:567 builtin/send-pack.c:170
 msgid "request atomic transaction on remote side"
 msgstr "изискване на атомарни операции от отсрещната страна"
 
-#: builtin/push.c:539
+#: builtin/push.c:577
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr ""
 "опцията „--delete“ е несъвместима с опциите  „--all“, „--mirror“ и „--tags“"
 
-#: builtin/push.c:541
+#: builtin/push.c:579
 msgid "--delete doesn't make sense without any refs"
 msgstr "опцията „--delete“ изисква поне един указател на версия"
 
 #: builtin/read-tree.c:37
 msgid ""
-"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] "
+"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
 "index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
 msgstr ""
-"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=ПРЕФИКС] "
+"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=ПРЕФИКС) "
 "[-u [--exclude-per-directory=ФАЙЛ_С_ИЗКЛЮЧЕНИЯ] | -i]] [--no-sparse-"
 "checkout] [--index-output=ФАЙЛ] (--empty | УКАЗАТЕЛ_КЪМ_ДЪРВО_1 "
 "[УКАЗАТЕЛ_КЪМ_ДЪРВО_2 [УКАЗАТЕЛ_КЪМ_ДЪРВО_3]])"
@@ -8924,12 +9578,12 @@
 msgstr "изчистване на грешки в командата „unpack-trees“"
 
 # FIXME
-#: builtin/reflog.c:430
+#: builtin/reflog.c:428
 #, c-format
-msgid "%s' for '%s' is not a valid timestamp"
+msgid "'%s' for '%s' is not a valid timestamp"
 msgstr "„%s“ не е правилна стойност за време за „%s“"
 
-#: builtin/reflog.c:547 builtin/reflog.c:552
+#: builtin/reflog.c:545 builtin/reflog.c:550
 #, c-format
 msgid "'%s' is not a valid timestamp"
 msgstr "„%s“ не е правилна стойност за време"
@@ -8946,15 +9600,15 @@
 "git remote add [-t КЛОН] [-m ОСНОВЕН_КЛОН] [-f] [--tags | --no-tags] [--"
 "mirror=<fetch|push>] ИМЕ АДРЕС"
 
-#: builtin/remote.c:14 builtin/remote.c:33
+#: builtin/remote.c:14 builtin/remote.c:34
 msgid "git remote rename <old> <new>"
 msgstr "git remote rename СТАРО_ИМЕ НОВО_ИМЕ"
 
-#: builtin/remote.c:15 builtin/remote.c:38
+#: builtin/remote.c:15 builtin/remote.c:39
 msgid "git remote remove <name>"
 msgstr "git remote remove ИМЕ"
 
-#: builtin/remote.c:16 builtin/remote.c:43
+#: builtin/remote.c:16 builtin/remote.c:44
 msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
 msgstr "git remote set-head ИМЕ (-a | --auto | -d | --delete | КЛОН)"
 
@@ -8977,49 +9631,53 @@
 msgid "git remote set-branches [--add] <name> <branch>..."
 msgstr "git remote set-branches [--add] ИМЕ КЛОН…"
 
-#: builtin/remote.c:21 builtin/remote.c:69
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr "git remote get-url [--push] [--all] ИМЕ"
+
+#: builtin/remote.c:22 builtin/remote.c:75
 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
 msgstr "git remote set-url [--push] ИМЕ НОВ_АДРЕС [СТАР_АДРЕС]"
 
-#: builtin/remote.c:22 builtin/remote.c:70
+#: builtin/remote.c:23 builtin/remote.c:76
 msgid "git remote set-url --add <name> <newurl>"
 msgstr "git remote set-url --add ИМЕ НОВ_АДРЕС"
 
-#: builtin/remote.c:23 builtin/remote.c:71
+#: builtin/remote.c:24 builtin/remote.c:77
 msgid "git remote set-url --delete <name> <url>"
 msgstr "git remote set-url --delete ИМЕ АДРЕС"
 
-#: builtin/remote.c:28
+#: builtin/remote.c:29
 msgid "git remote add [<options>] <name> <url>"
 msgstr "git remote add [ОПЦИЯ…] ИМЕ АДРЕС"
 
-#: builtin/remote.c:48
+#: builtin/remote.c:49
 msgid "git remote set-branches <name> <branch>..."
 msgstr "git remote set-branches ИМЕ КЛОН…"
 
-#: builtin/remote.c:49
+#: builtin/remote.c:50
 msgid "git remote set-branches --add <name> <branch>..."
 msgstr "git remote set-branches --add ИМЕ КЛОН…"
 
-#: builtin/remote.c:54
+#: builtin/remote.c:55
 msgid "git remote show [<options>] <name>"
 msgstr "git remote show [ОПЦИЯ…] ИМЕ"
 
-#: builtin/remote.c:59
+#: builtin/remote.c:60
 msgid "git remote prune [<options>] <name>"
 msgstr "git remote prune [ОПЦИЯ…] ИМЕ"
 
-#: builtin/remote.c:64
+#: builtin/remote.c:65
 msgid "git remote update [<options>] [<group> | <remote>]..."
 msgstr "git remote update [ОПЦИЯ…] [ГРУПА | ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ]…"
 
-#: builtin/remote.c:88
+#: builtin/remote.c:94
 #, c-format
 msgid "Updating %s"
 msgstr "Обновяване на „%s“"
 
 # FIXME tabulator
-#: builtin/remote.c:120
+#: builtin/remote.c:126
 msgid ""
 "--mirror is dangerous and deprecated; please\n"
 "\t use --mirror=fetch or --mirror=push instead"
@@ -9027,101 +9685,101 @@
 "Използването само на „--mirror“ е опасно. Вместо това\n"
 "ползвайте „--mirror=fetch“ или „--mirror=push“"
 
-#: builtin/remote.c:137
+#: builtin/remote.c:143
 #, c-format
 msgid "unknown mirror argument: %s"
 msgstr "неправилна стойност за „--mirror“: %s"
 
-#: builtin/remote.c:153
+#: builtin/remote.c:159
 msgid "fetch the remote branches"
 msgstr "отдалечените клони не могат да бъдат доставени"
 
-#: builtin/remote.c:155
+#: builtin/remote.c:161
 msgid "import all tags and associated objects when fetching"
 msgstr "внасяне на всички етикети и принадлежащите им обекти при доставяне"
 
-#: builtin/remote.c:158
+#: builtin/remote.c:164
 msgid "or do not fetch any tag at all (--no-tags)"
 msgstr "може и да не се доставят никакви етикети (чрез опцията „--no-tags“)"
 
-#: builtin/remote.c:160
+#: builtin/remote.c:166
 msgid "branch(es) to track"
 msgstr "клон/и за следене"
 
-#: builtin/remote.c:161
+#: builtin/remote.c:167
 msgid "master branch"
 msgstr "основен клон"
 
-#: builtin/remote.c:162
+#: builtin/remote.c:168
 msgid "push|fetch"
 msgstr "издърпване|доставяне"
 
-#: builtin/remote.c:163
+#: builtin/remote.c:169
 msgid "set up remote as a mirror to push to or fetch from"
 msgstr ""
 "настройване на отдалечено хранилище, от което да се издърпва или доставя"
 
-#: builtin/remote.c:175
+#: builtin/remote.c:181
 msgid "specifying a master branch makes no sense with --mirror"
 msgstr ""
 "няма смисъл да се указва основен клон при използване на опцията „--mirror“"
 
-#: builtin/remote.c:177
+#: builtin/remote.c:183
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr ""
 "указването на следени клони е смислено само за отдалечени хранилища, от "
 "които се доставя"
 
-#: builtin/remote.c:187 builtin/remote.c:640
+#: builtin/remote.c:193 builtin/remote.c:643
 #, c-format
 msgid "remote %s already exists."
 msgstr "вече съществува отдалечено хранилище с име „%s“."
 
-#: builtin/remote.c:191 builtin/remote.c:644
+#: builtin/remote.c:197 builtin/remote.c:647
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "„%s“ е неправилно име за отдалечено хранилище"
 
-#: builtin/remote.c:235
+#: builtin/remote.c:241
 #, c-format
 msgid "Could not setup master '%s'"
 msgstr "Основният клон „%s“ не може да бъде настроен"
 
-#: builtin/remote.c:335
+#: builtin/remote.c:341
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr "Обектите за доставяне за указателя „%s“ не могат да бъдат получени"
 
-#: builtin/remote.c:436 builtin/remote.c:444
+#: builtin/remote.c:442 builtin/remote.c:450
 msgid "(matching)"
 msgstr "(съвпадащи)"
 
-#: builtin/remote.c:448
+#: builtin/remote.c:454
 msgid "(delete)"
 msgstr "(за изтриване)"
 
-#: builtin/remote.c:589 builtin/remote.c:595 builtin/remote.c:601
+#: builtin/remote.c:594 builtin/remote.c:600 builtin/remote.c:606
 #, c-format
 msgid "Could not append '%s' to '%s'"
 msgstr "„%s“ не може да се добави към „%s“"
 
-#: builtin/remote.c:633 builtin/remote.c:792 builtin/remote.c:892
+#: builtin/remote.c:636 builtin/remote.c:775 builtin/remote.c:875
 #, c-format
 msgid "No such remote: %s"
 msgstr "Такова отдалечено хранилище няма: %s"
 
-#: builtin/remote.c:650
+#: builtin/remote.c:653
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Разделът „%s“ в настройките не може да бъде преименуван на „%s“"
 
-#: builtin/remote.c:656 builtin/remote.c:844
+#: builtin/remote.c:659 builtin/remote.c:827
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Разделът „%s“ в настройките не може да бъде изтрит"
 
 # FIXME tabulator
-#: builtin/remote.c:671
+#: builtin/remote.c:674
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -9132,32 +9790,27 @@
 "    %s\n"
 "  Променете настройките ръчно, ако е необходимо."
 
-#: builtin/remote.c:677
+#: builtin/remote.c:680
 #, c-format
 msgid "Could not append '%s'"
 msgstr "Разделът „%s“ не може да бъде добавен в настройките"
 
-#: builtin/remote.c:688
+#: builtin/remote.c:691
 #, c-format
 msgid "Could not set '%s'"
 msgstr "Разделът „%s“ не може да бъде зададен в настройките"
 
-#: builtin/remote.c:710
+#: builtin/remote.c:713
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "неуспешно изтриване на „%s“"
 
-#: builtin/remote.c:744
+#: builtin/remote.c:747
 #, c-format
 msgid "creating '%s' failed"
 msgstr "неуспешно създаване на „%s“"
 
-#: builtin/remote.c:763
-#, c-format
-msgid "Could not remove branch %s"
-msgstr "Клонът „%s“ не може да бъде изтрит"
-
-#: builtin/remote.c:830
+#: builtin/remote.c:813
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -9171,125 +9824,125 @@
 "Бележка: Няколко клона извън йерархията „refs/remotes/“ не бяха изтрити.\n"
 "Изтрийте ги чрез командата:"
 
-#: builtin/remote.c:945
+#: builtin/remote.c:928
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " нов (следващото доставяне ще го разположи в „remotes/%s“)"
 
-#: builtin/remote.c:948
+#: builtin/remote.c:931
 msgid " tracked"
 msgstr " следен"
 
-#: builtin/remote.c:950
+#: builtin/remote.c:933
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " стар (изтрийте чрез „git remote prune“)"
 
 # FIXME
-#: builtin/remote.c:952
+#: builtin/remote.c:935
 msgid " ???"
 msgstr " неясно състояние"
 
 # CHECK
-#: builtin/remote.c:993
+#: builtin/remote.c:976
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr ""
 "неправилен клон за сливане „%s“. Невъзможно е да пребазирате върху повече от "
 "1 клон"
 
-#: builtin/remote.c:1000
+#: builtin/remote.c:983
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "пребазиране върху отдалечения клон „%s“"
 
-#: builtin/remote.c:1003
+#: builtin/remote.c:986
 #, c-format
 msgid " merges with remote %s"
 msgstr " сливане с отдалечения клон „%s“"
 
-#: builtin/remote.c:1004
+#: builtin/remote.c:987
 msgid "    and with remote"
 msgstr "    и с отдалечения клон"
 
-#: builtin/remote.c:1006
+#: builtin/remote.c:989
 #, c-format
 msgid "merges with remote %s"
 msgstr "сливане с отдалечения клон „%s“"
 
-#: builtin/remote.c:1007
+#: builtin/remote.c:990
 msgid "   and with remote"
 msgstr "   и с отдалечения клон"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1036
 msgid "create"
 msgstr "създаден"
 
-#: builtin/remote.c:1056
+#: builtin/remote.c:1039
 msgid "delete"
 msgstr "изтрит"
 
-#: builtin/remote.c:1060
+#: builtin/remote.c:1043
 msgid "up to date"
 msgstr "актуален"
 
-#: builtin/remote.c:1063
+#: builtin/remote.c:1046
 msgid "fast-forwardable"
 msgstr "може да се слее тривиално"
 
-#: builtin/remote.c:1066
+#: builtin/remote.c:1049
 msgid "local out of date"
 msgstr "локалният е изостанал"
 
-#: builtin/remote.c:1073
+#: builtin/remote.c:1056
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s принудително изтласква към %-*s (%s)"
 
-#: builtin/remote.c:1076
+#: builtin/remote.c:1059
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s изтласква към %-*s (%s)"
 
-#: builtin/remote.c:1080
+#: builtin/remote.c:1063
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s принудително изтласква към %s"
 
-#: builtin/remote.c:1083
+#: builtin/remote.c:1066
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s изтласква към %s"
 
-#: builtin/remote.c:1151
+#: builtin/remote.c:1134
 msgid "do not query remotes"
 msgstr "без заявки към отдалечените хранилища"
 
-#: builtin/remote.c:1178
+#: builtin/remote.c:1161
 #, c-format
 msgid "* remote %s"
 msgstr "● отдалечено хранилище „%s“"
 
-#: builtin/remote.c:1179
+#: builtin/remote.c:1162
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  Адрес за доставяне: %s"
 
-#: builtin/remote.c:1180 builtin/remote.c:1331
+#: builtin/remote.c:1163 builtin/remote.c:1314
 msgid "(no URL)"
 msgstr "(без адрес)"
 
 # FIXME spaces betwen Push and URL
-#: builtin/remote.c:1189 builtin/remote.c:1191
+#: builtin/remote.c:1172 builtin/remote.c:1174
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  Адрес за изтласкване: %s"
 
-#: builtin/remote.c:1193 builtin/remote.c:1195 builtin/remote.c:1197
+#: builtin/remote.c:1176 builtin/remote.c:1178 builtin/remote.c:1180
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  клон сочен от HEAD: %s"
 
-#: builtin/remote.c:1199
+#: builtin/remote.c:1182
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
@@ -9298,146 +9951,159 @@
 "хранилище е\n"
 "  нееднозначен и е някой от следните):\n"
 
-#: builtin/remote.c:1211
+#: builtin/remote.c:1194
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Отдалечен клон:%s"
 msgstr[1] "  Отдалечени клони:%s"
 
-#: builtin/remote.c:1214 builtin/remote.c:1241
+#: builtin/remote.c:1197 builtin/remote.c:1224
 msgid " (status not queried)"
 msgstr " (състоянието не бе проверено)"
 
-#: builtin/remote.c:1223
+#: builtin/remote.c:1206
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Локален клон настроен за издърпване чрез „git pull“:"
 msgstr[1] "  Локални клони настроени за издърпване чрез „git pull“:"
 
-#: builtin/remote.c:1231
+#: builtin/remote.c:1214
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Локалните указатели ще бъдат пренесени чрез „ push“"
 
-#: builtin/remote.c:1238
+#: builtin/remote.c:1221
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Локалният указател, настроен за „git push“%s:"
 msgstr[1] "  Локалните указатели, настроени за „git push“%s:"
 
-#: builtin/remote.c:1259
+#: builtin/remote.c:1242
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "задаване на refs/remotes/ИМЕ/HEAD според отдалеченото хранилище"
 
-#: builtin/remote.c:1261
+#: builtin/remote.c:1244
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "изтриване на refs/remotes/ИМЕ/HEAD"
 
-#: builtin/remote.c:1276
+#: builtin/remote.c:1259
 msgid "Cannot determine remote HEAD"
 msgstr "Не може да се установи отдалеченият връх"
 
-#: builtin/remote.c:1278
+#: builtin/remote.c:1261
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 "Множество клони с върхове. Изберете изрично някой от тях чрез командата:"
 
-#: builtin/remote.c:1288
+#: builtin/remote.c:1271
 #, c-format
 msgid "Could not delete %s"
 msgstr "„%s“ не може да бъде изтрит"
 
-#: builtin/remote.c:1296
+#: builtin/remote.c:1279
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Неправилен указател: %s"
 
-#: builtin/remote.c:1298
+#: builtin/remote.c:1281
 #, c-format
 msgid "Could not setup %s"
 msgstr "„%s“ не може да се настрои"
 
-#: builtin/remote.c:1316
+#: builtin/remote.c:1299
 #, c-format
 msgid " %s will become dangling!"
 msgstr "„%s“ ще се превърне в обект извън клоните!"
 
-#: builtin/remote.c:1317
+#: builtin/remote.c:1300
 #, c-format
 msgid " %s has become dangling!"
 msgstr "„%s“ се превърна в обект извън клоните!"
 
-#: builtin/remote.c:1327
+#: builtin/remote.c:1310
 #, c-format
 msgid "Pruning %s"
 msgstr "Окастряне на „%s“"
 
-#: builtin/remote.c:1328
+#: builtin/remote.c:1311
 #, c-format
 msgid "URL: %s"
 msgstr "адрес: %s"
 
-#: builtin/remote.c:1351
+#: builtin/remote.c:1327
 #, c-format
 msgid " * [would prune] %s"
 msgstr " ● [ще бъде окастрено] %s"
 
-#: builtin/remote.c:1354
+#: builtin/remote.c:1330
 #, c-format
 msgid " * [pruned] %s"
 msgstr " ● [окастрено] %s"
 
-#: builtin/remote.c:1399
+#: builtin/remote.c:1375
 msgid "prune remotes after fetching"
 msgstr "окастряне на огледалата на отдалечените хранилища след доставяне"
 
-#: builtin/remote.c:1465 builtin/remote.c:1539
+#: builtin/remote.c:1441 builtin/remote.c:1498 builtin/remote.c:1566
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Няма отдалечено хранилище на име „%s“"
 
-#: builtin/remote.c:1485
+#: builtin/remote.c:1461
 msgid "add branch"
 msgstr "добавяне на клон"
 
-#: builtin/remote.c:1492
+#: builtin/remote.c:1468
 msgid "no remote specified"
 msgstr "не е указано отдалечено хранилище"
 
-#: builtin/remote.c:1514
+#: builtin/remote.c:1485
+msgid "query push URLs rather than fetch URLs"
+msgstr "запитване към адресите за изтласкване, а не за доставяне"
+
+#: builtin/remote.c:1487
+msgid "return all URLs"
+msgstr "извеждане на всички адреси"
+
+#: builtin/remote.c:1515
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr "не е зададен адрес за отдалеченото хранилище „%s“"
+
+#: builtin/remote.c:1541
 msgid "manipulate push URLs"
 msgstr "промяна на адресите за изтласкване"
 
-#: builtin/remote.c:1516
+#: builtin/remote.c:1543
 msgid "add URL"
 msgstr "добавяне на адреси"
 
-#: builtin/remote.c:1518
+#: builtin/remote.c:1545
 msgid "delete URLs"
 msgstr "изтриване на адреси"
 
 # FIXME message - incompatible
-#: builtin/remote.c:1525
+#: builtin/remote.c:1552
 msgid "--add --delete doesn't make sense"
 msgstr "опциите „--add“ и „--delete“ са несъвместими"
 
-#: builtin/remote.c:1565
+#: builtin/remote.c:1592
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Неправилен (стар) формат за адрес: %s"
 
-#: builtin/remote.c:1573
+#: builtin/remote.c:1600
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Такъв адрес не е открит: %s"
 
 # FIXME CHECK MEANING
-#: builtin/remote.c:1575
+#: builtin/remote.c:1602
 msgid "Will not delete all non-push URLs"
 msgstr "Никой от адресите, които не са за изтласкване, няма да се изтрие"
 
-#: builtin/remote.c:1589
+#: builtin/remote.c:1616
 msgid "be verbose; must be placed before a subcommand"
 msgstr "повече подробности. Поставя се пред подкоманда"
 
@@ -9518,7 +10184,11 @@
 msgid "repack objects in packs marked with .keep"
 msgstr "препакетиране на обектите в пакети белязани с „.keep“"
 
-#: builtin/repack.c:377
+#: builtin/repack.c:197
+msgid "cannot delete packs in a precious-objects repo"
+msgstr "пакетите в хранилище с важни обекти не може да се трият"
+
+#: builtin/repack.c:381
 #, c-format
 msgid "removing '%s' failed"
 msgstr "неуспешно изтриване на „%s“"
@@ -9613,7 +10283,7 @@
 msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
 msgstr "git rerere [clear | forget ПЪТ… | status | remaining | diff | gc]"
 
-#: builtin/rerere.c:57
+#: builtin/rerere.c:58
 msgid "register clean resolutions in index"
 msgstr "регистриране на чисти корекции на конфликти в индекса"
 
@@ -9706,11 +10376,6 @@
 msgid "Failed to resolve '%s' as a valid revision."
 msgstr "Стойността „%s“ не е разпозната като съществуваща версия."
 
-#: builtin/reset.c:308 builtin/reset.c:316
-#, c-format
-msgid "Could not parse object '%s'."
-msgstr "„%s“ не е разпознат като обект."
-
 #: builtin/reset.c:313
 #, c-format
 msgid "Failed to resolve '%s' as a valid tree."
@@ -9754,19 +10419,23 @@
 msgid "Could not write new index file."
 msgstr "Новият индекс не може да бъде записан."
 
-#: builtin/rev-parse.c:361
+#: builtin/rev-list.c:354
+msgid "rev-list does not support display of notes"
+msgstr "командата „rev-list“ не поддържа извеждането на бележки"
+
+#: builtin/rev-parse.c:358
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [ОПЦИЯ…] -- [АРГУМЕНТ…]"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:363
 msgid "keep the `--` passed as an arg"
 msgstr "зададеният низ „--“ да се тълкува като аргумент"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:365
 msgid "stop parsing after the first non-option argument"
 msgstr "спиране на анализа след първия аргумент, който не е опция"
 
-#: builtin/rev-parse.c:371
+#: builtin/rev-parse.c:368
 msgid "output in stuck long form"
 msgstr "изход в дългия формат"
 
@@ -9812,7 +10481,7 @@
 
 #: builtin/revert.c:81
 msgid "resume revert or cherry-pick sequence"
-msgstr "завършване на поредица от отбирания или отмени на подавания"
+msgstr "продължаване на поредица от отбирания или отмени на подавания"
 
 #: builtin/revert.c:82
 msgid "cancel revert or cherry-pick sequence"
@@ -9846,10 +10515,6 @@
 msgid "append commit name"
 msgstr "добавяне на името на подаването"
 
-#: builtin/revert.c:105
-msgid "allow fast-forward"
-msgstr "позволяване на тривиални сливания"
-
 #: builtin/revert.c:106
 msgid "preserve initially empty commits"
 msgstr "запазване на първоначално празните подавания"
@@ -9985,6 +10650,33 @@
 msgid "git rm: unable to remove %s"
 msgstr "git rm: „%s“ не може да се изтрие"
 
+#: builtin/send-pack.c:18
+msgid ""
+"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
+"receive-pack>] [--verbose] [--thin] [--atomic] [<host>:]<directory> "
+"[<ref>...]\n"
+"  --all and explicit <ref> specification are mutually exclusive."
+msgstr ""
+"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-"
+"pack=ПАКЕТ] [--verbose] [--thin] [--atomic] [ХОСТ:]ДИРЕКТОРИЯ [УКАЗАТЕЛ…]\n"
+"  опцията „--all“ и изричното посочване на УКАЗАТЕЛ са взаимно несъвместими."
+
+#: builtin/send-pack.c:160
+msgid "remote name"
+msgstr "име на отдалечено хранилище"
+
+#: builtin/send-pack.c:171
+msgid "use stateless RPC protocol"
+msgstr "използване на протокол без запазване на състоянието за RPC"
+
+#: builtin/send-pack.c:172
+msgid "read refs from stdin"
+msgstr "четене на указателите от стандартния вход"
+
+#: builtin/send-pack.c:173
+msgid "print status from remote helper"
+msgstr "извеждане на състоянието от отдалечената помощна функция"
+
 #: builtin/shortlog.c:13
 msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
 msgstr "git shortlog [ОПЦИЯ…] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] [ПЪТ…]]"
@@ -10017,7 +10709,7 @@
 "Пренасяне на редовете до тази обща ШИРОЧИНА (76), с ОТСТЪП_1 (6) за първия "
 "ред и ОТСТЪП_2 (9) за останалите"
 
-#: builtin/show-branch.c:9
+#: builtin/show-branch.c:10
 msgid ""
 "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
 "\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
@@ -10029,73 +10721,73 @@
 "    [--more=БРОЙ | --list | --independent | --merge-base]\n"
 "    [--no-name | --sha1-name] [--topics] [(РЕВИЗИЯ | УКАЗАТЕЛ)…]"
 
-#: builtin/show-branch.c:13
+#: builtin/show-branch.c:14
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=БРОЙ[,БАЗА]] [--list] [УКАЗАТЕЛ]"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:640
 msgid "show remote-tracking and local branches"
 msgstr "извеждане на следящите и локалните клони"
 
-#: builtin/show-branch.c:661
+#: builtin/show-branch.c:642
 msgid "show remote-tracking branches"
 msgstr "извеждане на следящите клони"
 
-#: builtin/show-branch.c:663
+#: builtin/show-branch.c:644
 msgid "color '*!+-' corresponding to the branch"
 msgstr "оцветяване на „*!+-“ според клоните"
 
-#: builtin/show-branch.c:665
+#: builtin/show-branch.c:646
 msgid "show <n> more commits after the common ancestor"
 msgstr "извеждане на такъв БРОЙ подавания от общия предшественик"
 
-#: builtin/show-branch.c:667
+#: builtin/show-branch.c:648
 msgid "synonym to more=-1"
 msgstr "синоним на „more=-1“"
 
-#: builtin/show-branch.c:668
+#: builtin/show-branch.c:649
 msgid "suppress naming strings"
 msgstr "без низове за имената на клоните"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:651
 msgid "include the current branch"
 msgstr "включване и на текущия клон"
 
-#: builtin/show-branch.c:672
+#: builtin/show-branch.c:653
 msgid "name commits with their object names"
 msgstr "именуване на подаванията с имената им на обекти"
 
-#: builtin/show-branch.c:674
+#: builtin/show-branch.c:655
 msgid "show possible merge bases"
 msgstr "извеждане на възможните бази за сливания"
 
-#: builtin/show-branch.c:676
+#: builtin/show-branch.c:657
 msgid "show refs unreachable from any other ref"
 msgstr "извеждане на недостижимите указатели"
 
-#: builtin/show-branch.c:678
+#: builtin/show-branch.c:659
 msgid "show commits in topological order"
 msgstr "извеждане на подаванията в топологическа подредба"
 
-#: builtin/show-branch.c:681
+#: builtin/show-branch.c:662
 msgid "show only commits not on the first branch"
 msgstr "извеждане само на подаванията, които не са от първия клон"
 
-#: builtin/show-branch.c:683
+#: builtin/show-branch.c:664
 msgid "show merges reachable from only one tip"
 msgstr "извеждане на сливанията, които могат да се достигнат само от един връх"
 
-#: builtin/show-branch.c:685
+#: builtin/show-branch.c:666
 msgid "topologically sort, maintaining date order where possible"
 msgstr ""
 "топологическа подредба, при запазване на подредбата по дата, доколкото е\n"
 "възможно"
 
-#: builtin/show-branch.c:688
+#: builtin/show-branch.c:669
 msgid "<n>[,<base>]"
 msgstr "БРОЙ[,БАЗА]"
 
-#: builtin/show-branch.c:689
+#: builtin/show-branch.c:670
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "показване на най-много БРОЙ журнални записа с начало съответната БАЗА"
 
@@ -10108,47 +10800,138 @@
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
 "hash[=ЧИСЛО]] [--abbrev[=ЧИСЛО]] [--tags] [--heads] [--] [ШАБЛОН…]"
 
-# FIXME pattern & ref-list must be in <>
 #: builtin/show-ref.c:11
-msgid "git show-ref --exclude-existing[=pattern] < ref-list"
-msgstr "git show-ref --exclude-existing[=ШАБЛОН] < СПИСЪК_С_УКАЗАТЕЛИ"
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr "git show-ref --exclude-existing[=ШАБЛОН]"
 
-#: builtin/show-ref.c:170
+#: builtin/show-ref.c:165
 msgid "only show tags (can be combined with heads)"
 msgstr "извеждане на етикетите (може да се комбинира с върховете)"
 
-#: builtin/show-ref.c:171
+#: builtin/show-ref.c:166
 msgid "only show heads (can be combined with tags)"
 msgstr "извеждане на върховете (може да се комбинира с етикетите)"
 
-#: builtin/show-ref.c:172
+#: builtin/show-ref.c:167
 msgid "stricter reference checking, requires exact ref path"
 msgstr "строга проверка на указателите, изисква се указател с пълен път"
 
-#: builtin/show-ref.c:175 builtin/show-ref.c:177
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "задължително извеждане и на указателя HEAD"
 
-#: builtin/show-ref.c:179
+#: builtin/show-ref.c:174
 msgid "dereference tags into object IDs"
 msgstr "да се извеждат идентификаторите на обектите-етикети"
 
-#: builtin/show-ref.c:181
+#: builtin/show-ref.c:176
 msgid "only show SHA1 hash using <n> digits"
 msgstr "извеждане само на този БРОЙ цифри от всяка сума по SHA1"
 
-#: builtin/show-ref.c:185
+#: builtin/show-ref.c:180
 msgid "do not print results to stdout (useful with --verify)"
 msgstr ""
 "без извеждане на резултатите на стандартния вход (полезно с опцията „--"
 "verify“)"
 
-#: builtin/show-ref.c:187
+#: builtin/show-ref.c:182
 msgid "show refs from stdin that aren't in local repository"
 msgstr ""
 "извеждане на указателите приети от стандартния вход, които липсват в "
 "локалното хранилище"
 
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr "git stripspace [-s | --strip-comments]"
+
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr "git stripspace [-c | --comment-lines]"
+
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr "пропускане на всички редове, които започват с „#“"
+
+#: builtin/stripspace.c:38
+msgid "prepend comment character and blank to each line"
+msgstr "добавяне на „# “ на всеки ред"
+
+#: builtin/submodule--helper.c:79 builtin/submodule--helper.c:167
+msgid "alternative anchor for relative paths"
+msgstr "директория за определянето на относителните пътища"
+
+#: builtin/submodule--helper.c:84
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper list [--prefix=ПЪТ] [ПЪТ…]"
+
+#: builtin/submodule--helper.c:114
+msgid "git submodule--helper name <path>"
+msgstr "git submodule--helper name ПЪТ"
+
+#: builtin/submodule--helper.c:120
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr "Във файла „.gitmodules“ липсва информация за пътя „%s“"
+
+#: builtin/submodule--helper.c:170
+msgid "where the new submodule will be cloned to"
+msgstr "къде да се клонира новият подмодул"
+
+#: builtin/submodule--helper.c:173
+msgid "name of the new submodule"
+msgstr "име на новия подмодул"
+
+#: builtin/submodule--helper.c:176
+msgid "url where to clone the submodule from"
+msgstr "адрес, от който да се клонира новият подмодул"
+
+#: builtin/submodule--helper.c:182
+msgid "depth for shallow clones"
+msgstr "дълбочина на плитките хранилища"
+
+#: builtin/submodule--helper.c:188
+msgid ""
+"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
+"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+msgstr ""
+"git submodule--helper clone [--prefix=ПЪТ] [--quiet] [--reference ХРАНИЛИЩЕ] "
+"[--name ИМЕ] [--url АДРЕС][--depth ДЪЛБОЧИНА] [--] ПЪТ…]"
+
+#: builtin/submodule--helper.c:202 builtin/submodule--helper.c:208
+#: builtin/submodule--helper.c:216
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "Директорията „%s“ не може да бъде създадена"
+
+#: builtin/submodule--helper.c:204
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr "Неуспешно клониране на адреса „%s“ в пътя „%s“ като подмодул"
+
+#: builtin/submodule--helper.c:227
+#, c-format
+msgid "cannot open file '%s'"
+msgstr "файлът „%s“ не може да бъде отворен"
+
+#: builtin/submodule--helper.c:232
+#, c-format
+msgid "could not close file %s"
+msgstr "файлът „%s“ не може да се затвори"
+
+#: builtin/submodule--helper.c:247
+#, c-format
+msgid "could not get submodule directory for '%s'"
+msgstr "директорията на подмодула „%s“ не може да бъде получена"
+
+#: builtin/submodule--helper.c:273
+msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+msgstr "ФАТАЛНА ГРЕШКА: „submodule--helper“ трябва да се стартира с подкоманда"
+
+#: builtin/submodule--helper.c:280
+#, c-format
+msgid "fatal: '%s' is not a valid submodule--helper subcommand"
+msgstr "ФАТАЛНА ГРЕШКА: „%s“ не е подкоманда на „submodule--helper“"
+
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
 msgstr "git symbolic-ref [ОПЦИЯ…] ИМЕ [УКАЗАТЕЛ]"
@@ -10169,15 +10952,15 @@
 msgid "shorten ref output"
 msgstr "кратка информация за указателя"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:358
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason"
 msgstr "причина"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:358
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason of the update"
 msgstr "причина за обновяването"
 
-#: builtin/tag.c:22
+#: builtin/tag.c:23
 msgid ""
 "git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
 "[<head>]"
@@ -10185,49 +10968,44 @@
 "git tag [-a | -s | -u ИДЕНТИФИКАТОР_НА_КЛЮЧ] [-f] [-m СЪОБЩЕНИЕ | -F ФАЙЛ] "
 "ЕТИКЕТ [ВРЪХ]"
 
-#: builtin/tag.c:23
+#: builtin/tag.c:24
 msgid "git tag -d <tagname>..."
 msgstr "git tag -d ЕТИКЕТ…"
 
 # FIXME tabulator
-#: builtin/tag.c:24
+#: builtin/tag.c:25
 msgid ""
 "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
-"\t\t[<pattern>...]"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
-"git tag -l [-nБРОЙ] [--contains ПОДАВАНЕ] [--points-at ОБЕКТ] \n"
-"           [ШАБЛОН…]"
+"git tag -l [-nБРОЙ] [--contains ПОДАВАНЕ] [--points-at ОБЕКТ]\n"
+"           [--format=ФОРМАТ] [--[no-]merged [ПОДАВАНЕ]] [ШАБЛОН…]"
 
-#: builtin/tag.c:26
+#: builtin/tag.c:27
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v ЕТИКЕТ…"
 
-#: builtin/tag.c:69
-#, c-format
-msgid "malformed object at '%s'"
-msgstr "обект със сгрешен формат при „%s“"
-
-#: builtin/tag.c:301
+#: builtin/tag.c:80
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "името на етикета е твърде дълго: „%.*s“…"
 
-#: builtin/tag.c:306
+#: builtin/tag.c:85
 #, c-format
 msgid "tag '%s' not found."
 msgstr "етикетът „%s“ не е открит."
 
-#: builtin/tag.c:321
+#: builtin/tag.c:100
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Изтрит е етикетът „%s“ (бе „%s“)\n"
 
-#: builtin/tag.c:333
+#: builtin/tag.c:112
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "етикетът „%s“ не може да бъде проверен"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:122
 #, c-format
 msgid ""
 "\n"
@@ -10240,7 +11018,7 @@
 "  %s\n"
 "Редовете, които започват с „%c“, ще бъдат пропуснати.\n"
 
-#: builtin/tag.c:347
+#: builtin/tag.c:126
 #, c-format
 msgid ""
 "\n"
@@ -10255,157 +11033,145 @@
 "Редовете, които започват с „%c“, също ще бъдат включени — може да ги "
 "изтриете вие.\n"
 
-#: builtin/tag.c:371
-#, c-format
-msgid "unsupported sort specification '%s'"
-msgstr "зададена е неподдържана подредба „%s“"
-
-#: builtin/tag.c:373
-#, c-format
-msgid "unsupported sort specification '%s' in variable '%s'"
-msgstr "зададена е неподдържана подредба „%s“ в променливата „%s“"
-
-#: builtin/tag.c:428
+#: builtin/tag.c:199
 msgid "unable to sign the tag"
 msgstr "етикетът не може да бъде подписан"
 
-#: builtin/tag.c:430
+#: builtin/tag.c:201
 msgid "unable to write tag file"
 msgstr "файлът за етикета не може да бъде запазен"
 
-#: builtin/tag.c:455
+#: builtin/tag.c:226
 msgid "bad object type."
 msgstr "неправилен вид обект."
 
-#: builtin/tag.c:468
+#: builtin/tag.c:239
 msgid "tag header too big."
 msgstr "заглавната част на етикета е прекалено дълга."
 
 # FIXME - why the ? - either we need to specify or not or it is good to specify
-#: builtin/tag.c:504
+#: builtin/tag.c:275
 msgid "no tag message?"
 msgstr "липсва съобщение за етикета"
 
-#: builtin/tag.c:510
+#: builtin/tag.c:281
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Съобщението за етикета е запазено във файла „%s“\n"
 
-# FIXME - the name of the option '--points-at'
-#: builtin/tag.c:559
-msgid "switch 'points-at' requires an object"
-msgstr "опцията „--points-at“ изисква аргумент-обект"
-
-#: builtin/tag.c:561
-#, c-format
-msgid "malformed object name '%s'"
-msgstr "неправилно име на обект „%s“"
-
-#: builtin/tag.c:589
+#: builtin/tag.c:339
 msgid "list tag names"
 msgstr "извеждане на имената на етикетите"
 
-#: builtin/tag.c:591
+#: builtin/tag.c:341
 msgid "print <n> lines of each tag message"
 msgstr "извеждане на този БРОЙ редове от всяко съобщение за етикет"
 
-#: builtin/tag.c:593
+#: builtin/tag.c:343
 msgid "delete tags"
 msgstr "изтриване на етикети"
 
-#: builtin/tag.c:594
+#: builtin/tag.c:344
 msgid "verify tags"
 msgstr "проверка на етикети"
 
-#: builtin/tag.c:596
+#: builtin/tag.c:346
 msgid "Tag creation options"
 msgstr "Опции при създаването на етикети"
 
-#: builtin/tag.c:598
+#: builtin/tag.c:348
 msgid "annotated tag, needs a message"
 msgstr "анотирането на етикети изисква съобщение"
 
-#: builtin/tag.c:600
+#: builtin/tag.c:350
 msgid "tag message"
 msgstr "съобщение за етикет"
 
-#: builtin/tag.c:602
+#: builtin/tag.c:352
 msgid "annotated and GPG-signed tag"
 msgstr "анотиран етикет с подпис по GPG"
 
-#: builtin/tag.c:606
+#: builtin/tag.c:356
 msgid "use another key to sign the tag"
 msgstr "използване на друг ключ за подписването на етикет"
 
-#: builtin/tag.c:607
+#: builtin/tag.c:357
 msgid "replace the tag if exists"
 msgstr "замяна на етикета, ако съществува"
 
-#: builtin/tag.c:609
+#: builtin/tag.c:358 builtin/update-ref.c:368
+msgid "create a reflog"
+msgstr "създаване на журнал на указателите"
+
+#: builtin/tag.c:360
 msgid "Tag listing options"
 msgstr "Опции за извеждането на етикети"
 
-#: builtin/tag.c:610
+#: builtin/tag.c:361
 msgid "show tag list in columns"
 msgstr "извеждане на списъка на етикетите по колони"
 
-#: builtin/tag.c:612
-msgid "sort tags"
-msgstr "подреждане на етикетите"
-
-#: builtin/tag.c:617 builtin/tag.c:623
+#: builtin/tag.c:362 builtin/tag.c:363
 msgid "print only tags that contain the commit"
 msgstr "извеждане само на етикетите, които съдържат подаването"
 
-#: builtin/tag.c:629
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
+msgstr "извеждане само на слетите етикети"
+
+#: builtin/tag.c:365
+msgid "print only tags that are not merged"
+msgstr "извеждане само на неслетите етикети"
+
+#: builtin/tag.c:370
 msgid "print only tags of the object"
 msgstr "извеждане само на етикетите на обекта"
 
-#: builtin/tag.c:655
+#: builtin/tag.c:399
 msgid "--column and -n are incompatible"
 msgstr "Опциите „--column“ и „-n“ са несъвместими"
 
-#: builtin/tag.c:667
-msgid "--sort and -n are incompatible"
-msgstr "Опциите „--long“ и „-n“ са несъвместими"
-
-#: builtin/tag.c:674
+#: builtin/tag.c:419
 msgid "-n option is only allowed with -l."
 msgstr "Опцията „-n“ изисква опцията „-l“."
 
-#: builtin/tag.c:676
+#: builtin/tag.c:421
 msgid "--contains option is only allowed with -l."
 msgstr "Опцията „-contains“ изисква опцията „-l“."
 
-#: builtin/tag.c:678
+#: builtin/tag.c:423
 msgid "--points-at option is only allowed with -l."
 msgstr "Опцията „-points-at“ изисква опцията „-l“."
 
+#: builtin/tag.c:425
+msgid "--merged and --no-merged option are only allowed with -l"
+msgstr "Опцииите „--merged“ и „--no-merged“ изискват опцията „-l“."
+
 # FIXME message pattern
-#: builtin/tag.c:686
+#: builtin/tag.c:433
 msgid "only one -F or -m option is allowed."
 msgstr "Опциите „-F“ и „-m“ са несъвместими."
 
-#: builtin/tag.c:706
+#: builtin/tag.c:453
 msgid "too many params"
 msgstr "Прекалено много аргументи"
 
-#: builtin/tag.c:712
+#: builtin/tag.c:459
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "„%s“ е неправилно име за етикет."
 
-#: builtin/tag.c:717
+#: builtin/tag.c:464
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "етикетът „%s“ вече съществува"
 
-#: builtin/tag.c:741
+#: builtin/tag.c:489
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Обновен етикет „%s“ (бе „%s“)\n"
 
-#: builtin/unpack-objects.c:489
+#: builtin/unpack-objects.c:490
 msgid "Unpacking objects"
 msgstr "Разпакетиране на обектите"
 
@@ -10626,21 +11392,21 @@
 msgid "git update-ref [<options>] --stdin [-z]"
 msgstr "git update-ref [ОПЦИЯ…] --stdin [-z]"
 
-#: builtin/update-ref.c:359
+#: builtin/update-ref.c:363
 msgid "delete the reference"
 msgstr "изтриване на указателя"
 
-#: builtin/update-ref.c:361
+#: builtin/update-ref.c:365
 msgid "update <refname> not the one it points to"
 msgstr "обновяване на ИМЕто_НА_УКАЗАТЕЛя, а не това, към което сочи"
 
-#: builtin/update-ref.c:362
+#: builtin/update-ref.c:366
 msgid "stdin has NUL-terminated arguments"
 msgstr ""
 "някои от елементите подадени на стандартния вход завършват с нулевия знак "
 "„NUL“"
 
-#: builtin/update-ref.c:363
+#: builtin/update-ref.c:367
 msgid "read updates from stdin"
 msgstr "изчитане на указателите от стандартния вход"
 
@@ -10656,10 +11422,14 @@
 msgid "git verify-commit [-v | --verbose] <commit>..."
 msgstr "git verify-tag [-v | --verbose] ПОДАВАНЕ…"
 
-#: builtin/verify-commit.c:75
+#: builtin/verify-commit.c:72
 msgid "print commit contents"
 msgstr "извеждане на съдържанието на подаването"
 
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:84
+msgid "print raw gpg status output"
+msgstr "извеждане на необработения изход от състоянието на „gpg“"
+
 #: builtin/verify-pack.c:54
 msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
 msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] ПАКЕТ…"
@@ -10676,89 +11446,89 @@
 msgid "git verify-tag [-v | --verbose] <tag>..."
 msgstr "git verify-tag [-v | --verbose] ЕТИКЕТ…"
 
-#: builtin/verify-tag.c:73
+#: builtin/verify-tag.c:83
 msgid "print tag contents"
 msgstr "извеждане на съдържанието на ЕТИКЕТи"
 
-#: builtin/worktree.c:11
-msgid "git worktree add [<options>] <path> <branch>"
-msgstr "git worktree add [ОПЦИЯ…] ПЪТ КЛОН"
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr "git worktree add [ОПЦИЯ…] ПЪТ [КЛОН]"
 
-#: builtin/worktree.c:12
+#: builtin/worktree.c:16
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [ОПЦИЯ…]"
 
-#: builtin/worktree.c:27
+#: builtin/worktree.c:17
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [ОПЦИЯ…]"
+
+#: builtin/worktree.c:39
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Изтриване на „worktrees/%s“: не е правилна поддиректория"
 
-#: builtin/worktree.c:33
+#: builtin/worktree.c:45
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Изтриване на „worktrees/%s“: файлът „gitdir“ не съществува"
 
-#: builtin/worktree.c:38
+#: builtin/worktree.c:50
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr ""
 "Изтриване на „worktrees/%s“: файлът „gitdir“ (%s) не може да бъде прочетен"
 
-#: builtin/worktree.c:49
+#: builtin/worktree.c:61
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Изтриване на „worktrees/%s“: неправилен файл „gitdir“"
 
-#: builtin/worktree.c:65
+#: builtin/worktree.c:77
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr ""
 "Изтриване на „worktrees/%s“: файлът „gitdir“ сочи несъществуващо "
 "местоположение"
 
-#: builtin/worktree.c:100
+#: builtin/worktree.c:112
 #, c-format
 msgid "failed to remove: %s"
 msgstr "„%s“ не може да се изтрие"
 
-#: builtin/worktree.c:186
+#: builtin/worktree.c:201
 #, c-format
 msgid "'%s' already exists"
 msgstr "„%s“ вече съществува"
 
-#: builtin/worktree.c:207
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "директорията „%s“ не може да бъде създадена"
 
-#: builtin/worktree.c:241
-msgid "unable to resolve HEAD"
-msgstr "соченото от указателя „HEAD“ не може да бъде открито"
-
-#: builtin/worktree.c:249
+#: builtin/worktree.c:271
 #, c-format
-msgid "Enter %s (identifier %s)"
-msgstr "Въведете %s (идентификатор %s)"
+msgid "Preparing %s (identifier %s)"
+msgstr "Подготвяне на %s (идентификатор %s)"
 
-#: builtin/worktree.c:281
+#: builtin/worktree.c:319
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr "Изтегляне КЛОНа, дори и да е изтеглен в друго работно дърво"
 
-#: builtin/worktree.c:283
+#: builtin/worktree.c:321
 msgid "create a new branch"
 msgstr "създаване на нов клон"
 
-#: builtin/worktree.c:285
+#: builtin/worktree.c:323
 msgid "create or reset a branch"
 msgstr "създаване или зануляване на клони"
 
-#: builtin/worktree.c:286
+#: builtin/worktree.c:324
 msgid "detach HEAD at named commit"
 msgstr "отделяне на указателя „HEAD“ към указаното подаване"
 
-#: builtin/worktree.c:292
-msgid "-b and -B are mutually exclusive"
-msgstr "опциите „-b“ и „-B“ са несъвместими"
+#: builtin/worktree.c:331
+msgid "-b, -B, and --detach are mutually exclusive"
+msgstr "Опциите „-b“, „-B“ и „--detach“ са несъвместими една с друга"
 
 #: builtin/write-tree.c:13
 msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
@@ -10776,7 +11546,7 @@
 msgid "only useful for debugging"
 msgstr "само за изчистване на грешки"
 
-#: credential-cache--daemon.c:267
+#: credential-cache--daemon.c:255
 msgid "print debugging messages to stderr"
 msgstr "извеждане на съобщенията за трасиране на стандартната грешка"
 
@@ -10792,548 +11562,350 @@
 "за\n"
 "някое определено ПОНЯТИЕ използвайте „git help ПОНЯТИЕ“."
 
-#: common-cmds.h:10
+#: common-cmds.h:9
 msgid "start a working area (see also: git help tutorial)"
 msgstr "създаване на работно дърво (погледнете: „git help tutorial“)"
 
-#: common-cmds.h:11
+#: common-cmds.h:10
 msgid "work on the current change (see also: git help everyday)"
 msgstr "работа по текущата промяна (погледнете: „git help everyday“)"
 
-#: common-cmds.h:12
+#: common-cmds.h:11
 msgid "examine the history and state (see also: git help revisions)"
 msgstr "преглед на историята и състоянието (погледнете: „git help revisions“)"
 
-#: common-cmds.h:13
+#: common-cmds.h:12
 msgid "grow, mark and tweak your common history"
 msgstr "увеличаване, отбелязване и промяна на общата история"
 
-#: common-cmds.h:14
+#: common-cmds.h:13
 msgid "collaborate (see also: git help workflows)"
 msgstr "съвместна работа (погледнете: „git help workflows“)"
 
-#: common-cmds.h:18
+#: common-cmds.h:17
 msgid "Add file contents to the index"
 msgstr "Добавяне на съдържанието на файла към индекса"
 
-#: common-cmds.h:19
-msgid "Find by binary search the change that introduced a bug"
+#: common-cmds.h:18
+msgid "Use binary search to find the commit that introduced a bug"
 msgstr "Двоично търсене на промяната, която е причинила грешка"
 
 # FIXME - should be similar to tag
-#: common-cmds.h:20
+#: common-cmds.h:19
 msgid "List, create, or delete branches"
 msgstr "Извеждане, създаване, изтриване на клони"
 
-#: common-cmds.h:21
+#: common-cmds.h:20
 msgid "Switch branches or restore working tree files"
 msgstr ""
 "Преминаване към друг клон или възстановяване на файловете в работното дърво"
 
-#: common-cmds.h:22
+#: common-cmds.h:21
 msgid "Clone a repository into a new directory"
 msgstr "Клониране на хранилище в нова директория"
 
-#: common-cmds.h:23
+#: common-cmds.h:22
 msgid "Record changes to the repository"
 msgstr "Подаване на промени в хранилището"
 
-#: common-cmds.h:24
+#: common-cmds.h:23
 msgid "Show changes between commits, commit and working tree, etc"
 msgstr "Извеждане на разликите между подаванията, версиите, работното дърво"
 
-#: common-cmds.h:25
+#: common-cmds.h:24
 msgid "Download objects and refs from another repository"
 msgstr "Изтегляне на обекти и указатели от друго хранилище"
 
-#: common-cmds.h:26
+#: common-cmds.h:25
 msgid "Print lines matching a pattern"
 msgstr "Извеждане на редовете напасващи на шаблон"
 
-#: common-cmds.h:27
+#: common-cmds.h:26
 msgid "Create an empty Git repository or reinitialize an existing one"
 msgstr "Създаване на празно хранилище на Git или зануляване на съществуващо"
 
-#: common-cmds.h:28
+#: common-cmds.h:27
 msgid "Show commit logs"
 msgstr "Извеждане на журнала с подаванията"
 
-#: common-cmds.h:29
+#: common-cmds.h:28
 msgid "Join two or more development histories together"
 msgstr "Сливане на две или повече поредици/истории от промени"
 
-#: common-cmds.h:30
+#: common-cmds.h:29
 msgid "Move or rename a file, a directory, or a symlink"
 msgstr "Преместване или преименуване на файл, директория или символна връзка"
 
-#: common-cmds.h:31
+#: common-cmds.h:30
 msgid "Fetch from and integrate with another repository or a local branch"
-msgstr "Доставяне и интегрирането на промените от друго хранилище или клон"
+msgstr "Доставяне и внасяне на промените от друго хранилище или клон"
 
-#: common-cmds.h:32
+#: common-cmds.h:31
 msgid "Update remote refs along with associated objects"
 msgstr "Обновяване на отдалечените указатели и свързаните с тях обекти"
 
-#: common-cmds.h:33
+#: common-cmds.h:32
 msgid "Forward-port local commits to the updated upstream head"
 msgstr "Пребазиране на промени към нова основа"
 
-#: common-cmds.h:34
+#: common-cmds.h:33
 msgid "Reset current HEAD to the specified state"
 msgstr "Привеждане на указателя „HEAD“ към зададеното състояние"
 
-#: common-cmds.h:35
+#: common-cmds.h:34
 msgid "Remove files from the working tree and from the index"
 msgstr "Изтриване на файлове от работното дърво и индекса"
 
-#: common-cmds.h:36
+#: common-cmds.h:35
 msgid "Show various types of objects"
 msgstr "Извеждане на различните видове обекти в Git"
 
-#: common-cmds.h:37
+#: common-cmds.h:36
 msgid "Show the working tree status"
 msgstr "Извеждане на състоянието на работното дърво"
 
 # FIXME - should be similar to branch
-#: common-cmds.h:38
+#: common-cmds.h:37
 msgid "Create, list, delete or verify a tag object signed with GPG"
 msgstr "Извеждане, създаване, изтриване, проверка на етикети подписани с GPG"
 
-#: parse-options.h:142
+#: parse-options.h:145
 msgid "expiry-date"
 msgstr "период на валидност/запазване"
 
-#: parse-options.h:157
+#: parse-options.h:160
 msgid "no-op (backward compatibility)"
 msgstr "нулева операция (за съвместимост с предишни версии)"
 
-#: parse-options.h:231
+#: parse-options.h:237
 msgid "be more verbose"
 msgstr "повече подробности"
 
-#: parse-options.h:233
+#: parse-options.h:239
 msgid "be more quiet"
 msgstr "по-малко подробности"
 
 # FIXME SHA-1 -> SHA1
-#: parse-options.h:239
+#: parse-options.h:245
 msgid "use <n> digits to display SHA-1s"
 msgstr "да се показват такъв БРОЙ цифри от сумите по SHA1"
 
-#: rerere.h:27
+#: rerere.h:38
 msgid "update the index with reused conflict resolution if possible"
 msgstr ""
 "при възможност преизползване на решението на конфликта за обновяване на "
 "индекса"
 
-#: git-am.sh:53
-msgid "You need to set your committer info first"
-msgstr "Първо трябва да зададете информация за себе си"
-
-#: git-am.sh:100
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr ""
-"Изглежда указателят „HEAD“ е променен и не сочи към същия обект както по "
-"времето\n"
-"на последното неуспешно изпълнение на „git am“. Указателят се задава да сочи "
-"към\n"
-"„ORIG_HEAD“"
-
-#: git-am.sh:110
-#, sh-format
-msgid ""
-"When you have resolved this problem, run \"$cmdline --continue\".\n"
-"If you prefer to skip this patch, run \"$cmdline --skip\" instead.\n"
-"To restore the original branch and stop patching, run \"$cmdline --abort\"."
-msgstr ""
-"След коригирането на този проблем изпълнете командата „$cmdline --"
-"continue“.\n"
-"За да прескочите тази кръпка, изпълнете командата „$cmdline --skip“.\n"
-"За да възстановите първоначалното състояние и да преустановите прилагането "
-"на \n"
-"кръпки, изпълнете командата „$cmdline --abort“."
-
-#: git-am.sh:126
-msgid "Cannot fall back to three-way merge."
-msgstr "Не може да се премине към тройно сливане."
-
-#: git-am.sh:142
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr ""
-"В хранилището липсват необходимите обекти BLOB, за да се премине към тройно "
-"сливане."
-
-#: git-am.sh:144
-msgid "Using index info to reconstruct a base tree..."
-msgstr "Базовото дърво се реконструира от информацията в индекса…"
-
-#: git-am.sh:159
-msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
-msgstr ""
-"Кръпката не може да се приложи към обектите BLOB в индекса.\n"
-"Да не би да сте я редактирали на ръка?"
-
-#: git-am.sh:168
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "Преминаване към прилагане на кръпка към базата и тройно сливане…"
-
-#: git-am.sh:185
-msgid "Failed to merge in the changes."
-msgstr "Неуспешно сливане на промените."
-
-#: git-am.sh:280
-msgid "Only one StGIT patch series can be applied at once"
-msgstr ""
-"Само една серия кръпки от „StGIT“ може да бъде прилагана в даден момент"
-
-#: git-am.sh:367
-#, sh-format
-msgid "Patch format $patch_format is not supported."
-msgstr "Неподдържан формат на кръпки: „$patch_format“."
-
-#: git-am.sh:369
-msgid "Patch format detection failed."
-msgstr "Форматът на кръпката не може да бъде определен."
-
-#: git-am.sh:407
-msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
-msgstr ""
-"Опциите „-b“/„--binary“ отдавна не правят нищо и\n"
-"ще бъдат премахнати в бъдеще. Не ги ползвайте."
-
-#: git-am.sh:507
-#, sh-format
-msgid "previous rebase directory $dotest still exists but mbox given."
-msgstr ""
-"предишната директория за пребазиране „$dotest“ все още съществува, а е "
-"зададен файл „mbox“."
-
-# FIXME better message
-#: git-am.sh:512
-msgid "Please make up your mind. --skip or --abort?"
-msgstr "Опциите „--skip“ и „--abort“ са несъвместими."
-
-#: git-am.sh:560
-#, sh-format
-msgid ""
-"Stray $dotest directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr ""
-"Открита е излишна директория „$dotest“.\n"
-"Можете да я изтриете с командата „git am --abort“."
-
-#: git-am.sh:568
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "В момента не тече операция по коригиране и няма как да се продължи."
-
-#: git-am.sh:635
-#, sh-format
-msgid "Dirty index: cannot apply patches (dirty: $files)"
-msgstr ""
-"Индексът не е чист: кръпките не могат да бъдат приложени (замърсени са: "
-"$files)"
-
-# FIXME spaces
-#: git-am.sh:747
-#, sh-format
-msgid ""
-"Patch is empty.  Was it split wrong?\n"
-"If you would prefer to skip this patch, instead run \"$cmdline --skip\".\n"
-"To restore the original branch and stop patching run \"$cmdline --abort\"."
-msgstr ""
-"Кръпката е празна. Честа причина за това е неправилно разделяне на кръпки.\n"
-"За да прескочите тази кръпка, изпълнете командата „$cmdline --skip“.\n"
-"За да възстановите първоначалното състояние и да преустановите прилагането "
-"на \n"
-"кръпки, изпълнете командата „$cmdline --abort“."
-
-#: git-am.sh:774
-msgid "Patch does not have a valid e-mail address."
-msgstr "Кръпката не съдържа валиден адрес за е-поща."
-
-#: git-am.sh:821
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr ""
-"За интерактивно изпълнение е необходимо стандартният\n"
-"изход да е свързан с терминал, а в момента не е."
-
-#: git-am.sh:825
-msgid "Commit Body is:"
-msgstr "Тялото на кръпката за прилагане е:"
-
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#: git-am.sh:832
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
-msgstr ""
-"Прилагане? „y“ — да/„n“ — не/„e“ — редактиране/„v“ — преглед/„a“ — приемане "
-"на всичко"
-
-#: git-am.sh:868
-#, sh-format
-msgid "Applying: $FIRSTLINE"
-msgstr "Прилагане: $FIRSTLINE"
-
-#: git-am.sh:889
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
-msgstr ""
-"Без промени — възможно е да не сте изпълнили „git add“.\n"
-"Ако няма друга промяна за включване в индекса, най-вероятно някоя друга\n"
-"кръпка е довела до същите промени и в такъв случай просто пропуснете тази."
-
-#: git-am.sh:897
-msgid ""
-"You still have unmerged paths in your index\n"
-"did you forget to use 'git add'?"
-msgstr ""
-"Индексът все още съдържа неслети промени — възможно е да не сте изпълнили "
-"„git add“."
-
-#: git-am.sh:913
-msgid "No changes -- Patch already applied."
-msgstr "Без промени — кръпката вече е приложена."
-
-#: git-am.sh:923
-#, sh-format
-msgid "Patch failed at $msgnum $FIRSTLINE"
-msgstr "Неуспешно прилагане на кръпката „$msgnum“: „$FIRSTLINE“"
-
-#: git-am.sh:926
-#, sh-format
-msgid ""
-"The copy of the patch that failed is found in:\n"
-"   $dotest/patch"
-msgstr ""
-"Дубликат на проблемната кръпка се намира в:\n"
-"   $dotest/patch"
-
-#: git-am.sh:945
-msgid "applying to an empty history"
-msgstr "прилагане върху празна история"
-
-#: git-bisect.sh:48
+#: git-bisect.sh:55
 msgid "You need to start by \"git bisect start\""
 msgstr "Започнете като изпълните командата „git bisect start“"
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:54
+#: git-bisect.sh:61
 msgid "Do you want me to do it for you [Y/n]? "
 msgstr "Да се извърши ли автоматично? „Y“ —  ДА, „n“ — не"
 
-#: git-bisect.sh:95
+#: git-bisect.sh:122
 #, sh-format
 msgid "unrecognised option: '$arg'"
-msgstr "непозната опция „$arg“"
+msgstr "непозната опция „${arg}“"
 
-#: git-bisect.sh:99
+#: git-bisect.sh:126
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr "„$arg“ не изглежда като указател към версия"
 
 # FIXME - I ??? the message does not convey what is actually wrong - that the "HEAD" points to sth that is unparsable
-#: git-bisect.sh:117
+#: git-bisect.sh:155
 msgid "Bad HEAD - I need a HEAD"
 msgstr "Текущият указател „HEAD“ е неправилен."
 
-#: git-bisect.sh:130
+#: git-bisect.sh:168
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
 msgstr ""
-"Неуспешно преминаване към „$start_head“. Изпълнете командата „git bisect "
+"Неуспешно преминаване към „${start_head}“. Изпълнете командата „git bisect "
 "reset СЪЩЕСТВУВАЩ_КЛОН“."
 
-#: git-bisect.sh:140
+#: git-bisect.sh:178
 msgid "won't bisect on cg-seek'ed tree"
 msgstr ""
 "не може да се търси двоично, когато е изпълнена командата „cg-seek“ от "
 "„cogito“"
 
-#: git-bisect.sh:144
+#: git-bisect.sh:182
 msgid "Bad HEAD - strange symbolic ref"
 msgstr "Неправилен указател „HEAD“"
 
-#: git-bisect.sh:189
+#: git-bisect.sh:234
 #, sh-format
 msgid "Bad bisect_write argument: $state"
-msgstr "Неправилен аргумент на функцията „bisect_write“: „$state“"
+msgstr "Неправилен аргумент на функцията „bisect_write“: „${state}“"
 
-#: git-bisect.sh:218
+#: git-bisect.sh:263
 #, sh-format
 msgid "Bad rev input: $arg"
-msgstr "Неправилна версия: „$arg“"
+msgstr "Неправилна версия: „${arg}“"
 
-#: git-bisect.sh:232
+#: git-bisect.sh:278
 msgid "Please call 'bisect_state' with at least one argument."
 msgstr "Функцията „bisect_state“ изисква поне един аргумент."
 
-#: git-bisect.sh:244
+#: git-bisect.sh:290
 #, sh-format
 msgid "Bad rev input: $rev"
-msgstr "Неправилна версия: „$rev“"
+msgstr "Неправилна версия: „${rev}“"
 
-#: git-bisect.sh:253
-msgid "'git bisect bad' can take only one argument."
-msgstr "Командата „git bisect bad“ приема само един аргумент."
+#: git-bisect.sh:299
+#, sh-format
+msgid "'git bisect $TERM_BAD' can take only one argument."
+msgstr "Командата „git bisect ${TERM_BAD}“ приема само един аргумент."
 
-#: git-bisect.sh:276
-msgid "Warning: bisecting only with a bad commit."
-msgstr "ПРЕДУПРЕЖДЕНИЕ: двоично търсене само по лошо подаване."
+#: git-bisect.sh:322
+#, sh-format
+msgid "Warning: bisecting only with a $TERM_BAD commit."
+msgstr "ПРЕДУПРЕЖДЕНИЕ: двоично търсене само по ${TERM_BAD} подаване."
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:282
+#: git-bisect.sh:328
 msgid "Are you sure [Y/n]? "
 msgstr "Да се продължи ли? „Y“ —  ДА, „n“ — не"
 
-# FIXME me?
-#: git-bisect.sh:292
+#: git-bisect.sh:340
+#, sh-format
 msgid ""
-"You need to give me at least one good and one bad revision.\n"
-"(You can use \"git bisect bad\" and \"git bisect good\" for that.)"
+"You need to give me at least one $bad_syn and one $good_syn revision.\n"
+"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
 msgstr ""
-"Трябва да зададете поне една добра и една лоша версия. (Това може да се\n"
-"направи съответно и чрез командите „git bisect bad“ и „git bisect good“.)"
+"Трябва да зададете поне една ${bad_syn} и една ${good_syn} версия. (Това "
+"може да се\n"
+"направи съответно и чрез командите „git bisect ${bad_syn}“ и „git bisect "
+"${good_syn}“.)"
 
-# FIXME me
-#: git-bisect.sh:295
+#: git-bisect.sh:343
+#, sh-format
 msgid ""
 "You need to start by \"git bisect start\".\n"
-"You then need to give me at least one good and one bad revision.\n"
-"(You can use \"git bisect bad\" and \"git bisect good\" for that.)"
+"You then need to give me at least one $good_syn and one $bad_syn revision.\n"
+"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
 msgstr ""
 "Трябва да започнете двоичното търсене чрез командата „git bisect start“.\n"
 "трябва да зададете поне една добра и една лоша версия. (Това може да се\n"
-"направи съответно и чрез командите „git bisect bad“ и „git bisect good“.)"
+"направи съответно и чрез командите „git bisect ${bad_syn}“ и „git bisect "
+"${good_syn}“.)"
 
-#: git-bisect.sh:366 git-bisect.sh:493
+#: git-bisect.sh:414 git-bisect.sh:546
 msgid "We are not bisecting."
 msgstr "В момента не се извършва двоично търсене."
 
-#: git-bisect.sh:373
+#: git-bisect.sh:421
 #, sh-format
 msgid "'$invalid' is not a valid commit"
-msgstr "„$invalid“ е неправилно подаване"
+msgstr "„${invalid}“ е неправилно подаване"
 
-#: git-bisect.sh:382
+#: git-bisect.sh:430
 #, sh-format
 msgid ""
 "Could not check out original HEAD '$branch'.\n"
 "Try 'git bisect reset <commit>'."
 msgstr ""
-"Първоначално указаният клон „$branch“ в указателя „HEAD“ не може да бъде\n"
+"Първоначално указаният клон „${branch}“ в указателя „HEAD“ не може да бъде\n"
 "изтеглен. Пробвайте да изпълните командата „git bisect reset ПОДАВАНЕ“."
 
-#: git-bisect.sh:409
+#: git-bisect.sh:458
 msgid "No logfile given"
 msgstr "Не е зададен журнален файл"
 
-#: git-bisect.sh:410
+#: git-bisect.sh:459
 #, sh-format
 msgid "cannot read $file for replaying"
 msgstr ""
-"Журналният файл „$file“ не може да бъде прочетен, за да се изпълнят "
+"Журналният файл „${file}“ не може да бъде прочетен, за да се изпълнят "
 "командите от него наново"
 
 # FIXME WTF
-#: git-bisect.sh:427
+#: git-bisect.sh:480
 msgid "?? what are you talking about?"
 msgstr ""
 "Непозната команда. Възможните варианти са: „start“, „good“, „bad“, „skip“"
 
-#: git-bisect.sh:439
+#: git-bisect.sh:492
 #, sh-format
 msgid "running $command"
-msgstr "изпълнение на командата „$command“"
+msgstr "изпълнение на командата „${command}“"
 
-#: git-bisect.sh:446
+#: git-bisect.sh:499
 #, sh-format
 msgid ""
 "bisect run failed:\n"
 "exit code $res from '$command' is < 0 or >= 128"
 msgstr ""
 "неуспешно двоично търсене:\n"
-"изходният код от командата „$command“ е $res — това е извън интервала [0, "
-"128)"
+"изходният код от командата „${command}“ е ${res} — това е извън интервала "
+"[0, 128)"
 
-#: git-bisect.sh:472
+#: git-bisect.sh:525
 msgid "bisect run cannot continue any more"
 msgstr "двоичното търсене не може да продължи"
 
 # FIXME initial space
-#: git-bisect.sh:478
+#: git-bisect.sh:531
 #, sh-format
 msgid ""
 "bisect run failed:\n"
 "'bisect_state $state' exited with error code $res"
 msgstr ""
 "неуспешно двоично търсене:\n"
-"функцията „bisect_state $state“ завърши с код за грешка $res"
+"функцията „bisect_state ${state}“ завърши с код за грешка ${res}"
 
-#: git-bisect.sh:485
+#: git-bisect.sh:538
 msgid "bisect run success"
 msgstr "успешно двоично търсене"
 
-#: git-pull.sh:61
-msgid ""
-"Pull is not possible because you have unmerged files.\n"
-"Please, fix them up in the work tree, and then use 'git add/rm <file>'\n"
-"as appropriate to mark resolution and make a commit."
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr "използвайте две различни управляващи думи"
+
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr "„${term}“ не е правилна управляваща дума"
+
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
 msgstr ""
-"Невъзможно е да издърпвате в момента, защото някои файлове не са слети. "
-"Трябва\n"
-"да ги прегледате, коригирате, ако е необходимо и да ги добавите или извадите "
-"от\n"
-"индекса с командата „git add/rm ФАЙЛ“, след което трябва да подадете "
-"промените."
+"„${term}“ е вградена команда и не може да се използва като управляваща дума"
 
-#: git-pull.sh:65
-msgid "Pull is not possible because you have unmerged files."
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr "не може да смените значението на управляващата дума „${term}“"
+
+#: git-bisect.sh:606
+#, sh-format
+msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
 msgstr ""
-"Невъзможно е да издърпвате в момента, защото някои файлове не са слети."
+"Неправилна команда: в момента се изпълнява двоично търсене по ${TERM_BAD}/"
+"${TERM_GOOD}."
 
-#: git-pull.sh:71
-msgid ""
-"You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you can merge."
-msgstr ""
-"Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува).\n"
-"Подайте промените си, преди да започнете ново сливане."
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "не са указани управляващи думи"
 
-#: git-pull.sh:285
-msgid "updating an unborn branch with changes added to the index"
-msgstr "обновяване на все още несъздаден клон с промените от индекса"
-
-#: git-pull.sh:311
+#: git-bisect.sh:653
 #, sh-format
 msgid ""
-"Warning: fetch updated the current branch head.\n"
-"Warning: fast-forwarding your working tree from\n"
-"Warning: commit $orig_head."
+"invalid argument $arg for 'git bisect terms'.\n"
+"Supported options are: --term-good|--term-old and --term-bad|--term-new."
 msgstr ""
-"ПРЕДУПРЕЖДЕНИЕ: доставянето обнови върха на текущия клон. Работното ви\n"
-"ПРЕДУПРЕЖДЕНИЕ: копие бе тривиално слято от подаване „$orig_head“."
-
-#: git-pull.sh:336
-msgid "Cannot merge multiple branches into empty head"
-msgstr "Не може да сливате множество клони в празен върхов указател"
-
-#: git-pull.sh:340
-msgid "Cannot rebase onto multiple branches"
-msgstr "Не може да пребазирате върху повече от един клон"
+"на „git bisect terms“ е подаден неправилен аргумент „${arg}“\n"
+"Поддържат се опциите „--term-good|--term-old“ и „--term-bad|--term-new“."
 
 #: git-rebase.sh:57
 msgid ""
@@ -11354,7 +11926,7 @@
 #: git-rebase.sh:168
 #, sh-format
 msgid "Cannot store $stash_sha1"
-msgstr "„$stash_sha1“ не може да бъде запазен"
+msgstr "„${stash_sha1}“ не може да бъде запазен"
 
 #: git-rebase.sh:169
 msgid ""
@@ -11376,25 +11948,24 @@
 "Изглежда, че сега се прилагат кръпки чрез командата „git-am“. Не може да "
 "пребазирате в момента."
 
-#: git-rebase.sh:351
+#: git-rebase.sh:354
 msgid "The --exec option must be used with the --interactive option"
 msgstr "Опцията „--exec“ задължително изисква опцията „--interactive“"
 
-# FIXME message
-#: git-rebase.sh:356
+#: git-rebase.sh:359
 msgid "No rebase in progress?"
 msgstr "Изглежда в момента не тече пребазиране"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:370
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "Опцията „--edit-todo“ е достъпна само по време на интерактивно пребазиране."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:377
 msgid "Cannot read HEAD"
 msgstr "Указателят „HEAD“ не може да бъде прочетен"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:380
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -11402,13 +11973,12 @@
 "Трябва да редактирате всички конфликти при сливането. След това\n"
 "отбележете коригирането им чрез командата „git add“"
 
-#: git-rebase.sh:395
+#: git-rebase.sh:398
 #, sh-format
 msgid "Could not move back to $head_name"
-msgstr "Връщането към „$head_name“ е невъзможно"
+msgstr "Връщането към „${head_name}“ е невъзможно"
 
-# FIXME tabulators, I, double spaces
-#: git-rebase.sh:414
+#: git-rebase.sh:417
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11420,83 +11990,81 @@
 "and run me again.  I am stopping in case you still have something\n"
 "valuable there."
 msgstr ""
-"Вече съществува директория „$state_dir_base directory“. Възможно ли е да "
-"сте\n"
+"Вече съществува директория „${state_dir_base}“. Възможно ли е да сте\n"
 "в процес на друго пребазиране? Ако това е така, изпълнете:\n"
-"    $cmd_live_rebase\n"
+"    ${cmd_live_rebase}\n"
 "Ако не сте в процес на друго пребазиране, изпълнете:\n"
-"    $cmd_clear_stale_rebase\n"
+"    ${cmd_clear_stale_rebase}\n"
 "и отново започнете пребазирането. Текущото пребазиране се преустановява, за\n"
 "да не загубите случайно промени."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:468
 #, sh-format
 msgid "invalid upstream $upstream_name"
-msgstr "неправилна основа за сравнение „$upstream_name“"
+msgstr "неправилна основа за сравнение „${upstream_name}“"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:492
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr ""
-"указателят „$onto_name“ може да сочи към повече от една основа за "
+"указателят „${onto_name}“ може да сочи към повече от една основа за "
 "пребазирането"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:495 git-rebase.sh:499
 #, sh-format
 msgid "$onto_name: there is no merge base"
-msgstr "указателят „$onto_name“ не сочи към никаква основа за пребазирането"
+msgstr "указателят „${onto_name}“ не сочи към никаква основа за пребазирането"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:504
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
-msgstr "Указателят „$onto_name“ не сочи към подаване"
+msgstr "Указателят „${onto_name}“ не сочи към подаване"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:527
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
-msgstr "фатална грешка: не съществува клон „$branch_name“"
+msgstr "ФАТАЛНА ГРЕШКА: не съществува клон „${branch_name}“"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:560
 msgid "Cannot autostash"
 msgstr "Не може да се скатае автоматично"
 
-#: git-rebase.sh:562
+#: git-rebase.sh:565
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
-msgstr "Автоматично скатано: „$stash_abbrev“"
+msgstr "Автоматично скатано: „${stash_abbrev}“"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:569
 msgid "Please commit or stash them."
 msgstr "Промените трябва или да се подадат, или да се скатаят."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:589
 #, sh-format
 msgid "Current branch $branch_name is up to date."
-msgstr "Текущият клон „$branch_name“ е напълно актуален."
+msgstr "Текущият клон „${branch_name}“ е напълно актуален."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:593
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr ""
-"Текущият клон „$branch_name“ е напълно актуален. Пребазирането е "
+"Текущият клон „${branch_name}“ е напълно актуален. Пребазирането е "
 "принудително."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:604
 #, sh-format
 msgid "Changes from $mb to $onto:"
-msgstr "Промените от „$mb“ към „$onto“:"
+msgstr "Промените от „${mb}“ към „${onto}“:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:613
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Първо, указателят „HEAD“ започва да сочи към базата, върху която пребазирате…"
 
-#: git-rebase.sh:620
+#: git-rebase.sh:623
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
-msgstr "Тривиално сливане на „$branch_name“ върху „$onto_name“."
+msgstr "Тривиално сливане на „${branch_name}“ върху „${onto_name}“."
 
-# FIXME - should 'clear' not take parameters in principle?
 #: git-stash.sh:51
 msgid "git stash clear with parameters is unimplemented"
 msgstr "Командата „git stash clear“ не поддържа аргументи"
@@ -11517,7 +12085,6 @@
 msgid "No changes selected"
 msgstr "Не са избрани никакви промени"
 
-# FIXME can't happen??? може, може
 #: git-stash.sh:144
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Временният индекс не може да бъде изтрит"
@@ -11526,11 +12093,11 @@
 msgid "Cannot record working tree state"
 msgstr "Състоянието на работното дърво не може да бъде запазено"
 
-#: git-stash.sh:191
+#: git-stash.sh:189
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr ""
-"Указателят „$ref_stash“ не може да бъде обновен да сочи към „$w_commit“"
+"Указателят „${ref_stash}“ не може да бъде обновен да сочи към „${w_commit}“"
 
 #. TRANSLATORS: $option is an invalid option, like
 #. `--blah-blah'. The 7 spaces at the beginning of the
@@ -11542,144 +12109,129 @@
 #. $ git stash save --blah-blah 2>&1 | head -n 2
 #. error: unknown option for 'stash save': --blah-blah
 #. To provide a message, use git stash save -- '--blah-blah'
-#: git-stash.sh:241
+#: git-stash.sh:239
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
 "       To provide a message, use git stash save -- '$option'"
 msgstr ""
-"грешка: командата „git stash save“ не поддържа опция „$option“\n"
-"        За да зададете съобщение, изпълнете „git stash save -- '$option'“"
+"грешка: командата „git stash save“ не поддържа опция „${option}“\n"
+"        За да зададете съобщение, изпълнете „git stash save -- '${option}'“"
 
-#: git-stash.sh:262
+#: git-stash.sh:260
 msgid "No local changes to save"
 msgstr "Няма никакви локални промени за скатаване"
 
-#: git-stash.sh:266
+#: git-stash.sh:264
 msgid "Cannot initialize stash"
 msgstr "Скатаването не може да стартира"
 
-#: git-stash.sh:270
+#: git-stash.sh:268
 msgid "Cannot save the current status"
 msgstr "Текущото състояние не може да бъде запазено"
 
-#: git-stash.sh:288
+#: git-stash.sh:286
 msgid "Cannot remove worktree changes"
 msgstr "Промените в работното дърво не могат да бъдат занулени"
 
-#: git-stash.sh:389
+#: git-stash.sh:405
 #, sh-format
 msgid "unknown option: $opt"
-msgstr "непозната опция: $opt"
+msgstr "непозната опция: ${opt}"
 
-#: git-stash.sh:399
+#: git-stash.sh:415
 msgid "No stash found."
 msgstr "Не е открито нищо скатано."
 
-#: git-stash.sh:406
+#: git-stash.sh:422
 #, sh-format
 msgid "Too many revisions specified: $REV"
-msgstr "Указани са прекалено много версии: „$REV“"
+msgstr "Указани са прекалено много версии: „${REV}“"
 
-#: git-stash.sh:412
+#: git-stash.sh:428
 #, sh-format
 msgid "$reference is not a valid reference"
-msgstr "Указателят „$reference“ е грешен"
+msgstr "Указателят „${reference}“ е грешен"
 
-#: git-stash.sh:440
+#: git-stash.sh:456
 #, sh-format
 msgid "'$args' is not a stash-like commit"
-msgstr "„$args“ не е подаване, приличащо на нещо скатано"
+msgstr "„${args}“ не е подаване, приличащо на нещо скатано"
 
-#: git-stash.sh:451
+#: git-stash.sh:467
 #, sh-format
 msgid "'$args' is not a stash reference"
-msgstr "„$args“ не е указател към нещо скатано"
+msgstr "„${args}“ не е указател към нещо скатано"
 
-#: git-stash.sh:459
+#: git-stash.sh:475
 msgid "unable to refresh index"
 msgstr "индексът не може да бъде обновен"
 
-#: git-stash.sh:463
+#: git-stash.sh:479
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "По време на сливане не може да приложите нещо скатано"
 
-#: git-stash.sh:471
+#: git-stash.sh:487
 msgid "Conflicts in index. Try without --index."
 msgstr ""
 "В индекса има конфликти. Пробвайте да изпълните командата без опцията „--"
 "index“."
 
-#: git-stash.sh:473
+#: git-stash.sh:489
 msgid "Could not save index tree"
 msgstr "Дървото сочено от индекса не може да бъде запазено"
 
-#: git-stash.sh:507
+#: git-stash.sh:523
 msgid "Cannot unstage modified files"
 msgstr "Променените файлове не могат да бъдат извадени от индекса"
 
-#: git-stash.sh:522
+#: git-stash.sh:538
 msgid "Index was not unstashed."
 msgstr "Индексът не е скатан."
 
-#: git-stash.sh:545
+#: git-stash.sh:561
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Изтрито е скатаното „${REV}“ ($s)"
 
-#: git-stash.sh:546
+#: git-stash.sh:562
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "Скатаното „${REV}“ не може да бъде изтрито"
 
-#: git-stash.sh:554
+#: git-stash.sh:570
 msgid "No branch name specified"
 msgstr "Не е указано име на клон"
 
-#: git-stash.sh:626
+#: git-stash.sh:642
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(За да ги възстановите, изпълнете командата „git stash apply“)"
 
-#: git-submodule.sh:95
+#: git-submodule.sh:104
 #, sh-format
 msgid "cannot strip one component off url '$remoteurl'"
-msgstr "не може да се махне компонент от адреса „$remoteurl“"
+msgstr "не може да се махне компонент от адреса „${remoteurl}“"
 
-#: git-submodule.sh:237
-#, sh-format
-msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
-msgstr "Във файла „.gitmodules“ липсва информация за пътя „$sm_path“"
-
-#: git-submodule.sh:287
-#, sh-format
-msgid "Clone of '$url' into submodule path '$sm_path' failed"
-msgstr "Неуспешно клониране на адреса „$url“ в пътя „$sm_path“ като подмодул"
-
-#: git-submodule.sh:296
-#, sh-format
-msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-msgstr "Директорията в Git „$a“ е част от пътя на подмодула „$b“ или обратно"
-
-#: git-submodule.sh:406
+#: git-submodule.sh:281
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 "Относителен път може да се ползва само от основната директория на работното "
 "дърво"
 
 # FIXME - what is this regex?
-#: git-submodule.sh:416
+#: git-submodule.sh:291
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr ""
-"адрес на хранилище: „$repo“ трябва или да е абсолютен, или да започва с „./“ "
-"или „../“"
+"адрес на хранилище: „${repo}“ трябва или да е абсолютен, или да започва с "
+"„./“ или „../“"
 
-#: git-submodule.sh:433
+#: git-submodule.sh:308
 #, sh-format
 msgid "'$sm_path' already exists in the index"
-msgstr "„$sm_path“ вече съществува в индекса"
+msgstr "„${sm_path}“ вече съществува в индекса"
 
-#: git-submodule.sh:437
+#: git-submodule.sh:312
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -11687,27 +12239,27 @@
 "Use -f if you really want to add it."
 msgstr ""
 "Следният път се игнорира поради някой от файловете „.gitignore“:\n"
-"$sm_path\n"
+"${sm_path}\n"
 "Използвайте опцията „-f“, ако за да го добавите наистина."
 
-#: git-submodule.sh:455
+#: git-submodule.sh:330
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
-msgstr "Добавяне на съществуващото хранилище в „$sm_path“ към индекса"
+msgstr "Добавяне на съществуващото хранилище в „${sm_path}“ към индекса"
 
-#: git-submodule.sh:457
+#: git-submodule.sh:332
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
-msgstr "„$sm_path“ съществува, а не е хранилище на Git"
+msgstr "„${sm_path}“ съществува, а не е хранилище на Git"
 
-#: git-submodule.sh:465
+#: git-submodule.sh:340
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
-"Открита е локална директория на Git — „$sm_name“, която сочи към "
+"Открита е локална директория на Git — „${sm_name}“, която сочи към "
 "отдалечените хранилища:"
 
-#: git-submodule.sh:467
+#: git-submodule.sh:342
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
@@ -11715,7 +12267,7 @@
 "Ако искате да преизползвате тази локална директория на Git вместо да отново "
 "да клонирате:"
 
-#: git-submodule.sh:469
+#: git-submodule.sh:344
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
@@ -11723,7 +12275,7 @@
 "използвайте опцията „--force“. Ако локалната директория не сочи към "
 "правилното отдалечено хранилище"
 
-#: git-submodule.sh:470
+#: git-submodule.sh:345
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -11733,75 +12285,77 @@
 "аргумент на опцията „--name“."
 
 # FIXME активиране - какво всъщност става
-#: git-submodule.sh:472
+#: git-submodule.sh:347
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
-msgstr "Активиране на локалното хранилище за подмодула „$sm_name“ наново."
+msgstr "Активиране на локалното хранилище за подмодула „${sm_name}“ наново."
 
-#: git-submodule.sh:484
+#: git-submodule.sh:359
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
-msgstr "Подмодулът „$sm_path“ не може да бъде изтеглен"
+msgstr "Подмодулът „${sm_path}“ не може да бъде изтеглен"
 
-#: git-submodule.sh:489
+#: git-submodule.sh:364
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
-msgstr "Неуспешно добавяне на подмодула „$sm_path“"
+msgstr "Неуспешно добавяне на подмодула „${sm_path}“"
 
-#: git-submodule.sh:498
+#: git-submodule.sh:373
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
-msgstr "Неуспешно регистриране на подмодула „$sm_path“"
+msgstr "Неуспешно регистриране на подмодула „${sm_path}“"
 
-#: git-submodule.sh:542
+#: git-submodule.sh:417
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
-msgstr "Влизане в „$prefix$displaypath“"
+msgstr "Влизане в „${prefix}${displaypath}“"
 
-#: git-submodule.sh:562
+#: git-submodule.sh:437
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr ""
-"Спиране при „$prefix$displaypath“ — изходният код от скрипта бе различен от "
-"0."
+"Спиране при „${prefix}${displaypath}“ — изходният код от скрипта бе различен "
+"от 0."
 
-#: git-submodule.sh:608
+#: git-submodule.sh:483
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr ""
-"Във файла „.gitmodules“ не е открит адрес за пътя към подмодул „$displaypath“"
+"Във файла „.gitmodules“ не е открит адрес за пътя към подмодул "
+"„${displaypath}“"
 
-#: git-submodule.sh:617
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
-msgstr "Неуспешно регистриране на адрес за пътя към подмодул „$displaypath“"
+msgstr "Неуспешно регистриране на адрес за пътя към подмодул „${displaypath}“"
 
-#: git-submodule.sh:619
+#: git-submodule.sh:494
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr ""
-"Регистриран е подмодул „$name“, сочещ към адрес „$url“, за пътя към подмодул "
-"„$displaypath“"
+"Регистриран е подмодул „${name}“, сочещ към адрес „${url}“, за пътя към "
+"подмодул „${displaypath}“"
 
-#: git-submodule.sh:636
+#: git-submodule.sh:511
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr ""
 "Неуспешно регистриране на режима на обновяване за пътя към подмодул "
-"„$displaypath“"
+"„${displaypath}“"
 
-#: git-submodule.sh:674
+#: git-submodule.sh:549
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr "Използвайте „.“, за да премахнете всички подмодули"
 
-#: git-submodule.sh:691
+#: git-submodule.sh:566
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr ""
-"Пътят към подмодул „$displaypath“ в работното дърво съдържа директория „.git“"
+"Пътят към подмодул „${displaypath}“ в работното дърво съдържа директория „."
+"git“"
 
-#: git-submodule.sh:692
+#: git-submodule.sh:567
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -11809,153 +12363,156 @@
 "(използвайте командата „rm -rf“, за да го изтриете заедно с цялата му "
 "история)"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:573
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
 "discard them"
 msgstr ""
-"Пътят към подмодул „$displaypath“ в работното дърво съдържа локални промени. "
-"Можете да ги пренебрегнете и отмените с опцията „-f“"
+"Пътят към подмодул „${displaypath}“ в работното дърво съдържа локални "
+"промени. Можете да ги пренебрегнете и отмените с опцията „-f“"
 
-#: git-submodule.sh:701
+#: git-submodule.sh:576
 #, sh-format
 msgid "Cleared directory '$displaypath'"
-msgstr "Директорията „$displaypath“ е изчистена"
+msgstr "Директорията „${displaypath}“ е изчистена"
 
-#: git-submodule.sh:702
+#: git-submodule.sh:577
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
-"Директорията към работното дърво на подмодула „$displaypath“ не може да бъде "
-"изтрита"
+"Директорията към работното дърво на подмодула „${displaypath}“ не може да "
+"бъде изтрита"
 
-#: git-submodule.sh:705
+#: git-submodule.sh:580
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
-"Празната директория за подмодула „$displaypath“ не може да бъде създадена"
+"Празната директория за подмодула „${displaypath}“ не може да бъде създадена"
 
-#: git-submodule.sh:714
+#: git-submodule.sh:589
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
-"Премахната е регистрацията на подмодул „$name“, сочещ към адрес „$url“, за "
-"пътя „$displaypath“"
+"Премахната е регистрацията на подмодул „${name}“, сочещ към адрес „${url}“, "
+"за пътя „${displaypath}“"
 
-#: git-submodule.sh:830
+#: git-submodule.sh:705
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
 "Maybe you want to use 'update --init'?"
 msgstr ""
-"Пътят към подмодул „$displaypath“ не е инициализиран.\n"
+"Пътят към подмодул „${displaypath}“ не е инициализиран.\n"
 "Пробвайте с командата „update --init“."
 
-#: git-submodule.sh:843
+#: git-submodule.sh:718
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
-msgstr "Текущата версия за подмодула в „$displaypath“ липсва"
+msgstr "Текущата версия за подмодула в „${displaypath}“ липсва"
 
-#: git-submodule.sh:852
+#: git-submodule.sh:727
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
-msgstr "Неуспешно доставяне в пътя към подмодул „$sm_path“"
+msgstr "Неуспешно доставяне в пътя към подмодул „${sm_path}“"
 
-#: git-submodule.sh:876
+#: git-submodule.sh:751
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
-msgstr "Неуспешно доставяне в пътя към подмодул „$displaypath“"
+msgstr "Неуспешно доставяне в пътя към подмодул „${displaypath}“"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:765
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr ""
-"Неуспешно изтегляне на версия „$sha1“ в пътя към подмодул „$displaypath“'"
+"Неуспешно изтегляне на версия „${sha1}“ в пътя към подмодул „${displaypath}“'"
 
-#: git-submodule.sh:891
+#: git-submodule.sh:766
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "Път към подмодул „$displaypath“: изтеглена е версия „$sha1“"
+msgstr "Път към подмодул „${displaypath}“: изтеглена е версия „${sha1}“"
 
-#: git-submodule.sh:895
+#: git-submodule.sh:770
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
-"Неуспешно пребазиране на версия „$sha1“ в пътя към подмодул „$displaypath“"
+"Неуспешно пребазиране на версия „${sha1}“ в пътя към подмодул "
+"„${displaypath}“"
 
-#: git-submodule.sh:896
+#: git-submodule.sh:771
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
-msgstr "Път към подмодул „$displaypath“: пребазиране върху версия „$sha1“"
+msgstr "Път към подмодул „${displaypath}“: пребазиране върху версия „${sha1}“"
 
-#: git-submodule.sh:901
+#: git-submodule.sh:776
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
-msgstr "Неуспешно сливане на версия „$sha1“ в пътя към подмодул „$displaypath“"
+msgstr ""
+"Неуспешно сливане на версия „${sha1}“ в пътя към подмодул „${displaypath}“"
 
-#: git-submodule.sh:902
+#: git-submodule.sh:777
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
-msgstr "Път към подмодул „$displaypath“: сливане с версия „$sha1“"
+msgstr "Път към подмодул „${displaypath}“: сливане с версия „${sha1}“"
 
-# FIXME spaces
-#: git-submodule.sh:907
+#: git-submodule.sh:782
 #, sh-format
 msgid ""
-"Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
+"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
 msgstr ""
-"Неуспешно изпълнение на командата „$command $sha1“ в пътя към подмодул "
-"„$prefix$sm_path“"
+"Неуспешно изпълнение на командата „${command} ${sha1}“ в пътя към подмодул "
+"„${prefix}${sm_path}“"
 
-#: git-submodule.sh:908
+#: git-submodule.sh:783
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
-msgstr "Път към подмодул „$prefix$sm_path“: „$command $sha1“"
+msgstr "Път към подмодул „${prefix}${sm_path}“: „${command} ${sha1}“"
 
-#: git-submodule.sh:938
+#: git-submodule.sh:813
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr ""
-"Неуспешна обработка на поддиректориите в пътя към подмодул „$displaypath“"
+"Неуспешна обработка на поддиректориите в пътя към подмодул „${displaypath}“"
 
-# FIXME message
-#: git-submodule.sh:1046
+#: git-submodule.sh:921
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Опциите „--cached“ и „--files“ са несъвместими"
 
-#: git-submodule.sh:1098
+#: git-submodule.sh:973
 #, sh-format
 msgid "unexpected mode $mod_dst"
-msgstr "неочакван режим „$mod_dst“"
+msgstr "неочакван режим „${mod_dst}“"
 
-#: git-submodule.sh:1118
+#: git-submodule.sh:993
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
-msgstr "  ПРЕДУПРЕЖДЕНИЕ: „$display_name“ не съдържа подаването „$sha1_src“"
+msgstr ""
+"  ПРЕДУПРЕЖДЕНИЕ: „${display_name}“ не съдържа подаването „${sha1_src}“"
 
-#: git-submodule.sh:1121
+#: git-submodule.sh:996
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
-msgstr "  ПРЕДУПРЕЖДЕНИЕ: „$display_name“ не съдържа подаването „$sha1_dst“"
+msgstr ""
+"  ПРЕДУПРЕЖДЕНИЕ: „${display_name}“ не съдържа подаването „${sha1_dst}“"
 
-#: git-submodule.sh:1124
+#: git-submodule.sh:999
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
-"  ПРЕДУПРЕЖДЕНИЕ: „$display_name“ не съдържа никое от подаванията "
-"„$sha1_src“ и „$sha1_dst“"
+"  ПРЕДУПРЕЖДЕНИЕ: „${display_name}“ не съдържа никое от подаванията "
+"„${sha1_src}“ и „${sha1_dst}“"
 
-#: git-submodule.sh:1149
+#: git-submodule.sh:1024
 msgid "blob"
 msgstr "обект BLOB"
 
-#: git-submodule.sh:1267
+#: git-submodule.sh:1142
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
-msgstr "Неуспешна обработка на поддиректориите в пътя към подмодул „$sm_path“"
+msgstr ""
+"Неуспешна обработка на поддиректориите в пътя към подмодул „${sm_path}“"
 
-#: git-submodule.sh:1331
+#: git-submodule.sh:1206
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
-msgstr "Синхронизиране на адреса за пътя към подмодул „$displaypath“"
+msgstr "Синхронизиране на адреса за пътя към подмодул „${displaypath}“"
diff --git a/po/ca.po b/po/ca.po
index c92a18c..d364141 100644
--- a/po/ca.po
+++ b/po/ca.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: 2015-09-15 06:45+0800\n"
-"PO-Revision-Date: 2015-09-14 21:05-0600\n"
+"POT-Creation-Date: 2015-12-22 22:50+0800\n"
+"PO-Revision-Date: 2015-12-27 21:42-0700\n"
 "Last-Translator: Alex Henrie <alexhenrie24@gmail.com>\n"
 "Language-Team: Catalan\n"
 "Language: ca\n"
@@ -16,7 +16,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.8.4\n"
+"X-Generator: Poedit 1.8.6\n"
 
 #: advice.c:55
 #, c-format
@@ -32,12 +32,12 @@
 "'git add/rm <fitxer>' segons sigui apropiat per a marcar la\n"
 "resolució i feu una comissió."
 
-#: advice.c:101 builtin/merge.c:1227
+#: advice.c:101 builtin/merge.c:1225
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "No heu conclòs la vostra fusió (MERGE_HEAD existeix)."
 
 #: advice.c:103
-msgid "Please, commit your changes before you can merge."
+msgid "Please, commit your changes before merging."
 msgstr "Si us plau, cometeu els vostres canvis abans de fusionar."
 
 #: advice.c:104
@@ -63,78 +63,78 @@
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <dipòsit> [--exec <ordre>] --list"
 
-#: archive.c:343 builtin/add.c:137 builtin/add.c:426 builtin/rm.c:327
+#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "L'especificació de camí '%s' no ha coincidit amb cap fitxer"
 
-#: archive.c:428
+#: archive.c:429
 msgid "fmt"
 msgstr "format"
 
-#: archive.c:428
+#: archive.c:429
 msgid "archive format"
 msgstr "format d'arxiu"
 
-#: archive.c:429 builtin/log.c:1229
+#: archive.c:430 builtin/log.c:1229
 msgid "prefix"
 msgstr "prefix"
 
-#: archive.c:430
+#: archive.c:431
 msgid "prepend prefix to each pathname in the archive"
 msgstr "anteposa el prefix a cada nom de camí en l'arxiu"
 
-#: archive.c:431 builtin/archive.c:88 builtin/blame.c:2516 builtin/blame.c:2517
+#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535 builtin/blame.c:2536
 #: builtin/config.c:58 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:712 builtin/hash-object.c:99 builtin/ls-files.c:446
+#: builtin/grep.c:707 builtin/hash-object.c:99 builtin/ls-files.c:446
 #: builtin/ls-files.c:449 builtin/notes.c:395 builtin/notes.c:558
 #: builtin/read-tree.c:109 parse-options.h:153
 msgid "file"
 msgstr "fitxer"
 
-#: archive.c:432 builtin/archive.c:89
+#: archive.c:433 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "escriu l'arxiu a aquest fitxer"
 
-#: archive.c:434
+#: archive.c:435
 msgid "read .gitattributes in working directory"
 msgstr "llegeix .gitattributes en el directori de treball"
 
-#: archive.c:435
+#: archive.c:436
 msgid "report archived files on stderr"
 msgstr "informa de fitxers arxivats en stderr"
 
-#: archive.c:436
+#: archive.c:437
 msgid "store only"
 msgstr "només emmagatzema"
 
-#: archive.c:437
+#: archive.c:438
 msgid "compress faster"
-msgstr "comprimeix més ràpid"
+msgstr "comprimeix més ràpidament"
 
-#: archive.c:445
+#: archive.c:446
 msgid "compress better"
 msgstr "comprimeix millor"
 
-#: archive.c:448
+#: archive.c:449
 msgid "list supported archive formats"
 msgstr "allista els formats d'arxiu admesos"
 
-#: archive.c:450 builtin/archive.c:90 builtin/clone.c:77
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77
 msgid "repo"
 msgstr "dipòsit"
 
-#: archive.c:451 builtin/archive.c:91
+#: archive.c:452 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "recupera l'arxiu del dipòsit remot <dipòsit>"
 
-#: archive.c:452 builtin/archive.c:92 builtin/notes.c:479
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479
 msgid "command"
 msgstr "ordre"
 
-#: archive.c:453 builtin/archive.c:93
+#: archive.c:454 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
-msgstr "camí a l'ordre git-upload-archive remot"
+msgstr "camí a l'ordre git-upload-archive remota"
 
 #: attr.c:265
 msgid ""
@@ -144,90 +144,90 @@
 "Els patrons negatius s'ignoren en els atributs de git\n"
 "Useu '\\!' per exclamació capdavantera literal."
 
-#: branch.c:60
+#: branch.c:61
 #, c-format
 msgid "Not setting branch %s as its own upstream."
 msgstr "No establint la branca %s com a la seva pròpia font."
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
 "La branca %s està configurada per a seguir la branca remota %s de %s per "
 "rebasar."
 
-#: branch.c:84
+#: branch.c:85
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr "La branca %s està configurada per a seguir la branca remota %s de %s."
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr ""
 "La branca %s està configurada per a seguir la branca local %s per rebasar."
 
-#: branch.c:89
+#: branch.c:90
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "La branca %s està configurada per a seguir la branca local %s."
 
-#: branch.c:94
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr ""
 "La branca %s està configurada per a seguir la referència remota %s per "
 "rebasar."
 
-#: branch.c:95
+#: branch.c:96
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "La branca %s està configurada per a seguir la referència remota %s."
 
-#: branch.c:99
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
 "La branca %s està configurada per a seguir la referència local %s per "
 "rebasar."
 
-#: branch.c:100
+#: branch.c:101
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "La branca %s està configurada per a seguir la referència local %s."
 
-#: branch.c:133
+#: branch.c:134
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "No seguint: informació ambigua per a la referència %s"
 
-#: branch.c:162
+#: branch.c:163
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "'%s' no és un nom de branca vàlid."
 
-#: branch.c:167
+#: branch.c:168
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Una branca amb nom '%s' ja existeix."
 
-#: branch.c:175
+#: branch.c:176
 msgid "Cannot force update the current branch."
 msgstr "No es pot actualitzar la branca actual a la força."
 
-#: branch.c:195
+#: branch.c:196
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr ""
 "No es pot configurar la informació de seguiment; el punt inicial '%s' no és "
 "una branca."
 
-#: branch.c:197
+#: branch.c:198
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "la branca font demanada '%s' no existeix"
 
-#: branch.c:199
+#: branch.c:200
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -248,22 +248,22 @@
 "\"git push -u\" per a establir la configuració font\n"
 "mentre pugeu."
 
-#: branch.c:243
+#: branch.c:244
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "No és un nom d'objecte vàlid: '%s'."
 
-#: branch.c:263
+#: branch.c:264
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Nom d'objecte ambigu: '%s'."
 
-#: branch.c:268
+#: branch.c:269
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "No és un punt de ramificació vàlid: '%s'."
 
-#: branch.c:399
+#: branch.c:322
 #, c-format
 msgid "'%s' is already checked out at '%s'"
 msgstr "'%s' ja s'ha agafat a '%s'"
@@ -278,7 +278,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr "capçalera no reconeguda: %s%s (%d)"
 
-#: bundle.c:87 builtin/commit.c:765
+#: bundle.c:87 builtin/commit.c:766
 #, c-format
 msgid "could not open '%s'"
 msgstr "no s'ha pogut obrir '%s'"
@@ -287,9 +287,9 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Al dipòsit li manquen aquestes comissions prerequisits:"
 
-#: bundle.c:163 sequencer.c:636 sequencer.c:1083 builtin/blame.c:2708
-#: builtin/branch.c:652 builtin/commit.c:1044 builtin/log.c:334
-#: builtin/log.c:850 builtin/log.c:1457 builtin/log.c:1690 builtin/merge.c:358
+#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083
+#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334
+#: builtin/log.c:849 builtin/log.c:1461 builtin/log.c:1694 builtin/merge.c:358
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "la configuració del passeig per revisions ha fallat"
@@ -329,7 +329,7 @@
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "les opcions de la llista de revisions exclouen la referència '%s'"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1367 builtin/shortlog.c:261
+#: bundle.c:443 builtin/log.c:157 builtin/log.c:1369 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "paràmetre no reconegut: %s"
@@ -347,13 +347,13 @@
 msgid "index-pack died"
 msgstr "L'index-pack s'ha mort"
 
-#: color.c:260
+#: color.c:275
 #, c-format
 msgid "invalid color value: %.*s"
 msgstr "valor de color no vàlid: %.*s"
 
-#: commit.c:40 builtin/am.c:451 builtin/am.c:487 builtin/am.c:1516
-#: builtin/am.c:2128
+#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520
+#: builtin/am.c:2149
 #, c-format
 msgid "could not parse %s"
 msgstr "no s'ha pogut analitzar %s"
@@ -511,23 +511,23 @@
 msgid "Performing inexact rename detection"
 msgstr "Realitzant detecció inexacta de canvis de nom"
 
-#: diff.c:116
+#: diff.c:115
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr "  S'ha fallat en analitzar el percentatge limitant de dirstat '%s'\n"
 
-#: diff.c:121
+#: diff.c:120
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Paràmetre de dirstat desconegut '%s'\n"
 
-#: diff.c:216
+#: diff.c:215
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr ""
 "Valor desconegut de la variable de configuració de 'diff.submodule': '%s'"
 
-#: diff.c:268
+#: diff.c:267
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -536,16 +536,16 @@
 "Errors trobats en la variable de configuració 'diff.dirstat':\n"
 "%s"
 
-#: diff.c:2998
+#: diff.c:3000
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "El diff external s'ha mort, aturant a %s"
 
-#: diff.c:3394
+#: diff.c:3396
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow requereix exactament una especificació de camí"
 
-#: diff.c:3557
+#: diff.c:3559
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -554,16 +554,16 @@
 "S'ha fallat en analitzar el paràmetre d'opció de --dirstat/-X:\n"
 "%s"
 
-#: diff.c:3571
+#: diff.c:3573
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "S'ha fallat en analitzar el paràmetre d'opció de --submodule: %s"
 
-#: dir.c:1853
+#: dir.c:1915
 msgid "failed to get kernel name and information"
 msgstr "s'ha fallat en obtenir el nombre i la informació del nucli"
 
-#: dir.c:1936
+#: dir.c:1998
 msgid "Untracked cache is disabled on this system."
 msgstr "La memòria cau no seguida està deshabilitada en aquest sistema."
 
@@ -615,7 +615,7 @@
 
 #: help.c:246
 msgid "These are common Git commands used in various situations:"
-msgstr "Aquests són ordres del Git comunament usats en diverses situacions:"
+msgstr "Aquestes són ordres del Git comunament usades en diverses situacions:"
 
 #: help.c:311
 #, c-format
@@ -623,7 +623,7 @@
 "'%s' appears to be a git command, but we were not\n"
 "able to execute it. Maybe git-%s is broken?"
 msgstr ""
-"'%s' sembla una ordre git, però no hem pogut\n"
+"'%s' sembla una ordre de git, però no hem pogut\n"
 "executar-la. Pot ser que git-%s estigui estropejat?"
 
 #: help.c:368
@@ -672,8 +672,8 @@
 msgid "failed to read the cache"
 msgstr "s'ha fallat en llegir la memòria cau"
 
-#: merge.c:94 builtin/am.c:2001 builtin/am.c:2036 builtin/checkout.c:375
-#: builtin/checkout.c:586 builtin/clone.c:715
+#: merge.c:94 builtin/am.c:2022 builtin/am.c:2057 builtin/checkout.c:376
+#: builtin/checkout.c:587 builtin/clone.c:722
 msgid "unable to write new index file"
 msgstr "no s'ha pogut escriure un fitxer d'índex nou"
 
@@ -691,64 +691,64 @@
 msgid "error building trees"
 msgstr "error en construir arbres"
 
-#: merge-recursive.c:687
+#: merge-recursive.c:686
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "s'ha fallat en crear el camí '%s' %s"
 
-#: merge-recursive.c:698
+#: merge-recursive.c:697
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Eliminant %s per a fer espai per al subdirectori\n"
 
-#: merge-recursive.c:712 merge-recursive.c:733
+#: merge-recursive.c:711 merge-recursive.c:732
 msgid ": perhaps a D/F conflict?"
 msgstr ": potser un conflicte D/F?"
 
-#: merge-recursive.c:723
+#: merge-recursive.c:722
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "refusant perdre el fitxer no seguit a '%s'"
 
-#: merge-recursive.c:763
+#: merge-recursive.c:762
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "no es pot llegir l'objecte %s '%s'"
 
-#: merge-recursive.c:765
+#: merge-recursive.c:764
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "blob esperat per a %s '%s'"
 
-#: merge-recursive.c:788 builtin/clone.c:364
+#: merge-recursive.c:787 builtin/clone.c:369
 #, c-format
 msgid "failed to open '%s'"
 msgstr "s'ha fallat en obrir '%s'"
 
-#: merge-recursive.c:796
+#: merge-recursive.c:795
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "s'ha fallat en fer l'enllaç simbòlic '%s'"
 
-#: merge-recursive.c:799
+#: merge-recursive.c:798
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "no se sap què fer amb %06o %s '%s'"
 
-#: merge-recursive.c:937
+#: merge-recursive.c:936
 msgid "Failed to execute internal merge"
 msgstr "S'ha fallat en executar la fusió interna"
 
-#: merge-recursive.c:941
+#: merge-recursive.c:940
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "no s'ha pogut afegir %s a la base de dades"
 
-#: merge-recursive.c:957
+#: merge-recursive.c:956
 msgid "unsupported object type in the tree"
 msgstr "tipus d'objecte no compatible en l'arbre"
 
-#: merge-recursive.c:1032 merge-recursive.c:1046
+#: merge-recursive.c:1031 merge-recursive.c:1045
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -757,7 +757,7 @@
 "CONFLICTE: (%s/supressió): %s suprimit en %s i %s en %s. La versió %s de %s "
 "s'ha deixat en l'arbre."
 
-#: merge-recursive.c:1038 merge-recursive.c:1051
+#: merge-recursive.c:1037 merge-recursive.c:1050
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -766,20 +766,20 @@
 "CONFLICTE: (%s/supressió): %s suprimit en %s i %s en %s. La versió %s de %s "
 "s'ha deixat en l'arbre a %s."
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "rename"
 msgstr "canvia de nom"
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "renamed"
 msgstr "canviat de nom"
 
-#: merge-recursive.c:1148
+#: merge-recursive.c:1147
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s és un directori en %s; afegint com a %s en lloc"
 
-#: merge-recursive.c:1170
+#: merge-recursive.c:1169
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -788,147 +788,147 @@
 "CONFLICTE (canvi de nom/canvi de nom): Canvi de nom \"%s\"->\"%s\" en la "
 "branca \"%s\" canvi de nom \"%s\"->\"%s\" en \"%s\"%s"
 
-#: merge-recursive.c:1175
+#: merge-recursive.c:1174
 msgid " (left unresolved)"
 msgstr " (deixat sense resolució)"
 
-#: merge-recursive.c:1229
+#: merge-recursive.c:1228
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 "CONFLICTE (canvi de nom/canvi de nom): Canvi de nom %s->%s en %s. Canvi de "
 "nom %s->%s en %s"
 
-#: merge-recursive.c:1259
+#: merge-recursive.c:1258
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Canviant el nom de %s a %s i %s a %s en lloc d'això"
 
-#: merge-recursive.c:1458
+#: merge-recursive.c:1457
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 "CONFLICTE (canvi de nom/afegiment): Canvi de nom %s->%s en %s. %s afegit en "
 "%s"
 
-#: merge-recursive.c:1468
+#: merge-recursive.c:1467
 #, c-format
 msgid "Adding merged %s"
 msgstr "Afegint %s fusionat"
 
-#: merge-recursive.c:1473 merge-recursive.c:1671
+#: merge-recursive.c:1472 merge-recursive.c:1674
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Afegint com a %s en lloc d'això"
 
-#: merge-recursive.c:1524
+#: merge-recursive.c:1523
 #, c-format
 msgid "cannot read object %s"
 msgstr "no es pot llegir l'objecte %s"
 
-#: merge-recursive.c:1527
+#: merge-recursive.c:1526
 #, c-format
 msgid "object %s is not a blob"
 msgstr "L'objecte %s no és un blob"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modify"
 msgstr "modifica"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modified"
 msgstr "modificat"
 
-#: merge-recursive.c:1585
+#: merge-recursive.c:1588
 msgid "content"
 msgstr "contingut"
 
-#: merge-recursive.c:1592
+#: merge-recursive.c:1595
 msgid "add/add"
 msgstr "afegiment/afegiment"
 
-#: merge-recursive.c:1626
+#: merge-recursive.c:1629
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "%s saltat (el fusionat és igual a l'existent)"
 
-#: merge-recursive.c:1640
+#: merge-recursive.c:1643
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Autofusionant %s"
 
-#: merge-recursive.c:1644 git-submodule.sh:1150
+#: merge-recursive.c:1647 git-submodule.sh:1025
 msgid "submodule"
 msgstr "submòdul"
 
-#: merge-recursive.c:1645
+#: merge-recursive.c:1648
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "CONFLICTE (%s): Conflicte de fusió en %s"
 
-#: merge-recursive.c:1731
+#: merge-recursive.c:1734
 #, c-format
 msgid "Removing %s"
 msgstr "Eliminant %s"
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1759
 msgid "file/directory"
 msgstr "fitxer/directori"
 
-#: merge-recursive.c:1762
+#: merge-recursive.c:1765
 msgid "directory/file"
 msgstr "directori/fitxer"
 
-#: merge-recursive.c:1767
+#: merge-recursive.c:1770
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 "CONFLICTE (%s): Hi ha un directori amb nom %s en %s. Afegint %s com a %s"
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1780
 #, c-format
 msgid "Adding %s"
 msgstr "Afegint %s"
 
-#: merge-recursive.c:1794
+#: merge-recursive.c:1797
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Fallat de fusió fatal; això no ha de passar."
 
-#: merge-recursive.c:1813
+#: merge-recursive.c:1816
 msgid "Already up-to-date!"
 msgstr "Ja al dia!"
 
-#: merge-recursive.c:1822
+#: merge-recursive.c:1825
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "la fusió dels arbres %s i %s ha fallat"
 
-#: merge-recursive.c:1852
+#: merge-recursive.c:1855
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "Camí no processat??? %s"
 
-#: merge-recursive.c:1900
+#: merge-recursive.c:1903
 msgid "Merging:"
 msgstr "Fusionant:"
 
-#: merge-recursive.c:1913
+#: merge-recursive.c:1916
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "s'ha trobat %u avantpassat:"
 msgstr[1] "s'han trobat %u avantpassats:"
 
-#: merge-recursive.c:1950
+#: merge-recursive.c:1953
 msgid "merge returned no commit"
 msgstr "la fusió no ha retornat cap comissió"
 
-#: merge-recursive.c:2007
+#: merge-recursive.c:2010
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "No s'ha pogut analitzar l'objecte '%s'"
 
-#: merge-recursive.c:2018 builtin/merge.c:645
+#: merge-recursive.c:2021 builtin/merge.c:645
 msgid "Unable to write index."
 msgstr "No s'ha pogut escriure l'índex."
 
@@ -958,31 +958,41 @@
 msgid "unable to parse object: %s"
 msgstr "no s'ha pogut analitzar l'objecte: %s"
 
-#: parse-options.c:563
+#: parse-options.c:570
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:581
+#: parse-options.c:588
 #, c-format
 msgid "usage: %s"
 msgstr "ús: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:585
+#: parse-options.c:592
 #, c-format
 msgid "   or: %s"
 msgstr " o: %s"
 
-#: parse-options.c:588
+#: parse-options.c:595
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:622
+#: parse-options.c:629
 msgid "-NUM"
 msgstr "-NUM"
 
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "nom d'objecte mal format '%s'"
+
+#: path.c:752
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "No s'ha pogut fer %s escrivible pel grup"
+
 #: pathspec.c:133
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
@@ -1054,11 +1064,11 @@
 msgid "unable to parse --pretty format"
 msgstr "no s'ha pogut analitzar el format --pretty"
 
-#: progress.c:236
+#: progress.c:235
 msgid "done"
 msgstr "fet"
 
-#: read-cache.c:1296
+#: read-cache.c:1281
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -1067,7 +1077,7 @@
 "index.version establert, però el valor no és vàlid.\n"
 "Usant la versió %i"
 
-#: read-cache.c:1306
+#: read-cache.c:1291
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1076,119 +1086,164 @@
 "GIT_INDEX_VERSION establert, però el valor no és vàlid.\n"
 "Usant la versió %i"
 
-#: refs.c:2941 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
+#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
 #: builtin/merge.c:983
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "No s'ha pogut obrir '%s' per a escriptura"
 
-#: refs.c:3001
+#: refs/files-backend.c:2359
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "no s'ha pogut suprimir la referència %s: %s"
 
-#: refs.c:3004
+#: refs/files-backend.c:2362
 #, c-format
 msgid "could not delete references: %s"
 msgstr "no s'ha pogut suprimir les referències: %s"
 
-#: refs.c:3013
+#: refs/files-backend.c:2371
 #, c-format
 msgid "could not remove reference %s"
 msgstr "no s'ha pogut eliminar la referència %s"
 
-#: ref-filter.c:660
+#: ref-filter.c:245
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "format: s'ha usat l'àtom %%(end) sense l'àtom corresponent"
+
+#: ref-filter.c:704
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "valor positiu esperat contents:lines=%s"
+
+#: ref-filter.c:833
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "format esperat: %%(color:<color>)"
+
+#: ref-filter.c:835
 msgid "unable to parse format"
 msgstr "no s'ha pogut analitzar el format"
 
-#: remote.c:792
+#: ref-filter.c:870
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "format esperat: %%(align:<amplada>,<posició>)"
+
+#: ref-filter.c:893
+#, c-format
+msgid "improper format entered align:%s"
+msgstr "format impropi introduït align:%s"
+
+#: ref-filter.c:898
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "amplada positiva esperada amb l'àtom %%(align)"
+
+#: ref-filter.c:1219
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "objecte mal format a '%s'"
+
+#: ref-filter.c:1561
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "format: manca l'àtom %%(end)"
+
+#: ref-filter.c:1615
+#, c-format
+msgid "malformed object name %s"
+msgstr "nom d'objecte %s mal format"
+
+#: remote.c:756
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "No es pot obtenir ambdós %s i %s a %s"
 
-#: remote.c:796
+#: remote.c:760
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s generalment segueix %s, no %s"
 
-#: remote.c:800
+#: remote.c:764
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s segueix ambdós %s i %s"
 
-#: remote.c:808
+#: remote.c:772
 msgid "Internal error"
 msgstr "Error intern"
 
-#: remote.c:1723 remote.c:1766
+#: remote.c:1687 remote.c:1730
 msgid "HEAD does not point to a branch"
 msgstr "HEAD no assenyala cap branca"
 
-#: remote.c:1732
+#: remote.c:1696
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "no hi ha tal branca: '%s'"
 
-#: remote.c:1735
+#: remote.c:1699
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "cap font configurada per a la branca '%s'"
 
-#: remote.c:1741
+#: remote.c:1705
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "La branca font '%s' no s'emmagatzema com a branca amb seguiment remot"
 
-#: remote.c:1756
+#: remote.c:1720
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
 "el destí de pujada '%s' en el remot '%s' no té cap branca seguidora local"
 
-#: remote.c:1771
+#: remote.c:1735
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "la branca '%s' no té cap remot al qual pujar"
 
-#: remote.c:1782
+#: remote.c:1746
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "les especificacions de referència de '%s' no inclouen '%s'"
 
-#: remote.c:1795
+#: remote.c:1759
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "push no té destí (push.default és 'nothing')"
 
-#: remote.c:1817
+#: remote.c:1781
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "no es pot resoldre una pujada 'simple' a un sol destí"
 
-#: remote.c:2124
+#: remote.c:2083
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "La vostra branca està basada en '%s', però la font no hi és.\n"
 
-#: remote.c:2128
+#: remote.c:2087
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (useu \"git branch --unset-upstream\" per a arreglar)\n"
 
-#: remote.c:2131
+#: remote.c:2090
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "La vostra branca està al dia amb '%s'.\n"
 
-#: remote.c:2135
+#: remote.c:2094
 #, c-format
 msgid "Your branch is ahead of '%s' by %d commit.\n"
 msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
 msgstr[0] "La vostra branca està davant de '%s' per %d comissió.\n"
 msgstr[1] "La vostra branca està davant de '%s' per %d comissions.\n"
 
-#: remote.c:2141
+#: remote.c:2100
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (useu \"git push\" per a publicar les vostres comissions locals)\n"
 
-#: remote.c:2144
+#: remote.c:2103
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1200,11 +1255,11 @@
 "La vostra branca està darrere de '%s' per %d comissions, i pot avançar-se "
 "ràpidament.\n"
 
-#: remote.c:2152
+#: remote.c:2111
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr " (useu \"git pull\" per a actualitzar la vostra branca local)\n"
 
-#: remote.c:2155
+#: remote.c:2114
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1219,28 +1274,28 @@
 "La vostra branca i '%s' s'han divergit,\n"
 "i tenen %d i %d comissions distintes cada una, respectivament.\n"
 
-#: remote.c:2165
+#: remote.c:2124
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (useu \"git pull\" per a fusionar la branca remota a la vostra)\n"
 
-#: revision.c:2198
+#: revision.c:2193
 msgid "your current branch appears to be broken"
 msgstr "la vostra branca actual sembla trencada"
 
-#: revision.c:2201
+#: revision.c:2196
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "la vostra branca actual '%s' encara no té cap comissió"
 
-#: revision.c:2395
+#: revision.c:2390
 msgid "--first-parent is incompatible with --bisect"
 msgstr "--first-parent és incompatible amb --bisect"
 
-#: run-command.c:83
+#: run-command.c:90
 msgid "open /dev/null failed"
 msgstr "s'ha fallat en obrir /dev/null"
 
-#: run-command.c:85
+#: run-command.c:92
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) ha fallat"
@@ -1459,7 +1514,7 @@
 msgid "cannot abort from a branch yet to be born"
 msgstr "no es pot avortar des d'una branca que encara ha de nàixer"
 
-#: sequencer.c:887 builtin/apply.c:4291
+#: sequencer.c:887 builtin/apply.c:4287
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "no es pot obrir %s: %s"
@@ -1501,12 +1556,12 @@
 msgid "Can't cherry-pick into empty head"
 msgstr "No es pot recollir cireres en un cap buit"
 
-#: setup.c:243
+#: setup.c:248
 #, c-format
 msgid "failed to read %s"
 msgstr "s'ha fallat en llegir %s"
 
-#: sha1_name.c:453
+#: sha1_name.c:463
 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"
@@ -1555,7 +1610,7 @@
 msgid "staging updated .gitmodules failed"
 msgstr "L'allistament del .gitmodules actualitzat ha fallat"
 
-#: submodule.c:1045
+#: submodule.c:1040
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "No s'ha pogut establir core.worktree en %s"
@@ -1566,7 +1621,7 @@
 msgid "unknown value '%s' for key '%s'"
 msgstr "valor desconegut '%s' per a la clau '%s'"
 
-#: trailer.c:543 trailer.c:548 builtin/remote.c:290
+#: trailer.c:543 trailer.c:548 builtin/remote.c:296
 #, c-format
 msgid "more than one %s"
 msgstr "més d'un %s"
@@ -1633,8 +1688,8 @@
 msgid "could not open '%s' for writing"
 msgstr "no s'ha pogut obrir '%s' per a escriptura"
 
-#: wrapper.c:223 wrapper.c:366 builtin/am.c:337 builtin/commit.c:1688
-#: builtin/merge.c:1076 builtin/pull.c:380
+#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691
+#: builtin/merge.c:1074 builtin/pull.c:380
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "no s'ha pogut obrir '%s' per a lectura"
@@ -1649,30 +1704,21 @@
 msgid "unable to access '%s'"
 msgstr "no s'ha pogut accedir a '%s'"
 
-#: wrapper.c:611
-#, c-format
-msgid "unable to look up current user in the passwd file: %s"
-msgstr "no s'ha pogut trobar l'usuari actual en el fitxer passwd: %s"
-
-#: wrapper.c:612
-msgid "no such user"
-msgstr "no hi ha tal usuari"
-
-#: wrapper.c:620
+#: wrapper.c:608
 msgid "unable to get current working directory"
 msgstr "no s'ha pogut obtenir el directori de treball actual"
 
-#: wrapper.c:631
+#: wrapper.c:635
 #, c-format
 msgid "could not open %s for writing"
 msgstr "no s'ha pogut obrir '%s' per a escriptura"
 
-#: wrapper.c:642 builtin/am.c:424
+#: wrapper.c:646 builtin/am.c:425
 #, c-format
 msgid "could not write to %s"
 msgstr "no s'ha pogut escriure a %s"
 
-#: wrapper.c:648
+#: wrapper.c:652
 #, c-format
 msgid "could not close %s"
 msgstr "no s'ha pogut tancar %s"
@@ -1879,8 +1925,8 @@
 #, c-format
 msgid "Last command done (%d command done):"
 msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "Últim ordre fet (%d ordre fet):"
-msgstr[1] "Últims ordres fets (%d ordres fets):"
+msgstr[0] "Última ordre fet (%d ordre feta):"
+msgstr[1] "Últimes ordres fetes (%d ordres fetes):"
 
 #: wt-status.c:1119
 #, c-format
@@ -2018,27 +2064,27 @@
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr "  (useu \"git bisect reset\" per a tornar a la branca original)"
 
-#: wt-status.c:1437
+#: wt-status.c:1438
 msgid "On branch "
 msgstr "En la branca "
 
-#: wt-status.c:1445
+#: wt-status.c:1444
 msgid "interactive rebase in progress; onto "
 msgstr "rebasament interactiu en progrés; sobre "
 
-#: wt-status.c:1447
+#: wt-status.c:1446
 msgid "rebase in progress; onto "
 msgstr "rebasament en progrés; sobre "
 
-#: wt-status.c:1452
+#: wt-status.c:1451
 msgid "HEAD detached at "
 msgstr "HEAD separat a "
 
-#: wt-status.c:1454
+#: wt-status.c:1453
 msgid "HEAD detached from "
 msgstr "HEAD separat de "
 
-#: wt-status.c:1457
+#: wt-status.c:1456
 msgid "Not currently on any branch."
 msgstr "Actualment no en cap branca."
 
@@ -2127,23 +2173,23 @@
 msgid "nothing to commit, working directory clean\n"
 msgstr "no hi ha res a cometre, directori de treball net\n"
 
-#: wt-status.c:1644
-msgid "HEAD (no branch)"
-msgstr "HEAD (sense branca)"
-
-#: wt-status.c:1650
+#: wt-status.c:1642
 msgid "Initial commit on "
 msgstr "Comissió inicial en "
 
-#: wt-status.c:1677
+#: wt-status.c:1646
+msgid "HEAD (no branch)"
+msgstr "HEAD (sense branca)"
+
+#: wt-status.c:1675
 msgid "gone"
 msgstr "no hi és"
 
-#: wt-status.c:1679 wt-status.c:1687
+#: wt-status.c:1677 wt-status.c:1685
 msgid "behind "
 msgstr "darrere "
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:403
+#: compat/precompose_utf8.c:56 builtin/clone.c:408
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "s'ha fallat en desenllaçar '%s'"
@@ -2157,7 +2203,7 @@
 msgid "unexpected diff status %c"
 msgstr "estat de diff inesperat %c"
 
-#: builtin/add.c:70 builtin/commit.c:277
+#: builtin/add.c:70 builtin/commit.c:278
 msgid "updating files failed"
 msgstr "s'ha fallat en actualitzar els fitxers"
 
@@ -2170,7 +2216,7 @@
 msgid "Unstaged changes after refreshing the index:"
 msgstr "Canvis no allistats després d'actualitzar l'índex:"
 
-#: builtin/add.c:194 builtin/rev-parse.c:799
+#: builtin/add.c:194 builtin/rev-parse.c:796
 msgid "Could not read the index"
 msgstr "No s'ha pogut llegir l'índex"
 
@@ -2206,15 +2252,15 @@
 msgstr ""
 "Els camins següents s'ignoren per un dels vostres fitxers .gitignore:\n"
 
-#: builtin/add.c:249 builtin/clean.c:896 builtin/fetch.c:108 builtin/mv.c:110
-#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:545
-#: builtin/remote.c:1339 builtin/rm.c:268 builtin/send-pack.c:162
+#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:543
+#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162
 msgid "dry run"
 msgstr "marxa en sec"
 
-#: builtin/add.c:250 builtin/apply.c:4580 builtin/check-ignore.c:19
-#: builtin/commit.c:1321 builtin/count-objects.c:63 builtin/fsck.c:636
-#: builtin/log.c:1641 builtin/mv.c:109 builtin/read-tree.c:114
+#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19
+#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
+#: builtin/log.c:1645 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr "sigues detallat"
 
@@ -2222,7 +2268,7 @@
 msgid "interactive picking"
 msgstr "recull interactiu"
 
-#: builtin/add.c:253 builtin/checkout.c:1152 builtin/reset.c:286
+#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "selecciona els trossos interactivament"
 
@@ -2281,148 +2327,149 @@
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "L'opció --ignore-missing només es pot usar junt amb --dry-run"
 
-#: builtin/add.c:358
+#: builtin/add.c:352
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Res especificat, res afegit.\n"
 
-#: builtin/add.c:359
+#: builtin/add.c:353
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Potser volíeu dir 'git add .'?\n"
 
-#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:940
-#: builtin/commit.c:336 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938
+#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:40
 msgid "index file corrupt"
 msgstr "fitxer d'índex malmès"
 
-#: builtin/add.c:445 builtin/apply.c:4678 builtin/mv.c:279 builtin/rm.c:430
+#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430
 msgid "Unable to write new index file"
 msgstr "no s'ha pogut escriure un fitxer d'índex nou"
 
-#: builtin/am.c:41
+#: builtin/am.c:42
 #, c-format
 msgid "could not stat %s"
 msgstr "no s'ha pogut fer stat a '%s'"
 
-#: builtin/am.c:270 builtin/am.c:1345 builtin/commit.c:737 builtin/merge.c:1079
+#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077
 #, c-format
 msgid "could not read '%s'"
 msgstr "no s'ha pogut llegir '%s'"
 
-#: builtin/am.c:444
+#: builtin/am.c:445
 msgid "could not parse author script"
 msgstr "no s'ha pogut analitzar l'script d'autor"
 
-#: builtin/am.c:521
+#: builtin/am.c:522
 #, c-format
 msgid "'%s' was deleted by the applypatch-msg hook"
 msgstr "s'ha suprimit '%s' per el ganxo applypatch-msg"
 
-#: builtin/am.c:562 builtin/notes.c:300
+#: builtin/am.c:563 builtin/notes.c:300
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Línia d'entrada mal formada: '%s'."
 
-#: builtin/am.c:599 builtin/notes.c:315
+#: builtin/am.c:600 builtin/notes.c:315
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "S'ha fallat en copiar les notes de '%s' a '%s'"
 
-#: builtin/am.c:625
+#: builtin/am.c:626
 msgid "fseek failed"
 msgstr "fseek ha fallat"
 
-#: builtin/am.c:786 builtin/am.c:874
+#: builtin/am.c:787 builtin/am.c:875
 #, c-format
 msgid "could not open '%s' for reading: %s"
 msgstr "no s'ha pogut obrir '%s' per a lectura: %s"
 
-#: builtin/am.c:793
+#: builtin/am.c:794
 #, c-format
 msgid "could not open '%s' for writing: %s"
 msgstr "no s'ha pogut obrir '%s' per a escriptura: %s"
 
-#: builtin/am.c:802
+#: builtin/am.c:803
 #, c-format
 msgid "could not parse patch '%s'"
 msgstr "no s'ha pogut analitzar el pedaç '%s'"
 
-#: builtin/am.c:867
+#: builtin/am.c:868
 msgid "Only one StGIT patch series can be applied at once"
 msgstr "només una sèrie de pedaços StGIT es pot aplicar a la vegada"
 
-#: builtin/am.c:915
+#: builtin/am.c:916
 msgid "invalid timestamp"
 msgstr "marca de temps no vàlida"
 
-#: builtin/am.c:918 builtin/am.c:926
+#: builtin/am.c:919 builtin/am.c:927
 msgid "invalid Date line"
 msgstr "línia Date no vàlida"
 
-#: builtin/am.c:923
+#: builtin/am.c:924
 msgid "invalid timezone offset"
 msgstr "desplaçament de zona de temps no vàlid"
 
-#: builtin/am.c:1010
+#: builtin/am.c:1011
 msgid "Patch format detection failed."
 msgstr "La detecció de format de pedaç ha fallat."
 
-#: builtin/am.c:1015 builtin/clone.c:368
+#: builtin/am.c:1016 builtin/clone.c:373
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "s'ha fallat en crear el directori '%s'"
 
-#: builtin/am.c:1019
+#: builtin/am.c:1020
 msgid "Failed to split patches."
 msgstr "S'ha fallat en dividir els pedaços."
 
-#: builtin/am.c:1151 builtin/commit.c:362
+#: builtin/am.c:1152 builtin/commit.c:363
 msgid "unable to write index file"
 msgstr "no s'ha pogut escriure el fitxer d'índex"
 
-#: builtin/am.c:1202
+#: builtin/am.c:1203
 #, c-format
 msgid "When you have resolved this problem, run \"%s --continue\"."
 msgstr "Quan hàgiu resolt aquest problema, executeu \"%s --continue\"."
 
-#: builtin/am.c:1203
+#: builtin/am.c:1204
 #, c-format
 msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
 msgstr "Si preferiu saltar aquest pedaç, executeu \"%s --skip\" en lloc."
 
-#: builtin/am.c:1204
+#: builtin/am.c:1205
 #, c-format
 msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr ""
 "Per a restaurar la branca original i deixar d'apedaçar, executeu \"%s --abort"
 "\"."
 
-#: builtin/am.c:1339
+#: builtin/am.c:1343
 msgid "Patch is empty. Was it split wrong?"
 msgstr "El pedaç és buit. S'ha dividit malament?"
 
-#: builtin/am.c:1413 builtin/log.c:1345
+#: builtin/am.c:1417 builtin/log.c:1347
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "línia d'identitat no vàlida: %s"
 
-#: builtin/am.c:1440
+#: builtin/am.c:1444
 #, c-format
 msgid "unable to parse commit %s"
 msgstr "no s'ha pogut analitzar la comissió %s"
 
-#: builtin/am.c:1614
+#: builtin/am.c:1646
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 "Al dipòsit li manquen els blobs necessaris per a retrocedir a una fusió de 3 "
 "vies."
 
-#: builtin/am.c:1616
+#: builtin/am.c:1648
 msgid "Using index info to reconstruct a base tree..."
 msgstr "Usant la informació d'índex per a reconstruir un arbre base..."
 
-#: builtin/am.c:1635
+#: builtin/am.c:1667
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
@@ -2430,38 +2477,38 @@
 "Heu editat el vostre pedaç a mà?\n"
 "No s'aplica als blobs recordats en el seu índex."
 
-#: builtin/am.c:1641
+#: builtin/am.c:1673
 msgid "Falling back to patching base and 3-way merge..."
 msgstr "Retrocedint a apedaçar la base i fusionar de 3 vies..."
 
-#: builtin/am.c:1666
+#: builtin/am.c:1688
 msgid "Failed to merge in the changes."
 msgstr "S'ha fallat en fusionar els canvis."
 
-#: builtin/am.c:1691 builtin/merge.c:632
+#: builtin/am.c:1712 builtin/merge.c:632
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree ha fallat en escriure un arbre"
 
-#: builtin/am.c:1698
+#: builtin/am.c:1719
 msgid "applying to an empty history"
 msgstr "aplicant a una història buida"
 
-#: builtin/am.c:1711 builtin/commit.c:1752 builtin/merge.c:829
+#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829
 #: builtin/merge.c:854
 msgid "failed to write commit object"
 msgstr "s'ha fallat en escriure l'objecte de comissió"
 
-#: builtin/am.c:1743 builtin/am.c:1747
+#: builtin/am.c:1764 builtin/am.c:1768
 #, c-format
 msgid "cannot resume: %s does not exist."
 msgstr "no es pot reprendre: %s no existeix."
 
-#: builtin/am.c:1763
+#: builtin/am.c:1784
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 "no es pot ser interactiu sense que stdin sigui connectat a un terminal."
 
-#: builtin/am.c:1768
+#: builtin/am.c:1789
 msgid "Commit Body is:"
 msgstr "El cos de la comissió és:"
 
@@ -2469,37 +2516,37 @@
 #. in your translation. The program will only accept English
 #. input at this point.
 #.
-#: builtin/am.c:1778
+#: builtin/am.c:1799
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 msgstr ""
 "Voleu aplicar-lo? [y]es/[n]o/[e]dita/[v]isualitza el pedaç/[a]ccepta'ls "
 "tots: "
 
-#: builtin/am.c:1828
+#: builtin/am.c:1849
 #, c-format
 msgid "Dirty index: cannot apply patches (dirty: %s)"
 msgstr "Índex brut: no es pot aplicar pedaços (bruts: %s)"
 
-#: builtin/am.c:1863 builtin/am.c:1934
+#: builtin/am.c:1884 builtin/am.c:1955
 #, c-format
 msgid "Applying: %.*s"
 msgstr "Aplicant: %.*s"
 
-#: builtin/am.c:1879
+#: builtin/am.c:1900
 msgid "No changes -- Patch already applied."
 msgstr "Sense canvis -- El pedaç ja s'ha aplicat."
 
-#: builtin/am.c:1887
+#: builtin/am.c:1908
 #, c-format
 msgid "Patch failed at %s %.*s"
 msgstr "El pedaç ha fallat a %s %.*s"
 
-#: builtin/am.c:1893
+#: builtin/am.c:1914
 #, c-format
 msgid "The copy of the patch that failed is found in: %s"
 msgstr "La còpia del pedaç que ha fallat es troba en: %s"
 
-#: builtin/am.c:1937
+#: builtin/am.c:1958
 msgid ""
 "No changes - did you forget to use 'git add'?\n"
 "If there is nothing left to stage, chances are that something else\n"
@@ -2509,7 +2556,7 @@
 "Si no hi ha res a allistar, probablement alguna altra cosa\n"
 "ja ha introduït els mateixos canvis; potser voleu ometre aquest pedaç."
 
-#: builtin/am.c:1944
+#: builtin/am.c:1965
 msgid ""
 "You still have unmerged paths in your index.\n"
 "Did you forget to use 'git add'?"
@@ -2517,17 +2564,17 @@
 "Encara teniu camins sense fusionar en el vostre índex.\n"
 "Heu oblidat d'usar 'git add'?"
 
-#: builtin/am.c:2052 builtin/am.c:2056 builtin/am.c:2068 builtin/reset.c:308
+#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308
 #: builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "No s'ha pogut analitzar l'objecte '%s'."
 
-#: builtin/am.c:2104
+#: builtin/am.c:2125
 msgid "failed to clean index"
 msgstr "s'ha fallat en netejar l'índex"
 
-#: builtin/am.c:2138
+#: builtin/am.c:2159
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
@@ -2535,152 +2582,154 @@
 "Sembla que heu mogut HEAD després de l'última fallada de 'am'.\n"
 "No rebobinant a ORIG_HEAD"
 
-#: builtin/am.c:2199
+#: builtin/am.c:2220
 #, c-format
 msgid "Invalid value for --patch-format: %s"
 msgstr "Valor no vàlid per a --patch-format: %s"
 
-#: builtin/am.c:2221
-msgid "git am [options] [(<mbox>|<Maildir>)...]"
-msgstr "git am [opcions] [(<bústia>|<directori-de-correu>)...]"
+#: builtin/am.c:2253
+msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
+msgstr "git am [<opcions>] [(<bústia>|<directori-de-correu>)...]"
 
-#: builtin/am.c:2222
-msgid "git am [options] (--continue | --skip | --abort)"
-msgstr "git am [opcions] (--continue | --skip | --abort)"
+#: builtin/am.c:2254
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<opcions>] (--continue | --skip | --abort)"
 
-#: builtin/am.c:2228
+#: builtin/am.c:2260
 msgid "run interactively"
 msgstr "executa interactivament"
 
-#: builtin/am.c:2230
+#: builtin/am.c:2262
 msgid "historical option -- no-op"
 msgstr "opció històrica -- no-op"
 
-#: builtin/am.c:2232
+#: builtin/am.c:2264
 msgid "allow fall back on 3way merging if needed"
 msgstr "permet retrocedir a una fusió de 3 vies si és necessari"
 
-#: builtin/am.c:2233 builtin/init-db.c:509 builtin/prune-packed.c:57
+#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57
 #: builtin/repack.c:171
 msgid "be quiet"
 msgstr "calla"
 
-#: builtin/am.c:2235
+#: builtin/am.c:2267
 msgid "add a Signed-off-by line to the commit message"
 msgstr "afegeix una línia Signed-off-by al missatge de comissió"
 
-#: builtin/am.c:2238
+#: builtin/am.c:2270
 msgid "recode into utf8 (default)"
 msgstr "recodifica en utf8 (per defecte)"
 
-#: builtin/am.c:2240
+#: builtin/am.c:2272
 msgid "pass -k flag to git-mailinfo"
 msgstr "passa la bandera -k al git-mailinfo"
 
-#: builtin/am.c:2242
+#: builtin/am.c:2274
 msgid "pass -b flag to git-mailinfo"
 msgstr "passa la bandera -b al git-mailinfo"
 
-#: builtin/am.c:2244
+#: builtin/am.c:2276
 msgid "pass -m flag to git-mailinfo"
 msgstr "passa la bandera -m al git-mailinfo"
 
-#: builtin/am.c:2246
+#: builtin/am.c:2278
 msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr "passa la bandera --keep-cr al git-mailsplit pel format mbox"
 
-#: builtin/am.c:2249
+#: builtin/am.c:2281
 msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr ""
 "no passis la bandera --keep-cr al git-mailsplit independent de am.keepcr"
 
-#: builtin/am.c:2252
+#: builtin/am.c:2284
 msgid "strip everything before a scissors line"
 msgstr "despulla tot abans d'una línia de tissores"
 
-#: builtin/am.c:2253 builtin/apply.c:4563
+#: builtin/am.c:2285 builtin/apply.c:4554
 msgid "action"
 msgstr "acció"
 
-#: builtin/am.c:2254 builtin/am.c:2257 builtin/am.c:2260 builtin/am.c:2263
-#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
-#: builtin/am.c:2281
+#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295
+#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307
+#: builtin/am.c:2313
 msgid "pass it through git-apply"
 msgstr "passa-ho a través del git-apply"
 
-#: builtin/am.c:2262 builtin/apply.c:4587
+#: builtin/am.c:2294 builtin/apply.c:4578
 msgid "root"
 msgstr "arrel"
 
-#: builtin/am.c:2265 builtin/am.c:2268 builtin/apply.c:4525
-#: builtin/apply.c:4528 builtin/clone.c:85 builtin/fetch.c:93
-#: builtin/pull.c:167
+#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516
+#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93
+#: builtin/pull.c:167 builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
 msgid "path"
 msgstr "camí"
 
-#: builtin/am.c:2271 builtin/fmt-merge-msg.c:669 builtin/fmt-merge-msg.c:672
-#: builtin/grep.c:698 builtin/merge.c:198 builtin/pull.c:127
-#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:664
-#: builtin/show-ref.c:180 builtin/tag.c:591 parse-options.h:132
-#: parse-options.h:134 parse-options.h:243
+#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
+#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127
+#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645
+#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
+#: parse-options.h:134 parse-options.h:244
 msgid "n"
 msgstr "n"
 
-#: builtin/am.c:2274 builtin/apply.c:4531
+#: builtin/am.c:2306 builtin/apply.c:4522
 msgid "num"
 msgstr "número"
 
-#: builtin/am.c:2277 builtin/for-each-ref.c:34 builtin/replace.c:438
+#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
 msgid "format"
 msgstr "format"
 
-#: builtin/am.c:2278
+#: builtin/am.c:2310
 msgid "format the patch(es) are in"
 msgstr "el format en el qual estan els pedaços"
 
-#: builtin/am.c:2284
+#: builtin/am.c:2316
 msgid "override error message when patch failure occurs"
 msgstr ""
 "passa per alt el missatge d'error quan s'ocorre una fallada en apedaçar"
 
-#: builtin/am.c:2286
+#: builtin/am.c:2318
 msgid "continue applying patches after resolving a conflict"
 msgstr "segueix aplicant pedaços després de resoldre un conflicte"
 
-#: builtin/am.c:2289
+#: builtin/am.c:2321
 msgid "synonyms for --continue"
 msgstr "sinònims de --continue"
 
-#: builtin/am.c:2292
+#: builtin/am.c:2324
 msgid "skip the current patch"
 msgstr "salta el pedaç actual"
 
-#: builtin/am.c:2295
+#: builtin/am.c:2327
 msgid "restore the original branch and abort the patching operation."
 msgstr "restaura la branca original i avorta l'operació d'apedaçament."
 
-#: builtin/am.c:2299
+#: builtin/am.c:2331
 msgid "lie about committer date"
 msgstr "menteix sobre la data del comitent"
 
-#: builtin/am.c:2301
+#: builtin/am.c:2333
 msgid "use current timestamp for author date"
 msgstr "usa el marc de temps actual per la data d'autor"
 
-#: builtin/am.c:2303 builtin/commit.c:1590 builtin/merge.c:225
-#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:606
+#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225
+#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355
 msgid "key-id"
 msgstr "ID de clau"
 
-#: builtin/am.c:2304
+#: builtin/am.c:2336
 msgid "GPG-sign commits"
 msgstr "firma les comissions amb GPG"
 
-#: builtin/am.c:2307
+#: builtin/am.c:2339
 msgid "(internal use for git-rebase)"
 msgstr "(ús intern per al git-rebase)"
 
-#: builtin/am.c:2322
+#: builtin/am.c:2354
 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."
@@ -2688,18 +2737,18 @@
 "Fa molt que l'opció -b/--binary no ha fet res, i\n"
 "s'eliminarà. Si us plau, no l'useu més."
 
-#: builtin/am.c:2329
+#: builtin/am.c:2361
 msgid "failed to read the index"
 msgstr "s'ha fallat en llegir l'índex"
 
-#: builtin/am.c:2344
+#: builtin/am.c:2376
 #, c-format
 msgid "previous rebase directory %s still exists but mbox given."
 msgstr ""
 "un directori de rebasament anterior %s encara existeix però s'ha donat una "
 "bústia."
 
-#: builtin/am.c:2368
+#: builtin/am.c:2400
 #, c-format
 msgid ""
 "Stray %s directory found.\n"
@@ -2708,7 +2757,7 @@
 "Directori %s extraviat trobat.\n"
 "Useu \"git am --abort\" per a eliminar-lo."
 
-#: builtin/am.c:2374
+#: builtin/am.c:2406
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr "Operació de resolució no en curs; no reprenem."
 
@@ -2716,65 +2765,65 @@
 msgid "git apply [<options>] [<patch>...]"
 msgstr "git apply [<opcions>] [<pedaç>...]"
 
-#: builtin/apply.c:112
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
 msgstr "opció d'espai en blanc '%s' no reconeguda"
 
-#: builtin/apply.c:127
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "opció d'ignoral d'espai en blanc '%s' no reconeguda"
 
-#: builtin/apply.c:822
+#: builtin/apply.c:818
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "No es pot preparar l'expressió regular de marca de temps %s"
 
-#: builtin/apply.c:831
+#: builtin/apply.c:827
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "regexec ha retornat %d per l'entrada: %s"
 
-#: builtin/apply.c:912
+#: builtin/apply.c:908
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "no s'ha pogut trobar el nom de fitxer en el pedaç a la línia %d"
 
-#: builtin/apply.c:944
+#: builtin/apply.c:940
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
 "git apply: git-diff dolent - /dev/null esperat, %s rebut en la línia %d"
 
-#: builtin/apply.c:948
+#: builtin/apply.c:944
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr ""
 "git apply: git-diff dolent - nom de fitxer nou inconsistent en la línia %d"
 
-#: builtin/apply.c:949
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr ""
 "git apply: git-diff dolent - nom de fitxer antic inconsistent en la línia %d"
 
-#: builtin/apply.c:956
+#: builtin/apply.c:952
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr "git apply: git-diff dolent - /dev/null esperat en la línia %d"
 
-#: builtin/apply.c:1419
+#: builtin/apply.c:1415
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "recompte: línia inesperada: %.*s"
 
-#: builtin/apply.c:1476
+#: builtin/apply.c:1472
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "fragment de pedaç sense capçalera a la línia %d: %.*s"
 
-#: builtin/apply.c:1493
+#: builtin/apply.c:1489
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2789,77 +2838,77 @@
 "a la capçalera de git diff li manca informació de nom de fitxer en eliminar "
 "%d components de nom de camí inicial (línia %d)"
 
-#: builtin/apply.c:1659
+#: builtin/apply.c:1655
 msgid "new file depends on old contents"
 msgstr "el fitxer nou depèn dels continguts antics"
 
-#: builtin/apply.c:1661
+#: builtin/apply.c:1657
 msgid "deleted file still has contents"
 msgstr "el fitxer suprimit encara té continguts"
 
-#: builtin/apply.c:1687
+#: builtin/apply.c:1683
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "el pedaç és malmès a la línia %d"
 
-#: builtin/apply.c:1723
+#: builtin/apply.c:1719
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "el fitxer nou %s depèn dels continguts antics"
 
-#: builtin/apply.c:1725
+#: builtin/apply.c:1721
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "el fitxer suprimit %s encara té continguts"
 
-#: builtin/apply.c:1728
+#: builtin/apply.c:1724
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "** avís: el fitxer %s queda buit però no se suprimeix"
 
-#: builtin/apply.c:1874
+#: builtin/apply.c:1870
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "pedaç binari malmès a la línia %d: %.*s"
 
-#: builtin/apply.c:1903
+#: builtin/apply.c:1899
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "pedaç binari no reconegut a la línia %d"
 
-#: builtin/apply.c:2054
+#: builtin/apply.c:2050
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "pedaç amb només escombraries a la línia %d"
 
-#: builtin/apply.c:2144
+#: builtin/apply.c:2140
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "no s'ha pogut llegir l'enllaç simbòlic %s"
 
-#: builtin/apply.c:2148
+#: builtin/apply.c:2144
 #, c-format
 msgid "unable to open or read %s"
 msgstr "no s'ha pogut obrir o llegir %s"
 
-#: builtin/apply.c:2781
+#: builtin/apply.c:2777
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "inici de línia no vàlid: '%c'"
 
-#: builtin/apply.c:2900
+#: builtin/apply.c:2896
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
 msgstr[0] "El tros #%d ha tingut èxit a %d (desplaçament %d línia)."
 msgstr[1] "El tros #%d ha tingut èxit a %d (desplaçament %d línies)."
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2908
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr "El context s'ha reduït a (%ld/%ld) per a aplicar el fragment a %d"
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2914
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -2868,326 +2917,326 @@
 "tot cercant:\n"
 "%.*s"
 
-#: builtin/apply.c:2938
+#: builtin/apply.c:2934
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "manquen les dades de pedaç binari de '%s'"
 
-#: builtin/apply.c:3039
+#: builtin/apply.c:3035
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "el pedaç binari no s'aplica a '%s'"
 
-#: builtin/apply.c:3045
+#: builtin/apply.c:3041
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
 "el pedaç binari a '%s' crea un resultat incorrecte (esperant %s, %s rebut)"
 
-#: builtin/apply.c:3066
+#: builtin/apply.c:3062
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "el pedaç ha fallat: %s:%ld"
 
-#: builtin/apply.c:3190
+#: builtin/apply.c:3186
 #, c-format
 msgid "cannot checkout %s"
 msgstr "no es pot agafar %s"
 
-#: builtin/apply.c:3235 builtin/apply.c:3246 builtin/apply.c:3291
+#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
 #, c-format
 msgid "read of %s failed"
 msgstr "la lectura de %s ha fallat"
 
-#: builtin/apply.c:3243
+#: builtin/apply.c:3239
 #, c-format
 msgid "reading from '%s' beyond a symbolic link"
 msgstr "llegint de '%s' més enllà d'un enllaç simbòlic"
 
-#: builtin/apply.c:3271 builtin/apply.c:3493
+#: builtin/apply.c:3267 builtin/apply.c:3489
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "el camí %s s'ha canviat de nom / s'ha suprimit"
 
-#: builtin/apply.c:3352 builtin/apply.c:3507
+#: builtin/apply.c:3348 builtin/apply.c:3503
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s: no existeix en l'índex"
 
-#: builtin/apply.c:3356 builtin/apply.c:3499 builtin/apply.c:3521
+#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: builtin/apply.c:3361 builtin/apply.c:3515
+#: builtin/apply.c:3357 builtin/apply.c:3511
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s: no coincideix amb l'índex"
 
-#: builtin/apply.c:3463
+#: builtin/apply.c:3459
 msgid "removal patch leaves file contents"
 msgstr "el pedaç d'eliminació deixa els continguts dels fitxers"
 
-#: builtin/apply.c:3532
+#: builtin/apply.c:3528
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s: tipus erroni"
 
-#: builtin/apply.c:3534
+#: builtin/apply.c:3530
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s és del tipus %o, s'esperava %o"
 
-#: builtin/apply.c:3693 builtin/apply.c:3695
+#: builtin/apply.c:3689 builtin/apply.c:3691
 #, c-format
 msgid "invalid path '%s'"
 msgstr "camí no vàlid: %s"
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3746
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s: ja existeix en l'índex"
 
-#: builtin/apply.c:3753
+#: builtin/apply.c:3749
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s: ja existeix en el directori de treball"
 
-#: builtin/apply.c:3773
+#: builtin/apply.c:3769
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "el mode nou (%o) de %s no coincideix amb el mode antic (%o)"
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3774
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr "el mode nou (%o) de %s no coincideix amb el mode antic (%o) de %s"
 
-#: builtin/apply.c:3798
+#: builtin/apply.c:3794
 #, c-format
 msgid "affected file '%s' is beyond a symbolic link"
 msgstr "el fitxer afectat '%s' és més enllà d'un enllaç simbòlic"
 
-#: builtin/apply.c:3802
+#: builtin/apply.c:3798
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s: el pedaç no s'aplica"
 
-#: builtin/apply.c:3816
+#: builtin/apply.c:3812
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Comprovant el pedaç %s..."
 
-#: builtin/apply.c:3909 builtin/checkout.c:232 builtin/reset.c:135
+#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "make_cache_entry ha fallat per al camí '%s'"
 
-#: builtin/apply.c:4052
+#: builtin/apply.c:4048
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "no s'ha pogut eliminar %s de l'índex"
 
-#: builtin/apply.c:4081
+#: builtin/apply.c:4077
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "pedaç malmès per al submòdul %s"
 
-#: builtin/apply.c:4085
+#: builtin/apply.c:4081
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "no s'ha pogut fer stat al fitxer novament creat '%s'"
 
-#: builtin/apply.c:4090
+#: builtin/apply.c:4086
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr ""
 "no s'ha pogut crear un magatzem de recolzament per al fitxer novament creat "
 "%s"
 
-#: builtin/apply.c:4093 builtin/apply.c:4201
+#: builtin/apply.c:4089 builtin/apply.c:4197
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "no s'ha pogut afegir una entrada de cau per a %s"
 
-#: builtin/apply.c:4126
+#: builtin/apply.c:4122
 #, c-format
 msgid "closing file '%s'"
 msgstr "tancant el fitxer '%s'"
 
-#: builtin/apply.c:4175
+#: builtin/apply.c:4171
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "no s'ha pogut escriure el fitxer '%s' mode %o"
 
-#: builtin/apply.c:4262
+#: builtin/apply.c:4258
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "El pedaç %s s'ha aplicat netament."
 
-#: builtin/apply.c:4270
+#: builtin/apply.c:4266
 msgid "internal error"
 msgstr "error intern"
 
-#: builtin/apply.c:4273
+#: builtin/apply.c:4269
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] "Aplicant el pedaç %%s amb %d rebuig"
 msgstr[1] "Aplicant el pedaç %%s amb %d rebuitjos"
 
-#: builtin/apply.c:4283
+#: builtin/apply.c:4279
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "truncant el nom del fitxer .rej a %.*s.rej"
 
-#: builtin/apply.c:4304
+#: builtin/apply.c:4300
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "El tros #%d s'ha aplicat netament."
 
-#: builtin/apply.c:4307
+#: builtin/apply.c:4303
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "S'ha rebutjat el tros #%d."
 
-#: builtin/apply.c:4397
+#: builtin/apply.c:4393
 msgid "unrecognized input"
 msgstr "entrada no reconeguda"
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4404
 msgid "unable to read index file"
 msgstr "no es pot llegir el fitxer d'índex"
 
-#: builtin/apply.c:4526
+#: builtin/apply.c:4517
 msgid "don't apply changes matching the given path"
 msgstr "no apliquis els canvis que coincideixin amb el camí donat"
 
-#: builtin/apply.c:4529
+#: builtin/apply.c:4520
 msgid "apply changes matching the given path"
 msgstr "aplica els canvis que coincideixin amb el camí donat"
 
-#: builtin/apply.c:4532
+#: builtin/apply.c:4523
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr ""
 "elimina <nombre> barres obliqües inicials dels camins de diferència "
 "tradicionals"
 
-#: builtin/apply.c:4535
+#: builtin/apply.c:4526
 msgid "ignore additions made by the patch"
 msgstr "ignora afegiments fets pel pedaç"
 
-#: builtin/apply.c:4537
+#: builtin/apply.c:4528
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr ""
 "en lloc d'aplicar el pedaç, emet les estadístiques de diferència de l'entrada"
 
-#: builtin/apply.c:4541
+#: builtin/apply.c:4532
 msgid "show number of added and deleted lines in decimal notation"
 msgstr "mostra el nombre de línies afegides i suprimides en notació decimal"
 
-#: builtin/apply.c:4543
+#: builtin/apply.c:4534
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "en lloc d'aplicar el pedaç, emet un resum de l'entrada"
 
-#: builtin/apply.c:4545
+#: builtin/apply.c:4536
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "en lloc d'aplicar el pedaç, veges si el pedaç és aplicable"
 
-#: builtin/apply.c:4547
+#: builtin/apply.c:4538
 msgid "make sure the patch is applicable to the current index"
 msgstr "assegura que el pedaç sigui aplicable a l'índex actual"
 
-#: builtin/apply.c:4549
+#: builtin/apply.c:4540
 msgid "apply a patch without touching the working tree"
 msgstr "aplica un pedaç sense tocar l'arbre de treball"
 
-#: builtin/apply.c:4551
+#: builtin/apply.c:4542
 msgid "accept a patch that touches outside the working area"
 msgstr "accepta un pedaç que toqui fora de l'àrea de treball"
 
-#: builtin/apply.c:4553
+#: builtin/apply.c:4544
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr "aplica el pedaç també (useu amb --stat/--summary/--check)"
 
-#: builtin/apply.c:4555
+#: builtin/apply.c:4546
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "intenta una fusió de tres vies si el pedaç no s'aplica"
 
-#: builtin/apply.c:4557
+#: builtin/apply.c:4548
 msgid "build a temporary index based on embedded index information"
 msgstr "construeix un índex temporal basat en la informació d'índex incrustada"
 
-#: builtin/apply.c:4559 builtin/checkout-index.c:198 builtin/ls-files.c:412
+#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412
 msgid "paths are separated with NUL character"
 msgstr "els camins se separen amb el caràcter NUL"
 
-#: builtin/apply.c:4562
+#: builtin/apply.c:4553
 msgid "ensure at least <n> lines of context match"
 msgstr "assegura't que almenys <n> línies de context coincideixin"
 
-#: builtin/apply.c:4564
+#: builtin/apply.c:4555
 msgid "detect new or modified lines that have whitespace errors"
 msgstr ""
 "detecta les línies noves o modificades que tinguin errors d'espai en blanc"
 
-#: builtin/apply.c:4567 builtin/apply.c:4570
+#: builtin/apply.c:4558 builtin/apply.c:4561
 msgid "ignore changes in whitespace when finding context"
 msgstr "ignora els canvis d'espai en blanc en cercar context"
 
-#: builtin/apply.c:4573
+#: builtin/apply.c:4564
 msgid "apply the patch in reverse"
 msgstr "aplica el pedaç al revés"
 
-#: builtin/apply.c:4575
+#: builtin/apply.c:4566
 msgid "don't expect at least one line of context"
 msgstr "no esperis almenys una línia de context"
 
-#: builtin/apply.c:4577
+#: builtin/apply.c:4568
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "deixa els trossos rebutjats en fitxers *.reg coresspondents"
 
-#: builtin/apply.c:4579
+#: builtin/apply.c:4570
 msgid "allow overlapping hunks"
 msgstr "permet trossos encavalcants"
 
-#: builtin/apply.c:4582
+#: builtin/apply.c:4573
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr "tolera una línia nova incorrectament detectada al final del fitxer"
 
-#: builtin/apply.c:4585
+#: builtin/apply.c:4576
 msgid "do not trust the line counts in the hunk headers"
 msgstr "no confiïs en els recomptes de línia en les capçaleres dels trossos"
 
-#: builtin/apply.c:4588
+#: builtin/apply.c:4579
 msgid "prepend <root> to all filenames"
 msgstr "anteposa <arrel> a tots els noms de fitxer"
 
-#: builtin/apply.c:4610
+#: builtin/apply.c:4601
 msgid "--3way outside a repository"
 msgstr "--3way fora d'un dipòsit"
 
-#: builtin/apply.c:4618
+#: builtin/apply.c:4609
 msgid "--index outside a repository"
 msgstr "--index fora d'un dipòsit"
 
-#: builtin/apply.c:4621
+#: builtin/apply.c:4612
 msgid "--cached outside a repository"
 msgstr "--cached fora d'un dipòsit"
 
-#: builtin/apply.c:4640
+#: builtin/apply.c:4631
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "no es pot obrir el pedaç '%s'"
 
-#: builtin/apply.c:4654
+#: builtin/apply.c:4645
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "%d error d'espai en blanc omès"
 msgstr[1] "%d errors d'espai en blanc omesos"
 
-#: builtin/apply.c:4660 builtin/apply.c:4670
+#: builtin/apply.c:4651 builtin/apply.c:4661
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -3249,101 +3298,101 @@
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "es documenten les <opcions-de-revisió> en git-rev-list(1)"
 
-#: builtin/blame.c:2500
+#: builtin/blame.c:2519
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Mostra les entrades de culpa mentre les trobem, incrementalment"
 
-#: builtin/blame.c:2501
+#: builtin/blame.c:2520
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
 "Mostra un SHA-1 en blanc per les comissions de frontera (Per defecte: "
 "desactivat)"
 
-#: builtin/blame.c:2502
+#: builtin/blame.c:2521
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
 "No tractis les comissions d'arrel com a límits (Per defecte: desactivat)"
 
-#: builtin/blame.c:2503
+#: builtin/blame.c:2522
 msgid "Show work cost statistics"
 msgstr "Mostra les estadístiques de preu de treball"
 
-#: builtin/blame.c:2504
+#: builtin/blame.c:2523
 msgid "Show output score for blame entries"
 msgstr "Mostra la puntuació de sortida de les entrades de culpa"
 
-#: builtin/blame.c:2505
+#: builtin/blame.c:2524
 msgid "Show original filename (Default: auto)"
 msgstr "Mostra el nom de fitxer original (Per defecte: automàtic)"
 
-#: builtin/blame.c:2506
+#: builtin/blame.c:2525
 msgid "Show original linenumber (Default: off)"
 msgstr "Mostra el número de línia original (Per defecte: desactivat)"
 
-#: builtin/blame.c:2507
+#: builtin/blame.c:2526
 msgid "Show in a format designed for machine consumption"
 msgstr "Presenta en un format dissenyat per consumpció per màquina"
 
-#: builtin/blame.c:2508
+#: builtin/blame.c:2527
 msgid "Show porcelain format with per-line commit information"
 msgstr "Mostra el format de porcellana amb informació de comissió per línia"
 
-#: builtin/blame.c:2509
+#: builtin/blame.c:2528
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 "Usa el mateix mode de sortida que git-annotate (Per defecte: desactivat)"
 
-#: builtin/blame.c:2510
+#: builtin/blame.c:2529
 msgid "Show raw timestamp (Default: off)"
 msgstr "Mostra la marca de temps crua (Per defecte: desactivat)"
 
-#: builtin/blame.c:2511
+#: builtin/blame.c:2530
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Mostra l'SHA1 de comissió llarg (Per defecte: desactivat)"
 
-#: builtin/blame.c:2512
+#: builtin/blame.c:2531
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Omet el nom d'autor i la marca de temps (Per defecte: desactivat)"
 
-#: builtin/blame.c:2513
+#: builtin/blame.c:2532
 msgid "Show author email instead of name (Default: off)"
 msgstr ""
 "Mostra l'adreça de correu electrònic de l'autor en lloc del nom (Per "
 "defecte: desactivat)"
 
-#: builtin/blame.c:2514
+#: builtin/blame.c:2533
 msgid "Ignore whitespace differences"
 msgstr "Ignora les diferències d'espai en blanc"
 
-#: builtin/blame.c:2515
+#: builtin/blame.c:2534
 msgid "Spend extra cycles to find better match"
 msgstr "Gasta cicles extres per a trobar una coincidència millor"
 
-#: builtin/blame.c:2516
+#: builtin/blame.c:2535
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Usa les revisions de <fitxer> en lloc d'invocar git-rev-list"
 
-#: builtin/blame.c:2517
+#: builtin/blame.c:2536
 msgid "Use <file>'s contents as the final image"
 msgstr "Usa els continguts de <fitxer> com a la imatge final"
 
-#: builtin/blame.c:2518 builtin/blame.c:2519
+#: builtin/blame.c:2537 builtin/blame.c:2538
 msgid "score"
 msgstr "puntuació"
 
-#: builtin/blame.c:2518
+#: builtin/blame.c:2537
 msgid "Find line copies within and across files"
 msgstr "Troba còpies de línia dins i a través dels fitxers"
 
-#: builtin/blame.c:2519
+#: builtin/blame.c:2538
 msgid "Find line movements within and across files"
 msgstr "Troba moviments de línia dins i a través dels fitxers"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "Process only line range n,m, counting from 1"
 msgstr "Processa només el rang de línies n,m, comptant des d'1"
 
@@ -3353,27 +3402,31 @@
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2601
+#: builtin/blame.c:2620
 msgid "4 years, 11 months ago"
 msgstr "fa 4 anys i 11 mesos"
 
-#: builtin/branch.c:24
+#: builtin/branch.c:25
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<opcions>] [-r | -a] [--merged | --no-merged]"
 
-#: builtin/branch.c:25
+#: builtin/branch.c:26
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<opcions>] [-l] [-f] <nom-de-branca> [<punt-inicial>]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<opcions>] [-r] (-d | -D) <nom-de-branca>..."
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [<opcions>] (-m | -M) [<branca-antiga>] <branca-nova>"
 
-#: builtin/branch.c:150
+#: builtin/branch.c:29
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr "git branch [<opcions>] [-r | -a] [--points-at]"
+
+#: builtin/branch.c:142
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -3383,7 +3436,7 @@
 "         '%s', però encara no s'ha fusionat\n"
 "         a HEAD."
 
-#: builtin/branch.c:154
+#: builtin/branch.c:146
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -3393,12 +3446,12 @@
 "         fusionat a '%s', encara que està\n"
 "         fusionada a HEAD."
 
-#: builtin/branch.c:168
+#: builtin/branch.c:160
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "No s'ha pogut trobar l'objecte de comissió de '%s'"
 
-#: builtin/branch.c:172
+#: builtin/branch.c:164
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -3407,348 +3460,340 @@
 "La branca '%s' no està totalment fusionada.\n"
 "Si esteu segur que la voleu suprimir, executeu 'git branch -D %s'."
 
-#: builtin/branch.c:185
+#: builtin/branch.c:177
 msgid "Update of config-file failed"
 msgstr "L'actualització del fitxer de configuració ha fallat"
 
-#: builtin/branch.c:213
+#: builtin/branch.c:205
 msgid "cannot use -a with -d"
 msgstr "no es pot usar -a amb -d"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:211
 msgid "Couldn't look up commit object for HEAD"
 msgstr "No s'ha pogut trobar l'objecte de comissió de HEAD"
 
-#: builtin/branch.c:227
+#: builtin/branch.c:219
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr "No es pot suprimir la branca '%s', en la qual sou actualment."
 
-#: builtin/branch.c:243
+#: builtin/branch.c:235
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "no s'ha trobat la branca amb seguiment remot '%s'."
 
-#: builtin/branch.c:244
+#: builtin/branch.c:236
 #, c-format
 msgid "branch '%s' not found."
 msgstr "no s'ha trobat la branca '%s'."
 
-#: builtin/branch.c:259
+#: builtin/branch.c:251
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Error en suprimir la branca amb seguiment remot '%s'"
 
-#: builtin/branch.c:260
+#: builtin/branch.c:252
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Error en suprimir la branca '%s'"
 
-#: builtin/branch.c:267
+#: builtin/branch.c:259
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "S'ha suprimit la branca amb seguiment remot %s (era %s).\n"
 
-#: builtin/branch.c:268
+#: builtin/branch.c:260
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "S'ha suprimit la branca %s (era %s).\n"
 
-#: builtin/branch.c:369
-#, c-format
-msgid "branch '%s' does not point at a commit"
-msgstr "la branca '%s' no assenyala cap comissió"
-
-#: builtin/branch.c:452
+#: builtin/branch.c:303
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: no hi és]"
 
-#: builtin/branch.c:457
+#: builtin/branch.c:308
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:462
+#: builtin/branch.c:313
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: darrere per %d]"
 
-#: builtin/branch.c:464
+#: builtin/branch.c:315
 #, c-format
 msgid "[behind %d]"
 msgstr "[darrere de %d]"
 
-#: builtin/branch.c:468
+#: builtin/branch.c:319
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: davant per %d]"
 
-#: builtin/branch.c:470
+#: builtin/branch.c:321
 #, c-format
 msgid "[ahead %d]"
 msgstr "[davant de %d]"
 
-#: builtin/branch.c:473
+#: builtin/branch.c:324
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: davant per %d, darrere per %d]"
 
-#: builtin/branch.c:476
+#: builtin/branch.c:327
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[davant %d, darrere %d]"
 
-#: builtin/branch.c:489
+#: builtin/branch.c:340
 msgid " **** invalid ref ****"
 msgstr " **** referència no vàlida ****"
 
-#: builtin/branch.c:580
+#: builtin/branch.c:366
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(cap branca, rebasant %s)"
 
-#: builtin/branch.c:583
+#: builtin/branch.c:369
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(cap branca, bisecció començada en %s)"
 
-#: builtin/branch.c:589
+#: builtin/branch.c:375
 #, c-format
 msgid "(HEAD detached at %s)"
 msgstr "(HEAD separat a %s)"
 
-#: builtin/branch.c:592
+#: builtin/branch.c:378
 #, c-format
 msgid "(HEAD detached from %s)"
 msgstr "(HEAD separat de %s)"
 
-#: builtin/branch.c:596
+#: builtin/branch.c:382
 msgid "(no branch)"
 msgstr "(cap branca)"
 
-#: builtin/branch.c:643
-#, c-format
-msgid "object '%s' does not point to a commit"
-msgstr "l'objecte '%s' no assenyala cap comissió"
-
-#: builtin/branch.c:691
-msgid "some refs could not be read"
-msgstr "no s'han pogut llegir algunes referències"
-
-#: builtin/branch.c:704
+#: builtin/branch.c:524
 msgid "cannot rename the current branch while not on any."
 msgstr "no es pot canviar el nom de la branca actual mentre no s'és a cap."
 
-#: builtin/branch.c:714
+#: builtin/branch.c:534
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Nom de branca no vàlid: '%s'"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:549
 msgid "Branch rename failed"
 msgstr "El canvi de nom de branca ha fallat"
 
-#: builtin/branch.c:733
+#: builtin/branch.c:553
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "S'ha canviat el nom de la branca malanomenada '%s'"
 
-#: builtin/branch.c:737
+#: builtin/branch.c:557
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "S'ha canviat el nom de la branca a %s, però HEAD no està actualitzat!"
 
-#: builtin/branch.c:744
+#: builtin/branch.c:564
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 "La branca està canviada de nom, però l'actualització del fitxer de "
 "configuració ha fallat"
 
-#: builtin/branch.c:759
-#, c-format
-msgid "malformed object name %s"
-msgstr "nom d'objecte %s mal format"
-
-#: builtin/branch.c:781
+#: builtin/branch.c:587
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr "no s'ha pogut escriure la plantilla de descripció de branca: %s"
 
-#: builtin/branch.c:811
+#: builtin/branch.c:616
 msgid "Generic options"
 msgstr "Opcions genèriques"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:618
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "mostra el hash i l'assumpte, doneu dues vegades per la branca font"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:619
 msgid "suppress informational messages"
 msgstr "omet els missatges informatius"
 
-#: builtin/branch.c:815
+#: builtin/branch.c:620
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "configura el mode de seguiment (vegeu git-pull(1))"
 
-#: builtin/branch.c:817
+#: builtin/branch.c:622
 msgid "change upstream info"
 msgstr "canvia la informació de font"
 
-#: builtin/branch.c:821
+#: builtin/branch.c:626
 msgid "use colored output"
 msgstr "usa sortida colorada"
 
-#: builtin/branch.c:822
+#: builtin/branch.c:627
 msgid "act on remote-tracking branches"
 msgstr "actua en branques amb seguiment remot"
 
-#: builtin/branch.c:825 builtin/branch.c:831 builtin/branch.c:852
-#: builtin/branch.c:858 builtin/commit.c:1580 builtin/commit.c:1581
-#: builtin/commit.c:1582 builtin/commit.c:1583 builtin/tag.c:618
-#: builtin/tag.c:624
-msgid "commit"
-msgstr "comissió"
-
-#: builtin/branch.c:826 builtin/branch.c:832
+#: builtin/branch.c:629 builtin/branch.c:630
 msgid "print only branches that contain the commit"
 msgstr "imprimeix només les branques que continguin la comissió"
 
-#: builtin/branch.c:838
+#: builtin/branch.c:633
 msgid "Specific git-branch actions:"
 msgstr "Accions de git-branch específiques:"
 
-#: builtin/branch.c:839
+#: builtin/branch.c:634
 msgid "list both remote-tracking and local branches"
 msgstr "llista les branques amb seguiment remot i les locals"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:636
 msgid "delete fully merged branch"
 msgstr "suprimeix la branca si està completament fusionada"
 
-#: builtin/branch.c:842
+#: builtin/branch.c:637
 msgid "delete branch (even if not merged)"
 msgstr "suprimeix la branca (encara que no estigui fusionada)"
 
-#: builtin/branch.c:843
+#: builtin/branch.c:638
 msgid "move/rename a branch and its reflog"
 msgstr "mou/canvia de nom una branca i el seu registre de referència"
 
-#: builtin/branch.c:844
+#: builtin/branch.c:639
 msgid "move/rename a branch, even if target exists"
 msgstr "mou/canvia de nom una branca, encara que el destí existeixi"
 
-#: builtin/branch.c:845
+#: builtin/branch.c:640
 msgid "list branch names"
 msgstr "llista els noms de branca"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:641
 msgid "create the branch's reflog"
 msgstr "crea el registre de referència de la branca"
 
-#: builtin/branch.c:848
+#: builtin/branch.c:643
 msgid "edit the description for the branch"
 msgstr "edita la descripció de la branca"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:644
 msgid "force creation, move/rename, deletion"
 msgstr "força creació, moviment/canvi de nom, supressió"
 
-#: builtin/branch.c:852
-msgid "print only not merged branches"
-msgstr "imprimeix només les branques sense fusionar"
+#: builtin/branch.c:645
+msgid "print only branches that are merged"
+msgstr "imprimeix només les branques que s'han fusionat"
 
-#: builtin/branch.c:858
-msgid "print only merged branches"
-msgstr "imprimeix només les branques fusionades"
+#: builtin/branch.c:646
+msgid "print only branches that are not merged"
+msgstr "imprimeix només les branques que no s'han fusionat"
 
-#: builtin/branch.c:862
+#: builtin/branch.c:647
 msgid "list branches in columns"
 msgstr "llista les branques en columnes"
 
-#: builtin/branch.c:875
+#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
+msgstr "clau"
+
+#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
+msgstr "nom del camp en el qual ordenar"
+
+#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398
+#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564
+#: builtin/tag.c:369
+msgid "object"
+msgstr "objecte"
+
+#: builtin/branch.c:652
+msgid "print only branches of the object"
+msgstr "imprimeix només les branques de l'objecte"
+
+#: builtin/branch.c:670
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "S'ha fallat en resoldre HEAD com a referència vàlida."
 
-#: builtin/branch.c:879 builtin/clone.c:690
+#: builtin/branch.c:674 builtin/clone.c:697
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD no trobat sota refs/heads!"
 
-#: builtin/branch.c:901
+#: builtin/branch.c:694
 msgid "--column and --verbose are incompatible"
 msgstr "--column i --verbose són incompatibles"
 
-#: builtin/branch.c:912 builtin/branch.c:951
+#: builtin/branch.c:705 builtin/branch.c:747
 msgid "branch name required"
 msgstr "cal el nom de branca"
 
-#: builtin/branch.c:927
+#: builtin/branch.c:723
 msgid "Cannot give description to detached HEAD"
 msgstr "No es pot donar descripció a un HEAD separat"
 
-#: builtin/branch.c:932
+#: builtin/branch.c:728
 msgid "cannot edit description of more than one branch"
 msgstr "no es pot editar la descripció de més d'una branca"
 
-#: builtin/branch.c:939
+#: builtin/branch.c:735
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Encara no hi ha comissió en la branca '%s'."
 
-#: builtin/branch.c:942
+#: builtin/branch.c:738
 #, c-format
 msgid "No branch named '%s'."
 msgstr "No hi ha branca amb nom '%s'."
 
-#: builtin/branch.c:957
+#: builtin/branch.c:753
 msgid "too many branches for a rename operation"
 msgstr "hi ha massa branques per a una operació de canvi de nom"
 
-#: builtin/branch.c:962
+#: builtin/branch.c:758
 msgid "too many branches to set new upstream"
 msgstr "hi ha massa branques per a establir una nova font"
 
-#: builtin/branch.c:966
+#: builtin/branch.c:762
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr ""
 "no s'ha pogut establir la font de HEAD com a %s quan no assenyala cap branca."
 
-#: builtin/branch.c:969 builtin/branch.c:991 builtin/branch.c:1012
+#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808
 #, c-format
 msgid "no such branch '%s'"
 msgstr "no hi ha tal branca '%s'"
 
-#: builtin/branch.c:973
+#: builtin/branch.c:769
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "la branca '%s' no existeix"
 
-#: builtin/branch.c:985
+#: builtin/branch.c:781
 msgid "too many branches to unset upstream"
 msgstr "hi ha massa branques per a desestablir la font"
 
-#: builtin/branch.c:989
+#: builtin/branch.c:785
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "no s'ha pogut desestablir la font de HEAD perquè no assenyala cap branca."
 
-#: builtin/branch.c:995
+#: builtin/branch.c:791
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "La branca '%s' no té informació de font"
 
-#: builtin/branch.c:1009
+#: builtin/branch.c:805
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "no té sentit crear 'HEAD' manualment"
 
-#: builtin/branch.c:1015
+#: builtin/branch.c:811
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "les opcions -a i -r a 'git branch' no tenen sentit amb un nom de branca"
 
-#: builtin/branch.c:1018
+#: builtin/branch.c:814
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3757,7 +3802,7 @@
 "La bandera --set-upstream està desaprovada i s'eliminarà. Considereu usar --"
 "track o --set-upstream-to\n"
 
-#: builtin/branch.c:1035
+#: builtin/branch.c:831
 #, c-format
 msgid ""
 "\n"
@@ -3768,12 +3813,12 @@
 "Si volíeu fer '%s' seguir '%s', feu això:\n"
 "\n"
 
-#: builtin/branch.c:1036
+#: builtin/branch.c:832
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr "    git branch -d %s\n"
 
-#: builtin/branch.c:1037
+#: builtin/branch.c:833
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr "    git branch --set-upstream-to %s\n"
@@ -3800,12 +3845,8 @@
 "<tipus>|--textconv) <objecte>"
 
 #: builtin/cat-file.c:429
-msgid ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <list-of-"
-"objects>"
-msgstr ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <llista-"
-"d'objectes>"
+msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
 
 #: builtin/cat-file.c:466
 msgid "<type> can be one of: blob, tree, commit, tag"
@@ -3862,9 +3903,8 @@
 msgstr "git check-attr [-a | --all | <atribut>...] [--] <nom-de-camí>..."
 
 #: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...] < <list-of-paths>"
-msgstr ""
-"git check-attr --stdin [-z] [-a | --all | <atribut>...] < <llista-de-camins>"
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+msgstr "git check-attr --stdin [-z] [-a | --all | <atribut>...]"
 
 #: builtin/check-attr.c:19
 msgid "report all attributes set on file"
@@ -3882,7 +3922,7 @@
 msgid "terminate input and output records by a NUL character"
 msgstr "acaba els registres d'entrada i de sortida amb un caràcter NUL"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1133 builtin/gc.c:267
+#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "omet el reportatge de progrés"
 
@@ -3968,6 +4008,8 @@
 msgstr "escriu el contingut a fitxers temporals"
 
 #: builtin/checkout-index.c:204 builtin/column.c:30
+#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181
 msgid "string"
 msgstr "cadena"
 
@@ -3987,106 +4029,106 @@
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<opcions>] [<branca>] -- <fitxer>..."
 
-#: builtin/checkout.c:133 builtin/checkout.c:166
+#: builtin/checkout.c:134 builtin/checkout.c:167
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "el camí '%s' no té la versió nostra"
 
-#: builtin/checkout.c:135 builtin/checkout.c:168
+#: builtin/checkout.c:136 builtin/checkout.c:169
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "el camí '%s' no té la versió seva"
 
-#: builtin/checkout.c:151
+#: builtin/checkout.c:152
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "el camí '%s' no té totes les versions necessàries"
 
-#: builtin/checkout.c:195
+#: builtin/checkout.c:196
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "el camí '%s' no té les versions necessàries"
 
-#: builtin/checkout.c:212
+#: builtin/checkout.c:213
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "camí '%s': no es pot fusionar"
 
-#: builtin/checkout.c:229
+#: builtin/checkout.c:230
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "no s'ha pogut afegir el resultat de fusió per a '%s'"
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
+#: builtin/checkout.c:260
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "'%s' no es pot usar amb actualització de camins"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:263 builtin/checkout.c:266
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' no es pot usar amb %s"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:269
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 "No es pot actualitzar els camins i canviar a la branca '%s' a la vegada."
 
-#: builtin/checkout.c:279 builtin/checkout.c:473
+#: builtin/checkout.c:280 builtin/checkout.c:474
 msgid "corrupt index file"
 msgstr "fitxer d'índex malmès"
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:340 builtin/checkout.c:347
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "el camí '%s' està sense fusionar"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:496
 msgid "you need to resolve your current index first"
 msgstr "heu de resoldre el vostre índex actual primer"
 
-#: builtin/checkout.c:622
+#: builtin/checkout.c:623
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "No es pot fer reflog per a '%s': %s\n"
 
-#: builtin/checkout.c:660
+#: builtin/checkout.c:661
 msgid "HEAD is now at"
 msgstr "HEAD ara és a"
 
-#: builtin/checkout.c:667
+#: builtin/checkout.c:668
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Restableix la branca '%s'\n"
 
-#: builtin/checkout.c:670
+#: builtin/checkout.c:671
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Ja en '%s'\n"
 
-#: builtin/checkout.c:674
+#: builtin/checkout.c:675
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "S'ha agafat i restablert la branca '%s'\n"
 
-#: builtin/checkout.c:676 builtin/checkout.c:1065
+#: builtin/checkout.c:677 builtin/checkout.c:1066
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "S'ha agafat la branca nova '%s'\n"
 
-#: builtin/checkout.c:678
+#: builtin/checkout.c:679
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "S'ha agafat la branca '%s'\n"
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:731
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... i %d més.\n"
 
-#: builtin/checkout.c:736
+#: builtin/checkout.c:737
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4109,7 +4151,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:755
+#: builtin/checkout.c:756
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -4136,144 +4178,150 @@
 " git branch <nom-de-branca-nova> %s\n"
 "\n"
 
-#: builtin/checkout.c:791
+#: builtin/checkout.c:792
 msgid "internal error in revision walk"
 msgstr "error intern en el passeig per revisions"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:796
 msgid "Previous HEAD position was"
 msgstr "La posició de HEAD anterior era"
 
-#: builtin/checkout.c:822 builtin/checkout.c:1060
+#: builtin/checkout.c:823 builtin/checkout.c:1061
 msgid "You are on a branch yet to be born"
 msgstr "Sou en una branca que encara ha de nàixer"
 
-#: builtin/checkout.c:967
+#: builtin/checkout.c:968
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "només una referència esperada, %d donades."
 
-#: builtin/checkout.c:1006 builtin/worktree.c:210
+#: builtin/checkout.c:1007 builtin/worktree.c:213
 #, c-format
 msgid "invalid reference: %s"
 msgstr "referència no vàlida: %s"
 
-#: builtin/checkout.c:1035
+#: builtin/checkout.c:1036
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "la referència no és un arbre: %s"
 
-#: builtin/checkout.c:1074
+#: builtin/checkout.c:1075
 msgid "paths cannot be used with switching branches"
 msgstr "els camins no es poden usar amb canvi de branca"
 
-#: builtin/checkout.c:1077 builtin/checkout.c:1081
+#: builtin/checkout.c:1078 builtin/checkout.c:1082
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' no es pot usar amb canvi de branca"
 
-#: builtin/checkout.c:1085 builtin/checkout.c:1088 builtin/checkout.c:1093
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094
+#: builtin/checkout.c:1097
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' no es pot usar amb '%s'"
 
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1102
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "No es pot canviar la branca a la no comissió '%s'"
 
-#: builtin/checkout.c:1134 builtin/checkout.c:1136 builtin/clone.c:83
-#: builtin/remote.c:159 builtin/remote.c:161 builtin/worktree.c:317
-#: builtin/worktree.c:319
+#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320
+#: builtin/worktree.c:322
 msgid "branch"
 msgstr "branca"
 
-#: builtin/checkout.c:1135
+#: builtin/checkout.c:1136
 msgid "create and checkout a new branch"
 msgstr "crea i agafa una branca nova"
 
-#: builtin/checkout.c:1137
+#: builtin/checkout.c:1138
 msgid "create/reset and checkout a branch"
 msgstr "crea/restableix i agafa una branca"
 
-#: builtin/checkout.c:1138
+#: builtin/checkout.c:1139
 msgid "create reflog for new branch"
 msgstr "crea un registre de referència per a la branca nova"
 
-#: builtin/checkout.c:1139
+#: builtin/checkout.c:1140
 msgid "detach the HEAD at named commit"
 msgstr "separa el HEAD a la comissió anomenada"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "set upstream info for new branch"
 msgstr "estableix la informació de font de la branca nova"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new-branch"
 msgstr "branca-nova"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new unparented branch"
 msgstr "branca òrfena nova"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "checkout our version for unmerged files"
 msgstr "agafa la versió nostra dels fitxers sense fusionar"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "checkout their version for unmerged files"
 msgstr "agafa la versió seva dels fitxers sense fusionar"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1148
 msgid "force checkout (throw away local modifications)"
 msgstr "agafa a la força (descarta qualsevulla modificació local)"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "perform a 3-way merge with the new branch"
 msgstr "realitza una fusió de 3 vies amb la branca nova"
 
-#: builtin/checkout.c:1149 builtin/merge.c:227
+#: builtin/checkout.c:1150 builtin/merge.c:227
 msgid "update ignored files (default)"
 msgstr "actualitza els fitxers ignorats (per defecte)"
 
-#: builtin/checkout.c:1150 builtin/log.c:1264 parse-options.h:249
+#: builtin/checkout.c:1151 builtin/log.c:1266 parse-options.h:250
 msgid "style"
 msgstr "estil"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "conflict style (merge or diff3)"
 msgstr "estil de conflicte (fusió o diff3)"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "no limitis les especificacions de camí només a entrades disperses"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1157
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "dubta 'git checkout <cap-branca-així>'"
 
-#: builtin/checkout.c:1158
+#: builtin/checkout.c:1159
 msgid "do not check if another worktree is holding the given ref"
 msgstr "no comprovis si altre arbre de treball té la referència donada"
 
-#: builtin/checkout.c:1181
+#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112
+#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:558
+#: builtin/send-pack.c:168
+msgid "force progress reporting"
+msgstr "força l'informe de progrés"
+
+#: builtin/checkout.c:1191
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B i --orphan són mutualment exclusius"
 
-#: builtin/checkout.c:1198
+#: builtin/checkout.c:1208
 msgid "--track needs a branch name"
 msgstr "--track necessita un nom de branca"
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1213
 msgid "Missing branch name; try -b"
 msgstr "Manca el nom de branca; proveu -b"
 
-#: builtin/checkout.c:1239
+#: builtin/checkout.c:1249
 msgid "invalid path specification"
 msgstr "especificació de camí no vàlida"
 
-#: builtin/checkout.c:1246
+#: builtin/checkout.c:1256
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4282,12 +4330,12 @@
 "No es poden actualitzar els camins i canviar a la branca '%s' a la vegada.\n"
 "Volíeu agafar '%s', la qual no es pot resoldre com a comissió?"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1261
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach no accepta un paràmetre de camí '%s'"
 
-#: builtin/checkout.c:1255
+#: builtin/checkout.c:1265
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4326,7 +4374,7 @@
 msgid "failed to remove %s"
 msgstr "s'ha fallat en eliminar %s"
 
-#: builtin/clean.c:317
+#: builtin/clean.c:315
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -4338,7 +4386,7 @@
 "foo        - selecciona un ítem basat en un prefix únic\n"
 "           - (buit) no seleccionis res"
 
-#: builtin/clean.c:321
+#: builtin/clean.c:319
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -4358,36 +4406,36 @@
 "*          - tria tots els ítems\n"
 "           - (buit) finalitza la selecció"
 
-#: builtin/clean.c:537
+#: builtin/clean.c:535
 #, c-format
 msgid "Huh (%s)?"
 msgstr "Perdó (%s)?"
 
-#: builtin/clean.c:679
+#: builtin/clean.c:677
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Introduïu els patrons a ignorar>> "
 
-#: builtin/clean.c:716
+#: builtin/clean.c:714
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "AVÍS: No es pot trobar ítems que coincideixin amb: %s"
 
-#: builtin/clean.c:737
+#: builtin/clean.c:735
 msgid "Select items to delete"
 msgstr "Selecciona els ítems a suprimir"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:778
+#: builtin/clean.c:776
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "Voleu eliminar %s [y/N]? "
 
-#: builtin/clean.c:803
+#: builtin/clean.c:801
 msgid "Bye."
 msgstr "Adéu."
 
-#: builtin/clean.c:811
+#: builtin/clean.c:809
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -4405,62 +4453,62 @@
 "help                - aquesta pantalla\n"
 "?                   - ajuda de selecció de l'avís"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:836
 msgid "*** Commands ***"
 msgstr "*** Ordres ***"
 
-#: builtin/clean.c:839
+#: builtin/clean.c:837
 msgid "What now"
 msgstr "I ara què"
 
-#: builtin/clean.c:847
+#: builtin/clean.c:845
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Eliminaria l'ítem següent:"
 msgstr[1] "Eliminaria els ítems següents:"
 
-#: builtin/clean.c:864
+#: builtin/clean.c:862
 msgid "No more files to clean, exiting."
 msgstr "No hi ha més fitxers a netejar; sortint."
 
-#: builtin/clean.c:895
+#: builtin/clean.c:893
 msgid "do not print names of files removed"
 msgstr "no imprimeixis els noms dels fitxers eliminats"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:895
 msgid "force"
 msgstr "força"
 
-#: builtin/clean.c:898
+#: builtin/clean.c:896
 msgid "interactive cleaning"
 msgstr "neteja interactiva"
 
-#: builtin/clean.c:900
+#: builtin/clean.c:898
 msgid "remove whole directories"
 msgstr "elimina directoris sencers"
 
-#: builtin/clean.c:901 builtin/describe.c:407 builtin/grep.c:714
-#: builtin/ls-files.c:443 builtin/name-rev.c:311 builtin/show-ref.c:187
+#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709
+#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182
 msgid "pattern"
 msgstr "patró"
 
-#: builtin/clean.c:902
+#: builtin/clean.c:900
 msgid "add <pattern> to ignore rules"
 msgstr "afegiu <patró> per a ignorar les regles"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:901
 msgid "remove ignored files, too"
 msgstr "elimina els fitxers ignorats, també"
 
-#: builtin/clean.c:905
+#: builtin/clean.c:903
 msgid "remove only ignored files"
 msgstr "elimina només els fitxers ignorats"
 
-#: builtin/clean.c:923
+#: builtin/clean.c:921
 msgid "-x and -X cannot be used together"
 msgstr "-x i -X no es poden usar junts"
 
-#: builtin/clean.c:927
+#: builtin/clean.c:925
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -4468,7 +4516,7 @@
 "clean.requireForce està establerta a veritat i ni -i, -n ni -f s'ha donat; "
 "refusant netejar"
 
-#: builtin/clean.c:930
+#: builtin/clean.c:928
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -4480,16 +4528,11 @@
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<opcions>] [--] <dipòsit> [<directori>]"
 
-#: builtin/clone.c:57 builtin/fetch.c:112 builtin/merge.c:224
-#: builtin/pull.c:109 builtin/push.c:560 builtin/send-pack.c:168
-msgid "force progress reporting"
-msgstr "força l'informe de progrés"
-
 #: builtin/clone.c:59
 msgid "don't create a checkout"
-msgstr "no facis cap agafada"
+msgstr "no facis cap agafament"
 
-#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:504
+#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469
 msgid "create a bare repository"
 msgstr "crea un dipòsit nu"
 
@@ -4513,15 +4556,15 @@
 msgid "initialize submodules in the clone"
 msgstr "inicialitza els submòduls en el clon"
 
-#: builtin/clone.c:75 builtin/init-db.c:501
+#: builtin/clone.c:75 builtin/init-db.c:466
 msgid "template-directory"
 msgstr "directori-de-plantilla"
 
-#: builtin/clone.c:76 builtin/init-db.c:502
+#: builtin/clone.c:76 builtin/init-db.c:467
 msgid "directory from which templates will be used"
 msgstr "directori del qual les plantilles s'usaran"
 
-#: builtin/clone.c:78
+#: builtin/clone.c:78 builtin/submodule--helper.c:179
 msgid "reference repository"
 msgstr "dipòsit de referència"
 
@@ -4545,7 +4588,7 @@
 msgid "path to git-upload-pack on the remote"
 msgstr "camí a git-upload-pack en el remot"
 
-#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:659 builtin/pull.c:186
+#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654 builtin/pull.c:186
 msgid "depth"
 msgstr "profunditat"
 
@@ -4557,11 +4600,11 @@
 msgid "clone only one branch, HEAD or --branch"
 msgstr "clona només una branca, HEAD o --branch"
 
-#: builtin/clone.c:91 builtin/init-db.c:510
+#: builtin/clone.c:91 builtin/init-db.c:475
 msgid "gitdir"
 msgstr "directori de git"
 
-#: builtin/clone.c:92 builtin/init-db.c:511
+#: builtin/clone.c:92 builtin/init-db.c:476
 msgid "separate git dir from working tree"
 msgstr "separa el directori de git de l'arbre de treball"
 
@@ -4573,178 +4616,181 @@
 msgid "set config inside the new repository"
 msgstr "estableix la configuració dins del dipòsit nou"
 
-#: builtin/clone.c:298
+#: builtin/clone.c:300
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr ""
+"Encara no se suporta el dipòsit de referència '%s' com a agafament enllaçat."
+
+#: builtin/clone.c:302
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr "el dipòsit de referència '%s' no és un dipòsit local."
 
-#: builtin/clone.c:302
+#: builtin/clone.c:307
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "el dipòsit de referència '%s' és superficial"
 
-#: builtin/clone.c:305
+#: builtin/clone.c:310
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "el dipòsit de referència '%s' és empeltat"
 
-#: builtin/clone.c:370 builtin/diff.c:84
+#: builtin/clone.c:375 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "s'ha fallat en fer stat a '%s'"
 
-#: builtin/clone.c:372
+#: builtin/clone.c:377
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existeix i no és directori"
 
-#: builtin/clone.c:386
+#: builtin/clone.c:391
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "s'ha fallat en fer stat a '%s'\n"
 
-#: builtin/clone.c:408
+#: builtin/clone.c:413
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "s'ha fallat en crear l'enllaç '%s'"
 
-#: builtin/clone.c:412
+#: builtin/clone.c:417
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "s'ha fallat en copiar el fitxer a '%s'"
 
-#: builtin/clone.c:435 builtin/clone.c:619
+#: builtin/clone.c:442 builtin/clone.c:626
 #, c-format
 msgid "done.\n"
 msgstr "fet.\n"
 
-#: builtin/clone.c:447
+#: builtin/clone.c:454
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
 "and retry the checkout with 'git checkout -f HEAD'\n"
 msgstr ""
-"La clonació ha tingut èxit, però l'agafada ha fallat.\n"
-"Podeu inspeccionar què s'ha agafat amb 'git status' i\n"
-"tornar a intentar l'agafada amb 'git checkout -f HEAD'\n"
+"La clonació ha tingut èxit, però l'agafament ha\n"
+"fallat. Podeu inspeccionar què s'ha agafat amb\n"
+"'git status' i tornar a intentar l'agafament amb\n"
+"'git checkout -f HEAD'\n"
 
-#: builtin/clone.c:524
+#: builtin/clone.c:531
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "No s'ha pogut trobar la branca remota %s per a clonar."
 
-#: builtin/clone.c:614
+#: builtin/clone.c:621
 #, c-format
 msgid "Checking connectivity... "
 msgstr "Provant connectivitat... "
 
-#: builtin/clone.c:617
+#: builtin/clone.c:624
 msgid "remote did not send all necessary objects"
 msgstr "el remot no ha enviat tots els objectes necessaris"
 
-#: builtin/clone.c:681
+#: builtin/clone.c:688
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "el HEAD remot es refereix a una referència que no existeix; no s'ha pogut "
 "agafar.\n"
 
-#: builtin/clone.c:712
+#: builtin/clone.c:719
 msgid "unable to checkout working tree"
 msgstr "no s'ha pogut agafar l'arbre de treball"
 
-#: builtin/clone.c:799
+#: builtin/clone.c:808
 msgid "cannot repack to clean up"
 msgstr "no es pot reempaquetar per a netejar"
 
-#: builtin/clone.c:801
+#: builtin/clone.c:810
 msgid "cannot unlink temporary alternates file"
 msgstr "no es pot desenllaçar el fitxer d'alternatives temporal"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:842
 msgid "Too many arguments."
 msgstr "Hi ha massa paràmetres."
 
-#: builtin/clone.c:835
+#: builtin/clone.c:846
 msgid "You must specify a repository to clone."
 msgstr "Heu d'especificar un dipòsit per a clonar."
 
-#: builtin/clone.c:846
+#: builtin/clone.c:857
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "les opcions --bare i --origin %s són incompatibles."
 
-#: builtin/clone.c:849
+#: builtin/clone.c:860
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare i --separate-git-dir són incompatibles."
 
-#: builtin/clone.c:862
+#: builtin/clone.c:873
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "el dipòsit '%s' no existeix"
 
-#: builtin/clone.c:868 builtin/fetch.c:1168
+#: builtin/clone.c:879 builtin/fetch.c:1166
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "la profunditat %s no és nombre positiu"
 
-#: builtin/clone.c:878
+#: builtin/clone.c:889
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "el camí destí '%s' ja existeix i no és un directori buit."
 
-#: builtin/clone.c:888
+#: builtin/clone.c:899
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "l'arbre de treball '%s' ja existeix."
 
-#: builtin/clone.c:903 builtin/clone.c:914 builtin/worktree.c:218
-#: builtin/worktree.c:245
+#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224
+#: builtin/worktree.c:221 builtin/worktree.c:248
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "no s'ha pogut crear els directoris inicials de '%s'"
 
-#: builtin/clone.c:906
+#: builtin/clone.c:917
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "no s'ha pogut crear el directori d'arbre de treball '%s'"
 
-#: builtin/clone.c:924
+#: builtin/clone.c:935
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Clonant al dipòsit nu '%s'...\n"
 
-#: builtin/clone.c:926
+#: builtin/clone.c:937
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Clonant a '%s'...\n"
 
-#: builtin/clone.c:951
-msgid "--dissociate given, but there is no --reference"
-msgstr "s'ha donat --dissociate, però no hi ha --reference"
-
-#: builtin/clone.c:968
+#: builtin/clone.c:975
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth s'ignora en els clons locals; useu file:// en lloc d'això."
 
-#: builtin/clone.c:971
+#: builtin/clone.c:978
 msgid "source repository is shallow, ignoring --local"
 msgstr "el dipòsit font és superficial, ignorant --local"
 
-#: builtin/clone.c:976
+#: builtin/clone.c:983
 msgid "--local is ignored"
 msgstr "--local s'ignora"
 
-#: builtin/clone.c:980
+#: builtin/clone.c:987
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "No se sap com clonar %s"
 
-#: builtin/clone.c:1029 builtin/clone.c:1037
+#: builtin/clone.c:1036 builtin/clone.c:1044
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "La branca remota %s no es troba en la font %s"
 
-#: builtin/clone.c:1040
+#: builtin/clone.c:1047
 msgid "You appear to have cloned an empty repository."
 msgstr "Sembla que heu clonat un dipòsit buit."
 
@@ -4780,15 +4826,15 @@
 msgid "--command must be the first argument"
 msgstr "--command ha de ser el primer paràmetre"
 
-#: builtin/commit.c:37
+#: builtin/commit.c:38
 msgid "git commit [<options>] [--] <pathspec>..."
 msgstr "git commit [<opcions>] [--] <especificació-de-camí>..."
 
-#: builtin/commit.c:42
+#: builtin/commit.c:43
 msgid "git status [<options>] [--] <pathspec>..."
 msgstr "git status [<opcions>] [--] <especificació-de-camí>..."
 
-#: builtin/commit.c:47
+#: builtin/commit.c:48
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4815,7 +4861,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:60
+#: builtin/commit.c:61
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4841,7 +4887,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:72
+#: builtin/commit.c:73
 msgid ""
 "You asked to amend the most recent commit, but doing so would make\n"
 "it empty. You can repeat your command with --allow-empty, or you can\n"
@@ -4851,7 +4897,7 @@
 "deixaria buida. Podeu repetir la vostra ordre amb --allow-empty, o\n"
 "podeu eliminar la comissió per complet amb \"git reset HEAD^\".\n"
 
-#: builtin/commit.c:77
+#: builtin/commit.c:78
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4866,11 +4912,11 @@
 "    git commit --allow-empty\n"
 "\n"
 
-#: builtin/commit.c:84
+#: builtin/commit.c:85
 msgid "Otherwise, please use 'git reset'\n"
 msgstr "D'altra manera, si us plau, useu 'git reset'\n"
 
-#: builtin/commit.c:87
+#: builtin/commit.c:88
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4886,66 +4932,66 @@
 "Llavors \"git cherry-pick --continue\" reprendrà recollint\n"
 "com a cireres les comissions restants.\n"
 
-#: builtin/commit.c:304
+#: builtin/commit.c:305
 msgid "failed to unpack HEAD tree object"
 msgstr "s'ha fallat en desempaquetar l'objecte d'arbre HEAD"
 
-#: builtin/commit.c:345
+#: builtin/commit.c:346
 msgid "unable to create temporary index"
 msgstr "no s'ha pogut crear un índex temporal"
 
-#: builtin/commit.c:351
+#: builtin/commit.c:352
 msgid "interactive add failed"
 msgstr "l'afegiment interactiu ha fallat"
 
-#: builtin/commit.c:364
+#: builtin/commit.c:365
 msgid "unable to update temporary index"
 msgstr "no s'ha pogut actualitzar l'índex temporal"
 
-#: builtin/commit.c:366
+#: builtin/commit.c:367
 msgid "Failed to update main cache tree"
 msgstr "S'ha fallat en actualitzar l'arbre principal de memòria cau"
 
-#: builtin/commit.c:390 builtin/commit.c:413 builtin/commit.c:462
+#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
 msgid "unable to write new_index file"
 msgstr "no s'ha pogut escriure el fitxer new_index"
 
-#: builtin/commit.c:444
+#: builtin/commit.c:445
 msgid "cannot do a partial commit during a merge."
 msgstr "no es pot fer una comissió parcial durant una fusió."
 
-#: builtin/commit.c:446
+#: builtin/commit.c:447
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "no es pot fer una comissió parcial durant un recull de cireres."
 
-#: builtin/commit.c:455
+#: builtin/commit.c:456
 msgid "cannot read the index"
 msgstr "no es pot llegir l'índex"
 
-#: builtin/commit.c:474
+#: builtin/commit.c:475
 msgid "unable to write temporary index file"
 msgstr "no s'ha pogut escriure un fitxer d'índex temporal"
 
-#: builtin/commit.c:579
+#: builtin/commit.c:580
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "a la comissió '%s' li manca la capçalera d'autor"
 
-#: builtin/commit.c:581
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "la comissió '%s' té una línia d'autor mal formada"
 
-#: builtin/commit.c:600
+#: builtin/commit.c:601
 msgid "malformed --author parameter"
 msgstr "paràmetre --author mal format"
 
-#: builtin/commit.c:608
+#: builtin/commit.c:609
 #, c-format
 msgid "invalid date format: %s"
 msgstr "format de data no vàlid: %s"
 
-#: builtin/commit.c:652
+#: builtin/commit.c:653
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -4953,38 +4999,38 @@
 "no es pot seleccionar un caràcter de comentari que\n"
 "no sigui usat en el missatge de comissió actual"
 
-#: builtin/commit.c:689 builtin/commit.c:722 builtin/commit.c:1079
+#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "no s'ha pogut trobar la comissió %s"
 
-#: builtin/commit.c:701 builtin/shortlog.c:273
+#: builtin/commit.c:702 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(llegint el missatge de registre des de l'entrada estàndard)\n"
 
-#: builtin/commit.c:703
+#: builtin/commit.c:704
 msgid "could not read log from standard input"
 msgstr "no s'ha pogut llegir el registre des de l'entrada estàndard"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:708
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "no s'ha pogut llegir el fitxer de registre '%s'"
 
-#: builtin/commit.c:729
+#: builtin/commit.c:730
 msgid "could not read MERGE_MSG"
 msgstr "no s'ha pogut llegir MERGE_MSG"
 
-#: builtin/commit.c:733
+#: builtin/commit.c:734
 msgid "could not read SQUASH_MSG"
 msgstr "no s'ha pogut llegir SQUASH_MSG"
 
-#: builtin/commit.c:784
+#: builtin/commit.c:785
 msgid "could not write commit template"
 msgstr "no s'ha pogut escriure la plantilla de comissió"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:803
 #, c-format
 msgid ""
 "\n"
@@ -4999,7 +5045,7 @@
 "\t%s\n"
 "i intenteu-ho de nou.\n"
 
-#: builtin/commit.c:807
+#: builtin/commit.c:808
 #, c-format
 msgid ""
 "\n"
@@ -5014,7 +5060,7 @@
 "\t%s\n"
 "i intenteu-ho de nou.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:821
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5024,7 +5070,7 @@
 "S'ignoraran les línies començant amb '%c', i un missatge de\n"
 "comissió buit avorta la comissió.\n"
 
-#: builtin/commit.c:827
+#: builtin/commit.c:828
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5035,148 +5081,149 @@
 "Es retindran les línies començants amb '%c'; podeu eliminar-les per vós\n"
 "mateix si voleu. Un missatge buit avorta la comissió.\n"
 
-#: builtin/commit.c:847
+#: builtin/commit.c:848
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAutor:    %.*s <%.*s>"
 
-#: builtin/commit.c:855
+#: builtin/commit.c:856
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sData:      %s"
 
-#: builtin/commit.c:862
+#: builtin/commit.c:863
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sComitent: %.*s <%.*s>"
 
-#: builtin/commit.c:880
+#: builtin/commit.c:881
 msgid "Cannot read index"
 msgstr "No es pot llegir l'índex"
 
-#: builtin/commit.c:937
+#: builtin/commit.c:938
 msgid "Error building trees"
 msgstr "Error en construir arbres"
 
-#: builtin/commit.c:952 builtin/tag.c:495
+#: builtin/commit.c:953 builtin/tag.c:266
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Si us plau, proveïu el missatge per usar o l'opció -m o l'opció -F.\n"
 
-#: builtin/commit.c:1054
+#: builtin/commit.c:1055
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' no és 'Nom <adreça-de-correu-electrònic>' i no coincideix amb\n"
 "cap autor existent"
 
-#: builtin/commit.c:1069 builtin/commit.c:1309
+#: builtin/commit.c:1070 builtin/commit.c:1310
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Mode de fitxers no seguits no vàlid '%s'"
 
-#: builtin/commit.c:1106
+#: builtin/commit.c:1107
 msgid "--long and -z are incompatible"
 msgstr "--long i -z són incompatibles"
 
-#: builtin/commit.c:1136
+#: builtin/commit.c:1137
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Usar ambdós --reset-author i --author no té sentit"
 
-#: builtin/commit.c:1145
+#: builtin/commit.c:1146
 msgid "You have nothing to amend."
 msgstr "No teniu res a esmenar."
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1149
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Esteu enmig d'una fusió -- no es pot esmenar."
 
-#: builtin/commit.c:1150
+#: builtin/commit.c:1151
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "Esteu enmig d'un recull de cireres -- no es pot esmenar."
 
-#: builtin/commit.c:1153
+#: builtin/commit.c:1154
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Les opcions --squash i --fixup no es poden usar juntes"
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1164
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Només un de -c/-C/-F/--fixup es pot usar."
 
-#: builtin/commit.c:1165
+#: builtin/commit.c:1166
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "L'opció -m no es pot combinar amb -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1173
+#: builtin/commit.c:1174
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author només es pot usar amb -C, -c o --amend."
 
-#: builtin/commit.c:1190
+#: builtin/commit.c:1191
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr "Només un de --include/--only/--all/--interactive/--patch es pot usar."
 
-#: builtin/commit.c:1192
+#: builtin/commit.c:1193
 msgid "No paths with --include/--only does not make sense."
 msgstr "--include/--only no té sentit sense camí."
 
-#: builtin/commit.c:1194
+#: builtin/commit.c:1195
 msgid "Clever... amending the last one with dirty index."
 msgstr "Intel·ligent... esmenant l'últim amb índex brut."
 
-#: builtin/commit.c:1196
+#: builtin/commit.c:1197
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
 "S'han especificat camins explícits sense -i o -o; presumint camins --only..."
 
-#: builtin/commit.c:1208 builtin/tag.c:730
+#: builtin/commit.c:1209 builtin/tag.c:475
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Mode de neteja no vàlid %s"
 
-#: builtin/commit.c:1213
+#: builtin/commit.c:1214
 msgid "Paths with -a does not make sense."
 msgstr "-a no té sentit amb camins."
 
-#: builtin/commit.c:1323 builtin/commit.c:1602
+#: builtin/commit.c:1324 builtin/commit.c:1605
 msgid "show status concisely"
 msgstr "mostra l'estat concisament"
 
-#: builtin/commit.c:1325 builtin/commit.c:1604
+#: builtin/commit.c:1326 builtin/commit.c:1607
 msgid "show branch information"
 msgstr "mostra la informació de branca"
 
-#: builtin/commit.c:1327 builtin/commit.c:1606 builtin/push.c:546
+#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:544
+#: builtin/worktree.c:423
 msgid "machine-readable output"
 msgstr "sortida llegible per màquina"
 
-#: builtin/commit.c:1330 builtin/commit.c:1608
+#: builtin/commit.c:1331 builtin/commit.c:1611
 msgid "show status in long format (default)"
 msgstr "mostra l'estat en format llarg (per defecte)"
 
-#: builtin/commit.c:1333 builtin/commit.c:1611
+#: builtin/commit.c:1334 builtin/commit.c:1614
 msgid "terminate entries with NUL"
 msgstr "acaba les entrades amb NUL"
 
-#: builtin/commit.c:1335 builtin/commit.c:1614 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:604
+#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:353
 msgid "mode"
 msgstr "mode"
 
-#: builtin/commit.c:1336 builtin/commit.c:1614
+#: builtin/commit.c:1337 builtin/commit.c:1617
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "mostra els fitxers no seguits, modes opcionals: all, normal, no. (Per "
 "defecte: all)"
 
-#: builtin/commit.c:1339
+#: builtin/commit.c:1340
 msgid "show ignored files"
 msgstr "mostra els fitxers ignorats"
 
-#: builtin/commit.c:1340 parse-options.h:155
+#: builtin/commit.c:1341 parse-options.h:155
 msgid "when"
 msgstr "quan"
 
-#: builtin/commit.c:1341
+#: builtin/commit.c:1342
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -5184,197 +5231,202 @@
 "ignora els canvis als submòduls, opcional quan: all, dirty, untracked. (Per "
 "defecte: all)"
 
-#: builtin/commit.c:1343
+#: builtin/commit.c:1344
 msgid "list untracked files in columns"
 msgstr "mostra els fitxers no seguits en columnes"
 
-#: builtin/commit.c:1429
+#: builtin/commit.c:1430
 msgid "couldn't look up newly created commit"
 msgstr "no s'ha pogut trobar la comissió novament creada"
 
-#: builtin/commit.c:1431
+#: builtin/commit.c:1432
 msgid "could not parse newly created commit"
 msgstr "no s'ha pogut analitzar la comissió novament creada"
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1477
 msgid "detached HEAD"
 msgstr "HEAD separat"
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1480
 msgid " (root-commit)"
 msgstr " (comissió d'arrel)"
 
-#: builtin/commit.c:1572
+#: builtin/commit.c:1575
 msgid "suppress summary after successful commit"
 msgstr "omet el resum després d'una comissió reeixida"
 
-#: builtin/commit.c:1573
+#: builtin/commit.c:1576
 msgid "show diff in commit message template"
 msgstr "mostra la diferència en la plantilla de missatge de comissió"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1578
 msgid "Commit message options"
 msgstr "Opcions de missatge de comissió"
 
-#: builtin/commit.c:1576 builtin/tag.c:602
+#: builtin/commit.c:1579 builtin/tag.c:351
 msgid "read message from file"
 msgstr "llegiu el missatge des d'un fitxer"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "author"
 msgstr "autor"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "override author for commit"
 msgstr "autor corregit de la comissió"
 
-#: builtin/commit.c:1578 builtin/gc.c:268
+#: builtin/commit.c:1581 builtin/gc.c:326
 msgid "date"
 msgstr "data"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1581
 msgid "override date for commit"
 msgstr "data corregida de la comissió"
 
-#: builtin/commit.c:1579 builtin/merge.c:218 builtin/notes.c:392
-#: builtin/notes.c:555 builtin/tag.c:600
+#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392
+#: builtin/notes.c:555 builtin/tag.c:349
 msgid "message"
 msgstr "missatge"
 
-#: builtin/commit.c:1579
+#: builtin/commit.c:1582
 msgid "commit message"
 msgstr "missatge de comissió"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
+#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
+msgid "commit"
+msgstr "comissió"
+
+#: builtin/commit.c:1583
 msgid "reuse and edit message from specified commit"
 msgstr "reusa i edita el missatge de la comissió especificada"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1584
 msgid "reuse message from specified commit"
 msgstr "reusa el missatge de la comissió especificada"
 
-#: builtin/commit.c:1582
+#: builtin/commit.c:1585
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "usa el missatge formatat d'aixafada automàtica per a arreglar la comissió "
 "especificada"
 
-#: builtin/commit.c:1583
+#: builtin/commit.c:1586
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "usa el missatge formatat d'aixafada automàtica per a aixafar la comissió "
 "especificada"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1587
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "l'autor de la comissió ja sóc jo (s'usa amb -C/-c/--amend)"
 
-#: builtin/commit.c:1585 builtin/log.c:1216 builtin/revert.c:86
+#: builtin/commit.c:1588 builtin/log.c:1216 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "afegeix Signed-off-by:"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1589
 msgid "use specified template file"
 msgstr "usa el fitxer de plantilla especificat"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1590
 msgid "force edit of commit"
 msgstr "força l'edició de la comissió"
 
-#: builtin/commit.c:1588
+#: builtin/commit.c:1591
 msgid "default"
 msgstr "per defecte"
 
-#: builtin/commit.c:1588 builtin/tag.c:605
+#: builtin/commit.c:1591 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "com despullar els espais i #comentaris del missatge"
 
-#: builtin/commit.c:1589
+#: builtin/commit.c:1592
 msgid "include status in commit message template"
 msgstr "inclou l'estat en la plantilla de missatge de comissió"
 
-#: builtin/commit.c:1591 builtin/merge.c:226 builtin/pull.c:156
+#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "firma la comissió amb GPG"
 
-#: builtin/commit.c:1594
+#: builtin/commit.c:1597
 msgid "Commit contents options"
 msgstr "Opcions dels continguts de les comissions"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1598
 msgid "commit all changed files"
 msgstr "comet tots els fitxers canviats"
 
-#: builtin/commit.c:1596
+#: builtin/commit.c:1599
 msgid "add specified files to index for commit"
 msgstr "afegeix els fitxers especificats a l'índex per a cometre"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1600
 msgid "interactively add files"
 msgstr "afegeix els fitxers interactivament"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1601
 msgid "interactively add changes"
 msgstr "afegeix els canvis interactivament"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1602
 msgid "commit only specified files"
 msgstr "comet només els fitxers especificats"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1603
 msgid "bypass pre-commit hook"
 msgstr "evita el ganxo de precomissió"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1604
 msgid "show what would be committed"
 msgstr "mostra què es cometria"
 
-#: builtin/commit.c:1612
+#: builtin/commit.c:1615
 msgid "amend previous commit"
 msgstr "esmena la comissió anterior"
 
-#: builtin/commit.c:1613
+#: builtin/commit.c:1616
 msgid "bypass post-rewrite hook"
 msgstr "evita el ganxo de postreescriure"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1621
 msgid "ok to record an empty change"
 msgstr "està bé registrar un canvi buit"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1623
 msgid "ok to record a change with an empty message"
 msgstr "està bé registrar un canvi amb missatge buit"
 
-#: builtin/commit.c:1649
+#: builtin/commit.c:1652
 msgid "could not parse HEAD commit"
 msgstr "no s'ha pogut analitzar la comissió HEAD"
 
-#: builtin/commit.c:1695
+#: builtin/commit.c:1698
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Fitxer MERGE_HEAD malmès (%s)"
 
-#: builtin/commit.c:1702
+#: builtin/commit.c:1705
 msgid "could not read MERGE_MODE"
 msgstr "no s'ha pogut llegir MERGE_MODE"
 
-#: builtin/commit.c:1721
+#: builtin/commit.c:1724
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "no s'ha pogut llegir el missatge de comissió: %s"
 
-#: builtin/commit.c:1732
+#: builtin/commit.c:1735
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Avortant la comissió; no heu editat el missatge.\n"
 
-#: builtin/commit.c:1737
+#: builtin/commit.c:1740
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Avortant la comissió a causa d'un missatge de comissió buit.\n"
 
-#: builtin/commit.c:1785
+#: builtin/commit.c:1788
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -5514,11 +5566,11 @@
 msgid "respect include directives on lookup"
 msgstr "respecta les directives d'inclusió en cercar"
 
-#: builtin/config.c:311
+#: builtin/config.c:303
 msgid "unable to parse default color value"
 msgstr "no s'ha pogut analitzar el valor de color per defecte"
 
-#: builtin/config.c:449
+#: builtin/config.c:441
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5533,16 +5585,16 @@
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:583
+#: builtin/config.c:575
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "no es pot crear el fitxer de configuració '%s'"
 
-#: builtin/count-objects.c:55
+#: builtin/count-objects.c:77
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:65
+#: builtin/count-objects.c:87
 msgid "print sizes in human readable format"
 msgstr "imprimeix les mides en un format llegible pels humans"
 
@@ -5662,7 +5714,7 @@
 msgid "only consider tags matching <pattern>"
 msgstr "només considera les etiquetes que coincideixen amb <patró>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:318
+#: builtin/describe.c:410 builtin/name-rev.c:314
 msgid "show abbreviated commit object as fallback"
 msgstr "mostra l'objecte de comissió abreviat com a retrocediment"
 
@@ -5881,7 +5933,7 @@
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s -> %s  (no es pot obtenir en la branca actual)"
 
-#: builtin/fetch.c:478 builtin/fetch.c:564
+#: builtin/fetch.c:478 builtin/fetch.c:566
 msgid "[rejected]"
 msgstr "[rebutjat]"
 
@@ -5905,40 +5957,40 @@
 msgid "[new ref]"
 msgstr "[referència nova]"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "unable to update local ref"
 msgstr "no s'ha pogut actualitzar la referència local"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "forced update"
 msgstr "actualització forçada"
 
-#: builtin/fetch.c:566
+#: builtin/fetch.c:568
 msgid "(non-fast-forward)"
 msgstr "(sense avanç ràpid)"
 
-#: builtin/fetch.c:600 builtin/fetch.c:842
+#: builtin/fetch.c:602 builtin/fetch.c:843
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "no es pot obrir %s: %s\n"
 
-#: builtin/fetch.c:609
+#: builtin/fetch.c:611
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s no ha enviat tots els objectes necessaris\n"
 
-#: builtin/fetch.c:627
+#: builtin/fetch.c:629
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 "rebutja %s perquè no es permet que les arrels superficials s'actualitzin"
 
-#: builtin/fetch.c:715 builtin/fetch.c:807
+#: builtin/fetch.c:716 builtin/fetch.c:808
 #, c-format
 msgid "From %.*s\n"
 msgstr "De %.*s\n"
 
-#: builtin/fetch.c:726
+#: builtin/fetch.c:727
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -5948,55 +6000,55 @@
 " intenteu executar 'git remote prune %s' per a eliminar\n"
 " qualsevulla branca antiga o conflictiva"
 
-#: builtin/fetch.c:778
+#: builtin/fetch.c:779
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s es tornarà penjant)"
 
-#: builtin/fetch.c:779
+#: builtin/fetch.c:780
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s s'ha tornat penjant)"
 
-#: builtin/fetch.c:811
+#: builtin/fetch.c:812
 msgid "[deleted]"
 msgstr "[suprimit]"
 
-#: builtin/fetch.c:812 builtin/remote.c:1034
+#: builtin/fetch.c:813 builtin/remote.c:1040
 msgid "(none)"
 msgstr "(cap)"
 
-#: builtin/fetch.c:832
+#: builtin/fetch.c:833
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "Refusant obtenir en la branca actual %s d'un dipòsit no nu"
 
-#: builtin/fetch.c:851
+#: builtin/fetch.c:852
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "L'opció \"%s\" amb valor \"%s\" no és vàlida per a %s"
 
-#: builtin/fetch.c:854
+#: builtin/fetch.c:855
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "S'ignora l'opció \"%s\" per a %s\n"
 
-#: builtin/fetch.c:910
+#: builtin/fetch.c:911
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "No se sap com obtenir de %s"
 
-#: builtin/fetch.c:1071
+#: builtin/fetch.c:1072
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Obtenint %s\n"
 
-#: builtin/fetch.c:1073 builtin/remote.c:90
+#: builtin/fetch.c:1074 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "No s'ha pogut obtenir %s"
 
-#: builtin/fetch.c:1091
+#: builtin/fetch.c:1092
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -6004,32 +6056,32 @@
 "Cap dipòsit remot especificat. Si us plau, especifiqueu o un URL o\n"
 "un nom remot del qual es deuen obtenir les revisions noves."
 
-#: builtin/fetch.c:1114
+#: builtin/fetch.c:1115
 msgid "You need to specify a tag name."
 msgstr "Necessiteu especificar un nom d'etiqueta."
 
-#: builtin/fetch.c:1156
+#: builtin/fetch.c:1157
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth i --unshallow no es poden usar junts"
 
-#: builtin/fetch.c:1158
+#: builtin/fetch.c:1159
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow en un dipòsit complet no té sentit"
 
-#: builtin/fetch.c:1181
+#: builtin/fetch.c:1179
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all no accepta un paràmetre de dipòsit"
 
-#: builtin/fetch.c:1183
+#: builtin/fetch.c:1181
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all no té sentit amb especificacions de referència"
 
-#: builtin/fetch.c:1194
+#: builtin/fetch.c:1192
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "No hi ha tal remot ni tal grup remot: %s"
 
-#: builtin/fetch.c:1202
+#: builtin/fetch.c:1200
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Obtenir un grup i especificar referències no té sentit"
 
@@ -6039,23 +6091,23 @@
 msgstr ""
 "git fmt-merge-msg [-m <missatge>] [--log[=<n>] | --no-log] [--file <fitxer>]"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:667
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "emplena el registre amb <n> entrades del registre curt com a màxim"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:670
 msgid "alias for --log (deprecated)"
 msgstr "àlies per --log (desaprovat)"
 
-#: builtin/fmt-merge-msg.c:676
+#: builtin/fmt-merge-msg.c:673
 msgid "text"
 msgstr "text"
 
-#: builtin/fmt-merge-msg.c:677
+#: builtin/fmt-merge-msg.c:674
 msgid "use <text> as start of message"
 msgstr "usa <text> com a inici de missatge"
 
-#: builtin/fmt-merge-msg.c:678
+#: builtin/fmt-merge-msg.c:675
 msgid "file to read from"
 msgstr "fitxer del qual llegir"
 
@@ -6063,97 +6115,117 @@
 msgid "git for-each-ref [<options>] [<pattern>]"
 msgstr "git for-each-ref [<opcions>] [<patró>]"
 
-#: builtin/for-each-ref.c:24
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
+msgstr "git for-each-ref [--points-at <objecte>]"
+
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<objecte>]]"
+
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
+msgstr "git for-each-ref [--contains [<objecte>]]"
+
+#: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
 msgstr ""
 "posa els marcadors de posició entre cometes de forma adequada per a "
 "intèrprets d'ordres"
 
-#: builtin/for-each-ref.c:26
+#: builtin/for-each-ref.c:29
 msgid "quote placeholders suitably for perl"
 msgstr "posa els marcadors de posició entre cometes adequades per al perl"
 
-#: builtin/for-each-ref.c:28
+#: builtin/for-each-ref.c:31
 msgid "quote placeholders suitably for python"
 msgstr "posa els marcadors de posició entre cometes adequades per al python"
 
-#: builtin/for-each-ref.c:30
+#: builtin/for-each-ref.c:33
 msgid "quote placeholders suitably for Tcl"
 msgstr "posa els marcadors de posició entre cometes adequades per al Tcl"
 
-#: builtin/for-each-ref.c:33
+#: builtin/for-each-ref.c:36
 msgid "show only <n> matched refs"
 msgstr "mostra només <n> referències coincidents"
 
-#: builtin/for-each-ref.c:34
+#: builtin/for-each-ref.c:37 builtin/tag.c:372
 msgid "format to use for the output"
 msgstr "format a usar en la sortida"
 
-#: builtin/for-each-ref.c:35
-msgid "key"
-msgstr "clau"
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
+msgstr "imprimeix només les referències que assenyalin l'objecte donat"
 
-#: builtin/for-each-ref.c:36
-msgid "field name to sort on"
-msgstr "nom de camp en el qual ordenar"
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
+msgstr "imprimeix només les referències que s'han fusionat"
 
-#: builtin/fsck.c:163 builtin/prune.c:137
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr "imprimeix només les referències que no s'han fusionat"
+
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
+msgstr "imprimeix només les referències que continguin la comissió"
+
+#: builtin/fsck.c:156 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr "Comprovant connectivitat"
 
-#: builtin/fsck.c:568
+#: builtin/fsck.c:486
 msgid "Checking object directories"
 msgstr "Comprovant els directoris d'objecte"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:553
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<opcions>] [<objecte>...]"
 
-#: builtin/fsck.c:637
+#: builtin/fsck.c:559
 msgid "show unreachable objects"
 msgstr "mostra els objectes inabastables"
 
-#: builtin/fsck.c:638
+#: builtin/fsck.c:560
 msgid "show dangling objects"
 msgstr "mostra els objectes penjants"
 
-#: builtin/fsck.c:639
+#: builtin/fsck.c:561
 msgid "report tags"
 msgstr "informa de les etiquetes"
 
-#: builtin/fsck.c:640
+#: builtin/fsck.c:562
 msgid "report root nodes"
 msgstr "informa dels nodes d'arrel"
 
-#: builtin/fsck.c:641
+#: builtin/fsck.c:563
 msgid "make index objects head nodes"
 msgstr "fes els objectes d'índex nodes de cap"
 
-#: builtin/fsck.c:642
+#: builtin/fsck.c:564
 msgid "make reflogs head nodes (default)"
 msgstr "fes que els registres de referències siguin nodes de cap (per defecte)"
 
-#: builtin/fsck.c:643
+#: builtin/fsck.c:565
 msgid "also consider packs and alternate objects"
 msgstr "també considera els paquets i els objectes alternatius"
 
-#: builtin/fsck.c:644
+#: builtin/fsck.c:566
 msgid "check only connectivity"
 msgstr "comprova només la connectivitat"
 
-#: builtin/fsck.c:645
+#: builtin/fsck.c:567
 msgid "enable more strict checking"
 msgstr "habilita la comprovació més estricta"
 
-#: builtin/fsck.c:647
+#: builtin/fsck.c:569
 msgid "write dangling objects in .git/lost-found"
 msgstr "escriu objectes penjants a .git/lost-found"
 
-#: builtin/fsck.c:648 builtin/prune.c:107
+#: builtin/fsck.c:570 builtin/prune.c:107
 msgid "show progress"
 msgstr "mostra el progrés"
 
-#: builtin/fsck.c:707
+#: builtin/fsck.c:631
 msgid "Checking objects"
 msgstr "Comprovant els objectes"
 
@@ -6161,56 +6233,71 @@
 msgid "git gc [<options>]"
 msgstr "git gc [<opcions>]"
 
-#: builtin/gc.c:55
+#: builtin/gc.c:72
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "%s no vàlid: %s"
 
-#: builtin/gc.c:100
+#: builtin/gc.c:139
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "directori d'objectes increïblement llarg %.*s"
 
-#: builtin/gc.c:269
+#: builtin/gc.c:290
+#, c-format
+msgid ""
+"The last gc run reported the following. Please correct the root cause\n"
+"and remove %s.\n"
+"Automatic cleanup will not be performed until the file is removed.\n"
+"\n"
+"%s"
+msgstr ""
+"L'última execució de gc ha informat d'ho següent. Si us plau, corregiu\n"
+"la causa primordial i elimineu %s.\n"
+"No es realitzarà la neteja automàtica fins que s'elimini el fitxer.\n"
+"\n"
+"%s"
+
+#: builtin/gc.c:327
 msgid "prune unreferenced objects"
 msgstr "poda objectes sense referència"
 
-#: builtin/gc.c:271
+#: builtin/gc.c:329
 msgid "be more thorough (increased runtime)"
 msgstr "sigues més exhaustiu (el temps d'execució augmenta)"
 
-#: builtin/gc.c:272
+#: builtin/gc.c:330
 msgid "enable auto-gc mode"
 msgstr "habilita el mode de recollida d'escombraries automàtica"
 
-#: builtin/gc.c:273
+#: builtin/gc.c:331
 msgid "force running gc even if there may be another gc running"
 msgstr "força l'execució de gc encara que hi pugui haver un altre gc executant"
 
-#: builtin/gc.c:315
+#: builtin/gc.c:373
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 "Empaquetant automàticament el dipòsit en el fons per rendiment òptim.\n"
 
-#: builtin/gc.c:317
+#: builtin/gc.c:375
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "Empaquetant automàticament el dipòsit per rendiment òptim.\n"
 
-#: builtin/gc.c:318
+#: builtin/gc.c:376
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "Vegeu \"git help gc\" per neteja manual.\n"
 
-#: builtin/gc.c:336
+#: builtin/gc.c:397
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
 msgstr ""
 "gc ja està executant en la màquina '%s' pid %<PRIuMAX> (useu --force si no)"
 
-#: builtin/gc.c:364
+#: builtin/gc.c:441
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -6246,203 +6333,199 @@
 msgid "cannot open '%s'"
 msgstr "no es pot obrir '%s'"
 
-#: builtin/grep.c:638
+#: builtin/grep.c:633
 msgid "search in index instead of in the work tree"
 msgstr "cerca en l'índex en lloc de l'arbre de treball"
 
-#: builtin/grep.c:640
+#: builtin/grep.c:635
 msgid "find in contents not managed by git"
 msgstr "cerca en continguts no gestionats per git"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:637
 msgid "search in both tracked and untracked files"
 msgstr "cerca tant en fitxers seguits com en no seguits"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:639
 msgid "ignore files specified via '.gitignore'"
 msgstr "ignora els fitxers especificats mitjançant '.gitignore'"
 
-#: builtin/grep.c:647
+#: builtin/grep.c:642
 msgid "show non-matching lines"
 msgstr "mostra les línies no coincidents"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:644
 msgid "case insensitive matching"
 msgstr "coincidència insensible a majúscula i minúscula"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:646
 msgid "match patterns only at word boundaries"
 msgstr "coincideix amb els patrons només als límits de paraula"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:648
 msgid "process binary files as text"
 msgstr "processa els fitxers binaris com a text"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:650
 msgid "don't match patterns in binary files"
 msgstr "no coincideixis amb els patrons en els fitxers binaris"
 
-#: builtin/grep.c:658
+#: builtin/grep.c:653
 msgid "process binary files with textconv filters"
 msgstr "processa els fitxers binaris amb filtres de textconv"
 
-#: builtin/grep.c:660
+#: builtin/grep.c:655
 msgid "descend at most <depth> levels"
 msgstr "descendeix com a màxim <profunditat> nivells"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:659
 msgid "use extended POSIX regular expressions"
 msgstr "usa les expressions regulars POSIX esteses"
 
-#: builtin/grep.c:667
+#: builtin/grep.c:662
 msgid "use basic POSIX regular expressions (default)"
 msgstr "usa les expressions regulars POSIX bàsiques (per defecte)"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:665
 msgid "interpret patterns as fixed strings"
 msgstr "interpreta els patrons com a cadenes fixes"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:668
 msgid "use Perl-compatible regular expressions"
 msgstr "usa les expressions regulars compatibles amb Perl"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:671
 msgid "show line numbers"
 msgstr "mostra els números de línia"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:672
 msgid "don't show filenames"
 msgstr "no mostris els noms de fitxer"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:673
 msgid "show filenames"
 msgstr "mostra els noms de fitxer"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:675
 msgid "show filenames relative to top directory"
 msgstr "mostra els noms de fitxer relatius al directori superior"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:677
 msgid "show only filenames instead of matching lines"
 msgstr "mostra només els noms de fitxer en lloc de les línies coincidents"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:679
 msgid "synonym for --files-with-matches"
 msgstr "sinònim de --files-with-matches"
 
-#: builtin/grep.c:687
+#: builtin/grep.c:682
 msgid "show only the names of files without match"
 msgstr "mostra només els noms dels fitxers sense coincidència"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:684
 msgid "print NUL after filenames"
 msgstr "imprimeix NUL després dels noms de fitxer"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:686
 msgid "show the number of matches instead of matching lines"
 msgstr "mostra el nombre de coincidències en lloc de les línies coincidents"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:687
 msgid "highlight matches"
 msgstr "ressalta les coincidències"
 
-#: builtin/grep.c:694
+#: builtin/grep.c:689
 msgid "print empty line between matches from different files"
 msgstr "imprimeix una línia buida entre coincidències de fitxers distints"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:691
 msgid "show filename only once above matches from same file"
 msgstr ""
 "mostra el nom de fitxer només una vegada a dalt de les coincidències del "
 "mateix fitxer"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:694
 msgid "show <n> context lines before and after matches"
 msgstr "mostra <n> línies de context abans i després d'una coincidència"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:697
 msgid "show <n> context lines before matches"
 msgstr "mostra <n> línies de context abans d'una coincidència"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:699
 msgid "show <n> context lines after matches"
 msgstr "mostra <n> línies de context després d'una coincidència"
 
-#: builtin/grep.c:705
+#: builtin/grep.c:700
 msgid "shortcut for -C NUM"
 msgstr "drecera per -C NUM"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:703
 msgid "show a line with the function name before matches"
 msgstr "mostra una línia amb el nom de funció abans de les coincidències"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:705
 msgid "show the surrounding function"
 msgstr "mostra la funció circumdant"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:708
 msgid "read patterns from file"
 msgstr "llegeix els patrons des d'un fitxer"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:710
 msgid "match <pattern>"
 msgstr "coincideix amb <patró>"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:712
 msgid "combine patterns specified with -e"
 msgstr "combina els patrons especificats amb -e"
 
-#: builtin/grep.c:729
+#: builtin/grep.c:724
 msgid "indicate hit with exit status without output"
 msgstr "indica coincidència amb estat de sortida sense sortida textual"
 
-#: builtin/grep.c:731
+#: builtin/grep.c:726
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "mostra només les coincidències dels fitxers que coincideixin amb tots els "
 "patrons"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:728
 msgid "show parse tree for grep expression"
 msgstr "mostra l'arbre d'anàlisis de l'expressió de grep"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "pager"
 msgstr "paginador"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "show matching files in the pager"
 msgstr "mostra els fitxers coincidents en el paginador"
 
-#: builtin/grep.c:740
+#: builtin/grep.c:735
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "permet la invocació de grep(1) (ignorat per aquesta compilació)"
 
-#: builtin/grep.c:741 builtin/show-ref.c:189
-msgid "show usage"
-msgstr "mostra l'ús"
-
-#: builtin/grep.c:808
+#: builtin/grep.c:793
 msgid "no pattern given."
 msgstr "cap patró donat."
 
-#: builtin/grep.c:866
+#: builtin/grep.c:851
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager només funciona en l'arbre de treball"
 
-#: builtin/grep.c:892
+#: builtin/grep.c:877
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached o --untracked no es pot usar amb --no-index."
 
-#: builtin/grep.c:897
+#: builtin/grep.c:882
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index o --untracked no es pot usar amb revisions."
 
-#: builtin/grep.c:900
+#: builtin/grep.c:885
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard no es pot usar per als continguts seguits."
 
-#: builtin/grep.c:908
+#: builtin/grep.c:893
 msgid "both --cached and trees are given."
 msgstr "s'han donat ambdós --caches i arbres."
 
@@ -6455,10 +6538,10 @@
 "[--] <fitxer>..."
 
 #: builtin/hash-object.c:81
-msgid "git hash-object  --stdin-paths < <list-of-paths>"
-msgstr "git hash-object  --stdin-paths < <llista-de-camins>"
+msgid "git hash-object  --stdin-paths"
+msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:92 builtin/tag.c:614
+#: builtin/hash-object.c:92
 msgid "type"
 msgstr "tipus"
 
@@ -6531,12 +6614,12 @@
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "la versió d'emacsclient '%d' és massa vella (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
+#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "s'ha fallat en executar '%s': %s"
 
-#: builtin/help.c:215
+#: builtin/help.c:208
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -6545,7 +6628,7 @@
 "'%s': camí a un visualitzador de manuals no compatible.\n"
 "Si us plau, considereu usar 'man.<eina>.cmd' en lloc d'això."
 
-#: builtin/help.c:227
+#: builtin/help.c:220
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -6554,61 +6637,61 @@
 "'%s': ordre per a un visualitzador de manuals compatible.\n"
 "Si us plau, considereu usar 'man.<eina>.path' en lloc d'això."
 
-#: builtin/help.c:354
+#: builtin/help.c:337
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s': visualitzador de manuals desconegut"
 
-#: builtin/help.c:371
+#: builtin/help.c:354
 msgid "no man viewer handled the request"
 msgstr "cap visualitzador de manuals ha gestionat la sol·licitud"
 
-#: builtin/help.c:379
+#: builtin/help.c:362
 msgid "no info viewer handled the request"
 msgstr "cap visualitzador d'informació ha gestionat la sol·licitud"
 
-#: builtin/help.c:428
+#: builtin/help.c:411
 msgid "Defining attributes per path"
 msgstr "La definició d'atributs per camí"
 
-#: builtin/help.c:429
+#: builtin/help.c:412
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Git quotidià amb més o menys 20 ordres"
 
-#: builtin/help.c:430
+#: builtin/help.c:413
 msgid "A Git glossary"
 msgstr "Un glossari de Git"
 
-#: builtin/help.c:431
+#: builtin/help.c:414
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Especifica els fitxers intencionalment no seguits a ignorar"
 
-#: builtin/help.c:432
+#: builtin/help.c:415
 msgid "Defining submodule properties"
 msgstr "La definició de les propietats de submòduls"
 
-#: builtin/help.c:433
+#: builtin/help.c:416
 msgid "Specifying revisions and ranges for Git"
 msgstr "L'especificació de revisions i rangs per al Git"
 
-#: builtin/help.c:434
+#: builtin/help.c:417
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Una introducció tutorial al Git (per a la versió 1.5.1 o més nou)"
 
-#: builtin/help.c:435
+#: builtin/help.c:418
 msgid "An overview of recommended workflows with Git"
 msgstr "Una visió de conjunt de fluxos de treball recomanats amb Git"
 
-#: builtin/help.c:447
+#: builtin/help.c:430
 msgid "The common Git guides are:\n"
 msgstr "Les guies de Git comunes són:\n"
 
-#: builtin/help.c:468 builtin/help.c:485
+#: builtin/help.c:451 builtin/help.c:468
 #, c-format
 msgid "usage: %s%s"
 msgstr "ús: %s%s"
 
-#: builtin/help.c:501
+#: builtin/help.c:484
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "`git %s' és un àlies de `%s'"
@@ -6901,87 +6984,62 @@
 msgid "--verify with no packfile name given"
 msgstr "s'ha donat --verify sense nom de fitxer de paquet"
 
-#: builtin/init-db.c:36
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr "No s'ha pogut fer %s escrivible pel grup"
-
-#: builtin/init-db.c:63
-#, c-format
-msgid "insanely long template name %s"
-msgstr "nom de plantilla increïblement llarg %s"
-
-#: builtin/init-db.c:68
+#: builtin/init-db.c:55
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "no es pot fer stat en '%s'"
 
-#: builtin/init-db.c:74
+#: builtin/init-db.c:61
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "no es pot fer stat en la plantilla '%s'"
 
-#: builtin/init-db.c:81
+#: builtin/init-db.c:66
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "no es pot fer opendir en el directori '%s'"
 
-#: builtin/init-db.c:98
+#: builtin/init-db.c:77
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "no es pot fer readlink en '%s'"
 
-#: builtin/init-db.c:100
-#, c-format
-msgid "insanely long symlink %s"
-msgstr "enllaç simbòlic increïblement llarg %s"
-
-#: builtin/init-db.c:103
+#: builtin/init-db.c:79
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "no es pot fer symlink en '%s' '%s'"
 
-#: builtin/init-db.c:107
+#: builtin/init-db.c:85
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "no es pot copiar '%s' a '%s'"
 
-#: builtin/init-db.c:111
+#: builtin/init-db.c:89
 #, c-format
 msgid "ignoring template %s"
 msgstr "ignorant la plantilla %s"
 
-#: builtin/init-db.c:137
-#, c-format
-msgid "insanely long template path %s"
-msgstr "camí de plantilla increïblement llarg %s"
-
-#: builtin/init-db.c:145
+#: builtin/init-db.c:118
 #, c-format
 msgid "templates not found %s"
 msgstr "no s'han trobat les plantilles %s"
 
-#: builtin/init-db.c:158
+#: builtin/init-db.c:131
 #, c-format
 msgid "not copying templates of a wrong format version %d from '%s'"
 msgstr "no copiant plantilles d'una versió de format errònia %d de '%s'"
 
-#: builtin/init-db.c:212
-#, c-format
-msgid "insane git directory %s"
-msgstr "directori de git boig %s"
-
-#: builtin/init-db.c:344 builtin/init-db.c:347
+#: builtin/init-db.c:309 builtin/init-db.c:312
 #, c-format
 msgid "%s already exists"
 msgstr "%s ja existeix"
 
-#: builtin/init-db.c:375
+#: builtin/init-db.c:340
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "no s'ha pogut gestionar el tipus de fitxer %d"
 
-#: builtin/init-db.c:378
+#: builtin/init-db.c:343
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "no s'ha pogut moure %s a %s"
@@ -6989,24 +7047,24 @@
 #. TRANSLATORS: The first '%s' is either "Reinitialized
 #. existing" or "Initialized empty", the second " shared" or
 #. "", and the last '%s%s' is the verbatim directory name.
-#: builtin/init-db.c:434
+#: builtin/init-db.c:399
 #, c-format
 msgid "%s%s Git repository in %s%s\n"
 msgstr "%s dipòsit de Git%s a %s%s\n"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Reinitialized existing"
 msgstr "S'ha reinicialitzat un existent"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Initialized empty"
 msgstr "S'ha inicialitzat un buit"
 
-#: builtin/init-db.c:436
+#: builtin/init-db.c:401
 msgid " shared"
 msgstr " compartit"
 
-#: builtin/init-db.c:483
+#: builtin/init-db.c:448
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7014,25 +7072,25 @@
 "git init [-q | --quiet] [--bare] [--template=<directori-de-plantilla>] [--"
 "shared[=<permisos>]] [<directori>]"
 
-#: builtin/init-db.c:506
+#: builtin/init-db.c:471
 msgid "permissions"
 msgstr "permisos"
 
-#: builtin/init-db.c:507
+#: builtin/init-db.c:472
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "especifica que el dipòsit de git es compartirà entre diversos usuaris"
 
-#: builtin/init-db.c:541 builtin/init-db.c:546
+#: builtin/init-db.c:506 builtin/init-db.c:511
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "no es pot mkdir %s"
 
-#: builtin/init-db.c:550
+#: builtin/init-db.c:515
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "no es pot chdir a %s"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:536
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7041,7 +7099,7 @@
 "no es permet %s (o --work-tree=<directori>) sense especificar %s (o --git-"
 "dir=<directori>)"
 
-#: builtin/init-db.c:599
+#: builtin/init-db.c:564
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "No es pot accedir a l'arbre de treball '%s'"
@@ -7127,33 +7185,33 @@
 msgid "name of output directory is too long"
 msgstr "el nom del directori de sortida és massa llarg"
 
-#: builtin/log.c:814
+#: builtin/log.c:813
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "No es pot obrir el fitxer de pedaç %s"
 
-#: builtin/log.c:828
+#: builtin/log.c:827
 msgid "Need exactly one range."
 msgstr "Cal exactament un rang."
 
-#: builtin/log.c:838
+#: builtin/log.c:837
 msgid "Not a range."
 msgstr "No és un rang."
 
-#: builtin/log.c:944
+#: builtin/log.c:943
 msgid "Cover letter needs email format"
 msgstr "La carta de presentació necessita el format de correu electrònic"
 
-#: builtin/log.c:1023
+#: builtin/log.c:1022
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to boig: %s"
 
-#: builtin/log.c:1051
+#: builtin/log.c:1050
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<opcions>] [<des-de> | <rang-de-revisions>]"
 
-#: builtin/log.c:1096
+#: builtin/log.c:1095
 msgid "Two output directories?"
 msgstr "Dos directoris de sortida?"
 
@@ -7210,130 +7268,134 @@
 msgstr "no emetis diferències binàries"
 
 #: builtin/log.c:1241
+msgid "output all-zero hash in From header"
+msgstr "emet un hash de tots zeros en la capçalera From"
+
+#: builtin/log.c:1243
 msgid "don't include a patch matching a commit upstream"
 msgstr "no incloguis pedaços que coincideixin amb comissions a la font"
 
-#: builtin/log.c:1243
+#: builtin/log.c:1245
 msgid "show patch format instead of default (patch + stat)"
 msgstr ""
 "mostra el format de pedaç en lloc del per defecte (pedaç + estadístiques)"
 
-#: builtin/log.c:1245
+#: builtin/log.c:1247
 msgid "Messaging"
 msgstr "Missatgeria"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1248
 msgid "header"
 msgstr "capçalera"
 
-#: builtin/log.c:1247
+#: builtin/log.c:1249
 msgid "add email header"
 msgstr "afegeix una capçalera de correu electrònic"
 
-#: builtin/log.c:1248 builtin/log.c:1250
+#: builtin/log.c:1250 builtin/log.c:1252
 msgid "email"
 msgstr "correu electrònic"
 
-#: builtin/log.c:1248
+#: builtin/log.c:1250
 msgid "add To: header"
 msgstr "afegeix la capçalera To:"
 
-#: builtin/log.c:1250
+#: builtin/log.c:1252
 msgid "add Cc: header"
 msgstr "afegeix la capçalera Cc:"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1254
 msgid "ident"
 msgstr "identitat"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1255
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "estableix l'adreça From a <identitat> (o la identitat del comitent si manca)"
 
-#: builtin/log.c:1255
+#: builtin/log.c:1257
 msgid "message-id"
 msgstr "ID de missatge"
 
-#: builtin/log.c:1256
+#: builtin/log.c:1258
 msgid "make first mail a reply to <message-id>"
 msgstr "fes del primer missatge una resposta a <ID de missatge>"
 
-#: builtin/log.c:1257 builtin/log.c:1260
+#: builtin/log.c:1259 builtin/log.c:1262
 msgid "boundary"
 msgstr "límit"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1260
 msgid "attach the patch"
 msgstr "ajunta el pedaç"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1263
 msgid "inline the patch"
 msgstr "posa el pedaç en el cos"
 
-#: builtin/log.c:1265
+#: builtin/log.c:1267
 msgid "enable message threading, styles: shallow, deep"
 msgstr "habilita l'enfilada de missatges, estils: shallow, deep"
 
-#: builtin/log.c:1267
+#: builtin/log.c:1269
 msgid "signature"
 msgstr "firma"
 
-#: builtin/log.c:1268
+#: builtin/log.c:1270
 msgid "add a signature"
 msgstr "afegeix una firma"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1272
 msgid "add a signature from a file"
 msgstr "afegeix una firma des d'un fitxer"
 
-#: builtin/log.c:1271
+#: builtin/log.c:1273
 msgid "don't print the patch filenames"
 msgstr "no imprimeixis els noms de fitxer del pedaç"
 
-#: builtin/log.c:1360
+#: builtin/log.c:1362
 msgid "-n and -k are mutually exclusive."
 msgstr "-n i -k són mutualment exclusius."
 
-#: builtin/log.c:1362
+#: builtin/log.c:1364
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix i -k són mutualment exclusius."
 
-#: builtin/log.c:1370
+#: builtin/log.c:1372
 msgid "--name-only does not make sense"
 msgstr "--name-only no té sentit"
 
-#: builtin/log.c:1372
+#: builtin/log.c:1374
 msgid "--name-status does not make sense"
 msgstr "--name-status no té sentit"
 
-#: builtin/log.c:1374
+#: builtin/log.c:1376
 msgid "--check does not make sense"
 msgstr "--check no té sentit"
 
-#: builtin/log.c:1397
+#: builtin/log.c:1401
 msgid "standard output, or directory, which one?"
 msgstr "sortida estàndard o directori, quin dels dos?"
 
-#: builtin/log.c:1399
+#: builtin/log.c:1403
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "No s'ha pogut crear el directori '%s'"
 
-#: builtin/log.c:1496
+#: builtin/log.c:1500
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "no s'ha pogut llegir el fitxer de firma '%s'"
 
-#: builtin/log.c:1559
+#: builtin/log.c:1563
 msgid "Failed to create output files"
 msgstr "S'ha fallat en crear els fitxers de sortida"
 
-#: builtin/log.c:1607
+#: builtin/log.c:1611
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<font> [<cap> [<límit>]]]"
 
-#: builtin/log.c:1661
+#: builtin/log.c:1665
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -7341,7 +7403,7 @@
 "No s'ha pogut trobar una branca remota seguida. Si us plau, especifiqueu "
 "<font> manualment.\n"
 
-#: builtin/log.c:1672 builtin/log.c:1674 builtin/log.c:1686
+#: builtin/log.c:1676 builtin/log.c:1678 builtin/log.c:1690
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Comissió desconeguda %s"
@@ -7444,35 +7506,35 @@
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<opcions>] <arbre> [<camí>...]"
 
-#: builtin/ls-tree.c:127
+#: builtin/ls-tree.c:128
 msgid "only show trees"
 msgstr "mostra només els arbres"
 
-#: builtin/ls-tree.c:129
+#: builtin/ls-tree.c:130
 msgid "recurse into subtrees"
 msgstr "recursa als subarbres"
 
-#: builtin/ls-tree.c:131
+#: builtin/ls-tree.c:132
 msgid "show trees when recursing"
 msgstr "mostra els arbres en recursar"
 
-#: builtin/ls-tree.c:134
+#: builtin/ls-tree.c:135
 msgid "terminate entries with NUL byte"
 msgstr "acaba les entrades amb un octet NUL"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:136
 msgid "include object size"
 msgstr "mida de l'objecte d'inclusió"
 
-#: builtin/ls-tree.c:137 builtin/ls-tree.c:139
+#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
 msgid "list only filenames"
 msgstr "llista només els noms de fitxer"
 
-#: builtin/ls-tree.c:142
+#: builtin/ls-tree.c:143
 msgid "use full path names"
 msgstr "usa els noms de camí complets"
 
-#: builtin/ls-tree.c:144
+#: builtin/ls-tree.c:145
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr ""
 "llista l'arbre sencer; no només el directori actual (implica --full-name)"
@@ -7708,16 +7770,16 @@
 msgid "No remote-tracking branch for %s from %s"
 msgstr "No hi ha cap branca amb seguiment remot per a %s de %s"
 
-#: builtin/merge.c:1081
+#: builtin/merge.c:1079
 #, c-format
 msgid "could not close '%s'"
 msgstr "no s'ha pogut tancar '%s'"
 
-#: builtin/merge.c:1208
+#: builtin/merge.c:1206
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "No hi ha fusió a avortar (manca MERGE_HEAD)."
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1222
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7725,7 +7787,7 @@
 "No heu conclòs la vostra fusió (MERGE_HEAD existeix).\n"
 "Si us plau, cometeu els vostres canvis abans de fusionar."
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1229
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7733,54 +7795,54 @@
 "No heu conclòs el vostre recull de cireres (CHERRY_PICK_HEAD existeix).\n"
 "Si us plau, cometeu els vostres canvis abans de fusionar."
 
-#: builtin/merge.c:1234
+#: builtin/merge.c:1232
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr ""
 "No heu conclòs el vostre recull de cireres (CHERRY_PICK_HEAD existeix)."
 
-#: builtin/merge.c:1243
+#: builtin/merge.c:1241
 msgid "You cannot combine --squash with --no-ff."
 msgstr "No podeu combinar --squash amb --no-ff."
 
-#: builtin/merge.c:1251
+#: builtin/merge.c:1249
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 "No hi ha una comissió especificada i merge.defaultToUpstream no està "
 "establert."
 
-#: builtin/merge.c:1268
+#: builtin/merge.c:1266
 msgid "Squash commit into empty head not supported yet"
 msgstr "Aixafar una comissió a un cap buit encara no es permet"
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1268
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "Una comissió no d'avanç ràpid no té sentit a un cap buit"
 
-#: builtin/merge.c:1276
+#: builtin/merge.c:1274
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - no és una cosa que puguem fusionar"
 
-#: builtin/merge.c:1278
+#: builtin/merge.c:1276
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Es pot fusionar no més d'exactament una comissió a un cap buit"
 
-#: builtin/merge.c:1333
+#: builtin/merge.c:1331
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "La comissió %s té una firma GPG no fiable, suposadament de %s."
 
-#: builtin/merge.c:1336
+#: builtin/merge.c:1334
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "La comissió %s té una firma GPG dolenta suposadament de %s."
 
-#: builtin/merge.c:1339
+#: builtin/merge.c:1337
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "La comissió %s no té firma GPG."
 
-#: builtin/merge.c:1342
+#: builtin/merge.c:1340
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "La comissió %s té una firma GPG bona de %s\n"
@@ -7790,46 +7852,46 @@
 msgid "Updating %s..%s\n"
 msgstr "Actualitzant %s..%s\n"
 
-#: builtin/merge.c:1462
+#: builtin/merge.c:1460
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Intentant una fusió molt trivial en l'índex...\n"
 
-#: builtin/merge.c:1469
+#: builtin/merge.c:1467
 #, c-format
 msgid "Nope.\n"
 msgstr "No.\n"
 
-#: builtin/merge.c:1501
+#: builtin/merge.c:1499
 msgid "Not possible to fast-forward, aborting."
 msgstr "No és possible avançar ràpidament, avortant."
 
-#: builtin/merge.c:1524 builtin/merge.c:1603
+#: builtin/merge.c:1522 builtin/merge.c:1601
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Rebobinant l'arbre a la pristina...\n"
 
-#: builtin/merge.c:1528
+#: builtin/merge.c:1526
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Intentant l'estratègia de fusió %s...\n"
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1592
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Cap estratègia de fusió ha gestionat la fusió.\n"
 
-#: builtin/merge.c:1596
+#: builtin/merge.c:1594
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "L'estratègia de fusió %s ha fallat.\n"
 
-#: builtin/merge.c:1605
+#: builtin/merge.c:1603
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Usant el %s per a preparar la resolució a mà.\n"
 
-#: builtin/merge.c:1617
+#: builtin/merge.c:1615
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -8022,48 +8084,48 @@
 msgid "Renaming %s to %s\n"
 msgstr "Canviant el nom de %s a %s\n"
 
-#: builtin/mv.c:256 builtin/remote.c:722 builtin/repack.c:362
+#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "el canvi del nom de '%s' ha fallat"
 
-#: builtin/name-rev.c:255
+#: builtin/name-rev.c:251
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<opcions>] <comissió>..."
 
-#: builtin/name-rev.c:256
+#: builtin/name-rev.c:252
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<opcions>] --all"
 
-#: builtin/name-rev.c:257
+#: builtin/name-rev.c:253
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<opcions>] --stdin"
 
-#: builtin/name-rev.c:309
+#: builtin/name-rev.c:305
 msgid "print only names (no SHA-1)"
 msgstr "imprimeix només els noms (sense SHA-1)"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:306
 msgid "only use tags to name the commits"
 msgstr "només usa les etiquetes per a anomenar les comissions"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:308
 msgid "only use refs matching <pattern>"
 msgstr "només usa les referències que coincideixin amb <patró>"
 
-#: builtin/name-rev.c:314
+#: builtin/name-rev.c:310
 msgid "list all commits reachable from all refs"
 msgstr "llista totes les comissions abastables de totes les referències"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:311
 msgid "read from stdin"
 msgstr "llegeix d'stdin"
 
-#: builtin/name-rev.c:316
+#: builtin/name-rev.c:312
 msgid "allow to print `undefined` names (default)"
 msgstr "permet imprimir els noms `undefined` (per defecte)"
 
-#: builtin/name-rev.c:322
+#: builtin/name-rev.c:318
 msgid "dereference tags in the input (internal use)"
 msgstr "dereferencia les etiquetes en l'entrada (ús intern)"
 
@@ -8194,7 +8256,7 @@
 msgid "failed to finish 'show' for object '%s'"
 msgstr "s'ha fallat en finalitzar 'show' per a l'objecte '%s'"
 
-#: builtin/notes.c:174 builtin/tag.c:477
+#: builtin/notes.c:174 builtin/tag.c:248
 #, c-format
 msgid "could not create file '%s'"
 msgstr "no s'ha pogut crear el fitxer '%s'"
@@ -8214,12 +8276,12 @@
 msgid "The note contents have been left in %s"
 msgstr "Els continguts de la nota s'han deixat en %s"
 
-#: builtin/notes.c:232 builtin/tag.c:695
+#: builtin/notes.c:232 builtin/tag.c:440
 #, c-format
 msgid "cannot read '%s'"
 msgstr "no es pot llegir '%s'"
 
-#: builtin/notes.c:234 builtin/tag.c:698
+#: builtin/notes.c:234 builtin/tag.c:443
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "no s'ha pogut obrir o llegir '%s'"
@@ -8227,7 +8289,7 @@
 #: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306
 #: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507
 #: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653
-#: builtin/notes.c:877 builtin/tag.c:711
+#: builtin/notes.c:877 builtin/tag.c:456
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "S'ha fallat en resoldre '%s' com a referència vàlida."
@@ -8261,11 +8323,6 @@
 msgid "note contents in a file"
 msgstr "anota els continguts en un fitxer"
 
-#: builtin/notes.c:398 builtin/notes.c:401 builtin/notes.c:561
-#: builtin/notes.c:564 builtin/tag.c:630
-msgid "object"
-msgstr "objecte"
-
 #: builtin/notes.c:399 builtin/notes.c:562
 msgid "reuse and edit specified note object"
 msgstr "reusa i edita l'objecte de nota especificat"
@@ -8334,7 +8391,7 @@
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
 "Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
 msgstr ""
-"S'han desaprovat les opcions -m/-F/-c/-C en favor del subordre 'edit'.\n"
+"S'han desaprovat les opcions -m/-F/-c/-C en favor de la subordre 'edit'.\n"
 "Si us plau, useu 'git notes add -f -m/-F/-c/-C' en lloc d'això.\n"
 
 #: builtin/notes.c:764
@@ -8395,10 +8452,10 @@
 msgid "use notes from <notes-ref>"
 msgstr "usa les notes de <referència-de-notes>"
 
-#: builtin/notes.c:1012 builtin/remote.c:1588
+#: builtin/notes.c:1012 builtin/remote.c:1647
 #, c-format
 msgid "Unknown subcommand: %s"
-msgstr "Subordre desconegut: %s"
+msgstr "Subordre desconeguda: %s"
 
 #: builtin/pack-objects.c:28
 msgid ""
@@ -8616,20 +8673,24 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <hora>] [--] [<cap>...]"
 
-#: builtin/prune.c:105 builtin/worktree.c:121
+#: builtin/prune.c:105 builtin/worktree.c:124
 msgid "do not remove, show only"
 msgstr "no eliminis, només mostra"
 
-#: builtin/prune.c:106 builtin/worktree.c:122
+#: builtin/prune.c:106 builtin/worktree.c:125
 msgid "report pruned objects"
 msgstr "informa d'objectes podats"
 
-#: builtin/prune.c:109 builtin/worktree.c:124
+#: builtin/prune.c:109 builtin/worktree.c:127
 msgid "expire objects older than <time>"
 msgstr "fes caducar els objectes més vells que <hora>"
 
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
+msgstr "no es pot podar en un dipòsit d'objectes precioses"
+
 #: builtin/pull.c:69
-msgid "git pull [options] [<repository> [<refspec>...]]"
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [opcions] [<dipòsit> [<especificació-de-referència>...]]"
 
 #: builtin/pull.c:113
@@ -8682,8 +8743,7 @@
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr ""
-"No hi ha candidats per a fusionar entre les referències que acabeu de "
-"obtenir."
+"No hi ha candidats per a fusionar entre les referències que acabeu d'obtenir."
 
 #: builtin/pull.c:439
 msgid ""
@@ -8702,7 +8762,7 @@
 msgstr ""
 "Heu demanat baixar del remot '%s', però no heu especificat cap branca.\n"
 "Perquè aquest no és el remot configurat per defecte per a la vostra\n"
-"branca actual, heu de especificar una branca en la línia d'ordres."
+"branca actual, heu d'especificar una branca en la línia d'ordres."
 
 #: builtin/pull.c:447
 msgid "You are not currently on a branch."
@@ -8786,19 +8846,19 @@
 msgid "Cannot rebase onto multiple branches."
 msgstr "No es pot rebasar sobre múltiples branques."
 
-#: builtin/push.c:15
+#: builtin/push.c:16
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [<opcions>] [<dipòsit> [<especificació-de-referència>...]]"
 
-#: builtin/push.c:86
+#: builtin/push.c:88
 msgid "tag shorthand without <tag>"
 msgstr "abreviatura d'etiqueta sense <tag>"
 
-#: builtin/push.c:96
+#: builtin/push.c:98
 msgid "--delete only accepts plain target ref names"
 msgstr "--delete només accepta noms de referència de destí senzills"
 
-#: builtin/push.c:140
+#: builtin/push.c:142
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -8807,7 +8867,7 @@
 "Per a triar qualsevulla opció permanentment, vegeu push.default a 'git help "
 "config'."
 
-#: builtin/push.c:143
+#: builtin/push.c:145
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -8832,7 +8892,7 @@
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:158
+#: builtin/push.c:160
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -8847,7 +8907,7 @@
 "\n"
 "    git push %s HEAD:<nom-de-branca-remota>\n"
 
-#: builtin/push.c:172
+#: builtin/push.c:174
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -8860,12 +8920,12 @@
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:180
+#: builtin/push.c:182
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr "La branca actual %s té múltiples branques fonts, refusant pujar."
 
-#: builtin/push.c:183
+#: builtin/push.c:185
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -8876,7 +8936,7 @@
 "branca actual '%s', sense dir-me què pujar per a actualitzar\n"
 "quina branca remota."
 
-#: builtin/push.c:206
+#: builtin/push.c:208
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -8923,14 +8983,14 @@
 "'current' en lloc de 'simple' si a vegades useu versions més antigues\n"
 "del Git)"
 
-#: builtin/push.c:273
+#: builtin/push.c:275
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "No heu especificat cap especificació de referència a pujar, i push.default "
 "és \"nothing\"."
 
-#: builtin/push.c:280
+#: builtin/push.c:282
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -8942,7 +9002,7 @@
 "els canvis remots (per exemple, 'git pull ...') abans de pujar de nou.\n"
 "Vegeu la 'Nota sobre avanços ràpids' a 'git push --help' per detalls."
 
-#: builtin/push.c:286
+#: builtin/push.c:288
 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"
@@ -8955,7 +9015,7 @@
 "abans de pujar de nou.\n"
 "Vegeu la 'Nota sobre avanços ràpids' a 'git push --help' per detalls."
 
-#: builtin/push.c:292
+#: builtin/push.c:294
 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"
@@ -8970,12 +9030,12 @@
 "pujar de nou.\n"
 "Vegeu la 'Nota sobre avanços ràpids' a 'git push --help' per detalls."
 
-#: builtin/push.c:299
+#: builtin/push.c:301
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 "S'han rebutjat les actualitzacions perquè l'etiqueta ja existeix en el remot."
 
-#: builtin/push.c:302
+#: builtin/push.c:304
 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"
@@ -8986,22 +9046,22 @@
 "fer que assenyali un objecte no de comissió, sense usar l'opció\n"
 "'--force'.\n"
 
-#: builtin/push.c:361
+#: builtin/push.c:363
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Pujant a %s\n"
 
-#: builtin/push.c:365
+#: builtin/push.c:367
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "s'ha fallat en pujar algunes referències a '%s'"
 
-#: builtin/push.c:395
+#: builtin/push.c:397
 #, c-format
 msgid "bad repository '%s'"
 msgstr "dipòsit dolent '%s'"
 
-#: builtin/push.c:396
+#: builtin/push.c:398
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -9023,100 +9083,104 @@
 "\n"
 "    git push <nom>\n"
 
-#: builtin/push.c:411
+#: builtin/push.c:413
 msgid "--all and --tags are incompatible"
 msgstr "--all i --tags són incompatibles"
 
-#: builtin/push.c:412
+#: builtin/push.c:414
 msgid "--all can't be combined with refspecs"
 msgstr "--all no es pot combinar amb especificacions de referència"
 
-#: builtin/push.c:417
+#: builtin/push.c:419
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror i --tags són incompatibles"
 
-#: builtin/push.c:418
+#: builtin/push.c:420
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror no es pot combinar amb especificacions de referència"
 
-#: builtin/push.c:423
+#: builtin/push.c:425
 msgid "--all and --mirror are incompatible"
 msgstr "--all i --mirror són incompatibles"
 
-#: builtin/push.c:539
+#: builtin/push.c:537
 msgid "repository"
 msgstr "dipòsit"
 
-#: builtin/push.c:540 builtin/send-pack.c:161
+#: builtin/push.c:538 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "puja totes les referències"
 
-#: builtin/push.c:541 builtin/send-pack.c:163
+#: builtin/push.c:539 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "reflecteix totes les referències"
 
-#: builtin/push.c:543
+#: builtin/push.c:541
 msgid "delete refs"
 msgstr "suprimeix les referències"
 
-#: builtin/push.c:544
+#: builtin/push.c:542
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "puja les etiquetes (no es pot usar amb --all o --mirror)"
 
-#: builtin/push.c:547 builtin/send-pack.c:164
+#: builtin/push.c:545 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "força les actualitzacions"
 
-#: builtin/push.c:549 builtin/send-pack.c:175
+#: builtin/push.c:547 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "nom-de-referència>:<esperat"
 
-#: builtin/push.c:550 builtin/send-pack.c:176
+#: builtin/push.c:548 builtin/send-pack.c:176
 msgid "require old value of ref to be at this value"
 msgstr "requereix que el valor antic de la referència sigui d'aquest valor"
 
-#: builtin/push.c:553
+#: builtin/push.c:550
+msgid "check|on-demand|no"
+msgstr "comprova|sota demanda|no"
+
+#: builtin/push.c:551
 msgid "control recursive pushing of submodules"
 msgstr "controla la pujada recursiva dels submòduls"
 
-#: builtin/push.c:555 builtin/send-pack.c:169
+#: builtin/push.c:553 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "usa el paquet prim"
 
-#: builtin/push.c:556 builtin/push.c:557 builtin/send-pack.c:158
+#: builtin/push.c:554 builtin/push.c:555 builtin/send-pack.c:158
 #: builtin/send-pack.c:159
 msgid "receive pack program"
 msgstr "programa que rep els paquets"
 
-#: builtin/push.c:558
+#: builtin/push.c:556
 msgid "set upstream for git pull/status"
 msgstr "estableix la font per a git pull/status"
 
-#: builtin/push.c:561
+#: builtin/push.c:559
 msgid "prune locally removed refs"
 msgstr "poda les referències eliminades localment"
 
-#: builtin/push.c:563
+#: builtin/push.c:561
 msgid "bypass pre-push hook"
 msgstr "evita el ganxo de prepujada"
 
-#: builtin/push.c:564
+#: builtin/push.c:562
 msgid "push missing but relevant tags"
 msgstr "puja les etiquetes absents però rellevants"
 
-#: builtin/push.c:567 builtin/send-pack.c:166
+#: builtin/push.c:565 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "firma la pujada amb GPG"
 
-#: builtin/push.c:569 builtin/send-pack.c:170
+#: builtin/push.c:567 builtin/send-pack.c:170
 msgid "request atomic transaction on remote side"
 msgstr "demana una transacció atòmica al costat remot"
 
-#: builtin/push.c:579
+#: builtin/push.c:577
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete és incompatible amb --all, --mirror i --tags"
 
-#: builtin/push.c:581
+#: builtin/push.c:579
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete no té sentit sense referències"
 
@@ -9194,12 +9258,12 @@
 msgid "debug unpack-trees"
 msgstr "depura unpack-trees"
 
-#: builtin/reflog.c:432
+#: builtin/reflog.c:428
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
 msgstr "'%s' per a '%s' no és una marca de temps vàlida"
 
-#: builtin/reflog.c:549 builtin/reflog.c:554
+#: builtin/reflog.c:545 builtin/reflog.c:550
 #, c-format
 msgid "'%s' is not a valid timestamp"
 msgstr "'%s' no és una marca de temps vàlida"
@@ -9216,15 +9280,15 @@
 "git remote add [-t <branca>] [-m <mestra>] [-f] [--tags | --no-tags] [--"
 "mirror=<fetch|push>] <nom> <url>"
 
-#: builtin/remote.c:14 builtin/remote.c:33
+#: builtin/remote.c:14 builtin/remote.c:34
 msgid "git remote rename <old> <new>"
 msgstr "git remote rename <antic> <nou>"
 
-#: builtin/remote.c:15 builtin/remote.c:38
+#: builtin/remote.c:15 builtin/remote.c:39
 msgid "git remote remove <name>"
 msgstr "git remote remove <nom>"
 
-#: builtin/remote.c:16 builtin/remote.c:43
+#: builtin/remote.c:16 builtin/remote.c:44
 msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
 msgstr "git remote set-head <nom> (-a | --auto | -d | --delete | <branca>)"
 
@@ -9246,48 +9310,52 @@
 msgid "git remote set-branches [--add] <name> <branch>..."
 msgstr "git remote set-branches [--add] <nom> <branca>..."
 
-#: builtin/remote.c:21 builtin/remote.c:69
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr "git remote get-url [--push] [--all] <nom>"
+
+#: builtin/remote.c:22 builtin/remote.c:75
 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
 msgstr "git remote set-url [--push] <nom> <url-nou> [<url-antic>]"
 
-#: builtin/remote.c:22 builtin/remote.c:70
+#: builtin/remote.c:23 builtin/remote.c:76
 msgid "git remote set-url --add <name> <newurl>"
 msgstr "git remote set-url --add <nom> <url-nou>"
 
-#: builtin/remote.c:23 builtin/remote.c:71
+#: builtin/remote.c:24 builtin/remote.c:77
 msgid "git remote set-url --delete <name> <url>"
 msgstr "git remote set-url --delete <nom> <url>"
 
-#: builtin/remote.c:28
+#: builtin/remote.c:29
 msgid "git remote add [<options>] <name> <url>"
 msgstr "git remote add [<opcions>] <nom> <url>"
 
-#: builtin/remote.c:48
+#: builtin/remote.c:49
 msgid "git remote set-branches <name> <branch>..."
 msgstr "git remote set-branches <nom> <branca>..."
 
-#: builtin/remote.c:49
+#: builtin/remote.c:50
 msgid "git remote set-branches --add <name> <branch>..."
 msgstr "git remote set-branches --add <nom> <branca>..."
 
-#: builtin/remote.c:54
+#: builtin/remote.c:55
 msgid "git remote show [<options>] <name>"
 msgstr "git remote show [<opcions>] <nom>"
 
-#: builtin/remote.c:59
+#: builtin/remote.c:60
 msgid "git remote prune [<options>] <name>"
 msgstr "git remote prune [<opcions>] <nom>"
 
-#: builtin/remote.c:64
+#: builtin/remote.c:65
 msgid "git remote update [<options>] [<group> | <remote>]..."
 msgstr "git remote update [<opcions>] [<grup> | <remot>]..."
 
-#: builtin/remote.c:88
+#: builtin/remote.c:94
 #, c-format
 msgid "Updating %s"
 msgstr "Actualitzant %s"
 
-#: builtin/remote.c:120
+#: builtin/remote.c:126
 msgid ""
 "--mirror is dangerous and deprecated; please\n"
 "\t use --mirror=fetch or --mirror=push instead"
@@ -9296,98 +9364,98 @@
 "\t plau, useu --mirror=fetch o\n"
 "\t --mirror=push en lloc d'això"
 
-#: builtin/remote.c:137
+#: builtin/remote.c:143
 #, c-format
 msgid "unknown mirror argument: %s"
 msgstr "paràmetre de reflexió desconegut: %s"
 
-#: builtin/remote.c:153
+#: builtin/remote.c:159
 msgid "fetch the remote branches"
 msgstr "obtén les branques remotes"
 
-#: builtin/remote.c:155
+#: builtin/remote.c:161
 msgid "import all tags and associated objects when fetching"
 msgstr "en obtenir, importa totes les etiquetes i tots els objectes"
 
-#: builtin/remote.c:158
+#: builtin/remote.c:164
 msgid "or do not fetch any tag at all (--no-tags)"
 msgstr "o no obtinguis cap etiqueta (--no-tags)"
 
-#: builtin/remote.c:160
+#: builtin/remote.c:166
 msgid "branch(es) to track"
 msgstr "branques a seguir"
 
-#: builtin/remote.c:161
+#: builtin/remote.c:167
 msgid "master branch"
 msgstr "branca mestra"
 
-#: builtin/remote.c:162
+#: builtin/remote.c:168
 msgid "push|fetch"
 msgstr "push|fetch"
 
-#: builtin/remote.c:163
+#: builtin/remote.c:169
 msgid "set up remote as a mirror to push to or fetch from"
 msgstr "estableix el remot com a mirall al qual pujar o del qual obtenir"
 
-#: builtin/remote.c:175
+#: builtin/remote.c:181
 msgid "specifying a master branch makes no sense with --mirror"
 msgstr "especificar una branca mestra no té sentit amb --mirror"
 
-#: builtin/remote.c:177
+#: builtin/remote.c:183
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr ""
 "especificar les branques a seguir té sentit només amb miralls d'obtenció"
 
-#: builtin/remote.c:187 builtin/remote.c:637
+#: builtin/remote.c:193 builtin/remote.c:643
 #, c-format
 msgid "remote %s already exists."
 msgstr "el remot %s ja existeix."
 
-#: builtin/remote.c:191 builtin/remote.c:641
+#: builtin/remote.c:197 builtin/remote.c:647
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "'%s' no és un nom de remot vàlid"
 
-#: builtin/remote.c:235
+#: builtin/remote.c:241
 #, c-format
 msgid "Could not setup master '%s'"
 msgstr "No s'ha pogut configurar la mestra '%s'"
 
-#: builtin/remote.c:335
+#: builtin/remote.c:341
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr ""
 "No s'ha pogut obtenir el mapa d'obtenció de l'especificació de referència %s"
 
-#: builtin/remote.c:436 builtin/remote.c:444
+#: builtin/remote.c:442 builtin/remote.c:450
 msgid "(matching)"
 msgstr "(coincident)"
 
-#: builtin/remote.c:448
+#: builtin/remote.c:454
 msgid "(delete)"
 msgstr "(suprimir)"
 
-#: builtin/remote.c:588 builtin/remote.c:594 builtin/remote.c:600
+#: builtin/remote.c:594 builtin/remote.c:600 builtin/remote.c:606
 #, c-format
 msgid "Could not append '%s' to '%s'"
 msgstr "No s'ha pogut annexar '%s' a '%s'"
 
-#: builtin/remote.c:630 builtin/remote.c:769 builtin/remote.c:869
+#: builtin/remote.c:636 builtin/remote.c:775 builtin/remote.c:875
 #, c-format
 msgid "No such remote: %s"
 msgstr "No hi ha tal remot: %s"
 
-#: builtin/remote.c:647
+#: builtin/remote.c:653
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "No s'ha pogut canviar el nom de la secció de configuració '%s' a '%s'"
 
-#: builtin/remote.c:653 builtin/remote.c:821
+#: builtin/remote.c:659 builtin/remote.c:827
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "No s'ha pogut eliminar la secció de configuració '%s'"
 
-#: builtin/remote.c:668
+#: builtin/remote.c:674
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -9398,27 +9466,27 @@
 "\t%s\n"
 "\tSi us plau, actualitzeu la configuració manualment si és necessari."
 
-#: builtin/remote.c:674
+#: builtin/remote.c:680
 #, c-format
 msgid "Could not append '%s'"
 msgstr "No s'ha pogut annexar '%s'"
 
-#: builtin/remote.c:685
+#: builtin/remote.c:691
 #, c-format
 msgid "Could not set '%s'"
 msgstr "No s'ha pogut establir '%s'"
 
-#: builtin/remote.c:707
+#: builtin/remote.c:713
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "la supressió de '%s' ha fallat"
 
-#: builtin/remote.c:741
+#: builtin/remote.c:747
 #, c-format
 msgid "creating '%s' failed"
 msgstr "la creació de '%s' ha fallat"
 
-#: builtin/remote.c:807
+#: builtin/remote.c:813
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -9433,267 +9501,280 @@
 "eliminat;\n"
 "per a suprimir-les, useu:"
 
-#: builtin/remote.c:922
+#: builtin/remote.c:928
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " nou (la pròxima obtenció emmagatzemarà a remotes/%s)"
 
-#: builtin/remote.c:925
+#: builtin/remote.c:931
 msgid " tracked"
 msgstr " seguit"
 
-#: builtin/remote.c:927
+#: builtin/remote.c:933
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " estancat (useu 'git remote prune' per a eliminar)"
 
-#: builtin/remote.c:929
+#: builtin/remote.c:935
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:976
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "branch.%s.merge no vàlid; no es pot rebasar sobre > 1 branca"
 
-#: builtin/remote.c:977
+#: builtin/remote.c:983
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "es rebasa sobre el remot %s"
 
-#: builtin/remote.c:980
+#: builtin/remote.c:986
 #, c-format
 msgid " merges with remote %s"
 msgstr "es fusiona amb el remot %s"
 
-#: builtin/remote.c:981
+#: builtin/remote.c:987
 msgid "    and with remote"
 msgstr "    i amb el remot"
 
-#: builtin/remote.c:983
+#: builtin/remote.c:989
 #, c-format
 msgid "merges with remote %s"
 msgstr "es fusiona amb el remot %s"
 
-#: builtin/remote.c:984
+#: builtin/remote.c:990
 msgid "   and with remote"
 msgstr "   i amb el remot"
 
-#: builtin/remote.c:1030
+#: builtin/remote.c:1036
 msgid "create"
 msgstr "crea"
 
-#: builtin/remote.c:1033
+#: builtin/remote.c:1039
 msgid "delete"
 msgstr "suprimeix"
 
-#: builtin/remote.c:1037
+#: builtin/remote.c:1043
 msgid "up to date"
 msgstr "al dia"
 
-#: builtin/remote.c:1040
+#: builtin/remote.c:1046
 msgid "fast-forwardable"
 msgstr "avanç ràpid possible"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1049
 msgid "local out of date"
 msgstr "local no actualitzat"
 
-#: builtin/remote.c:1050
+#: builtin/remote.c:1056
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s força a %-*s (%s)"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1059
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s puja a %-*s (%s)"
 
-#: builtin/remote.c:1057
+#: builtin/remote.c:1063
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s força a %s"
 
-#: builtin/remote.c:1060
+#: builtin/remote.c:1066
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s puja a %s"
 
-#: builtin/remote.c:1128
+#: builtin/remote.c:1134
 msgid "do not query remotes"
 msgstr "no consultis els remots"
 
-#: builtin/remote.c:1155
+#: builtin/remote.c:1161
 #, c-format
 msgid "* remote %s"
 msgstr "* remot %s"
 
-#: builtin/remote.c:1156
+#: builtin/remote.c:1162
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL d'obtenció: %s"
 
-#: builtin/remote.c:1157 builtin/remote.c:1308
+#: builtin/remote.c:1163 builtin/remote.c:1314
 msgid "(no URL)"
 msgstr "(sense URL)"
 
-#: builtin/remote.c:1166 builtin/remote.c:1168
+#: builtin/remote.c:1172 builtin/remote.c:1174
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL de pujada: %s"
 
-#: builtin/remote.c:1170 builtin/remote.c:1172 builtin/remote.c:1174
+#: builtin/remote.c:1176 builtin/remote.c:1178 builtin/remote.c:1180
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Branca de HEAD: %s"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1182
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr ""
 "  Branca de HEAD (el HEAD remot és ambigu, pot ser un dels següents):\n"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1194
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Branca remota:%s"
 msgstr[1] "  Branques remotes:%s"
 
-#: builtin/remote.c:1191 builtin/remote.c:1218
+#: builtin/remote.c:1197 builtin/remote.c:1224
 msgid " (status not queried)"
 msgstr " (estat no consultat)"
 
-#: builtin/remote.c:1200
+#: builtin/remote.c:1206
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Branca local configurada per a 'git pull':"
 msgstr[1] "  Branques locals configurades per a 'git pull':"
 
-#: builtin/remote.c:1208
+#: builtin/remote.c:1214
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  'git push' reflectirà les referències locals"
 
-#: builtin/remote.c:1215
+#: builtin/remote.c:1221
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Referència local configurada per a 'git push'%s:"
 msgstr[1] "  Referències locals configurades per a 'git push'%s:"
 
-#: builtin/remote.c:1236
+#: builtin/remote.c:1242
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "estableix refs/remotes/<name>/HEAD segons el remot"
 
-#: builtin/remote.c:1238
+#: builtin/remote.c:1244
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "suprimeix refs/remotes/<name>/HEAD"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1259
 msgid "Cannot determine remote HEAD"
 msgstr "No es pot determinar el HEAD remot"
 
-#: builtin/remote.c:1255
+#: builtin/remote.c:1261
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 "Múltiples branques de HEAD remotes. Si us plau, trieu-ne una explícitament "
 "amb:"
 
-#: builtin/remote.c:1265
+#: builtin/remote.c:1271
 #, c-format
 msgid "Could not delete %s"
 msgstr "No s'ha pogut suprimir %s"
 
-#: builtin/remote.c:1273
+#: builtin/remote.c:1279
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "No és una referència vàlida: %s"
 
-#: builtin/remote.c:1275
+#: builtin/remote.c:1281
 #, c-format
 msgid "Could not setup %s"
 msgstr "No s'ha pogut configurar %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1299
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s es tornarà penjant!"
 
-#: builtin/remote.c:1294
+#: builtin/remote.c:1300
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s s'ha tornat penjant!"
 
-#: builtin/remote.c:1304
+#: builtin/remote.c:1310
 #, c-format
 msgid "Pruning %s"
 msgstr "Podant %s"
 
-#: builtin/remote.c:1305
+#: builtin/remote.c:1311
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1321
+#: builtin/remote.c:1327
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [podaria] %s"
 
-#: builtin/remote.c:1324
+#: builtin/remote.c:1330
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [podat] %s"
 
-#: builtin/remote.c:1369
+#: builtin/remote.c:1375
 msgid "prune remotes after fetching"
 msgstr "poda els remots després d'obtenir-los"
 
-#: builtin/remote.c:1435 builtin/remote.c:1509
+#: builtin/remote.c:1441 builtin/remote.c:1498 builtin/remote.c:1566
 #, c-format
 msgid "No such remote '%s'"
 msgstr "No hi ha tal remot '%s'"
 
-#: builtin/remote.c:1455
+#: builtin/remote.c:1461
 msgid "add branch"
 msgstr "afegeix branca"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1468
 msgid "no remote specified"
 msgstr "cap remot especificat"
 
-#: builtin/remote.c:1484
+#: builtin/remote.c:1485
+msgid "query push URLs rather than fetch URLs"
+msgstr "consulta els URL de pujada en lloc dels URL d'obteniment"
+
+#: builtin/remote.c:1487
+msgid "return all URLs"
+msgstr "retorna tots els URL"
+
+#: builtin/remote.c:1515
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr "cap URL configurat per al remot '%s'"
+
+#: builtin/remote.c:1541
 msgid "manipulate push URLs"
 msgstr "manipula els URL de pujada"
 
-#: builtin/remote.c:1486
+#: builtin/remote.c:1543
 msgid "add URL"
 msgstr "afegeix URL"
 
-#: builtin/remote.c:1488
+#: builtin/remote.c:1545
 msgid "delete URLs"
 msgstr "suprimeix URLs"
 
-#: builtin/remote.c:1495
+#: builtin/remote.c:1552
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete no té sentit"
 
-#: builtin/remote.c:1535
+#: builtin/remote.c:1592
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Patró d'URL antic no vàlid: %s"
 
-#: builtin/remote.c:1543
+#: builtin/remote.c:1600
 #, c-format
 msgid "No such URL found: %s"
 msgstr "No s'ha trobat tal URL: %s"
 
-#: builtin/remote.c:1545
+#: builtin/remote.c:1602
 msgid "Will not delete all non-push URLs"
 msgstr "No se suprimiran tots els URL no de pujada"
 
-#: builtin/remote.c:1559
+#: builtin/remote.c:1616
 msgid "be verbose; must be placed before a subcommand"
-msgstr "sigues detallat; s'ha de col·locar abans d'un subordre"
+msgstr "sigues detallat; s'ha de col·locar abans d'una subordre"
 
 #: builtin/repack.c:17
 msgid "git repack [<options>]"
@@ -9765,7 +9846,11 @@
 msgid "repack objects in packs marked with .keep"
 msgstr "reempaqueta els objectes en paquets marcats amb .keep"
 
-#: builtin/repack.c:378
+#: builtin/repack.c:197
+msgid "cannot delete packs in a precious-objects repo"
+msgstr "no es pot suprimir paquets en un dipòsit d'objectes precioses"
+
+#: builtin/repack.c:381
 #, c-format
 msgid "removing '%s' failed"
 msgstr "l'eliminació de '%s' ha fallat"
@@ -9860,7 +9945,7 @@
 msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
 msgstr "git rerere [clear | forget <camí>... | status | remaining | diff | gc]"
 
-#: builtin/rerere.c:57
+#: builtin/rerere.c:58
 msgid "register clean resolutions in index"
 msgstr "registra les resolucions netes en l'índex"
 
@@ -9996,23 +10081,23 @@
 msgid "rev-list does not support display of notes"
 msgstr "el rev-list no permet mostrar notes"
 
-#: builtin/rev-parse.c:361
+#: builtin/rev-parse.c:358
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<opcions>] -- [<paràmetres>...]"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:363
 msgid "keep the `--` passed as an arg"
 msgstr "retén el `--` passat com a paràmetre"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:365
 msgid "stop parsing after the first non-option argument"
 msgstr "deixa d'analitzar després del primer paràmetre no d'opció"
 
-#: builtin/rev-parse.c:371
+#: builtin/rev-parse.c:368
 msgid "output in stuck long form"
 msgstr "emet en forma llarga enganxada"
 
-#: builtin/rev-parse.c:502
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -10242,7 +10327,7 @@
 
 #: builtin/send-pack.c:173
 msgid "print status from remote helper"
-msgstr "imprimeix l'estat des del ajudant remot"
+msgstr "imprimeix l'estat des de l'ajudant remot"
 
 #: builtin/shortlog.c:13
 msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
@@ -10274,7 +10359,7 @@
 msgid "Linewrap output"
 msgstr "Ajusta les línies de la sortida"
 
-#: builtin/show-branch.c:9
+#: builtin/show-branch.c:10
 msgid ""
 "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
 "\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
@@ -10286,71 +10371,71 @@
 "\t\t       [--more=<n> | --list | --independent | --merge-base]\n"
 "\t\t       [--no-name | --sha1-name] [--topics] [(<revisió> | <glob>)...]"
 
-#: builtin/show-branch.c:13
+#: builtin/show-branch.c:14
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<referència>]"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:640
 msgid "show remote-tracking and local branches"
 msgstr "mostra les branques amb seguiment remot i les locals"
 
-#: builtin/show-branch.c:661
+#: builtin/show-branch.c:642
 msgid "show remote-tracking branches"
 msgstr "mostra les branques amb seguiment remot"
 
-#: builtin/show-branch.c:663
+#: builtin/show-branch.c:644
 msgid "color '*!+-' corresponding to the branch"
 msgstr "colora '*!+-' corresponent a la branca"
 
-#: builtin/show-branch.c:665
+#: builtin/show-branch.c:646
 msgid "show <n> more commits after the common ancestor"
 msgstr "mostra <n> comissions després de l'avantpassat comú"
 
-#: builtin/show-branch.c:667
+#: builtin/show-branch.c:648
 msgid "synonym to more=-1"
 msgstr "sinònim de more=-1"
 
-#: builtin/show-branch.c:668
+#: builtin/show-branch.c:649
 msgid "suppress naming strings"
 msgstr "omet l'anomenament de cadenes"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:651
 msgid "include the current branch"
 msgstr "inclou la branca actual"
 
-#: builtin/show-branch.c:672
+#: builtin/show-branch.c:653
 msgid "name commits with their object names"
 msgstr "anomena les comissions amb els seus noms d'objecte"
 
-#: builtin/show-branch.c:674
+#: builtin/show-branch.c:655
 msgid "show possible merge bases"
 msgstr "mostra les bases de fusió possibles"
 
-#: builtin/show-branch.c:676
+#: builtin/show-branch.c:657
 msgid "show refs unreachable from any other ref"
 msgstr "mostra les referències inabastables de qualsevulla altra referència"
 
-#: builtin/show-branch.c:678
+#: builtin/show-branch.c:659
 msgid "show commits in topological order"
 msgstr "mostra les comissions en ordre topològic"
 
-#: builtin/show-branch.c:681
+#: builtin/show-branch.c:662
 msgid "show only commits not on the first branch"
 msgstr "mostra només les comissions que no siguin en la primera branca"
 
-#: builtin/show-branch.c:683
+#: builtin/show-branch.c:664
 msgid "show merges reachable from only one tip"
 msgstr "mostra les fusions abastables de només una punta"
 
-#: builtin/show-branch.c:685
+#: builtin/show-branch.c:666
 msgid "topologically sort, maintaining date order where possible"
 msgstr "ordena topològicament, mantenint l'ordre de dates on sigui possible"
 
-#: builtin/show-branch.c:688
+#: builtin/show-branch.c:669
 msgid "<n>[,<base>]"
 msgstr "<n>[,<base>]"
 
-#: builtin/show-branch.c:689
+#: builtin/show-branch.c:670
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "mostra les <n> entrades més recents començant a la base"
 
@@ -10363,43 +10448,137 @@
 "hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<patró>...]"
 
 #: builtin/show-ref.c:11
-msgid "git show-ref --exclude-existing[=<pattern>] < <ref-list>"
-msgstr "git show-ref --exclude-existing[=<patró>] < <llista-de-referències>"
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr "git show-ref --exclude-existing[=<patró>]"
 
-#: builtin/show-ref.c:170
+#: builtin/show-ref.c:165
 msgid "only show tags (can be combined with heads)"
 msgstr "mostra només les etiquetes (es pot combinar amb heads)"
 
-#: builtin/show-ref.c:171
+#: builtin/show-ref.c:166
 msgid "only show heads (can be combined with tags)"
 msgstr "mostra només els caps (es pot combinar amb tags)"
 
-#: builtin/show-ref.c:172
+#: builtin/show-ref.c:167
 msgid "stricter reference checking, requires exact ref path"
 msgstr ""
 "comprovació de referència més estricta, requereix el camí de referència "
 "exacte"
 
-#: builtin/show-ref.c:175 builtin/show-ref.c:177
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "mostra la referència HEAD, encara que es filtrés"
 
-#: builtin/show-ref.c:179
+#: builtin/show-ref.c:174
 msgid "dereference tags into object IDs"
 msgstr "dereferencia les etiquetes a IDs d'objecte"
 
-#: builtin/show-ref.c:181
+#: builtin/show-ref.c:176
 msgid "only show SHA1 hash using <n> digits"
 msgstr "mostra el hash SHA1 usant només <n> xifres"
 
-#: builtin/show-ref.c:185
+#: builtin/show-ref.c:180
 msgid "do not print results to stdout (useful with --verify)"
 msgstr "no imprimeixis els resultats a stdout (útil amb --verify)"
 
-#: builtin/show-ref.c:187
+#: builtin/show-ref.c:182
 msgid "show refs from stdin that aren't in local repository"
 msgstr "mostra les referències d'stdin que no siguin en el dipòsit local"
 
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr "git stripspace [-s | --strip-comments]"
+
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr "git stripspace [-c | --comment-lines]"
+
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr ""
+"salta i elimina totes les línies començant amb el caràcter de comentari"
+
+#: builtin/stripspace.c:38
+msgid "prepend comment character and blank to each line"
+msgstr "anteposa el caràcter de comentari i espai blanc a cada línia"
+
+#: builtin/submodule--helper.c:79 builtin/submodule--helper.c:167
+msgid "alternative anchor for relative paths"
+msgstr "àncora alternativa per als camins relatius"
+
+#: builtin/submodule--helper.c:84
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper list [--prefix=<camí>] [<camí>...]"
+
+#: builtin/submodule--helper.c:114
+msgid "git submodule--helper name <path>"
+msgstr "git submodule--helper name <camí>"
+
+#: builtin/submodule--helper.c:120
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr "No s'ha trobat cap mapatge de submòdul a .gitmodules per al camí '%s'"
+
+#: builtin/submodule--helper.c:170
+msgid "where the new submodule will be cloned to"
+msgstr "a on es clonarà el submòdul nou"
+
+#: builtin/submodule--helper.c:173
+msgid "name of the new submodule"
+msgstr "nom del submòdul nou"
+
+#: builtin/submodule--helper.c:176
+msgid "url where to clone the submodule from"
+msgstr "url del qual clonar el submòdul"
+
+#: builtin/submodule--helper.c:182
+msgid "depth for shallow clones"
+msgstr "profunditat dels clons superficials"
+
+#: builtin/submodule--helper.c:188
+msgid ""
+"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
+"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+msgstr ""
+"git submodule--helper clone [--prefix=<camí>] [--quiet] [--reference "
+"<dipòsit>] [--name <nom>] [--url <url>][--depth <profunditat>] [--] "
+"[<camí>...]"
+
+#: builtin/submodule--helper.c:202 builtin/submodule--helper.c:208
+#: builtin/submodule--helper.c:216
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "no s'ha pogut crear el directori '%s'"
+
+#: builtin/submodule--helper.c:204
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr "el clonatge de '%s' al camí de submòdul '%s' ha fallat"
+
+#: builtin/submodule--helper.c:227
+#, c-format
+msgid "cannot open file '%s'"
+msgstr "no es pot obrir el fitxer '%s'"
+
+#: builtin/submodule--helper.c:232
+#, c-format
+msgid "could not close file %s"
+msgstr "no s'ha pogut tancar el fitxer %s"
+
+#: builtin/submodule--helper.c:247
+#, c-format
+msgid "could not get submodule directory for '%s'"
+msgstr "no s'ha pogut obtenir el directori de submòdul per a '%s'"
+
+#: builtin/submodule--helper.c:273
+msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+msgstr "fatal: s'ha d'executar la subordre submodule--helper amb una subordre"
+
+#: builtin/submodule--helper.c:280
+#, c-format
+msgid "fatal: '%s' is not a valid submodule--helper subcommand"
+msgstr "fatal: '%s' no és una subordre vàlida de submodule--helper"
+
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
 msgstr "git symbolic-ref [<opcions>] <nom> [<referència>]"
@@ -10428,7 +10607,7 @@
 msgid "reason of the update"
 msgstr "raó de l'actualització"
 
-#: builtin/tag.c:22
+#: builtin/tag.c:23
 msgid ""
 "git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
 "[<head>]"
@@ -10436,48 +10615,44 @@
 "git tag [-a | -s | -u <id-de-clau>] [-f] [-m <missatge> | -F <fitxer>] <nom-"
 "d'etiqueta> [<cap>]"
 
-#: builtin/tag.c:23
+#: builtin/tag.c:24
 msgid "git tag -d <tagname>..."
 msgstr "git tag -d <nom-d'etiqueta>..."
 
-#: builtin/tag.c:24
+#: builtin/tag.c:25
 msgid ""
 "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
-"\t\t[<pattern>...]"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
 "git tag -l [-n[<nombre>]] [--contains <comissió>]\n"
-"\t\t[--points-at <objecte>] [<patró>...]"
+"\t\t[--points-at <objecte>] [--format=<format>]\n"
+"\t\t[--[no-]merged [<comissió>]] [<patró>...]"
 
-#: builtin/tag.c:26
+#: builtin/tag.c:27
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <nom-d'etiqueta>..."
 
-#: builtin/tag.c:69
-#, c-format
-msgid "malformed object at '%s'"
-msgstr "objecte mal format a '%s'"
-
-#: builtin/tag.c:301
+#: builtin/tag.c:80
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "nom d'etiqueta massa llarg: %.*s..."
 
-#: builtin/tag.c:306
+#: builtin/tag.c:85
 #, c-format
 msgid "tag '%s' not found."
 msgstr "etiqueta '%s' no trobada."
 
-#: builtin/tag.c:321
+#: builtin/tag.c:100
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "L'etiqueta '%s' s'ha suprimit (era %s)\n"
 
-#: builtin/tag.c:333
+#: builtin/tag.c:112
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "no s'ha pogut verificar l'etiqueta '%s'"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:122
 #, c-format
 msgid ""
 "\n"
@@ -10490,7 +10665,7 @@
 "  %s\n"
 "Les línies que comencin amb '%c' s'ignoraran.\n"
 
-#: builtin/tag.c:347
+#: builtin/tag.c:126
 #, c-format
 msgid ""
 "\n"
@@ -10505,153 +10680,138 @@
 "Les línies que comencin amb '%c' es retindran; podeu eliminar-les per vós "
 "mateix si voleu.\n"
 
-#: builtin/tag.c:371
-#, c-format
-msgid "unsupported sort specification '%s'"
-msgstr "especificació d'ordenació '%s' no admesa"
-
-#: builtin/tag.c:373
-#, c-format
-msgid "unsupported sort specification '%s' in variable '%s'"
-msgstr "especificació d'ordenació '%s' no admesa en la variable '%s'"
-
-#: builtin/tag.c:428
+#: builtin/tag.c:199
 msgid "unable to sign the tag"
 msgstr "no s'ha pogut firmar l'etiqueta"
 
-#: builtin/tag.c:430
+#: builtin/tag.c:201
 msgid "unable to write tag file"
 msgstr "no s'ha pogut escriure el fitxer d'etiqueta"
 
-#: builtin/tag.c:455
+#: builtin/tag.c:226
 msgid "bad object type."
 msgstr "tipus d'objecte dolent."
 
-#: builtin/tag.c:468
+#: builtin/tag.c:239
 msgid "tag header too big."
 msgstr "capçalera d'etiqueta massa gran."
 
-#: builtin/tag.c:504
+#: builtin/tag.c:275
 msgid "no tag message?"
 msgstr "cap missatge d'etiqueta?"
 
-#: builtin/tag.c:510
+#: builtin/tag.c:281
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "S'ha deixat el missatge de l'etiqueta en %s\n"
 
-#: builtin/tag.c:559
-msgid "switch 'points-at' requires an object"
-msgstr "l'opció 'points-at' requereix un objecte"
-
-#: builtin/tag.c:561
-#, c-format
-msgid "malformed object name '%s'"
-msgstr "nom d'objecte mal format '%s'"
-
-#: builtin/tag.c:590
+#: builtin/tag.c:339
 msgid "list tag names"
 msgstr "llista els noms d'etiqueta"
 
-#: builtin/tag.c:592
+#: builtin/tag.c:341
 msgid "print <n> lines of each tag message"
 msgstr "imprimeix <n> línies de cada missatge d'etiqueta"
 
-#: builtin/tag.c:594
+#: builtin/tag.c:343
 msgid "delete tags"
 msgstr "suprimeix les etiquetes"
 
-#: builtin/tag.c:595
+#: builtin/tag.c:344
 msgid "verify tags"
 msgstr "verifica les etiquetes"
 
-#: builtin/tag.c:597
+#: builtin/tag.c:346
 msgid "Tag creation options"
 msgstr "Opcions de creació d'etiquetes"
 
-#: builtin/tag.c:599
+#: builtin/tag.c:348
 msgid "annotated tag, needs a message"
 msgstr "etiqueta anotada, necessita un missatge"
 
-#: builtin/tag.c:601
+#: builtin/tag.c:350
 msgid "tag message"
 msgstr "missatge d'etiqueta"
 
-#: builtin/tag.c:603
+#: builtin/tag.c:352
 msgid "annotated and GPG-signed tag"
 msgstr "etiqueta anotada i firmada per GPG"
 
-#: builtin/tag.c:607
+#: builtin/tag.c:356
 msgid "use another key to sign the tag"
 msgstr "usa una altra clau per a firmar l'etiqueta"
 
-#: builtin/tag.c:608
+#: builtin/tag.c:357
 msgid "replace the tag if exists"
 msgstr "reemplaça l'etiqueta si existeix"
 
-#: builtin/tag.c:609 builtin/update-ref.c:368
+#: builtin/tag.c:358 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "crea un registre de referències"
 
-#: builtin/tag.c:611
+#: builtin/tag.c:360
 msgid "Tag listing options"
 msgstr "Opcions de llistat d'etiquetes"
 
-#: builtin/tag.c:612
+#: builtin/tag.c:361
 msgid "show tag list in columns"
 msgstr "mostra la llista d'etiquetes en columnes"
 
-#: builtin/tag.c:614
-msgid "sort tags"
-msgstr "ordena les etiquetes"
-
-#: builtin/tag.c:619 builtin/tag.c:625
+#: builtin/tag.c:362 builtin/tag.c:363
 msgid "print only tags that contain the commit"
 msgstr "imprimeix només les etiquetes que continguin la comissió"
 
-#: builtin/tag.c:631
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
+msgstr "imprimeix només les etiquetes que s'han fusionat"
+
+#: builtin/tag.c:365
+msgid "print only tags that are not merged"
+msgstr "imprimeix només les etiquetes que no s'han fusionat"
+
+#: builtin/tag.c:370
 msgid "print only tags of the object"
 msgstr "imprimeix només les etiquetes de l'objecte"
 
-#: builtin/tag.c:657
+#: builtin/tag.c:399
 msgid "--column and -n are incompatible"
 msgstr "--column i -n són incompatibles"
 
-#: builtin/tag.c:669
-msgid "--sort and -n are incompatible"
-msgstr "--sort i -n són incompatibles"
-
-#: builtin/tag.c:676
+#: builtin/tag.c:419
 msgid "-n option is only allowed with -l."
 msgstr "es permet l'opció -n només amb -l."
 
-#: builtin/tag.c:678
+#: builtin/tag.c:421
 msgid "--contains option is only allowed with -l."
 msgstr "es permet l'opció --contains només amb -l."
 
-#: builtin/tag.c:680
+#: builtin/tag.c:423
 msgid "--points-at option is only allowed with -l."
 msgstr "es permet --points-at option només amb -l."
 
-#: builtin/tag.c:688
+#: builtin/tag.c:425
+msgid "--merged and --no-merged option are only allowed with -l"
+msgstr "es permeten les opcions --merged i --no-merged només amb -l"
+
+#: builtin/tag.c:433
 msgid "only one -F or -m option is allowed."
 msgstr "només es permet una opció -F o -m."
 
-#: builtin/tag.c:708
+#: builtin/tag.c:453
 msgid "too many params"
 msgstr "massa paràmetres"
 
-#: builtin/tag.c:714
+#: builtin/tag.c:459
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' no és un nom d'etiqueta vàlid."
 
-#: builtin/tag.c:719
+#: builtin/tag.c:464
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "l'etiqueta '%s' ja existeix"
 
-#: builtin/tag.c:744
+#: builtin/tag.c:489
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Etiqueta '%s' actualitzada (era %s)\n"
@@ -10923,78 +11083,82 @@
 msgid "print tag contents"
 msgstr "imprimeix els continguts de l'etiqueta"
 
-#: builtin/worktree.c:13
-msgid "git worktree add [<options>] <path> <branch>"
-msgstr "git worktree add [<opcions>] <camí> <branca>"
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr "git worktree add [<opcions>] <camí> [<branca>]"
 
-#: builtin/worktree.c:14
+#: builtin/worktree.c:16
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<opcions>]"
 
-#: builtin/worktree.c:36
+#: builtin/worktree.c:17
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<opcions>]"
+
+#: builtin/worktree.c:39
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Eliminació de worktrees/%s: no és un directori vàlid"
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:45
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Eliminació de worktrees/%s: el fitxer gitdir no existeix"
 
-#: builtin/worktree.c:47
+#: builtin/worktree.c:50
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "Eliminació de worktrees/%s: no s'ha pogut llegir el fitxer gitdir (%s)"
 
-#: builtin/worktree.c:58
+#: builtin/worktree.c:61
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Eliminació de worktrees/%s: fitxer gitdir no vàlid"
 
-#: builtin/worktree.c:74
+#: builtin/worktree.c:77
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr ""
 "Eliminació de worktrees/%s: el fitxer gitdir es refereix a una ubicació no "
 "existent"
 
-#: builtin/worktree.c:109
+#: builtin/worktree.c:112
 #, c-format
 msgid "failed to remove: %s"
 msgstr "s'ha fallat en eliminar: %s"
 
-#: builtin/worktree.c:198
+#: builtin/worktree.c:201
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' ja existeix"
 
-#: builtin/worktree.c:232
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "no s'ha pogut crear directori de '%s'"
 
-#: builtin/worktree.c:268
+#: builtin/worktree.c:271
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Preparant %s (identificador %s)"
 
-#: builtin/worktree.c:316
+#: builtin/worktree.c:319
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr "agafa <branca> encara que sigui agafada en altre arbre de treball"
 
-#: builtin/worktree.c:318
+#: builtin/worktree.c:321
 msgid "create a new branch"
 msgstr "crea una branca nova"
 
-#: builtin/worktree.c:320
+#: builtin/worktree.c:323
 msgid "create or reset a branch"
 msgstr "crea o restableix una branca"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:324
 msgid "detach HEAD at named commit"
 msgstr "separa el HEAD a la comissió anomenada"
 
-#: builtin/worktree.c:328
+#: builtin/worktree.c:331
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B i --detach són mutualment exclusius"
 
@@ -11144,49 +11308,49 @@
 msgid "no-op (backward compatibility)"
 msgstr "operació nul·la (per a compatibilitat amb versions anteriors)"
 
-#: parse-options.h:236
+#: parse-options.h:237
 msgid "be more verbose"
 msgstr "sigues més detallat"
 
-#: parse-options.h:238
+#: parse-options.h:239
 msgid "be more quiet"
 msgstr "sigues més callat"
 
-#: parse-options.h:244
+#: parse-options.h:245
 msgid "use <n> digits to display SHA-1s"
 msgstr "usa <n> xifres per presentar els SHA-1"
 
-#: rerere.h:28
+#: rerere.h:38
 msgid "update the index with reused conflict resolution if possible"
 msgstr ""
 "actualitza l'índex amb la resolució de conflicte reusada si és possible"
 
-#: git-bisect.sh:50
+#: git-bisect.sh:55
 msgid "You need to start by \"git bisect start\""
 msgstr "Cal començar per \"git bisect start\""
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:56
+#: git-bisect.sh:61
 msgid "Do you want me to do it for you [Y/n]? "
 msgstr "Voleu que ho faci per vós [Y/n]? "
 
-#: git-bisect.sh:99
+#: git-bisect.sh:122
 #, sh-format
 msgid "unrecognised option: '$arg'"
 msgstr "opció no reconeguda: '$arg'"
 
-#: git-bisect.sh:103
+#: git-bisect.sh:126
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr "'$arg' no sembla una revisió vàlida"
 
-#: git-bisect.sh:132
+#: git-bisect.sh:155
 msgid "Bad HEAD - I need a HEAD"
 msgstr "HEAD dolent - Cal un HEAD"
 
-#: git-bisect.sh:145
+#: git-bisect.sh:168
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
@@ -11194,39 +11358,39 @@
 "L'agafament de '$start_head' ha fallat. Proveu 'git bisect reset <branca-"
 "vàlida>'."
 
-#: git-bisect.sh:155
+#: git-bisect.sh:178
 msgid "won't bisect on cg-seek'ed tree"
 msgstr "no es bisecarà en un arbre en el qual s'ha fet cg-seek"
 
-#: git-bisect.sh:159
+#: git-bisect.sh:182
 msgid "Bad HEAD - strange symbolic ref"
 msgstr "HEAD dolent - referència simbòlica estranya"
 
-#: git-bisect.sh:211
+#: git-bisect.sh:234
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr "Paràmetre bisect_write dolent: $state"
 
-#: git-bisect.sh:240
+#: git-bisect.sh:263
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr "Introducció de revisió dolenta: $arg"
 
-#: git-bisect.sh:255
+#: git-bisect.sh:278
 msgid "Please call 'bisect_state' with at least one argument."
 msgstr "Si us plau, invoqueu 'bisect_state' amb almenys un paràmetre."
 
-#: git-bisect.sh:267
+#: git-bisect.sh:290
 #, sh-format
 msgid "Bad rev input: $rev"
 msgstr "Introducció de revisió dolenta: $rev"
 
-#: git-bisect.sh:276
+#: git-bisect.sh:299
 #, sh-format
 msgid "'git bisect $TERM_BAD' can take only one argument."
 msgstr "'git bisect $TERM_BAD' pot acceptar només un paràmetre."
 
-#: git-bisect.sh:299
+#: git-bisect.sh:322
 #, sh-format
 msgid "Warning: bisecting only with a $TERM_BAD commit."
 msgstr "Avís: bisecant amb només comissió $TERM_BAD."
@@ -11234,11 +11398,11 @@
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:305
+#: git-bisect.sh:328
 msgid "Are you sure [Y/n]? "
 msgstr "N'esteu segur [Y/n]? "
 
-#: git-bisect.sh:317
+#: git-bisect.sh:340
 #, sh-format
 msgid ""
 "You need to give me at least one $bad_syn and one $good_syn revision.\n"
@@ -11247,7 +11411,7 @@
 "Cal donar-me almenys una revisió $bad_syn i una $good_syn.\n"
 "(Podeu usar \"git bisect $bad_syn\" i \"git bisect $good_syn\" per això.)"
 
-#: git-bisect.sh:320
+#: git-bisect.sh:343
 #, sh-format
 msgid ""
 "You need to start by \"git bisect start\".\n"
@@ -11258,16 +11422,16 @@
 "Després cal donar-me almenys una revisió $good_syn i una $bad_syn.\n"
 "(Podeu usar \"git bisect $bad_syn\" i \"git bisect $good_syn\" per això.)"
 
-#: git-bisect.sh:391 git-bisect.sh:521
+#: git-bisect.sh:414 git-bisect.sh:546
 msgid "We are not bisecting."
 msgstr "No estem bisecant."
 
-#: git-bisect.sh:398
+#: git-bisect.sh:421
 #, sh-format
 msgid "'$invalid' is not a valid commit"
 msgstr "'$invalid' no és una comissió vàlida"
 
-#: git-bisect.sh:407
+#: git-bisect.sh:430
 #, sh-format
 msgid ""
 "Could not check out original HEAD '$branch'.\n"
@@ -11276,25 +11440,25 @@
 "No s'ha pogut agafar el HEAD original '$branch'.\n"
 "Proveu 'git bisect reset <comissió>'."
 
-#: git-bisect.sh:435
+#: git-bisect.sh:458
 msgid "No logfile given"
 msgstr "Cap fitxer de registre donat"
 
-#: git-bisect.sh:436
+#: git-bisect.sh:459
 #, sh-format
 msgid "cannot read $file for replaying"
 msgstr "no es pot llegir $file per a reproducció"
 
-#: git-bisect.sh:455
+#: git-bisect.sh:480
 msgid "?? what are you talking about?"
 msgstr "?? de què parleu?"
 
-#: git-bisect.sh:467
+#: git-bisect.sh:492
 #, sh-format
 msgid "running $command"
 msgstr "executant $command"
 
-#: git-bisect.sh:474
+#: git-bisect.sh:499
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -11303,11 +11467,11 @@
 "el pas de bisecció ha fallat:\n"
 "el codi de sortida $res de '$command' és < 0 o >= 128"
 
-#: git-bisect.sh:500
+#: git-bisect.sh:525
 msgid "bisect run cannot continue any more"
 msgstr "el pas de bisecció no pot continuar més"
 
-#: git-bisect.sh:506
+#: git-bisect.sh:531
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -11316,15 +11480,47 @@
 "el pas de bisecció ha fallat:\n"
 "'bisect_state $state' ha surt amb el codi d'error $res"
 
-#: git-bisect.sh:513
+#: git-bisect.sh:538
 msgid "bisect run success"
 msgstr "pas de bisecció reeixit"
 
-#: git-bisect.sh:548
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr "si us plau, useu dos termes distintes"
+
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr "'$term' no és un terme vàlid"
+
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr "no es pot usar l'ordre interna '$term' com a terme"
+
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr "no es pot canviar el significat del terme '$term'"
+
+#: git-bisect.sh:606
 #, sh-format
 msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
 msgstr "Ordre invàlida: actualment esteu en una bisecció $TERM_BAD/$TERM_GOOD"
 
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "cap terme definit"
+
+#: git-bisect.sh:653
+#, sh-format
+msgid ""
+"invalid argument $arg for 'git bisect terms'.\n"
+"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+msgstr ""
+"paràmetre invàlid $arg per a 'git bisect terms'.\n"
+"Les opcions admeses són: --term-good|--term-old i --term-bad|--term-new."
+
 #: git-rebase.sh:57
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
@@ -11364,24 +11560,24 @@
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "Sembla que git-am està en curs. No es pot rebasar."
 
-#: git-rebase.sh:351
+#: git-rebase.sh:354
 msgid "The --exec option must be used with the --interactive option"
 msgstr "L'opció --exec s'ha d'usar amb l'opció --interactive"
 
-#: git-rebase.sh:356
+#: git-rebase.sh:359
 msgid "No rebase in progress?"
 msgstr "No hi ha rebasament en curs?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:370
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "L'acció --edit-todo només es pot usar durant un rebasament interactiva."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:377
 msgid "Cannot read HEAD"
 msgstr "No es pot llegir HEAD"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:380
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -11389,12 +11585,12 @@
 "Heu d'editar tots els conflictes de fusió i després\n"
 "marcar-los com a resolts fent servir git add"
 
-#: git-rebase.sh:395
+#: git-rebase.sh:398
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "No s'ha pogut tornar a $head_name"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:417
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11415,65 +11611,65 @@
 "i executeu-me de nou. M'aturo per si encara hi teniu alguna cosa\n"
 "de valor."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:468
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "font no vàlida $upstream_name"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:492
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: ja hi ha més d'una base de fusió"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:495 git-rebase.sh:499
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: no hi ha cap base de fusió"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:504
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "No assenyala una comissió vàlida: $onto_name"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:527
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal: no hi ha tal branca: $branch_name"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:560
 msgid "Cannot autostash"
 msgstr "No es pot emmagatzemar automàticament"
 
-#: git-rebase.sh:562
+#: git-rebase.sh:565
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "S'ha creat un magatzem automàtic: $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:569
 msgid "Please commit or stash them."
 msgstr "Si us plau, cometeu-los o emmagatzemeu-los."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:589
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "La branca actual $branch_name està al dia."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:593
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "La branca actual $branch_name està al dia; rebasament forçada."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:604
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Canvis de $mb a $onto:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:613
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Primer, rebobinant el cap per a reproduir el vostre treball al damunt..."
 
-#: git-rebase.sh:620
+#: git-rebase.sh:623
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "S'ha avançat $branch_name ràpidament a $onto_name"
@@ -11546,115 +11742,99 @@
 msgid "Cannot remove worktree changes"
 msgstr "No es pot eliminar els canvis de l'arbre de treball"
 
-#: git-stash.sh:387
+#: git-stash.sh:405
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "opció desconeguda: $opt"
 
-#: git-stash.sh:397
+#: git-stash.sh:415
 msgid "No stash found."
 msgstr "Cap magatzem trobat."
 
-#: git-stash.sh:404
+#: git-stash.sh:422
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Massa revisions especificades: $REV"
 
-#: git-stash.sh:410
+#: git-stash.sh:428
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference no és una referència vàlida"
 
-#: git-stash.sh:438
+#: git-stash.sh:456
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' no és una comissió de tipus magatzem"
 
-#: git-stash.sh:449
+#: git-stash.sh:467
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' no és una referència de magatzem"
 
-#: git-stash.sh:457
+#: git-stash.sh:475
 msgid "unable to refresh index"
 msgstr "no s'ha pogut actualitzar l'índex"
 
-#: git-stash.sh:461
+#: git-stash.sh:479
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "No es pot aplicar un magatzem enmig d'una fusió"
 
-#: git-stash.sh:469
+#: git-stash.sh:487
 msgid "Conflicts in index. Try without --index."
 msgstr "Hi ha conflictes en l'índex. Proveu-ho sense --index."
 
-#: git-stash.sh:471
+#: git-stash.sh:489
 msgid "Could not save index tree"
 msgstr "No s'ha pogut desar l'arbre d'índex"
 
-#: git-stash.sh:505
+#: git-stash.sh:523
 msgid "Cannot unstage modified files"
 msgstr "No es pot desallistar fitxers modificats"
 
-#: git-stash.sh:520
+#: git-stash.sh:538
 msgid "Index was not unstashed."
 msgstr "L'índex no estava sense emmagatzemar."
 
-#: git-stash.sh:543
+#: git-stash.sh:561
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "${REV} ($s) descartada"
 
-#: git-stash.sh:544
+#: git-stash.sh:562
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: No s'ha pogut descartar l'entrada de magatzem"
 
-#: git-stash.sh:552
+#: git-stash.sh:570
 msgid "No branch name specified"
 msgstr "Cap nom de branca especificat"
 
-#: git-stash.sh:624
+#: git-stash.sh:642
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Per restaurar-les teclegeu \"git stash apply\")"
 
-#: git-submodule.sh:95
+#: git-submodule.sh:104
 #, sh-format
 msgid "cannot strip one component off url '$remoteurl'"
 msgstr "no es pot despullar un component de l'url '$remoteurl'"
 
-#: git-submodule.sh:237
-#, sh-format
-msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
-msgstr ""
-"No s'ha trobat cap mapatge de submòdul a .gitmodules per al camí '$sm_path'"
-
-#: git-submodule.sh:287
-#, sh-format
-msgid "Clone of '$url' into submodule path '$sm_path' failed"
-msgstr "El clonatge de '$url' al camí de submòdul '$sm_path' ha fallat"
-
-#: git-submodule.sh:296
-#, sh-format
-msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-msgstr "El directori de git '$a' és part del camí de submòdul '$b' o viceversa"
-
-#: git-submodule.sh:406
+#: git-submodule.sh:281
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 "El camí relatiu només es pot usar des del nivell superior de l'arbre de "
 "treball"
 
-#: git-submodule.sh:416
+#: git-submodule.sh:291
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "URL de dipòsit: '$repo' ha de ser absolut o començar amb ./|../"
 
-#: git-submodule.sh:433
+#: git-submodule.sh:308
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' ja existeix en l'índex"
 
-#: git-submodule.sh:437
+#: git-submodule.sh:312
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -11665,23 +11845,23 @@
 "$sm_path\n"
 "Useu -f si realment voleu afegir-lo."
 
-#: git-submodule.sh:455
+#: git-submodule.sh:330
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Afegint el dipòsit existent a '$sm_path' a l'índex"
 
-#: git-submodule.sh:457
+#: git-submodule.sh:332
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' ja existeix i no és un dipòsit de git vàlid"
 
-#: git-submodule.sh:465
+#: git-submodule.sh:340
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 "Es troba un directori de git per a '$sm_name' localment amb els remots:"
 
-#: git-submodule.sh:467
+#: git-submodule.sh:342
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
@@ -11689,7 +11869,7 @@
 "Si voleu tornar a usar aquest directori de git local en lloc de clonar de "
 "nou des de"
 
-#: git-submodule.sh:469
+#: git-submodule.sh:344
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
@@ -11697,7 +11877,7 @@
 "useu l'opció '--force'. Si el directori de git local no és el dipòsit "
 "correcte"
 
-#: git-submodule.sh:470
+#: git-submodule.sh:345
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -11705,78 +11885,78 @@
 msgstr ""
 "o esteu insegur de què vol dir això, trieu un altre nom amb l'opció '--name'."
 
-#: git-submodule.sh:472
+#: git-submodule.sh:347
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Reactivant el directori de git local per al submòdul '$sm_name'."
 
-#: git-submodule.sh:484
+#: git-submodule.sh:359
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "no s'ha pogut agafar el submòdul '$sm_path'"
 
-#: git-submodule.sh:489
+#: git-submodule.sh:364
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "S'ha fallat en afegir el submòdul '$sm_path'"
 
-#: git-submodule.sh:498
+#: git-submodule.sh:373
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "S'ha fallat en registrar el submòdul '$sm_path'"
 
-#: git-submodule.sh:542
+#: git-submodule.sh:417
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Entrant a '$prefix$displaypath'"
 
-#: git-submodule.sh:562
+#: git-submodule.sh:437
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr ""
 "Aturant a '$prefix$displaypath'; l'script ha retornat un estat no zero."
 
-#: git-submodule.sh:608
+#: git-submodule.sh:483
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr ""
 "No s'ha trobat cap url per al camí de submòdul '$displaypath' a .gitmodules"
 
-#: git-submodule.sh:617
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr "S'ha fallat en registrar l'url per al camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:619
+#: git-submodule.sh:494
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr "S'ha registrat el submòdul '$name' ($url) per al camí '$displaypath'"
 
-#: git-submodule.sh:636
+#: git-submodule.sh:511
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr ""
 "S'ha fallat en registrar el mode d'actualització per al camí de submòdul "
 "'$displaypath'"
 
-#: git-submodule.sh:674
+#: git-submodule.sh:549
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr "Useu '.' si realment voleu desinicialitzar tots els submòduls"
 
-#: git-submodule.sh:691
+#: git-submodule.sh:566
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr "L'arbre de treball de submòdul '$displaypath' conté un directori .git"
 
-#: git-submodule.sh:692
+#: git-submodule.sh:567
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
 "(useu 'rm -rf' si realment voleu eliminar-lo incloent tota la seva història)"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:573
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -11785,27 +11965,27 @@
 "L'arbre de treball de submòdul '$displaypath' conté modificacions locals; "
 "useu '-f' per a descartar-les"
 
-#: git-submodule.sh:701
+#: git-submodule.sh:576
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "S'ha netejat el directori '$displaypath'"
 
-#: git-submodule.sh:702
+#: git-submodule.sh:577
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "No s'ha pogut eliminar l'arbre de treball de submòdul '$displaypath'"
 
-#: git-submodule.sh:705
+#: git-submodule.sh:580
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "No s'ha pogut crear el directori de submòdul buit '$displaypath'"
 
-#: git-submodule.sh:714
+#: git-submodule.sh:589
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "Submòdul '$name' ($url) no registrat per al camí '$displaypath'"
 
-#: git-submodule.sh:830
+#: git-submodule.sh:705
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -11814,53 +11994,53 @@
 "Camí de submòdul '$displaypath' no inicialitzat\n"
 "Potser voleu usar 'update --init'?"
 
-#: git-submodule.sh:843
+#: git-submodule.sh:718
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr ""
 "No s'ha pogut trobar la revisió actual en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:852
+#: git-submodule.sh:727
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "No s'ha pogut obtenir en el camí de submòdul '$sm_path'"
 
-#: git-submodule.sh:876
+#: git-submodule.sh:751
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "No s'ha pogut obtenir en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:765
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "No s'ha pogut agafar '$sha1' en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:891
+#: git-submodule.sh:766
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Camí de submòdul '$displaypath': s'ha agafat '$sha1'"
 
-#: git-submodule.sh:895
+#: git-submodule.sh:770
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "no s'ha pogut rebasar '$sha1' en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:896
+#: git-submodule.sh:771
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Camí de submòdul '$displaypath': s'ha rebasat en '$sha1'"
 
-#: git-submodule.sh:901
+#: git-submodule.sh:776
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "No s'ha pogut fusionar '$sha1' en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:902
+#: git-submodule.sh:777
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Camí de submòdul '$displaypath': s'ha fusionat en '$sha1'"
 
-#: git-submodule.sh:907
+#: git-submodule.sh:782
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
@@ -11868,50 +12048,50 @@
 "L'execució de '$command $sha1' ha fallat en el camí de submòdul '$prefix"
 "$sm_path'"
 
-#: git-submodule.sh:908
+#: git-submodule.sh:783
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "Camí de submòdul '$prefix$sm_path': '$command $sha1'"
 
-#: git-submodule.sh:938
+#: git-submodule.sh:813
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "S'ha fallat en recursar al camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:1046
+#: git-submodule.sh:921
 msgid "The --cached option cannot be used with the --files option"
 msgstr "L'opció --cached no es pot usar amb l'opció --files"
 
-#: git-submodule.sh:1098
+#: git-submodule.sh:973
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "mode inesperat $mod_dst"
 
-#: git-submodule.sh:1118
+#: git-submodule.sh:993
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Avís: $display_name no conté la comissió $sha1_src"
 
-#: git-submodule.sh:1121
+#: git-submodule.sh:996
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Avís: $display_name no conté la comissió $sha1_dst"
 
-#: git-submodule.sh:1124
+#: git-submodule.sh:999
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr "  Avís: $display_name no conté les comissions $sha1_src i $sha1_dst"
 
-#: git-submodule.sh:1149
+#: git-submodule.sh:1024
 msgid "blob"
 msgstr "blob"
 
-#: git-submodule.sh:1267
+#: git-submodule.sh:1142
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "S'ha fallat en recursar al camí de submòdul '$sm_path'"
 
-#: git-submodule.sh:1331
+#: git-submodule.sh:1206
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Sincronitzant l'url de submòdul per a '$displaypath'"
diff --git a/po/de.po b/po/de.po
index c682aaf..8c5f05d 100644
--- a/po/de.po
+++ b/po/de.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2015-09-15 06:45+0800\n"
+"POT-Creation-Date: 2015-12-22 22:50+0800\n"
 "PO-Revision-Date: 2015-01-21 15:01+0800\n"
 "Last-Translator: Ralf Thielow <ralf.thielow@gmail.com>\n"
 "Language-Team: German <>\n"
@@ -31,13 +31,13 @@
 "dann 'git add/rm <Datei>', um die Auflösung entsprechend zu markieren\n"
 "und zu committen."
 
-#: advice.c:101 builtin/merge.c:1227
+#: advice.c:101 builtin/merge.c:1225
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert)."
 
 #: advice.c:103
-msgid "Please, commit your changes before you can merge."
-msgstr "Bitte committen Sie Ihre Änderungen, bevor Sie den Merge ausführen."
+msgid "Please, commit your changes before merging."
+msgstr "Bitte committen Sie Ihre Änderungen, bevor Sie mergen."
 
 #: advice.c:104
 msgid "Exiting because of unfinished merge."
@@ -62,76 +62,76 @@
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <Repository> [--exec <Programm>] --list"
 
-#: archive.c:343 builtin/add.c:137 builtin/add.c:426 builtin/rm.c:327
+#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein"
 
-#: archive.c:428
+#: archive.c:429
 msgid "fmt"
 msgstr "Format"
 
-#: archive.c:428
+#: archive.c:429
 msgid "archive format"
 msgstr "Archivformat"
 
-#: archive.c:429 builtin/log.c:1229
+#: archive.c:430 builtin/log.c:1229
 msgid "prefix"
 msgstr "Präfix"
 
-#: archive.c:430
+#: archive.c:431
 msgid "prepend prefix to each pathname in the archive"
 msgstr "einen Präfix vor jeden Pfadnamen in dem Archiv stellen"
 
-#: archive.c:431 builtin/archive.c:88 builtin/blame.c:2516
-#: builtin/blame.c:2517 builtin/config.c:58 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:712 builtin/hash-object.c:99
+#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535
+#: builtin/blame.c:2536 builtin/config.c:58 builtin/fast-export.c:987
+#: builtin/fast-export.c:989 builtin/grep.c:707 builtin/hash-object.c:99
 #: builtin/ls-files.c:446 builtin/ls-files.c:449 builtin/notes.c:395
 #: builtin/notes.c:558 builtin/read-tree.c:109 parse-options.h:153
 msgid "file"
 msgstr "Datei"
 
-#: archive.c:432 builtin/archive.c:89
+#: archive.c:433 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "das Archiv in diese Datei schreiben"
 
-#: archive.c:434
+#: archive.c:435
 msgid "read .gitattributes in working directory"
 msgstr ".gitattributes aus dem Arbeitsverzeichnis lesen"
 
-#: archive.c:435
+#: archive.c:436
 msgid "report archived files on stderr"
 msgstr "archivierte Dateien in der Standard-Fehlerausgabe ausgeben"
 
-#: archive.c:436
+#: archive.c:437
 msgid "store only"
 msgstr "nur speichern"
 
-#: archive.c:437
+#: archive.c:438
 msgid "compress faster"
 msgstr "schneller komprimieren"
 
-#: archive.c:445
+#: archive.c:446
 msgid "compress better"
 msgstr "besser komprimieren"
 
-#: archive.c:448
+#: archive.c:449
 msgid "list supported archive formats"
 msgstr "unterstützte Archivformate auflisten"
 
-#: archive.c:450 builtin/archive.c:90 builtin/clone.c:77
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77
 msgid "repo"
 msgstr "Repository"
 
-#: archive.c:451 builtin/archive.c:91
+#: archive.c:452 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "Archiv vom Remote-Repository <Repository> abrufen"
 
-#: archive.c:452 builtin/archive.c:92 builtin/notes.c:479
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479
 msgid "command"
 msgstr "Programm"
 
-#: archive.c:453 builtin/archive.c:93
+#: archive.c:454 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "Pfad zum externen \"git-upload-archive\"-Programm"
 
@@ -143,87 +143,87 @@
 "Verneinende Muster werden in Git-Attributen ignoriert.\n"
 "Benutzen Sie '\\!' für führende Ausrufezeichen."
 
-#: branch.c:60
+#: branch.c:61
 #, c-format
 msgid "Not setting branch %s as its own upstream."
 msgstr "Branch %s kann nicht sein eigener Upstream-Branch sein."
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
 "Branch %s konfiguriert zum Folgen von Remote-Branch %s von %s durch Rebase."
 
-#: branch.c:84
+#: branch.c:85
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr "Branch %s konfiguriert zum Folgen von Remote-Branch %s von %s."
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s durch Rebase."
 
-#: branch.c:89
+#: branch.c:90
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s."
 
-#: branch.c:94
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s durch Rebase."
 
-#: branch.c:95
+#: branch.c:96
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s."
 
-#: branch.c:99
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
 "Branch %s konfiguriert zum Folgen von lokaler Referenz %s durch Rebase."
 
-#: branch.c:100
+#: branch.c:101
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "Branch %s konfiguriert zum Folgen von lokaler Referenz %s."
 
-#: branch.c:133
+#: branch.c:134
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr ""
 "Konfiguration zum Folgen von Branch nicht eingerichtet. Referenz %s ist "
 "mehrdeutig."
 
-#: branch.c:162
+#: branch.c:163
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "'%s' ist kein gültiger Branchname."
 
-#: branch.c:167
+#: branch.c:168
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Branch '%s' existiert bereits."
 
-#: branch.c:175
+#: branch.c:176
 msgid "Cannot force update the current branch."
 msgstr "Kann Aktualisierung des aktuellen Branches nicht erzwingen."
 
-#: branch.c:195
+#: branch.c:196
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr ""
 "Kann Tracking-Informationen nicht einrichten; Startpunkt '%s' ist kein "
 "Branch."
 
-#: branch.c:197
+#: branch.c:198
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "der angeforderte Upstream-Branch '%s' existiert nicht"
 
-#: branch.c:199
+#: branch.c:200
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -244,22 +244,22 @@
 "\"git push -u\" verwenden, um den Upstream-Branch beim \"push\"\n"
 "zu konfigurieren."
 
-#: branch.c:243
+#: branch.c:244
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Ungültiger Objekt-Name: '%s'"
 
-#: branch.c:263
+#: branch.c:264
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "mehrdeutiger Objekt-Name: '%s'"
 
-#: branch.c:268
+#: branch.c:269
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Ungültiger Branchpunkt: '%s'"
 
-#: branch.c:399
+#: branch.c:322
 #, c-format
 msgid "'%s' is already checked out at '%s'"
 msgstr "'%s' ist bereits in '%s' ausgecheckt"
@@ -274,7 +274,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr "nicht erkannter Kopfbereich: %s%s (%d)"
 
-#: bundle.c:87 builtin/commit.c:765
+#: bundle.c:87 builtin/commit.c:766
 #, c-format
 msgid "could not open '%s'"
 msgstr "Konnte '%s' nicht öffnen"
@@ -283,9 +283,9 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Dem Repository fehlen folgende vorausgesetzte Commits:"
 
-#: bundle.c:163 sequencer.c:636 sequencer.c:1083 builtin/blame.c:2708
-#: builtin/branch.c:652 builtin/commit.c:1044 builtin/log.c:334
-#: builtin/log.c:850 builtin/log.c:1457 builtin/log.c:1690 builtin/merge.c:358
+#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083
+#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334
+#: builtin/log.c:849 builtin/log.c:1461 builtin/log.c:1694 builtin/merge.c:358
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "Einrichtung des Revisionsgangs fehlgeschlagen"
@@ -325,7 +325,7 @@
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1367 builtin/shortlog.c:261
+#: bundle.c:443 builtin/log.c:157 builtin/log.c:1369 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "nicht erkanntes Argument: %s"
@@ -343,13 +343,13 @@
 msgid "index-pack died"
 msgstr "Erstellung der Paketindexdatei abgebrochen"
 
-#: color.c:260
+#: color.c:275
 #, c-format
 msgid "invalid color value: %.*s"
 msgstr "Ungültiger Farbwert: %.*s"
 
-#: commit.c:40 builtin/am.c:451 builtin/am.c:487 builtin/am.c:1516
-#: builtin/am.c:2128
+#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520
+#: builtin/am.c:2149
 #, c-format
 msgid "could not parse %s"
 msgstr "konnte %s nicht parsen"
@@ -511,23 +511,23 @@
 msgid "Performing inexact rename detection"
 msgstr "Führe Erkennung für ungenaue Umbenennung aus"
 
-#: diff.c:116
+#: diff.c:115
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
 "  Fehler beim Parsen des abgeschnittenen \"dirstat\" Prozentsatzes '%s'\n"
 
-#: diff.c:121
+#: diff.c:120
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Unbekannter \"dirstat\" Parameter '%s'\n"
 
-#: diff.c:216
+#: diff.c:215
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Unbekannter Wert in Konfigurationsvariable 'diff.dirstat': '%s'"
 
-#: diff.c:268
+#: diff.c:267
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -536,16 +536,16 @@
 "Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n"
 "%s"
 
-#: diff.c:2998
+#: diff.c:3000
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "externes Diff-Programm unerwartet beendet, angehalten bei %s"
 
-#: diff.c:3394
+#: diff.c:3396
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow erfordert genau eine Pfadspezifikation"
 
-#: diff.c:3557
+#: diff.c:3559
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -554,16 +554,16 @@
 "Fehler beim Parsen des --dirstat/-X Optionsparameters:\n"
 "%s"
 
-#: diff.c:3571
+#: diff.c:3573
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Fehler beim Parsen des --submodule Optionsparameters: '%s'"
 
-#: dir.c:1853
+#: dir.c:1915
 msgid "failed to get kernel name and information"
 msgstr "Fehler beim Sammeln von Namen und Informationen zum Kernel"
 
-#: dir.c:1936
+#: dir.c:1998
 msgid "Untracked cache is disabled on this system."
 msgstr "Cache für unversionierte Dateien ist auf diesem System deaktiviert."
 
@@ -592,7 +592,7 @@
 #: grep.c:1718
 #, c-format
 msgid "'%s': unable to read %s"
-msgstr "'%s': konnte nicht lesen %s"
+msgstr "'%s': konnte %s nicht lesen"
 
 #: grep.c:1735
 #, c-format
@@ -672,8 +672,8 @@
 msgid "failed to read the cache"
 msgstr "Lesen des Zwischenspeichers fehlgeschlagen"
 
-#: merge.c:94 builtin/am.c:2001 builtin/am.c:2036 builtin/checkout.c:375
-#: builtin/checkout.c:586 builtin/clone.c:715
+#: merge.c:94 builtin/am.c:2022 builtin/am.c:2057 builtin/checkout.c:376
+#: builtin/checkout.c:587 builtin/clone.c:722
 msgid "unable to write new index file"
 msgstr "Konnte neue Index-Datei nicht schreiben."
 
@@ -691,64 +691,64 @@
 msgid "error building trees"
 msgstr "Fehler beim Erstellen der \"Tree\"-Objekte"
 
-#: merge-recursive.c:687
+#: merge-recursive.c:686
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "Fehler beim Erstellen des Pfades '%s'%s"
 
-#: merge-recursive.c:698
+#: merge-recursive.c:697
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Entferne %s, um Platz für Unterverzeichnis zu schaffen\n"
 
-#: merge-recursive.c:712 merge-recursive.c:733
+#: merge-recursive.c:711 merge-recursive.c:732
 msgid ": perhaps a D/F conflict?"
 msgstr ": vielleicht ein Verzeichnis/Datei-Konflikt?"
 
-#: merge-recursive.c:723
+#: merge-recursive.c:722
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "verweigere, da unversionierte Dateien in '%s' verloren gehen würden"
 
-#: merge-recursive.c:763
+#: merge-recursive.c:762
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "kann Objekt %s '%s' nicht lesen"
 
-#: merge-recursive.c:765
+#: merge-recursive.c:764
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "Blob erwartet für %s '%s'"
 
-#: merge-recursive.c:788 builtin/clone.c:364
+#: merge-recursive.c:787 builtin/clone.c:369
 #, c-format
 msgid "failed to open '%s'"
 msgstr "Fehler beim Öffnen von '%s'"
 
-#: merge-recursive.c:796
+#: merge-recursive.c:795
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "Fehler beim Erstellen einer symbolischen Verknüpfung für '%s'"
 
-#: merge-recursive.c:799
+#: merge-recursive.c:798
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "weiß nicht was mit %06o %s '%s' zu machen ist"
 
-#: merge-recursive.c:937
+#: merge-recursive.c:936
 msgid "Failed to execute internal merge"
 msgstr "Fehler bei Ausführung des internen Merges"
 
-#: merge-recursive.c:941
+#: merge-recursive.c:940
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Konnte %s nicht zur Datenbank hinzufügen"
 
-#: merge-recursive.c:957
+#: merge-recursive.c:956
 msgid "unsupported object type in the tree"
 msgstr "nicht unterstützter Objekttyp im Verzeichnis"
 
-#: merge-recursive.c:1032 merge-recursive.c:1046
+#: merge-recursive.c:1031 merge-recursive.c:1045
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -757,7 +757,7 @@
 "KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
 "im Arbeitsbereich gelassen."
 
-#: merge-recursive.c:1038 merge-recursive.c:1051
+#: merge-recursive.c:1037 merge-recursive.c:1050
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -766,20 +766,20 @@
 "KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
 "im Arbeitsbereich bei %s gelassen."
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "rename"
 msgstr "umbenennen"
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "renamed"
 msgstr "umbenannt"
 
-#: merge-recursive.c:1148
+#: merge-recursive.c:1147
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s ist ein Verzeichnis in %s, füge es stattdessen als %s hinzu"
 
-#: merge-recursive.c:1170
+#: merge-recursive.c:1169
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -788,148 +788,148 @@
 "KONFLIKT (umbenennen/umbenennen): Benenne um \"%s\"->\"%s\" in Branch \"%s\" "
 "und \"%s\"->\"%s\" in Branch \"%s\"%s"
 
-#: merge-recursive.c:1175
+#: merge-recursive.c:1174
 msgid " (left unresolved)"
 msgstr " (bleibt unaufgelöst)"
 
-#: merge-recursive.c:1229
+#: merge-recursive.c:1228
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 "KONFLIKT (umbenennen/umbenennen): Benenne um %s->%s in %s. Benenne um %s->%s "
 "in %s"
 
-#: merge-recursive.c:1259
+#: merge-recursive.c:1258
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Benenne stattdessen %s nach %s und %s nach %s um"
 
-#: merge-recursive.c:1458
+#: merge-recursive.c:1457
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 "KONFLIKT (umbenennen/hinzufügen): Benenne um %s->%s in %s. %s hinzugefügt in "
 "%s"
 
-#: merge-recursive.c:1468
+#: merge-recursive.c:1467
 #, c-format
 msgid "Adding merged %s"
 msgstr "Füge zusammengeführte Datei %s hinzu"
 
-#: merge-recursive.c:1473 merge-recursive.c:1671
+#: merge-recursive.c:1472 merge-recursive.c:1674
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Füge stattdessen als %s hinzu"
 
-#: merge-recursive.c:1524
+#: merge-recursive.c:1523
 #, c-format
 msgid "cannot read object %s"
 msgstr "kann Objekt %s nicht lesen"
 
-#: merge-recursive.c:1527
+#: merge-recursive.c:1526
 #, c-format
 msgid "object %s is not a blob"
 msgstr "Objekt %s ist kein Blob"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modify"
 msgstr "ändern"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modified"
 msgstr "geändert"
 
-#: merge-recursive.c:1585
+#: merge-recursive.c:1588
 msgid "content"
 msgstr "Inhalt"
 
-#: merge-recursive.c:1592
+#: merge-recursive.c:1595
 msgid "add/add"
 msgstr "hinzufügen/hinzufügen"
 
-#: merge-recursive.c:1626
+#: merge-recursive.c:1629
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "%s ausgelassen (Ergebnis des Merges existiert bereits)"
 
-#: merge-recursive.c:1640
+#: merge-recursive.c:1643
 #, c-format
 msgid "Auto-merging %s"
 msgstr "automatischer Merge von %s"
 
-#: merge-recursive.c:1644 git-submodule.sh:1150
+#: merge-recursive.c:1647 git-submodule.sh:1025
 msgid "submodule"
 msgstr "Submodul"
 
-#: merge-recursive.c:1645
+#: merge-recursive.c:1648
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "KONFLIKT (%s): Merge-Konflikt in %s"
 
-#: merge-recursive.c:1731
+#: merge-recursive.c:1734
 #, c-format
 msgid "Removing %s"
 msgstr "Entferne %s"
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1759
 msgid "file/directory"
 msgstr "Datei/Verzeichnis"
 
-#: merge-recursive.c:1762
+#: merge-recursive.c:1765
 msgid "directory/file"
 msgstr "Verzeichnis/Datei"
 
-#: merge-recursive.c:1767
+#: merge-recursive.c:1770
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 "KONFLIKT (%s): Es existiert bereits ein Verzeichnis %s in %s. Füge %s als %s "
 "hinzu."
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1780
 #, c-format
 msgid "Adding %s"
 msgstr "Füge %s hinzu"
 
-#: merge-recursive.c:1794
+#: merge-recursive.c:1797
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Fataler Merge-Fehler. Sollte nicht passieren."
 
-#: merge-recursive.c:1813
+#: merge-recursive.c:1816
 msgid "Already up-to-date!"
 msgstr "Bereits aktuell!"
 
-#: merge-recursive.c:1822
+#: merge-recursive.c:1825
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "Zusammenführen der \"Tree\"-Objekte %s und %s fehlgeschlagen"
 
-#: merge-recursive.c:1852
+#: merge-recursive.c:1855
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "unverarbeiteter Pfad??? %s"
 
-#: merge-recursive.c:1900
+#: merge-recursive.c:1903
 msgid "Merging:"
 msgstr "Merge:"
 
-#: merge-recursive.c:1913
+#: merge-recursive.c:1916
 #, 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:1950
+#: merge-recursive.c:1953
 msgid "merge returned no commit"
 msgstr "Merge hat keinen Commit zurückgegeben"
 
-#: merge-recursive.c:2007
+#: merge-recursive.c:2010
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: merge-recursive.c:2018 builtin/merge.c:645
+#: merge-recursive.c:2021 builtin/merge.c:645
 msgid "Unable to write index."
 msgstr "Konnte Index nicht schreiben."
 
@@ -961,31 +961,41 @@
 msgid "unable to parse object: %s"
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: parse-options.c:563
+#: parse-options.c:570
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:581
+#: parse-options.c:588
 #, c-format
 msgid "usage: %s"
 msgstr "Verwendung: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:585
+#: parse-options.c:592
 #, c-format
 msgid "   or: %s"
 msgstr "      oder: %s"
 
-#: parse-options.c:588
+#: parse-options.c:595
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:622
+#: parse-options.c:629
 msgid "-NUM"
 msgstr "-NUM"
 
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "fehlerhafter Objekt-Name '%s'"
+
+#: path.c:752
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "Konnte Gruppenschreibrecht für %s nicht setzen."
+
 #: pathspec.c:133
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
@@ -1057,11 +1067,11 @@
 msgid "unable to parse --pretty format"
 msgstr "Konnte --pretty Format nicht parsen."
 
-#: progress.c:236
+#: progress.c:235
 msgid "done"
 msgstr "Fertig"
 
-#: read-cache.c:1296
+#: read-cache.c:1281
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -1070,7 +1080,7 @@
 "index.version gesetzt, aber Wert ungültig.\n"
 "Verwende Version %i"
 
-#: read-cache.c:1306
+#: read-cache.c:1291
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1079,121 +1089,166 @@
 "GIT_INDEX_VERSION gesetzt, aber Wert ungültig.\n"
 "Verwende Version %i"
 
-#: refs.c:2941 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
+#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
 #: builtin/merge.c:983
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: refs.c:3001
+#: refs/files-backend.c:2359
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "Konnte Referenz %s nicht entfernen: %s"
 
-#: refs.c:3004
+#: refs/files-backend.c:2362
 #, c-format
 msgid "could not delete references: %s"
 msgstr "Konnte Referenzen nicht entfernen: %s"
 
-#: refs.c:3013
+#: refs/files-backend.c:2371
 #, c-format
 msgid "could not remove reference %s"
 msgstr "Konnte Referenz %s nicht löschen"
 
-#: ref-filter.c:660
+#: ref-filter.c:245
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "Format: %%(end) Atom ohne zugehöriges Atom verwendet"
+
+#: ref-filter.c:704
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "Positiver Wert erwartet contents:lines=%s"
+
+#: ref-filter.c:833
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "Erwartetes Format: %%(color:<Farbe>)"
+
+#: ref-filter.c:835
 msgid "unable to parse format"
 msgstr "Konnte Format nicht parsen."
 
-#: remote.c:792
+#: ref-filter.c:870
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "Erwartetes Format: %%(align:<Breite>,<Position>)"
+
+#: ref-filter.c:893
+#, c-format
+msgid "improper format entered align:%s"
+msgstr "Sie haben ein ungültiges Format eingegeben align:%s"
+
+#: ref-filter.c:898
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "Positive Breitenangabe für %%(align) erwartet"
+
+#: ref-filter.c:1219
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "fehlerhaftes Objekt bei '%s'"
+
+#: ref-filter.c:1561
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "Format: %%(end) Atom fehlt"
+
+#: ref-filter.c:1615
+#, c-format
+msgid "malformed object name %s"
+msgstr "Missgebildeter Objektname %s"
+
+#: remote.c:756
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "Kann 'fetch' nicht für sowohl %s als auch %s nach %s ausführen."
 
-#: remote.c:796
+#: remote.c:760
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s folgt üblicherweise %s, nicht %s"
 
-#: remote.c:800
+#: remote.c:764
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s folgt sowohl %s als auch %s"
 
-#: remote.c:808
+#: remote.c:772
 msgid "Internal error"
 msgstr "Interner Fehler"
 
-#: remote.c:1723 remote.c:1766
+#: remote.c:1687 remote.c:1730
 msgid "HEAD does not point to a branch"
 msgstr "HEAD zeigt auf keinen Branch"
 
-#: remote.c:1732
+#: remote.c:1696
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "Kein solcher Branch: '%s'"
 
-#: remote.c:1735
+#: remote.c:1699
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "Kein Upstream-Branch für Branch '%s' konfiguriert."
 
-#: remote.c:1741
+#: remote.c:1705
 #, 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:1756
+#: remote.c:1720
 #, 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:1771
+#: remote.c:1735
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "Branch '%s' hat keinen Upstream-Branch gesetzt"
 
-#: remote.c:1782
+#: remote.c:1746
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "Push-Refspecs für '%s' beinhalten nicht '%s'"
 
-#: remote.c:1795
+#: remote.c:1759
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "kein Ziel für \"push\" (push.default ist 'nothing')"
 
-#: remote.c:1817
+#: remote.c:1781
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "kann einzelnes Ziel für \"push\" im Modus 'simple' nicht auflösen"
 
-#: remote.c:2124
+#: remote.c:2083
 #, 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:2128
+#: remote.c:2087
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (benutzen Sie \"git branch --unset-upstream\" zum Beheben)\n"
 
-#: remote.c:2131
+#: remote.c:2090
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "Ihr Branch ist auf dem selben Stand wie '%s'.\n"
 
-#: remote.c:2135
+#: remote.c:2094
 #, c-format
 msgid "Your branch is ahead of '%s' by %d commit.\n"
 msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
 msgstr[0] "Ihr Branch ist vor '%s' um %d Commit.\n"
 msgstr[1] "Ihr Branch ist vor '%s' um %d Commits.\n"
 
-#: remote.c:2141
+#: remote.c:2100
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (benutzen Sie \"git push\", um lokale Commits zu publizieren)\n"
 
-#: remote.c:2144
+#: remote.c:2103
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1203,12 +1258,12 @@
 msgstr[1] ""
 "Ihr Branch ist zu '%s' um %d Commits hinterher, und kann vorgespult werden.\n"
 
-#: remote.c:2152
+#: remote.c:2111
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr ""
 "  (benutzen Sie \"git pull\", um Ihren lokalen Branch zu aktualisieren)\n"
 
-#: remote.c:2155
+#: remote.c:2114
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1223,30 +1278,30 @@
 "Ihr Branch und '%s' sind divergiert,\n"
 "und haben jeweils %d und %d unterschiedliche Commits.\n"
 
-#: remote.c:2165
+#: remote.c:2124
 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"
 
-#: revision.c:2198
+#: revision.c:2193
 msgid "your current branch appears to be broken"
 msgstr "Ihr aktueller Branch scheint fehlerhaft zu sein."
 
-#: revision.c:2201
+#: revision.c:2196
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "Ihr aktueller Branch '%s' hat noch keine Commits."
 
-#: revision.c:2395
+#: revision.c:2390
 msgid "--first-parent is incompatible with --bisect"
 msgstr "Die Optionen --first-parent und --bisect sind inkompatibel."
 
-#: run-command.c:83
+#: run-command.c:90
 msgid "open /dev/null failed"
 msgstr "Öffnen von /dev/null fehlgeschlagen"
 
-#: run-command.c:85
+#: run-command.c:92
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) fehlgeschlagen"
@@ -1467,7 +1522,7 @@
 msgid "cannot abort from a branch yet to be born"
 msgstr "kann nicht abbrechen: bin auf einem Branch, der noch geboren wird"
 
-#: sequencer.c:887 builtin/apply.c:4291
+#: sequencer.c:887 builtin/apply.c:4287
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "Kann %s nicht öffnen: %s"
@@ -1509,12 +1564,12 @@
 msgid "Can't cherry-pick into empty head"
 msgstr "Kann nicht als allerersten Commit einen Cherry-Pick ausführen."
 
-#: setup.c:243
+#: setup.c:248
 #, c-format
 msgid "failed to read %s"
 msgstr "Fehler beim Lesen von %s"
 
-#: sha1_name.c:453
+#: sha1_name.c:463
 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"
@@ -1564,7 +1619,7 @@
 msgid "staging updated .gitmodules failed"
 msgstr "Konnte aktualisierte .gitmodules-Datei nicht zum Commit vormerken"
 
-#: submodule.c:1045
+#: submodule.c:1040
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Konnte core.worktree in '%s' nicht setzen."
@@ -1575,7 +1630,7 @@
 msgid "unknown value '%s' for key '%s'"
 msgstr "unbekannter Wert '%s' für Schlüssel %s"
 
-#: trailer.c:543 trailer.c:548 builtin/remote.c:290
+#: trailer.c:543 trailer.c:548 builtin/remote.c:296
 #, c-format
 msgid "more than one %s"
 msgstr "mehr als ein %s"
@@ -1642,8 +1697,8 @@
 msgid "could not open '%s' for writing"
 msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: wrapper.c:223 wrapper.c:366 builtin/am.c:337 builtin/commit.c:1688
-#: builtin/merge.c:1076 builtin/pull.c:380
+#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691
+#: builtin/merge.c:1074 builtin/pull.c:380
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "Konnte '%s' nicht zum Lesen öffnen."
@@ -1658,30 +1713,21 @@
 msgid "unable to access '%s'"
 msgstr "konnte nicht auf '%s' zugreifen"
 
-#: wrapper.c:611
-#, c-format
-msgid "unable to look up current user in the passwd file: %s"
-msgstr "konnte aktuellen Benutzer nicht in Passwort-Datei finden: %s"
-
-#: wrapper.c:612
-msgid "no such user"
-msgstr "kein solcher Benutzer"
-
-#: wrapper.c:620
+#: wrapper.c:608
 msgid "unable to get current working directory"
 msgstr "Konnte aktuelles Arbeitsverzeichnis nicht bekommen."
 
-#: wrapper.c:631
+#: wrapper.c:635
 #, c-format
 msgid "could not open %s for writing"
 msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: wrapper.c:642 builtin/am.c:424
+#: wrapper.c:646 builtin/am.c:425
 #, c-format
 msgid "could not write to %s"
 msgstr "Konnte nicht nach '%s' schreiben."
 
-#: wrapper.c:648
+#: wrapper.c:652
 #, c-format
 msgid "could not close %s"
 msgstr "Konnte '%s' nicht schließen."
@@ -2055,27 +2101,27 @@
 "  (benutzen Sie \"git bisect reset\", um zum ursprünglichen Branch "
 "zurückzukehren)"
 
-#: wt-status.c:1437
+#: wt-status.c:1438
 msgid "On branch "
 msgstr "Auf Branch "
 
-#: wt-status.c:1445
+#: wt-status.c:1444
 msgid "interactive rebase in progress; onto "
 msgstr "interaktives Rebase im Gange; auf "
 
-#: wt-status.c:1447
+#: wt-status.c:1446
 msgid "rebase in progress; onto "
 msgstr "Rebase im Gange; auf "
 
-#: wt-status.c:1452
+#: wt-status.c:1451
 msgid "HEAD detached at "
 msgstr "HEAD losgelöst bei "
 
-#: wt-status.c:1454
+#: wt-status.c:1453
 msgid "HEAD detached from "
 msgstr "HEAD losgelöst von "
 
-#: wt-status.c:1457
+#: wt-status.c:1456
 msgid "Not currently on any branch."
 msgstr "Im Moment auf keinem Branch."
 
@@ -2165,23 +2211,23 @@
 msgid "nothing to commit, working directory clean\n"
 msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n"
 
-#: wt-status.c:1644
-msgid "HEAD (no branch)"
-msgstr "HEAD (kein Branch)"
-
-#: wt-status.c:1650
+#: wt-status.c:1642
 msgid "Initial commit on "
 msgstr "Initialer Commit auf "
 
-#: wt-status.c:1677
+#: wt-status.c:1646
+msgid "HEAD (no branch)"
+msgstr "HEAD (kein Branch)"
+
+#: wt-status.c:1675
 msgid "gone"
 msgstr "entfernt"
 
-#: wt-status.c:1679 wt-status.c:1687
+#: wt-status.c:1677 wt-status.c:1685
 msgid "behind "
 msgstr "hinterher "
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:403
+#: compat/precompose_utf8.c:56 builtin/clone.c:408
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "Konnte '%s' nicht entfernen."
@@ -2195,7 +2241,7 @@
 msgid "unexpected diff status %c"
 msgstr "unerwarteter Differenz-Status %c"
 
-#: builtin/add.c:70 builtin/commit.c:277
+#: builtin/add.c:70 builtin/commit.c:278
 msgid "updating files failed"
 msgstr "Aktualisierung der Dateien fehlgeschlagen"
 
@@ -2209,7 +2255,7 @@
 msgstr ""
 "Nicht zum Commit vorgemerkte Änderungen nach Aktualisierung der Staging-Area:"
 
-#: builtin/add.c:194 builtin/rev-parse.c:799
+#: builtin/add.c:194 builtin/rev-parse.c:796
 msgid "Could not read the index"
 msgstr "Konnte den Index nicht lesen"
 
@@ -2246,15 +2292,15 @@
 "Die folgenden Pfade werden durch eine Ihrer \".gitignore\" Dateien "
 "ignoriert:\n"
 
-#: builtin/add.c:249 builtin/clean.c:896 builtin/fetch.c:108 builtin/mv.c:110
-#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:545
-#: builtin/remote.c:1339 builtin/rm.c:268 builtin/send-pack.c:162
+#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:543
+#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162
 msgid "dry run"
 msgstr "Probelauf"
 
-#: builtin/add.c:250 builtin/apply.c:4580 builtin/check-ignore.c:19
-#: builtin/commit.c:1321 builtin/count-objects.c:63 builtin/fsck.c:636
-#: builtin/log.c:1641 builtin/mv.c:109 builtin/read-tree.c:114
+#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19
+#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
+#: builtin/log.c:1645 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr "erweiterte Ausgaben"
 
@@ -2262,7 +2308,7 @@
 msgid "interactive picking"
 msgstr "interaktives Auswählen"
 
-#: builtin/add.c:253 builtin/checkout.c:1152 builtin/reset.c:286
+#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "Blöcke interaktiv auswählen"
 
@@ -2323,154 +2369,154 @@
 msgstr ""
 "Die Option --ignore-missing kann nur zusammen mit --dry-run verwendet werden."
 
-#: builtin/add.c:358
+#: builtin/add.c:352
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Nichts spezifiziert, nichts hinzugefügt.\n"
 
-#: builtin/add.c:359
+#: builtin/add.c:353
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Meinten Sie vielleicht 'git add .'?\n"
 
-#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:940
-#: builtin/commit.c:336 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938
+#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:40
 msgid "index file corrupt"
 msgstr "Index-Datei beschädigt"
 
-#: builtin/add.c:445 builtin/apply.c:4678 builtin/mv.c:279 builtin/rm.c:430
+#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430
 msgid "Unable to write new index file"
 msgstr "Konnte neue Index-Datei nicht schreiben."
 
-#: builtin/am.c:41
+#: builtin/am.c:42
 #, c-format
 msgid "could not stat %s"
 msgstr "Konnte '%s' nicht lesen"
 
-#: builtin/am.c:270 builtin/am.c:1345 builtin/commit.c:737
-#: builtin/merge.c:1079
+#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077
 #, c-format
 msgid "could not read '%s'"
 msgstr "Konnte '%s' nicht lesen"
 
-#: builtin/am.c:444
+#: builtin/am.c:445
 msgid "could not parse author script"
 msgstr "konnte Autor-Skript nicht parsen"
 
-#: builtin/am.c:521
+#: builtin/am.c:522
 #, c-format
 msgid "'%s' was deleted by the applypatch-msg hook"
 msgstr "'%s' wurde durch den applypatch-msg Hook entfernt"
 
-#: builtin/am.c:562 builtin/notes.c:300
+#: builtin/am.c:563 builtin/notes.c:300
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Fehlerhafte Eingabezeile: '%s'."
 
-#: builtin/am.c:599 builtin/notes.c:315
+#: builtin/am.c:600 builtin/notes.c:315
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'"
 
-#: builtin/am.c:625
+#: builtin/am.c:626
 msgid "fseek failed"
 msgstr "\"fseek\" fehlgeschlagen"
 
-#: builtin/am.c:786 builtin/am.c:874
+#: builtin/am.c:787 builtin/am.c:875
 #, c-format
 msgid "could not open '%s' for reading: %s"
 msgstr "Konnte '%s' nicht zum Lesen öffnen: %s"
 
-#: builtin/am.c:793
+#: builtin/am.c:794
 #, c-format
 msgid "could not open '%s' for writing: %s"
 msgstr "Konnte '%s' nicht zum Schreiben öffnen: %s"
 
-#: builtin/am.c:802
+#: builtin/am.c:803
 #, c-format
 msgid "could not parse patch '%s'"
 msgstr "konnte Patch '%s' nicht parsen"
 
-#: builtin/am.c:867
+#: builtin/am.c:868
 msgid "Only one StGIT patch series can be applied at once"
 msgstr "Es kann nur eine StGIT Patch-Serie auf einmal angewendet werden."
 
-#: builtin/am.c:915
+#: builtin/am.c:916
 msgid "invalid timestamp"
 msgstr "ungültiger Zeitstempel"
 
-#: builtin/am.c:918 builtin/am.c:926
+#: builtin/am.c:919 builtin/am.c:927
 msgid "invalid Date line"
 msgstr "Ungültige \"Date\"-Zeile"
 
-#: builtin/am.c:923
+#: builtin/am.c:924
 msgid "invalid timezone offset"
 msgstr "Ungültiger Offset in der Zeitzone"
 
-#: builtin/am.c:1010
+#: builtin/am.c:1011
 msgid "Patch format detection failed."
 msgstr "Patch-Formaterkennung fehlgeschlagen."
 
-#: builtin/am.c:1015 builtin/clone.c:368
+#: builtin/am.c:1016 builtin/clone.c:373
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "Fehler beim Erstellen von Verzeichnis '%s'"
 
-#: builtin/am.c:1019
+#: builtin/am.c:1020
 msgid "Failed to split patches."
 msgstr "Fehler beim Aufteilen der Patches."
 
-#: builtin/am.c:1151 builtin/commit.c:362
+#: builtin/am.c:1152 builtin/commit.c:363
 msgid "unable to write index file"
 msgstr "Konnte Index-Datei nicht schreiben."
 
-#: builtin/am.c:1202
+#: builtin/am.c:1203
 #, c-format
 msgid "When you have resolved this problem, run \"%s --continue\"."
 msgstr ""
 "Wenn Sie das Problem aufgelöst haben, führen Sie \"%s --continue\" aus."
 
-#: builtin/am.c:1203
+#: builtin/am.c:1204
 #, c-format
 msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
 msgstr ""
 "Falls Sie diesen Patch auslassen möchten, führen Sie stattdessen \"%s --skip"
 "\" aus."
 
-#: builtin/am.c:1204
+#: builtin/am.c:1205
 #, c-format
 msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr ""
 "Um den ursprünglichen Branch wiederherzustellen und die Anwendung der "
 "Patches abzubrechen, führen Sie \"%s --abort\" aus."
 
-#: builtin/am.c:1339
+#: builtin/am.c:1343
 msgid "Patch is empty. Was it split wrong?"
 msgstr "Patch ist leer. War dessen Aufteilung falsch?"
 
-#: builtin/am.c:1413 builtin/log.c:1345
+#: builtin/am.c:1417 builtin/log.c:1347
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "Ungültige Identifikationszeile: %s"
 
-#: builtin/am.c:1440
+#: builtin/am.c:1444
 #, c-format
 msgid "unable to parse commit %s"
 msgstr "Konnte Commit '%s' nicht parsen."
 
-#: builtin/am.c:1614
+#: builtin/am.c:1646
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 "Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge "
 "zurückzufallen."
 
-#: builtin/am.c:1616
+#: builtin/am.c:1648
 msgid "Using index info to reconstruct a base tree..."
 msgstr ""
 "Verwende Informationen aus der Staging-Area, um ein Basisverzeichnis "
 "nachzustellen ..."
 
-#: builtin/am.c:1635
+#: builtin/am.c:1667
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
@@ -2478,39 +2524,39 @@
 "Haben Sie den Patch per Hand editiert?\n"
 "Er kann nicht auf die Blobs in seiner 'index' Zeile angewendet werden."
 
-#: builtin/am.c:1641
+#: builtin/am.c:1673
 msgid "Falling back to patching base and 3-way merge..."
 msgstr "Falle zurück zum Patchen der Basis und zum 3-Wege-Merge ..."
 
-#: builtin/am.c:1666
+#: builtin/am.c:1688
 msgid "Failed to merge in the changes."
 msgstr "Merge der Änderungen fehlgeschlagen."
 
-#: builtin/am.c:1691 builtin/merge.c:632
+#: builtin/am.c:1712 builtin/merge.c:632
 msgid "git write-tree failed to write a tree"
 msgstr "\"git write-tree\" schlug beim Schreiben eines \"Tree\"-Objektes fehl"
 
-#: builtin/am.c:1698
+#: builtin/am.c:1719
 msgid "applying to an empty history"
 msgstr "auf leere Historie anwenden"
 
-#: builtin/am.c:1711 builtin/commit.c:1752 builtin/merge.c:829
+#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829
 #: builtin/merge.c:854
 msgid "failed to write commit object"
 msgstr "Fehler beim Schreiben des Commit-Objektes."
 
-#: builtin/am.c:1743 builtin/am.c:1747
+#: builtin/am.c:1764 builtin/am.c:1768
 #, c-format
 msgid "cannot resume: %s does not exist."
 msgstr "Kann nicht fortsetzen: %s existiert nicht"
 
-#: builtin/am.c:1763
+#: builtin/am.c:1784
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 "Kann nicht interaktiv sein, ohne dass die Standard-Eingabe mit einem "
 "Terminal verbunden ist."
 
-#: builtin/am.c:1768
+#: builtin/am.c:1789
 msgid "Commit Body is:"
 msgstr "Commit-Beschreibung ist:"
 
@@ -2518,35 +2564,35 @@
 #. in your translation. The program will only accept English
 #. input at this point.
 #.
-#: builtin/am.c:1778
+#: builtin/am.c:1799
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 msgstr "Anwenden? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 
-#: builtin/am.c:1828
+#: builtin/am.c:1849
 #, c-format
 msgid "Dirty index: cannot apply patches (dirty: %s)"
 msgstr "Geänderter Index: kann Patches nicht anwenden (geändert: %s)"
 
-#: builtin/am.c:1863 builtin/am.c:1934
+#: builtin/am.c:1884 builtin/am.c:1955
 #, c-format
 msgid "Applying: %.*s"
 msgstr "Wende an: %.*s"
 
-#: builtin/am.c:1879
+#: builtin/am.c:1900
 msgid "No changes -- Patch already applied."
 msgstr "Keine Änderungen -- Patches bereits angewendet."
 
-#: builtin/am.c:1887
+#: builtin/am.c:1908
 #, c-format
 msgid "Patch failed at %s %.*s"
 msgstr "Anwendung des Patches fehlgeschlagen bei %s %.*s"
 
-#: builtin/am.c:1893
+#: builtin/am.c:1914
 #, c-format
 msgid "The copy of the patch that failed is found in: %s"
 msgstr "Die Kopie des fehlgeschlagenen Patches befindet sich in: %s"
 
-#: builtin/am.c:1937
+#: builtin/am.c:1958
 msgid ""
 "No changes - did you forget to use 'git add'?\n"
 "If there is nothing left to stage, chances are that something else\n"
@@ -2557,7 +2603,7 @@
 "diese bereits anderweitig eingefügt worden sein; Sie könnten diesen Patch\n"
 "auslassen."
 
-#: builtin/am.c:1944
+#: builtin/am.c:1965
 msgid ""
 "You still have unmerged paths in your index.\n"
 "Did you forget to use 'git add'?"
@@ -2565,17 +2611,17 @@
 "Sie haben immer noch nicht zusammengeführte Pfade im Index.\n"
 "Haben Sie vergessen 'git add' zu benutzen?"
 
-#: builtin/am.c:2052 builtin/am.c:2056 builtin/am.c:2068 builtin/reset.c:308
+#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308
 #: builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: builtin/am.c:2104
+#: builtin/am.c:2125
 msgid "failed to clean index"
 msgstr "Fehler beim Bereinigen des Index"
 
-#: builtin/am.c:2138
+#: builtin/am.c:2159
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
@@ -2583,151 +2629,153 @@
 "Sie scheinen seit dem letzten gescheiterten 'am' HEAD geändert zu haben.\n"
 "Keine Zurücksetzung zu ORIG_HEAD."
 
-#: builtin/am.c:2199
+#: builtin/am.c:2220
 #, c-format
 msgid "Invalid value for --patch-format: %s"
 msgstr "Ungültiger Wert für --patch-format: %s"
 
-#: builtin/am.c:2221
-msgid "git am [options] [(<mbox>|<Maildir>)...]"
-msgstr "git am [Optionen] [(<mbox>|<E-Mail-Verzeichnis>)...]"
+#: builtin/am.c:2253
+msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
+msgstr "git am [<Optionen>] [(<mbox>|<E-Mail-Verzeichnis>)...]"
 
-#: builtin/am.c:2222
-msgid "git am [options] (--continue | --skip | --abort)"
-msgstr "git am [Optionen] (--continue | --skip | --abort)"
+#: builtin/am.c:2254
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<Optionen>] (--continue | --skip | --abort)"
 
-#: builtin/am.c:2228
+#: builtin/am.c:2260
 msgid "run interactively"
 msgstr "interaktiv ausführen"
 
-#: builtin/am.c:2230
+#: builtin/am.c:2262
 msgid "historical option -- no-op"
 msgstr "historische Option -- kein Effekt"
 
-#: builtin/am.c:2232
+#: builtin/am.c:2264
 msgid "allow fall back on 3way merging if needed"
 msgstr "erlaube, falls notwendig, das Zurückfallen auf einen 3-Wege-Merge"
 
-#: builtin/am.c:2233 builtin/init-db.c:509 builtin/prune-packed.c:57
+#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57
 #: builtin/repack.c:171
 msgid "be quiet"
 msgstr "weniger Ausgaben"
 
-#: builtin/am.c:2235
+#: builtin/am.c:2267
 msgid "add a Signed-off-by line to the commit message"
 msgstr "der Commit-Beschreibung eine Signed-off-by Zeile hinzufügen"
 
-#: builtin/am.c:2238
+#: builtin/am.c:2270
 msgid "recode into utf8 (default)"
 msgstr "nach UTF-8 umkodieren (Standard)"
 
-#: builtin/am.c:2240
+#: builtin/am.c:2272
 msgid "pass -k flag to git-mailinfo"
 msgstr "-k an git-mailinfo übergeben"
 
-#: builtin/am.c:2242
+#: builtin/am.c:2274
 msgid "pass -b flag to git-mailinfo"
 msgstr "-b an git-mailinfo übergeben"
 
-#: builtin/am.c:2244
+#: builtin/am.c:2276
 msgid "pass -m flag to git-mailinfo"
 msgstr "-m an git-mailinfo übergeben"
 
-#: builtin/am.c:2246
+#: builtin/am.c:2278
 msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr "--keep-cr an git-mailsplit für mbox-Format übergeben"
 
-#: builtin/am.c:2249
+#: builtin/am.c:2281
 msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr "kein --keep-cr an git-mailsplit übergeben, unabhängig von am.keepcr"
 
-#: builtin/am.c:2252
+#: builtin/am.c:2284
 msgid "strip everything before a scissors line"
 msgstr "alles vor einer Scheren-Zeile entfernen"
 
-#: builtin/am.c:2253 builtin/apply.c:4563
+#: builtin/am.c:2285 builtin/apply.c:4554
 msgid "action"
 msgstr "Aktion"
 
-#: builtin/am.c:2254 builtin/am.c:2257 builtin/am.c:2260 builtin/am.c:2263
-#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
-#: builtin/am.c:2281
+#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295
+#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307
+#: builtin/am.c:2313
 msgid "pass it through git-apply"
 msgstr "an git-apply übergeben"
 
-#: builtin/am.c:2262 builtin/apply.c:4587
+#: builtin/am.c:2294 builtin/apply.c:4578
 msgid "root"
 msgstr "Wurzelverzeichnis"
 
-#: builtin/am.c:2265 builtin/am.c:2268 builtin/apply.c:4525
-#: builtin/apply.c:4528 builtin/clone.c:85 builtin/fetch.c:93
-#: builtin/pull.c:167
+#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516
+#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93
+#: builtin/pull.c:167 builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
 msgid "path"
 msgstr "Pfad"
 
-#: builtin/am.c:2271 builtin/fmt-merge-msg.c:669 builtin/fmt-merge-msg.c:672
-#: builtin/grep.c:698 builtin/merge.c:198 builtin/pull.c:127
-#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:664
-#: builtin/show-ref.c:180 builtin/tag.c:591 parse-options.h:132
-#: parse-options.h:134 parse-options.h:243
+#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
+#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127
+#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645
+#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
+#: parse-options.h:134 parse-options.h:244
 msgid "n"
 msgstr "Anzahl"
 
-#: builtin/am.c:2274 builtin/apply.c:4531
+#: builtin/am.c:2306 builtin/apply.c:4522
 msgid "num"
 msgstr "Anzahl"
 
-#: builtin/am.c:2277 builtin/for-each-ref.c:34 builtin/replace.c:438
+#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
 msgid "format"
 msgstr "Format"
 
-#: builtin/am.c:2278
+#: builtin/am.c:2310
 msgid "format the patch(es) are in"
 msgstr "Patch-Format"
 
-#: builtin/am.c:2284
+#: builtin/am.c:2316
 msgid "override error message when patch failure occurs"
 msgstr "Meldung bei fehlerhafter Patch-Anwendung überschreiben"
 
-#: builtin/am.c:2286
+#: builtin/am.c:2318
 msgid "continue applying patches after resolving a conflict"
 msgstr "Anwendung der Patches nach Auflösung eines Konfliktes fortsetzen"
 
-#: builtin/am.c:2289
+#: builtin/am.c:2321
 msgid "synonyms for --continue"
 msgstr "Synonyme für --continue"
 
-#: builtin/am.c:2292
+#: builtin/am.c:2324
 msgid "skip the current patch"
 msgstr "den aktuellen Patch auslassen"
 
-#: builtin/am.c:2295
+#: builtin/am.c:2327
 msgid "restore the original branch and abort the patching operation."
 msgstr ""
 "ursprünglichen Branch wiederherstellen und Anwendung der Patches abbrechen"
 
-#: builtin/am.c:2299
+#: builtin/am.c:2331
 msgid "lie about committer date"
 msgstr "Autor-Datum als Commit-Datum verwenden"
 
-#: builtin/am.c:2301
+#: builtin/am.c:2333
 msgid "use current timestamp for author date"
 msgstr "aktuellen Zeitstempel als Autor-Datum verwenden"
 
-#: builtin/am.c:2303 builtin/commit.c:1590 builtin/merge.c:225
-#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:606
+#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225
+#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355
 msgid "key-id"
 msgstr "GPG-Schlüsselkennung"
 
-#: builtin/am.c:2304
+#: builtin/am.c:2336
 msgid "GPG-sign commits"
 msgstr "Commits mit GPG signieren"
 
-#: builtin/am.c:2307
+#: builtin/am.c:2339
 msgid "(internal use for git-rebase)"
 msgstr "(intern für git-rebase verwendet)"
 
-#: builtin/am.c:2322
+#: builtin/am.c:2354
 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."
@@ -2735,16 +2783,16 @@
 "Die -b/--binary Option hat seit Langem keinen Effekt und wird\n"
 "entfernt. Bitte verwenden Sie diese nicht mehr."
 
-#: builtin/am.c:2329
+#: builtin/am.c:2361
 msgid "failed to read the index"
 msgstr "Fehler beim Lesen des Index"
 
-#: builtin/am.c:2344
+#: builtin/am.c:2376
 #, c-format
 msgid "previous rebase directory %s still exists but mbox given."
 msgstr "Vorheriges Rebase-Verzeichnis %s existiert noch, aber mbox gegeben."
 
-#: builtin/am.c:2368
+#: builtin/am.c:2400
 #, c-format
 msgid ""
 "Stray %s directory found.\n"
@@ -2753,7 +2801,7 @@
 "Stray %s Verzeichnis gefunden.\n"
 "Benutzen Sie \"git am --abort\", um es zu entfernen."
 
-#: builtin/am.c:2374
+#: builtin/am.c:2406
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr "Es ist keine Auflösung im Gange, es wird nicht fortgesetzt."
 
@@ -2761,66 +2809,66 @@
 msgid "git apply [<options>] [<patch>...]"
 msgstr "git apply [<Optionen>] [<Patch>...]"
 
-#: builtin/apply.c:112
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
 msgstr "nicht erkannte Whitespace-Option: '%s'"
 
-#: builtin/apply.c:127
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "nicht erkannte Option zum Ignorieren von Whitespace: '%s'"
 
-#: builtin/apply.c:822
+#: builtin/apply.c:818
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "Kann regulären Ausdruck für Zeitstempel %s nicht verarbeiten"
 
-#: builtin/apply.c:831
+#: builtin/apply.c:827
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "Ausführung des regulären Ausdrucks gab %d zurück. Eingabe: %s"
 
-#: builtin/apply.c:912
+#: builtin/apply.c:908
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "Konnte keinen Dateinamen in Zeile %d des Patches finden."
 
-#: builtin/apply.c:944
+#: builtin/apply.c:940
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
 "git apply: ungültiges 'git-diff' - erwartete /dev/null, erhielt %s in Zeile "
 "%d"
 
-#: builtin/apply.c:948
+#: builtin/apply.c:944
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr ""
 "git apply: ungültiges 'git-diff' - Inkonsistenter neuer Dateiname in Zeile %d"
 
-#: builtin/apply.c:949
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr ""
 "git apply: ungültiges 'git-diff' - Inkonsistenter alter Dateiname in Zeile %d"
 
-#: builtin/apply.c:956
+#: builtin/apply.c:952
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr "git apply: ungültiges 'git-diff' - erwartete /dev/null in Zeile %d"
 
-#: builtin/apply.c:1419
+#: builtin/apply.c:1415
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "recount: unerwartete Zeile: %.*s"
 
-#: builtin/apply.c:1476
+#: builtin/apply.c:1472
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "Patch-Fragment ohne Kopfbereich bei Zeile %d: %.*s"
 
-#: builtin/apply.c:1493
+#: builtin/apply.c:1489
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2835,65 +2883,65 @@
 "Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn "
 "%d vorangestellte Teile des Pfades entfernt werden (Zeile %d)"
 
-#: builtin/apply.c:1659
+#: builtin/apply.c:1655
 msgid "new file depends on old contents"
 msgstr "neue Datei hängt von alten Inhalten ab"
 
-#: builtin/apply.c:1661
+#: builtin/apply.c:1657
 msgid "deleted file still has contents"
 msgstr "entfernte Datei hat noch Inhalte"
 
-#: builtin/apply.c:1687
+#: builtin/apply.c:1683
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "fehlerhafter Patch bei Zeile %d"
 
-#: builtin/apply.c:1723
+#: builtin/apply.c:1719
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "neue Datei %s hängt von alten Inhalten ab"
 
-#: builtin/apply.c:1725
+#: builtin/apply.c:1721
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "entfernte Datei %s hat noch Inhalte"
 
-#: builtin/apply.c:1728
+#: builtin/apply.c:1724
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "** Warnung: Datei %s wird leer, aber nicht entfernt."
 
-#: builtin/apply.c:1874
+#: builtin/apply.c:1870
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "fehlerhafter Binär-Patch bei Zeile %d: %.*s"
 
-#: builtin/apply.c:1903
+#: builtin/apply.c:1899
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "nicht erkannter Binär-Patch bei Zeile %d"
 
-#: builtin/apply.c:2054
+#: builtin/apply.c:2050
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "Patch mit nutzlosen Informationen bei Zeile %d"
 
-#: builtin/apply.c:2144
+#: builtin/apply.c:2140
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "konnte symbolische Verknüpfung %s nicht lesen"
 
-#: builtin/apply.c:2148
+#: builtin/apply.c:2144
 #, c-format
 msgid "unable to open or read %s"
 msgstr "konnte %s nicht öffnen oder lesen"
 
-#: builtin/apply.c:2781
+#: builtin/apply.c:2777
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "Ungültiger Zeilenanfang: '%c'"
 
-#: builtin/apply.c:2900
+#: builtin/apply.c:2896
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
@@ -2901,12 +2949,12 @@
 msgstr[1] ""
 "Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeilen versetzt)"
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2908
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr "Kontext reduziert zu (%ld/%ld), um Patch-Bereich bei %d anzuwenden"
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2914
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -2915,337 +2963,337 @@
 "bei der Suche nach:\n"
 "%.*s"
 
-#: builtin/apply.c:2938
+#: builtin/apply.c:2934
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "keine Daten in Binär-Patch für '%s'"
 
-#: builtin/apply.c:3039
+#: builtin/apply.c:3035
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "Konnte Binär-Patch nicht auf '%s' anwenden"
 
-#: builtin/apply.c:3045
+#: builtin/apply.c:3041
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
 "Binär-Patch für '%s' erzeugt falsches Ergebnis (erwartete %s, bekam %s)"
 
-#: builtin/apply.c:3066
+#: builtin/apply.c:3062
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "Anwendung des Patches fehlgeschlagen: %s:%ld"
 
-#: builtin/apply.c:3190
+#: builtin/apply.c:3186
 #, c-format
 msgid "cannot checkout %s"
 msgstr "kann %s nicht auschecken"
 
-#: builtin/apply.c:3235 builtin/apply.c:3246 builtin/apply.c:3291
+#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
 #, c-format
 msgid "read of %s failed"
 msgstr "Konnte %s nicht lesen"
 
-#: builtin/apply.c:3243
+#: builtin/apply.c:3239
 #, c-format
 msgid "reading from '%s' beyond a symbolic link"
 msgstr "'%s' ist hinter einer symbolischen Verknüpfung"
 
-#: builtin/apply.c:3271 builtin/apply.c:3493
+#: builtin/apply.c:3267 builtin/apply.c:3489
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "Pfad %s wurde umbenannt/gelöscht"
 
-#: builtin/apply.c:3352 builtin/apply.c:3507
+#: builtin/apply.c:3348 builtin/apply.c:3503
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s ist nicht im Index"
 
-#: builtin/apply.c:3356 builtin/apply.c:3499 builtin/apply.c:3521
+#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: builtin/apply.c:3361 builtin/apply.c:3515
+#: builtin/apply.c:3357 builtin/apply.c:3511
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s entspricht nicht der Version im Index"
 
-#: builtin/apply.c:3463
+#: builtin/apply.c:3459
 msgid "removal patch leaves file contents"
 msgstr "Lösch-Patch hinterlässt Dateiinhalte"
 
-#: builtin/apply.c:3532
+#: builtin/apply.c:3528
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s: falscher Typ"
 
-#: builtin/apply.c:3534
+#: builtin/apply.c:3530
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s ist vom Typ %o, erwartete %o"
 
-#: builtin/apply.c:3693 builtin/apply.c:3695
+#: builtin/apply.c:3689 builtin/apply.c:3691
 #, c-format
 msgid "invalid path '%s'"
 msgstr "Ungültiger Pfad '%s'"
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3746
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s ist bereits bereitgestellt"
 
-#: builtin/apply.c:3753
+#: builtin/apply.c:3749
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s existiert bereits im Arbeitsverzeichnis"
 
-#: builtin/apply.c:3773
+#: builtin/apply.c:3769
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o)"
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3774
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o) von %s"
 
-#: builtin/apply.c:3798
+#: builtin/apply.c:3794
 #, c-format
 msgid "affected file '%s' is beyond a symbolic link"
 msgstr "betroffene Datei '%s' ist hinter einer symbolischen Verknüpfung"
 
-#: builtin/apply.c:3802
+#: builtin/apply.c:3798
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s: Patch konnte nicht angewendet werden"
 
-#: builtin/apply.c:3816
+#: builtin/apply.c:3812
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Prüfe Patch %s ..."
 
-#: builtin/apply.c:3909 builtin/checkout.c:232 builtin/reset.c:135
+#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "make_cache_entry für Pfad '%s' fehlgeschlagen"
 
-#: builtin/apply.c:4052
+#: builtin/apply.c:4048
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "konnte %s nicht aus dem Index entfernen"
 
-#: builtin/apply.c:4081
+#: builtin/apply.c:4077
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "fehlerhafter Patch für Submodul %s"
 
-#: builtin/apply.c:4085
+#: builtin/apply.c:4081
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "konnte neu erstellte Datei '%s' nicht lesen"
 
-#: builtin/apply.c:4090
+#: builtin/apply.c:4086
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr "kann internen Speicher für eben erstellte Datei %s nicht erzeugen"
 
-#: builtin/apply.c:4093 builtin/apply.c:4201
+#: builtin/apply.c:4089 builtin/apply.c:4197
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "kann für %s keinen Eintrag in den Zwischenspeicher hinzufügen"
 
-#: builtin/apply.c:4126
+#: builtin/apply.c:4122
 #, c-format
 msgid "closing file '%s'"
 msgstr "schließe Datei '%s'"
 
-#: builtin/apply.c:4175
+#: builtin/apply.c:4171
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "konnte Datei '%s' mit Modus %o nicht schreiben"
 
-#: builtin/apply.c:4262
+#: builtin/apply.c:4258
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Patch %s sauber angewendet"
 
-#: builtin/apply.c:4270
+#: builtin/apply.c:4266
 msgid "internal error"
 msgstr "interner Fehler"
 
-#: builtin/apply.c:4273
+#: builtin/apply.c:4269
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] "Wende Patch %%s mit %d Zurückweisung an..."
 msgstr[1] "Wende Patch %%s mit %d Zurückweisungen an..."
 
-#: builtin/apply.c:4283
+#: builtin/apply.c:4279
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "Verkürze Name von .rej Datei zu %.*s.rej"
 
-#: builtin/apply.c:4304
+#: builtin/apply.c:4300
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "Patch-Bereich #%d sauber angewendet."
 
-#: builtin/apply.c:4307
+#: builtin/apply.c:4303
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "Patch-Block #%d zurückgewiesen."
 
-#: builtin/apply.c:4397
+#: builtin/apply.c:4393
 msgid "unrecognized input"
 msgstr "nicht erkannte Eingabe"
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4404
 msgid "unable to read index file"
 msgstr "Konnte Index-Datei nicht lesen"
 
-#: builtin/apply.c:4526
+#: builtin/apply.c:4517
 msgid "don't apply changes matching the given path"
 msgstr "keine Änderungen im angegebenen Pfad anwenden"
 
-#: builtin/apply.c:4529
+#: builtin/apply.c:4520
 msgid "apply changes matching the given path"
 msgstr "Änderungen nur im angegebenen Pfad anwenden"
 
-#: builtin/apply.c:4532
+#: builtin/apply.c:4523
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr ""
 "<Anzahl> vorangestellte Schrägstriche von herkömmlichen Differenzpfaden "
 "entfernen"
 
-#: builtin/apply.c:4535
+#: builtin/apply.c:4526
 msgid "ignore additions made by the patch"
 msgstr "hinzugefügte Zeilen des Patches ignorieren"
 
-#: builtin/apply.c:4537
+#: builtin/apply.c:4528
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr ""
 "anstatt der Anwendung des Patches, den \"diffstat\" für die Eingabe "
 "ausgegeben"
 
-#: builtin/apply.c:4541
+#: builtin/apply.c:4532
 msgid "show number of added and deleted lines in decimal notation"
 msgstr ""
 "die Anzahl von hinzugefügten/entfernten Zeilen in Dezimalnotation anzeigen"
 
-#: builtin/apply.c:4543
+#: builtin/apply.c:4534
 msgid "instead of applying the patch, output a summary for the input"
 msgstr ""
 "anstatt der Anwendung des Patches, eine Zusammenfassung für die Eingabe "
 "ausgeben"
 
-#: builtin/apply.c:4545
+#: builtin/apply.c:4536
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr ""
 "anstatt der Anwendung des Patches, zeige ob Patch angewendet werden kann"
 
-#: builtin/apply.c:4547
+#: builtin/apply.c:4538
 msgid "make sure the patch is applicable to the current index"
 msgstr ""
 "sicherstellen, dass der Patch mit dem aktuellen Index angewendet werden kann"
 
-#: builtin/apply.c:4549
+#: builtin/apply.c:4540
 msgid "apply a patch without touching the working tree"
 msgstr "Patch anwenden, ohne Änderungen im Arbeitsverzeichnis vorzunehmen"
 
-#: builtin/apply.c:4551
+#: builtin/apply.c:4542
 msgid "accept a patch that touches outside the working area"
 msgstr ""
 "Patch anwenden, der Änderungen außerhalb des Arbeitsverzeichnisses vornimmt"
 
-#: builtin/apply.c:4553
+#: builtin/apply.c:4544
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr "Patch anwenden (Benutzung mit --stat/--summary/--check)"
 
-#: builtin/apply.c:4555
+#: builtin/apply.c:4546
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "versuche 3-Wege-Merge, wenn der Patch nicht angewendet werden konnte"
 
-#: builtin/apply.c:4557
+#: builtin/apply.c:4548
 msgid "build a temporary index based on embedded index information"
 msgstr ""
 "einen temporären Index, basierend auf den integrierten Index-Informationen, "
 "erstellen"
 
-#: builtin/apply.c:4559 builtin/checkout-index.c:198 builtin/ls-files.c:412
+#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412
 msgid "paths are separated with NUL character"
 msgstr "Pfade sind getrennt durch NUL Zeichen"
 
-#: builtin/apply.c:4562
+#: builtin/apply.c:4553
 msgid "ensure at least <n> lines of context match"
 msgstr ""
 "sicher stellen, dass mindestens <n> Zeilen des Kontextes übereinstimmen"
 
-#: builtin/apply.c:4564
+#: builtin/apply.c:4555
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "neue oder geänderte Zeilen, die Whitespace-Fehler haben, ermitteln"
 
-#: builtin/apply.c:4567 builtin/apply.c:4570
+#: builtin/apply.c:4558 builtin/apply.c:4561
 msgid "ignore changes in whitespace when finding context"
 msgstr "Änderungen im Whitespace bei der Suche des Kontextes ignorieren"
 
-#: builtin/apply.c:4573
+#: builtin/apply.c:4564
 msgid "apply the patch in reverse"
 msgstr "den Patch in umgekehrter Reihenfolge anwenden"
 
-#: builtin/apply.c:4575
+#: builtin/apply.c:4566
 msgid "don't expect at least one line of context"
 msgstr "keinen Kontext erwarten"
 
-#: builtin/apply.c:4577
+#: builtin/apply.c:4568
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr ""
 "zurückgewiesene Patch-Blöcke in entsprechenden *.rej Dateien hinterlassen"
 
-#: builtin/apply.c:4579
+#: builtin/apply.c:4570
 msgid "allow overlapping hunks"
 msgstr "sich überlappende Patch-Blöcke erlauben"
 
-#: builtin/apply.c:4582
+#: builtin/apply.c:4573
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr "fehlerhaft erkannten fehlenden Zeilenumbruch am Dateiende tolerieren"
 
-#: builtin/apply.c:4585
+#: builtin/apply.c:4576
 msgid "do not trust the line counts in the hunk headers"
 msgstr "den Zeilennummern im Kopf des Patch-Blocks nicht vertrauen"
 
-#: builtin/apply.c:4588
+#: builtin/apply.c:4579
 msgid "prepend <root> to all filenames"
 msgstr "<Wurzelverzeichnis> vor alle Dateinamen stellen"
 
-#: builtin/apply.c:4610
+#: builtin/apply.c:4601
 msgid "--3way outside a repository"
 msgstr ""
 "Die Option --3way kann nicht außerhalb eines Repositories verwendet werden."
 
-#: builtin/apply.c:4618
+#: builtin/apply.c:4609
 msgid "--index outside a repository"
 msgstr ""
 "Die Option --index kann nicht außerhalb eines Repositories verwendet werden."
 
-#: builtin/apply.c:4621
+#: builtin/apply.c:4612
 msgid "--cached outside a repository"
 msgstr ""
 "Die Option --cached kann nicht außerhalb eines Repositories verwendet werden."
 
-#: builtin/apply.c:4640
+#: builtin/apply.c:4631
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "kann Patch '%s' nicht öffnen"
 
-#: builtin/apply.c:4654
+#: builtin/apply.c:4645
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "unterdrückte %d Whitespace-Fehler"
 msgstr[1] "unterdrückte %d Whitespace-Fehler"
 
-#: builtin/apply.c:4660 builtin/apply.c:4670
+#: builtin/apply.c:4651 builtin/apply.c:4661
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -3307,98 +3355,98 @@
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<rev-opts> sind dokumentiert in git-rev-list(1)"
 
-#: builtin/blame.c:2500
+#: builtin/blame.c:2519
 msgid "Show blame entries as we find them, incrementally"
 msgstr "\"blame\"-Einträge schrittweise anzeigen, während wir sie generieren"
 
-#: builtin/blame.c:2501
+#: builtin/blame.c:2520
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "leere SHA-1 für Grenz-Commits anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2502
+#: builtin/blame.c:2521
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Ursprungs-Commit nicht als Grenzen behandeln (Standard: aus)"
 
-#: builtin/blame.c:2503
+#: builtin/blame.c:2522
 msgid "Show work cost statistics"
 msgstr "Statistiken zum Arbeitsaufwand anzeigen"
 
-#: builtin/blame.c:2504
+#: builtin/blame.c:2523
 msgid "Show output score for blame entries"
 msgstr "Ausgabebewertung für \"blame\"-Einträge anzeigen"
 
-#: builtin/blame.c:2505
+#: builtin/blame.c:2524
 msgid "Show original filename (Default: auto)"
 msgstr "ursprünglichen Dateinamen anzeigen (Standard: auto)"
 
-#: builtin/blame.c:2506
+#: builtin/blame.c:2525
 msgid "Show original linenumber (Default: off)"
 msgstr "ursprüngliche Zeilennummer anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2507
+#: builtin/blame.c:2526
 msgid "Show in a format designed for machine consumption"
 msgstr "Anzeige in einem Format für maschinelle Auswertung"
 
-#: builtin/blame.c:2508
+#: builtin/blame.c:2527
 msgid "Show porcelain format with per-line commit information"
 msgstr ""
 "Anzeige in Format für Fremdprogramme mit Commit-Informationen pro Zeile"
 
-#: builtin/blame.c:2509
+#: builtin/blame.c:2528
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 "Den gleichen Ausgabemodus benutzen wie \"git-annotate\" (Standard: aus)"
 
-#: builtin/blame.c:2510
+#: builtin/blame.c:2529
 msgid "Show raw timestamp (Default: off)"
 msgstr "Unbearbeiteten Zeitstempel anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2511
+#: builtin/blame.c:2530
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Langen Commit-SHA1 anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2512
+#: builtin/blame.c:2531
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Den Namen des Autors und den Zeitstempel unterdrücken (Standard: aus)"
 
-#: builtin/blame.c:2513
+#: builtin/blame.c:2532
 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:2514
+#: builtin/blame.c:2533
 msgid "Ignore whitespace differences"
 msgstr "Unterschiede im Whitespace ignorieren"
 
-#: builtin/blame.c:2515
+#: builtin/blame.c:2534
 msgid "Spend extra cycles to find better match"
 msgstr "Länger arbeiten, um bessere Übereinstimmungen zu finden"
 
-#: builtin/blame.c:2516
+#: builtin/blame.c:2535
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Commits von <Datei> benutzen, anstatt \"git-rev-list\" aufzurufen"
 
-#: builtin/blame.c:2517
+#: builtin/blame.c:2536
 msgid "Use <file>'s contents as the final image"
 msgstr "Inhalte der <Datei>en als endgültiges Abbild benutzen"
 
-#: builtin/blame.c:2518 builtin/blame.c:2519
+#: builtin/blame.c:2537 builtin/blame.c:2538
 msgid "score"
 msgstr "Bewertung"
 
-#: builtin/blame.c:2518
+#: builtin/blame.c:2537
 msgid "Find line copies within and across files"
 msgstr "kopierte Zeilen innerhalb oder zwischen Dateien finden"
 
-#: builtin/blame.c:2519
+#: builtin/blame.c:2538
 msgid "Find line movements within and across files"
 msgstr "verschobene Zeilen innerhalb oder zwischen Dateien finden"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "Process only line range n,m, counting from 1"
 msgstr "nur Zeilen im Bereich n,m verarbeiten, gezählt von 1"
 
@@ -3408,27 +3456,31 @@
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2601
+#: builtin/blame.c:2620
 msgid "4 years, 11 months ago"
 msgstr "vor 4 Jahren, und 11 Monaten"
 
-#: builtin/branch.c:24
+#: builtin/branch.c:25
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<Optionen>] [-r | -a] [--merged | --no-merged]"
 
-#: builtin/branch.c:25
+#: builtin/branch.c:26
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<Optionen>] [-l] [-f] <Branchname> [<Startpunkt>]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<Optionen>] [-r] (-d | -D) <Branchname>..."
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [<Optionen>] (-m | -M) [<alter-Branch>] <neuer-Branch>"
 
-#: builtin/branch.c:150
+#: builtin/branch.c:29
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr "git branch [<Optionen>] [-r | -a] [--points-at]"
+
+#: builtin/branch.c:142
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -3437,7 +3489,7 @@
 "entferne Branch '%s', der zusammengeführt wurde mit\n"
 "         '%s', aber noch nicht mit HEAD zusammengeführt wurde."
 
-#: builtin/branch.c:154
+#: builtin/branch.c:146
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -3446,12 +3498,12 @@
 "entferne Branch '%s' nicht, der noch nicht zusammengeführt wurde mit\n"
 "         '%s', obwohl er mit HEAD zusammengeführt wurde."
 
-#: builtin/branch.c:168
+#: builtin/branch.c:160
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Konnte Commit-Objekt für '%s' nicht nachschlagen."
 
-#: builtin/branch.c:172
+#: builtin/branch.c:164
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -3461,311 +3513,303 @@
 "Wenn Sie sicher sind diesen Branch zu entfernen, führen Sie 'git branch -D "
 "%s' aus."
 
-#: builtin/branch.c:185
+#: builtin/branch.c:177
 msgid "Update of config-file failed"
 msgstr "Aktualisierung der Konfigurationsdatei fehlgeschlagen."
 
-#: builtin/branch.c:213
+#: builtin/branch.c:205
 msgid "cannot use -a with -d"
 msgstr "kann -a nicht mit -d benutzen"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:211
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Konnte Commit-Objekt für HEAD nicht nachschlagen."
 
-#: builtin/branch.c:227
+#: builtin/branch.c:219
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr ""
 "Kann Branch '%s' nicht entfernen, da Sie sich gerade auf diesem befinden."
 
-#: builtin/branch.c:243
+#: builtin/branch.c:235
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "Remote-Tracking-Branch '%s' nicht gefunden"
 
-#: builtin/branch.c:244
+#: builtin/branch.c:236
 #, c-format
 msgid "branch '%s' not found."
 msgstr "Branch '%s' nicht gefunden."
 
-#: builtin/branch.c:259
+#: builtin/branch.c:251
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Fehler beim Entfernen des Remote-Tracking-Branches '%s'"
 
-#: builtin/branch.c:260
+#: builtin/branch.c:252
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Fehler beim Entfernen des Branches '%s'"
 
-#: builtin/branch.c:267
+#: builtin/branch.c:259
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Remote-Tracking-Branch %s entfernt (war %s).\n"
 
-#: builtin/branch.c:268
+#: builtin/branch.c:260
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Branch %s entfernt (war %s).\n"
 
-#: builtin/branch.c:369
-#, c-format
-msgid "branch '%s' does not point at a commit"
-msgstr "Branch '%s' zeigt auf keinen Commit"
-
-#: builtin/branch.c:452
+#: builtin/branch.c:303
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: entfernt]"
 
-#: builtin/branch.c:457
+#: builtin/branch.c:308
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:462
+#: builtin/branch.c:313
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: %d hinterher]"
 
-#: builtin/branch.c:464
+#: builtin/branch.c:315
 #, c-format
 msgid "[behind %d]"
 msgstr "[%d hinterher]"
 
-#: builtin/branch.c:468
+#: builtin/branch.c:319
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: %d voraus]"
 
-#: builtin/branch.c:470
+#: builtin/branch.c:321
 #, c-format
 msgid "[ahead %d]"
 msgstr "[%d voraus]"
 
-#: builtin/branch.c:473
+#: builtin/branch.c:324
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: %d voraus, %d hinterher]"
 
-#: builtin/branch.c:476
+#: builtin/branch.c:327
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[%d voraus, %d hinterher]"
 
-#: builtin/branch.c:489
+#: builtin/branch.c:340
 msgid " **** invalid ref ****"
 msgstr " **** ungültige Referenz ****"
 
-#: builtin/branch.c:580
+#: builtin/branch.c:366
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(kein Branch, Rebase von Branch %s im Gange)"
 
-#: builtin/branch.c:583
+#: builtin/branch.c:369
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(kein Branch, binäre Suche begonnen bei %s)"
 
-#: builtin/branch.c:589
+#: builtin/branch.c:375
 #, c-format
 msgid "(HEAD detached at %s)"
 msgstr "(HEAD losgelöst bei %s)"
 
-#: builtin/branch.c:592
+#: builtin/branch.c:378
 #, c-format
 msgid "(HEAD detached from %s)"
 msgstr "(HEAD losgelöst von %s)"
 
-#: builtin/branch.c:596
+#: builtin/branch.c:382
 msgid "(no branch)"
 msgstr "(kein Branch)"
 
-#: builtin/branch.c:643
-#, c-format
-msgid "object '%s' does not point to a commit"
-msgstr "Objekt '%s' zeigt auf keinen Commit"
-
-#: builtin/branch.c:691
-msgid "some refs could not be read"
-msgstr "Konnte einige Referenzen nicht lesen"
-
-#: builtin/branch.c:704
+#: builtin/branch.c:524
 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:714
+#: builtin/branch.c:534
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Ungültiger Branchname: '%s'"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:549
 msgid "Branch rename failed"
 msgstr "Umbenennung des Branches fehlgeschlagen"
 
-#: builtin/branch.c:733
+#: builtin/branch.c:553
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "falsch benannten Branch '%s' umbenannt"
 
-#: builtin/branch.c:737
+#: builtin/branch.c:557
 #, 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:744
+#: builtin/branch.c:564
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 "Branch ist umbenannt, aber die Aktualisierung der Konfigurationsdatei ist "
 "fehlgeschlagen."
 
-#: builtin/branch.c:759
-#, c-format
-msgid "malformed object name %s"
-msgstr "Missgebildeter Objektname %s"
-
-#: builtin/branch.c:781
+#: builtin/branch.c:587
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr "Konnte Beschreibungsvorlage für Branch nicht schreiben: %s"
 
-#: builtin/branch.c:811
+#: builtin/branch.c:616
 msgid "Generic options"
 msgstr "Allgemeine Optionen"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:618
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "Hash und Betreff anzeigen; -vv: zusätzlich Upstream-Branch"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:619
 msgid "suppress informational messages"
 msgstr "Informationsmeldungen unterdrücken"
 
-#: builtin/branch.c:815
+#: builtin/branch.c:620
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "den Übernahmemodus einstellen (siehe git-pull(1))"
 
-#: builtin/branch.c:817
+#: builtin/branch.c:622
 msgid "change upstream info"
 msgstr "Informationen zum Upstream-Branch ändern"
 
-#: builtin/branch.c:821
+#: builtin/branch.c:626
 msgid "use colored output"
 msgstr "farbige Ausgaben verwenden"
 
-#: builtin/branch.c:822
+#: builtin/branch.c:627
 msgid "act on remote-tracking branches"
 msgstr "auf Remote-Tracking-Branches wirken"
 
-#: builtin/branch.c:825 builtin/branch.c:831 builtin/branch.c:852
-#: builtin/branch.c:858 builtin/commit.c:1580 builtin/commit.c:1581
-#: builtin/commit.c:1582 builtin/commit.c:1583 builtin/tag.c:618
-#: builtin/tag.c:624
-msgid "commit"
-msgstr "Commit"
-
-#: builtin/branch.c:826 builtin/branch.c:832
+#: builtin/branch.c:629 builtin/branch.c:630
 msgid "print only branches that contain the commit"
 msgstr "nur Branches ausgeben, welche diesen Commit beinhalten"
 
-#: builtin/branch.c:838
+#: builtin/branch.c:633
 msgid "Specific git-branch actions:"
 msgstr "spezifische Aktionen für \"git-branch\":"
 
-#: builtin/branch.c:839
+#: builtin/branch.c:634
 msgid "list both remote-tracking and local branches"
 msgstr "Remote-Tracking und lokale Branches auflisten"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:636
 msgid "delete fully merged branch"
 msgstr "vollständig zusammengeführten Branch entfernen"
 
-#: builtin/branch.c:842
+#: builtin/branch.c:637
 msgid "delete branch (even if not merged)"
 msgstr "Branch löschen (auch wenn nicht zusammengeführt)"
 
-#: builtin/branch.c:843
+#: builtin/branch.c:638
 msgid "move/rename a branch and its reflog"
 msgstr "einen Branch und dessen Reflog verschieben/umbenennen"
 
-#: builtin/branch.c:844
+#: builtin/branch.c:639
 msgid "move/rename a branch, even if target exists"
 msgstr ""
 "einen Branch verschieben/umbenennen, auch wenn das Ziel bereits existiert"
 
-#: builtin/branch.c:845
+#: builtin/branch.c:640
 msgid "list branch names"
 msgstr "Branchnamen auflisten"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:641
 msgid "create the branch's reflog"
 msgstr "das Reflog des Branches erzeugen"
 
-#: builtin/branch.c:848
+#: builtin/branch.c:643
 msgid "edit the description for the branch"
 msgstr "die Beschreibung für den Branch bearbeiten"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:644
 msgid "force creation, move/rename, deletion"
 msgstr "Erstellung, Verschiebung/Umbenennung oder Löschung erzwingen"
 
-#: builtin/branch.c:852
-msgid "print only not merged branches"
-msgstr "nur Branches ausgeben, die nicht zusammengeführt sind"
+#: builtin/branch.c:645
+msgid "print only branches that are merged"
+msgstr "nur zusammengeführte Branches ausgeben"
 
-#: builtin/branch.c:858
-msgid "print only merged branches"
-msgstr "nur Branches ausgeben, die zusammengeführt sind"
+#: builtin/branch.c:646
+msgid "print only branches that are not merged"
+msgstr "nur nicht zusammengeführte Branches ausgeben"
 
-#: builtin/branch.c:862
+#: builtin/branch.c:647
 msgid "list branches in columns"
 msgstr "Branches in Spalten auflisten"
 
-#: builtin/branch.c:875
+#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
+msgstr "Schüssel"
+
+#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
+msgstr "sortiere nach diesem Feld"
+
+#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398
+#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564
+#: builtin/tag.c:369
+msgid "object"
+msgstr "Objekt"
+
+#: builtin/branch.c:652
+msgid "print only branches of the object"
+msgstr "nur Branches von diesem Objekt ausgeben"
+
+#: builtin/branch.c:670
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Konnte HEAD nicht als gültige Referenz auflösen."
 
-#: builtin/branch.c:879 builtin/clone.c:690
+#: builtin/branch.c:674 builtin/clone.c:697
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD wurde nicht unter \"refs/heads\" gefunden!"
 
-#: builtin/branch.c:901
+#: builtin/branch.c:694
 msgid "--column and --verbose are incompatible"
 msgstr "Die Optionen --column und --verbose sind inkompatibel."
 
-#: builtin/branch.c:912 builtin/branch.c:951
+#: builtin/branch.c:705 builtin/branch.c:747
 msgid "branch name required"
 msgstr "Branchname erforderlich"
 
-#: builtin/branch.c:927
+#: builtin/branch.c:723
 msgid "Cannot give description to detached HEAD"
 msgstr "zu losgelöstem HEAD kann keine Beschreibung hinterlegt werden"
 
-#: builtin/branch.c:932
+#: builtin/branch.c:728
 msgid "cannot edit description of more than one branch"
 msgstr "Beschreibung von mehr als einem Branch kann nicht bearbeitet werden"
 
-#: builtin/branch.c:939
+#: builtin/branch.c:735
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Noch kein Commit in Branch '%s'."
 
-#: builtin/branch.c:942
+#: builtin/branch.c:738
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Branch '%s' nicht vorhanden."
 
-#: builtin/branch.c:957
+#: builtin/branch.c:753
 msgid "too many branches for a rename operation"
 msgstr "zu viele Branches für eine Umbenennen-Operation angegeben"
 
-#: builtin/branch.c:962
+#: builtin/branch.c:758
 msgid "too many branches to set new upstream"
 msgstr "zu viele Branches angegeben, um Upstream-Branch zu setzen"
 
-#: builtin/branch.c:966
+#: builtin/branch.c:762
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -3773,43 +3817,43 @@
 "Konnte keinen neuen Upstream-Branch von HEAD zu %s setzen, da dieser auf\n"
 "keinen Branch zeigt."
 
-#: builtin/branch.c:969 builtin/branch.c:991 builtin/branch.c:1012
+#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808
 #, c-format
 msgid "no such branch '%s'"
 msgstr "Kein solcher Branch '%s'"
 
-#: builtin/branch.c:973
+#: builtin/branch.c:769
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "Branch '%s' existiert nicht"
 
-#: builtin/branch.c:985
+#: builtin/branch.c:781
 msgid "too many branches to unset upstream"
 msgstr ""
 "zu viele Branches angegeben, um Konfiguration zu Upstream-Branch zu entfernen"
 
-#: builtin/branch.c:989
+#: builtin/branch.c:785
 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:995
+#: builtin/branch.c:791
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Branch '%s' hat keinen Upstream-Branch gesetzt"
 
-#: builtin/branch.c:1009
+#: builtin/branch.c:805
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "'HEAD' darf nicht manuell erstellt werden"
 
-#: builtin/branch.c:1015
+#: builtin/branch.c:811
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "Die Optionen -a und -r bei 'git branch' können nicht gemeimsam mit einem "
 "Branchnamen verwendet werden."
 
-#: builtin/branch.c:1018
+#: builtin/branch.c:814
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3818,7 +3862,7 @@
 "Die --set-upstream Option ist veraltet und wird entfernt. Benutzen Sie --"
 "track oder --set-upstream-to\n"
 
-#: builtin/branch.c:1035
+#: builtin/branch.c:831
 #, c-format
 msgid ""
 "\n"
@@ -3829,12 +3873,12 @@
 "Wenn Sie wollten, dass '%s' den Branch '%s' als Upstream-Branch hat, führen "
 "Sie aus:\n"
 
-#: builtin/branch.c:1036
+#: builtin/branch.c:832
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr "    git branch -d %s\n"
 
-#: builtin/branch.c:1037
+#: builtin/branch.c:833
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr "    git branch --set-upstream-to %s\n"
@@ -3861,12 +3905,8 @@
 "<Art>|--textconv) <Objekt>"
 
 #: builtin/cat-file.c:429
-msgid ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <list-of-"
-"objects>"
-msgstr ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <Liste-von-"
-"Objekten"
+msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
 
 #: builtin/cat-file.c:466
 msgid "<type> can be one of: blob, tree, commit, tag"
@@ -3926,9 +3966,8 @@
 msgstr "git check-attr [-a | --all | <Attribut>...] [--] <Pfadname>..."
 
 #: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...] < <list-of-paths>"
-msgstr ""
-"git check-attr --stdin [-z] [-a | --all | <Attribut>...] < <Liste-von-Pfaden>"
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+msgstr "git check-attr --stdin [-z] [-a | --all | <Attribut>...]"
 
 #: builtin/check-attr.c:19
 msgid "report all attributes set on file"
@@ -3946,7 +3985,7 @@
 msgid "terminate input and output records by a NUL character"
 msgstr "Einträge von Ein- und Ausgabe mit NUL-Zeichen abschließen"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1133 builtin/gc.c:267
+#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "Fortschrittsanzeige unterdrücken"
 
@@ -4035,6 +4074,8 @@
 msgstr "den Inhalt in temporäre Dateien schreiben"
 
 #: builtin/checkout-index.c:204 builtin/column.c:30
+#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181
 msgid "string"
 msgstr "Zeichenkette"
 
@@ -4055,106 +4096,106 @@
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<Optionen>] [<Branch>] -- <Datei>..."
 
-#: builtin/checkout.c:133 builtin/checkout.c:166
+#: builtin/checkout.c:134 builtin/checkout.c:167
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "Pfad '%s' hat nicht unsere Version."
 
-#: builtin/checkout.c:135 builtin/checkout.c:168
+#: builtin/checkout.c:136 builtin/checkout.c:169
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "Pfad '%s' hat nicht deren Version."
 
-#: builtin/checkout.c:151
+#: builtin/checkout.c:152
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "Pfad '%s' hat nicht alle notwendigen Versionen."
 
-#: builtin/checkout.c:195
+#: builtin/checkout.c:196
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "Pfad '%s' hat nicht die notwendigen Versionen."
 
-#: builtin/checkout.c:212
+#: builtin/checkout.c:213
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "Pfad '%s': kann nicht zusammenführen"
 
-#: builtin/checkout.c:229
+#: builtin/checkout.c:230
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "Konnte Merge-Ergebnis von '%s' nicht hinzufügen."
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
+#: builtin/checkout.c:260
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "'%s' kann nicht mit der Aktualisierung von Pfaden verwendet werden"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:263 builtin/checkout.c:266
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' kann nicht mit '%s' verwendet werden"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:269
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 "Kann nicht gleichzeitig Pfade aktualisieren und zu Branch '%s' wechseln"
 
-#: builtin/checkout.c:279 builtin/checkout.c:473
+#: builtin/checkout.c:280 builtin/checkout.c:474
 msgid "corrupt index file"
 msgstr "beschädigte Index-Datei"
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:340 builtin/checkout.c:347
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "Pfad '%s' ist nicht zusammengeführt."
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:496
 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:622
+#: builtin/checkout.c:623
 #, 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:660
+#: builtin/checkout.c:661
 msgid "HEAD is now at"
 msgstr "HEAD ist jetzt bei"
 
-#: builtin/checkout.c:667
+#: builtin/checkout.c:668
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Setze Branch '%s' neu\n"
 
-#: builtin/checkout.c:670
+#: builtin/checkout.c:671
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Bereits auf '%s'\n"
 
-#: builtin/checkout.c:674
+#: builtin/checkout.c:675
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Zu umgesetztem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:676 builtin/checkout.c:1065
+#: builtin/checkout.c:677 builtin/checkout.c:1066
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Zu neuem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:678
+#: builtin/checkout.c:679
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Zu Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:731
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... und %d weitere.\n"
 
-#: builtin/checkout.c:736
+#: builtin/checkout.c:737
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4177,7 +4218,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:755
+#: builtin/checkout.c:756
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -4204,146 +4245,152 @@
 " git branch <neuer-Branchname> %s\n"
 "\n"
 
-#: builtin/checkout.c:791
+#: builtin/checkout.c:792
 msgid "internal error in revision walk"
 msgstr "interner Fehler im Revisionsgang"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:796
 msgid "Previous HEAD position was"
 msgstr "Vorherige Position von HEAD war"
 
-#: builtin/checkout.c:822 builtin/checkout.c:1060
+#: builtin/checkout.c:823 builtin/checkout.c:1061
 msgid "You are on a branch yet to be born"
 msgstr "Sie sind auf einem Branch, der noch geboren wird"
 
-#: builtin/checkout.c:967
+#: builtin/checkout.c:968
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "nur eine Referenz erwartet, %d gegeben."
 
-#: builtin/checkout.c:1006 builtin/worktree.c:210
+#: builtin/checkout.c:1007 builtin/worktree.c:213
 #, c-format
 msgid "invalid reference: %s"
 msgstr "Ungültige Referenz: %s"
 
-#: builtin/checkout.c:1035
+#: builtin/checkout.c:1036
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "Referenz ist kein \"Tree\"-Objekt: %s"
 
-#: builtin/checkout.c:1074
+#: builtin/checkout.c:1075
 msgid "paths cannot be used with switching branches"
 msgstr "Pfade können nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1077 builtin/checkout.c:1081
+#: builtin/checkout.c:1078 builtin/checkout.c:1082
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' kann nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1085 builtin/checkout.c:1088 builtin/checkout.c:1093
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094
+#: builtin/checkout.c:1097
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' kann nicht mit '%s' verwendet werden"
 
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1102
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Kann Branch nicht zu Nicht-Commit '%s' wechseln"
 
-#: builtin/checkout.c:1134 builtin/checkout.c:1136 builtin/clone.c:83
-#: builtin/remote.c:159 builtin/remote.c:161 builtin/worktree.c:317
-#: builtin/worktree.c:319
+#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320
+#: builtin/worktree.c:322
 msgid "branch"
 msgstr "Branch"
 
-#: builtin/checkout.c:1135
+#: builtin/checkout.c:1136
 msgid "create and checkout a new branch"
 msgstr "einen neuen Branch erzeugen und auschecken"
 
-#: builtin/checkout.c:1137
+#: builtin/checkout.c:1138
 msgid "create/reset and checkout a branch"
 msgstr "einen Branch erstellen/umsetzen und auschecken"
 
-#: builtin/checkout.c:1138
+#: builtin/checkout.c:1139
 msgid "create reflog for new branch"
 msgstr "das Reflog für den neuen Branch erzeugen"
 
-#: builtin/checkout.c:1139
+#: builtin/checkout.c:1140
 msgid "detach the HEAD at named commit"
 msgstr "HEAD zu benanntem Commit setzen"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "set upstream info for new branch"
 msgstr "Informationen zum Upstream-Branch für den neuen Branch setzen"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new-branch"
 msgstr "neuer Branch"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new unparented branch"
 msgstr "neuer Branch ohne Eltern-Commit"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "checkout our version for unmerged files"
 msgstr "unsere Variante für nicht zusammengeführte Dateien auschecken"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "checkout their version for unmerged files"
 msgstr "ihre Variante für nicht zusammengeführte Dateien auschecken"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1148
 msgid "force checkout (throw away local modifications)"
 msgstr "Auschecken erzwingen (verwirft lokale Änderungen)"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "perform a 3-way merge with the new branch"
 msgstr "einen 3-Wege-Merge mit dem neuen Branch ausführen"
 
-#: builtin/checkout.c:1149 builtin/merge.c:227
+#: builtin/checkout.c:1150 builtin/merge.c:227
 msgid "update ignored files (default)"
 msgstr "ignorierte Dateien aktualisieren (Standard)"
 
-#: builtin/checkout.c:1150 builtin/log.c:1264 parse-options.h:249
+#: builtin/checkout.c:1151 builtin/log.c:1266 parse-options.h:250
 msgid "style"
 msgstr "Stil"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "conflict style (merge or diff3)"
 msgstr "Konfliktstil (merge oder diff3)"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "keine Einschränkung bei Pfadspezifikationen zum partiellen Auschecken"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1157
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "second guess 'git checkout <no-such-branch>'"
 
-#: builtin/checkout.c:1158
+#: builtin/checkout.c:1159
 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:1181
+#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112
+#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:558
+#: builtin/send-pack.c:168
+msgid "force progress reporting"
+msgstr "Fortschrittsanzeige erzwingen"
+
+#: builtin/checkout.c:1191
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "Die Optionen -b, -B und --orphan schließen sich gegenseitig aus."
 
-#: builtin/checkout.c:1198
+#: builtin/checkout.c:1208
 msgid "--track needs a branch name"
 msgstr "Bei der Option --track muss ein Branchname angegeben werden."
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1213
 msgid "Missing branch name; try -b"
 msgstr "Vermisse Branchnamen; versuchen Sie -b"
 
-#: builtin/checkout.c:1239
+#: builtin/checkout.c:1249
 msgid "invalid path specification"
 msgstr "ungültige Pfadspezifikation"
 
-#: builtin/checkout.c:1246
+#: builtin/checkout.c:1256
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4353,12 +4400,12 @@
 "Haben Sie beabsichtigt '%s' auszuchecken, welcher nicht als Commit aufgelöst "
 "werden kann?"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1261
 #, 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:1255
+#: builtin/checkout.c:1265
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4397,7 +4444,7 @@
 msgid "failed to remove %s"
 msgstr "Fehler beim Löschen von %s"
 
-#: builtin/clean.c:317
+#: builtin/clean.c:315
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -4409,7 +4456,7 @@
 "foo        - Element anhand eines eindeutigen Präfix auswählen\n"
 "           - (leer) nichts auswählen"
 
-#: builtin/clean.c:321
+#: builtin/clean.c:319
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -4429,36 +4476,36 @@
 "*          - alle Elemente auswählen\n"
 "           - (leer) Auswahl beenden"
 
-#: builtin/clean.c:537
+#: builtin/clean.c:535
 #, c-format
 msgid "Huh (%s)?"
 msgstr "Wie bitte (%s)?"
 
-#: builtin/clean.c:679
+#: builtin/clean.c:677
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Ignorier-Muster eingeben>> "
 
-#: builtin/clean.c:716
+#: builtin/clean.c:714
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "WARNUNG: Kann keine Einträge finden die Muster entsprechen: %s"
 
-#: builtin/clean.c:737
+#: builtin/clean.c:735
 msgid "Select items to delete"
 msgstr "Wählen Sie Einträge zum Löschen"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:778
+#: builtin/clean.c:776
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "'%s' löschen [y/N]? "
 
-#: builtin/clean.c:803
+#: builtin/clean.c:801
 msgid "Bye."
 msgstr "Tschüss."
 
-#: builtin/clean.c:811
+#: builtin/clean.c:809
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -4476,62 +4523,62 @@
 "help                - diese Meldung anzeigen\n"
 "?                   - Hilfe zur Auswahl mittels Eingabe anzeigen"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:836
 msgid "*** Commands ***"
 msgstr "*** Kommandos ***"
 
-#: builtin/clean.c:839
+#: builtin/clean.c:837
 msgid "What now"
 msgstr "Was nun"
 
-#: builtin/clean.c:847
+#: builtin/clean.c:845
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Würde das folgende Element entfernen:"
 msgstr[1] "Würde die folgenden Elemente entfernen:"
 
-#: builtin/clean.c:864
+#: builtin/clean.c:862
 msgid "No more files to clean, exiting."
 msgstr "Keine Dateien mehr zum Löschen, beende."
 
-#: builtin/clean.c:895
+#: builtin/clean.c:893
 msgid "do not print names of files removed"
 msgstr "keine Namen von gelöschten Dateien ausgeben"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:895
 msgid "force"
 msgstr "Aktion erzwingen"
 
-#: builtin/clean.c:898
+#: builtin/clean.c:896
 msgid "interactive cleaning"
 msgstr "interaktives Clean"
 
-#: builtin/clean.c:900
+#: builtin/clean.c:898
 msgid "remove whole directories"
 msgstr "ganze Verzeichnisse löschen"
 
-#: builtin/clean.c:901 builtin/describe.c:407 builtin/grep.c:714
-#: builtin/ls-files.c:443 builtin/name-rev.c:311 builtin/show-ref.c:187
+#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709
+#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182
 msgid "pattern"
 msgstr "Muster"
 
-#: builtin/clean.c:902
+#: builtin/clean.c:900
 msgid "add <pattern> to ignore rules"
 msgstr "<Muster> zu den Regeln für ignorierte Pfade hinzufügen"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:901
 msgid "remove ignored files, too"
 msgstr "auch ignorierte Dateien löschen"
 
-#: builtin/clean.c:905
+#: builtin/clean.c:903
 msgid "remove only ignored files"
 msgstr "nur ignorierte Dateien löschen"
 
-#: builtin/clean.c:923
+#: builtin/clean.c:921
 msgid "-x and -X cannot be used together"
 msgstr "Die Optionen -x und -X können nicht gemeinsam verwendet werden."
 
-#: builtin/clean.c:927
+#: builtin/clean.c:925
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -4539,7 +4586,7 @@
 "clean.requireForce auf \"true\" gesetzt und weder -i, -n noch -f gegeben; "
 "\"clean\" verweigert"
 
-#: builtin/clean.c:930
+#: builtin/clean.c:928
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -4551,16 +4598,11 @@
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<Optionen>] [--] <Repository> [<Verzeichnis>]"
 
-#: builtin/clone.c:57 builtin/fetch.c:112 builtin/merge.c:224
-#: builtin/pull.c:109 builtin/push.c:560 builtin/send-pack.c:168
-msgid "force progress reporting"
-msgstr "Fortschrittsanzeige erzwingen"
-
 #: builtin/clone.c:59
 msgid "don't create a checkout"
 msgstr "kein Auschecken"
 
-#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:504
+#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469
 msgid "create a bare repository"
 msgstr "ein Bare-Repository erstellen"
 
@@ -4584,15 +4626,15 @@
 msgid "initialize submodules in the clone"
 msgstr "Submodule im Klon initialisieren"
 
-#: builtin/clone.c:75 builtin/init-db.c:501
+#: builtin/clone.c:75 builtin/init-db.c:466
 msgid "template-directory"
 msgstr "Vorlagenverzeichnis"
 
-#: builtin/clone.c:76 builtin/init-db.c:502
+#: builtin/clone.c:76 builtin/init-db.c:467
 msgid "directory from which templates will be used"
 msgstr "Verzeichnis, von welchem die Vorlagen verwendet werden"
 
-#: builtin/clone.c:78
+#: builtin/clone.c:78 builtin/submodule--helper.c:179
 msgid "reference repository"
 msgstr "Repository referenzieren"
 
@@ -4616,7 +4658,7 @@
 msgid "path to git-upload-pack on the remote"
 msgstr "Pfad zu \"git-upload-pack\" auf der Gegenseite"
 
-#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:659
+#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654
 #: builtin/pull.c:186
 msgid "depth"
 msgstr "Tiefe"
@@ -4630,11 +4672,11 @@
 msgid "clone only one branch, HEAD or --branch"
 msgstr "nur einen Branch klonen, HEAD oder --branch"
 
-#: builtin/clone.c:91 builtin/init-db.c:510
+#: builtin/clone.c:91 builtin/init-db.c:475
 msgid "gitdir"
 msgstr ".git-Verzeichnis"
 
-#: builtin/clone.c:92 builtin/init-db.c:511
+#: builtin/clone.c:92 builtin/init-db.c:476
 msgid "separate git dir from working tree"
 msgstr "Git-Verzeichnis vom Arbeitsverzeichnis separieren"
 
@@ -4646,55 +4688,61 @@
 msgid "set config inside the new repository"
 msgstr "Konfiguration innerhalb des neuen Repositories setzen"
 
-#: builtin/clone.c:298
+#: builtin/clone.c:300
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "Referenziertes Repository '%s' wird noch nicht als verknüpftes\n"
+"Arbeitsverzeichnis unterstützt."
+
+#: builtin/clone.c:302
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr "Referenziertes Repository '%s' ist kein lokales Repository."
 
-#: builtin/clone.c:302
+#: builtin/clone.c:307
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr ""
 "Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)."
 
-#: builtin/clone.c:305
+#: builtin/clone.c:310
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr ""
 "Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") "
 "eingehängt."
 
-#: builtin/clone.c:370 builtin/diff.c:84
+#: builtin/clone.c:375 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "Konnte '%s' nicht lesen"
 
-#: builtin/clone.c:372
+#: builtin/clone.c:377
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existiert und ist kein Verzeichnis"
 
-#: builtin/clone.c:386
+#: builtin/clone.c:391
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "Konnte %s nicht lesen\n"
 
-#: builtin/clone.c:408
+#: builtin/clone.c:413
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "Konnte Verweis '%s' nicht erstellen"
 
-#: builtin/clone.c:412
+#: builtin/clone.c:417
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "Konnte Datei nicht nach '%s' kopieren"
 
-#: builtin/clone.c:435 builtin/clone.c:619
+#: builtin/clone.c:442 builtin/clone.c:626
 #, c-format
 msgid "done.\n"
 msgstr "Fertig.\n"
 
-#: builtin/clone.c:447
+#: builtin/clone.c:454
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -4704,127 +4752,123 @@
 "Sie können mit 'git status' prüfen, was ausgecheckt worden ist\n"
 "und das Auschecken mit 'git checkout -f HEAD' erneut versuchen.\n"
 
-#: builtin/clone.c:524
+#: builtin/clone.c:531
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Konnte zu klonenden Remote-Branch %s nicht finden."
 
-#: builtin/clone.c:614
+#: builtin/clone.c:621
 #, c-format
 msgid "Checking connectivity... "
 msgstr "Prüfe Konnektivität ... "
 
-#: builtin/clone.c:617
+#: builtin/clone.c:624
 msgid "remote did not send all necessary objects"
 msgstr "Remote-Repository hat nicht alle erforderlichen Objekte gesendet."
 
-#: builtin/clone.c:681
+#: builtin/clone.c:688
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "Externer HEAD bezieht sich auf eine nicht existierende Referenz und kann "
 "nicht ausgecheckt werden.\n"
 
-#: builtin/clone.c:712
+#: builtin/clone.c:719
 msgid "unable to checkout working tree"
 msgstr "Arbeitsverzeichnis konnte nicht ausgecheckt werden"
 
-#: builtin/clone.c:799
+#: builtin/clone.c:808
 msgid "cannot repack to clean up"
 msgstr "Kann \"repack\" zum Aufräumen nicht aufrufen"
 
-#: builtin/clone.c:801
+#: builtin/clone.c:810
 msgid "cannot unlink temporary alternates file"
 msgstr "Kann temporäre \"alternates\"-Datei nicht entfernen"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:842
 msgid "Too many arguments."
 msgstr "Zu viele Argumente."
 
-#: builtin/clone.c:835
+#: builtin/clone.c:846
 msgid "You must specify a repository to clone."
 msgstr "Sie müssen ein Repository zum Klonen angeben."
 
-#: builtin/clone.c:846
+#: builtin/clone.c:857
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "Die Optionen --bare und --origin %s sind inkompatibel."
 
-#: builtin/clone.c:849
+#: builtin/clone.c:860
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "Die Optionen --bare und --separate-git-dir sind inkompatibel."
 
-#: builtin/clone.c:862
+#: builtin/clone.c:873
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "Repository '%s' existiert nicht."
 
-#: builtin/clone.c:868 builtin/fetch.c:1168
+#: builtin/clone.c:879 builtin/fetch.c:1166
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "Tiefe %s ist keine positive Zahl"
 
-#: builtin/clone.c:878
+#: builtin/clone.c:889
 #, 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:888
+#: builtin/clone.c:899
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "Arbeitsverzeichnis '%s' existiert bereits."
 
-#: builtin/clone.c:903 builtin/clone.c:914 builtin/worktree.c:218
-#: builtin/worktree.c:245
+#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224
+#: builtin/worktree.c:221 builtin/worktree.c:248
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "Konnte führende Verzeichnisse von '%s' nicht erstellen."
 
-#: builtin/clone.c:906
+#: builtin/clone.c:917
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "Konnte Arbeitsverzeichnis '%s' nicht erstellen"
 
-#: builtin/clone.c:924
+#: builtin/clone.c:935
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Klone in Bare-Repository '%s' ...\n"
 
-#: builtin/clone.c:926
+#: builtin/clone.c:937
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Klone nach '%s' ...\n"
 
-#: builtin/clone.c:951
-msgid "--dissociate given, but there is no --reference"
-msgstr "--dissociate ohne --reference angegeben"
-
-#: builtin/clone.c:968
+#: builtin/clone.c:975
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 "Die Option --depth wird in lokalen Klonen ignoriert; benutzen Sie "
 "stattdessen file://"
 
-#: builtin/clone.c:971
+#: builtin/clone.c:978
 msgid "source repository is shallow, ignoring --local"
 msgstr ""
 "Quelle ist ein Repository mit unvollständiger Historie (shallow),ignoriere --"
 "local"
 
-#: builtin/clone.c:976
+#: builtin/clone.c:983
 msgid "--local is ignored"
 msgstr "--local wird ignoriert"
 
-#: builtin/clone.c:980
+#: builtin/clone.c:987
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Weiß nicht wie %s zu klonen ist."
 
-#: builtin/clone.c:1029 builtin/clone.c:1037
+#: builtin/clone.c:1036 builtin/clone.c:1044
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Remote-Branch %s nicht im Upstream-Repository %s gefunden"
 
-#: builtin/clone.c:1040
+#: builtin/clone.c:1047
 msgid "You appear to have cloned an empty repository."
 msgstr "Sie scheinen ein leeres Repository geklont zu haben."
 
@@ -4860,15 +4904,15 @@
 msgid "--command must be the first argument"
 msgstr "Die Option --command muss an erster Stelle stehen."
 
-#: builtin/commit.c:37
+#: builtin/commit.c:38
 msgid "git commit [<options>] [--] <pathspec>..."
 msgstr "git commit [<Optionen>] [--] <Pfadspezifikation>..."
 
-#: builtin/commit.c:42
+#: builtin/commit.c:43
 msgid "git status [<options>] [--] <pathspec>..."
 msgstr "git status [<Optionen>] [--] <Pfadspezifikation>..."
 
-#: builtin/commit.c:47
+#: builtin/commit.c:48
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4896,7 +4940,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:60
+#: builtin/commit.c:61
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4922,7 +4966,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:72
+#: builtin/commit.c:73
 msgid ""
 "You asked to amend the most recent commit, but doing so would make\n"
 "it empty. You can repeat your command with --allow-empty, or you can\n"
@@ -4932,7 +4976,7 @@
 "machen. Sie können Ihr Kommando mit --allow-empty wiederholen, oder diesen\n"
 "Commit mit \"git reset HEAD^\" vollständig entfernen.\n"
 
-#: builtin/commit.c:77
+#: builtin/commit.c:78
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4947,11 +4991,11 @@
 "    git commit --allow-empty\n"
 "\n"
 
-#: builtin/commit.c:84
+#: builtin/commit.c:85
 msgid "Otherwise, please use 'git reset'\n"
 msgstr "Andernfalls benutzen Sie bitte 'git reset'\n"
 
-#: builtin/commit.c:87
+#: builtin/commit.c:88
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4967,67 +5011,67 @@
 "Benutzen Sie anschließend \"git cherry-pick --continue\", um die\n"
 "Cherry-Pick-Operation mit den verbleibenden Commits fortzusetzen.\n"
 
-#: builtin/commit.c:304
+#: builtin/commit.c:305
 msgid "failed to unpack HEAD tree object"
 msgstr "Fehler beim Entpacken des \"Tree\"-Objektes von HEAD."
 
-#: builtin/commit.c:345
+#: builtin/commit.c:346
 msgid "unable to create temporary index"
 msgstr "Konnte temporären Index nicht erstellen."
 
-#: builtin/commit.c:351
+#: builtin/commit.c:352
 msgid "interactive add failed"
 msgstr "interaktives Hinzufügen fehlgeschlagen"
 
-#: builtin/commit.c:364
+#: builtin/commit.c:365
 msgid "unable to update temporary index"
 msgstr "Konnte temporären Index nicht aktualisieren."
 
-#: builtin/commit.c:366
+#: builtin/commit.c:367
 msgid "Failed to update main cache tree"
 msgstr "Konnte Haupt-Cache-Verzeichnis nicht aktualisieren"
 
-#: builtin/commit.c:390 builtin/commit.c:413 builtin/commit.c:462
+#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
 msgid "unable to write new_index file"
 msgstr "Konnte new_index Datei nicht schreiben"
 
-#: builtin/commit.c:444
+#: builtin/commit.c:445
 msgid "cannot do a partial commit during a merge."
 msgstr "Kann keinen Teil-Commit durchführen, während ein Merge im Gange ist."
 
-#: builtin/commit.c:446
+#: builtin/commit.c:447
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr ""
 "Kann keinen Teil-Commit durchführen, während \"cherry-pick\" im Gange ist."
 
-#: builtin/commit.c:455
+#: builtin/commit.c:456
 msgid "cannot read the index"
 msgstr "Kann Index nicht lesen"
 
-#: builtin/commit.c:474
+#: builtin/commit.c:475
 msgid "unable to write temporary index file"
 msgstr "Konnte temporäre Index-Datei nicht schreiben."
 
-#: builtin/commit.c:579
+#: builtin/commit.c:580
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "Commit '%s' fehlt Autor-Kopfbereich"
 
-#: builtin/commit.c:581
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "Commit '%s' hat fehlerhafte Autor-Zeile"
 
-#: builtin/commit.c:600
+#: builtin/commit.c:601
 msgid "malformed --author parameter"
 msgstr "Fehlerhafter --author Parameter"
 
-#: builtin/commit.c:608
+#: builtin/commit.c:609
 #, c-format
 msgid "invalid date format: %s"
 msgstr "Ungültiges Datumsformat: %s"
 
-#: builtin/commit.c:652
+#: builtin/commit.c:653
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5035,38 +5079,38 @@
 "Konnte kein Kommentar-Zeichen auswählen, das nicht in\n"
 "der aktuellen Commit-Beschreibung verwendet wird."
 
-#: builtin/commit.c:689 builtin/commit.c:722 builtin/commit.c:1079
+#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "Konnte Commit %s nicht nachschlagen"
 
-#: builtin/commit.c:701 builtin/shortlog.c:273
+#: builtin/commit.c:702 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(lese Log-Nachricht von Standard-Eingabe)\n"
 
-#: builtin/commit.c:703
+#: builtin/commit.c:704
 msgid "could not read log from standard input"
 msgstr "Konnte Log nicht von Standard-Eingabe lesen."
 
-#: builtin/commit.c:707
+#: builtin/commit.c:708
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "Konnte Log-Datei '%s' nicht lesen"
 
-#: builtin/commit.c:729
+#: builtin/commit.c:730
 msgid "could not read MERGE_MSG"
 msgstr "Konnte MERGE_MSG nicht lesen"
 
-#: builtin/commit.c:733
+#: builtin/commit.c:734
 msgid "could not read SQUASH_MSG"
 msgstr "Konnte SQUASH_MSG nicht lesen"
 
-#: builtin/commit.c:784
+#: builtin/commit.c:785
 msgid "could not write commit template"
 msgstr "Konnte Commit-Vorlage nicht schreiben"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:803
 #, c-format
 msgid ""
 "\n"
@@ -5081,7 +5125,7 @@
 "\t%s\n"
 "und versuchen Sie es erneut.\n"
 
-#: builtin/commit.c:807
+#: builtin/commit.c:808
 #, c-format
 msgid ""
 "\n"
@@ -5096,7 +5140,7 @@
 "\t%s\n"
 "und versuchen Sie es erneut.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:821
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5106,7 +5150,7 @@
 "die mit '%c' beginnen, werden ignoriert, und eine leere Beschreibung\n"
 "bricht den Commit ab.\n"
 
-#: builtin/commit.c:827
+#: builtin/commit.c:828
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5119,156 +5163,157 @@
 "entfernen.\n"
 "Eine leere Beschreibung bricht den Commit ab.\n"
 
-#: builtin/commit.c:847
+#: builtin/commit.c:848
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAutor:           %.*s <%.*s>"
 
-#: builtin/commit.c:855
+#: builtin/commit.c:856
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sDatum:            %s"
 
-#: builtin/commit.c:862
+#: builtin/commit.c:863
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sCommit-Ersteller: %.*s <%.*s>"
 
-#: builtin/commit.c:880
+#: builtin/commit.c:881
 msgid "Cannot read index"
 msgstr "Kann Index nicht lesen"
 
-#: builtin/commit.c:937
+#: builtin/commit.c:938
 msgid "Error building trees"
 msgstr "Fehler beim Erzeugen der \"Tree\"-Objekte"
 
-#: builtin/commit.c:952 builtin/tag.c:495
+#: builtin/commit.c:953 builtin/tag.c:266
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr ""
 "Bitte liefern Sie eine Beschreibung entweder mit der Option -m oder -F.\n"
 
-#: builtin/commit.c:1054
+#: builtin/commit.c:1055
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' ist nicht im Format 'Name <E-Mail>' und stimmt mit keinem "
 "vorhandenen Autor überein"
 
-#: builtin/commit.c:1069 builtin/commit.c:1309
+#: builtin/commit.c:1070 builtin/commit.c:1310
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Ungültiger Modus '%s' für unversionierte Dateien"
 
-#: builtin/commit.c:1106
+#: builtin/commit.c:1107
 msgid "--long and -z are incompatible"
 msgstr "Die Optionen --long und -z sind inkompatibel."
 
-#: builtin/commit.c:1136
+#: builtin/commit.c:1137
 msgid "Using both --reset-author and --author does not make sense"
 msgstr ""
 "Die Optionen --reset-author und --author können nicht gemeinsam verwendet "
 "werden."
 
-#: builtin/commit.c:1145
+#: builtin/commit.c:1146
 msgid "You have nothing to amend."
 msgstr "Sie haben nichts für \"--amend\"."
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1149
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Ein Merge ist im Gange -- kann \"--amend\" nicht ausführen."
 
-#: builtin/commit.c:1150
+#: builtin/commit.c:1151
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "\"cherry-pick\" ist im Gange -- kann \"--amend\" nicht ausführen."
 
-#: builtin/commit.c:1153
+#: builtin/commit.c:1154
 msgid "Options --squash and --fixup cannot be used together"
 msgstr ""
 "Die Optionen --squash und --fixup können nicht gemeinsam verwendet werden."
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1164
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Es kann nur eine Option von -c/-C/-F/--fixup verwendet werden."
 
-#: builtin/commit.c:1165
+#: builtin/commit.c:1166
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Die Option -m kann nicht mit -c/-C/-F/--fixup kombiniert werden."
 
-#: builtin/commit.c:1173
+#: builtin/commit.c:1174
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr ""
 "Die Option --reset--author kann nur mit -C, -c oder --amend verwendet werden."
 
-#: builtin/commit.c:1190
+#: builtin/commit.c:1191
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Es kann nur eine Option von --include/--only/--all/--interactive/--patch "
 "verwendet werden."
 
-#: builtin/commit.c:1192
+#: builtin/commit.c:1193
 msgid "No paths with --include/--only does not make sense."
 msgstr ""
 "Die Optionen --include und --only können nur mit der Angabe von Pfaden "
 "verwendet werden."
 
-#: builtin/commit.c:1194
+#: builtin/commit.c:1195
 msgid "Clever... amending the last one with dirty index."
 msgstr "Klug ... den letzten Commit mit einem geänderten Index nachbessern."
 
-#: builtin/commit.c:1196
+#: builtin/commit.c:1197
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "Explizite Pfade ohne -i oder -o angegeben; nehme --only an"
 
-#: builtin/commit.c:1208 builtin/tag.c:730
+#: builtin/commit.c:1209 builtin/tag.c:475
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Ungültiger \"cleanup\" Modus %s"
 
-#: builtin/commit.c:1213
+#: builtin/commit.c:1214
 msgid "Paths with -a does not make sense."
 msgstr "Die Option -a kann nicht mit der Angabe von Pfaden verwendet werden."
 
-#: builtin/commit.c:1323 builtin/commit.c:1602
+#: builtin/commit.c:1324 builtin/commit.c:1605
 msgid "show status concisely"
 msgstr "Status im Kurzformat anzeigen"
 
-#: builtin/commit.c:1325 builtin/commit.c:1604
+#: builtin/commit.c:1326 builtin/commit.c:1607
 msgid "show branch information"
 msgstr "Branchinformationen anzeigen"
 
-#: builtin/commit.c:1327 builtin/commit.c:1606 builtin/push.c:546
+#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:544
+#: builtin/worktree.c:423
 msgid "machine-readable output"
 msgstr "maschinenlesbare Ausgabe"
 
-#: builtin/commit.c:1330 builtin/commit.c:1608
+#: builtin/commit.c:1331 builtin/commit.c:1611
 msgid "show status in long format (default)"
 msgstr "Status im Langformat anzeigen (Standard)"
 
-#: builtin/commit.c:1333 builtin/commit.c:1611
+#: builtin/commit.c:1334 builtin/commit.c:1614
 msgid "terminate entries with NUL"
 msgstr "Einträge mit NUL-Zeichen abschließen"
 
-#: builtin/commit.c:1335 builtin/commit.c:1614 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:604
+#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:353
 msgid "mode"
 msgstr "Modus"
 
-#: builtin/commit.c:1336 builtin/commit.c:1614
+#: builtin/commit.c:1337 builtin/commit.c:1617
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "unversionierte Dateien anzeigen, optionale Modi: all, normal, no. (Standard: "
 "all)"
 
-#: builtin/commit.c:1339
+#: builtin/commit.c:1340
 msgid "show ignored files"
 msgstr "ignorierte Dateien anzeigen"
 
-#: builtin/commit.c:1340 parse-options.h:155
+#: builtin/commit.c:1341 parse-options.h:155
 msgid "when"
 msgstr "wann"
 
-#: builtin/commit.c:1341
+#: builtin/commit.c:1342
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -5276,198 +5321,203 @@
 "Änderungen in Submodulen ignorieren, optional wenn: all, dirty, untracked. "
 "(Standard: all)"
 
-#: builtin/commit.c:1343
+#: builtin/commit.c:1344
 msgid "list untracked files in columns"
 msgstr "unversionierte Dateien in Spalten auflisten"
 
-#: builtin/commit.c:1429
+#: builtin/commit.c:1430
 msgid "couldn't look up newly created commit"
 msgstr "Konnte neu erstellten Commit nicht nachschlagen."
 
-#: builtin/commit.c:1431
+#: builtin/commit.c:1432
 msgid "could not parse newly created commit"
 msgstr "Konnte neulich erstellten Commit nicht analysieren."
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1477
 msgid "detached HEAD"
 msgstr "losgelöster HEAD"
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1480
 msgid " (root-commit)"
 msgstr " (Basis-Commit)"
 
-#: builtin/commit.c:1572
+#: builtin/commit.c:1575
 msgid "suppress summary after successful commit"
 msgstr "Zusammenfassung nach erfolgreichem Commit unterdrücken"
 
-#: builtin/commit.c:1573
+#: builtin/commit.c:1576
 msgid "show diff in commit message template"
 msgstr "Unterschiede in Commit-Beschreibungsvorlage anzeigen"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1578
 msgid "Commit message options"
 msgstr "Optionen für Commit-Beschreibung"
 
-#: builtin/commit.c:1576 builtin/tag.c:602
+#: builtin/commit.c:1579 builtin/tag.c:351
 msgid "read message from file"
 msgstr "Beschreibung von Datei lesen"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "author"
 msgstr "Autor"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "override author for commit"
 msgstr "Autor eines Commits überschreiben"
 
-#: builtin/commit.c:1578 builtin/gc.c:268
+#: builtin/commit.c:1581 builtin/gc.c:326
 msgid "date"
 msgstr "Datum"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1581
 msgid "override date for commit"
 msgstr "Datum eines Commits überschreiben"
 
-#: builtin/commit.c:1579 builtin/merge.c:218 builtin/notes.c:392
-#: builtin/notes.c:555 builtin/tag.c:600
+#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392
+#: builtin/notes.c:555 builtin/tag.c:349
 msgid "message"
 msgstr "Beschreibung"
 
-#: builtin/commit.c:1579
+#: builtin/commit.c:1582
 msgid "commit message"
 msgstr "Commit-Beschreibung"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
+#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
+msgid "commit"
+msgstr "Commit"
+
+#: builtin/commit.c:1583
 msgid "reuse and edit message from specified commit"
 msgstr "Beschreibung des angegebenen Commits wiederverwenden und editieren"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1584
 msgid "reuse message from specified commit"
 msgstr "Beschreibung des angegebenen Commits wiederverwenden"
 
-#: builtin/commit.c:1582
+#: builtin/commit.c:1585
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "eine automatisch zusammengesetzte Beschreibung zum Nachbessern des "
 "angegebenen Commits verwenden"
 
-#: builtin/commit.c:1583
+#: builtin/commit.c:1586
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "eine automatisch zusammengesetzte Beschreibung beim \"squash\" des "
 "angegebenen Commits verwenden"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1587
 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:1585 builtin/log.c:1216 builtin/revert.c:86
+#: builtin/commit.c:1588 builtin/log.c:1216 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "'Signed-off-by:'-Zeile hinzufügen"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1589
 msgid "use specified template file"
 msgstr "angegebene Vorlagendatei verwenden"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1590
 msgid "force edit of commit"
 msgstr "Bearbeitung des Commits erzwingen"
 
-#: builtin/commit.c:1588
+#: builtin/commit.c:1591
 msgid "default"
 msgstr "Standard"
 
-#: builtin/commit.c:1588 builtin/tag.c:605
+#: builtin/commit.c:1591 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr ""
 "wie Leerzeichen und #Kommentare von der Beschreibung getrennt werden sollen"
 
-#: builtin/commit.c:1589
+#: builtin/commit.c:1592
 msgid "include status in commit message template"
 msgstr "Status in die Commit-Beschreibungsvorlage einfügen"
 
-#: builtin/commit.c:1591 builtin/merge.c:226 builtin/pull.c:156
+#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "Commit mit GPG signieren"
 
-#: builtin/commit.c:1594
+#: builtin/commit.c:1597
 msgid "Commit contents options"
 msgstr "Optionen für Commit-Inhalt"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1598
 msgid "commit all changed files"
 msgstr "alle geänderten Dateien committen"
 
-#: builtin/commit.c:1596
+#: builtin/commit.c:1599
 msgid "add specified files to index for commit"
 msgstr "die angegebenen Dateien zusätzlich zum Commit vormerken"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1600
 msgid "interactively add files"
 msgstr "interaktives Hinzufügen von Dateien"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1601
 msgid "interactively add changes"
 msgstr "interaktives Hinzufügen von Änderungen"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1602
 msgid "commit only specified files"
 msgstr "nur die angegebenen Dateien committen"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1603
 msgid "bypass pre-commit hook"
 msgstr "\"pre-commit hook\" umgehen"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1604
 msgid "show what would be committed"
 msgstr "anzeigen, was committet werden würde"
 
-#: builtin/commit.c:1612
+#: builtin/commit.c:1615
 msgid "amend previous commit"
 msgstr "vorherigen Commit ändern"
 
-#: builtin/commit.c:1613
+#: builtin/commit.c:1616
 msgid "bypass post-rewrite hook"
 msgstr "\"post-rewrite hook\" umgehen"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1621
 msgid "ok to record an empty change"
 msgstr "Aufzeichnung einer leeren Änderung erlauben"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1623
 msgid "ok to record a change with an empty message"
 msgstr "Aufzeichnung einer Änderung mit einer leeren Beschreibung erlauben"
 
-#: builtin/commit.c:1649
+#: builtin/commit.c:1652
 msgid "could not parse HEAD commit"
 msgstr "Konnte Commit von HEAD nicht analysieren."
 
-#: builtin/commit.c:1695
+#: builtin/commit.c:1698
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Beschädigte MERGE_HEAD-Datei (%s)"
 
-#: builtin/commit.c:1702
+#: builtin/commit.c:1705
 msgid "could not read MERGE_MODE"
 msgstr "Konnte MERGE_MODE nicht lesen"
 
-#: builtin/commit.c:1721
+#: builtin/commit.c:1724
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "Konnte Commit-Beschreibung nicht lesen: %s"
 
-#: builtin/commit.c:1732
+#: builtin/commit.c:1735
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Commit abgebrochen; Sie haben die Beschreibung nicht editiert.\n"
 
-#: builtin/commit.c:1737
+#: builtin/commit.c:1740
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Commit aufgrund leerer Beschreibung abgebrochen.\n"
 
-#: builtin/commit.c:1785
+#: builtin/commit.c:1788
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -5606,11 +5656,11 @@
 msgid "respect include directives on lookup"
 msgstr "beachtet \"include\"-Direktiven beim Nachschlagen"
 
-#: builtin/config.c:311
+#: builtin/config.c:303
 msgid "unable to parse default color value"
 msgstr "konnte Standard-Farbwert nicht parsen"
 
-#: builtin/config.c:449
+#: builtin/config.c:441
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5625,16 +5675,16 @@
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:583
+#: builtin/config.c:575
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "Konnte Konfigurationsdatei '%s' nicht erstellen."
 
-#: builtin/count-objects.c:55
+#: builtin/count-objects.c:77
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:65
+#: builtin/count-objects.c:87
 msgid "print sizes in human readable format"
 msgstr "gibt Größenangaben in menschenlesbaren Format aus"
 
@@ -5754,7 +5804,7 @@
 msgid "only consider tags matching <pattern>"
 msgstr "nur Tags, die <Muster> entsprechen, betrachten"
 
-#: builtin/describe.c:410 builtin/name-rev.c:318
+#: builtin/describe.c:410 builtin/name-rev.c:314
 msgid "show abbreviated commit object as fallback"
 msgstr "gekürztes Commit-Objekt anzeigen, wenn sonst nichts zutrifft"
 
@@ -5979,7 +6029,7 @@
 msgstr ""
 "! %-*s %-*s -> %s  (kann \"fetch\" im aktuellen Branch nicht ausführen)"
 
-#: builtin/fetch.c:478 builtin/fetch.c:564
+#: builtin/fetch.c:478 builtin/fetch.c:566
 msgid "[rejected]"
 msgstr "[zurückgewiesen]"
 
@@ -6003,41 +6053,41 @@
 msgid "[new ref]"
 msgstr "[neue Referenz]"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "unable to update local ref"
 msgstr "kann lokale Referenz nicht aktualisieren"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "forced update"
 msgstr "Aktualisierung erzwungen"
 
-#: builtin/fetch.c:566
+#: builtin/fetch.c:568
 msgid "(non-fast-forward)"
 msgstr "(kein Vorspulen)"
 
-#: builtin/fetch.c:600 builtin/fetch.c:842
+#: builtin/fetch.c:602 builtin/fetch.c:843
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "kann %s nicht öffnen: %s\n"
 
-#: builtin/fetch.c:609
+#: builtin/fetch.c:611
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s hat nicht alle erforderlichen Objekte gesendet\n"
 
-#: builtin/fetch.c:627
+#: builtin/fetch.c:629
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 "%s wurde zurückgewiesen, da Ursprungs-Commits von Repositoriesmit "
 "unvollständiger Historie (shallow) nicht aktualisiert werden dürfen."
 
-#: builtin/fetch.c:715 builtin/fetch.c:807
+#: builtin/fetch.c:716 builtin/fetch.c:808
 #, c-format
 msgid "From %.*s\n"
 msgstr "Von %.*s\n"
 
-#: builtin/fetch.c:726
+#: builtin/fetch.c:727
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6046,57 +6096,57 @@
 "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:778
+#: builtin/fetch.c:779
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s wird unreferenziert)"
 
-#: builtin/fetch.c:779
+#: builtin/fetch.c:780
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s wurde unreferenziert)"
 
-#: builtin/fetch.c:811
+#: builtin/fetch.c:812
 msgid "[deleted]"
 msgstr "[gelöscht]"
 
-#: builtin/fetch.c:812 builtin/remote.c:1034
+#: builtin/fetch.c:813 builtin/remote.c:1040
 msgid "(none)"
 msgstr "(nichts)"
 
-#: builtin/fetch.c:832
+#: builtin/fetch.c:833
 #, 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:851
+#: builtin/fetch.c:852
 #, 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:854
+#: builtin/fetch.c:855
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Option \"%s\" wird ignoriert für %s\n"
 
-#: builtin/fetch.c:910
+#: builtin/fetch.c:911
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Weiß nicht wie von %s angefordert wird."
 
-#: builtin/fetch.c:1071
+#: builtin/fetch.c:1072
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Fordere an von %s\n"
 
-#: builtin/fetch.c:1073 builtin/remote.c:90
+#: builtin/fetch.c:1074 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Konnte nicht von %s anfordern"
 
-#: builtin/fetch.c:1091
+#: builtin/fetch.c:1092
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -6105,35 +6155,35 @@
 "oder den Namen des Remote-Repositories an, von welchem neue\n"
 "Commits angefordert werden sollen."
 
-#: builtin/fetch.c:1114
+#: builtin/fetch.c:1115
 msgid "You need to specify a tag name."
 msgstr "Sie müssen den Namen des Tags angeben."
 
-#: builtin/fetch.c:1156
+#: builtin/fetch.c:1157
 msgid "--depth and --unshallow cannot be used together"
 msgstr ""
 "Die Optionen --depth und --unshallow können nicht gemeinsam verwendet werden."
 
-#: builtin/fetch.c:1158
+#: builtin/fetch.c:1159
 msgid "--unshallow on a complete repository does not make sense"
 msgstr ""
 "Die Option --unshallow kann nicht in einem Repository mit unvollständiger "
 "Historie verwendet werden."
 
-#: builtin/fetch.c:1181
+#: builtin/fetch.c:1179
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all akzeptiert kein Repository als Argument"
 
-#: builtin/fetch.c:1183
+#: builtin/fetch.c:1181
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all kann nicht mit Refspecs verwendet werden."
 
-#: builtin/fetch.c:1194
+#: builtin/fetch.c:1192
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Kein Remote-Repository (einzeln oder Gruppe): %s"
 
-#: builtin/fetch.c:1202
+#: builtin/fetch.c:1200
 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"
@@ -6146,23 +6196,23 @@
 "git fmt-merge-msg [-m <Beschreibung>] [--log[=<n>] | --no-log] [--file "
 "<Datei>]"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:667
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "Historie mit höchstens <n> Einträgen von \"shortlog\" hinzufügen"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:670
 msgid "alias for --log (deprecated)"
 msgstr "Alias für --log (veraltet)"
 
-#: builtin/fmt-merge-msg.c:676
+#: builtin/fmt-merge-msg.c:673
 msgid "text"
 msgstr "Text"
 
-#: builtin/fmt-merge-msg.c:677
+#: builtin/fmt-merge-msg.c:674
 msgid "use <text> as start of message"
 msgstr "<Text> als Beschreibungsanfang verwenden"
 
-#: builtin/fmt-merge-msg.c:678
+#: builtin/fmt-merge-msg.c:675
 msgid "file to read from"
 msgstr "Datei zum Einlesen"
 
@@ -6170,95 +6220,115 @@
 msgid "git for-each-ref [<options>] [<pattern>]"
 msgstr "git for-each-ref [<Optionen>] [<Muster>]"
 
-#: builtin/for-each-ref.c:24
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
+msgstr "git for-each-ref [--points-at <Objekt>]"
+
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<Objekt>]]"
+
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
+msgstr "git for-each-ref [--contains [<Objekt>]]"
+
+#: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
 msgstr "Platzhalter als Shell-String formatieren"
 
-#: builtin/for-each-ref.c:26
+#: builtin/for-each-ref.c:29
 msgid "quote placeholders suitably for perl"
 msgstr "Platzhalter als Perl-String formatieren"
 
-#: builtin/for-each-ref.c:28
+#: builtin/for-each-ref.c:31
 msgid "quote placeholders suitably for python"
 msgstr "Platzhalter als Python-String formatieren"
 
-#: builtin/for-each-ref.c:30
+#: builtin/for-each-ref.c:33
 msgid "quote placeholders suitably for Tcl"
 msgstr "Platzhalter als Tcl-String formatieren"
 
-#: builtin/for-each-ref.c:33
+#: builtin/for-each-ref.c:36
 msgid "show only <n> matched refs"
 msgstr "nur <n> passende Referenzen anzeigen"
 
-#: builtin/for-each-ref.c:34
+#: builtin/for-each-ref.c:37 builtin/tag.c:372
 msgid "format to use for the output"
 msgstr "für die Ausgabe zu verwendendes Format"
 
-#: builtin/for-each-ref.c:35
-msgid "key"
-msgstr "Schüssel"
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
+msgstr "nur auf dieses Objekt zeigende Referenzen ausgeben"
 
-#: builtin/for-each-ref.c:36
-msgid "field name to sort on"
-msgstr "sortiere nach diesem Feld"
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
+msgstr "nur zusammengeführte Referenzen ausgeben"
 
-#: builtin/fsck.c:163 builtin/prune.c:137
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr "nur nicht zusammengeführte Referenzen ausgeben"
+
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
+msgstr "nur Referenzen ausgeben, die diesen Commit enthalten"
+
+#: builtin/fsck.c:156 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr "Prüfe Konnektivität"
 
-#: builtin/fsck.c:568
+#: builtin/fsck.c:486
 msgid "Checking object directories"
 msgstr "Prüfe Objekt-Verzeichnisse"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:553
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<Optionen>] [<Objekt>...]"
 
-#: builtin/fsck.c:637
+#: builtin/fsck.c:559
 msgid "show unreachable objects"
 msgstr "unerreichbare Objekte anzeigen"
 
-#: builtin/fsck.c:638
+#: builtin/fsck.c:560
 msgid "show dangling objects"
 msgstr "unreferenzierte Objekte anzeigen"
 
-#: builtin/fsck.c:639
+#: builtin/fsck.c:561
 msgid "report tags"
 msgstr "Tags melden"
 
-#: builtin/fsck.c:640
+#: builtin/fsck.c:562
 msgid "report root nodes"
 msgstr "Hauptwurzeln melden"
 
-#: builtin/fsck.c:641
+#: builtin/fsck.c:563
 msgid "make index objects head nodes"
 msgstr "Index-Objekte in Erreichbarkeitsprüfung einbeziehen"
 
-#: builtin/fsck.c:642
+#: builtin/fsck.c:564
 msgid "make reflogs head nodes (default)"
 msgstr "Reflogs in Erreichbarkeitsprüfung einbeziehen (Standard)"
 
-#: builtin/fsck.c:643
+#: builtin/fsck.c:565
 msgid "also consider packs and alternate objects"
 msgstr "ebenso Pakete und alternative Objekte betrachten"
 
-#: builtin/fsck.c:644
+#: builtin/fsck.c:566
 msgid "check only connectivity"
 msgstr "nur Konnektivität prüfen"
 
-#: builtin/fsck.c:645
+#: builtin/fsck.c:567
 msgid "enable more strict checking"
 msgstr "genauere Prüfung aktivieren"
 
-#: builtin/fsck.c:647
+#: builtin/fsck.c:569
 msgid "write dangling objects in .git/lost-found"
 msgstr "unreferenzierte Objekte nach .git/lost-found schreiben"
 
-#: builtin/fsck.c:648 builtin/prune.c:107
+#: builtin/fsck.c:570 builtin/prune.c:107
 msgid "show progress"
 msgstr "Fortschrittsanzeige anzeigen"
 
-#: builtin/fsck.c:707
+#: builtin/fsck.c:631
 msgid "Checking objects"
 msgstr "Prüfe Objekte"
 
@@ -6266,54 +6336,70 @@
 msgid "git gc [<options>]"
 msgstr "git gc [<Optionen>]"
 
-#: builtin/gc.c:55
+#: builtin/gc.c:72
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "Ungültiger %s: '%s'"
 
-#: builtin/gc.c:100
+#: builtin/gc.c:139
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "zu langes Objekt-Verzeichnis %.*s"
 
-#: builtin/gc.c:269
+#: builtin/gc.c:290
+#, c-format
+msgid ""
+"The last gc run reported the following. Please correct the root cause\n"
+"and remove %s.\n"
+"Automatic cleanup will not be performed until the file is removed.\n"
+"\n"
+"%s"
+msgstr ""
+"Die letzte Ausführung von \"gc run\" enthielt die folgenden Meldungen.\n"
+"Bitte beheben Sie das Hauptproblem und löschen Sie %s.\n"
+"Ein automatischer Cleanup wird nicht ausgeführt, bis diese Datei entfernt\n"
+"wurde.\n"
+"\n"
+"%s"
+
+#: builtin/gc.c:327
 msgid "prune unreferenced objects"
 msgstr "unreferenzierte Objekte entfernen"
 
-#: builtin/gc.c:271
+#: builtin/gc.c:329
 msgid "be more thorough (increased runtime)"
 msgstr "mehr Gründlichkeit (erhöht Laufzeit)"
 
-#: builtin/gc.c:272
+#: builtin/gc.c:330
 msgid "enable auto-gc mode"
 msgstr "\"auto-gc\" Modus aktivieren"
 
-#: builtin/gc.c:273
+#: builtin/gc.c:331
 msgid "force running gc even if there may be another gc running"
 msgstr ""
 "Ausführung von \"git gc\" erwzingen, selbst wenn ein anderes\n"
 "\"git gc\" bereits ausgeführt wird"
 
-#: builtin/gc.c:315
+#: builtin/gc.c:373
 #, 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:317
+#: builtin/gc.c:375
 #, 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:318
+#: builtin/gc.c:376
 #, 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:336
+#: builtin/gc.c:397
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -6321,7 +6407,7 @@
 "\"git gc\" wird bereits auf Maschine '%s' pid %<PRIuMAX> ausgeführt\n"
 "(benutzen Sie --force falls nicht)"
 
-#: builtin/gc.c:364
+#: builtin/gc.c:441
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -6357,211 +6443,207 @@
 msgid "cannot open '%s'"
 msgstr "kann '%s' nicht öffnen"
 
-#: builtin/grep.c:638
+#: builtin/grep.c:633
 msgid "search in index instead of in the work tree"
 msgstr "im Index anstatt im Arbeitsverzeichnis suchen"
 
-#: builtin/grep.c:640
+#: builtin/grep.c:635
 msgid "find in contents not managed by git"
 msgstr "auch in Inhalten finden, die nicht von Git verwaltet werden"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:637
 msgid "search in both tracked and untracked files"
 msgstr "in versionierten und unversionierten Dateien suchen"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:639
 msgid "ignore files specified via '.gitignore'"
 msgstr "Dateien, die über '.gitignore' angegeben sind, ignorieren"
 
-#: builtin/grep.c:647
+#: builtin/grep.c:642
 msgid "show non-matching lines"
 msgstr "Zeilen ohne Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:644
 msgid "case insensitive matching"
 msgstr "Übereinstimmungen unabhängig von Groß- und Kleinschreibung finden"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:646
 msgid "match patterns only at word boundaries"
 msgstr "nur ganze Wörter suchen"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:648
 msgid "process binary files as text"
 msgstr "binäre Dateien als Text verarbeiten"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:650
 msgid "don't match patterns in binary files"
 msgstr "keine Muster in Binärdateien finden"
 
-#: builtin/grep.c:658
+#: builtin/grep.c:653
 msgid "process binary files with textconv filters"
 msgstr "binäre Dateien mit \"textconv\"-Filtern verarbeiten"
 
-#: builtin/grep.c:660
+#: builtin/grep.c:655
 msgid "descend at most <depth> levels"
 msgstr "höchstens <Tiefe> Ebenen durchlaufen"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:659
 msgid "use extended POSIX regular expressions"
 msgstr "erweiterte reguläre Ausdrücke aus POSIX verwenden"
 
-#: builtin/grep.c:667
+#: builtin/grep.c:662
 msgid "use basic POSIX regular expressions (default)"
 msgstr "grundlegende reguläre Ausdrücke aus POSIX verwenden (Standard)"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:665
 msgid "interpret patterns as fixed strings"
 msgstr "Muster als feste Zeichenketten interpretieren"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:668
 msgid "use Perl-compatible regular expressions"
 msgstr "Perl-kompatible reguläre Ausdrücke verwenden"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:671
 msgid "show line numbers"
 msgstr "Zeilennummern anzeigen"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:672
 msgid "don't show filenames"
 msgstr "keine Dateinamen anzeigen"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:673
 msgid "show filenames"
 msgstr "Dateinamen anzeigen"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:675
 msgid "show filenames relative to top directory"
 msgstr "Dateinamen relativ zum Projektverzeichnis anzeigen"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:677
 msgid "show only filenames instead of matching lines"
 msgstr "nur Dateinamen anzeigen anstatt übereinstimmende Zeilen"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:679
 msgid "synonym for --files-with-matches"
 msgstr "Synonym für --files-with-matches"
 
-#: builtin/grep.c:687
+#: builtin/grep.c:682
 msgid "show only the names of files without match"
 msgstr "nur die Dateinamen ohne Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:684
 msgid "print NUL after filenames"
 msgstr "NUL-Zeichen nach Dateinamen ausgeben"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:686
 msgid "show the number of matches instead of matching lines"
 msgstr "anstatt der Zeilen, die Anzahl der übereinstimmenden Zeilen anzeigen"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:687
 msgid "highlight matches"
 msgstr "Übereinstimmungen hervorheben"
 
-#: builtin/grep.c:694
+#: builtin/grep.c:689
 msgid "print empty line between matches from different files"
 msgstr ""
 "eine Leerzeile zwischen Übereinstimmungen in verschiedenen Dateien ausgeben"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:691
 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:699
+#: builtin/grep.c:694
 msgid "show <n> context lines before and after matches"
 msgstr "<n> Zeilen vor und nach den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:697
 msgid "show <n> context lines before matches"
 msgstr "<n> Zeilen vor den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:699
 msgid "show <n> context lines after matches"
 msgstr "<n> Zeilen nach den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:705
+#: builtin/grep.c:700
 msgid "shortcut for -C NUM"
 msgstr "Kurzform für -C NUM"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:703
 msgid "show a line with the function name before matches"
 msgstr "eine Zeile mit dem Funktionsnamen vor Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:705
 msgid "show the surrounding function"
 msgstr "die umgebende Funktion anzeigen"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:708
 msgid "read patterns from file"
 msgstr "Muster von einer Datei lesen"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:710
 msgid "match <pattern>"
 msgstr "<Muster> finden"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:712
 msgid "combine patterns specified with -e"
 msgstr "Muster kombinieren, die mit -e angegeben wurden"
 
-#: builtin/grep.c:729
+#: builtin/grep.c:724
 msgid "indicate hit with exit status without output"
 msgstr "Übereinstimmungen nur durch Beendigungsstatus anzeigen"
 
-#: builtin/grep.c:731
+#: builtin/grep.c:726
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "nur Übereinstimmungen von Dateien anzeigen, die allen Mustern entsprechen"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:728
 msgid "show parse tree for grep expression"
 msgstr "geparstes Verzeichnis für \"grep\"-Ausdruck anzeigen"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "pager"
 msgstr "Anzeigeprogramm"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "show matching files in the pager"
 msgstr "Dateien mit Übereinstimmungen im Anzeigeprogramm anzeigen"
 
-#: builtin/grep.c:740
+#: builtin/grep.c:735
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "den Aufruf von grep(1) erlauben (von dieser Programmversion ignoriert)"
 
-#: builtin/grep.c:741 builtin/show-ref.c:189
-msgid "show usage"
-msgstr "Verwendung anzeigen"
-
-#: builtin/grep.c:808
+#: builtin/grep.c:793
 msgid "no pattern given."
 msgstr "keine Muster angegeben"
 
-#: builtin/grep.c:866
+#: builtin/grep.c:851
 msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
 "Die Option --open-files-in-pager kann nur innerhalb des "
 "Arbeitsverzeichnisses verwendet werden."
 
-#: builtin/grep.c:892
+#: builtin/grep.c:877
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr ""
 "Die Optionen --cached und --untracked können nicht mit --no-index verwendet "
 "werden."
 
-#: builtin/grep.c:897
+#: builtin/grep.c:882
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr ""
 "Die Optionen --no-index und --untracked können nicht mit Commits verwendet "
 "werden."
 
-#: builtin/grep.c:900
+#: builtin/grep.c:885
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 "Die Option --[no-]exclude-standard kann nicht mit versionierten Inhalten "
 "verwendet werden."
 
-#: builtin/grep.c:908
+#: builtin/grep.c:893
 msgid "both --cached and trees are given."
 msgstr "Die Option --cached kann nicht mit \"Tree\"-Objekten verwendet werden."
 
@@ -6574,10 +6656,10 @@
 "[--] <Datei>..."
 
 #: builtin/hash-object.c:81
-msgid "git hash-object  --stdin-paths < <list-of-paths>"
-msgstr "git hash-object  --stdin-paths < <Liste-von-Pfaden>"
+msgid "git hash-object  --stdin-paths"
+msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:92 builtin/tag.c:614
+#: builtin/hash-object.c:92
 msgid "type"
 msgstr "Art"
 
@@ -6650,12 +6732,12 @@
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "Version des emacsclient '%d' ist zu alt (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
+#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "Fehler beim Ausführen von '%s': %s"
 
-#: builtin/help.c:215
+#: builtin/help.c:208
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -6664,7 +6746,7 @@
 "'%s': Pfad für nicht unterstützten Handbuchbetrachter.\n"
 "Sie könnten stattdessen 'man.<Werkzeug>.cmd' benutzen."
 
-#: builtin/help.c:227
+#: builtin/help.c:220
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -6673,61 +6755,61 @@
 "'%s': Kommando für unterstützten Handbuchbetrachter.\n"
 "Sie könnten stattdessen 'man.<Werkzeug>.path' benutzen."
 
-#: builtin/help.c:354
+#: builtin/help.c:337
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s': unbekannter Handbuch-Betrachter."
 
-#: builtin/help.c:371
+#: builtin/help.c:354
 msgid "no man viewer handled the request"
 msgstr "kein Handbuch-Betrachter konnte mit dieser Anfrage umgehen"
 
-#: builtin/help.c:379
+#: builtin/help.c:362
 msgid "no info viewer handled the request"
 msgstr "kein Informations-Betrachter konnte mit dieser Anfrage umgehen"
 
-#: builtin/help.c:428
+#: builtin/help.c:411
 msgid "Defining attributes per path"
 msgstr "Definition von Attributen pro Pfad"
 
-#: builtin/help.c:429
+#: builtin/help.c:412
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Tägliche Benutzung von Git mit ungefähr 20 Kommandos"
 
-#: builtin/help.c:430
+#: builtin/help.c:413
 msgid "A Git glossary"
 msgstr "Ein Git-Glossar"
 
-#: builtin/help.c:431
+#: builtin/help.c:414
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Spezifikation von bewusst ignorierten, unversionierten Dateien"
 
-#: builtin/help.c:432
+#: builtin/help.c:415
 msgid "Defining submodule properties"
 msgstr "Definition von Submodul-Eigenschaften"
 
-#: builtin/help.c:433
+#: builtin/help.c:416
 msgid "Specifying revisions and ranges for Git"
 msgstr "Spezifikation von Commits und Bereichen für Git"
 
-#: builtin/help.c:434
+#: builtin/help.c:417
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Eine einführende Anleitung zu Git (für Version 1.5.1 oder neuer)"
 
-#: builtin/help.c:435
+#: builtin/help.c:418
 msgid "An overview of recommended workflows with Git"
 msgstr "Eine Übersicht über empfohlene Arbeitsabläufe mit Git"
 
-#: builtin/help.c:447
+#: builtin/help.c:430
 msgid "The common Git guides are:\n"
 msgstr "Die allgemein verwendeten Git-Anleitungen sind:\n"
 
-#: builtin/help.c:468 builtin/help.c:485
+#: builtin/help.c:451 builtin/help.c:468
 #, c-format
 msgid "usage: %s%s"
 msgstr "Verwendung: %s%s"
 
-#: builtin/help.c:501
+#: builtin/help.c:484
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "für `git %s' wurde der Alias `%s' angelegt"
@@ -7021,87 +7103,62 @@
 msgid "--verify with no packfile name given"
 msgstr "Die Option --verify wurde ohne Namen der Paketdatei angegeben."
 
-#: builtin/init-db.c:36
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr "Konnte Gruppenschreibrecht für %s nicht setzen."
-
-#: builtin/init-db.c:63
-#, c-format
-msgid "insanely long template name %s"
-msgstr "zu langer Vorlagen-Name %s"
-
-#: builtin/init-db.c:68
+#: builtin/init-db.c:55
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "Kann '%s' nicht lesen"
 
-#: builtin/init-db.c:74
+#: builtin/init-db.c:61
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "kann Vorlage '%s' nicht lesen"
 
-#: builtin/init-db.c:81
+#: builtin/init-db.c:66
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "kann Verzeichnis '%s' nicht öffnen"
 
-#: builtin/init-db.c:98
+#: builtin/init-db.c:77
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "kann Verweis '%s' nicht lesen"
 
-#: builtin/init-db.c:100
-#, c-format
-msgid "insanely long symlink %s"
-msgstr "zu lange symbolische Verknüpfung %s"
-
-#: builtin/init-db.c:103
+#: builtin/init-db.c:79
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "kann symbolische Verknüpfung '%s' auf '%s' nicht erstellen"
 
-#: builtin/init-db.c:107
+#: builtin/init-db.c:85
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "kann '%s' nicht nach '%s' kopieren"
 
-#: builtin/init-db.c:111
+#: builtin/init-db.c:89
 #, c-format
 msgid "ignoring template %s"
 msgstr "ignoriere Vorlage %s"
 
-#: builtin/init-db.c:137
-#, c-format
-msgid "insanely long template path %s"
-msgstr "zu langer Vorlagen-Pfad %s"
-
-#: builtin/init-db.c:145
+#: builtin/init-db.c:118
 #, c-format
 msgid "templates not found %s"
 msgstr "keine Vorlagen in '%s' gefunden"
 
-#: builtin/init-db.c:158
+#: builtin/init-db.c:131
 #, c-format
 msgid "not copying templates of a wrong format version %d from '%s'"
 msgstr "kopiere keine Vorlagen mit einer falschen Formatversion %d von '%s'"
 
-#: builtin/init-db.c:212
-#, c-format
-msgid "insane git directory %s"
-msgstr "ungültiges Git-Verzeichnis %s"
-
-#: builtin/init-db.c:344 builtin/init-db.c:347
+#: builtin/init-db.c:309 builtin/init-db.c:312
 #, c-format
 msgid "%s already exists"
 msgstr "%s existiert bereits"
 
-#: builtin/init-db.c:375
+#: builtin/init-db.c:340
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "kann nicht mit Dateityp %d umgehen"
 
-#: builtin/init-db.c:378
+#: builtin/init-db.c:343
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "Konnte %s nicht nach %s verschieben"
@@ -7109,24 +7166,24 @@
 #. TRANSLATORS: The first '%s' is either "Reinitialized
 #. existing" or "Initialized empty", the second " shared" or
 #. "", and the last '%s%s' is the verbatim directory name.
-#: builtin/init-db.c:434
+#: builtin/init-db.c:399
 #, c-format
 msgid "%s%s Git repository in %s%s\n"
 msgstr "%s%s Git-Repository in %s%s\n"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Reinitialized existing"
 msgstr "Reinitialisierte existierendes"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Initialized empty"
 msgstr "Initialisierte leeres"
 
-#: builtin/init-db.c:436
+#: builtin/init-db.c:401
 msgid " shared"
 msgstr " gemeinsames"
 
-#: builtin/init-db.c:483
+#: builtin/init-db.c:448
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7134,25 +7191,25 @@
 "git init [-q | --quiet] [--bare] [--template=<Vorlagenverzeichnis>] [--"
 "shared[=<Berechtigungen>]] [<Verzeichnis>]"
 
-#: builtin/init-db.c:506
+#: builtin/init-db.c:471
 msgid "permissions"
 msgstr "Berechtigungen"
 
-#: builtin/init-db.c:507
+#: builtin/init-db.c:472
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "angeben, dass das Git-Repository mit mehreren Benutzern geteilt wird"
 
-#: builtin/init-db.c:541 builtin/init-db.c:546
+#: builtin/init-db.c:506 builtin/init-db.c:511
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "kann Verzeichnis %s nicht erstellen"
 
-#: builtin/init-db.c:550
+#: builtin/init-db.c:515
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "kann nicht in Verzeichnis %s wechseln"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:536
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7161,7 +7218,7 @@
 "%s (oder --work-tree=<Verzeichnis>) nicht erlaubt ohne Spezifizierung von %s "
 "(oder --git-dir=<Verzeichnis>)"
 
-#: builtin/init-db.c:599
+#: builtin/init-db.c:564
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Kann nicht auf Arbeitsverzeichnis '%s' zugreifen."
@@ -7247,33 +7304,33 @@
 msgid "name of output directory is too long"
 msgstr "Name des Ausgabeverzeichnisses ist zu lang."
 
-#: builtin/log.c:814
+#: builtin/log.c:813
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Kann Patch-Datei %s nicht öffnen"
 
-#: builtin/log.c:828
+#: builtin/log.c:827
 msgid "Need exactly one range."
 msgstr "Brauche genau einen Commit-Bereich."
 
-#: builtin/log.c:838
+#: builtin/log.c:837
 msgid "Not a range."
 msgstr "Kein Commit-Bereich."
 
-#: builtin/log.c:944
+#: builtin/log.c:943
 msgid "Cover letter needs email format"
 msgstr "Anschreiben benötigt E-Mail-Format"
 
-#: builtin/log.c:1023
+#: builtin/log.c:1022
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "ungültiges in-reply-to: %s"
 
-#: builtin/log.c:1051
+#: builtin/log.c:1050
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<Optionen>] [<seit> | <Commitbereich>]"
 
-#: builtin/log.c:1096
+#: builtin/log.c:1095
 msgid "Two output directories?"
 msgstr "Zwei Ausgabeverzeichnisse?"
 
@@ -7330,131 +7387,135 @@
 msgstr "keine binären Unterschiede ausgeben"
 
 #: builtin/log.c:1241
+msgid "output all-zero hash in From header"
+msgstr "Hash mit Nullen in \"From\"-Header ausgeben"
+
+#: builtin/log.c:1243
 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:1243
+#: builtin/log.c:1245
 msgid "show patch format instead of default (patch + stat)"
 msgstr "Patchformat anstatt des Standards anzeigen (Patch + Zusammenfassung)"
 
-#: builtin/log.c:1245
+#: builtin/log.c:1247
 msgid "Messaging"
 msgstr "E-Mail-Einstellungen"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1248
 msgid "header"
 msgstr "Header"
 
-#: builtin/log.c:1247
+#: builtin/log.c:1249
 msgid "add email header"
 msgstr "E-Mail-Header hinzufügen"
 
-#: builtin/log.c:1248 builtin/log.c:1250
+#: builtin/log.c:1250 builtin/log.c:1252
 msgid "email"
 msgstr "E-Mail"
 
-#: builtin/log.c:1248
+#: builtin/log.c:1250
 msgid "add To: header"
 msgstr "\"To:\"-Header hinzufügen"
 
-#: builtin/log.c:1250
+#: builtin/log.c:1252
 msgid "add Cc: header"
 msgstr "\"Cc:\"-Header hinzufügen"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1254
 msgid "ident"
 msgstr "Ident"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1255
 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:1255
+#: builtin/log.c:1257
 msgid "message-id"
 msgstr "message-id"
 
-#: builtin/log.c:1256
+#: builtin/log.c:1258
 msgid "make first mail a reply to <message-id>"
 msgstr "aus erster E-Mail eine Antwort zu <message-id> machen"
 
-#: builtin/log.c:1257 builtin/log.c:1260
+#: builtin/log.c:1259 builtin/log.c:1262
 msgid "boundary"
 msgstr "Grenze"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1260
 msgid "attach the patch"
 msgstr "den Patch anhängen"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1263
 msgid "inline the patch"
 msgstr "den Patch direkt in die Nachricht einfügen"
 
-#: builtin/log.c:1265
+#: builtin/log.c:1267
 msgid "enable message threading, styles: shallow, deep"
 msgstr "Nachrichtenverkettung aktivieren, Stile: shallow, deep"
 
-#: builtin/log.c:1267
+#: builtin/log.c:1269
 msgid "signature"
 msgstr "Signatur"
 
-#: builtin/log.c:1268
+#: builtin/log.c:1270
 msgid "add a signature"
 msgstr "eine Signatur hinzufügen"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1272
 msgid "add a signature from a file"
 msgstr "eine Signatur aus einer Datei hinzufügen"
 
-#: builtin/log.c:1271
+#: builtin/log.c:1273
 msgid "don't print the patch filenames"
 msgstr "keine Dateinamen der Patches anzeigen"
 
-#: builtin/log.c:1360
+#: builtin/log.c:1362
 msgid "-n and -k are mutually exclusive."
 msgstr "Die Optionen -n und -k schließen sich gegenseitig aus."
 
-#: builtin/log.c:1362
+#: builtin/log.c:1364
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "Die Optionen --subject-prefix und -k schließen sich gegenseitig aus."
 
-#: builtin/log.c:1370
+#: builtin/log.c:1372
 msgid "--name-only does not make sense"
 msgstr "Die Option --name-only kann nicht verwendet werden."
 
-#: builtin/log.c:1372
+#: builtin/log.c:1374
 msgid "--name-status does not make sense"
 msgstr "Die Option --name-status kann nicht verwendet werden."
 
-#: builtin/log.c:1374
+#: builtin/log.c:1376
 msgid "--check does not make sense"
 msgstr "Die Option --check kann nicht verwendet werden."
 
-#: builtin/log.c:1397
+#: builtin/log.c:1401
 msgid "standard output, or directory, which one?"
 msgstr "Standard-Ausgabe oder Verzeichnis, welches von beidem?"
 
-#: builtin/log.c:1399
+#: builtin/log.c:1403
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: builtin/log.c:1496
+#: builtin/log.c:1500
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "Konnte Signatur-Datei '%s' nicht lesen"
 
-#: builtin/log.c:1559
+#: builtin/log.c:1563
 msgid "Failed to create output files"
 msgstr "Fehler beim Erstellen der Ausgabedateien."
 
-#: builtin/log.c:1607
+#: builtin/log.c:1611
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<Upstream> [<Branch> [<Limit>]]]"
 
-#: builtin/log.c:1661
+#: builtin/log.c:1665
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -7462,7 +7523,7 @@
 "Konnte gefolgten Remote-Branch nicht finden, bitte geben Sie <Upstream> "
 "manuell an.\n"
 
-#: builtin/log.c:1672 builtin/log.c:1674 builtin/log.c:1686
+#: builtin/log.c:1676 builtin/log.c:1678 builtin/log.c:1690
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Unbekannter Commit %s"
@@ -7568,35 +7629,35 @@
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<Optionen>] <Commit-Referenz> [<Pfad>...]"
 
-#: builtin/ls-tree.c:127
+#: builtin/ls-tree.c:128
 msgid "only show trees"
 msgstr "nur Verzeichnisse anzeigen"
 
-#: builtin/ls-tree.c:129
+#: builtin/ls-tree.c:130
 msgid "recurse into subtrees"
 msgstr "Rekursion in Unterverzeichnissen durchführen"
 
-#: builtin/ls-tree.c:131
+#: builtin/ls-tree.c:132
 msgid "show trees when recursing"
 msgstr "Verzeichnisse bei Rekursion anzeigen"
 
-#: builtin/ls-tree.c:134
+#: builtin/ls-tree.c:135
 msgid "terminate entries with NUL byte"
 msgstr "Einträge mit NUL-Byte abschließen"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:136
 msgid "include object size"
 msgstr "Objektgröße einschließen"
 
-#: builtin/ls-tree.c:137 builtin/ls-tree.c:139
+#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
 msgid "list only filenames"
 msgstr "nur Dateinamen auflisten"
 
-#: builtin/ls-tree.c:142
+#: builtin/ls-tree.c:143
 msgid "use full path names"
 msgstr "vollständige Pfadnamen verwenden"
 
-#: builtin/ls-tree.c:144
+#: builtin/ls-tree.c:145
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr ""
 "das gesamte Verzeichnis auflisten; nicht nur das aktuelle Verzeichnis "
@@ -7837,16 +7898,16 @@
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Kein Remote-Tracking-Branch für %s von %s"
 
-#: builtin/merge.c:1081
+#: builtin/merge.c:1079
 #, c-format
 msgid "could not close '%s'"
 msgstr "Konnte '%s' nicht schließen"
 
-#: builtin/merge.c:1208
+#: builtin/merge.c:1206
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Es gibt keinen Merge zum Abbrechen (MERGE_HEAD fehlt)"
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1222
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7854,7 +7915,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:1231
+#: builtin/merge.c:1229
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7862,56 +7923,56 @@
 "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:1234
+#: builtin/merge.c:1232
 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:1243
+#: builtin/merge.c:1241
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Sie können --squash nicht mit --no-ff kombinieren."
 
-#: builtin/merge.c:1251
+#: builtin/merge.c:1249
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Kein Commit angegeben und merge.defaultToUpstream ist nicht gesetzt."
 
-#: builtin/merge.c:1268
+#: builtin/merge.c:1266
 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:1270
+#: builtin/merge.c:1268
 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:1276
+#: builtin/merge.c:1274
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - nichts was wir zusammenführen können"
 
-#: builtin/merge.c:1278
+#: builtin/merge.c:1276
 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:1333
+#: builtin/merge.c:1331
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 "Commit %s hat eine nicht vertrauenswürdige GPG-Signatur, angeblich von %s."
 
-#: builtin/merge.c:1336
+#: builtin/merge.c:1334
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "Commit %s hat eine ungültige GPG-Signatur, angeblich von %s."
 
-#: builtin/merge.c:1339
+#: builtin/merge.c:1337
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Commit %s hat keine GPG-Signatur."
 
-#: builtin/merge.c:1342
+#: builtin/merge.c:1340
 #, 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"
@@ -7921,46 +7982,46 @@
 msgid "Updating %s..%s\n"
 msgstr "Aktualisiere %s..%s\n"
 
-#: builtin/merge.c:1462
+#: builtin/merge.c:1460
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Probiere wirklich trivialen \"in-index\"-Merge ...\n"
 
-#: builtin/merge.c:1469
+#: builtin/merge.c:1467
 #, c-format
 msgid "Nope.\n"
 msgstr "Nein.\n"
 
-#: builtin/merge.c:1501
+#: builtin/merge.c:1499
 msgid "Not possible to fast-forward, aborting."
 msgstr "Vorspulen nicht möglich, breche ab."
 
-#: builtin/merge.c:1524 builtin/merge.c:1603
+#: builtin/merge.c:1522 builtin/merge.c:1601
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Rücklauf des Verzeichnisses bis zum Ursprung ...\n"
 
-#: builtin/merge.c:1528
+#: builtin/merge.c:1526
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Probiere Merge-Strategie %s ...\n"
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1592
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Keine Merge-Strategie behandelt diesen Merge.\n"
 
-#: builtin/merge.c:1596
+#: builtin/merge.c:1594
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Merge mit Strategie %s fehlgeschlagen.\n"
 
-#: builtin/merge.c:1605
+#: builtin/merge.c:1603
 #, 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:1617
+#: builtin/merge.c:1615
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -8152,48 +8213,48 @@
 msgid "Renaming %s to %s\n"
 msgstr "Benenne %s nach %s um\n"
 
-#: builtin/mv.c:256 builtin/remote.c:722 builtin/repack.c:362
+#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "Umbenennung von '%s' fehlgeschlagen"
 
-#: builtin/name-rev.c:255
+#: builtin/name-rev.c:251
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<Optionen>] <Commit>..."
 
-#: builtin/name-rev.c:256
+#: builtin/name-rev.c:252
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<Optionen>] --all"
 
-#: builtin/name-rev.c:257
+#: builtin/name-rev.c:253
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<Optionen>] --stdin"
 
-#: builtin/name-rev.c:309
+#: builtin/name-rev.c:305
 msgid "print only names (no SHA-1)"
 msgstr "nur Namen anzeigen (keine SHA-1)"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:306
 msgid "only use tags to name the commits"
 msgstr "nur Tags verwenden, um die Commits zu benennen"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:308
 msgid "only use refs matching <pattern>"
 msgstr "nur Referenzen verwenden die <Muster> entsprechen"
 
-#: builtin/name-rev.c:314
+#: builtin/name-rev.c:310
 msgid "list all commits reachable from all refs"
 msgstr "alle Commits auflisten, die von allen Referenzen erreichbar sind"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:311
 msgid "read from stdin"
 msgstr "von der Standard-Eingabe lesen"
 
-#: builtin/name-rev.c:316
+#: builtin/name-rev.c:312
 msgid "allow to print `undefined` names (default)"
 msgstr "Ausgabe von `undefinierten` Namen erlauben (Standard)"
 
-#: builtin/name-rev.c:322
+#: builtin/name-rev.c:318
 msgid "dereference tags in the input (internal use)"
 msgstr "Tags in der Eingabe dereferenzieren (interne Verwendung)"
 
@@ -8323,7 +8384,7 @@
 msgid "failed to finish 'show' for object '%s'"
 msgstr "konnte 'show' für Objekt '%s' nicht abschließen"
 
-#: builtin/notes.c:174 builtin/tag.c:477
+#: builtin/notes.c:174 builtin/tag.c:248
 #, c-format
 msgid "could not create file '%s'"
 msgstr "konnte Datei '%s' nicht erstellen"
@@ -8342,12 +8403,12 @@
 msgid "The note contents have been left in %s"
 msgstr "Die Notiz-Inhalte wurden in %s belassen"
 
-#: builtin/notes.c:232 builtin/tag.c:695
+#: builtin/notes.c:232 builtin/tag.c:440
 #, c-format
 msgid "cannot read '%s'"
 msgstr "kann '%s' nicht lesen"
 
-#: builtin/notes.c:234 builtin/tag.c:698
+#: builtin/notes.c:234 builtin/tag.c:443
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "konnte '%s' nicht öffnen oder lesen"
@@ -8355,7 +8416,7 @@
 #: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306
 #: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507
 #: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653
-#: builtin/notes.c:877 builtin/tag.c:711
+#: builtin/notes.c:877 builtin/tag.c:456
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
@@ -8389,11 +8450,6 @@
 msgid "note contents in a file"
 msgstr "Notizinhalte in einer Datei"
 
-#: builtin/notes.c:398 builtin/notes.c:401 builtin/notes.c:561
-#: builtin/notes.c:564 builtin/tag.c:630
-msgid "object"
-msgstr "Objekt"
-
 #: builtin/notes.c:399 builtin/notes.c:562
 msgid "reuse and edit specified note object"
 msgstr "Wiederverwendung und Bearbeitung des angegebenen Notiz-Objektes"
@@ -8526,7 +8582,7 @@
 msgid "use notes from <notes-ref>"
 msgstr "Notizen von <Notiz-Referenz> verwenden"
 
-#: builtin/notes.c:1012 builtin/remote.c:1588
+#: builtin/notes.c:1012 builtin/remote.c:1647
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Unbekanntes Unterkommando: %s"
@@ -8747,20 +8803,24 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <Zeit>] [--] [<head>...]"
 
-#: builtin/prune.c:105 builtin/worktree.c:121
+#: builtin/prune.c:105 builtin/worktree.c:124
 msgid "do not remove, show only"
 msgstr "nicht löschen, nur anzeigen"
 
-#: builtin/prune.c:106 builtin/worktree.c:122
+#: builtin/prune.c:106 builtin/worktree.c:125
 msgid "report pruned objects"
 msgstr "gelöschte Objekte melden"
 
-#: builtin/prune.c:109 builtin/worktree.c:124
+#: builtin/prune.c:109 builtin/worktree.c:127
 msgid "expire objects older than <time>"
 msgstr "Objekte älter als <Zeit> verfallen lassen"
 
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
+msgstr "kann \"prune\" in precious-objects Repository nicht ausführen"
+
 #: builtin/pull.c:69
-msgid "git pull [options] [<repository> [<refspec>...]]"
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [<Optionen>] [<Repository> [<Refspec>...]]"
 
 #: builtin/pull.c:113
@@ -8925,19 +8985,19 @@
 msgid "Cannot rebase onto multiple branches."
 msgstr "Kann Rebase nicht auf mehrere Branches ausführen."
 
-#: builtin/push.c:15
+#: builtin/push.c:16
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [<Optionen>] [<Repository> [<Refspec>...]]"
 
-#: builtin/push.c:86
+#: builtin/push.c:88
 msgid "tag shorthand without <tag>"
 msgstr "Kurzschrift für Tag ohne <Tag>"
 
-#: builtin/push.c:96
+#: builtin/push.c:98
 msgid "--delete only accepts plain target ref names"
 msgstr "Die Option --delete akzeptiert nur reine Referenznamen als Ziel."
 
-#: builtin/push.c:140
+#: builtin/push.c:142
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -8946,7 +9006,7 @@
 "Um eine Variante permanent zu verwenden, siehe push.default in 'git help "
 "config'."
 
-#: builtin/push.c:143
+#: builtin/push.c:145
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -8972,7 +9032,7 @@
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:158
+#: builtin/push.c:160
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -8987,7 +9047,7 @@
 "\n"
 "    git push %s HEAD:<Name-des-Remote-Branches>\n"
 
-#: builtin/push.c:172
+#: builtin/push.c:174
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -9001,13 +9061,13 @@
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:180
+#: builtin/push.c:182
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr ""
 "Der aktuelle Branch %s hat mehrere Upstream-Branches, \"push\" verweigert."
 
-#: builtin/push.c:183
+#: builtin/push.c:185
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -9018,7 +9078,7 @@
 "Branches '%s' ist, ohne anzugeben, was versendet werden soll, um welchen\n"
 "Remote-Branch zu aktualisieren."
 
-#: builtin/push.c:206
+#: builtin/push.c:208
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -9069,14 +9129,14 @@
 "von\n"
 "Git benutzen.)"
 
-#: builtin/push.c:273
+#: builtin/push.c:275
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "Sie haben keine Refspec für \"push\" angegeben, und push.default ist "
 "\"nothing\"."
 
-#: builtin/push.c:280
+#: builtin/push.c:282
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -9090,7 +9150,7 @@
 "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
 "für weitere Details."
 
-#: builtin/push.c:286
+#: builtin/push.c:288
 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"
@@ -9104,7 +9164,7 @@
 "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
 "für weitere Details."
 
-#: builtin/push.c:292
+#: builtin/push.c:294
 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"
@@ -9123,13 +9183,13 @@
 "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
 "für weitere Details."
 
-#: builtin/push.c:299
+#: builtin/push.c:301
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 "Aktualisierungen wurden zurückgewiesen, weil das Tag bereits\n"
 "im Remote-Repository existiert."
 
-#: builtin/push.c:302
+#: builtin/push.c:304
 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"
@@ -9139,22 +9199,22 @@
 "das kein Commit ist, oder es auf ein solches Objekt zeigen lassen, ohne\n"
 "die Option '--force' zu verwenden.\n"
 
-#: builtin/push.c:361
+#: builtin/push.c:363
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Versende nach %s\n"
 
-#: builtin/push.c:365
+#: builtin/push.c:367
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "Fehler beim Versenden einiger Referenzen nach '%s'"
 
-#: builtin/push.c:395
+#: builtin/push.c:397
 #, c-format
 msgid "bad repository '%s'"
 msgstr "ungültiges Repository '%s'"
 
-#: builtin/push.c:396
+#: builtin/push.c:398
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -9176,100 +9236,104 @@
 "\n"
 "    git push <Name>\n"
 
-#: builtin/push.c:411
+#: builtin/push.c:413
 msgid "--all and --tags are incompatible"
 msgstr "Die Optionen --all und --tags sind inkompatibel."
 
-#: builtin/push.c:412
+#: builtin/push.c:414
 msgid "--all can't be combined with refspecs"
 msgstr "Die Option --all kann nicht mit Refspecs kombiniert werden."
 
-#: builtin/push.c:417
+#: builtin/push.c:419
 msgid "--mirror and --tags are incompatible"
 msgstr "Die Optionen --mirror und --tags sind inkompatibel."
 
-#: builtin/push.c:418
+#: builtin/push.c:420
 msgid "--mirror can't be combined with refspecs"
 msgstr "Die Option --mirror kann nicht mit Refspecs kombiniert werden."
 
-#: builtin/push.c:423
+#: builtin/push.c:425
 msgid "--all and --mirror are incompatible"
 msgstr "Die Optionen --all und --mirror sind inkompatibel."
 
-#: builtin/push.c:539
+#: builtin/push.c:537
 msgid "repository"
 msgstr "Repository"
 
-#: builtin/push.c:540 builtin/send-pack.c:161
+#: builtin/push.c:538 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "alle Referenzen versenden"
 
-#: builtin/push.c:541 builtin/send-pack.c:163
+#: builtin/push.c:539 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "alle Referenzen spiegeln"
 
-#: builtin/push.c:543
+#: builtin/push.c:541
 msgid "delete refs"
 msgstr "Referenzen löschen"
 
-#: builtin/push.c:544
+#: builtin/push.c:542
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "Tags versenden (kann nicht mit --all oder --mirror verwendet werden)"
 
-#: builtin/push.c:547 builtin/send-pack.c:164
+#: builtin/push.c:545 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "Aktualisierung erzwingen"
 
-#: builtin/push.c:549 builtin/send-pack.c:175
+#: builtin/push.c:547 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "Referenzname>:<Erwartungswert"
 
-#: builtin/push.c:550 builtin/send-pack.c:176
+#: builtin/push.c:548 builtin/send-pack.c:176
 msgid "require old value of ref to be at this value"
 msgstr "Referenz muss sich auf dem angegebenen Wert befinden"
 
-#: builtin/push.c:553
+#: builtin/push.c:550
+msgid "check|on-demand|no"
+msgstr "check|on-demand|no"
+
+#: builtin/push.c:551
 msgid "control recursive pushing of submodules"
 msgstr "rekursiven \"push\" von Submodulen steuern"
 
-#: builtin/push.c:555 builtin/send-pack.c:169
+#: builtin/push.c:553 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "kleinere Pakete verwenden"
 
-#: builtin/push.c:556 builtin/push.c:557 builtin/send-pack.c:158
+#: builtin/push.c:554 builtin/push.c:555 builtin/send-pack.c:158
 #: builtin/send-pack.c:159
 msgid "receive pack program"
 msgstr "'receive pack' Programm"
 
-#: builtin/push.c:558
+#: builtin/push.c:556
 msgid "set upstream for git pull/status"
 msgstr "Upstream für \"git pull/status\" setzen"
 
-#: builtin/push.c:561
+#: builtin/push.c:559
 msgid "prune locally removed refs"
 msgstr "lokal gelöschte Referenzen entfernen"
 
-#: builtin/push.c:563
+#: builtin/push.c:561
 msgid "bypass pre-push hook"
 msgstr "\"pre-push hook\" umgehen"
 
-#: builtin/push.c:564
+#: builtin/push.c:562
 msgid "push missing but relevant tags"
 msgstr "fehlende, aber relevante Tags versenden"
 
-#: builtin/push.c:567 builtin/send-pack.c:166
+#: builtin/push.c:565 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "signiert \"push\" mit GPG"
 
-#: builtin/push.c:569 builtin/send-pack.c:170
+#: builtin/push.c:567 builtin/send-pack.c:170
 msgid "request atomic transaction on remote side"
 msgstr "Referenzen atomar versenden"
 
-#: builtin/push.c:579
+#: builtin/push.c:577
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "Die Option --delete ist inkompatibel mit --all, --mirror und --tags."
 
-#: builtin/push.c:581
+#: builtin/push.c:579
 msgid "--delete doesn't make sense without any refs"
 msgstr "Die Option --delete kann nur mit Referenzen verwendet werden."
 
@@ -9348,12 +9412,12 @@
 msgid "debug unpack-trees"
 msgstr "Entpacken der Bäume protokollieren"
 
-#: builtin/reflog.c:432
+#: builtin/reflog.c:428
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
 msgstr "'%s' ist kein gültiger Zeitstempel für '%s'"
 
-#: builtin/reflog.c:549 builtin/reflog.c:554
+#: builtin/reflog.c:545 builtin/reflog.c:550
 #, c-format
 msgid "'%s' is not a valid timestamp"
 msgstr "'%s' ist kein gültiger Zeitstempel"
@@ -9370,15 +9434,15 @@
 "git remote add [-t <Branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
 "mirror=<fetch|push>] <Name> <URL>"
 
-#: builtin/remote.c:14 builtin/remote.c:33
+#: builtin/remote.c:14 builtin/remote.c:34
 msgid "git remote rename <old> <new>"
 msgstr "git remote rename <alt> <neu>"
 
-#: builtin/remote.c:15 builtin/remote.c:38
+#: builtin/remote.c:15 builtin/remote.c:39
 msgid "git remote remove <name>"
 msgstr "git remote remove <Name>"
 
-#: builtin/remote.c:16 builtin/remote.c:43
+#: builtin/remote.c:16 builtin/remote.c:44
 msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
 msgstr "git remote set-head <Name> (-a | --auto | -d | --delete | <Branch>)"
 
@@ -9400,48 +9464,52 @@
 msgid "git remote set-branches [--add] <name> <branch>..."
 msgstr "git remote set-branches [--add] <Name> <Branch>..."
 
-#: builtin/remote.c:21 builtin/remote.c:69
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr "git remote get-url [--push] [--all] <Name>"
+
+#: builtin/remote.c:22 builtin/remote.c:75
 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
 msgstr "git remote set-url [--push] <Name> <neueURL> [<alteURL>]"
 
-#: builtin/remote.c:22 builtin/remote.c:70
+#: builtin/remote.c:23 builtin/remote.c:76
 msgid "git remote set-url --add <name> <newurl>"
 msgstr "git remote set-url --add <Name> <neueURL>"
 
-#: builtin/remote.c:23 builtin/remote.c:71
+#: builtin/remote.c:24 builtin/remote.c:77
 msgid "git remote set-url --delete <name> <url>"
 msgstr "git remote set-url --delete <Name> <URL>"
 
-#: builtin/remote.c:28
+#: builtin/remote.c:29
 msgid "git remote add [<options>] <name> <url>"
 msgstr "git remote add [<Optionen>] <Name> <URL>"
 
-#: builtin/remote.c:48
+#: builtin/remote.c:49
 msgid "git remote set-branches <name> <branch>..."
 msgstr "git remote set-branches <Name> <Branch>..."
 
-#: builtin/remote.c:49
+#: builtin/remote.c:50
 msgid "git remote set-branches --add <name> <branch>..."
 msgstr "git remote set-branches --add <Name> <Branch>..."
 
-#: builtin/remote.c:54
+#: builtin/remote.c:55
 msgid "git remote show [<options>] <name>"
 msgstr "git remote show [<Optionen>] <Name>"
 
-#: builtin/remote.c:59
+#: builtin/remote.c:60
 msgid "git remote prune [<options>] <name>"
 msgstr "git remote prune [<Optionen>] <Name>"
 
-#: builtin/remote.c:64
+#: builtin/remote.c:65
 msgid "git remote update [<options>] [<group> | <remote>]..."
 msgstr "git remote update [<Optionen>] [<Gruppe> | <externesRepository>]..."
 
-#: builtin/remote.c:88
+#: builtin/remote.c:94
 #, c-format
 msgid "Updating %s"
 msgstr "Aktualisiere %s"
 
-#: builtin/remote.c:120
+#: builtin/remote.c:126
 msgid ""
 "--mirror is dangerous and deprecated; please\n"
 "\t use --mirror=fetch or --mirror=push instead"
@@ -9449,102 +9517,102 @@
 "--mirror ist gefährlich und veraltet; bitte\n"
 "\t benutzen Sie stattdessen --mirror=fetch oder --mirror=push"
 
-#: builtin/remote.c:137
+#: builtin/remote.c:143
 #, c-format
 msgid "unknown mirror argument: %s"
 msgstr "unbekanntes Argument für Option --mirror: %s"
 
-#: builtin/remote.c:153
+#: builtin/remote.c:159
 msgid "fetch the remote branches"
 msgstr "die Remote-Branches anfordern"
 
-#: builtin/remote.c:155
+#: builtin/remote.c:161
 msgid "import all tags and associated objects when fetching"
 msgstr "alle Tags und verbundene Objekte beim Anfordern importieren"
 
-#: builtin/remote.c:158
+#: builtin/remote.c:164
 msgid "or do not fetch any tag at all (--no-tags)"
 msgstr "oder fordere gar keine Zweige an (--no-tags)"
 
-#: builtin/remote.c:160
+#: builtin/remote.c:166
 msgid "branch(es) to track"
 msgstr "Branch(es) zur Übernahme"
 
-#: builtin/remote.c:161
+#: builtin/remote.c:167
 msgid "master branch"
 msgstr "Hauptbranch"
 
-#: builtin/remote.c:162
+#: builtin/remote.c:168
 msgid "push|fetch"
 msgstr "push|fetch"
 
-#: builtin/remote.c:163
+#: builtin/remote.c:169
 msgid "set up remote as a mirror to push to or fetch from"
 msgstr ""
 "Aufsetzen des Remote-Repositories als Spiegel-Repository für \"push\" und "
 "\"fetch\""
 
-#: builtin/remote.c:175
+#: builtin/remote.c:181
 msgid "specifying a master branch makes no sense with --mirror"
 msgstr ""
 "Die Option --mirror kann nicht mit der Angabe eines Hauptbranches verwendet "
 "werden."
 
-#: builtin/remote.c:177
+#: builtin/remote.c:183
 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."
 
-#: builtin/remote.c:187 builtin/remote.c:637
+#: builtin/remote.c:193 builtin/remote.c:643
 #, c-format
 msgid "remote %s already exists."
 msgstr "externes Repository %s existiert bereits"
 
-#: builtin/remote.c:191 builtin/remote.c:641
+#: builtin/remote.c:197 builtin/remote.c:647
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "'%s' ist kein gültiger Name für ein Remote-Repository"
 
-#: builtin/remote.c:235
+#: builtin/remote.c:241
 #, c-format
 msgid "Could not setup master '%s'"
 msgstr "Konnte symbolische Referenz für Hauptbranch von '%s' nicht einrichten"
 
-#: builtin/remote.c:335
+#: builtin/remote.c:341
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr "Konnte Fetch-Map für Refspec %s nicht bekommen"
 
-#: builtin/remote.c:436 builtin/remote.c:444
+#: builtin/remote.c:442 builtin/remote.c:450
 msgid "(matching)"
 msgstr "(übereinstimmend)"
 
-#: builtin/remote.c:448
+#: builtin/remote.c:454
 msgid "(delete)"
 msgstr "(lösche)"
 
-#: builtin/remote.c:588 builtin/remote.c:594 builtin/remote.c:600
+#: builtin/remote.c:594 builtin/remote.c:600 builtin/remote.c:606
 #, c-format
 msgid "Could not append '%s' to '%s'"
 msgstr "Konnte '%s' nicht an '%s' anhängen."
 
-#: builtin/remote.c:630 builtin/remote.c:769 builtin/remote.c:869
+#: builtin/remote.c:636 builtin/remote.c:775 builtin/remote.c:875
 #, c-format
 msgid "No such remote: %s"
 msgstr "Kein solches Remote-Repository: %s"
 
-#: builtin/remote.c:647
+#: builtin/remote.c:653
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Konnte Sektion '%s' in Konfiguration nicht nach '%s' umbenennen"
 
-#: builtin/remote.c:653 builtin/remote.c:821
+#: builtin/remote.c:659 builtin/remote.c:827
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Konnte Sektion '%s' nicht aus Konfiguration entfernen"
 
-#: builtin/remote.c:668
+#: builtin/remote.c:674
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -9555,27 +9623,27 @@
 "\t%s\n"
 "\tBitte aktualisieren Sie, falls notwendig, die Konfiguration manuell."
 
-#: builtin/remote.c:674
+#: builtin/remote.c:680
 #, c-format
 msgid "Could not append '%s'"
 msgstr "Konnte '%s' nicht anhängen."
 
-#: builtin/remote.c:685
+#: builtin/remote.c:691
 #, c-format
 msgid "Could not set '%s'"
 msgstr "Konnte '%s' nicht setzen"
 
-#: builtin/remote.c:707
+#: builtin/remote.c:713
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "Konnte '%s' nicht löschen"
 
-#: builtin/remote.c:741
+#: builtin/remote.c:747
 #, c-format
 msgid "creating '%s' failed"
 msgstr "Konnte '%s' nicht erstellen"
 
-#: builtin/remote.c:807
+#: builtin/remote.c:813
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -9591,120 +9659,120 @@
 "entfernt;\n"
 "um diese zu entfernen, benutzen Sie:"
 
-#: builtin/remote.c:922
+#: builtin/remote.c:928
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " neu (wird bei nächstem \"fetch\" in remotes/%s gespeichert)"
 
-#: builtin/remote.c:925
+#: builtin/remote.c:931
 msgid " tracked"
 msgstr " gefolgt"
 
-#: builtin/remote.c:927
+#: builtin/remote.c:933
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " veraltet (benutzen Sie 'git remote prune' zum Löschen)"
 
-#: builtin/remote.c:929
+#: builtin/remote.c:935
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:976
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "ungültiges branch.%s.merge; kann Rebase nicht auf > 1 Branch ausführen"
 
-#: builtin/remote.c:977
+#: builtin/remote.c:983
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "Rebase auf Remote-Branch %s"
 
-#: builtin/remote.c:980
+#: builtin/remote.c:986
 #, c-format
 msgid " merges with remote %s"
 msgstr " führt mit Remote-Branch %s zusammen"
 
-#: builtin/remote.c:981
+#: builtin/remote.c:987
 msgid "    and with remote"
 msgstr "    und mit Remote-Branch"
 
-#: builtin/remote.c:983
+#: builtin/remote.c:989
 #, c-format
 msgid "merges with remote %s"
 msgstr "führt mit Remote-Branch %s zusammen"
 
-#: builtin/remote.c:984
+#: builtin/remote.c:990
 msgid "   and with remote"
 msgstr "   und mit Remote-Branch"
 
-#: builtin/remote.c:1030
+#: builtin/remote.c:1036
 msgid "create"
 msgstr "erstellt"
 
-#: builtin/remote.c:1033
+#: builtin/remote.c:1039
 msgid "delete"
 msgstr "gelöscht"
 
-#: builtin/remote.c:1037
+#: builtin/remote.c:1043
 msgid "up to date"
 msgstr "aktuell"
 
-#: builtin/remote.c:1040
+#: builtin/remote.c:1046
 msgid "fast-forwardable"
 msgstr "vorspulbar"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1049
 msgid "local out of date"
 msgstr "lokal nicht aktuell"
 
-#: builtin/remote.c:1050
+#: builtin/remote.c:1056
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s erzwingt Versandt nach %-*s (%s)"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1059
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s versendet nach %-*s (%s)"
 
-#: builtin/remote.c:1057
+#: builtin/remote.c:1063
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s erzwingt Versand nach %s"
 
-#: builtin/remote.c:1060
+#: builtin/remote.c:1066
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s versendet nach %s"
 
-#: builtin/remote.c:1128
+#: builtin/remote.c:1134
 msgid "do not query remotes"
 msgstr "keine Abfrage von Remote-Repositories"
 
-#: builtin/remote.c:1155
+#: builtin/remote.c:1161
 #, c-format
 msgid "* remote %s"
 msgstr "* Remote-Repository %s"
 
-#: builtin/remote.c:1156
+#: builtin/remote.c:1162
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL zum Abholen: %s"
 
-#: builtin/remote.c:1157 builtin/remote.c:1308
+#: builtin/remote.c:1163 builtin/remote.c:1314
 msgid "(no URL)"
 msgstr "(keine URL)"
 
-#: builtin/remote.c:1166 builtin/remote.c:1168
+#: builtin/remote.c:1172 builtin/remote.c:1174
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL zum Versenden: %s"
 
-#: builtin/remote.c:1170 builtin/remote.c:1172 builtin/remote.c:1174
+#: builtin/remote.c:1176 builtin/remote.c:1178 builtin/remote.c:1180
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Hauptbranch: %s"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1182
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
@@ -9712,146 +9780,159 @@
 "  Hauptbranch (externer HEAD ist mehrdeutig, könnte einer der folgenden "
 "sein):\n"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1194
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Remote-Branch:%s"
 msgstr[1] "  Remote-Branches:%s"
 
-#: builtin/remote.c:1191 builtin/remote.c:1218
+#: builtin/remote.c:1197 builtin/remote.c:1224
 msgid " (status not queried)"
 msgstr " (Zustand nicht abgefragt)"
 
-#: builtin/remote.c:1200
+#: builtin/remote.c:1206
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Lokaler Branch konfiguriert für 'git pull':"
 msgstr[1] "  Lokale Branches konfiguriert für 'git pull':"
 
-#: builtin/remote.c:1208
+#: builtin/remote.c:1214
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Lokale Referenzen werden von 'git push' gespiegelt"
 
-#: builtin/remote.c:1215
+#: builtin/remote.c:1221
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Lokale Referenz konfiguriert für 'git push'%s:"
 msgstr[1] "  Lokale Referenzen konfiguriert für 'git push'%s:"
 
-#: builtin/remote.c:1236
+#: builtin/remote.c:1242
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "setzt refs/remotes/<Name>/HEAD gemäß dem Remote-Repository"
 
-#: builtin/remote.c:1238
+#: builtin/remote.c:1244
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "entfernt refs/remotes/<Name>/HEAD"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1259
 msgid "Cannot determine remote HEAD"
 msgstr "Kann HEAD des Remote-Repositories nicht bestimmen"
 
-#: builtin/remote.c:1255
+#: builtin/remote.c:1261
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 "Mehrere Hauptbranches im Remote-Repository. Bitte wählen Sie explizit einen "
 "aus mit:"
 
-#: builtin/remote.c:1265
+#: builtin/remote.c:1271
 #, c-format
 msgid "Could not delete %s"
 msgstr "Konnte %s nicht entfernen"
 
-#: builtin/remote.c:1273
+#: builtin/remote.c:1279
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "keine gültige Referenz: %s"
 
-#: builtin/remote.c:1275
+#: builtin/remote.c:1281
 #, c-format
 msgid "Could not setup %s"
 msgstr "Konnte %s nicht einrichten"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1299
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s wird unreferenziert!"
 
-#: builtin/remote.c:1294
+#: builtin/remote.c:1300
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s wurde unreferenziert!"
 
-#: builtin/remote.c:1304
+#: builtin/remote.c:1310
 #, c-format
 msgid "Pruning %s"
 msgstr "entferne veraltete Branches von %s"
 
-#: builtin/remote.c:1305
+#: builtin/remote.c:1311
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1321
+#: builtin/remote.c:1327
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [würde veralteten Branch entfernen] %s"
 
-#: builtin/remote.c:1324
+#: builtin/remote.c:1330
 #, c-format
 msgid " * [pruned] %s"
 msgstr "* [veralteten Branch entfernt] %s"
 
-#: builtin/remote.c:1369
+#: builtin/remote.c:1375
 msgid "prune remotes after fetching"
 msgstr "entferne veraltete Branches im Remote-Repository nach \"fetch\""
 
-#: builtin/remote.c:1435 builtin/remote.c:1509
+#: builtin/remote.c:1441 builtin/remote.c:1498 builtin/remote.c:1566
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Kein solches Remote-Repository '%s'"
 
-#: builtin/remote.c:1455
+#: builtin/remote.c:1461
 msgid "add branch"
 msgstr "Branch hinzufügen"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1468
 msgid "no remote specified"
 msgstr "kein Remote-Repository angegeben"
 
-#: builtin/remote.c:1484
+#: builtin/remote.c:1485
+msgid "query push URLs rather than fetch URLs"
+msgstr "nur URLs für Push ausgeben"
+
+#: builtin/remote.c:1487
+msgid "return all URLs"
+msgstr "alle URLs ausgeben"
+
+#: builtin/remote.c:1515
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr "Keine URLs für Remote-Repository '%s' konfiguriert."
+
+#: builtin/remote.c:1541
 msgid "manipulate push URLs"
 msgstr "URLs für \"push\" manipulieren"
 
-#: builtin/remote.c:1486
+#: builtin/remote.c:1543
 msgid "add URL"
 msgstr "URL hinzufügen"
 
-#: builtin/remote.c:1488
+#: builtin/remote.c:1545
 msgid "delete URLs"
 msgstr "URLs löschen"
 
-#: builtin/remote.c:1495
+#: builtin/remote.c:1552
 msgid "--add --delete doesn't make sense"
 msgstr ""
 "Die Optionen --add und --delete können nicht gemeinsam verwendet werden."
 
-#: builtin/remote.c:1535
+#: builtin/remote.c:1592
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "ungültiges altes URL Format: %s"
 
-#: builtin/remote.c:1543
+#: builtin/remote.c:1600
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Keine solche URL gefunden: %s"
 
-#: builtin/remote.c:1545
+#: builtin/remote.c:1602
 msgid "Will not delete all non-push URLs"
 msgstr "Werde keine URLs entfernen, die nicht für \"push\" bestimmt sind"
 
-#: builtin/remote.c:1559
+#: builtin/remote.c:1616
 msgid "be verbose; must be placed before a subcommand"
 msgstr "erweiterte Ausgaben; muss vor einem Unterkommando angegeben werden"
 
@@ -9926,7 +10007,11 @@
 msgstr ""
 "Objekte umpacken, die sich in mit .keep markierten Pack-Dateien befinden"
 
-#: builtin/repack.c:378
+#: builtin/repack.c:197
+msgid "cannot delete packs in a precious-objects repo"
+msgstr "kann Pack-Dateien in precious-objects Repository nicht löschen"
+
+#: builtin/repack.c:381
 #, c-format
 msgid "removing '%s' failed"
 msgstr "Löschen von '%s' fehlgeschlagen"
@@ -10021,7 +10106,7 @@
 msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
 msgstr "git rerere [clean | forget <Pfad>... | status | remaining | diff | gc]"
 
-#: builtin/rerere.c:57
+#: builtin/rerere.c:58
 msgid "register clean resolutions in index"
 msgstr "saubere Auflösungen im Index registrieren"
 
@@ -10157,24 +10242,24 @@
 msgid "rev-list does not support display of notes"
 msgstr "rev-list unterstützt keine Anzeige von Notizen"
 
-#: builtin/rev-parse.c:361
+#: builtin/rev-parse.c:358
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<Optionen>] -- [<Argumente>...]"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:363
 msgid "keep the `--` passed as an arg"
 msgstr "`--` als Argument lassen"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:365
 msgid "stop parsing after the first non-option argument"
 msgstr "das Parsen nach dem ersten Argument, was keine Option ist, stoppen"
 
-#: builtin/rev-parse.c:371
+#: builtin/rev-parse.c:368
 msgid "output in stuck long form"
 msgstr ""
 "Ausgabe in Langform mit Argumenten an den Optionen (getrennt durch '=')"
 
-#: builtin/rev-parse.c:502
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -10440,7 +10525,7 @@
 msgid "Linewrap output"
 msgstr "Ausgabe mit Zeilenumbrüchen"
 
-#: builtin/show-branch.c:9
+#: builtin/show-branch.c:10
 msgid ""
 "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
 "\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
@@ -10452,72 +10537,72 @@
 "\t\t[--more=<n> | --list | --independent | --merge-base]\n"
 "\t\t[--no-name | --sha1-name] [--topics] [(<Commit> | <glob>)...]"
 
-#: builtin/show-branch.c:13
+#: builtin/show-branch.c:14
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<Basis>]] [--list] [<Referenz>]"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:640
 msgid "show remote-tracking and local branches"
 msgstr "Remote-Tracking und lokale Branches anzeigen"
 
-#: builtin/show-branch.c:661
+#: builtin/show-branch.c:642
 msgid "show remote-tracking branches"
 msgstr "Remote-Tracking-Branches anzeigen"
 
-#: builtin/show-branch.c:663
+#: builtin/show-branch.c:644
 msgid "color '*!+-' corresponding to the branch"
 msgstr "'*!+-' entsprechend des Branches einfärben"
 
-#: builtin/show-branch.c:665
+#: builtin/show-branch.c:646
 msgid "show <n> more commits after the common ancestor"
 msgstr "<n> weitere Commits nach dem gemeinsamen Vorgänger-Commit anzeigen"
 
-#: builtin/show-branch.c:667
+#: builtin/show-branch.c:648
 msgid "synonym to more=-1"
 msgstr "Synonym für more=-1"
 
-#: builtin/show-branch.c:668
+#: builtin/show-branch.c:649
 msgid "suppress naming strings"
 msgstr "Namen unterdrücken"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:651
 msgid "include the current branch"
 msgstr "den aktuellen Branch einbeziehen"
 
-#: builtin/show-branch.c:672
+#: builtin/show-branch.c:653
 msgid "name commits with their object names"
 msgstr "Commits nach ihren Objektnamen benennen"
 
-#: builtin/show-branch.c:674
+#: builtin/show-branch.c:655
 msgid "show possible merge bases"
 msgstr "mögliche Merge-Basen anzeigen"
 
-#: builtin/show-branch.c:676
+#: builtin/show-branch.c:657
 msgid "show refs unreachable from any other ref"
 msgstr ""
 "Referenzen, die unerreichbar von allen anderen Referenzen sind, anzeigen"
 
-#: builtin/show-branch.c:678
+#: builtin/show-branch.c:659
 msgid "show commits in topological order"
 msgstr "Commits in topologischer Ordnung anzeigen"
 
-#: builtin/show-branch.c:681
+#: builtin/show-branch.c:662
 msgid "show only commits not on the first branch"
 msgstr "nur Commits anzeigen, die sich nicht im ersten Branch befinden"
 
-#: builtin/show-branch.c:683
+#: builtin/show-branch.c:664
 msgid "show merges reachable from only one tip"
 msgstr "Merges anzeigen, die nur von einem Branch aus erreichbar sind"
 
-#: builtin/show-branch.c:685
+#: builtin/show-branch.c:666
 msgid "topologically sort, maintaining date order where possible"
 msgstr "topologische Sortierung, Beibehaltung Datumsordnung wo möglich"
 
-#: builtin/show-branch.c:688
+#: builtin/show-branch.c:669
 msgid "<n>[,<base>]"
 msgstr "<n>[,<Basis>]"
 
-#: builtin/show-branch.c:689
+#: builtin/show-branch.c:670
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "die <n> jüngsten Einträge im Reflog, beginnend an der Basis, anzeigen"
 
@@ -10530,45 +10615,138 @@
 "hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<Muster>...] "
 
 #: builtin/show-ref.c:11
-msgid "git show-ref --exclude-existing[=<pattern>] < <ref-list>"
-msgstr "git show-ref --exclude-existing[=<Muster>] < <Referenzliste>"
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr "git show-ref --exclude-existing[=<Muster>]"
 
-#: builtin/show-ref.c:170
+#: builtin/show-ref.c:165
 msgid "only show tags (can be combined with heads)"
 msgstr "nur Tags anzeigen (kann mit \"heads\" kombiniert werden)"
 
-#: builtin/show-ref.c:171
+#: builtin/show-ref.c:166
 msgid "only show heads (can be combined with tags)"
 msgstr "nur Branches anzeigen (kann mit \"tags\" kombiniert werden)"
 
-#: builtin/show-ref.c:172
+#: builtin/show-ref.c:167
 msgid "stricter reference checking, requires exact ref path"
 msgstr "strengere Referenzprüfung, erfordert exakten Referenzpfad"
 
-#: builtin/show-ref.c:175 builtin/show-ref.c:177
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr ""
 "die HEAD-Referenz anzeigen, selbst wenn diese ausgefiltert werden würde"
 
-#: builtin/show-ref.c:179
+#: builtin/show-ref.c:174
 msgid "dereference tags into object IDs"
 msgstr "Tags in Objekt-Identifikationen dereferenzieren"
 
-#: builtin/show-ref.c:181
+#: builtin/show-ref.c:176
 msgid "only show SHA1 hash using <n> digits"
 msgstr "nur SHA1 Hash mit <n> Ziffern anzeigen"
 
-#: builtin/show-ref.c:185
+#: builtin/show-ref.c:180
 msgid "do not print results to stdout (useful with --verify)"
 msgstr ""
 "keine Ausgabe der Ergebnisse in die Standard-Ausgabe (nützlich mit --verify)"
 
-#: builtin/show-ref.c:187
+#: builtin/show-ref.c:182
 msgid "show refs from stdin that aren't in local repository"
 msgstr ""
 "Referenzen von der Standard-Eingabe anzeigen, die sich nicht im lokalen "
 "Repository befinden"
 
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr "git stripspace [-s | --strip-comments]"
+
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr "git stripspace [-c | --comment-lines]"
+
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr "alle Zeilen, die mit dem Kommentarzeichen beginnen, überspringen und "
+"entfernen"
+
+#: builtin/stripspace.c:38
+msgid "prepend comment character and blank to each line"
+msgstr "Kommentarzeichen mit Leerzeichen an jeder Zeile voranstellen"
+
+#: builtin/submodule--helper.c:79 builtin/submodule--helper.c:167
+msgid "alternative anchor for relative paths"
+msgstr "Alternativer Anker für relative Pfade"
+
+#: builtin/submodule--helper.c:84
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper list [--prefix=<Pfad>] [<Pfad>...]"
+
+#: builtin/submodule--helper.c:114
+msgid "git submodule--helper name <path>"
+msgstr "git submodule--helper name <Pfad>"
+
+#: builtin/submodule--helper.c:120
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr "Keine Submodul-Zuordnung in .gitmodules für Pfad '%s' gefunden"
+
+#: builtin/submodule--helper.c:170
+msgid "where the new submodule will be cloned to"
+msgstr "Pfad für neues Submodul"
+
+#: builtin/submodule--helper.c:173
+msgid "name of the new submodule"
+msgstr "Name des neuen Submoduls"
+
+#: builtin/submodule--helper.c:176
+msgid "url where to clone the submodule from"
+msgstr "URL von der das Submodul geklont wird"
+
+#: builtin/submodule--helper.c:182
+msgid "depth for shallow clones"
+msgstr "Tiefe des Klons mit unvollständiger Historie (shallow)"
+
+#: builtin/submodule--helper.c:188
+msgid ""
+"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
+"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+msgstr ""
+"git submodule--helper clone [--prefix=<Pfad>] [--quiet] [--reference "
+"<Repository>] [--name <Name>] [--url <URL>][--depth <Tiefe>] [--] [<Pfad>...]"
+
+#: builtin/submodule--helper.c:202 builtin/submodule--helper.c:208
+#: builtin/submodule--helper.c:216
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "Konnte Verzeichnis '%s' nicht erstellen."
+
+#: builtin/submodule--helper.c:204
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr "Klonen von '%s' in Submodul-Pfad '%s' fehlgeschlagen"
+
+#: builtin/submodule--helper.c:227
+#, c-format
+msgid "cannot open file '%s'"
+msgstr "Kann Datei '%s' nicht öffnen"
+
+#: builtin/submodule--helper.c:232
+#, c-format
+msgid "could not close file %s"
+msgstr "Konnte Datei '%s' nicht schließen."
+
+#: builtin/submodule--helper.c:247
+#, c-format
+msgid "could not get submodule directory for '%s'"
+msgstr "Konnte Submodul-Verzeichnis '%s' nicht finden."
+
+#: builtin/submodule--helper.c:273
+msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+msgstr "fatal: submodule--helper muss mit einem Unterkommando aufgerufen werden"
+
+#: builtin/submodule--helper.c:280
+#, c-format
+msgid "fatal: '%s' is not a valid submodule--helper subcommand"
+msgstr "fatal: '%s' ist kein gültiges Unterkommando von submodule--helper"
+
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
 msgstr "git symbolic-ref [<Optionen>] <Name> [<Referenz>]"
@@ -10598,7 +10776,7 @@
 msgid "reason of the update"
 msgstr "Grund für die Aktualisierung"
 
-#: builtin/tag.c:22
+#: builtin/tag.c:23
 msgid ""
 "git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
 "[<head>]"
@@ -10606,48 +10784,43 @@
 "git tag [-a | -s | -u <Schlüssel-id>] [-f] [-m <Beschreibung> | -F <Datei>] "
 "<Tagname> [<Commit>]"
 
-#: builtin/tag.c:23
+#: builtin/tag.c:24
 msgid "git tag -d <tagname>..."
 msgstr "git tag -d <Tagname>..."
 
-#: builtin/tag.c:24
+#: builtin/tag.c:25
 msgid ""
 "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
-"\t\t[<pattern>...]"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
 "git tag -l [-n[<Nummer>]] [--contains <Commit>] [--points-at <Objekt>]\n"
-"\t\t[<Muster>...]"
+"\t\t[--format=<Muster>] [--[no-]merged [<Commit>]] [<Muster>...]"
 
-#: builtin/tag.c:26
+#: builtin/tag.c:27
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <Tagname>..."
 
-#: builtin/tag.c:69
-#, c-format
-msgid "malformed object at '%s'"
-msgstr "fehlerhaftes Objekt bei '%s'"
-
-#: builtin/tag.c:301
+#: builtin/tag.c:80
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "Tagname zu lang: %.*s..."
 
-#: builtin/tag.c:306
+#: builtin/tag.c:85
 #, c-format
 msgid "tag '%s' not found."
 msgstr "Tag '%s' nicht gefunden."
 
-#: builtin/tag.c:321
+#: builtin/tag.c:100
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Tag '%s' gelöscht (war %s)\n"
 
-#: builtin/tag.c:333
+#: builtin/tag.c:112
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "Konnte Tag '%s' nicht verifizieren"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:122
 #, c-format
 msgid ""
 "\n"
@@ -10660,7 +10833,7 @@
 "  %s\n"
 "ein. Zeilen, die mit '%c' beginnen, werden ignoriert.\n"
 
-#: builtin/tag.c:347
+#: builtin/tag.c:126
 #, c-format
 msgid ""
 "\n"
@@ -10675,153 +10848,138 @@
 "ein. Zeilen, die mit '%c' beginnen, werden behalten; Sie dürfen diese\n"
 "selbst entfernen wenn Sie möchten.\n"
 
-#: builtin/tag.c:371
-#, c-format
-msgid "unsupported sort specification '%s'"
-msgstr "Nicht unterstützte Angabe für \"--sort\" '%s'"
-
-#: builtin/tag.c:373
-#, c-format
-msgid "unsupported sort specification '%s' in variable '%s'"
-msgstr "Nicht unterstützte Angabe für \"--sort\" '%s' in Variable '%s'"
-
-#: builtin/tag.c:428
+#: builtin/tag.c:199
 msgid "unable to sign the tag"
 msgstr "konnte Tag nicht signieren"
 
-#: builtin/tag.c:430
+#: builtin/tag.c:201
 msgid "unable to write tag file"
 msgstr "konnte Tag-Datei nicht schreiben"
 
-#: builtin/tag.c:455
+#: builtin/tag.c:226
 msgid "bad object type."
 msgstr "ungültiger Objekt-Typ"
 
-#: builtin/tag.c:468
+#: builtin/tag.c:239
 msgid "tag header too big."
 msgstr "Tag-Kopf zu groß."
 
-#: builtin/tag.c:504
+#: builtin/tag.c:275
 msgid "no tag message?"
 msgstr "keine Tag-Beschreibung?"
 
-#: builtin/tag.c:510
+#: builtin/tag.c:281
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Die Tag-Beschreibung wurde gelassen in %s\n"
 
-#: builtin/tag.c:559
-msgid "switch 'points-at' requires an object"
-msgstr "Option 'points-at' erfordert ein Objekt"
-
-#: builtin/tag.c:561
-#, c-format
-msgid "malformed object name '%s'"
-msgstr "fehlerhafter Objekt-Name '%s'"
-
-#: builtin/tag.c:590
+#: builtin/tag.c:339
 msgid "list tag names"
 msgstr "Tagnamen auflisten"
 
-#: builtin/tag.c:592
+#: builtin/tag.c:341
 msgid "print <n> lines of each tag message"
 msgstr "<n> Zeilen jeder Tag-Beschreibung anzeigen"
 
-#: builtin/tag.c:594
+#: builtin/tag.c:343
 msgid "delete tags"
 msgstr "Tags löschen"
 
-#: builtin/tag.c:595
+#: builtin/tag.c:344
 msgid "verify tags"
 msgstr "Tags überprüfen"
 
-#: builtin/tag.c:597
+#: builtin/tag.c:346
 msgid "Tag creation options"
 msgstr "Optionen für Erstellung von Tags"
 
-#: builtin/tag.c:599
+#: builtin/tag.c:348
 msgid "annotated tag, needs a message"
 msgstr "annotiertes Tag, benötigt eine Beschreibung"
 
-#: builtin/tag.c:601
+#: builtin/tag.c:350
 msgid "tag message"
 msgstr "Tag-Beschreibung"
 
-#: builtin/tag.c:603
+#: builtin/tag.c:352
 msgid "annotated and GPG-signed tag"
 msgstr "annotiertes und GPG-signiertes Tag"
 
-#: builtin/tag.c:607
+#: builtin/tag.c:356
 msgid "use another key to sign the tag"
 msgstr "einen anderen Schlüssel verwenden, um das Tag zu signieren"
 
-#: builtin/tag.c:608
+#: builtin/tag.c:357
 msgid "replace the tag if exists"
 msgstr "das Tag ersetzen, wenn es existiert"
 
-#: builtin/tag.c:609 builtin/update-ref.c:368
+#: builtin/tag.c:358 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "Reflog erstellen"
 
-#: builtin/tag.c:611
+#: builtin/tag.c:360
 msgid "Tag listing options"
 msgstr "Optionen für Auflistung der Tags"
 
-#: builtin/tag.c:612
+#: builtin/tag.c:361
 msgid "show tag list in columns"
 msgstr "Liste der Tags in Spalten anzeigen"
 
-#: builtin/tag.c:614
-msgid "sort tags"
-msgstr "Tags sortieren"
-
-#: builtin/tag.c:619 builtin/tag.c:625
+#: builtin/tag.c:362 builtin/tag.c:363
 msgid "print only tags that contain the commit"
 msgstr "nur Tags ausgeben, die diesen Commit beinhalten"
 
-#: builtin/tag.c:631
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
+msgstr "nur Tags ausgeben, die gemerged wurden"
+
+#: builtin/tag.c:365
+msgid "print only tags that are not merged"
+msgstr "nur Tags ausgeben, die nicht gemerged wurden"
+
+#: builtin/tag.c:370
 msgid "print only tags of the object"
 msgstr "nur Tags von dem Objekt ausgeben"
 
-#: builtin/tag.c:657
+#: builtin/tag.c:399
 msgid "--column and -n are incompatible"
 msgstr "--column und -n sind inkompatibel"
 
-#: builtin/tag.c:669
-msgid "--sort and -n are incompatible"
-msgstr "--sort und -n sind inkompatibel"
-
-#: builtin/tag.c:676
+#: builtin/tag.c:419
 msgid "-n option is only allowed with -l."
 msgstr "-n Option ist nur erlaubt mit -l."
 
-#: builtin/tag.c:678
+#: builtin/tag.c:421
 msgid "--contains option is only allowed with -l."
 msgstr "--contains Option ist nur erlaubt mit -l."
 
-#: builtin/tag.c:680
+#: builtin/tag.c:423
 msgid "--points-at option is only allowed with -l."
 msgstr "--points-at Option ist nur erlaubt mit -l."
 
-#: builtin/tag.c:688
+#: builtin/tag.c:425
+msgid "--merged and --no-merged option are only allowed with -l"
+msgstr "Die Optionen --merged und --no-merged sind nur mit -l erlaubt."
+
+#: builtin/tag.c:433
 msgid "only one -F or -m option is allowed."
 msgstr "nur eine -F oder -m Option ist erlaubt."
 
-#: builtin/tag.c:708
+#: builtin/tag.c:453
 msgid "too many params"
 msgstr "zu viele Parameter"
 
-#: builtin/tag.c:714
+#: builtin/tag.c:459
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' ist kein gültiger Tagname."
 
-#: builtin/tag.c:719
+#: builtin/tag.c:464
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "Tag '%s' existiert bereits"
 
-#: builtin/tag.c:744
+#: builtin/tag.c:489
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Tag '%s' aktualisiert (war %s)\n"
@@ -11099,78 +11257,82 @@
 msgid "print tag contents"
 msgstr "Tag-Inhalte ausgeben"
 
-#: builtin/worktree.c:13
-msgid "git worktree add [<options>] <path> <branch>"
-msgstr "git worktree add [<Optionen>] <Pfad> <Branch>"
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr "git worktree add [<Optionen>] <Pfad> [<Branch>]"
 
-#: builtin/worktree.c:14
+#: builtin/worktree.c:16
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<Optionen>]"
 
-#: builtin/worktree.c:36
+#: builtin/worktree.c:17
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<Optionen>]"
+
+#: builtin/worktree.c:39
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Lösche worktrees/%s: kein gültiges Verzeichnis"
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:45
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Lösche worktrees/%s: gitdir-Datei existiert nicht"
 
-#: builtin/worktree.c:47
+#: builtin/worktree.c:50
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "Lösche worktrees/%s: konnte gitdir-Datei (%s) nicht lesen"
 
-#: builtin/worktree.c:58
+#: builtin/worktree.c:61
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Lösche worktrees/%s: ungültige gitdir-Datei"
 
-#: builtin/worktree.c:74
+#: builtin/worktree.c:77
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "Lösche worktrees/%s: gitdir-Datei verweist auf nicht existierenden Ort"
 
-#: builtin/worktree.c:109
+#: builtin/worktree.c:112
 #, c-format
 msgid "failed to remove: %s"
 msgstr "Fehler beim Löschen: %s"
 
-#: builtin/worktree.c:198
+#: builtin/worktree.c:201
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' existiert bereits"
 
-#: builtin/worktree.c:232
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: builtin/worktree.c:268
+#: builtin/worktree.c:271
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Bereite %s vor (Identifikation %s)"
 
-#: builtin/worktree.c:316
+#: builtin/worktree.c:319
 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:318
+#: builtin/worktree.c:321
 msgid "create a new branch"
 msgstr "neuen Branch erstellen"
 
-#: builtin/worktree.c:320
+#: builtin/worktree.c:323
 msgid "create or reset a branch"
 msgstr "Branch erstellen oder umsetzen"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:324
 msgid "detach HEAD at named commit"
 msgstr "HEAD bei benanntem Commit loslösen"
 
-#: builtin/worktree.c:328
+#: builtin/worktree.c:331
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B und --detach schließen sich gegenseitig aus"
 
@@ -11327,49 +11489,49 @@
 msgid "no-op (backward compatibility)"
 msgstr "Kein Effekt (Rückwärtskompatibilität)"
 
-#: parse-options.h:236
+#: parse-options.h:237
 msgid "be more verbose"
 msgstr "erweiterte Ausgaben"
 
-#: parse-options.h:238
+#: parse-options.h:239
 msgid "be more quiet"
 msgstr "weniger Ausgaben"
 
-#: parse-options.h:244
+#: parse-options.h:245
 msgid "use <n> digits to display SHA-1s"
 msgstr "benutze <n> Ziffern zur Anzeige von SHA-1s"
 
-#: rerere.h:28
+#: rerere.h:38
 msgid "update the index with reused conflict resolution if possible"
 msgstr ""
 "Index, wenn möglich, mit wiederverwendeter Konfliktauflösung aktualisieren"
 
-#: git-bisect.sh:50
+#: git-bisect.sh:55
 msgid "You need to start by \"git bisect start\""
 msgstr "Sie müssen mit \"git bisect start\" beginnen."
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:56
+#: git-bisect.sh:61
 msgid "Do you want me to do it for you [Y/n]? "
 msgstr "Wollen Sie, dass ich es für Sie mache [Y/n]? "
 
-#: git-bisect.sh:99
+#: git-bisect.sh:122
 #, sh-format
 msgid "unrecognised option: '$arg'"
 msgstr "nicht erkannte Option: '$arg'"
 
-#: git-bisect.sh:103
+#: git-bisect.sh:126
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr "'$arg' scheint kein gültiger Commit zu sein"
 
-#: git-bisect.sh:132
+#: git-bisect.sh:155
 msgid "Bad HEAD - I need a HEAD"
 msgstr "Ungültiger HEAD - HEAD wird benötigt"
 
-#: git-bisect.sh:145
+#: git-bisect.sh:168
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
@@ -11377,40 +11539,40 @@
 "Auschecken von '$start_head' fehlgeschlagen. Versuchen Sie 'git bisect reset "
 "<gültiger-Branch>'."
 
-#: git-bisect.sh:155
+#: git-bisect.sh:178
 msgid "won't bisect on cg-seek'ed tree"
 msgstr ""
 "binäre Suche auf einem durch 'cg-seek' geändertem Verzeichnis nicht möglich"
 
-#: git-bisect.sh:159
+#: git-bisect.sh:182
 msgid "Bad HEAD - strange symbolic ref"
 msgstr "Ungültiger HEAD - merkwürdige symbolische Referenz"
 
-#: git-bisect.sh:211
+#: git-bisect.sh:234
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr "Ungültiges \"bisect_write\" Argument: $state"
 
-#: git-bisect.sh:240
+#: git-bisect.sh:263
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr "Ungültige Referenz-Eingabe: $arg"
 
-#: git-bisect.sh:255
+#: git-bisect.sh:278
 msgid "Please call 'bisect_state' with at least one argument."
 msgstr "Bitte rufen Sie 'bisect_state' mit mindestens einem Argument auf."
 
-#: git-bisect.sh:267
+#: git-bisect.sh:290
 #, sh-format
 msgid "Bad rev input: $rev"
 msgstr "Ungültige Referenz-Eingabe: $rev"
 
-#: git-bisect.sh:276
+#: git-bisect.sh:299
 #, sh-format
 msgid "'git bisect $TERM_BAD' can take only one argument."
 msgstr "'git bisect $TERM_BAD' kann nur ein Argument entgegennehmen."
 
-#: git-bisect.sh:299
+#: git-bisect.sh:322
 #, sh-format
 msgid "Warning: bisecting only with a $TERM_BAD commit."
 msgstr "Warnung: binäre Suche nur mit einem $TERM_BAD Commit."
@@ -11418,11 +11580,11 @@
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:305
+#: git-bisect.sh:328
 msgid "Are you sure [Y/n]? "
 msgstr "Sind Sie sicher [Y/n]? "
 
-#: git-bisect.sh:317
+#: git-bisect.sh:340
 #, sh-format
 msgid ""
 "You need to give me at least one $bad_syn and one $good_syn revision.\n"
@@ -11433,7 +11595,7 @@
 "(Sie können dafür \"git bisect $bad_syn\" und \"git bisect $good_syn\" "
 "benutzen.)"
 
-#: git-bisect.sh:320
+#: git-bisect.sh:343
 #, sh-format
 msgid ""
 "You need to start by \"git bisect start\".\n"
@@ -11446,16 +11608,16 @@
 "(Sie können dafür \"git bisect $bad_syn\" und \"git bisect $good_syn\" "
 "benutzen.)"
 
-#: git-bisect.sh:391 git-bisect.sh:521
+#: git-bisect.sh:414 git-bisect.sh:546
 msgid "We are not bisecting."
 msgstr "keine binäre Suche im Gange"
 
-#: git-bisect.sh:398
+#: git-bisect.sh:421
 #, sh-format
 msgid "'$invalid' is not a valid commit"
 msgstr "'$invalid' ist kein gültiger Commit"
 
-#: git-bisect.sh:407
+#: git-bisect.sh:430
 #, sh-format
 msgid ""
 "Could not check out original HEAD '$branch'.\n"
@@ -11464,25 +11626,25 @@
 "Konnte den ursprünglichen HEAD '$branch' nicht auschecken.\n"
 "Versuchen Sie 'git bisect reset <Commit>'."
 
-#: git-bisect.sh:435
+#: git-bisect.sh:458
 msgid "No logfile given"
 msgstr "Keine Log-Datei gegeben"
 
-#: git-bisect.sh:436
+#: git-bisect.sh:459
 #, sh-format
 msgid "cannot read $file for replaying"
 msgstr "kann $file nicht für das Abspielen lesen"
 
-#: git-bisect.sh:455
+#: git-bisect.sh:480
 msgid "?? what are you talking about?"
 msgstr "?? Was reden Sie da?"
 
-#: git-bisect.sh:467
+#: git-bisect.sh:492
 #, sh-format
 msgid "running $command"
 msgstr "führe $command aus"
 
-#: git-bisect.sh:474
+#: git-bisect.sh:499
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -11491,11 +11653,11 @@
 "'bisect run' fehlgeschlagen:\n"
 "Rückkehrwert $res von '$command' ist < 0 oder >= 128"
 
-#: git-bisect.sh:500
+#: git-bisect.sh:525
 msgid "bisect run cannot continue any more"
 msgstr "'bisect run' kann nicht mehr fortgesetzt werden"
 
-#: git-bisect.sh:506
+#: git-bisect.sh:531
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -11504,17 +11666,49 @@
 "'bisect run' fehlgeschlagen:\n"
 "'bisect_state $state' wurde mit Fehlerwert $res beendet"
 
-#: git-bisect.sh:513
+#: git-bisect.sh:538
 msgid "bisect run success"
 msgstr "'bisect run' erfolgreich ausgeführt"
 
-#: git-bisect.sh:548
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr "Bitte verwenden Sie zwei verschiedene Begriffe."
+
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr "'$term' ist kein gültiger Begriff"
+
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr "Kann eingebautes Kommando '$term' nicht als Begriff verwenden"
+
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr "Kann Bedeutung von '$term' nicht ändern."
+
+#: git-bisect.sh:606
 #, sh-format
 msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
 msgstr ""
 "Ungültiges Kommando: Sie sind gerade bei einer binären $TERM_BAD/$TERM_GOOD "
 "Suche."
 
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "Keine Begriffe definiert."
+
+#: git-bisect.sh:653
+#, sh-format
+msgid ""
+"invalid argument $arg for 'git bisect terms'.\n"
+"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+msgstr ""
+"Ungültiges Argument $arg für 'git bisect terms'.\n"
+"Unterstützte Optionen sind: --term-good|--term-old und --term-bad|--term-new."
+
 #: git-rebase.sh:57
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
@@ -11556,25 +11750,25 @@
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "\"git-am\" scheint im Gange zu sein. Kann Rebase nicht durchführen."
 
-#: git-rebase.sh:351
+#: git-rebase.sh:354
 msgid "The --exec option must be used with the --interactive option"
 msgstr "Die Option --exec muss mit --interactive verwendet werden."
 
-#: git-rebase.sh:356
+#: git-rebase.sh:359
 msgid "No rebase in progress?"
 msgstr "Kein Rebase im Gange?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:370
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "Die --edit-todo Aktion kann nur während eines interaktiven Rebase verwendet "
 "werden."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:377
 msgid "Cannot read HEAD"
 msgstr "Kann HEAD nicht lesen"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:380
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -11582,12 +11776,12 @@
 "Sie müssen alle Merge-Konflikte editieren und diese dann\n"
 "mittels \"git add\" als aufgelöst markieren"
 
-#: git-rebase.sh:395
+#: git-rebase.sh:398
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Konnte nicht zu $head_name zurückgehen"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:417
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11608,67 +11802,67 @@
 "und führen Sie dieses Kommando nochmal aus. Es wird angehalten, falls noch\n"
 "etwas Schützenswertes vorhanden ist."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:468
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "ungültiger Upstream-Branch $upstream_name"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:492
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: es gibt mehr als eine Merge-Basis"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:495 git-rebase.sh:499
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: es gibt keine Merge-Basis"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:504
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "$onto_name zeigt auf keinen gültigen Commit"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:527
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal: Branch $branch_name nicht gefunden"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:560
 msgid "Cannot autostash"
 msgstr "Kann \"autostash\" nicht ausführen."
 
-#: git-rebase.sh:562
+#: git-rebase.sh:565
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "\"autostash\" erzeugt: $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:569
 msgid "Please commit or stash them."
 msgstr "Bitte committen Sie die Änderungen oder benutzen Sie \"stash\"."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:589
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Aktueller Branch $branch_name ist auf dem neuesten Stand."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:593
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr ""
 "Aktueller Branch $branch_name ist auf dem neuesten Stand, Rebase erzwungen."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:604
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Änderungen von $mb zu $onto:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:613
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Zunächst wird der Branch zurückgespult, um Ihre Änderungen\n"
 "darauf neu anzuwenden ..."
 
-#: git-rebase.sh:620
+#: git-rebase.sh:623
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "$branch_name zu $onto_name vorgespult."
@@ -11742,114 +11936,99 @@
 msgid "Cannot remove worktree changes"
 msgstr "Kann Änderungen im Arbeitsverzeichnis nicht löschen"
 
-#: git-stash.sh:387
+#: git-stash.sh:405
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "unbekannte Option: $opt"
 
-#: git-stash.sh:397
+#: git-stash.sh:415
 msgid "No stash found."
-msgstr "Kein \"stash\" gefunden."
+msgstr "Kein Stash-Eintrag gefunden."
 
-#: git-stash.sh:404
+#: git-stash.sh:422
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Zu viele Commits angegeben: $REV"
 
-#: git-stash.sh:410
+#: git-stash.sh:428
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference ist keine gültige Referenz"
 
-#: git-stash.sh:438
+#: git-stash.sh:456
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' ist kein \"stash\"-artiger Commit"
 
-#: git-stash.sh:449
+#: git-stash.sh:467
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' ist keine \"stash\"-Referenz"
 
-#: git-stash.sh:457
+#: git-stash.sh:475
 msgid "unable to refresh index"
-msgstr "unfähig den Index zu aktualisieren"
+msgstr "Konnte den Index nicht aktualisieren."
 
-#: git-stash.sh:461
+#: git-stash.sh:479
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Kann \"stash\" nicht anwenden, solang ein Merge im Gange ist"
 
-#: git-stash.sh:469
+#: git-stash.sh:487
 msgid "Conflicts in index. Try without --index."
 msgstr "Konflikte im Index. Versuchen Sie es ohne --index."
 
-#: git-stash.sh:471
+#: git-stash.sh:489
 msgid "Could not save index tree"
 msgstr "Konnte Index-Verzeichnis nicht speichern"
 
-#: git-stash.sh:505
+#: git-stash.sh:523
 msgid "Cannot unstage modified files"
 msgstr "Kann geänderte Dateien nicht aus dem Index entfernen"
 
-#: git-stash.sh:520
+#: git-stash.sh:538
 msgid "Index was not unstashed."
 msgstr "Index wurde nicht aus dem Stash zurückgeladen."
 
-#: git-stash.sh:543
+#: git-stash.sh:561
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Gelöscht ${REV} ($s)"
 
-#: git-stash.sh:544
+#: git-stash.sh:562
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Konnte \"stash\"-Eintrag nicht löschen"
 
-#: git-stash.sh:552
+#: git-stash.sh:570
 msgid "No branch name specified"
 msgstr "Kein Branchname spezifiziert"
 
-#: git-stash.sh:624
+#: git-stash.sh:642
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Zur Wiederherstellung geben Sie \"git stash apply\" ein)"
 
-#: git-submodule.sh:95
+#: git-submodule.sh:104
 #, sh-format
 msgid "cannot strip one component off url '$remoteurl'"
 msgstr "Kann eine Komponente von URL '$remoteurl' nicht extrahieren"
 
-#: git-submodule.sh:237
-#, sh-format
-msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
-msgstr "Keine Submodul-Zuordnung in .gitmodules für Pfad '$sm_path' gefunden"
-
-#: git-submodule.sh:287
-#, sh-format
-msgid "Clone of '$url' into submodule path '$sm_path' failed"
-msgstr "Klonen von '$url' in Submodul-Pfad '$sm_path' fehlgeschlagen"
-
-#: git-submodule.sh:296
-#, sh-format
-msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-msgstr "Git-Verzeichnis '$a' ist Teil des Submodul-Pfades '$b', oder umgekehrt"
-
-#: git-submodule.sh:406
+#: git-submodule.sh:281
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 "Relative Pfade können nur von der obersten Ebene des Arbeitsverzeichnisses "
 "benutzt werden."
 
-#: git-submodule.sh:416
+#: git-submodule.sh:291
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "repo URL: '$repo' muss absolut sein oder mit ./|../ beginnen"
 
-#: git-submodule.sh:433
+#: git-submodule.sh:308
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' ist bereits zum Commit vorgemerkt"
 
-#: git-submodule.sh:437
+#: git-submodule.sh:312
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -11860,24 +12039,24 @@
 "$sm_path\n"
 "Benutzen Sie -f wenn Sie diesen wirklich hinzufügen möchten."
 
-#: git-submodule.sh:455
+#: git-submodule.sh:330
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Füge existierendes Repository in '$sm_path' dem Index hinzu."
 
-#: git-submodule.sh:457
+#: git-submodule.sh:332
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' existiert bereits und ist kein gültiges Git-Repository"
 
-#: git-submodule.sh:465
+#: git-submodule.sh:340
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 "Ein Git-Verzeichnis für '$sm_name' wurde lokal gefunden mit den Remote-"
 "Repositories:"
 
-#: git-submodule.sh:467
+#: git-submodule.sh:342
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
@@ -11885,7 +12064,7 @@
 "Wenn Sie dieses lokale Git-Verzeichnis wiederverwenden möchtest, anstatt "
 "erneut zu klonen"
 
-#: git-submodule.sh:469
+#: git-submodule.sh:344
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
@@ -11893,7 +12072,7 @@
 "benutzen Sie die Option '--force'. Wenn das lokale Git-Verzeichnis nicht das "
 "korrekte Repository ist"
 
-#: git-submodule.sh:470
+#: git-submodule.sh:345
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -11902,77 +12081,77 @@
 "oder Sie sich unsicher sind, was das bedeutet, wählen Sie einen anderen "
 "Namenmit der Option '--name'."
 
-#: git-submodule.sh:472
+#: git-submodule.sh:347
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Reaktiviere lokales Git-Verzeichnis für Submodul '$sm_name'."
 
-#: git-submodule.sh:484
+#: git-submodule.sh:359
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Kann Submodul '$sm_path' nicht auschecken"
 
-#: git-submodule.sh:489
+#: git-submodule.sh:364
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Hinzufügen von Submodul '$sm_path' fehlgeschlagen"
 
-#: git-submodule.sh:498
+#: git-submodule.sh:373
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Fehler beim Eintragen von Submodul '$sm_path' in die Konfiguration."
 
-#: git-submodule.sh:542
+#: git-submodule.sh:417
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Betrete '$prefix$displaypath'"
 
-#: git-submodule.sh:562
+#: git-submodule.sh:437
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr "Stoppe bei '$prefix$displaypath'; Skript gab nicht-Null Status zurück."
 
-#: git-submodule.sh:608
+#: git-submodule.sh:483
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr "Keine URL für Submodul-Pfad '$displaypath' in .gitmodules gefunden"
 
-#: git-submodule.sh:617
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr ""
 "Fehler beim Eintragen der URL für Submodul-Pfad '$displaypath' in die "
 "Konfiguration."
 
-#: git-submodule.sh:619
+#: git-submodule.sh:494
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr ""
 "Submodul '$name' ($url) für Pfad '$displaypath' in die Konfiguration "
 "eingetragen."
 
-#: git-submodule.sh:636
+#: git-submodule.sh:511
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr ""
 "Fehler bei Änderung des Aktualisierungsmodus für Submodul-Pfad "
 "'$displaypath' in der Konfiguration."
 
-#: git-submodule.sh:674
+#: git-submodule.sh:549
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr ""
 "Verwenden Sie '.' wenn Sie wirklich alle Submodule\n"
 "deinitialisieren möchten."
 
-#: git-submodule.sh:691
+#: git-submodule.sh:566
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr ""
 "Arbeitsverzeichnis des Submoduls in '$displaypath' enthält ein .git-"
 "Verzeichnis"
 
-#: git-submodule.sh:692
+#: git-submodule.sh:567
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -11980,7 +12159,7 @@
 "(benutzen Sie 'rm -rf' wenn Sie dieses Submodul wirklich mitsamt\n"
 "seiner Historie löschen möchten)"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:573
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -11989,31 +12168,31 @@
 "Arbeitsverzeichnis von Submodul in '$displaypath' enthält lokale Änderungen; "
 "verwenden Sie '-f', um diese zu verwerfen"
 
-#: git-submodule.sh:701
+#: git-submodule.sh:576
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Verzeichnis '$displaypath' bereinigt."
 
-#: git-submodule.sh:702
+#: git-submodule.sh:577
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 "Konnte Arbeitsverzeichnis des Submoduls in '$displaypath' nicht löschen."
 
-#: git-submodule.sh:705
+#: git-submodule.sh:580
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
 "Konnte kein leeres Verzeichnis für Submodul in '$displaypath' erstellen."
 
-#: git-submodule.sh:714
+#: git-submodule.sh:589
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 "Submodul '$name' ($url) für Pfad '$displaypath' wurde aus der Konfiguration "
 "entfernt."
 
-#: git-submodule.sh:830
+#: git-submodule.sh:705
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -12022,52 +12201,52 @@
 "Submodul-Pfad '$displaypath' ist nicht initialisiert.\n"
 "Vielleicht möchten Sie 'update --init' benutzen?"
 
-#: git-submodule.sh:843
+#: git-submodule.sh:718
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "Konnte aktuellen Commit in Submodul-Pfad '$displaypath' nicht finden."
 
-#: git-submodule.sh:852
+#: git-submodule.sh:727
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Konnte \"fetch\" in Submodul-Pfad '$sm_path' nicht ausführen"
 
-#: git-submodule.sh:876
+#: git-submodule.sh:751
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Konnte \"fetch\" in Submodul-Pfad '$displaypath' nicht ausführen"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:765
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Konnte '$sha1' in Submodul-Pfad '$displaypath' nicht auschecken."
 
-#: git-submodule.sh:891
+#: git-submodule.sh:766
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Submodul-Pfad: '$displaypath': '$sha1' ausgecheckt"
 
-#: git-submodule.sh:895
+#: git-submodule.sh:770
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "Rebase auf '$sha1' in Submodul-Pfad '$displaypath' nicht möglich"
 
-#: git-submodule.sh:896
+#: git-submodule.sh:771
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Submodul-Pfad '$displaypath': Rebase auf '$sha1'"
 
-#: git-submodule.sh:901
+#: git-submodule.sh:776
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "Merge von '$sha1' in Submodul-Pfad '$displaypath' fehlgeschlagen"
 
-#: git-submodule.sh:902
+#: git-submodule.sh:777
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Submodul-Pfad '$displaypath': zusammengeführt in '$sha1'"
 
-#: git-submodule.sh:907
+#: git-submodule.sh:782
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
@@ -12075,56 +12254,111 @@
 "Ausführung von '$command $sha1' in Submodul-Pfad '$prefix$sm_path' "
 "fehlgeschlagen"
 
-#: git-submodule.sh:908
+#: git-submodule.sh:783
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "Submodul-Pfad '$prefix$sm_path': '$command $sha1'"
 
-#: git-submodule.sh:938
+#: git-submodule.sh:813
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Fehler bei Rekursion in Submodul-Pfad '$displaypath'"
 
-#: git-submodule.sh:1046
+#: git-submodule.sh:921
 msgid "The --cached option cannot be used with the --files option"
 msgstr ""
 "Die Optionen --cached und --files können nicht gemeinsam verwendet werden."
 
-#: git-submodule.sh:1098
+#: git-submodule.sh:973
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "unerwarteter Modus $mod_dst"
 
-#: git-submodule.sh:1118
+#: git-submodule.sh:993
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Warnung: $display_name beinhaltet nicht Commit $sha1_src"
 
-#: git-submodule.sh:1121
+#: git-submodule.sh:996
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Warnung: $display_name beinhaltet nicht Commit $sha1_dst"
 
-#: git-submodule.sh:1124
+#: git-submodule.sh:999
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 "  Warnung: $display_name beinhaltet nicht die Commits $sha1_src und $sha1_dst"
 
-#: git-submodule.sh:1149
+#: git-submodule.sh:1024
 msgid "blob"
 msgstr "Blob"
 
-#: git-submodule.sh:1267
+#: git-submodule.sh:1142
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Fehler bei Rekursion in Submodul-Pfad '$sm_path'"
 
-#: git-submodule.sh:1331
+#: git-submodule.sh:1206
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synchronisiere Submodul-URL für '$displaypath'"
 
+#~ msgid "unable to look up current user in the passwd file: %s"
+#~ msgstr "konnte aktuellen Benutzer nicht in Passwort-Datei finden: %s"
+
+#~ msgid "no such user"
+#~ msgstr "kein solcher Benutzer"
+
+#~ msgid "branch '%s' does not point at a commit"
+#~ msgstr "Branch '%s' zeigt auf keinen Commit"
+
+#~ msgid "object '%s' does not point to a commit"
+#~ msgstr "Objekt '%s' zeigt auf keinen Commit"
+
+#~ msgid "some refs could not be read"
+#~ msgstr "Konnte einige Referenzen nicht lesen"
+
+#~ msgid "print only merged branches"
+#~ msgstr "nur Branches ausgeben, die zusammengeführt sind"
+
+#~ msgid "--dissociate given, but there is no --reference"
+#~ msgstr "--dissociate ohne --reference angegeben"
+
+#~ msgid "show usage"
+#~ msgstr "Verwendung anzeigen"
+
+#~ msgid "insanely long template name %s"
+#~ msgstr "zu langer Vorlagen-Name %s"
+
+#~ msgid "insanely long symlink %s"
+#~ msgstr "zu lange symbolische Verknüpfung %s"
+
+#~ msgid "insanely long template path %s"
+#~ msgstr "zu langer Vorlagen-Pfad %s"
+
+#~ msgid "insane git directory %s"
+#~ msgstr "ungültiges Git-Verzeichnis %s"
+
+#~ msgid "unsupported sort specification '%s'"
+#~ msgstr "Nicht unterstützte Angabe für \"--sort\" '%s'"
+
+#~ msgid "unsupported sort specification '%s' in variable '%s'"
+#~ msgstr "Nicht unterstützte Angabe für \"--sort\" '%s' in Variable '%s'"
+
+#~ msgid "switch 'points-at' requires an object"
+#~ msgstr "Option 'points-at' erfordert ein Objekt"
+
+#~ msgid "sort tags"
+#~ msgstr "Tags sortieren"
+
+#~ msgid "--sort and -n are incompatible"
+#~ msgstr "--sort und -n sind inkompatibel"
+
+#~ msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
+#~ msgstr ""
+#~ "Git-Verzeichnis '$a' ist Teil des Submodul-Pfades '$b', oder umgekehrt"
+
 #~ msgid "false|true|preserve"
 #~ msgstr "false|true|preserve"
 
diff --git a/po/fr.po b/po/fr.po
index 581167f..facc5c6 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -73,8 +73,8 @@
 msgstr ""
 "Project-Id-Version: git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2015-09-15 06:45+0800\n"
-"PO-Revision-Date: 2015-09-15 20:20+0200\n"
+"POT-Creation-Date: 2015-12-22 22:50+0800\n"
+"PO-Revision-Date: 2015-12-24 07:36+0100\n"
 "Last-Translator: Jean-Noël Avila <jn.avila@free.fr>\n"
 "Language-Team: Jean-Noël Avila <jn.avila@free.fr>\n"
 "Language: fr\n"
@@ -96,13 +96,13 @@
 "Corrigez-les puis lancez 'git add/rm <fichier>'\n"
 "si nécessaire pour marquer la résolution et valider."
 
-#: advice.c:101 builtin/merge.c:1227
+#: advice.c:101 builtin/merge.c:1225
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Vous n'avez pas terminé votre fusion (MERGE_HEAD existe)."
 
 #: advice.c:103
-msgid "Please, commit your changes before you can merge."
-msgstr "Veuillez valider vos changements avant de pouvoir fusionner."
+msgid "Please, commit your changes before merging."
+msgstr "Veuillez valider vos changements avant de fusionner."
 
 #: advice.c:104
 msgid "Exiting because of unfinished merge."
@@ -127,76 +127,76 @@
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <dépôt> [--exec <commande>] --list"
 
-#: archive.c:343 builtin/add.c:137 builtin/add.c:426 builtin/rm.c:327
+#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "le chemin '%s' ne correspond à aucun fichier"
 
-#: archive.c:428
+#: archive.c:429
 msgid "fmt"
 msgstr "fmt"
 
-#: archive.c:428
+#: archive.c:429
 msgid "archive format"
 msgstr "format d'archive"
 
-#: archive.c:429 builtin/log.c:1229
+#: archive.c:430 builtin/log.c:1229
 msgid "prefix"
 msgstr "préfixe"
 
-#: archive.c:430
+#: archive.c:431
 msgid "prepend prefix to each pathname in the archive"
 msgstr "préfixer chaque chemin de fichier dans l'archive"
 
-#: archive.c:431 builtin/archive.c:88 builtin/blame.c:2516 builtin/blame.c:2517
+#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535 builtin/blame.c:2536
 #: builtin/config.c:58 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:712 builtin/hash-object.c:99 builtin/ls-files.c:446
+#: builtin/grep.c:707 builtin/hash-object.c:99 builtin/ls-files.c:446
 #: builtin/ls-files.c:449 builtin/notes.c:395 builtin/notes.c:558
 #: builtin/read-tree.c:109 parse-options.h:153
 msgid "file"
 msgstr "fichier"
 
-#: archive.c:432 builtin/archive.c:89
+#: archive.c:433 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "écrire l'archive dans ce fichier"
 
-#: archive.c:434
+#: archive.c:435
 msgid "read .gitattributes in working directory"
 msgstr "lire .gitattributes dans le répertoire de travail"
 
-#: archive.c:435
+#: archive.c:436
 msgid "report archived files on stderr"
 msgstr "afficher les fichiers archivés sur stderr"
 
-#: archive.c:436
+#: archive.c:437
 msgid "store only"
 msgstr "stockage seulement"
 
-#: archive.c:437
+#: archive.c:438
 msgid "compress faster"
 msgstr "compression rapide"
 
-#: archive.c:445
+#: archive.c:446
 msgid "compress better"
 msgstr "compression efficace"
 
-#: archive.c:448
+#: archive.c:449
 msgid "list supported archive formats"
 msgstr "afficher les formats d'archive supportés"
 
-#: archive.c:450 builtin/archive.c:90 builtin/clone.c:77
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77
 msgid "repo"
 msgstr "dépôt"
 
-#: archive.c:451 builtin/archive.c:91
+#: archive.c:452 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "récupérer l'archive depuis le dépôt distant <dépôt>"
 
-#: archive.c:452 builtin/archive.c:92 builtin/notes.c:479
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479
 msgid "command"
 msgstr "commande"
 
-#: archive.c:453 builtin/archive.c:93
+#: archive.c:454 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "chemin vers la commande distante git-upload-archive"
 
@@ -208,90 +208,90 @@
 "Les motifs de négation sont ignorés dans les attributs git\n"
 "Utilisez '\\!' pour un point d'exclamation littéral."
 
-#: branch.c:60
+#: branch.c:61
 #, c-format
 msgid "Not setting branch %s as its own upstream."
 msgstr "La branche %s ne peut pas être sa propre branche amont."
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
 "La branche %s est paramétrée pour suivre la branche distante %s de %s en "
 "rebasant."
 
-#: branch.c:84
+#: branch.c:85
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr ""
 "La branche %s est paramétrée pour suivre la branche distante %s depuis %s."
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr ""
 "La branche %s est paramétrée pour suivre la branche locale %s en rebasant."
 
-#: branch.c:89
+#: branch.c:90
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "La branche %s est paramétrée pour suivre la branche locale %s."
 
-#: branch.c:94
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr ""
 "La branche %s est paramétrée pour suivre la référence distante %s en "
 "rebasant."
 
-#: branch.c:95
+#: branch.c:96
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "La branche %s est paramétrée pour suivre la référence distante %s."
 
-#: branch.c:99
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
 "La branche %s est paramétrée pour suivre la référence locale %s en rebasant."
 
-#: branch.c:100
+#: branch.c:101
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "La branche %s est paramétrée pour suivre la référence locale %s."
 
-#: branch.c:133
+#: branch.c:134
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "Pas de suivi : information ambiguë pour la référence %s"
 
-#: branch.c:162
+#: branch.c:163
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "'%s' n'est pas un nom de branche valide."
 
-#: branch.c:167
+#: branch.c:168
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Une branche nommée '%s' existe déjà."
 
-#: branch.c:175
+#: branch.c:176
 msgid "Cannot force update the current branch."
 msgstr "Impossible de forcer la mise à jour de la branche courante."
 
-#: branch.c:195
+#: branch.c:196
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr ""
 "Impossible de paramétrer le suivi de branche ; le point de départ '%s' n'est "
 "pas une branche."
 
-#: branch.c:197
+#: branch.c:198
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "la branche amont demandée '%s' n'existe pas"
 
-#: branch.c:199
+#: branch.c:200
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -311,22 +311,22 @@
 "sa jumelle distante, vous pouvez utiliser \"git push -u\"\n"
 "pour paramétrer le suivi distant en même temps que vous poussez."
 
-#: branch.c:243
+#: branch.c:244
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Nom d'objet invalide : '%s'."
 
-#: branch.c:263
+#: branch.c:264
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Nom d'objet ambigu : '%s'."
 
-#: branch.c:268
+#: branch.c:269
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Point d'embranchement invalide : '%s'."
 
-#: branch.c:399
+#: branch.c:322
 #, c-format
 msgid "'%s' is already checked out at '%s'"
 msgstr "'%s' est déjà extrait dans '%s'"
@@ -341,7 +341,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr "en-tête non reconnu : %s%s (%d)"
 
-#: bundle.c:87 builtin/commit.c:765
+#: bundle.c:87 builtin/commit.c:766
 #, c-format
 msgid "could not open '%s'"
 msgstr "impossible d'ouvrir '%s'"
@@ -350,9 +350,9 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Le dépôt ne dispose pas des commits prérequis suivants :"
 
-#: bundle.c:163 sequencer.c:636 sequencer.c:1083 builtin/blame.c:2708
-#: builtin/branch.c:652 builtin/commit.c:1044 builtin/log.c:334
-#: builtin/log.c:850 builtin/log.c:1457 builtin/log.c:1690 builtin/merge.c:358
+#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083
+#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334
+#: builtin/log.c:849 builtin/log.c:1461 builtin/log.c:1694 builtin/merge.c:358
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "échec de la préparation du parcours des révisions"
@@ -392,7 +392,7 @@
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "la référence '%s' est exclue par les options de rev-list"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1367 builtin/shortlog.c:261
+#: bundle.c:443 builtin/log.c:157 builtin/log.c:1369 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "argument non reconnu : %s"
@@ -410,13 +410,13 @@
 msgid "index-pack died"
 msgstr "l'index de groupe a disparu"
 
-#: color.c:260
+#: color.c:275
 #, c-format
 msgid "invalid color value: %.*s"
 msgstr "Valeur invalide de couleur : %.*s"
 
-#: commit.c:40 builtin/am.c:451 builtin/am.c:487 builtin/am.c:1516
-#: builtin/am.c:2128
+#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520
+#: builtin/am.c:2149
 #, c-format
 msgid "could not parse %s"
 msgstr "impossible d'analyser %s"
@@ -577,24 +577,24 @@
 msgid "Performing inexact rename detection"
 msgstr "Détection de renommage inexact en cours"
 
-#: diff.c:116
+#: diff.c:115
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
 "  Impossible d'analyser le pourcentage de modification de dirstat '%s'\n"
 
-#: diff.c:121
+#: diff.c:120
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Paramètre dirstat inconnu '%s'\n"
 
-#: diff.c:216
+#: diff.c:215
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr ""
 "Valeur inconnue pour la variable de configuration 'diff.submodule' : '%s'"
 
-#: diff.c:268
+#: diff.c:267
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -603,16 +603,16 @@
 "Erreurs dans la variable de configuration 'diff.dirstat' :\n"
 "%s"
 
-#: diff.c:2998
+#: diff.c:3000
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "l'application de diff externe a disparu, arrêt à %s"
 
-#: diff.c:3394
+#: diff.c:3396
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow a besoin d'une spécification de chemin unique"
 
-#: diff.c:3557
+#: diff.c:3559
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -621,16 +621,16 @@
 "Impossible d'analyser le paramètre de l'option --dirstat/-X :\n"
 "%s"
 
-#: diff.c:3571
+#: diff.c:3573
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Impossible d'analyser le paramètre de l'option --submodule : '%s'"
 
-#: dir.c:1853
+#: dir.c:1915
 msgid "failed to get kernel name and information"
 msgstr "echec de l'obtention d'information de kernel"
 
-#: dir.c:1936
+#: dir.c:1998
 msgid "Untracked cache is disabled on this system."
 msgstr "Le cache non suivi est désactivé sur ce système."
 
@@ -740,8 +740,8 @@
 msgid "failed to read the cache"
 msgstr "impossible de lire le cache"
 
-#: merge.c:94 builtin/am.c:2001 builtin/am.c:2036 builtin/checkout.c:375
-#: builtin/checkout.c:586 builtin/clone.c:715
+#: merge.c:94 builtin/am.c:2022 builtin/am.c:2057 builtin/checkout.c:376
+#: builtin/checkout.c:587 builtin/clone.c:722
 msgid "unable to write new index file"
 msgstr "impossible d'écrire le nouveau fichier d'index"
 
@@ -759,64 +759,64 @@
 msgid "error building trees"
 msgstr "erreur de construction des arbres"
 
-#: merge-recursive.c:687
+#: merge-recursive.c:686
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "impossible de créer le chemin '%s' %s"
 
-#: merge-recursive.c:698
+#: merge-recursive.c:697
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Suppression de %s pour faire de la place pour le sous-répertoire\n"
 
-#: merge-recursive.c:712 merge-recursive.c:733
+#: merge-recursive.c:711 merge-recursive.c:732
 msgid ": perhaps a D/F conflict?"
 msgstr ": peut-être un conflit D/F ?"
 
-#: merge-recursive.c:723
+#: merge-recursive.c:722
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "refus de perdre le fichier non suivi '%s'"
 
-#: merge-recursive.c:763
+#: merge-recursive.c:762
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "impossible de lire l'objet %s '%s'"
 
-#: merge-recursive.c:765
+#: merge-recursive.c:764
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "blob attendu pour %s '%s'"
 
-#: merge-recursive.c:788 builtin/clone.c:364
+#: merge-recursive.c:787 builtin/clone.c:369
 #, c-format
 msgid "failed to open '%s'"
 msgstr "échec à l'ouverture de '%s'"
 
-#: merge-recursive.c:796
+#: merge-recursive.c:795
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "échec à la création du lien symbolique '%s'"
 
-#: merge-recursive.c:799
+#: merge-recursive.c:798
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "ne sait pas traiter %06o %s '%s'"
 
-#: merge-recursive.c:937
+#: merge-recursive.c:936
 msgid "Failed to execute internal merge"
 msgstr "Échec à l'exécution de la fusion interne"
 
-#: merge-recursive.c:941
+#: merge-recursive.c:940
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Impossible d'ajouter %s à la base de données"
 
-#: merge-recursive.c:957
+#: merge-recursive.c:956
 msgid "unsupported object type in the tree"
 msgstr "type d'objet non supporté dans l'arbre"
 
-#: merge-recursive.c:1032 merge-recursive.c:1046
+#: merge-recursive.c:1031 merge-recursive.c:1045
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -825,7 +825,7 @@
 "CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
 "%s laissée dans l'arbre."
 
-#: merge-recursive.c:1038 merge-recursive.c:1051
+#: merge-recursive.c:1037 merge-recursive.c:1050
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -834,20 +834,20 @@
 "CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
 "%s laissée dans l'arbre dans le fichier %s."
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "rename"
 msgstr "renommage"
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "renamed"
 msgstr "renommé"
 
-#: merge-recursive.c:1148
+#: merge-recursive.c:1147
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s est un répertoire dans %s ajouté plutôt comme %s"
 
-#: merge-recursive.c:1170
+#: merge-recursive.c:1169
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -856,146 +856,146 @@
 "CONFLIT (renommage/renommage) : Renommage de \"%s\"->\"%s\" dans la branche "
 "\"%s\" et renommage \"%s\"->\"%s\" dans \"%s\"%s"
 
-#: merge-recursive.c:1175
+#: merge-recursive.c:1174
 msgid " (left unresolved)"
 msgstr " (laissé non résolu)"
 
-#: merge-recursive.c:1229
+#: merge-recursive.c:1228
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 "CONFLIT (renommage/renommage) : renommage '%s'->'%s' dans %s. Renommage '%s'-"
 ">'%s' dans %s"
 
-#: merge-recursive.c:1259
+#: merge-recursive.c:1258
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Renommage de %s en %s et de %s en %s à la place"
 
-#: merge-recursive.c:1458
+#: merge-recursive.c:1457
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 "CONFLIT (renommage/ajout) : Renommage de %s->%s dans %s. %s ajouté dans %s"
 
-#: merge-recursive.c:1468
+#: merge-recursive.c:1467
 #, c-format
 msgid "Adding merged %s"
 msgstr "Ajout de %s fusionné"
 
-#: merge-recursive.c:1473 merge-recursive.c:1671
+#: merge-recursive.c:1472 merge-recursive.c:1674
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Ajout plutôt comme %s"
 
-#: merge-recursive.c:1524
+#: merge-recursive.c:1523
 #, c-format
 msgid "cannot read object %s"
 msgstr "impossible de lire l'objet %s"
 
-#: merge-recursive.c:1527
+#: merge-recursive.c:1526
 #, c-format
 msgid "object %s is not a blob"
 msgstr "l'objet %s n'est pas un blob"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modify"
 msgstr "modification"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modified"
 msgstr "modifié"
 
-#: merge-recursive.c:1585
+#: merge-recursive.c:1588
 msgid "content"
 msgstr "contenu"
 
-#: merge-recursive.c:1592
+#: merge-recursive.c:1595
 msgid "add/add"
 msgstr "ajout/ajout"
 
-#: merge-recursive.c:1626
+#: merge-recursive.c:1629
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "%s sauté (fusion identique à l'existant)"
 
-#: merge-recursive.c:1640
+#: merge-recursive.c:1643
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Fusion automatique de %s"
 
-#: merge-recursive.c:1644 git-submodule.sh:1150
+#: merge-recursive.c:1647 git-submodule.sh:1025
 msgid "submodule"
 msgstr "sous-module"
 
-#: merge-recursive.c:1645
+#: merge-recursive.c:1648
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "CONFLIT (%s) : Conflit de fusion dans %s"
 
-#: merge-recursive.c:1731
+#: merge-recursive.c:1734
 #, c-format
 msgid "Removing %s"
 msgstr "Suppression de %s"
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1759
 msgid "file/directory"
 msgstr "fichier/répertoire"
 
-#: merge-recursive.c:1762
+#: merge-recursive.c:1765
 msgid "directory/file"
 msgstr "répertoire/fichier"
 
-#: merge-recursive.c:1767
+#: merge-recursive.c:1770
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 "CONFLIT (%s) : Il y a un répertoire nommé %s dans %s. Ajout de %s comme %s"
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1780
 #, c-format
 msgid "Adding %s"
 msgstr "Ajout de %s"
 
-#: merge-recursive.c:1794
+#: merge-recursive.c:1797
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Échec fatal de fusion, qui ne devrait jamais arriver."
 
-#: merge-recursive.c:1813
+#: merge-recursive.c:1816
 msgid "Already up-to-date!"
 msgstr "Déjà à jour !"
 
-#: merge-recursive.c:1822
+#: merge-recursive.c:1825
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "échec de fusion des arbres %s et %s"
 
-#: merge-recursive.c:1852
+#: merge-recursive.c:1855
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "Chemin non traité ??? %s"
 
-#: merge-recursive.c:1900
+#: merge-recursive.c:1903
 msgid "Merging:"
 msgstr "Fusion :"
 
-#: merge-recursive.c:1913
+#: merge-recursive.c:1916
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "%u ancêtre commun trouvé :"
 msgstr[1] "%u ancêtres communs trouvés :"
 
-#: merge-recursive.c:1950
+#: merge-recursive.c:1953
 msgid "merge returned no commit"
 msgstr "la fusion n'a pas retourné de commit"
 
-#: merge-recursive.c:2007
+#: merge-recursive.c:2010
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Impossible d'analyser l'objet '%s'"
 
-#: merge-recursive.c:2018 builtin/merge.c:645
+#: merge-recursive.c:2021 builtin/merge.c:645
 msgid "Unable to write index."
 msgstr "Impossible d'écrire l'index."
 
@@ -1025,31 +1025,41 @@
 msgid "unable to parse object: %s"
 msgstr "impossible d'analyser l'objet : %s"
 
-#: parse-options.c:563
+#: parse-options.c:570
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:581
+#: parse-options.c:588
 #, c-format
 msgid "usage: %s"
 msgstr "usage : %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:585
+#: parse-options.c:592
 #, c-format
 msgid "   or: %s"
 msgstr "   ou : %s"
 
-#: parse-options.c:588
+#: parse-options.c:595
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:622
+#: parse-options.c:629
 msgid "-NUM"
 msgstr "-NUM"
 
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "nom d'objet malformé '%s'"
+
+#: path.c:752
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "Impossible de rendre %s inscriptible pour le groupe"
+
 #: pathspec.c:133
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
@@ -1122,11 +1132,11 @@
 msgid "unable to parse --pretty format"
 msgstr "impossible d'analyser le format --pretty"
 
-#: progress.c:236
+#: progress.c:235
 msgid "done"
 msgstr "fait"
 
-#: read-cache.c:1296
+#: read-cache.c:1281
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -1135,7 +1145,7 @@
 "version d'index renseignée, mais la valeur est invalide.\n"
 "Utilisation de la version %i"
 
-#: read-cache.c:1306
+#: read-cache.c:1291
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1144,121 +1154,166 @@
 "GIT_INDEX_VERSION est renseigné, mais la valeur est invalide.\n"
 "Utilisation de la version %i"
 
-#: refs.c:2941 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
+#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
 #: builtin/merge.c:983
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Impossible d'ouvrir '%s' en écriture"
 
-#: refs.c:3001
+#: refs/files-backend.c:2359
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "Impossible de supprimer la référence %s : %s"
 
-#: refs.c:3004
+#: refs/files-backend.c:2362
 #, c-format
 msgid "could not delete references: %s"
 msgstr "impossible de supprimer les références : %s"
 
-#: refs.c:3013
+#: refs/files-backend.c:2371
 #, c-format
 msgid "could not remove reference %s"
 msgstr "impossible de supprimer la référence %s"
 
-#: ref-filter.c:660
+#: ref-filter.c:245
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "format : atome %%(end) utilisé sans atome correspondant"
+
+#: ref-filter.c:704
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "valeur positive attendue contents:lines=%s"
+
+#: ref-filter.c:833
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "format attendu : %%(color:<couleur>)"
+
+#: ref-filter.c:835
 msgid "unable to parse format"
 msgstr "impossible d'analyser le format"
 
-#: remote.c:792
+#: ref-filter.c:870
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "format attendu : %%(align:<largeur>,<position>)"
+
+#: ref-filter.c:893
+#, c-format
+msgid "improper format entered align:%s"
+msgstr "format non convenable align:%s"
+
+#: ref-filter.c:898
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "valeur positive attendue avec l'atome %%(align)"
+
+#: ref-filter.c:1219
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "objet malformé à '%s'"
+
+#: ref-filter.c:1561
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "format: atome %%(end) manquant"
+
+#: ref-filter.c:1615
+#, c-format
+msgid "malformed object name %s"
+msgstr "nom d'objet malformé %s"
+
+#: remote.c:756
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "Impossible de récupérer à la fois %s et %s pour %s"
 
-#: remote.c:796
+#: remote.c:760
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s suit habituellement %s, pas %s"
 
-#: remote.c:800
+#: remote.c:764
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s suit à la fois %s et %s"
 
-#: remote.c:808
+#: remote.c:772
 msgid "Internal error"
 msgstr "Erreur interne"
 
-#: remote.c:1723 remote.c:1766
+#: remote.c:1687 remote.c:1730
 msgid "HEAD does not point to a branch"
 msgstr "HEAD ne pointe pas sur une branche"
 
-#: remote.c:1732
+#: remote.c:1696
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "pas de branche '%s'"
 
-#: remote.c:1735
+#: remote.c:1699
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "aucune branche amont configurée pour la branche '%s'"
 
-#: remote.c:1741
+#: remote.c:1705
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "la branche amont '%s' n'est pas stockée comme branche de suivi"
 
-#: remote.c:1756
+#: remote.c:1720
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
 "la destination de poussée '%s' sur le serveur distant '%s' n'a pas de "
 "branche locale de suivi"
 
-#: remote.c:1771
+#: remote.c:1735
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "la branche '%s' n'a aucune branche distante de poussée"
 
-#: remote.c:1782
+#: remote.c:1746
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "les références de spec pour '%s' n'incluent pas '%s'"
 
-#: remote.c:1795
+#: remote.c:1759
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "la poussée n'a pas de destination (push.default vaut 'nothing')"
 
-#: remote.c:1817
+#: remote.c:1781
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr ""
 "impossible de résoudre une poussée 'simple' pour une destination unique"
 
-#: remote.c:2124
+#: remote.c:2083
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "Votre branche est basée sur '%s', mais la branche amont a disparu.\n"
 
-#: remote.c:2128
+#: remote.c:2087
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (utilisez \"git branch --unset-upstream\" pour corriger)\n"
 
-#: remote.c:2131
+#: remote.c:2090
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "Votre branche est à jour avec '%s'.\n"
 
-#: remote.c:2135
+#: remote.c:2094
 #, c-format
 msgid "Your branch is ahead of '%s' by %d commit.\n"
 msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
 msgstr[0] "Votre branche est en avance sur '%s' de %d commit.\n"
 msgstr[1] "Votre branche est en avance sur '%s' de %d commits.\n"
 
-#: remote.c:2141
+#: remote.c:2100
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (utilisez \"git push\" pour publier vos commits locaux)\n"
 
-#: remote.c:2144
+#: remote.c:2103
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1270,11 +1325,11 @@
 "Votre branche est en retard sur '%s' de %d commits, et peut être mise à jour "
 "en avance rapide.\n"
 
-#: remote.c:2152
+#: remote.c:2111
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (utilisez \"git pull\" pour mettre à jour votre branche locale)\n"
 
-#: remote.c:2155
+#: remote.c:2114
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1289,29 +1344,29 @@
 "Votre branche et '%s' ont divergé,\n"
 "et ont %d et %d commits différents chacune respectivement.\n"
 
-#: remote.c:2165
+#: remote.c:2124
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
 "  (utilisez \"git pull\" pour fusionner la branche distante dans la vôtre)\n"
 
-#: revision.c:2198
+#: revision.c:2193
 msgid "your current branch appears to be broken"
 msgstr "votre branche actuelle semble cassée"
 
-#: revision.c:2201
+#: revision.c:2196
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "votre branche actuelle '%s' ne contient encore aucun commit"
 
-#: revision.c:2395
+#: revision.c:2390
 msgid "--first-parent is incompatible with --bisect"
 msgstr "--first-parent est incompatible avec --bisect"
 
-#: run-command.c:83
+#: run-command.c:90
 msgid "open /dev/null failed"
 msgstr "échec de l'ouverture de /dev/null"
 
-#: run-command.c:85
+#: run-command.c:92
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "échec de dup2(%d,%d)"
@@ -1531,7 +1586,7 @@
 msgid "cannot abort from a branch yet to be born"
 msgstr "impossible d'abandonner depuis une branche non encore créée"
 
-#: sequencer.c:887 builtin/apply.c:4291
+#: sequencer.c:887 builtin/apply.c:4287
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "impossible d'ouvrir %s : %s"
@@ -1573,12 +1628,12 @@
 msgid "Can't cherry-pick into empty head"
 msgstr "Impossible de picorer vers une HEAD vide"
 
-#: setup.c:243
+#: setup.c:248
 #, c-format
 msgid "failed to read %s"
 msgstr "échec de la lecture de %s"
 
-#: sha1_name.c:453
+#: sha1_name.c:463
 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"
@@ -1629,7 +1684,7 @@
 msgid "staging updated .gitmodules failed"
 msgstr "échec de la mise en index du .gitmodules mis à jour"
 
-#: submodule.c:1045
+#: submodule.c:1040
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Impossible de paramétrer core.worktree dans %s"
@@ -1640,7 +1695,7 @@
 msgid "unknown value '%s' for key '%s'"
 msgstr "valeur inconnue '%s' pour la clé '%s'"
 
-#: trailer.c:543 trailer.c:548 builtin/remote.c:290
+#: trailer.c:543 trailer.c:548 builtin/remote.c:296
 #, c-format
 msgid "more than one %s"
 msgstr "plus d'un %s"
@@ -1707,8 +1762,8 @@
 msgid "could not open '%s' for writing"
 msgstr "impossible d'ouvrir '%s' en écriture"
 
-#: wrapper.c:223 wrapper.c:366 builtin/am.c:337 builtin/commit.c:1688
-#: builtin/merge.c:1076 builtin/pull.c:380
+#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691
+#: builtin/merge.c:1074 builtin/pull.c:380
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "impossible d'ouvrir '%s' en lecture"
@@ -1723,32 +1778,21 @@
 msgid "unable to access '%s'"
 msgstr "impossible d'accéder à '%s'"
 
-#: wrapper.c:611
-#, c-format
-msgid "unable to look up current user in the passwd file: %s"
-msgstr ""
-"impossible de rechercher l'utilisateur actuel dans le fichier de mots de "
-"passe : %s"
-
-#: wrapper.c:612
-msgid "no such user"
-msgstr "utilisateur inconnu"
-
-#: wrapper.c:620
+#: wrapper.c:608
 msgid "unable to get current working directory"
 msgstr "impossible d'accéder au répertoire de travail courant"
 
-#: wrapper.c:631
+#: wrapper.c:635
 #, c-format
 msgid "could not open %s for writing"
 msgstr "Impossible d'ouvrir '%s' en écriture"
 
-#: wrapper.c:642 builtin/am.c:424
+#: wrapper.c:646 builtin/am.c:425
 #, c-format
 msgid "could not write to %s"
 msgstr "Impossible d'écrire dans %s"
 
-#: wrapper.c:648
+#: wrapper.c:652
 #, c-format
 msgid "could not close %s"
 msgstr "impossible de fermer %s"
@@ -1913,7 +1957,7 @@
 "Everything below will be removed."
 msgstr ""
 "Ne touchez pas à la ligne ci-dessus\n"
-"Tout se qui suit sera éliminé."
+"Tout ce qui suit sera éliminé."
 
 #: wt-status.c:948
 msgid "You have unmerged paths."
@@ -2096,27 +2140,27 @@
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr "  (utilisez \"git bisect reset\" pour revenir à la branche d'origine)"
 
-#: wt-status.c:1437
+#: wt-status.c:1438
 msgid "On branch "
 msgstr "Sur la branche "
 
-#: wt-status.c:1445
+#: wt-status.c:1444
 msgid "interactive rebase in progress; onto "
 msgstr "rebasage interactif en cours ; sur "
 
-#: wt-status.c:1447
+#: wt-status.c:1446
 msgid "rebase in progress; onto "
 msgstr "rebasage en cours ; sur "
 
-#: wt-status.c:1452
+#: wt-status.c:1451
 msgid "HEAD detached at "
 msgstr "HEAD détachée sur "
 
-#: wt-status.c:1454
+#: wt-status.c:1453
 msgid "HEAD detached from "
 msgstr "HEAD détachée depuis "
 
-#: wt-status.c:1457
+#: wt-status.c:1456
 msgid "Not currently on any branch."
 msgstr "Actuellement sur aucun branche."
 
@@ -2207,24 +2251,24 @@
 msgid "nothing to commit, working directory clean\n"
 msgstr "rien à valider, la copie de travail est propre\n"
 
-#: wt-status.c:1644
-msgid "HEAD (no branch)"
-msgstr "HEAD (aucune branche)"
-
-#: wt-status.c:1650
+#: wt-status.c:1642
 msgid "Initial commit on "
 msgstr "Validation initiale sur "
 
+#: wt-status.c:1646
+msgid "HEAD (no branch)"
+msgstr "HEAD (aucune branche)"
+
 # à priori on parle d'une branche ici
-#: wt-status.c:1677
+#: wt-status.c:1675
 msgid "gone"
 msgstr "disparue"
 
-#: wt-status.c:1679 wt-status.c:1687
+#: wt-status.c:1677 wt-status.c:1685
 msgid "behind "
 msgstr "derrière "
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:403
+#: compat/precompose_utf8.c:56 builtin/clone.c:408
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "échec lors de l'unlink de '%s'"
@@ -2238,7 +2282,7 @@
 msgid "unexpected diff status %c"
 msgstr "status de diff inattendu %c"
 
-#: builtin/add.c:70 builtin/commit.c:277
+#: builtin/add.c:70 builtin/commit.c:278
 msgid "updating files failed"
 msgstr "échec de la mise à jour des fichiers"
 
@@ -2251,7 +2295,7 @@
 msgid "Unstaged changes after refreshing the index:"
 msgstr "Modifications non indexées après rafraîchissement de l'index :"
 
-#: builtin/add.c:194 builtin/rev-parse.c:799
+#: builtin/add.c:194 builtin/rev-parse.c:796
 msgid "Could not read the index"
 msgstr "Impossible de lire l'index"
 
@@ -2287,15 +2331,15 @@
 msgstr ""
 "Les chemins suivants sont ignorés par un de vos fichiers .gitignore :\n"
 
-#: builtin/add.c:249 builtin/clean.c:896 builtin/fetch.c:108 builtin/mv.c:110
-#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:545
-#: builtin/remote.c:1339 builtin/rm.c:268 builtin/send-pack.c:162
+#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:543
+#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162
 msgid "dry run"
 msgstr "simuler l'action"
 
-#: builtin/add.c:250 builtin/apply.c:4580 builtin/check-ignore.c:19
-#: builtin/commit.c:1321 builtin/count-objects.c:63 builtin/fsck.c:636
-#: builtin/log.c:1641 builtin/mv.c:109 builtin/read-tree.c:114
+#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19
+#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
+#: builtin/log.c:1645 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr "mode verbeux"
 
@@ -2303,7 +2347,7 @@
 msgid "interactive picking"
 msgstr "sélection interactive"
 
-#: builtin/add.c:253 builtin/checkout.c:1152 builtin/reset.c:286
+#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "sélection interactive des sections"
 
@@ -2364,149 +2408,150 @@
 msgstr ""
 "L'option --ignore-missing ne peut être utilisée qu'en complément de --dry-run"
 
-#: builtin/add.c:358
+#: builtin/add.c:352
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Rien de spécifié, rien n'a été ajouté.\n"
 
-#: builtin/add.c:359
+#: builtin/add.c:353
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Vous vouliez sûrement dire 'git add .' ?\n"
 
-#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:940
-#: builtin/commit.c:336 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938
+#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:40
 msgid "index file corrupt"
 msgstr "fichier d'index corrompu"
 
-#: builtin/add.c:445 builtin/apply.c:4678 builtin/mv.c:279 builtin/rm.c:430
+#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430
 msgid "Unable to write new index file"
 msgstr "Impossible d'écrire le nouveau fichier d'index"
 
-#: builtin/am.c:41
+#: builtin/am.c:42
 #, c-format
 msgid "could not stat %s"
 msgstr "stat impossible de %s"
 
-#: builtin/am.c:270 builtin/am.c:1345 builtin/commit.c:737 builtin/merge.c:1079
+#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077
 #, c-format
 msgid "could not read '%s'"
 msgstr "impossible de lire '%s'"
 
-#: builtin/am.c:444
+#: builtin/am.c:445
 msgid "could not parse author script"
 msgstr "impossible d'analyser le script author"
 
-#: builtin/am.c:521
+#: builtin/am.c:522
 #, c-format
 msgid "'%s' was deleted by the applypatch-msg hook"
 msgstr "'%s' a été effacé par le crochet applypatch-msg"
 
-#: builtin/am.c:562 builtin/notes.c:300
+#: builtin/am.c:563 builtin/notes.c:300
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Ligne en entrée malformée : '%s'."
 
-#: builtin/am.c:599 builtin/notes.c:315
+#: builtin/am.c:600 builtin/notes.c:315
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "Impossible de copier les notes de '%s' vers '%s'"
 
-#: builtin/am.c:625
+#: builtin/am.c:626
 msgid "fseek failed"
 msgstr "échec de fseek"
 
-#: builtin/am.c:786 builtin/am.c:874
+#: builtin/am.c:787 builtin/am.c:875
 #, c-format
 msgid "could not open '%s' for reading: %s"
 msgstr "impossible d'ouvrir '%s' en lecture : %s"
 
-#: builtin/am.c:793
+#: builtin/am.c:794
 #, c-format
 msgid "could not open '%s' for writing: %s"
 msgstr "impossible d'ouvrir '%s' en écriture : %s"
 
-#: builtin/am.c:802
+#: builtin/am.c:803
 #, c-format
 msgid "could not parse patch '%s'"
 msgstr "impossible d'analyser le patch '%s'"
 
-#: builtin/am.c:867
+#: builtin/am.c:868
 msgid "Only one StGIT patch series can be applied at once"
 msgstr "Seulement une série de patchs StGIT peut être appliquée à la fois"
 
-#: builtin/am.c:915
+#: builtin/am.c:916
 msgid "invalid timestamp"
 msgstr "horodatage invalide"
 
-#: builtin/am.c:918 builtin/am.c:926
+#: builtin/am.c:919 builtin/am.c:927
 msgid "invalid Date line"
 msgstr "ligne de Date invalide"
 
-#: builtin/am.c:923
+#: builtin/am.c:924
 msgid "invalid timezone offset"
 msgstr "décalage horaire invalide"
 
-#: builtin/am.c:1010
+#: builtin/am.c:1011
 msgid "Patch format detection failed."
 msgstr "Échec de détection du format du patch."
 
-#: builtin/am.c:1015 builtin/clone.c:368
+#: builtin/am.c:1016 builtin/clone.c:373
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "échec de la création du répertoire '%s'"
 
-#: builtin/am.c:1019
+#: builtin/am.c:1020
 msgid "Failed to split patches."
 msgstr "Échec de découpage des patchs."
 
-#: builtin/am.c:1151 builtin/commit.c:362
+#: builtin/am.c:1152 builtin/commit.c:363
 msgid "unable to write index file"
 msgstr "impossible d'écrire le fichier d'index"
 
-#: builtin/am.c:1202
+#: builtin/am.c:1203
 #, c-format
 msgid "When you have resolved this problem, run \"%s --continue\"."
 msgstr "Quand vous avez résolu ce problème, lancez \"%s --continue\"."
 
-#: builtin/am.c:1203
+#: builtin/am.c:1204
 #, c-format
 msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
 msgstr "Si vous préférez plutôt sauter ce patch, lancez \"%s --skip\"."
 
-#: builtin/am.c:1204
+#: builtin/am.c:1205
 #, c-format
 msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr ""
 "Pour restaurer la branche originale et arrêter de patcher, lancez \"%s --"
 "abort\"."
 
-#: builtin/am.c:1339
+#: builtin/am.c:1343
 msgid "Patch is empty. Was it split wrong?"
 msgstr "Le patch est vide. Le découpage était-il bon ?"
 
-#: builtin/am.c:1413 builtin/log.c:1345
+#: builtin/am.c:1417 builtin/log.c:1347
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "ligne d'identification invalide : %s"
 
-#: builtin/am.c:1440
+#: builtin/am.c:1444
 #, c-format
 msgid "unable to parse commit %s"
 msgstr "impossible d'analyser le commit %s"
 
-#: builtin/am.c:1614
+#: builtin/am.c:1646
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 "Le dépôt n'a pas les blobs nécessaires pour un retour à une fusion à 3 "
 "points."
 
-#: builtin/am.c:1616
+#: builtin/am.c:1648
 msgid "Using index info to reconstruct a base tree..."
 msgstr ""
 "Utilisation de l'information de l'index pour reconstruire un arbre de base..."
 
-#: builtin/am.c:1635
+#: builtin/am.c:1667
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
@@ -2514,38 +2559,38 @@
 "Avez-vous édité le patch à la main ?\n"
 "Il ne s'applique pas aux blobs enregistrés dans son index."
 
-#: builtin/am.c:1641
+#: builtin/am.c:1673
 msgid "Falling back to patching base and 3-way merge..."
 msgstr "Retour à un patch de la base et fusion à 3 points..."
 
-#: builtin/am.c:1666
+#: builtin/am.c:1688
 msgid "Failed to merge in the changes."
 msgstr "Échec d'intégration des modifications."
 
-#: builtin/am.c:1691 builtin/merge.c:632
+#: builtin/am.c:1712 builtin/merge.c:632
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree a échoué à écrire un arbre"
 
-#: builtin/am.c:1698
+#: builtin/am.c:1719
 msgid "applying to an empty history"
 msgstr "application à un historique vide"
 
-#: builtin/am.c:1711 builtin/commit.c:1752 builtin/merge.c:829
+#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829
 #: builtin/merge.c:854
 msgid "failed to write commit object"
 msgstr "échec de l'écriture de l'objet commit"
 
-#: builtin/am.c:1743 builtin/am.c:1747
+#: builtin/am.c:1764 builtin/am.c:1768
 #, c-format
 msgid "cannot resume: %s does not exist."
 msgstr "impossible de continuer : %s n'existe pas."
 
-#: builtin/am.c:1763
+#: builtin/am.c:1784
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 "impossible d'être interactif sans entrée standard connectée à un terminal."
 
-#: builtin/am.c:1768
+#: builtin/am.c:1789
 msgid "Commit Body is:"
 msgstr "Le corps de la validation est :"
 
@@ -2553,35 +2598,35 @@
 #. in your translation. The program will only accept English
 #. input at this point.
 #.
-#: builtin/am.c:1778
+#: builtin/am.c:1799
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 msgstr "Appliquer ? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all : "
 
-#: builtin/am.c:1828
+#: builtin/am.c:1849
 #, c-format
 msgid "Dirty index: cannot apply patches (dirty: %s)"
 msgstr "Index sale : impossible d'appliquer des patchs (sales : %s)"
 
-#: builtin/am.c:1863 builtin/am.c:1934
+#: builtin/am.c:1884 builtin/am.c:1955
 #, c-format
 msgid "Applying: %.*s"
 msgstr "Application de  %.*s"
 
-#: builtin/am.c:1879
+#: builtin/am.c:1900
 msgid "No changes -- Patch already applied."
 msgstr "Pas de changement -- Patch déjà appliqué."
 
-#: builtin/am.c:1887
+#: builtin/am.c:1908
 #, c-format
 msgid "Patch failed at %s %.*s"
 msgstr "le patch a échoué à %s %.*s"
 
-#: builtin/am.c:1893
+#: builtin/am.c:1914
 #, c-format
 msgid "The copy of the patch that failed is found in: %s"
 msgstr "La copie du patch qui a échoué se trouve dans : %s"
 
-#: builtin/am.c:1937
+#: builtin/am.c:1958
 msgid ""
 "No changes - did you forget to use 'git add'?\n"
 "If there is nothing left to stage, chances are that something else\n"
@@ -2592,7 +2637,7 @@
 "introduit les mêmes changements ; vous pourriez avoir envie de sauter ce "
 "patch."
 
-#: builtin/am.c:1944
+#: builtin/am.c:1965
 msgid ""
 "You still have unmerged paths in your index.\n"
 "Did you forget to use 'git add'?"
@@ -2600,17 +2645,17 @@
 "Vous avez toujours des chemins non fusionnés dans votre index\n"
 "Auriez-vous oublié de faire 'git add' ?"
 
-#: builtin/am.c:2052 builtin/am.c:2056 builtin/am.c:2068 builtin/reset.c:308
+#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308
 #: builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "Impossible d'analyser l'objet '%s'."
 
-#: builtin/am.c:2104
+#: builtin/am.c:2125
 msgid "failed to clean index"
 msgstr "échec du nettoyage de l'index"
 
-#: builtin/am.c:2138
+#: builtin/am.c:2159
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
@@ -2618,152 +2663,154 @@
 "Vous semblez avoir déplacé la HEAD depuis le dernier échec de 'am'.\n"
 "Pas de retour à ORIG_HEAD"
 
-#: builtin/am.c:2199
+#: builtin/am.c:2220
 #, c-format
 msgid "Invalid value for --patch-format: %s"
 msgstr "Valeur invalide pour --patch-format : %s"
 
-#: builtin/am.c:2221
-msgid "git am [options] [(<mbox>|<Maildir>)...]"
+#: builtin/am.c:2253
+msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
 msgstr "git am [<options>] [(<mbox>|<Maildir>)...]"
 
-#: builtin/am.c:2222
-msgid "git am [options] (--continue | --skip | --abort)"
-msgstr "git am [options] (--continue | --quit | -- abort)\""
+#: builtin/am.c:2254
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<options>] (--continue | --quit | --abort)"
 
-#: builtin/am.c:2228
+#: builtin/am.c:2260
 msgid "run interactively"
 msgstr "exécution interactive"
 
-#: builtin/am.c:2230
+#: builtin/am.c:2262
 msgid "historical option -- no-op"
 msgstr "option historique -- no-op"
 
-#: builtin/am.c:2232
+#: builtin/am.c:2264
 msgid "allow fall back on 3way merging if needed"
 msgstr "permettre de revenir à une fusion à 3 points si nécessaire"
 
-#: builtin/am.c:2233 builtin/init-db.c:509 builtin/prune-packed.c:57
+#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57
 #: builtin/repack.c:171
 msgid "be quiet"
 msgstr "être silencieux"
 
-#: builtin/am.c:2235
+#: builtin/am.c:2267
 msgid "add a Signed-off-by line to the commit message"
 msgstr "ajouter une ligne Signed-off-by au message de validation"
 
-#: builtin/am.c:2238
+#: builtin/am.c:2270
 msgid "recode into utf8 (default)"
 msgstr "recoder en utf-8 (par défaut)"
 
-#: builtin/am.c:2240
+#: builtin/am.c:2272
 msgid "pass -k flag to git-mailinfo"
 msgstr "passer l'option -k à git-mailinfo"
 
-#: builtin/am.c:2242
+#: builtin/am.c:2274
 msgid "pass -b flag to git-mailinfo"
 msgstr "passer l'option -b à git-mailinfo"
 
-#: builtin/am.c:2244
+#: builtin/am.c:2276
 msgid "pass -m flag to git-mailinfo"
 msgstr "passer l'option -m à git-mailinfo"
 
-#: builtin/am.c:2246
+#: builtin/am.c:2278
 msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr "passer l'option --keep-cr à git-mailsplit fpour le format mbox"
 
-#: builtin/am.c:2249
+#: builtin/am.c:2281
 msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr ""
 "ne pas passer l'option --keep-cr à git-mailsplit indépendamment de am.keepcr"
 
-#: builtin/am.c:2252
+#: builtin/am.c:2284
 msgid "strip everything before a scissors line"
 msgstr "retirer tout le contenu avant la ligne des ciseaux"
 
-#: builtin/am.c:2253 builtin/apply.c:4563
+#: builtin/am.c:2285 builtin/apply.c:4554
 msgid "action"
 msgstr "action"
 
-#: builtin/am.c:2254 builtin/am.c:2257 builtin/am.c:2260 builtin/am.c:2263
-#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
-#: builtin/am.c:2281
+#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295
+#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307
+#: builtin/am.c:2313
 msgid "pass it through git-apply"
 msgstr "le passer jusqu'à git-apply"
 
-#: builtin/am.c:2262 builtin/apply.c:4587
+#: builtin/am.c:2294 builtin/apply.c:4578
 msgid "root"
 msgstr "racine"
 
-#: builtin/am.c:2265 builtin/am.c:2268 builtin/apply.c:4525
-#: builtin/apply.c:4528 builtin/clone.c:85 builtin/fetch.c:93
-#: builtin/pull.c:167
+#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516
+#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93
+#: builtin/pull.c:167 builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
 msgid "path"
 msgstr "chemin"
 
-#: builtin/am.c:2271 builtin/fmt-merge-msg.c:669 builtin/fmt-merge-msg.c:672
-#: builtin/grep.c:698 builtin/merge.c:198 builtin/pull.c:127
-#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:664
-#: builtin/show-ref.c:180 builtin/tag.c:591 parse-options.h:132
-#: parse-options.h:134 parse-options.h:243
+#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
+#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127
+#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645
+#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
+#: parse-options.h:134 parse-options.h:244
 msgid "n"
 msgstr "n"
 
-#: builtin/am.c:2274 builtin/apply.c:4531
+#: builtin/am.c:2306 builtin/apply.c:4522
 msgid "num"
 msgstr "num"
 
-#: builtin/am.c:2277 builtin/for-each-ref.c:34 builtin/replace.c:438
+#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
 msgid "format"
 msgstr "format"
 
-#: builtin/am.c:2278
+#: builtin/am.c:2310
 msgid "format the patch(es) are in"
 msgstr "format de présentation des patchs"
 
-#: builtin/am.c:2284
+#: builtin/am.c:2316
 msgid "override error message when patch failure occurs"
 msgstr "surcharger le message d'erreur lors d'un échec d'application de patch"
 
-#: builtin/am.c:2286
+#: builtin/am.c:2318
 msgid "continue applying patches after resolving a conflict"
 msgstr "continuer à appliquer les patchs après résolution d'un conflit"
 
-#: builtin/am.c:2289
+#: builtin/am.c:2321
 msgid "synonyms for --continue"
 msgstr "synonymes de --continue"
 
-#: builtin/am.c:2292
+#: builtin/am.c:2324
 msgid "skip the current patch"
 msgstr "sauter le patch courant"
 
-#: builtin/am.c:2295
+#: builtin/am.c:2327
 msgid "restore the original branch and abort the patching operation."
 msgstr ""
 "restaurer la branche originale et abandonner les applications de patch."
 
-#: builtin/am.c:2299
+#: builtin/am.c:2331
 msgid "lie about committer date"
 msgstr "mentir sur la date de validation"
 
-#: builtin/am.c:2301
+#: builtin/am.c:2333
 msgid "use current timestamp for author date"
 msgstr "utiliser l'horodatage actuel pour la date d'auteur"
 
-#: builtin/am.c:2303 builtin/commit.c:1590 builtin/merge.c:225
-#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:606
+#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225
+#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355
 msgid "key-id"
 msgstr "id de clé"
 
-#: builtin/am.c:2304
+#: builtin/am.c:2336
 msgid "GPG-sign commits"
 msgstr "signer les commits avec GPG"
 
-#: builtin/am.c:2307
+#: builtin/am.c:2339
 msgid "(internal use for git-rebase)"
 msgstr "(utilisation interne pour git-rebase)"
 
-#: builtin/am.c:2322
+#: builtin/am.c:2354
 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."
@@ -2771,17 +2818,17 @@
 "L'option -b/--binary ne fait plus rien depuis longtemps,\n"
 "et elle sera supprimée. Veuillez ne plus l'utiliser."
 
-#: builtin/am.c:2329
+#: builtin/am.c:2361
 msgid "failed to read the index"
 msgstr "échec à la lecture de l'index"
 
-#: builtin/am.c:2344
+#: builtin/am.c:2376
 #, c-format
 msgid "previous rebase directory %s still exists but mbox given."
 msgstr ""
 "le répertoire précédent de rebasage %s existe toujours mais mbox donnée."
 
-#: builtin/am.c:2368
+#: builtin/am.c:2400
 #, c-format
 msgid ""
 "Stray %s directory found.\n"
@@ -2790,7 +2837,7 @@
 "Répertoire abandonné %s trouvé.\n"
 "Utilisez \"git am --abort\" pour le supprimer."
 
-#: builtin/am.c:2374
+#: builtin/am.c:2406
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr ""
 "Pas de résolution de l'opération en cours, nous ne sommes pas dans une "
@@ -2800,69 +2847,69 @@
 msgid "git apply [<options>] [<patch>...]"
 msgstr "git apply [<options>] [<patch>...]"
 
-#: builtin/apply.c:112
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
 msgstr "option d'espace non reconnue '%s'"
 
-#: builtin/apply.c:127
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "option d'ignorance d'espace non reconnue '%s'"
 
-#: builtin/apply.c:822
+#: builtin/apply.c:818
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "Impossible de préparer la regexp d'horodatage %s"
 
-#: builtin/apply.c:831
+#: builtin/apply.c:827
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "regexec a retourné %d pour l'entrée : %s"
 
-#: builtin/apply.c:912
+#: builtin/apply.c:908
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "nom de fichier du patch introuvable à la ligne %d"
 
-#: builtin/apply.c:944
+#: builtin/apply.c:940
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
 "git apply : mauvais format de git-diff - /dev/null attendu, %s trouvé à la "
 "ligne %d"
 
-#: builtin/apply.c:948
+#: builtin/apply.c:944
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr ""
 "git apply : mauvais format de git-diff - nouveau nom de fichier inconsistant "
 "à la ligne %d"
 
-#: builtin/apply.c:949
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr ""
 "git apply : mauvais format de git-diff - ancien nom de fichier inconsistant "
 "à la ligne %d"
 
-#: builtin/apply.c:956
+#: builtin/apply.c:952
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr ""
 "git apply : mauvais format de git-diff - /dev/null attendu à la ligne %d"
 
-#: builtin/apply.c:1419
+#: builtin/apply.c:1415
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "recomptage : ligne inattendue : %.*s"
 
-#: builtin/apply.c:1476
+#: builtin/apply.c:1472
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "fragment de patch sans en-tête à la ligne %d : %.*s"
 
-#: builtin/apply.c:1493
+#: builtin/apply.c:1489
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2877,77 +2924,77 @@
 "information de nom de fichier manquante dans l'en-tête de git diff lors de "
 "la suppression de %d composants de préfixe de chemin (ligne %d)"
 
-#: builtin/apply.c:1659
+#: builtin/apply.c:1655
 msgid "new file depends on old contents"
 msgstr "le nouveau fichier dépend de contenus anciens"
 
-#: builtin/apply.c:1661
+#: builtin/apply.c:1657
 msgid "deleted file still has contents"
 msgstr "le fichier supprimé a encore du contenu"
 
-#: builtin/apply.c:1687
+#: builtin/apply.c:1683
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "patch corrompu à la ligne %d"
 
-#: builtin/apply.c:1723
+#: builtin/apply.c:1719
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "le nouveau fichier %s dépend de contenus anciens"
 
-#: builtin/apply.c:1725
+#: builtin/apply.c:1721
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "le fichier supprimé %s a encore du contenu"
 
-#: builtin/apply.c:1728
+#: builtin/apply.c:1724
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "** attention : le fichier %s devient vide mais n'est pas supprimé"
 
-#: builtin/apply.c:1874
+#: builtin/apply.c:1870
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "patch binaire corrompu à la ligne %d : %.*s"
 
-#: builtin/apply.c:1903
+#: builtin/apply.c:1899
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "patch binaire non reconnu à la ligne %d"
 
-#: builtin/apply.c:2054
+#: builtin/apply.c:2050
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "patch totalement incompréhensible à la ligne %d"
 
-#: builtin/apply.c:2144
+#: builtin/apply.c:2140
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "lecture du lien symbolique %s impossible"
 
-#: builtin/apply.c:2148
+#: builtin/apply.c:2144
 #, c-format
 msgid "unable to open or read %s"
 msgstr "ouverture ou lecture de %s impossible"
 
-#: builtin/apply.c:2781
+#: builtin/apply.c:2777
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "début de ligne invalide : '%c'"
 
-#: builtin/apply.c:2900
+#: builtin/apply.c:2896
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
 msgstr[0] "La section n°%d a réussi à la ligne %d (offset %d ligne)."
 msgstr[1] "La section n°%d a réussi à la ligne %d (offset %d lignes)."
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2908
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr "Contexte réduit à (%ld/%ld) pour appliquer le fragment à la ligne %d"
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2914
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -2956,330 +3003,330 @@
 "pendant la recherche de :\n"
 "%.*s"
 
-#: builtin/apply.c:2938
+#: builtin/apply.c:2934
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "données de patch binaire manquantes pour '%s'"
 
-#: builtin/apply.c:3039
+#: builtin/apply.c:3035
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "le patch binaire ne s'applique par correctement à '%s'"
 
-#: builtin/apply.c:3045
+#: builtin/apply.c:3041
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
 "le patch binaire sur '%s' crée un résultat incorrect (%s attendu, mais %s "
 "trouvé)"
 
-#: builtin/apply.c:3066
+#: builtin/apply.c:3062
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "le patch a échoué : %s:%ld"
 
-#: builtin/apply.c:3190
+#: builtin/apply.c:3186
 #, c-format
 msgid "cannot checkout %s"
 msgstr "extraction de %s impossible"
 
-#: builtin/apply.c:3235 builtin/apply.c:3246 builtin/apply.c:3291
+#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
 #, c-format
 msgid "read of %s failed"
 msgstr "échec de la lecture de %s"
 
-#: builtin/apply.c:3243
+#: builtin/apply.c:3239
 #, c-format
 msgid "reading from '%s' beyond a symbolic link"
 msgstr "lecture depuis '%s' au-delà d'un lien symbolique"
 
-#: builtin/apply.c:3271 builtin/apply.c:3493
+#: builtin/apply.c:3267 builtin/apply.c:3489
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "le chemin %s a été renommé/supprimé"
 
-#: builtin/apply.c:3352 builtin/apply.c:3507
+#: builtin/apply.c:3348 builtin/apply.c:3503
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s : n'existe pas dans l'index"
 
-#: builtin/apply.c:3356 builtin/apply.c:3499 builtin/apply.c:3521
+#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
 #, c-format
 msgid "%s: %s"
 msgstr "%s : %s"
 
-#: builtin/apply.c:3361 builtin/apply.c:3515
+#: builtin/apply.c:3357 builtin/apply.c:3511
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s : ne correspond pas à l'index"
 
-#: builtin/apply.c:3463
+#: builtin/apply.c:3459
 msgid "removal patch leaves file contents"
 msgstr "le patch de suppression laisse un contenu dans le fichier"
 
-#: builtin/apply.c:3532
+#: builtin/apply.c:3528
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s : type erroné"
 
-#: builtin/apply.c:3534
+#: builtin/apply.c:3530
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s est de type %o, mais %o attendu"
 
-#: builtin/apply.c:3693 builtin/apply.c:3695
+#: builtin/apply.c:3689 builtin/apply.c:3691
 #, c-format
 msgid "invalid path '%s'"
 msgstr "chemin invalide '%s'"
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3746
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s : existe déjà dans l'index"
 
-#: builtin/apply.c:3753
+#: builtin/apply.c:3749
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s : existe déjà dans la copie de travail"
 
-#: builtin/apply.c:3773
+#: builtin/apply.c:3769
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "le nouveau mode (%o) de %s ne correspond pas à l'ancien mode (%o)"
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3774
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr ""
 "le nouveau mode (%o) de %s ne correspond pas à l'ancien mode (%o) de %s"
 
-#: builtin/apply.c:3798
+#: builtin/apply.c:3794
 #, c-format
 msgid "affected file '%s' is beyond a symbolic link"
 msgstr "le fichier affecté '%s' est au-delà d'un lien symbolique"
 
-#: builtin/apply.c:3802
+#: builtin/apply.c:3798
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s : le patch ne s'applique pas"
 
-#: builtin/apply.c:3816
+#: builtin/apply.c:3812
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Vérification du patch %s..."
 
-#: builtin/apply.c:3909 builtin/checkout.c:232 builtin/reset.c:135
+#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "échec de make_cache_entry pour le chemin '%s'"
 
-#: builtin/apply.c:4052
+#: builtin/apply.c:4048
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "suppression de %s dans l'index impossible"
 
-#: builtin/apply.c:4081
+#: builtin/apply.c:4077
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "patch corrompu pour le sous-module %s"
 
-#: builtin/apply.c:4085
+#: builtin/apply.c:4081
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "stat du fichier nouvellement créé '%s' impossible"
 
-#: builtin/apply.c:4090
+#: builtin/apply.c:4086
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr ""
 "création du magasin de stockage pour le fichier nouvellement créé %s "
 "impossible"
 
-#: builtin/apply.c:4093 builtin/apply.c:4201
+#: builtin/apply.c:4089 builtin/apply.c:4197
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "ajout de l'élément de cache %s impossible"
 
-#: builtin/apply.c:4126
+#: builtin/apply.c:4122
 #, c-format
 msgid "closing file '%s'"
 msgstr "fermeture du fichier '%s'"
 
-#: builtin/apply.c:4175
+#: builtin/apply.c:4171
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "écriture du fichier '%s' mode %o impossible"
 
-#: builtin/apply.c:4262
+#: builtin/apply.c:4258
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Patch %s appliqué proprement."
 
-#: builtin/apply.c:4270
+#: builtin/apply.c:4266
 msgid "internal error"
 msgstr "erreur interne"
 
-#: builtin/apply.c:4273
+#: builtin/apply.c:4269
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] "Application du patch %%s avec %d rejet..."
 msgstr[1] "Application du patch %%s avec %d rejets..."
 
-#: builtin/apply.c:4283
+#: builtin/apply.c:4279
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "troncature du nom de fichier .rej en %.*s.rej"
 
-#: builtin/apply.c:4304
+#: builtin/apply.c:4300
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "Section n°%d appliquée proprement."
 
-#: builtin/apply.c:4307
+#: builtin/apply.c:4303
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "Section n°%d rejetée."
 
-#: builtin/apply.c:4397
+#: builtin/apply.c:4393
 msgid "unrecognized input"
 msgstr "entrée non reconnue"
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4404
 msgid "unable to read index file"
 msgstr "lecture du fichier d'index impossible"
 
-#: builtin/apply.c:4526
+#: builtin/apply.c:4517
 msgid "don't apply changes matching the given path"
 msgstr "ne pas appliquer les modifications qui correspondent au chemin donné"
 
-#: builtin/apply.c:4529
+#: builtin/apply.c:4520
 msgid "apply changes matching the given path"
 msgstr "appliquer les modifications qui correspondent au chemin donné"
 
-#: builtin/apply.c:4532
+#: builtin/apply.c:4523
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "supprimer <num> barres obliques des chemins traditionnels de diff"
 
-#: builtin/apply.c:4535
+#: builtin/apply.c:4526
 msgid "ignore additions made by the patch"
 msgstr "ignorer les additions réalisées par le patch"
 
-#: builtin/apply.c:4537
+#: builtin/apply.c:4528
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr "au lieu d'appliquer le patch, afficher le diffstat de l'entrée"
 
-#: builtin/apply.c:4541
+#: builtin/apply.c:4532
 msgid "show number of added and deleted lines in decimal notation"
 msgstr ""
 "afficher le nombre de lignes ajoutées et supprimées en notation décimale"
 
-#: builtin/apply.c:4543
+#: builtin/apply.c:4534
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "au lieu d'appliquer le patch, afficher un résumer de l'entrée"
 
-#: builtin/apply.c:4545
+#: builtin/apply.c:4536
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "au lieu d'appliquer le patch, voir si le patch est applicable"
 
-#: builtin/apply.c:4547
+#: builtin/apply.c:4538
 msgid "make sure the patch is applicable to the current index"
 msgstr "s'assurer que le patch est applicable sur l'index actuel"
 
-#: builtin/apply.c:4549
+#: builtin/apply.c:4540
 msgid "apply a patch without touching the working tree"
 msgstr "appliquer les patch sans toucher à la copie de travail"
 
-#: builtin/apply.c:4551
+#: builtin/apply.c:4542
 msgid "accept a patch that touches outside the working area"
 msgstr "accepter un patch qui touche hors de la copie de travail"
 
-#: builtin/apply.c:4553
+#: builtin/apply.c:4544
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr "appliquer aussi le patch (à utiliser avec ---stat/--summary/--check)"
 
-#: builtin/apply.c:4555
+#: builtin/apply.c:4546
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "tenter une fusion à 3 points si le patch ne s'applique pas proprement"
 
-#: builtin/apply.c:4557
+#: builtin/apply.c:4548
 msgid "build a temporary index based on embedded index information"
 msgstr ""
 "construire un index temporaire fondé sur l'information de l'index embarqué"
 
-#: builtin/apply.c:4559 builtin/checkout-index.c:198 builtin/ls-files.c:412
+#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412
 msgid "paths are separated with NUL character"
 msgstr "les chemins sont séparés par un caractère NUL"
 
-#: builtin/apply.c:4562
+#: builtin/apply.c:4553
 msgid "ensure at least <n> lines of context match"
 msgstr "s'assurer d'au moins <n> lignes de correspondance de contexte"
 
-#: builtin/apply.c:4564
+#: builtin/apply.c:4555
 msgid "detect new or modified lines that have whitespace errors"
 msgstr ""
 "détecter des lignes nouvelles ou modifiées qui contiennent des erreurs "
 "d'espace"
 
-#: builtin/apply.c:4567 builtin/apply.c:4570
+#: builtin/apply.c:4558 builtin/apply.c:4561
 msgid "ignore changes in whitespace when finding context"
 msgstr "ignorer des modifications d'espace lors de la recherche de contexte"
 
-#: builtin/apply.c:4573
+#: builtin/apply.c:4564
 msgid "apply the patch in reverse"
 msgstr "appliquer le patch en sens inverse"
 
-#: builtin/apply.c:4575
+#: builtin/apply.c:4566
 msgid "don't expect at least one line of context"
 msgstr "ne pas s'attendre à au moins une ligne de contexte"
 
-#: builtin/apply.c:4577
+#: builtin/apply.c:4568
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "laisser les sections rejetées dans les fichiers *.rej correspondants"
 
-#: builtin/apply.c:4579
+#: builtin/apply.c:4570
 msgid "allow overlapping hunks"
 msgstr "accepter les recouvrements de sections"
 
-#: builtin/apply.c:4582
+#: builtin/apply.c:4573
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr ""
 "tolérer des erreurs de détection de retours chariot manquants en fin de "
 "fichier"
 
-#: builtin/apply.c:4585
+#: builtin/apply.c:4576
 msgid "do not trust the line counts in the hunk headers"
 msgstr "ne pas se fier au compte de lignes dans les en-têtes de section"
 
-#: builtin/apply.c:4588
+#: builtin/apply.c:4579
 msgid "prepend <root> to all filenames"
 msgstr "préfixer tous les noms de fichier avec <root>"
 
-#: builtin/apply.c:4610
+#: builtin/apply.c:4601
 msgid "--3way outside a repository"
 msgstr "--3way hors d'un dépôt"
 
-#: builtin/apply.c:4618
+#: builtin/apply.c:4609
 msgid "--index outside a repository"
 msgstr "--index hors d'un dépôt"
 
-#: builtin/apply.c:4621
+#: builtin/apply.c:4612
 msgid "--cached outside a repository"
 msgstr "--cached hors d'un dépôt"
 
-#: builtin/apply.c:4640
+#: builtin/apply.c:4631
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "ouverture impossible du patch '%s'"
 
-#: builtin/apply.c:4654
+#: builtin/apply.c:4645
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "%d erreur d'espace ignorée"
 msgstr[1] "%d erreurs d'espace ignorées"
 
-#: builtin/apply.c:4660 builtin/apply.c:4670
+#: builtin/apply.c:4651 builtin/apply.c:4661
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -3341,100 +3388,100 @@
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<options-de-révision> sont documentés dans git-rev-list(1)"
 
-#: builtin/blame.c:2500
+#: builtin/blame.c:2519
 msgid "Show blame entries as we find them, incrementally"
 msgstr ""
 "Montrer les éléments de blâme au fur et à mesure de leur découverte, de "
 "manière incrémentale"
 
-#: builtin/blame.c:2501
+#: builtin/blame.c:2520
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "Montrer un SHA-1 blanc pour les commits de limite (Défaut : désactivé)"
 
-#: builtin/blame.c:2502
+#: builtin/blame.c:2521
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
 "Ne pas traiter les commits racine comme des limites (Défaut : désactivé)"
 
-#: builtin/blame.c:2503
+#: builtin/blame.c:2522
 msgid "Show work cost statistics"
 msgstr "Montrer les statistiques de coût d'activité"
 
-#: builtin/blame.c:2504
+#: builtin/blame.c:2523
 msgid "Show output score for blame entries"
 msgstr "Montrer le score de sortie pour les éléments de blâme"
 
-#: builtin/blame.c:2505
+#: builtin/blame.c:2524
 msgid "Show original filename (Default: auto)"
 msgstr "Montrer les noms de fichier originaux (Défaut : auto)"
 
-#: builtin/blame.c:2506
+#: builtin/blame.c:2525
 msgid "Show original linenumber (Default: off)"
 msgstr "Montrer les numéros de lignes originaux (Défaut : désactivé)"
 
-#: builtin/blame.c:2507
+#: builtin/blame.c:2526
 msgid "Show in a format designed for machine consumption"
 msgstr "Afficher dans un format propice à la consommation par machine"
 
-#: builtin/blame.c:2508
+#: builtin/blame.c:2527
 msgid "Show porcelain format with per-line commit information"
 msgstr "Afficher en format porcelaine avec l'information de commit par ligne"
 
-#: builtin/blame.c:2509
+#: builtin/blame.c:2528
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Utiliser le même mode de sortie que git-annotate (Défaut : désactivé)"
 
-#: builtin/blame.c:2510
+#: builtin/blame.c:2529
 msgid "Show raw timestamp (Default: off)"
 msgstr "Afficher les horodatages bruts (Défaut : désactivé)"
 
-#: builtin/blame.c:2511
+#: builtin/blame.c:2530
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Afficher les longs SHA1 de commits (Défaut : désactivé)"
 
-#: builtin/blame.c:2512
+#: builtin/blame.c:2531
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Supprimer le nom de l'auteur et l'horodatage (Défaut : désactivé)"
 
-#: builtin/blame.c:2513
+#: builtin/blame.c:2532
 msgid "Show author email instead of name (Default: off)"
 msgstr "Afficher l'e-mail de l'auteur au lieu du nom (Défaut : désactivé)"
 
-#: builtin/blame.c:2514
+#: builtin/blame.c:2533
 msgid "Ignore whitespace differences"
 msgstr "Ignorer les différences d'espace"
 
-#: builtin/blame.c:2515
+#: builtin/blame.c:2534
 msgid "Spend extra cycles to find better match"
 msgstr ""
 "Dépenser des cycles supplémentaires pour trouver une meilleure correspondance"
 
-#: builtin/blame.c:2516
+#: builtin/blame.c:2535
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr ""
 "Utiliser les révisions du fichier <fichier> au lieu d'appeler git-rev-list"
 
-#: builtin/blame.c:2517
+#: builtin/blame.c:2536
 msgid "Use <file>'s contents as the final image"
 msgstr "Utiliser le contenu de <fichier> comme image finale"
 
-#: builtin/blame.c:2518 builtin/blame.c:2519
+#: builtin/blame.c:2537 builtin/blame.c:2538
 msgid "score"
 msgstr "score"
 
-#: builtin/blame.c:2518
+#: builtin/blame.c:2537
 msgid "Find line copies within and across files"
 msgstr "Trouver les copies de ligne dans et entre les fichiers"
 
-#: builtin/blame.c:2519
+#: builtin/blame.c:2538
 msgid "Find line movements within and across files"
 msgstr "Trouver les mouvements de ligne dans et entre les fichiers"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "Process only line range n,m, counting from 1"
 msgstr ""
 "Traiter seulement l'intervalle de ligne n,m en commençant le compte à 1"
@@ -3445,28 +3492,32 @@
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2601
+#: builtin/blame.c:2620
 msgid "4 years, 11 months ago"
 msgstr "il y a 10 ans et 11 mois"
 
-#: builtin/branch.c:24
+#: builtin/branch.c:25
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 
-#: builtin/branch.c:25
+#: builtin/branch.c:26
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<options] [-l] [-f] <nom-de-branche> [<point-de-départ>]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<options>] [-r] (-d | -D) <nom-de-branche>..."
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr ""
 "git branch [<options>] (-m | -M) [<ancienne-branche>] <nouvelle-branche>"
 
-#: builtin/branch.c:150
+#: builtin/branch.c:29
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr "git branch [<options>] [-r | -a] [--points-at]"
+
+#: builtin/branch.c:142
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -3475,7 +3526,7 @@
 "suppression de la branche '%s' qui a été fusionnée dans\n"
 "         '%s', mais pas dans HEAD."
 
-#: builtin/branch.c:154
+#: builtin/branch.c:146
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -3484,12 +3535,12 @@
 "branche '%s' non supprimée car elle n'a pas été fusionnée dans\n"
 "         '%s', même si elle est fusionnée dans HEAD."
 
-#: builtin/branch.c:168
+#: builtin/branch.c:160
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Impossible de rechercher l'objet commit pour '%s'"
 
-#: builtin/branch.c:172
+#: builtin/branch.c:164
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -3498,309 +3549,301 @@
 "La branche '%s' n'est pas totalement fusionnée.\n"
 "Si vous êtes sur que vous voulez la supprimer, lancez 'git branch -D %s'."
 
-#: builtin/branch.c:185
+#: builtin/branch.c:177
 msgid "Update of config-file failed"
 msgstr "Échec de la mise à jour du fichier de configuration"
 
-#: builtin/branch.c:213
+#: builtin/branch.c:205
 msgid "cannot use -a with -d"
 msgstr "impossible d'utiliser -a avec -d"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:211
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Impossible de rechercher l'objet commit pour HEAD"
 
-#: builtin/branch.c:227
+#: builtin/branch.c:219
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr "Impossible de supprimer la branche '%s' sur laquelle vous êtes."
 
-#: builtin/branch.c:243
+#: builtin/branch.c:235
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "branche de suivi '%s' non trouvée."
 
-#: builtin/branch.c:244
+#: builtin/branch.c:236
 #, c-format
 msgid "branch '%s' not found."
 msgstr "branche '%s' non trouvée."
 
-#: builtin/branch.c:259
+#: builtin/branch.c:251
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Erreur lors de la suppression de la branche de suivi '%s'"
 
-#: builtin/branch.c:260
+#: builtin/branch.c:252
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Erreur lors de la suppression de la branche '%s'"
 
-#: builtin/branch.c:267
+#: builtin/branch.c:259
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Branche de suivi %s supprimée (précédemment %s).\n"
 
-#: builtin/branch.c:268
+#: builtin/branch.c:260
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Branche %s supprimée (précédemment %s).\n"
 
-#: builtin/branch.c:369
-#, c-format
-msgid "branch '%s' does not point at a commit"
-msgstr "la branche '%s' ne pointe pas sur un commit"
-
 # féminin pour une branche
-#: builtin/branch.c:452
+#: builtin/branch.c:303
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: disparue]"
 
-#: builtin/branch.c:457
+#: builtin/branch.c:308
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:462
+#: builtin/branch.c:313
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: en retard de %d]"
 
-#: builtin/branch.c:464
+#: builtin/branch.c:315
 #, c-format
 msgid "[behind %d]"
 msgstr "[en retard de %d]"
 
-#: builtin/branch.c:468
+#: builtin/branch.c:319
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s : en avance de %d]"
 
-#: builtin/branch.c:470
+#: builtin/branch.c:321
 #, c-format
 msgid "[ahead %d]"
 msgstr "[en avance de %d]"
 
-#: builtin/branch.c:473
+#: builtin/branch.c:324
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s : en avance de %d, en retard de %d]"
 
-#: builtin/branch.c:476
+#: builtin/branch.c:327
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[en avance de %d, en retard de %d]"
 
-#: builtin/branch.c:489
+#: builtin/branch.c:340
 msgid " **** invalid ref ****"
 msgstr " **** référence invalide ****"
 
-#: builtin/branch.c:580
+#: builtin/branch.c:366
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(aucune branche, rebasage de %s)"
 
-#: builtin/branch.c:583
+#: builtin/branch.c:369
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(aucune branche, bisect a démarré sur %s)"
 
-#: builtin/branch.c:589
+#: builtin/branch.c:375
 #, c-format
 msgid "(HEAD detached at %s)"
 msgstr "(HEAD détachée sur %s)"
 
-#: builtin/branch.c:592
+#: builtin/branch.c:378
 #, c-format
 msgid "(HEAD detached from %s)"
 msgstr "(HEAD détachée depuis %s)"
 
-#: builtin/branch.c:596
+#: builtin/branch.c:382
 msgid "(no branch)"
 msgstr "(aucune branche)"
 
-#: builtin/branch.c:643
-#, c-format
-msgid "object '%s' does not point to a commit"
-msgstr "l'objet '%s' ne pointe pas sur un commit"
-
-#: builtin/branch.c:691
-msgid "some refs could not be read"
-msgstr "des références n'ont pas pu être lues"
-
-#: builtin/branch.c:704
+#: builtin/branch.c:524
 msgid "cannot rename the current branch while not on any."
 msgstr "impossible de renommer la branche actuelle, il n'y en a pas."
 
-#: builtin/branch.c:714
+#: builtin/branch.c:534
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Nom de branche invalide : '%s'"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:549
 msgid "Branch rename failed"
 msgstr "Échec de renommage de la branche"
 
-#: builtin/branch.c:733
+#: builtin/branch.c:553
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Renommage d'un branche mal nommée '%s'"
 
-#: builtin/branch.c:737
+#: builtin/branch.c:557
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "La branche a été renommée en %s, mais HEAD n'est pas mise à jour !"
 
-#: builtin/branch.c:744
+#: builtin/branch.c:564
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 "La branche est renommée, mais la mise à jour du fichier de configuration a "
 "échoué"
 
-#: builtin/branch.c:759
-#, c-format
-msgid "malformed object name %s"
-msgstr "nom d'objet malformé %s"
-
-#: builtin/branch.c:781
+#: builtin/branch.c:587
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr "impossible d'écrire le modèle de description de branche : %s"
 
-#: builtin/branch.c:811
+#: builtin/branch.c:616
 msgid "Generic options"
 msgstr "Options génériques"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:618
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "afficher le hachage et le sujet, doublé pour la branche amont"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:619
 msgid "suppress informational messages"
 msgstr "supprimer les messages d'information"
 
-#: builtin/branch.c:815
+#: builtin/branch.c:620
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "régler le mode de suivi (voir git-pull(1))"
 
-#: builtin/branch.c:817
+#: builtin/branch.c:622
 msgid "change upstream info"
 msgstr "modifier l'information amont"
 
-#: builtin/branch.c:821
+#: builtin/branch.c:626
 msgid "use colored output"
 msgstr "utiliser la coloration dans la sortie"
 
-#: builtin/branch.c:822
+#: builtin/branch.c:627
 msgid "act on remote-tracking branches"
 msgstr "agir sur les branches de suivi distantes"
 
-#: builtin/branch.c:825 builtin/branch.c:831 builtin/branch.c:852
-#: builtin/branch.c:858 builtin/commit.c:1580 builtin/commit.c:1581
-#: builtin/commit.c:1582 builtin/commit.c:1583 builtin/tag.c:618
-#: builtin/tag.c:624
-msgid "commit"
-msgstr "commit"
-
-#: builtin/branch.c:826 builtin/branch.c:832
+#: builtin/branch.c:629 builtin/branch.c:630
 msgid "print only branches that contain the commit"
 msgstr "afficher seulement les branches qui contiennent le commit"
 
-#: builtin/branch.c:838
+#: builtin/branch.c:633
 msgid "Specific git-branch actions:"
 msgstr "Actions spécifiques à git-branch :"
 
-#: builtin/branch.c:839
+#: builtin/branch.c:634
 msgid "list both remote-tracking and local branches"
 msgstr "afficher à la fois les branches de suivi et les branches locales"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:636
 msgid "delete fully merged branch"
 msgstr "supprimer une branche totalement fusionnée"
 
-#: builtin/branch.c:842
+#: builtin/branch.c:637
 msgid "delete branch (even if not merged)"
 msgstr "supprimer une branche (même non fusionnée)"
 
-#: builtin/branch.c:843
+#: builtin/branch.c:638
 msgid "move/rename a branch and its reflog"
 msgstr "déplacer/renommer une branche et son reflog"
 
-#: builtin/branch.c:844
+#: builtin/branch.c:639
 msgid "move/rename a branch, even if target exists"
 msgstr "déplacer/renommer une branche, même si la cible existe"
 
-#: builtin/branch.c:845
+#: builtin/branch.c:640
 msgid "list branch names"
 msgstr "afficher les noms des branches"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:641
 msgid "create the branch's reflog"
 msgstr "créer le reflog de la branche"
 
-#: builtin/branch.c:848
+#: builtin/branch.c:643
 msgid "edit the description for the branch"
 msgstr "éditer la description de la branche"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:644
 msgid "force creation, move/rename, deletion"
 msgstr "forcer la création, le déplacement/renommage, ou la suppression"
 
-#: builtin/branch.c:852
-msgid "print only not merged branches"
-msgstr "afficher seulement les branches non fusionnées"
+#: builtin/branch.c:645
+msgid "print only branches that are merged"
+msgstr "afficher seulement les branches qui sont fusionnées"
 
-#: builtin/branch.c:858
-msgid "print only merged branches"
-msgstr "afficher seulement les branches fusionnées"
+#: builtin/branch.c:646
+msgid "print only branches that are not merged"
+msgstr "afficher seulement les branches qui ne sont pas fusionnées"
 
-#: builtin/branch.c:862
+#: builtin/branch.c:647
 msgid "list branches in columns"
 msgstr "afficher les branches en colonnes"
 
-#: builtin/branch.c:875
+#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
+msgstr "clé"
+
+#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
+msgstr "nom du champ servant à trier"
+
+#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398
+#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564
+#: builtin/tag.c:369
+msgid "object"
+msgstr "objet"
+
+#: builtin/branch.c:652
+msgid "print only branches of the object"
+msgstr "afficher seulement les branches de l'objet"
+
+#: builtin/branch.c:670
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Échec de résolution de HEAD comme référence valide."
 
-#: builtin/branch.c:879 builtin/clone.c:690
+#: builtin/branch.c:674 builtin/clone.c:697
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD non trouvée sous refs/heads !"
 
-#: builtin/branch.c:901
+#: builtin/branch.c:694
 msgid "--column and --verbose are incompatible"
 msgstr "--column et --verbose sont incompatibles"
 
-#: builtin/branch.c:912 builtin/branch.c:951
+#: builtin/branch.c:705 builtin/branch.c:747
 msgid "branch name required"
 msgstr "le nom de branche est requis"
 
-#: builtin/branch.c:927
+#: builtin/branch.c:723
 msgid "Cannot give description to detached HEAD"
 msgstr "Impossible de décrire une HEAD détachée"
 
-#: builtin/branch.c:932
+#: builtin/branch.c:728
 msgid "cannot edit description of more than one branch"
 msgstr "impossible d'éditer la description de plus d'une branche"
 
-#: builtin/branch.c:939
+#: builtin/branch.c:735
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Aucun commit sur la branche '%s'."
 
-#: builtin/branch.c:942
+#: builtin/branch.c:738
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Aucune branche nommée '%s'."
 
-#: builtin/branch.c:957
+#: builtin/branch.c:753
 msgid "too many branches for a rename operation"
 msgstr "trop de branches pour une opération de renommage"
 
-#: builtin/branch.c:962
+#: builtin/branch.c:758
 msgid "too many branches to set new upstream"
 msgstr "trop de branches pour spécifier une branche amont"
 
-#: builtin/branch.c:966
+#: builtin/branch.c:762
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -3808,41 +3851,41 @@
 "impossible de spécifier une branche amont de HEAD par %s qui ne pointe sur "
 "aucune branche."
 
-#: builtin/branch.c:969 builtin/branch.c:991 builtin/branch.c:1012
+#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808
 #, c-format
 msgid "no such branch '%s'"
 msgstr "pas de branche '%s'"
 
-#: builtin/branch.c:973
+#: builtin/branch.c:769
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "la branche '%s' n'existe pas"
 
-#: builtin/branch.c:985
+#: builtin/branch.c:781
 msgid "too many branches to unset upstream"
 msgstr "trop de branches pour désactiver un amont"
 
-#: builtin/branch.c:989
+#: builtin/branch.c:785
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "impossible de désactiver une branche amont de HEAD quand elle ne pointe sur "
 "aucune branche."
 
-#: builtin/branch.c:995
+#: builtin/branch.c:791
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "La branche '%s' n'a aucune information de branche amont"
 
-#: builtin/branch.c:1009
+#: builtin/branch.c:805
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "créer manuellement 'HEAD' n'a pas de sens"
 
-#: builtin/branch.c:1015
+#: builtin/branch.c:811
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "les options -a et -r de 'git branch' n'ont pas de sens avec un nom de branche"
 
-#: builtin/branch.c:1018
+#: builtin/branch.c:814
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3851,7 +3894,7 @@
 "l'option --set-upstream est obsolète et va disparaître. Utilisez plutôt --"
 "track ou --set-upstream-to\n"
 
-#: builtin/branch.c:1035
+#: builtin/branch.c:831
 #, c-format
 msgid ""
 "\n"
@@ -3862,12 +3905,12 @@
 "Si vous vouliez que '%s' suive '%s', faîtes ceci :\n"
 "\n"
 
-#: builtin/branch.c:1036
+#: builtin/branch.c:832
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr "    git branch -d %s\n"
 
-#: builtin/branch.c:1037
+#: builtin/branch.c:833
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr "    git branch --set-upstream-to %s\n"
@@ -3894,11 +3937,8 @@
 "| <type> | --textconv) <objet>"
 
 #: builtin/cat-file.c:429
-msgid ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <list-of-"
-"objects>"
-msgstr ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <liste-d-objets>"
+msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
 
 #: builtin/cat-file.c:466
 msgid "<type> can be one of: blob, tree, commit, tag"
@@ -3956,9 +3996,8 @@
 msgstr "git check-attr [-a | --all | <attr>...] [--] <chemin>..."
 
 #: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...] < <list-of-paths>"
-msgstr ""
-"git check-attr --stdin [-z] [-a | --all | <attr>...] < <liste-de-chemins>"
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+msgstr "git check-attr --stdin [-z] [-a | --all | <attr>...]"
 
 #: builtin/check-attr.c:19
 msgid "report all attributes set on file"
@@ -3977,7 +4016,7 @@
 msgstr ""
 "terminer les enregistrements en entrée et en sortie par un caractère NUL"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1133 builtin/gc.c:267
+#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "supprimer l'état d'avancement"
 
@@ -4065,6 +4104,8 @@
 msgstr "écrire le contenu dans des fichiers temporaires"
 
 #: builtin/checkout-index.c:204 builtin/column.c:30
+#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181
 msgid "string"
 msgstr "chaîne"
 
@@ -4084,107 +4125,107 @@
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<options>] [<branche>] -- <fichier>..."
 
-#: builtin/checkout.c:133 builtin/checkout.c:166
+#: builtin/checkout.c:134 builtin/checkout.c:167
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "le chemin '%s' n'a pas notre version"
 
-#: builtin/checkout.c:135 builtin/checkout.c:168
+#: builtin/checkout.c:136 builtin/checkout.c:169
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "le chemin '%s' n'a pas leur version"
 
-#: builtin/checkout.c:151
+#: builtin/checkout.c:152
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "le chemin '%s' n'a aucune des versions nécessaires"
 
-#: builtin/checkout.c:195
+#: builtin/checkout.c:196
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "le chemin '%s' n'a pas les versions nécessaires"
 
-#: builtin/checkout.c:212
+#: builtin/checkout.c:213
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "chemin '%s' : impossible de fusionner"
 
-#: builtin/checkout.c:229
+#: builtin/checkout.c:230
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "Impossible d'ajouter le résultat de fusion pour '%s'"
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
+#: builtin/checkout.c:260
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "'%s' ne peut pas être utilisé avec des mises à jour de chemins"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:263 builtin/checkout.c:266
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' ne peut pas être utilisé avec %s"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:269
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 "Impossible de mettre à jour les chemins et basculer sur la branche '%s' en "
 "même temps."
 
-#: builtin/checkout.c:279 builtin/checkout.c:473
+#: builtin/checkout.c:280 builtin/checkout.c:474
 msgid "corrupt index file"
 msgstr "fichier d'index corrompu"
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:340 builtin/checkout.c:347
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "le chemin '%s' n'est pas fusionné"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:496
 msgid "you need to resolve your current index first"
 msgstr "vous devez d'abord résoudre votre index courant"
 
-#: builtin/checkout.c:622
+#: builtin/checkout.c:623
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Impossible de faire un reflog pour '%s' : %s\n"
 
-#: builtin/checkout.c:660
+#: builtin/checkout.c:661
 msgid "HEAD is now at"
 msgstr "HEAD est maintenant sur"
 
-#: builtin/checkout.c:667
+#: builtin/checkout.c:668
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Remise à zéro de la branche '%s'\n"
 
-#: builtin/checkout.c:670
+#: builtin/checkout.c:671
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Déjà sur '%s'\n"
 
-#: builtin/checkout.c:674
+#: builtin/checkout.c:675
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Basculement et remise à zéro de la branche '%s'\n"
 
-#: builtin/checkout.c:676 builtin/checkout.c:1065
+#: builtin/checkout.c:677 builtin/checkout.c:1066
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Basculement sur la nouvelle branche '%s'\n"
 
-#: builtin/checkout.c:678
+#: builtin/checkout.c:679
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Basculement sur la branche '%s'\n"
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:731
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... et %d en plus.\n"
 
-#: builtin/checkout.c:736
+#: builtin/checkout.c:737
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4207,7 +4248,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:755
+#: builtin/checkout.c:756
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -4236,145 +4277,151 @@
 "git branch <nouvelle-branche> %s\n"
 "\n"
 
-#: builtin/checkout.c:791
+#: builtin/checkout.c:792
 msgid "internal error in revision walk"
 msgstr "erreur interne lors du parcours des révisions"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:796
 msgid "Previous HEAD position was"
 msgstr "La position précédente de HEAD était sur"
 
-#: builtin/checkout.c:822 builtin/checkout.c:1060
+#: builtin/checkout.c:823 builtin/checkout.c:1061
 msgid "You are on a branch yet to be born"
 msgstr "Vous êtes sur une branche qui doit encore naître"
 
-#: builtin/checkout.c:967
+#: builtin/checkout.c:968
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "une seule référence attendue, %d fournies."
 
-#: builtin/checkout.c:1006 builtin/worktree.c:210
+#: builtin/checkout.c:1007 builtin/worktree.c:213
 #, c-format
 msgid "invalid reference: %s"
 msgstr "référence invalide : %s"
 
-#: builtin/checkout.c:1035
+#: builtin/checkout.c:1036
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "la référence n'est pas un arbre : %s"
 
-#: builtin/checkout.c:1074
+#: builtin/checkout.c:1075
 msgid "paths cannot be used with switching branches"
 msgstr "impossible d'utiliser des chemins avec un basculement de branches"
 
-#: builtin/checkout.c:1077 builtin/checkout.c:1081
+#: builtin/checkout.c:1078 builtin/checkout.c:1082
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' ne peut pas être utilisé avec un basculement de branches"
 
-#: builtin/checkout.c:1085 builtin/checkout.c:1088 builtin/checkout.c:1093
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094
+#: builtin/checkout.c:1097
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' ne peut pas être utilisé avec '%s'"
 
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1102
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Impossible de basculer de branche vers '%s' qui n'est pas un commit"
 
-#: builtin/checkout.c:1134 builtin/checkout.c:1136 builtin/clone.c:83
-#: builtin/remote.c:159 builtin/remote.c:161 builtin/worktree.c:317
-#: builtin/worktree.c:319
+#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320
+#: builtin/worktree.c:322
 msgid "branch"
 msgstr "branche"
 
-#: builtin/checkout.c:1135
+#: builtin/checkout.c:1136
 msgid "create and checkout a new branch"
 msgstr "créer et extraire une nouvelle branche"
 
-#: builtin/checkout.c:1137
+#: builtin/checkout.c:1138
 msgid "create/reset and checkout a branch"
 msgstr "créer/réinitialiser et extraire une branche"
 
-#: builtin/checkout.c:1138
+#: builtin/checkout.c:1139
 msgid "create reflog for new branch"
 msgstr "créer un reflog pour une nouvelle branche"
 
-#: builtin/checkout.c:1139
+#: builtin/checkout.c:1140
 msgid "detach the HEAD at named commit"
 msgstr "détacher la HEAD à la validation nommée"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "set upstream info for new branch"
 msgstr "paramétrer les coordonnées de branche amont pour une nouvelle branche"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new-branch"
 msgstr "nouvelle branche"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new unparented branch"
 msgstr "nouvelle branche sans parent"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "checkout our version for unmerged files"
 msgstr "extraire notre version pour les fichiers non fusionnés"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "checkout their version for unmerged files"
 msgstr "extraire leur version pour les fichiers non fusionnés"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1148
 msgid "force checkout (throw away local modifications)"
 msgstr "forcer l'extraction (laisser tomber les modifications locales)"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "perform a 3-way merge with the new branch"
 msgstr "effectuer une fusion à 3 points avec la nouvelle branche"
 
-#: builtin/checkout.c:1149 builtin/merge.c:227
+#: builtin/checkout.c:1150 builtin/merge.c:227
 msgid "update ignored files (default)"
 msgstr "mettre à jour les fichiers ignorés (par défaut)"
 
-#: builtin/checkout.c:1150 builtin/log.c:1264 parse-options.h:249
+#: builtin/checkout.c:1151 builtin/log.c:1266 parse-options.h:250
 msgid "style"
 msgstr "style"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "conflict style (merge or diff3)"
 msgstr "style de conflit (fusion ou diff3)"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "ne pas limiter les spécificateurs de chemins aux seuls éléments creux"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1157
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "réessayer d'interpréter 'git checkout <branche-inexistante>'"
 
-#: builtin/checkout.c:1158
+#: builtin/checkout.c:1159
 msgid "do not check if another worktree is holding the given ref"
 msgstr ""
 "ne pas vérifier si une autre copie de travail contient le référence fournie"
 
-#: builtin/checkout.c:1181
+#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112
+#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:558
+#: builtin/send-pack.c:168
+msgid "force progress reporting"
+msgstr "forcer l'affichage de l'état d'avancement"
+
+#: builtin/checkout.c:1191
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B et --orphan sont mutuellement exclusifs"
 
-#: builtin/checkout.c:1198
+#: builtin/checkout.c:1208
 msgid "--track needs a branch name"
 msgstr "--track requiert un nom de branche"
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1213
 msgid "Missing branch name; try -b"
 msgstr "Nom de branche manquant ; essayez -b"
 
-#: builtin/checkout.c:1239
+#: builtin/checkout.c:1249
 msgid "invalid path specification"
 msgstr "spécification de chemin invalide"
 
-#: builtin/checkout.c:1246
+#: builtin/checkout.c:1256
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4384,12 +4431,12 @@
 "en même temps.\n"
 "Souhaitiez-vous extraire '%s' qui ne peut être résolu comme commit ?"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1261
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach n'accepte pas un argument de chemin '%s'"
 
-#: builtin/checkout.c:1255
+#: builtin/checkout.c:1265
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4428,7 +4475,7 @@
 msgid "failed to remove %s"
 msgstr "échec de la suppression de %s"
 
-#: builtin/clean.c:317
+#: builtin/clean.c:315
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -4440,7 +4487,7 @@
 "foo         - sélectionner un élément par un préfixe unique\n"
 "            - (vide) ne rien sélectionner"
 
-#: builtin/clean.c:321
+#: builtin/clean.c:319
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -4460,36 +4507,36 @@
 "*          - choisir tous les éléments\n"
 "           - (vide) terminer la sélection"
 
-#: builtin/clean.c:537
+#: builtin/clean.c:535
 #, c-format
 msgid "Huh (%s)?"
 msgstr "Hein (%s) ?"
 
-#: builtin/clean.c:679
+#: builtin/clean.c:677
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Entrez les motifs à ignorer>> "
 
-#: builtin/clean.c:716
+#: builtin/clean.c:714
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "ATTENTION : Impossible de trouver les éléments correspondant à : %s"
 
-#: builtin/clean.c:737
+#: builtin/clean.c:735
 msgid "Select items to delete"
 msgstr "Sélectionner les éléments à supprimer"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:778
+#: builtin/clean.c:776
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "Supprimer %s [y/N] ? "
 
-#: builtin/clean.c:803
+#: builtin/clean.c:801
 msgid "Bye."
 msgstr "Au revoir."
 
-#: builtin/clean.c:811
+#: builtin/clean.c:809
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -4507,62 +4554,62 @@
 "help                - cet écran\n"
 "?                   - aide pour la sélection en ligne"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:836
 msgid "*** Commands ***"
 msgstr "*** Commandes ***"
 
-#: builtin/clean.c:839
+#: builtin/clean.c:837
 msgid "What now"
 msgstr "Et maintenant ?"
 
-#: builtin/clean.c:847
+#: builtin/clean.c:845
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Supprimerait l'élément suivant :"
 msgstr[1] "Supprimerait les éléments suivants :"
 
-#: builtin/clean.c:864
+#: builtin/clean.c:862
 msgid "No more files to clean, exiting."
 msgstr "Plus de fichier à nettoyer, sortie."
 
-#: builtin/clean.c:895
+#: builtin/clean.c:893
 msgid "do not print names of files removed"
 msgstr "ne pas afficher les noms des fichiers supprimés"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:895
 msgid "force"
 msgstr "forcer"
 
-#: builtin/clean.c:898
+#: builtin/clean.c:896
 msgid "interactive cleaning"
 msgstr "nettoyage interactif"
 
-#: builtin/clean.c:900
+#: builtin/clean.c:898
 msgid "remove whole directories"
 msgstr "supprimer les répertoires entiers"
 
-#: builtin/clean.c:901 builtin/describe.c:407 builtin/grep.c:714
-#: builtin/ls-files.c:443 builtin/name-rev.c:311 builtin/show-ref.c:187
+#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709
+#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182
 msgid "pattern"
 msgstr "motif"
 
-#: builtin/clean.c:902
+#: builtin/clean.c:900
 msgid "add <pattern> to ignore rules"
 msgstr "ajouter <motif> aux règles ignore"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:901
 msgid "remove ignored files, too"
 msgstr "supprimer les fichiers ignorés, aussi"
 
-#: builtin/clean.c:905
+#: builtin/clean.c:903
 msgid "remove only ignored files"
 msgstr "supprimer seulement les fichiers ignorés"
 
-#: builtin/clean.c:923
+#: builtin/clean.c:921
 msgid "-x and -X cannot be used together"
 msgstr "-x et -X ne peuvent pas être utilisés ensemble"
 
-#: builtin/clean.c:927
+#: builtin/clean.c:925
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -4570,7 +4617,7 @@
 "clean.requireForce positionné à true et ni -i, -n ou -f fourni ; refus de "
 "nettoyer"
 
-#: builtin/clean.c:930
+#: builtin/clean.c:928
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -4582,16 +4629,11 @@
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<options>] [--] <dépôt> [<répertoire>]"
 
-#: builtin/clone.c:57 builtin/fetch.c:112 builtin/merge.c:224
-#: builtin/pull.c:109 builtin/push.c:560 builtin/send-pack.c:168
-msgid "force progress reporting"
-msgstr "forcer l'affichage de l'état d'avancement"
-
 #: builtin/clone.c:59
 msgid "don't create a checkout"
 msgstr "ne pas créer d'extraction"
 
-#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:504
+#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469
 msgid "create a bare repository"
 msgstr "créer un dépôt nu"
 
@@ -4615,15 +4657,15 @@
 msgid "initialize submodules in the clone"
 msgstr "initialiser les sous-modules dans le clone"
 
-#: builtin/clone.c:75 builtin/init-db.c:501
+#: builtin/clone.c:75 builtin/init-db.c:466
 msgid "template-directory"
 msgstr "répertoire-modèle"
 
-#: builtin/clone.c:76 builtin/init-db.c:502
+#: builtin/clone.c:76 builtin/init-db.c:467
 msgid "directory from which templates will be used"
 msgstr "répertoire depuis lequel les modèles vont être utilisés"
 
-#: builtin/clone.c:78
+#: builtin/clone.c:78 builtin/submodule--helper.c:179
 msgid "reference repository"
 msgstr "dépôt de référence"
 
@@ -4647,7 +4689,7 @@
 msgid "path to git-upload-pack on the remote"
 msgstr "chemin vers git-upload-pack sur le serveur distant"
 
-#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:659 builtin/pull.c:186
+#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654 builtin/pull.c:186
 msgid "depth"
 msgstr "profondeur"
 
@@ -4659,11 +4701,11 @@
 msgid "clone only one branch, HEAD or --branch"
 msgstr "cloner seulement une branche, HEAD ou --branch"
 
-#: builtin/clone.c:91 builtin/init-db.c:510
+#: builtin/clone.c:91 builtin/init-db.c:475
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:92 builtin/init-db.c:511
+#: builtin/clone.c:92 builtin/init-db.c:476
 msgid "separate git dir from working tree"
 msgstr "séparer le répertoire git de la copie de travail"
 
@@ -4675,52 +4717,59 @@
 msgid "set config inside the new repository"
 msgstr "régler la configuration dans le nouveau dépôt"
 
-#: builtin/clone.c:298
+#: builtin/clone.c:300
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr ""
+"extraire le dépôt de référence '%s' comme une extraction liée n'est pas "
+"encore supporté"
+
+#: builtin/clone.c:302
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr "le dépôt de référence '%s' n'est pas un dépôt local."
 
-#: builtin/clone.c:302
+#: builtin/clone.c:307
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "le dépôt de référence '%s' est superficiel"
 
-#: builtin/clone.c:305
+#: builtin/clone.c:310
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "le dépôt de référence '%s' est greffé"
 
-#: builtin/clone.c:370 builtin/diff.c:84
+#: builtin/clone.c:375 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "échec du stat de '%s'"
 
-#: builtin/clone.c:372
+#: builtin/clone.c:377
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existe et n'est pas un répertoire"
 
-#: builtin/clone.c:386
+#: builtin/clone.c:391
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "échec du stat de %s\n"
 
-#: builtin/clone.c:408
+#: builtin/clone.c:413
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "échec de la création du lien '%s'"
 
-#: builtin/clone.c:412
+#: builtin/clone.c:417
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "échec de la copie vers '%s'"
 
-#: builtin/clone.c:435 builtin/clone.c:619
+#: builtin/clone.c:442 builtin/clone.c:626
 #, c-format
 msgid "done.\n"
 msgstr "fait.\n"
 
-#: builtin/clone.c:447
+#: builtin/clone.c:454
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -4730,125 +4779,121 @@
 "Vous pouvez inspecter ce qui a été extrait avec 'git status'\n"
 "et réessayer l'extraction avec 'git checkout -f HEAD'\n"
 
-#: builtin/clone.c:524
+#: builtin/clone.c:531
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Impossible de trouver la branche distante '%s' à cloner."
 
-#: builtin/clone.c:614
+#: builtin/clone.c:621
 #, c-format
 msgid "Checking connectivity... "
 msgstr "Vérification de la connectivité... "
 
-#: builtin/clone.c:617
+#: builtin/clone.c:624
 msgid "remote did not send all necessary objects"
 msgstr "le serveur distant n'a pas envoyé tous les objets nécessaires"
 
-#: builtin/clone.c:681
+#: builtin/clone.c:688
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "la HEAD distante réfère à une référence non existante, impossible de "
 "l'extraire.\n"
 
-#: builtin/clone.c:712
+#: builtin/clone.c:719
 msgid "unable to checkout working tree"
 msgstr "impossible d'extraire la copie de travail"
 
-#: builtin/clone.c:799
+#: builtin/clone.c:808
 msgid "cannot repack to clean up"
 msgstr "impossible de remballer pour nettoyer"
 
-#: builtin/clone.c:801
+#: builtin/clone.c:810
 msgid "cannot unlink temporary alternates file"
 msgstr "impossible de unlinker le fichier temporaire alternates"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:842
 msgid "Too many arguments."
 msgstr "Trop d'arguments."
 
-#: builtin/clone.c:835
+#: builtin/clone.c:846
 msgid "You must specify a repository to clone."
 msgstr "Vous devez spécifier un dépôt à cloner."
 
-#: builtin/clone.c:846
+#: builtin/clone.c:857
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "les options --bare et --origin %s sont incompatibles."
 
-#: builtin/clone.c:849
+#: builtin/clone.c:860
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare et --separate-git-dir sont incompatibles."
 
-#: builtin/clone.c:862
+#: builtin/clone.c:873
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "le dépôt '%s' n'existe pas"
 
-#: builtin/clone.c:868 builtin/fetch.c:1168
+#: builtin/clone.c:879 builtin/fetch.c:1166
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "la profondeur %s n'est pas un entier positif"
 
-#: builtin/clone.c:878
+#: builtin/clone.c:889
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr ""
 "le chemin de destination '%s' existe déjà et n'est pas un répertoire vide."
 
-#: builtin/clone.c:888
+#: builtin/clone.c:899
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "la copie de travail '%s' existe déjà."
 
-#: builtin/clone.c:903 builtin/clone.c:914 builtin/worktree.c:218
-#: builtin/worktree.c:245
+#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224
+#: builtin/worktree.c:221 builtin/worktree.c:248
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "impossible de créer les répertoires de premier niveau dans '%s'"
 
-#: builtin/clone.c:906
+#: builtin/clone.c:917
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "impossible de créer le répertoire de la copie de travail '%s'"
 
-#: builtin/clone.c:924
+#: builtin/clone.c:935
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Clonage dans le dépôt nu '%s'\n"
 
-#: builtin/clone.c:926
+#: builtin/clone.c:937
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Clonage dans '%s'...\n"
 
-#: builtin/clone.c:951
-msgid "--dissociate given, but there is no --reference"
-msgstr "--dissociate est spécifié, mais --reference est absent"
-
-#: builtin/clone.c:968
+#: builtin/clone.c:975
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 "--depth est ignoré dans les clones locaux : utilisez plutôt \"file://\"."
 
-#: builtin/clone.c:971
+#: builtin/clone.c:978
 msgid "source repository is shallow, ignoring --local"
 msgstr "le dépôt source est superficiel, option --local ignorée"
 
-#: builtin/clone.c:976
+#: builtin/clone.c:983
 msgid "--local is ignored"
 msgstr "--local est ignoré"
 
-#: builtin/clone.c:980
+#: builtin/clone.c:987
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Je ne sais pas cloner %s"
 
-#: builtin/clone.c:1029 builtin/clone.c:1037
+#: builtin/clone.c:1036 builtin/clone.c:1044
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "La branche distante %s n'a pas été trouvée dans le dépôt amont %s"
 
-#: builtin/clone.c:1040
+#: builtin/clone.c:1047
 msgid "You appear to have cloned an empty repository."
 msgstr "Vous semblez avoir cloné un dépôt vide."
 
@@ -4884,15 +4929,15 @@
 msgid "--command must be the first argument"
 msgstr "--command doit être le premier argument"
 
-#: builtin/commit.c:37
+#: builtin/commit.c:38
 msgid "git commit [<options>] [--] <pathspec>..."
 msgstr "git commit [<options>] [--] <spécification-de-chemin>..."
 
-#: builtin/commit.c:42
+#: builtin/commit.c:43
 msgid "git status [<options>] [--] <pathspec>..."
 msgstr "git status [<options>] [--] <spécification-de-chemin>..."
 
-#: builtin/commit.c:47
+#: builtin/commit.c:48
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4919,7 +4964,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:60
+#: builtin/commit.c:61
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4945,7 +4990,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:72
+#: builtin/commit.c:73
 msgid ""
 "You asked to amend the most recent commit, but doing so would make\n"
 "it empty. You can repeat your command with --allow-empty, or you can\n"
@@ -4956,7 +5001,7 @@
 "vide. Vous pouvez répéter votre commande avec --allow-empty, ou vous pouvez\n"
 "supprimer complètement le commit avec \"git reset HEAD^\".\n"
 
-#: builtin/commit.c:77
+#: builtin/commit.c:78
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4971,11 +5016,11 @@
 "    git commit --allow-empty\n"
 "\n"
 
-#: builtin/commit.c:84
+#: builtin/commit.c:85
 msgid "Otherwise, please use 'git reset'\n"
 msgstr "Sinon, veuillez utiliser 'git reset'\n"
 
-#: builtin/commit.c:87
+#: builtin/commit.c:88
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4991,66 +5036,66 @@
 "Puis \"git cherry-pick --continue\" continuera le picorage \n"
 "des commits restants.\n"
 
-#: builtin/commit.c:304
+#: builtin/commit.c:305
 msgid "failed to unpack HEAD tree object"
 msgstr "échec du dépaquetage de l'objet arbre HEAD"
 
-#: builtin/commit.c:345
+#: builtin/commit.c:346
 msgid "unable to create temporary index"
 msgstr "impossible de créer l'index temporaire"
 
-#: builtin/commit.c:351
+#: builtin/commit.c:352
 msgid "interactive add failed"
 msgstr "échec de l'ajout interactif"
 
-#: builtin/commit.c:364
+#: builtin/commit.c:365
 msgid "unable to update temporary index"
 msgstr "impossible de mettre à jour l'index temporaire"
 
-#: builtin/commit.c:366
+#: builtin/commit.c:367
 msgid "Failed to update main cache tree"
 msgstr "Impossible de mettre à jour l'arbre de cache principal"
 
-#: builtin/commit.c:390 builtin/commit.c:413 builtin/commit.c:462
+#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
 msgid "unable to write new_index file"
 msgstr "impossible d'écrire le fichier new_index"
 
-#: builtin/commit.c:444
+#: builtin/commit.c:445
 msgid "cannot do a partial commit during a merge."
 msgstr "impossible de faire une validation partielle pendant une fusion."
 
-#: builtin/commit.c:446
+#: builtin/commit.c:447
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "impossible de faire une validation partielle pendant un picorage."
 
-#: builtin/commit.c:455
+#: builtin/commit.c:456
 msgid "cannot read the index"
 msgstr "impossible de lire l'index"
 
-#: builtin/commit.c:474
+#: builtin/commit.c:475
 msgid "unable to write temporary index file"
 msgstr "impossible d'écrire le fichier d'index temporaire"
 
-#: builtin/commit.c:579
+#: builtin/commit.c:580
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "entête d'auteur manquant dans le commit '%s'"
 
-#: builtin/commit.c:581
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "le commit '%s' a une ligne d'auteur malformée"
 
-#: builtin/commit.c:600
+#: builtin/commit.c:601
 msgid "malformed --author parameter"
 msgstr "paramètre --author mal formé"
 
-#: builtin/commit.c:608
+#: builtin/commit.c:609
 #, c-format
 msgid "invalid date format: %s"
 msgstr "format de date invalide : %s"
 
-#: builtin/commit.c:652
+#: builtin/commit.c:653
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5058,38 +5103,38 @@
 "impossible de sélectionner un caractère de commentaire\n"
 "qui n'est pas utilisé dans le message de validation actuel"
 
-#: builtin/commit.c:689 builtin/commit.c:722 builtin/commit.c:1079
+#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "impossible de rechercher le commit %s"
 
-#: builtin/commit.c:701 builtin/shortlog.c:273
+#: builtin/commit.c:702 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(lecture du message de journal depuis l'entrée standard)\n"
 
-#: builtin/commit.c:703
+#: builtin/commit.c:704
 msgid "could not read log from standard input"
 msgstr "impossible de lire le journal depuis l'entrée standard"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:708
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "impossible de lire le fichier de journal '%s'"
 
-#: builtin/commit.c:729
+#: builtin/commit.c:730
 msgid "could not read MERGE_MSG"
 msgstr "impossible de lire MERGE_MSG"
 
-#: builtin/commit.c:733
+#: builtin/commit.c:734
 msgid "could not read SQUASH_MSG"
 msgstr "impossible de lire SQUASH_MSG"
 
-#: builtin/commit.c:784
+#: builtin/commit.c:785
 msgid "could not write commit template"
 msgstr "impossible d'écrire le modèle de commit"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:803
 #, c-format
 msgid ""
 "\n"
@@ -5104,7 +5149,7 @@
 "\t%s\n"
 "et essayez à nouveau.\n"
 
-#: builtin/commit.c:807
+#: builtin/commit.c:808
 #, c-format
 msgid ""
 "\n"
@@ -5119,7 +5164,7 @@
 "\t%s\n"
 "et essayez à nouveau.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:821
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5129,7 +5174,7 @@
 "commençant par '%c' seront ignorées, et un message vide abandonne la "
 "validation.\n"
 
-#: builtin/commit.c:827
+#: builtin/commit.c:828
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5140,149 +5185,150 @@
 "commençant par '%c' seront conservées ; vous pouvez les supprimer vous-même\n"
 "si vous le souhaitez. Un message vide abandonne la validation.\n"
 
-#: builtin/commit.c:847
+#: builtin/commit.c:848
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAuteur :     %.*s <%.*s>"
 
-#: builtin/commit.c:855
+#: builtin/commit.c:856
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sDate :       %s"
 
-#: builtin/commit.c:862
+#: builtin/commit.c:863
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sValidateur : %.*s <%.*s>"
 
-#: builtin/commit.c:880
+#: builtin/commit.c:881
 msgid "Cannot read index"
 msgstr "Impossible de lire l'index"
 
-#: builtin/commit.c:937
+#: builtin/commit.c:938
 msgid "Error building trees"
 msgstr "Erreur lors de la construction des arbres"
 
-#: builtin/commit.c:952 builtin/tag.c:495
+#: builtin/commit.c:953 builtin/tag.c:266
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Veuillez fournir le message en utilisant l'option -m ou -F.\n"
 
-#: builtin/commit.c:1054
+#: builtin/commit.c:1055
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' n'est pas de la forme 'Nom <email>' ni ne correspond à aucun "
 "auteur existant"
 
-#: builtin/commit.c:1069 builtin/commit.c:1309
+#: builtin/commit.c:1070 builtin/commit.c:1310
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Mode de fichier non suivi invalide '%s'"
 
-#: builtin/commit.c:1106
+#: builtin/commit.c:1107
 msgid "--long and -z are incompatible"
 msgstr "--long et -z sont incompatibles"
 
-#: builtin/commit.c:1136
+#: builtin/commit.c:1137
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "L'utilisation simultanée de --reset-author et --author n'a pas de sens"
 
-#: builtin/commit.c:1145
+#: builtin/commit.c:1146
 msgid "You have nothing to amend."
 msgstr "Il n'y a rien à corriger."
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1149
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Vous êtes en pleine fusion -- impossible de corriger (amend)."
 
-#: builtin/commit.c:1150
+#: builtin/commit.c:1151
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "Vous êtes en plein picorage -- impossible de corriger (amend)."
 
-#: builtin/commit.c:1153
+#: builtin/commit.c:1154
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Les options --squash et --fixup ne peuvent pas être utilisées ensemble"
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1164
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Une seule option parmi -c/-C/-F/--fixup peut être utilisée."
 
-#: builtin/commit.c:1165
+#: builtin/commit.c:1166
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "L'option -m ne peut pas être combinée avec -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1173
+#: builtin/commit.c:1174
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author ne peut être utilisé qu'avec -C, -c ou --amend."
 
-#: builtin/commit.c:1190
+#: builtin/commit.c:1191
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Une seule option parmi --include/--only/--all/--interactive/--patch peut "
 "être utilisée."
 
-#: builtin/commit.c:1192
+#: builtin/commit.c:1193
 msgid "No paths with --include/--only does not make sense."
 msgstr "Aucun chemin avec les options --include/--only n'a pas de sens."
 
-#: builtin/commit.c:1194
+#: builtin/commit.c:1195
 msgid "Clever... amending the last one with dirty index."
 msgstr "Malin... correction du dernier avec un index sale."
 
-#: builtin/commit.c:1196
+#: builtin/commit.c:1197
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "Chemins explicites spécifiés sans -i ni -o ; --only supposé..."
 
-#: builtin/commit.c:1208 builtin/tag.c:730
+#: builtin/commit.c:1209 builtin/tag.c:475
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Mode de nettoyage invalide %s"
 
-#: builtin/commit.c:1213
+#: builtin/commit.c:1214
 msgid "Paths with -a does not make sense."
 msgstr "Spécifier des chemins avec l'option -a n'a pas de sens."
 
-#: builtin/commit.c:1323 builtin/commit.c:1602
+#: builtin/commit.c:1324 builtin/commit.c:1605
 msgid "show status concisely"
 msgstr "afficher le statut avec concision"
 
-#: builtin/commit.c:1325 builtin/commit.c:1604
+#: builtin/commit.c:1326 builtin/commit.c:1607
 msgid "show branch information"
 msgstr "afficher l'information de branche"
 
-#: builtin/commit.c:1327 builtin/commit.c:1606 builtin/push.c:546
+#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:544
+#: builtin/worktree.c:423
 msgid "machine-readable output"
 msgstr "sortie pour traitement automatique"
 
-#: builtin/commit.c:1330 builtin/commit.c:1608
+#: builtin/commit.c:1331 builtin/commit.c:1611
 msgid "show status in long format (default)"
 msgstr "afficher le statut en format long (par défaut)"
 
-#: builtin/commit.c:1333 builtin/commit.c:1611
+#: builtin/commit.c:1334 builtin/commit.c:1614
 msgid "terminate entries with NUL"
 msgstr "terminer les éléments par NUL"
 
-#: builtin/commit.c:1335 builtin/commit.c:1614 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:604
+#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:353
 msgid "mode"
 msgstr "mode"
 
-#: builtin/commit.c:1336 builtin/commit.c:1614
+#: builtin/commit.c:1337 builtin/commit.c:1617
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "afficher les fichiers non suivis, \"mode\" facultatif : all (tous), normal, "
 "no. (Défaut : all)"
 
-#: builtin/commit.c:1339
+#: builtin/commit.c:1340
 msgid "show ignored files"
 msgstr "afficher les fichiers ignorés"
 
-#: builtin/commit.c:1340 parse-options.h:155
+#: builtin/commit.c:1341 parse-options.h:155
 msgid "when"
 msgstr "quand"
 
-#: builtin/commit.c:1341
+#: builtin/commit.c:1342
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -5290,196 +5336,201 @@
 "ignorer les modifications dans les sous-modules, \"quand\" facultatif : all "
 "(tous), dirty (sale), untracked (non suivi). (Défaut : all)"
 
-#: builtin/commit.c:1343
+#: builtin/commit.c:1344
 msgid "list untracked files in columns"
 msgstr "afficher les fichiers non suivis en colonnes"
 
-#: builtin/commit.c:1429
+#: builtin/commit.c:1430
 msgid "couldn't look up newly created commit"
 msgstr "impossible de retrouver le commit nouvellement créé"
 
-#: builtin/commit.c:1431
+#: builtin/commit.c:1432
 msgid "could not parse newly created commit"
 msgstr "impossible d'analyser le commit nouvellement créé"
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1477
 msgid "detached HEAD"
 msgstr "HEAD détachée"
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1480
 msgid " (root-commit)"
 msgstr " (commit racine)"
 
-#: builtin/commit.c:1572
+#: builtin/commit.c:1575
 msgid "suppress summary after successful commit"
 msgstr "supprimer le résumé après une validation réussie"
 
-#: builtin/commit.c:1573
+#: builtin/commit.c:1576
 msgid "show diff in commit message template"
 msgstr "afficher les diff dans le modèle de message de validation"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1578
 msgid "Commit message options"
 msgstr "Options du message de validation"
 
-#: builtin/commit.c:1576 builtin/tag.c:602
+#: builtin/commit.c:1579 builtin/tag.c:351
 msgid "read message from file"
 msgstr "lire le message depuis un fichier"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "author"
 msgstr "auteur"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "override author for commit"
 msgstr "remplacer l'auteur pour la validation"
 
-#: builtin/commit.c:1578 builtin/gc.c:268
+#: builtin/commit.c:1581 builtin/gc.c:326
 msgid "date"
 msgstr "date"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1581
 msgid "override date for commit"
 msgstr "remplacer la date pour la validation"
 
-#: builtin/commit.c:1579 builtin/merge.c:218 builtin/notes.c:392
-#: builtin/notes.c:555 builtin/tag.c:600
+#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392
+#: builtin/notes.c:555 builtin/tag.c:349
 msgid "message"
 msgstr "message"
 
-#: builtin/commit.c:1579
+#: builtin/commit.c:1582
 msgid "commit message"
 msgstr "message de validation"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
+#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
+msgid "commit"
+msgstr "commit"
+
+#: builtin/commit.c:1583
 msgid "reuse and edit message from specified commit"
 msgstr "réutiliser et éditer le message du commit spécifié"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1584
 msgid "reuse message from specified commit"
 msgstr "réutiliser le message du commit spécifié"
 
-#: builtin/commit.c:1582
+#: builtin/commit.c:1585
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "utiliser un message au format autosquash pour corriger le commit spécifié"
 
-#: builtin/commit.c:1583
+#: builtin/commit.c:1586
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "utiliser un message au format autosquash pour compresser le commit spécifié"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1587
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
 "à présent je suis l'auteur de la validation (utilisé avec -C/-c/--amend)"
 
-#: builtin/commit.c:1585 builtin/log.c:1216 builtin/revert.c:86
+#: builtin/commit.c:1588 builtin/log.c:1216 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "ajouter une entrée Signed-off-by :"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1589
 msgid "use specified template file"
 msgstr "utiliser le fichier de modèle spécifié"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1590
 msgid "force edit of commit"
 msgstr "forcer l'édition du commit"
 
-#: builtin/commit.c:1588
+#: builtin/commit.c:1591
 msgid "default"
 msgstr "défaut"
 
-#: builtin/commit.c:1588 builtin/tag.c:605
+#: builtin/commit.c:1591 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "comment éliminer les espaces et les commentaires # du message"
 
-#: builtin/commit.c:1589
+#: builtin/commit.c:1592
 msgid "include status in commit message template"
 msgstr "inclure le statut dans le modèle de message de validation"
 
-#: builtin/commit.c:1591 builtin/merge.c:226 builtin/pull.c:156
+#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "signer la validation avec GPG"
 
-#: builtin/commit.c:1594
+#: builtin/commit.c:1597
 msgid "Commit contents options"
 msgstr "Valider les options des contenus"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1598
 msgid "commit all changed files"
 msgstr "valider tous les fichiers modifiés"
 
-#: builtin/commit.c:1596
+#: builtin/commit.c:1599
 msgid "add specified files to index for commit"
 msgstr "ajouter les fichiers spécifiés à l'index pour la validation"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1600
 msgid "interactively add files"
 msgstr "ajouter des fichiers en mode interactif"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1601
 msgid "interactively add changes"
 msgstr "ajouter les modifications en mode interactif"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1602
 msgid "commit only specified files"
 msgstr "valider seulement les fichiers spécifiés"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1603
 msgid "bypass pre-commit hook"
 msgstr "éviter d'utiliser le crochet pre-commit"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1604
 msgid "show what would be committed"
 msgstr "afficher ce qui serait validé"
 
-#: builtin/commit.c:1612
+#: builtin/commit.c:1615
 msgid "amend previous commit"
 msgstr "corriger la validation précédente"
 
-#: builtin/commit.c:1613
+#: builtin/commit.c:1616
 msgid "bypass post-rewrite hook"
 msgstr "éviter d'utiliser le crochet post-rewrite"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1621
 msgid "ok to record an empty change"
 msgstr "accepter d'enregistrer une modification vide"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1623
 msgid "ok to record a change with an empty message"
 msgstr "accepter d'enregistrer une modification avec un message vide"
 
-#: builtin/commit.c:1649
+#: builtin/commit.c:1652
 msgid "could not parse HEAD commit"
 msgstr "impossible d'analyser le commit HEAD"
 
-#: builtin/commit.c:1695
+#: builtin/commit.c:1698
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Fichier MERGE_HEAD corrompu (%s)"
 
-#: builtin/commit.c:1702
+#: builtin/commit.c:1705
 msgid "could not read MERGE_MODE"
 msgstr "impossible de lire MERGE_MODE"
 
-#: builtin/commit.c:1721
+#: builtin/commit.c:1724
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "impossible de lire le message de validation : %s"
 
-#: builtin/commit.c:1732
+#: builtin/commit.c:1735
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Abandon de la validation ; vous n'avez pas édité le message\n"
 
-#: builtin/commit.c:1737
+#: builtin/commit.c:1740
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Abandon de la validation du à un message de validation vide\n"
 
-#: builtin/commit.c:1785
+#: builtin/commit.c:1788
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -5618,11 +5669,11 @@
 msgid "respect include directives on lookup"
 msgstr "respecter les directives d'inclusion lors de la recherche"
 
-#: builtin/config.c:311
+#: builtin/config.c:303
 msgid "unable to parse default color value"
 msgstr "impossible de lire la valeur de couleur par défaut"
 
-#: builtin/config.c:449
+#: builtin/config.c:441
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5637,16 +5688,16 @@
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:583
+#: builtin/config.c:575
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "création impossible du fichier de configuration '%s'"
 
-#: builtin/count-objects.c:55
+#: builtin/count-objects.c:77
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:65
+#: builtin/count-objects.c:87
 msgid "print sizes in human readable format"
 msgstr "affiche les tailles dans un format humainement lisible"
 
@@ -5768,7 +5819,7 @@
 msgid "only consider tags matching <pattern>"
 msgstr "ne considérer que les étiquettes correspondant à <motif>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:318
+#: builtin/describe.c:410 builtin/name-rev.c:314
 msgid "show abbreviated commit object as fallback"
 msgstr "afficher les objets commits abrégés en dernier recours"
 
@@ -5990,7 +6041,7 @@
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s -> %s  (impossible de récupérer la branche actuelle)"
 
-#: builtin/fetch.c:478 builtin/fetch.c:564
+#: builtin/fetch.c:478 builtin/fetch.c:566
 msgid "[rejected]"
 msgstr "[rejeté]"
 
@@ -6014,40 +6065,40 @@
 msgid "[new ref]"
 msgstr "[nouvelle référence]"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "unable to update local ref"
 msgstr "impossible de mettre à jour la référence locale"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "forced update"
 msgstr "mise à jour forcée"
 
-#: builtin/fetch.c:566
+#: builtin/fetch.c:568
 msgid "(non-fast-forward)"
 msgstr "(pas d'avance rapide)"
 
-#: builtin/fetch.c:600 builtin/fetch.c:842
+#: builtin/fetch.c:602 builtin/fetch.c:843
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "impossible d'ouvrir %s : %s\n"
 
-#: builtin/fetch.c:609
+#: builtin/fetch.c:611
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s n'a pas envoyé tous les objets nécessaires\n"
 
-#: builtin/fetch.c:627
+#: builtin/fetch.c:629
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 "%s rejeté parce que les racines superficielles ne sont pas mises à jour"
 
-#: builtin/fetch.c:715 builtin/fetch.c:807
+#: builtin/fetch.c:716 builtin/fetch.c:808
 #, c-format
 msgid "From %.*s\n"
 msgstr "Depuis %.*s\n"
 
-#: builtin/fetch.c:726
+#: builtin/fetch.c:727
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6056,55 +6107,55 @@
 "des références locales n'ont pas pu être mises à jour ; essayez de lancer\n"
 " 'git remote prune %s' pour supprimer des branches anciennes en conflit"
 
-#: builtin/fetch.c:778
+#: builtin/fetch.c:779
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s sera en suspens)"
 
-#: builtin/fetch.c:779
+#: builtin/fetch.c:780
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s est devenu en suspens)"
 
-#: builtin/fetch.c:811
+#: builtin/fetch.c:812
 msgid "[deleted]"
 msgstr "[supprimé]"
 
-#: builtin/fetch.c:812 builtin/remote.c:1034
+#: builtin/fetch.c:813 builtin/remote.c:1040
 msgid "(none)"
 msgstr "(aucun(e))"
 
-#: builtin/fetch.c:832
+#: builtin/fetch.c:833
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "Refus de récupérer dans la branche courant %s d'un dépôt non nu"
 
-#: builtin/fetch.c:851
+#: builtin/fetch.c:852
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "La valeur \"%2$s\" de l'option \"%1$s\" est invalide pour %3$s"
 
-#: builtin/fetch.c:854
+#: builtin/fetch.c:855
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "L'option \"%s\" est ignorée pour %s\n"
 
-#: builtin/fetch.c:910
+#: builtin/fetch.c:911
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Je ne sais pas récupérer depuis %s"
 
-#: builtin/fetch.c:1071
+#: builtin/fetch.c:1072
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Récupération de %s\n"
 
-#: builtin/fetch.c:1073 builtin/remote.c:90
+#: builtin/fetch.c:1074 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Impossible de récupérer %s"
 
-#: builtin/fetch.c:1091
+#: builtin/fetch.c:1092
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -6112,32 +6163,32 @@
 "Aucun dépôt distant spécifié. Veuillez spécifier une URL ou un nom\n"
 "distant depuis lesquels les nouvelles révisions devraient être récupérées."
 
-#: builtin/fetch.c:1114
+#: builtin/fetch.c:1115
 msgid "You need to specify a tag name."
 msgstr "Vous devez spécifier un nom d'étiquette."
 
-#: builtin/fetch.c:1156
+#: builtin/fetch.c:1157
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth et --unshallow ne peuvent pas être utilisés ensemble"
 
-#: builtin/fetch.c:1158
+#: builtin/fetch.c:1159
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow sur un dépôt complet n'a pas de sens"
 
-#: builtin/fetch.c:1181
+#: builtin/fetch.c:1179
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all n'accepte pas d'argument de dépôt"
 
-#: builtin/fetch.c:1183
+#: builtin/fetch.c:1181
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all n'a pas de sens avec des spécifications de référence"
 
-#: builtin/fetch.c:1194
+#: builtin/fetch.c:1192
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "distant ou groupe distant inexistant : %s"
 
-#: builtin/fetch.c:1202
+#: builtin/fetch.c:1200
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr ""
 "La récupération d'un groupe et les spécifications de référence n'ont pas de "
@@ -6149,23 +6200,23 @@
 msgstr ""
 "git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <fichier>]"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:667
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "peupler le journal avec au plus <n> éléments depuis le journal court"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:670
 msgid "alias for --log (deprecated)"
 msgstr "alias pour --log (obsolète)"
 
-#: builtin/fmt-merge-msg.c:676
+#: builtin/fmt-merge-msg.c:673
 msgid "text"
 msgstr "texte"
 
-#: builtin/fmt-merge-msg.c:677
+#: builtin/fmt-merge-msg.c:674
 msgid "use <text> as start of message"
 msgstr "utiliser <texte> comme début de message"
 
-#: builtin/fmt-merge-msg.c:678
+#: builtin/fmt-merge-msg.c:675
 msgid "file to read from"
 msgstr "fichier d'où lire"
 
@@ -6173,96 +6224,116 @@
 msgid "git for-each-ref [<options>] [<pattern>]"
 msgstr "git for-each-ref [<options>] [<motif>]"
 
-#: builtin/for-each-ref.c:24
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
+msgstr "git for-each-ref [--point-at <objet>]"
+
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<objet>]]"
+
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
+msgstr "git for-each-ref [--contains [<objet>]]"
+
+#: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
 msgstr "échapper les champs réservés pour les interpréteurs de commandes"
 
-#: builtin/for-each-ref.c:26
+#: builtin/for-each-ref.c:29
 msgid "quote placeholders suitably for perl"
 msgstr "échapper les champs réservés pour perl"
 
-#: builtin/for-each-ref.c:28
+#: builtin/for-each-ref.c:31
 msgid "quote placeholders suitably for python"
 msgstr "échapper les champs réservés pour python"
 
-#: builtin/for-each-ref.c:30
+#: builtin/for-each-ref.c:33
 msgid "quote placeholders suitably for Tcl"
 msgstr "échapper les champs réservés pour compatibilité avec Tcl"
 
-#: builtin/for-each-ref.c:33
+#: builtin/for-each-ref.c:36
 msgid "show only <n> matched refs"
 msgstr "n'afficher que <n> références correspondant"
 
-#: builtin/for-each-ref.c:34
+#: builtin/for-each-ref.c:37 builtin/tag.c:372
 msgid "format to use for the output"
 msgstr "format à utiliser pour la sortie"
 
-#: builtin/for-each-ref.c:35
-msgid "key"
-msgstr "clé"
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
+msgstr "afficher seulement les références pointant sur l'objet"
 
-#: builtin/for-each-ref.c:36
-msgid "field name to sort on"
-msgstr "nom du champ servant à trier"
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
+msgstr "afficher seulement les références qui sont fusionnées"
 
-#: builtin/fsck.c:163 builtin/prune.c:137
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr "afficher seulement les références qui ne sont pas fusionnées"
+
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
+msgstr "afficher seulement les références qui contiennent le commit"
+
+#: builtin/fsck.c:156 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr "Vérification de la connectivité"
 
-#: builtin/fsck.c:568
+#: builtin/fsck.c:486
 msgid "Checking object directories"
 msgstr "Vérification des répertoires d'objet"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:553
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<options>] [<objet>...]"
 
-#: builtin/fsck.c:637
+#: builtin/fsck.c:559
 msgid "show unreachable objects"
 msgstr "afficher les objets inaccessibles"
 
-#: builtin/fsck.c:638
+#: builtin/fsck.c:560
 msgid "show dangling objects"
 msgstr "afficher les objets en suspens"
 
-#: builtin/fsck.c:639
+#: builtin/fsck.c:561
 msgid "report tags"
 msgstr "afficher les étiquettes"
 
-#: builtin/fsck.c:640
+#: builtin/fsck.c:562
 msgid "report root nodes"
 msgstr "signaler les nœuds racines"
 
-#: builtin/fsck.c:641
+#: builtin/fsck.c:563
 msgid "make index objects head nodes"
 msgstr "considérer les objets de l'index comme nœuds tête"
 
 # translated from man page
-#: builtin/fsck.c:642
+#: builtin/fsck.c:564
 msgid "make reflogs head nodes (default)"
 msgstr "considérer les reflogs comme nœuds tête (par défaut)"
 
-#: builtin/fsck.c:643
+#: builtin/fsck.c:565
 msgid "also consider packs and alternate objects"
 msgstr "inspecter aussi les objets pack et alternatifs"
 
-#: builtin/fsck.c:644
+#: builtin/fsck.c:566
 msgid "check only connectivity"
 msgstr "ne vérifier que la connectivité"
 
-#: builtin/fsck.c:645
+#: builtin/fsck.c:567
 msgid "enable more strict checking"
 msgstr "activer une vérification plus strict"
 
-#: builtin/fsck.c:647
+#: builtin/fsck.c:569
 msgid "write dangling objects in .git/lost-found"
 msgstr "écrire les objets en suspens dans .git/lost-found"
 
-#: builtin/fsck.c:648 builtin/prune.c:107
+#: builtin/fsck.c:570 builtin/prune.c:107
 msgid "show progress"
 msgstr "afficher la progression"
 
-#: builtin/fsck.c:707
+#: builtin/fsck.c:631
 msgid "Checking objects"
 msgstr "Vérification des objets"
 
@@ -6270,52 +6341,68 @@
 msgid "git gc [<options>]"
 msgstr "git gc [<options>]"
 
-#: builtin/gc.c:55
+#: builtin/gc.c:72
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "%s invalide : '%s'"
 
-#: builtin/gc.c:100
+#: builtin/gc.c:139
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "objet répertoire démentiellement long %.*s"
 
-#: builtin/gc.c:269
+#: builtin/gc.c:290
+#, c-format
+msgid ""
+"The last gc run reported the following. Please correct the root cause\n"
+"and remove %s.\n"
+"Automatic cleanup will not be performed until the file is removed.\n"
+"\n"
+"%s"
+msgstr ""
+"Le dernier lancement de gc a rapporter l'erreur suivante. Veuillez corriger\n"
+"la cause et supprimer %s.\n"
+"Le nettoyage automatique n'aura pas lieu jusqu'à ce que le fichier soit "
+"supprimé.\n"
+"\n"
+"%s"
+
+#: builtin/gc.c:327
 msgid "prune unreferenced objects"
 msgstr "éliminer les objets non référencés"
 
-#: builtin/gc.c:271
+#: builtin/gc.c:329
 msgid "be more thorough (increased runtime)"
 msgstr "être plus consciencieux (durée de traitement allongée)"
 
-#: builtin/gc.c:272
+#: builtin/gc.c:330
 msgid "enable auto-gc mode"
 msgstr "activer le mode auto-gc"
 
-#: builtin/gc.c:273
+#: builtin/gc.c:331
 msgid "force running gc even if there may be another gc running"
 msgstr ""
 "forcer le lancement du ramasse-miettes même si un autre ramasse-miettes "
 "tourne déjà"
 
-#: builtin/gc.c:315
+#: builtin/gc.c:373
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 "Compression automatique du dépôt en tâche de fond pour optimiser les "
 "performances.\n"
 
-#: builtin/gc.c:317
+#: builtin/gc.c:375
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "Compression du dépôt pour optimiser les performances.\n"
 
-#: builtin/gc.c:318
+#: builtin/gc.c:376
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "Voir \"git help gc\" pour toute information sur le nettoyage manuel.\n"
 
-#: builtin/gc.c:336
+#: builtin/gc.c:397
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -6323,7 +6410,7 @@
 "un ramasse-miettes est déjà en cours sur la machine '%s' pid %<PRIuMAX> "
 "(utilisez --force si ce n'est pas le cas)"
 
-#: builtin/gc.c:364
+#: builtin/gc.c:441
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -6359,208 +6446,204 @@
 msgid "cannot open '%s'"
 msgstr "impossible d'ouvrir '%s'"
 
-#: builtin/grep.c:638
+#: builtin/grep.c:633
 msgid "search in index instead of in the work tree"
 msgstr "rechercher dans l'index plutôt que dans la copie de travail"
 
-#: builtin/grep.c:640
+#: builtin/grep.c:635
 msgid "find in contents not managed by git"
 msgstr "rechercher dans les contenus non gérés par git"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:637
 msgid "search in both tracked and untracked files"
 msgstr "rechercher dans les fichiers suivis et non-suivis"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:639
 msgid "ignore files specified via '.gitignore'"
 msgstr "ignorer les fichiers spécifiés via '.gitignore'"
 
-#: builtin/grep.c:647
+#: builtin/grep.c:642
 msgid "show non-matching lines"
 msgstr "afficher les lignes qui ne correspondent pas"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:644
 msgid "case insensitive matching"
 msgstr "correspondance insensible à la casse"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:646
 msgid "match patterns only at word boundaries"
 msgstr "rechercher les motifs aux séparateurs de mots"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:648
 msgid "process binary files as text"
 msgstr "traiter les fichiers binaires comme texte"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:650
 msgid "don't match patterns in binary files"
 msgstr "ne pas chercher les motifs dans les fichiers binaires"
 
-#: builtin/grep.c:658
+#: builtin/grep.c:653
 msgid "process binary files with textconv filters"
 msgstr "traiter les fichiers binaires avec les filtres textconv"
 
-#: builtin/grep.c:660
+#: builtin/grep.c:655
 msgid "descend at most <depth> levels"
 msgstr "descendre au plus de <profondeur> dans l'arborescence"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:659
 msgid "use extended POSIX regular expressions"
 msgstr "utiliser des expressions régulières étendues POSIX"
 
-#: builtin/grep.c:667
+#: builtin/grep.c:662
 msgid "use basic POSIX regular expressions (default)"
 msgstr "utiliser des expressions régulières basiques POSIX (par défaut)"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:665
 msgid "interpret patterns as fixed strings"
 msgstr "interpréter les motifs comme de chaînes fixes"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:668
 msgid "use Perl-compatible regular expressions"
 msgstr "utiliser des expressions régulières compatibles avec Perl"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:671
 msgid "show line numbers"
 msgstr "afficher les numéros de ligne"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:672
 msgid "don't show filenames"
 msgstr "ne pas pas afficher les noms de fichier"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:673
 msgid "show filenames"
 msgstr "afficher les noms de fichier"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:675
 msgid "show filenames relative to top directory"
 msgstr "afficher les noms de fichiers relativement au répertoire de base"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:677
 msgid "show only filenames instead of matching lines"
 msgstr "n'afficher que les noms de fichiers au lieu des lignes correspondant"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:679
 msgid "synonym for --files-with-matches"
 msgstr "synonyme pour --files-with-matches"
 
-#: builtin/grep.c:687
+#: builtin/grep.c:682
 msgid "show only the names of files without match"
 msgstr "n'afficher que les noms des fichiers sans correspondance"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:684
 msgid "print NUL after filenames"
 msgstr "imprimer une caractère NUL après le noms de fichier"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:686
 msgid "show the number of matches instead of matching lines"
 msgstr "afficher le nombre de correspondances au lieu des lignes correspondant"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:687
 msgid "highlight matches"
 msgstr "mettre en évidence les correspondances"
 
-#: builtin/grep.c:694
+#: builtin/grep.c:689
 msgid "print empty line between matches from different files"
 msgstr ""
 "imprimer une ligne vide entre les correspondances de fichiers différents"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:691
 msgid "show filename only once above matches from same file"
 msgstr ""
 "afficher le nom de fichier une fois au dessus des correspondances du même "
 "fichier"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:694
 msgid "show <n> context lines before and after matches"
 msgstr "afficher <n> lignes de contexte avant et après les correspondances"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:697
 msgid "show <n> context lines before matches"
 msgstr "afficher <n> lignes de contexte avant les correspondances"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:699
 msgid "show <n> context lines after matches"
 msgstr "afficher <n> lignes de contexte après les correspondances"
 
-#: builtin/grep.c:705
+#: builtin/grep.c:700
 msgid "shortcut for -C NUM"
 msgstr "raccourci pour -C NUM"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:703
 msgid "show a line with the function name before matches"
 msgstr ""
 "afficher une ligne avec le nom de la fonction avant les correspondances"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:705
 msgid "show the surrounding function"
 msgstr "afficher la fonction contenante"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:708
 msgid "read patterns from file"
 msgstr "lire les motifs depuis fichier"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:710
 msgid "match <pattern>"
 msgstr "rechercher <motif>"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:712
 msgid "combine patterns specified with -e"
 msgstr "combiner les motifs spécifiés par -e"
 
-#: builtin/grep.c:729
+#: builtin/grep.c:724
 msgid "indicate hit with exit status without output"
 msgstr ""
 "indiquer des correspondances avec le code de sortie mais sans rien afficher"
 
-#: builtin/grep.c:731
+#: builtin/grep.c:726
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "n'afficher que les correspondances de fichiers qui correspondent à tous les "
 "motifs"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:728
 msgid "show parse tree for grep expression"
 msgstr "afficher l'arbre d'analyse pour le motif grep"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "pager"
 msgstr "pagineur"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "show matching files in the pager"
 msgstr "afficher les fichiers correspondant dans le pagineur"
 
-#: builtin/grep.c:740
+#: builtin/grep.c:735
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "permettre l'appel de grep(1) (ignoré par ce build)"
 
-#: builtin/grep.c:741 builtin/show-ref.c:189
-msgid "show usage"
-msgstr "afficher l'usage"
-
-#: builtin/grep.c:808
+#: builtin/grep.c:793
 msgid "no pattern given."
 msgstr "aucun motif fourni."
 
-#: builtin/grep.c:866
+#: builtin/grep.c:851
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager ne fonctionne que sur la copie de travail"
 
-#: builtin/grep.c:892
+#: builtin/grep.c:877
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached ou --untracked ne peuvent pas être utilisés avec --no-index."
 
-#: builtin/grep.c:897
+#: builtin/grep.c:882
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr ""
 "--no-index ou --untracked ne peuvent pas être utilisés avec des révisions."
 
-#: builtin/grep.c:900
+#: builtin/grep.c:885
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 "--[no-]exclude-standard ne peut pas être utilisé avec du contenu suivi."
 
-#: builtin/grep.c:908
+#: builtin/grep.c:893
 msgid "both --cached and trees are given."
 msgstr "--cached et des arbres sont fournis en même temps."
 
@@ -6573,10 +6656,10 @@
 "[--] <fichier>..."
 
 #: builtin/hash-object.c:81
-msgid "git hash-object  --stdin-paths < <list-of-paths>"
-msgstr "git hash-object  --stdin-paths < <liste-de-chemins>"
+msgid "git hash-object  --stdin-paths"
+msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:92 builtin/tag.c:614
+#: builtin/hash-object.c:92
 msgid "type"
 msgstr "type"
 
@@ -6649,12 +6732,12 @@
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "la version d'emacsclient '%d' est trop ancienne (<22)."
 
-#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
+#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "échec de l'exécution de '%s' : %s"
 
-#: builtin/help.c:215
+#: builtin/help.c:208
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -6663,7 +6746,7 @@
 "'%s' : chemin pour l'utilitaire de visualisation de manuel non supporté.\n"
 "Veuillez utiliser plutôt 'man.<outil>.cmd'."
 
-#: builtin/help.c:227
+#: builtin/help.c:220
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -6672,62 +6755,62 @@
 "'%s' : chemin pour l'utilitaire de visualisation de manuel supporté.\n"
 "Veuillez utiliser plutôt 'man.<outil>.cmd'."
 
-#: builtin/help.c:354
+#: builtin/help.c:337
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s' : visualiseur de manuel inconnu."
 
-#: builtin/help.c:371
+#: builtin/help.c:354
 msgid "no man viewer handled the request"
 msgstr "aucun visualiseur de manuel n'a pris en charge la demande"
 
-#: builtin/help.c:379
+#: builtin/help.c:362
 msgid "no info viewer handled the request"
 msgstr "aucun visualiseur de 'info' n'a pris en charge la demande"
 
-#: builtin/help.c:428
+#: builtin/help.c:411
 msgid "Defining attributes per path"
 msgstr "Définition des attributs par chemin"
 
-#: builtin/help.c:429
+#: builtin/help.c:412
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Git de tous les jours avec à peu près 20 commandes"
 
-#: builtin/help.c:430
+#: builtin/help.c:413
 msgid "A Git glossary"
 msgstr "Un glossaire Git"
 
-#: builtin/help.c:431
+#: builtin/help.c:414
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Spécifie les fichiers non-suivis à ignorer intentionnellement"
 
-#: builtin/help.c:432
+#: builtin/help.c:415
 msgid "Defining submodule properties"
 msgstr "Définition des propriétés de sous-module"
 
-#: builtin/help.c:433
+#: builtin/help.c:416
 msgid "Specifying revisions and ranges for Git"
 msgstr "Spécification des révisions et portées pour Git"
 
-#: builtin/help.c:434
+#: builtin/help.c:417
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr ""
 "Une introduction pratique à Git (pour les versions 1.5.1 et supérieures)"
 
-#: builtin/help.c:435
+#: builtin/help.c:418
 msgid "An overview of recommended workflows with Git"
 msgstr "Un aperçu des flux de travail recommandés avec Git"
 
-#: builtin/help.c:447
+#: builtin/help.c:430
 msgid "The common Git guides are:\n"
 msgstr "Les guides Git populaires sont : \n"
 
-#: builtin/help.c:468 builtin/help.c:485
+#: builtin/help.c:451 builtin/help.c:468
 #, c-format
 msgid "usage: %s%s"
 msgstr "usage : %s%s"
 
-#: builtin/help.c:501
+#: builtin/help.c:484
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "`git %s\" est un alias de `%s'"
@@ -7021,88 +7104,63 @@
 msgid "--verify with no packfile name given"
 msgstr "--verify sans nom de fichier paquet donné"
 
-#: builtin/init-db.c:36
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr "Impossible de rendre %s inscriptible pour le groupe"
-
-#: builtin/init-db.c:63
-#, c-format
-msgid "insanely long template name %s"
-msgstr "nom de modèle démentiellement long %s"
-
-#: builtin/init-db.c:68
+#: builtin/init-db.c:55
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "impossible de faire un stat de '%s'"
 
-#: builtin/init-db.c:74
+#: builtin/init-db.c:61
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "impossible de faire un stat du modèle '%s'"
 
-#: builtin/init-db.c:81
+#: builtin/init-db.c:66
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "impossible d'ouvrir (opendir) '%s'"
 
-#: builtin/init-db.c:98
+#: builtin/init-db.c:77
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "impossible de readlink '%s'"
 
-#: builtin/init-db.c:100
-#, c-format
-msgid "insanely long symlink %s"
-msgstr "lien symbolique démentiellement long %s"
-
-#: builtin/init-db.c:103
+#: builtin/init-db.c:79
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "impossible de créer un lien symbolique de '%s' '%s'"
 
-#: builtin/init-db.c:107
+#: builtin/init-db.c:85
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "impossible de copier '%s' vers '%s'"
 
-#: builtin/init-db.c:111
+#: builtin/init-db.c:89
 #, c-format
 msgid "ignoring template %s"
 msgstr "modèle %s ignoré"
 
-#: builtin/init-db.c:137
-#, c-format
-msgid "insanely long template path %s"
-msgstr "chemin de modèle %s démentiellement long"
-
-#: builtin/init-db.c:145
+#: builtin/init-db.c:118
 #, c-format
 msgid "templates not found %s"
 msgstr "modèles non trouvés %s"
 
-#: builtin/init-db.c:158
+#: builtin/init-db.c:131
 #, c-format
 msgid "not copying templates of a wrong format version %d from '%s'"
 msgstr ""
 "pas de copie des modèles étant dans une mauvaise version du format %d de '%s'"
 
-#: builtin/init-db.c:212
-#, c-format
-msgid "insane git directory %s"
-msgstr "répertoire git démentiel %s"
-
-#: builtin/init-db.c:344 builtin/init-db.c:347
+#: builtin/init-db.c:309 builtin/init-db.c:312
 #, c-format
 msgid "%s already exists"
 msgstr "%s existe déjà"
 
-#: builtin/init-db.c:375
+#: builtin/init-db.c:340
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "impossible de traiter le fichier de type %d"
 
-#: builtin/init-db.c:378
+#: builtin/init-db.c:343
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "impossible de déplacer %s vers %s"
@@ -7110,24 +7168,24 @@
 #. TRANSLATORS: The first '%s' is either "Reinitialized
 #. existing" or "Initialized empty", the second " shared" or
 #. "", and the last '%s%s' is the verbatim directory name.
-#: builtin/init-db.c:434
+#: builtin/init-db.c:399
 #, c-format
 msgid "%s%s Git repository in %s%s\n"
 msgstr "Dépôt Git%2$s %1$s dans %3$s%4$s\n"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Reinitialized existing"
 msgstr "existant réinitialisé"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Initialized empty"
 msgstr "vide initialisé"
 
-#: builtin/init-db.c:436
+#: builtin/init-db.c:401
 msgid " shared"
 msgstr " partagé"
 
-#: builtin/init-db.c:483
+#: builtin/init-db.c:448
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7135,25 +7193,25 @@
 "git init [-q | --quiet] [--bare] [--template=<répertoire-modèle>] [--"
 "shared[=<permissions>]] [<répertoire>]"
 
-#: builtin/init-db.c:506
+#: builtin/init-db.c:471
 msgid "permissions"
 msgstr "permissions"
 
-#: builtin/init-db.c:507
+#: builtin/init-db.c:472
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "spécifier que le dépôt git sera partagé entre plusieurs utilisateurs"
 
-#: builtin/init-db.c:541 builtin/init-db.c:546
+#: builtin/init-db.c:506 builtin/init-db.c:511
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "impossible de créer le répertoire (mkdir) %s"
 
-#: builtin/init-db.c:550
+#: builtin/init-db.c:515
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "impossible de se déplacer vers le répertoire (chdir) %s"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:536
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7162,7 +7220,7 @@
 "%s (ou --work-tree=<répertoire>) n'est pas autorisé sans spécifier %s (ou --"
 "git-dir=<répertoire>)"
 
-#: builtin/init-db.c:599
+#: builtin/init-db.c:564
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Impossible d'accéder à l'arbre de travail '%s'"
@@ -7250,33 +7308,33 @@
 msgid "name of output directory is too long"
 msgstr "le nom du répertoire de sortie est trop long"
 
-#: builtin/log.c:814
+#: builtin/log.c:813
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Impossible d'ouvrir le fichier correctif %s"
 
-#: builtin/log.c:828
+#: builtin/log.c:827
 msgid "Need exactly one range."
 msgstr "Exactement une plage nécessaire."
 
-#: builtin/log.c:838
+#: builtin/log.c:837
 msgid "Not a range."
 msgstr "Ceci n'est pas une plage."
 
-#: builtin/log.c:944
+#: builtin/log.c:943
 msgid "Cover letter needs email format"
 msgstr "La lettre de motivation doit être au format e-mail"
 
-#: builtin/log.c:1023
+#: builtin/log.c:1022
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to aberrant : %s"
 
-#: builtin/log.c:1051
+#: builtin/log.c:1050
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<options>] [<depuis> | <plage de révisions>]"
 
-#: builtin/log.c:1096
+#: builtin/log.c:1095
 msgid "Two output directories?"
 msgstr "Deux répertoires de sortie ?"
 
@@ -7334,130 +7392,134 @@
 msgstr "ne pas imprimer les diffs binaires"
 
 #: builtin/log.c:1241
+msgid "output all-zero hash in From header"
+msgstr "écrire une empreinte à zéro dans l'entête From"
+
+#: builtin/log.c:1243
 msgid "don't include a patch matching a commit upstream"
 msgstr "ne pas inclure un patch correspondant à un commit amont"
 
-#: builtin/log.c:1243
+#: builtin/log.c:1245
 msgid "show patch format instead of default (patch + stat)"
 msgstr "afficher le format du patch au lieu du défaut (patch + stat)"
 
-#: builtin/log.c:1245
+#: builtin/log.c:1247
 msgid "Messaging"
 msgstr "Communication"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1248
 msgid "header"
 msgstr "en-tête"
 
-#: builtin/log.c:1247
+#: builtin/log.c:1249
 msgid "add email header"
 msgstr "ajouter l'en-tête d'e-mail"
 
-#: builtin/log.c:1248 builtin/log.c:1250
+#: builtin/log.c:1250 builtin/log.c:1252
 msgid "email"
 msgstr "e-mail"
 
-#: builtin/log.c:1248
+#: builtin/log.c:1250
 msgid "add To: header"
 msgstr "ajouter l'en-tête \"To:\""
 
-#: builtin/log.c:1250
+#: builtin/log.c:1252
 msgid "add Cc: header"
 msgstr "ajouter l'en-tête \"Cc:\""
 
-#: builtin/log.c:1252
+#: builtin/log.c:1254
 msgid "ident"
 msgstr "ident"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1255
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "renseigner l'adresse From à <ident> (ou à l'ident du validateur si absent)"
 
-#: builtin/log.c:1255
+#: builtin/log.c:1257
 msgid "message-id"
 msgstr "id-message"
 
-#: builtin/log.c:1256
+#: builtin/log.c:1258
 msgid "make first mail a reply to <message-id>"
 msgstr "répondre dans le premier message à <id-message>"
 
-#: builtin/log.c:1257 builtin/log.c:1260
+#: builtin/log.c:1259 builtin/log.c:1262
 msgid "boundary"
 msgstr "limite"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1260
 msgid "attach the patch"
 msgstr "attacher le patch"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1263
 msgid "inline the patch"
 msgstr "patch à l'intérieur"
 
-#: builtin/log.c:1265
+#: builtin/log.c:1267
 msgid "enable message threading, styles: shallow, deep"
 msgstr ""
 "activer l'enfilage de message, styles : shallow (superficiel), deep (profond)"
 
-#: builtin/log.c:1267
+#: builtin/log.c:1269
 msgid "signature"
 msgstr "signature"
 
-#: builtin/log.c:1268
+#: builtin/log.c:1270
 msgid "add a signature"
 msgstr "ajouter une signature"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1272
 msgid "add a signature from a file"
 msgstr "ajouter une signature depuis un fichier"
 
-#: builtin/log.c:1271
+#: builtin/log.c:1273
 msgid "don't print the patch filenames"
 msgstr "ne pas afficher les noms de fichiers des patchs"
 
-#: builtin/log.c:1360
+#: builtin/log.c:1362
 msgid "-n and -k are mutually exclusive."
 msgstr "-n et -k sont mutuellement exclusifs."
 
-#: builtin/log.c:1362
+#: builtin/log.c:1364
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix et -k sont mutuellement exclusifs."
 
-#: builtin/log.c:1370
+#: builtin/log.c:1372
 msgid "--name-only does not make sense"
 msgstr "--name-only n'a pas de sens"
 
-#: builtin/log.c:1372
+#: builtin/log.c:1374
 msgid "--name-status does not make sense"
 msgstr "--name-status n'a pas de sens"
 
-#: builtin/log.c:1374
+#: builtin/log.c:1376
 msgid "--check does not make sense"
 msgstr "--check n'a pas de sens"
 
-#: builtin/log.c:1397
+#: builtin/log.c:1401
 msgid "standard output, or directory, which one?"
 msgstr "sortie standard, ou répertoire, lequel ?"
 
-#: builtin/log.c:1399
+#: builtin/log.c:1403
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Impossible de créer le répertoire '%s'"
 
-#: builtin/log.c:1496
+#: builtin/log.c:1500
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "lecture du fichier de signature '%s' impossible"
 
-#: builtin/log.c:1559
+#: builtin/log.c:1563
 msgid "Failed to create output files"
 msgstr "Échec de création des fichiers en sortie"
 
-#: builtin/log.c:1607
+#: builtin/log.c:1611
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<branche_amont> [<head> [<limite>]]]"
 
-#: builtin/log.c:1661
+#: builtin/log.c:1665
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -7465,7 +7527,7 @@
 "Impossible de trouver une branche distante suivie, merci de spécifier "
 "<branche_amont> manuellement.\n"
 
-#: builtin/log.c:1672 builtin/log.c:1674 builtin/log.c:1686
+#: builtin/log.c:1676 builtin/log.c:1678 builtin/log.c:1690
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Commit inconnu %s"
@@ -7569,35 +7631,35 @@
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<options>] <arbre ou apparenté> [<chemin>...]"
 
-#: builtin/ls-tree.c:127
+#: builtin/ls-tree.c:128
 msgid "only show trees"
 msgstr "afficher seulement les arbres"
 
-#: builtin/ls-tree.c:129
+#: builtin/ls-tree.c:130
 msgid "recurse into subtrees"
 msgstr "parcourir les sous-arbres"
 
-#: builtin/ls-tree.c:131
+#: builtin/ls-tree.c:132
 msgid "show trees when recursing"
 msgstr "afficher les arbres en les parcourant"
 
-#: builtin/ls-tree.c:134
+#: builtin/ls-tree.c:135
 msgid "terminate entries with NUL byte"
 msgstr "terminer les éléments avec un octet NUL"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:136
 msgid "include object size"
 msgstr "inclure la taille d'objet"
 
-#: builtin/ls-tree.c:137 builtin/ls-tree.c:139
+#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
 msgid "list only filenames"
 msgstr "afficher seulement les noms de fichiers"
 
-#: builtin/ls-tree.c:142
+#: builtin/ls-tree.c:143
 msgid "use full path names"
 msgstr "utiliser les noms de chemins complets"
 
-#: builtin/ls-tree.c:144
+#: builtin/ls-tree.c:145
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr ""
 "afficher l'arbre entier ; pas seulement le répertoire courant (implique --"
@@ -7838,16 +7900,16 @@
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Pas de branche de suivi pour %s depuis %s"
 
-#: builtin/merge.c:1081
+#: builtin/merge.c:1079
 #, c-format
 msgid "could not close '%s'"
 msgstr "impossible de fermer '%s'"
 
-#: builtin/merge.c:1208
+#: builtin/merge.c:1206
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Il n'y a pas de fusion à abandonner (MERGE_HEAD manquant)."
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1222
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7855,7 +7917,7 @@
 "Vous n'avez pas terminé votre fusion (MERGE_HEAD existe).\n"
 "Veuillez valider vos modifications avant de pouvoir fusionner."
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1229
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7863,53 +7925,53 @@
 "Vous n'avez pas terminé votre picorage (CHERRY_PICK_HEAD existe).\n"
 "Veuillez valider vos modifications avant de pouvoir fusionner."
 
-#: builtin/merge.c:1234
+#: builtin/merge.c:1232
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "Vous n'avez pas terminé votre picorage (CHERRY_PICK_HEAD existe)."
 
-#: builtin/merge.c:1243
+#: builtin/merge.c:1241
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Vous ne pouvez pas combiner --squash avec --no-ff."
 
-#: builtin/merge.c:1251
+#: builtin/merge.c:1249
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 "Pas de validation spécifiée et merge.defaultToUpstream n'est pas défini."
 
-#: builtin/merge.c:1268
+#: builtin/merge.c:1266
 msgid "Squash commit into empty head not supported yet"
 msgstr "La validation compressée vers une tête vide n'est pas encore supportée"
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1268
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "Une validation sans avance rapide n'a pas de sens dans une tête vide"
 
-#: builtin/merge.c:1276
+#: builtin/merge.c:1274
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - pas possible de fusionner ceci"
 
-#: builtin/merge.c:1278
+#: builtin/merge.c:1276
 msgid "Can merge only exactly one commit into empty head"
 msgstr ""
 "Possible de fusionner exactement une seule validation dans une tête vide"
 
-#: builtin/merge.c:1333
+#: builtin/merge.c:1331
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "La validation %s a une signature GPG non fiable, prétendument par %s."
 
-#: builtin/merge.c:1336
+#: builtin/merge.c:1334
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "La validation %s a une mauvaise signature GPG prétendument par %s."
 
-#: builtin/merge.c:1339
+#: builtin/merge.c:1337
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "La validation %s n'a pas de signature GPG."
 
-#: builtin/merge.c:1342
+#: builtin/merge.c:1340
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "La validation %s a une signature GPG correcte par %s\n"
@@ -7919,46 +7981,46 @@
 msgid "Updating %s..%s\n"
 msgstr "Mise à jour %s..%s\n"
 
-#: builtin/merge.c:1462
+#: builtin/merge.c:1460
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Essai de fusion vraiment triviale dans l'index...\n"
 
-#: builtin/merge.c:1469
+#: builtin/merge.c:1467
 #, c-format
 msgid "Nope.\n"
 msgstr "Non.\n"
 
-#: builtin/merge.c:1501
+#: builtin/merge.c:1499
 msgid "Not possible to fast-forward, aborting."
 msgstr "Pas possible d'avancer rapidement, abandon."
 
-#: builtin/merge.c:1524 builtin/merge.c:1603
+#: builtin/merge.c:1522 builtin/merge.c:1601
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Retour de l'arbre à l'original...\n"
 
-#: builtin/merge.c:1528
+#: builtin/merge.c:1526
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Essai de la stratégie de fusion %s...\n"
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1592
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Aucune stratégie de fusion n'a pris en charge la fusion.\n"
 
-#: builtin/merge.c:1596
+#: builtin/merge.c:1594
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "La fusion avec la stratégie %s a échoué.\n"
 
-#: builtin/merge.c:1605
+#: builtin/merge.c:1603
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Utilisation de %s pour préparer la résolution à la main.\n"
 
-#: builtin/merge.c:1617
+#: builtin/merge.c:1615
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -8149,49 +8211,49 @@
 msgid "Renaming %s to %s\n"
 msgstr "Renommage de %s en %s\n"
 
-#: builtin/mv.c:256 builtin/remote.c:722 builtin/repack.c:362
+#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "le renommage de '%s' a échoué"
 
-#: builtin/name-rev.c:255
+#: builtin/name-rev.c:251
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<options>] <validation>..."
 
-#: builtin/name-rev.c:256
+#: builtin/name-rev.c:252
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<options>] --all"
 
-#: builtin/name-rev.c:257
+#: builtin/name-rev.c:253
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<options>] --stdin"
 
-#: builtin/name-rev.c:309
+#: builtin/name-rev.c:305
 msgid "print only names (no SHA-1)"
 msgstr "afficher seulement les noms (pas de SHA-1)"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:306
 msgid "only use tags to name the commits"
 msgstr "utiliser seulement les étiquettes pour nommer les validations"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:308
 msgid "only use refs matching <pattern>"
 msgstr "utiliser seulement les références correspondant à <motif>"
 
-#: builtin/name-rev.c:314
+#: builtin/name-rev.c:310
 msgid "list all commits reachable from all refs"
 msgstr ""
 "afficher toutes les validations accessibles depuis toutes les références"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:311
 msgid "read from stdin"
 msgstr "lire depuis l'entrée standard"
 
-#: builtin/name-rev.c:316
+#: builtin/name-rev.c:312
 msgid "allow to print `undefined` names (default)"
 msgstr "autoriser l'affichage des noms `non définis` (par défaut)"
 
-#: builtin/name-rev.c:322
+#: builtin/name-rev.c:318
 msgid "dereference tags in the input (internal use)"
 msgstr "déréférencer les étiquettes en entrée (usage interne)"
 
@@ -8321,7 +8383,7 @@
 msgid "failed to finish 'show' for object '%s'"
 msgstr "impossible de finir 'show' pour l'objet '%s'"
 
-#: builtin/notes.c:174 builtin/tag.c:477
+#: builtin/notes.c:174 builtin/tag.c:248
 #, c-format
 msgid "could not create file '%s'"
 msgstr "impossible de créer le fichier '%s'"
@@ -8339,12 +8401,12 @@
 msgid "The note contents have been left in %s"
 msgstr "Le contenu de la note a été laissé dans %s"
 
-#: builtin/notes.c:232 builtin/tag.c:695
+#: builtin/notes.c:232 builtin/tag.c:440
 #, c-format
 msgid "cannot read '%s'"
 msgstr "impossible de lire '%s'"
 
-#: builtin/notes.c:234 builtin/tag.c:698
+#: builtin/notes.c:234 builtin/tag.c:443
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "impossible d'ouvrir ou lire '%s'"
@@ -8352,7 +8414,7 @@
 #: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306
 #: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507
 #: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653
-#: builtin/notes.c:877 builtin/tag.c:711
+#: builtin/notes.c:877 builtin/tag.c:456
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Impossible de résoudre '%s' comme une référence valide."
@@ -8386,11 +8448,6 @@
 msgid "note contents in a file"
 msgstr "contenu de la note dans un fichier"
 
-#: builtin/notes.c:398 builtin/notes.c:401 builtin/notes.c:561
-#: builtin/notes.c:564 builtin/tag.c:630
-msgid "object"
-msgstr "objet"
-
 #: builtin/notes.c:399 builtin/notes.c:562
 msgid "reuse and edit specified note object"
 msgstr "réutiliser et éditer l'objet de note spécifié"
@@ -8521,7 +8578,7 @@
 msgid "use notes from <notes-ref>"
 msgstr "utiliser les notes depuis <références-notes>"
 
-#: builtin/notes.c:1012 builtin/remote.c:1588
+#: builtin/notes.c:1012 builtin/remote.c:1647
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Sous-commande inconnue : %s"
@@ -8741,20 +8798,24 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <heure>] [--] [<head>...]"
 
-#: builtin/prune.c:105 builtin/worktree.c:121
+#: builtin/prune.c:105 builtin/worktree.c:124
 msgid "do not remove, show only"
 msgstr "ne pas supprimer, afficher seulement"
 
-#: builtin/prune.c:106 builtin/worktree.c:122
+#: builtin/prune.c:106 builtin/worktree.c:125
 msgid "report pruned objects"
 msgstr "afficher les objets éliminés"
 
-#: builtin/prune.c:109 builtin/worktree.c:124
+#: builtin/prune.c:109 builtin/worktree.c:127
 msgid "expire objects older than <time>"
 msgstr "faire expirer les objets plus vieux que <heure>"
 
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
+msgstr "impossible de nettoyer dans un dépôt d'objets précieux"
+
 #: builtin/pull.c:69
-msgid "git pull [options] [<repository> [<refspec>...]]"
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [<options>] [<dépôt> [<spécification-de-référence>...]]"
 
 #: builtin/pull.c:113
@@ -8862,7 +8923,7 @@
 "Si vous souhaitez indiquer l'information de suivi distant pour cette "
 "branche, vous pouvez le faire avec :\n"
 "\n"
-"git branch --set-uptream-to=%s/<branche> %s\n"
+"    git branch --set-upstream-to=%s/<branche> %s\n"
 
 #: builtin/pull.c:476
 #, c-format
@@ -8917,19 +8978,19 @@
 msgid "Cannot rebase onto multiple branches."
 msgstr "Impossible de rebaser sur de multiples branches."
 
-#: builtin/push.c:15
+#: builtin/push.c:16
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [<options>] [<dépôt> [<spécification-de-référence>...]]"
 
-#: builtin/push.c:86
+#: builtin/push.c:88
 msgid "tag shorthand without <tag>"
 msgstr "raccourci d'étiquette sans <étiquette>"
 
-#: builtin/push.c:96
+#: builtin/push.c:98
 msgid "--delete only accepts plain target ref names"
 msgstr "--delete accepte seulement des noms entiers de références cibles"
 
-#: builtin/push.c:140
+#: builtin/push.c:142
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -8938,7 +8999,7 @@
 "Pour choisir l'option de manière permanente, voir push.default dans 'git "
 "help config'."
 
-#: builtin/push.c:143
+#: builtin/push.c:145
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -8963,7 +9024,7 @@
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:158
+#: builtin/push.c:160
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -8978,7 +9039,7 @@
 "\n"
 "    git push %s HEAD:<nom-de-la-branche-amont>\n"
 
-#: builtin/push.c:172
+#: builtin/push.c:174
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -8992,13 +9053,13 @@
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:180
+#: builtin/push.c:182
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr ""
 "La branche courante %s a de multiples branches amont, impossible de pousser."
 
-#: builtin/push.c:183
+#: builtin/push.c:185
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -9009,7 +9070,7 @@
 "pas une branche amont de votre branche courante '%s', sans me dire\n"
 "quoi pousser pour mettre à jour quelle branche amont."
 
-#: builtin/push.c:206
+#: builtin/push.c:208
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -9060,14 +9121,14 @@
 "'current' au lieu de 'simple' si vous utilisez de temps en temps d'anciennes "
 "versions de Git)"
 
-#: builtin/push.c:273
+#: builtin/push.c:275
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "Vous n'avez pas spécifié de spécifications de référence à pousser, et push."
 "default est \"nothing\"."
 
-#: builtin/push.c:280
+#: builtin/push.c:282
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -9082,7 +9143,7 @@
 "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
 "d'information."
 
-#: builtin/push.c:286
+#: builtin/push.c:288
 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"
@@ -9097,7 +9158,7 @@
 "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
 "d'information."
 
-#: builtin/push.c:292
+#: builtin/push.c:294
 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"
@@ -9115,13 +9176,13 @@
 "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
 "d'information."
 
-#: builtin/push.c:299
+#: builtin/push.c:301
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 "Les mises à jour ont été rejetées car l'étiquette existe déjà dans la "
 "branche distante."
 
-#: builtin/push.c:302
+#: builtin/push.c:304
 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"
@@ -9133,22 +9194,22 @@
 "pointer\n"
 "vers un objet qui n'est pas un commit, sans utiliser l'option '--force'.\n"
 
-#: builtin/push.c:361
+#: builtin/push.c:363
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Poussée vers %s\n"
 
-#: builtin/push.c:365
+#: builtin/push.c:367
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "impossible de pousser des références vers '%s'"
 
-#: builtin/push.c:395
+#: builtin/push.c:397
 #, c-format
 msgid "bad repository '%s'"
 msgstr "mauvais dépôt '%s'"
 
-#: builtin/push.c:396
+#: builtin/push.c:398
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -9170,101 +9231,105 @@
 "\n"
 "    git push <nom>\n"
 
-#: builtin/push.c:411
+#: builtin/push.c:413
 msgid "--all and --tags are incompatible"
 msgstr "--all et --tags sont incompatibles"
 
-#: builtin/push.c:412
+#: builtin/push.c:414
 msgid "--all can't be combined with refspecs"
 msgstr "--all ne peut pas être combiné avec des spécifications de référence"
 
-#: builtin/push.c:417
+#: builtin/push.c:419
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror et --tags sont incompatibles"
 
-#: builtin/push.c:418
+#: builtin/push.c:420
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror ne peut pas être combiné avec des spécifications de référence"
 
-#: builtin/push.c:423
+#: builtin/push.c:425
 msgid "--all and --mirror are incompatible"
 msgstr "--all et --mirror sont incompatibles"
 
-#: builtin/push.c:539
+#: builtin/push.c:537
 msgid "repository"
 msgstr "dépôt"
 
-#: builtin/push.c:540 builtin/send-pack.c:161
+#: builtin/push.c:538 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "pousser toutes les références"
 
-#: builtin/push.c:541 builtin/send-pack.c:163
+#: builtin/push.c:539 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "refléter toutes les références"
 
-#: builtin/push.c:543
+#: builtin/push.c:541
 msgid "delete refs"
 msgstr "supprimer les références"
 
-#: builtin/push.c:544
+#: builtin/push.c:542
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr ""
 "pousser les étiquettes (ne peut pas être utilisé avec --all ou --mirror)"
 
-#: builtin/push.c:547 builtin/send-pack.c:164
+#: builtin/push.c:545 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "forcer les mises à jour"
 
-#: builtin/push.c:549 builtin/send-pack.c:175
+#: builtin/push.c:547 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "nom de référence>:<attendu"
 
-#: builtin/push.c:550 builtin/send-pack.c:176
+#: builtin/push.c:548 builtin/send-pack.c:176
 msgid "require old value of ref to be at this value"
 msgstr "exiger que l'ancienne valeur de la référence soit à cette valeur"
 
-#: builtin/push.c:553
+#: builtin/push.c:550
+msgid "check|on-demand|no"
+msgstr "check|on-demand|no"
+
+#: builtin/push.c:551
 msgid "control recursive pushing of submodules"
 msgstr "contrôler la poussée récursive des sous-modules"
 
-#: builtin/push.c:555 builtin/send-pack.c:169
+#: builtin/push.c:553 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "utiliser un empaquetage léger"
 
-#: builtin/push.c:556 builtin/push.c:557 builtin/send-pack.c:158
+#: builtin/push.c:554 builtin/push.c:555 builtin/send-pack.c:158
 #: builtin/send-pack.c:159
 msgid "receive pack program"
 msgstr "recevoir le programme d'empaquetage"
 
-#: builtin/push.c:558
+#: builtin/push.c:556
 msgid "set upstream for git pull/status"
 msgstr "définir la branche amont pour git pull/status"
 
-#: builtin/push.c:561
+#: builtin/push.c:559
 msgid "prune locally removed refs"
 msgstr "éliminer les références locales supprimées"
 
-#: builtin/push.c:563
+#: builtin/push.c:561
 msgid "bypass pre-push hook"
 msgstr "éviter d'utiliser le crochet pre-push"
 
-#: builtin/push.c:564
+#: builtin/push.c:562
 msgid "push missing but relevant tags"
 msgstr "pousser les étiquettes manquantes mais pertinentes"
 
-#: builtin/push.c:567 builtin/send-pack.c:166
+#: builtin/push.c:565 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "signer la poussée avec GPG"
 
-#: builtin/push.c:569 builtin/send-pack.c:170
+#: builtin/push.c:567 builtin/send-pack.c:170
 msgid "request atomic transaction on remote side"
 msgstr "demande une transaction atomique sur le serveur distant"
 
-#: builtin/push.c:579
+#: builtin/push.c:577
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete est incompatible avec --all, --mirror et --tags"
 
-#: builtin/push.c:581
+#: builtin/push.c:579
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete n'a pas de sens sans aucune référence"
 
@@ -9343,12 +9408,12 @@
 msgid "debug unpack-trees"
 msgstr "déboguer unpack-trees"
 
-#: builtin/reflog.c:432
+#: builtin/reflog.c:428
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
 msgstr "'%s' pour '%s' n'est pas un horodatage valide"
 
-#: builtin/reflog.c:549 builtin/reflog.c:554
+#: builtin/reflog.c:545 builtin/reflog.c:550
 #, c-format
 msgid "'%s' is not a valid timestamp"
 msgstr "'%s' n'est pas un horodatage valide"
@@ -9365,15 +9430,15 @@
 "git remote add [-t <branche>] [-m <master>] [-f] [--tags | --no-tags] [--"
 "mirror=<fetch|push>] <nom> <url>"
 
-#: builtin/remote.c:14 builtin/remote.c:33
+#: builtin/remote.c:14 builtin/remote.c:34
 msgid "git remote rename <old> <new>"
 msgstr "git remote rename <ancienne> <nouvelle>"
 
-#: builtin/remote.c:15 builtin/remote.c:38
+#: builtin/remote.c:15 builtin/remote.c:39
 msgid "git remote remove <name>"
 msgstr "git remote remove <nom>"
 
-#: builtin/remote.c:16 builtin/remote.c:43
+#: builtin/remote.c:16 builtin/remote.c:44
 msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
 msgstr "git remote set-head <nom> (-a | --auto | -d | --delete | <branche>)"
 
@@ -9396,48 +9461,52 @@
 msgid "git remote set-branches [--add] <name> <branch>..."
 msgstr "git remote set-branches [--add] <nom> <branche>..."
 
-#: builtin/remote.c:21 builtin/remote.c:69
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr "git remote get-url [--push] [--all] <nom>"
+
+#: builtin/remote.c:22 builtin/remote.c:75
 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
 msgstr "git remote set-url [--push] <nom> <nouvelle-URL> [<ancienne-URL>]"
 
-#: builtin/remote.c:22 builtin/remote.c:70
+#: builtin/remote.c:23 builtin/remote.c:76
 msgid "git remote set-url --add <name> <newurl>"
 msgstr "git remote set-url --add <nom> <nouvelle-URL>"
 
-#: builtin/remote.c:23 builtin/remote.c:71
+#: builtin/remote.c:24 builtin/remote.c:77
 msgid "git remote set-url --delete <name> <url>"
 msgstr "git remote set-url --delete <nom> <URL>"
 
-#: builtin/remote.c:28
+#: builtin/remote.c:29
 msgid "git remote add [<options>] <name> <url>"
 msgstr "git remote add [<options>] <nom> <URL>"
 
-#: builtin/remote.c:48
+#: builtin/remote.c:49
 msgid "git remote set-branches <name> <branch>..."
 msgstr "git remote set-branches <nom> <branche>..."
 
-#: builtin/remote.c:49
+#: builtin/remote.c:50
 msgid "git remote set-branches --add <name> <branch>..."
 msgstr "git remote set-branches --add <nom> <branche>..."
 
-#: builtin/remote.c:54
+#: builtin/remote.c:55
 msgid "git remote show [<options>] <name>"
 msgstr "git remote show [<options>] <nom>"
 
-#: builtin/remote.c:59
+#: builtin/remote.c:60
 msgid "git remote prune [<options>] <name>"
 msgstr "git remote prune [<options>] <nom>"
 
-#: builtin/remote.c:64
+#: builtin/remote.c:65
 msgid "git remote update [<options>] [<group> | <remote>]..."
 msgstr "git remote update [<options>] [<groupe> | <distante>]..."
 
-#: builtin/remote.c:88
+#: builtin/remote.c:94
 #, c-format
 msgid "Updating %s"
 msgstr "Mise à jour de %s"
 
-#: builtin/remote.c:120
+#: builtin/remote.c:126
 msgid ""
 "--mirror is dangerous and deprecated; please\n"
 "\t use --mirror=fetch or --mirror=push instead"
@@ -9445,102 +9514,102 @@
 "--mirror est dangereux et obsolète ; merci\n"
 "\t d'utiliser --mirror=fetch ou --mirror=push à la place"
 
-#: builtin/remote.c:137
+#: builtin/remote.c:143
 #, c-format
 msgid "unknown mirror argument: %s"
 msgstr "argument miroir inconnu : %s"
 
-#: builtin/remote.c:153
+#: builtin/remote.c:159
 msgid "fetch the remote branches"
 msgstr "rapatrier les branches distantes"
 
-#: builtin/remote.c:155
+#: builtin/remote.c:161
 msgid "import all tags and associated objects when fetching"
 msgstr ""
 "importer toutes les étiquettes et les objets associés lors du rapatriement"
 
-#: builtin/remote.c:158
+#: builtin/remote.c:164
 msgid "or do not fetch any tag at all (--no-tags)"
 msgstr "ou ne rapatrier aucune étiquette (--no-tags)"
 
-#: builtin/remote.c:160
+#: builtin/remote.c:166
 msgid "branch(es) to track"
 msgstr "branche(s) à suivre"
 
-#: builtin/remote.c:161
+#: builtin/remote.c:167
 msgid "master branch"
 msgstr "branche maîtresse"
 
-#: builtin/remote.c:162
+#: builtin/remote.c:168
 msgid "push|fetch"
 msgstr "push|fetch"
 
-#: builtin/remote.c:163
+#: builtin/remote.c:169
 msgid "set up remote as a mirror to push to or fetch from"
 msgstr ""
 "paramétrer la distante comme miroir pour pousser ou pour rapatrier depuis"
 
-#: builtin/remote.c:175
+#: builtin/remote.c:181
 msgid "specifying a master branch makes no sense with --mirror"
 msgstr "spécifier une branche maîtresse n'a pas de sens avec --mirror"
 
-#: builtin/remote.c:177
+#: builtin/remote.c:183
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr ""
 "spécifier les branches à suivre n'a de sens qu'avec des miroirs de "
 "rapatriement"
 
-#: builtin/remote.c:187 builtin/remote.c:637
+#: builtin/remote.c:193 builtin/remote.c:643
 #, c-format
 msgid "remote %s already exists."
 msgstr "la distante %s existe déjà."
 
-#: builtin/remote.c:191 builtin/remote.c:641
+#: builtin/remote.c:197 builtin/remote.c:647
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "'%s' n'est pas un nom valide de distante"
 
-#: builtin/remote.c:235
+#: builtin/remote.c:241
 #, c-format
 msgid "Could not setup master '%s'"
 msgstr "Impossible de paramétrer la maîtresse '%s'"
 
-#: builtin/remote.c:335
+#: builtin/remote.c:341
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr ""
 "Impossible d'obtenir une correspondance distante pour la spécification de "
 "référence %s"
 
-#: builtin/remote.c:436 builtin/remote.c:444
+#: builtin/remote.c:442 builtin/remote.c:450
 msgid "(matching)"
 msgstr "(correspond)"
 
-#: builtin/remote.c:448
+#: builtin/remote.c:454
 msgid "(delete)"
 msgstr "(supprimer)"
 
-#: builtin/remote.c:588 builtin/remote.c:594 builtin/remote.c:600
+#: builtin/remote.c:594 builtin/remote.c:600 builtin/remote.c:606
 #, c-format
 msgid "Could not append '%s' to '%s'"
 msgstr "Impossible d'ajouter '%s' à '%s'"
 
-#: builtin/remote.c:630 builtin/remote.c:769 builtin/remote.c:869
+#: builtin/remote.c:636 builtin/remote.c:775 builtin/remote.c:875
 #, c-format
 msgid "No such remote: %s"
 msgstr "Distante inconnue : %s"
 
-#: builtin/remote.c:647
+#: builtin/remote.c:653
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Impossible de renommer la section de configuration '%s' en '%s'"
 
-#: builtin/remote.c:653 builtin/remote.c:821
+#: builtin/remote.c:659 builtin/remote.c:827
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Impossible de supprimer la section de configuration '%s'"
 
-#: builtin/remote.c:668
+#: builtin/remote.c:674
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -9551,27 +9620,27 @@
 "\t%s\n"
 "\tVeuillez mettre à jour la configuration manuellement si nécessaire."
 
-#: builtin/remote.c:674
+#: builtin/remote.c:680
 #, c-format
 msgid "Could not append '%s'"
 msgstr "Impossible d'ajouter '%s'"
 
-#: builtin/remote.c:685
+#: builtin/remote.c:691
 #, c-format
 msgid "Could not set '%s'"
 msgstr "Impossible de définir '%s'"
 
-#: builtin/remote.c:707
+#: builtin/remote.c:713
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "échec de suppression de '%s'"
 
-#: builtin/remote.c:741
+#: builtin/remote.c:747
 #, c-format
 msgid "creating '%s' failed"
 msgstr "échec de création de '%s'"
 
-#: builtin/remote.c:807
+#: builtin/remote.c:813
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -9586,120 +9655,120 @@
 "supprimées ;\n"
 "pour les supprimer, utilisez :"
 
-#: builtin/remote.c:922
+#: builtin/remote.c:928
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " nouveau (le prochain rapatriement (fetch) stockera dans remotes/%s)"
 
-#: builtin/remote.c:925
+#: builtin/remote.c:931
 msgid " tracked"
 msgstr " suivi"
 
-#: builtin/remote.c:927
+#: builtin/remote.c:933
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " dépassé (utilisez 'git remote prune' pour supprimer)"
 
-#: builtin/remote.c:929
+#: builtin/remote.c:935
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:976
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "branch.%s.merge invalide ; ne peut pas rebaser sur plus d'une branche"
 
-#: builtin/remote.c:977
+#: builtin/remote.c:983
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "rebase sur la distante %s"
 
-#: builtin/remote.c:980
+#: builtin/remote.c:986
 #, c-format
 msgid " merges with remote %s"
 msgstr " fusionne avec la distante %s"
 
-#: builtin/remote.c:981
+#: builtin/remote.c:987
 msgid "    and with remote"
 msgstr "    et avec la distante"
 
-#: builtin/remote.c:983
+#: builtin/remote.c:989
 #, c-format
 msgid "merges with remote %s"
 msgstr "fusionne avec la distante %s"
 
-#: builtin/remote.c:984
+#: builtin/remote.c:990
 msgid "   and with remote"
 msgstr "   et avec la distante"
 
-#: builtin/remote.c:1030
+#: builtin/remote.c:1036
 msgid "create"
 msgstr "créer"
 
-#: builtin/remote.c:1033
+#: builtin/remote.c:1039
 msgid "delete"
 msgstr "supprimer"
 
-#: builtin/remote.c:1037
+#: builtin/remote.c:1043
 msgid "up to date"
 msgstr "à jour"
 
-#: builtin/remote.c:1040
+#: builtin/remote.c:1046
 msgid "fast-forwardable"
 msgstr "peut être mis à jour en avance rapide"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1049
 msgid "local out of date"
 msgstr "le local n'est pas à jour"
 
-#: builtin/remote.c:1050
+#: builtin/remote.c:1056
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s force vers %-*s (%s)"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1059
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s pousse vers %-*s (%s)"
 
-#: builtin/remote.c:1057
+#: builtin/remote.c:1063
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s force vers %s"
 
-#: builtin/remote.c:1060
+#: builtin/remote.c:1066
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s pousse vers %s"
 
-#: builtin/remote.c:1128
+#: builtin/remote.c:1134
 msgid "do not query remotes"
 msgstr "ne pas interroger les distantes"
 
-#: builtin/remote.c:1155
+#: builtin/remote.c:1161
 #, c-format
 msgid "* remote %s"
 msgstr "* distante %s"
 
-#: builtin/remote.c:1156
+#: builtin/remote.c:1162
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL de rapatriement : %s"
 
-#: builtin/remote.c:1157 builtin/remote.c:1308
+#: builtin/remote.c:1163 builtin/remote.c:1314
 msgid "(no URL)"
 msgstr "(pas d'URL)"
 
-#: builtin/remote.c:1166 builtin/remote.c:1168
+#: builtin/remote.c:1172 builtin/remote.c:1174
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL push : %s"
 
-#: builtin/remote.c:1170 builtin/remote.c:1172 builtin/remote.c:1174
+#: builtin/remote.c:1176 builtin/remote.c:1178 builtin/remote.c:1180
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Branche HEAD : %s"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1182
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
@@ -9707,145 +9776,158 @@
 "  Branche HEAD (la HEAD distante est ambiguë, peut être l'une des "
 "suivantes) :\n"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1194
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Branche distante :%s"
 msgstr[1] "  Branches distantes :%s"
 
-#: builtin/remote.c:1191 builtin/remote.c:1218
+#: builtin/remote.c:1197 builtin/remote.c:1224
 msgid " (status not queried)"
 msgstr " (statut non demandé)"
 
-#: builtin/remote.c:1200
+#: builtin/remote.c:1206
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Branche locale configurée pour 'git pull' :"
 msgstr[1] "  Branches locales configurées pour 'git pull' :"
 
-#: builtin/remote.c:1208
+#: builtin/remote.c:1214
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Les références locales seront reflétées par 'git push'"
 
-#: builtin/remote.c:1215
+#: builtin/remote.c:1221
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Référence locale configurée pour 'git push'%s :"
 msgstr[1] "  Références locales configurées pour 'git push'%s :"
 
-#: builtin/remote.c:1236
+#: builtin/remote.c:1242
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "définir refs/remotes/<nom>/HEAD selon la distante"
 
-#: builtin/remote.c:1238
+#: builtin/remote.c:1244
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "supprimer refs/remotes/<nom>/HEAD"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1259
 msgid "Cannot determine remote HEAD"
 msgstr "Impossible de déterminer la HEAD distante"
 
-#: builtin/remote.c:1255
+#: builtin/remote.c:1261
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 "Il y a de multiples branches HEAD distantes. Veuillez en choisir une "
 "explicitement avec :"
 
-#: builtin/remote.c:1265
+#: builtin/remote.c:1271
 #, c-format
 msgid "Could not delete %s"
 msgstr "Impossible de supprimer %s"
 
-#: builtin/remote.c:1273
+#: builtin/remote.c:1279
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Référence non valide : %s"
 
-#: builtin/remote.c:1275
+#: builtin/remote.c:1281
 #, c-format
 msgid "Could not setup %s"
 msgstr "Impossible de paramétrer %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1299
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s se retrouvera en suspens !"
 
-#: builtin/remote.c:1294
+#: builtin/remote.c:1300
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s se retrouve en suspens !"
 
-#: builtin/remote.c:1304
+#: builtin/remote.c:1310
 #, c-format
 msgid "Pruning %s"
 msgstr "Élimination de %s"
 
-#: builtin/remote.c:1305
+#: builtin/remote.c:1311
 #, c-format
 msgid "URL: %s"
 msgstr "URL : %s"
 
-#: builtin/remote.c:1321
+#: builtin/remote.c:1327
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [serait éliminé] %s"
 
-#: builtin/remote.c:1324
+#: builtin/remote.c:1330
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [éliminé] %s"
 
-#: builtin/remote.c:1369
+#: builtin/remote.c:1375
 msgid "prune remotes after fetching"
 msgstr "éliminer les distants après le rapatriement"
 
-#: builtin/remote.c:1435 builtin/remote.c:1509
+#: builtin/remote.c:1441 builtin/remote.c:1498 builtin/remote.c:1566
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Pas de serveur remote '%s'"
 
-#: builtin/remote.c:1455
+#: builtin/remote.c:1461
 msgid "add branch"
 msgstr "ajouter une branche"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1468
 msgid "no remote specified"
 msgstr "pas de serveur distant spécifié"
 
-#: builtin/remote.c:1484
+#: builtin/remote.c:1485
+msgid "query push URLs rather than fetch URLs"
+msgstr "interroger les URLs de poussée plutôt que les URLs de récupération"
+
+#: builtin/remote.c:1487
+msgid "return all URLs"
+msgstr "retourner toutes les URLs"
+
+#: builtin/remote.c:1515
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr "aucune URL configurée pour le dépôt distant '%s'"
+
+#: builtin/remote.c:1541
 msgid "manipulate push URLs"
 msgstr "manipuler les URLs push"
 
-#: builtin/remote.c:1486
+#: builtin/remote.c:1543
 msgid "add URL"
 msgstr "ajouter une URL"
 
-#: builtin/remote.c:1488
+#: builtin/remote.c:1545
 msgid "delete URLs"
 msgstr "supprimer des URLs"
 
-#: builtin/remote.c:1495
+#: builtin/remote.c:1552
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete n'a aucun sens"
 
-#: builtin/remote.c:1535
+#: builtin/remote.c:1592
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Motif d'URL ancien invalide : %s"
 
-#: builtin/remote.c:1543
+#: builtin/remote.c:1600
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Pas d'URL trouvée : %s"
 
-#: builtin/remote.c:1545
+#: builtin/remote.c:1602
 msgid "Will not delete all non-push URLs"
 msgstr "Pas de suppression de toutes les URLs non-push"
 
-#: builtin/remote.c:1559
+#: builtin/remote.c:1616
 msgid "be verbose; must be placed before a subcommand"
 msgstr "être verbeux : doit être placé avant une sous-commande"
 
@@ -9918,7 +10000,11 @@
 msgid "repack objects in packs marked with .keep"
 msgstr "réempaqueter les objets dans des paquets marqués avec .keep"
 
-#: builtin/repack.c:378
+#: builtin/repack.c:197
+msgid "cannot delete packs in a precious-objects repo"
+msgstr "impossible de supprimer les paquets dans un dépôt d'objets précieux"
+
+#: builtin/repack.c:381
 #, c-format
 msgid "removing '%s' failed"
 msgstr "la suppression de '%s' a échoué"
@@ -10014,7 +10100,7 @@
 msgstr ""
 "git rerere [clear | forget <chemin>... | status | remaining | diff | gc]"
 
-#: builtin/rerere.c:57
+#: builtin/rerere.c:58
 msgid "register clean resolutions in index"
 msgstr "enregistrer des résolutions propres dans l'index"
 
@@ -10152,23 +10238,23 @@
 msgid "rev-list does not support display of notes"
 msgstr "rev-list ne supporte l'affichage des notes"
 
-#: builtin/rev-parse.c:361
+#: builtin/rev-parse.c:358
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<options>] -- [<arguments>...]"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:363
 msgid "keep the `--` passed as an arg"
 msgstr "garder le `--` passé en argument"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:365
 msgid "stop parsing after the first non-option argument"
 msgstr "arrêt de l'analyse après le premier argument qui n'est pas une option"
 
-#: builtin/rev-parse.c:371
+#: builtin/rev-parse.c:368
 msgid "output in stuck long form"
 msgstr "sortie en forme longue fixée"
 
-#: builtin/rev-parse.c:502
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -10433,7 +10519,7 @@
 msgid "Linewrap output"
 msgstr "Couper les lignes"
 
-#: builtin/show-branch.c:9
+#: builtin/show-branch.c:10
 msgid ""
 "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
 "\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
@@ -10445,72 +10531,72 @@
 "\t\t[--more=<n> | --list | --independent | --merge-base]\n"
 "\t\t[--no-name | --sha1-name] [--topics] [(<rév> | <glob>)...]"
 
-#: builtin/show-branch.c:13
+#: builtin/show-branch.c:14
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<référence>]"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:640
 msgid "show remote-tracking and local branches"
 msgstr "afficher les branches de suivi distantes et les branches locales"
 
-#: builtin/show-branch.c:661
+#: builtin/show-branch.c:642
 msgid "show remote-tracking branches"
 msgstr "afficher les branches de suivi distantes"
 
-#: builtin/show-branch.c:663
+#: builtin/show-branch.c:644
 msgid "color '*!+-' corresponding to the branch"
 msgstr "couleur '*!+-' correspondant à la branche"
 
-#: builtin/show-branch.c:665
+#: builtin/show-branch.c:646
 msgid "show <n> more commits after the common ancestor"
 msgstr "afficher <n> validations de plus après l'ancêtre commun"
 
-#: builtin/show-branch.c:667
+#: builtin/show-branch.c:648
 msgid "synonym to more=-1"
 msgstr "synonyme de more=-1"
 
-#: builtin/show-branch.c:668
+#: builtin/show-branch.c:649
 msgid "suppress naming strings"
 msgstr "supprimer les chaînes de nommage"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:651
 msgid "include the current branch"
 msgstr "inclure la branche courante"
 
-#: builtin/show-branch.c:672
+#: builtin/show-branch.c:653
 msgid "name commits with their object names"
 msgstr "nommer les validations avec leurs noms d'objet"
 
-#: builtin/show-branch.c:674
+#: builtin/show-branch.c:655
 msgid "show possible merge bases"
 msgstr "afficher les bases possibles de fusion"
 
-#: builtin/show-branch.c:676
+#: builtin/show-branch.c:657
 msgid "show refs unreachable from any other ref"
 msgstr "afficher les références inaccessibles depuis toute autre référence"
 
-#: builtin/show-branch.c:678
+#: builtin/show-branch.c:659
 msgid "show commits in topological order"
 msgstr "afficher les validations dans l'ordre topologique"
 
-#: builtin/show-branch.c:681
+#: builtin/show-branch.c:662
 msgid "show only commits not on the first branch"
 msgstr ""
 "afficher seulement les validations qui ne sont pas sur la première branche"
 
-#: builtin/show-branch.c:683
+#: builtin/show-branch.c:664
 msgid "show merges reachable from only one tip"
 msgstr "afficher les fusions accessibles depuis une seule pointe"
 
-#: builtin/show-branch.c:685
+#: builtin/show-branch.c:666
 msgid "topologically sort, maintaining date order where possible"
 msgstr "tri topologique, maintenant l'ordre par date si possible"
 
-#: builtin/show-branch.c:688
+#: builtin/show-branch.c:669
 msgid "<n>[,<base>]"
 msgstr "<n>[,<base>]"
 
-#: builtin/show-branch.c:689
+#: builtin/show-branch.c:670
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr ""
 "afficher les <n> plus récents éléments de ref-log en commençant à la base"
@@ -10524,46 +10610,145 @@
 "hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<motif>...]"
 
 #: builtin/show-ref.c:11
-msgid "git show-ref --exclude-existing[=<pattern>] < <ref-list>"
-msgstr "git show-ref --exclude-existing[=<motif>] < liste-références"
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr "git show-ref --exclude-existing[=<motif>]"
 
-#: builtin/show-ref.c:170
+#: builtin/show-ref.c:165
 msgid "only show tags (can be combined with heads)"
 msgstr "afficher seulement les étiquettes (peut être combiné avec des têtes)"
 
-#: builtin/show-ref.c:171
+#: builtin/show-ref.c:166
 msgid "only show heads (can be combined with tags)"
 msgstr "afficher seulement les têtes (peut être combiné avec des étiquettes)"
 
-#: builtin/show-ref.c:172
+#: builtin/show-ref.c:167
 msgid "stricter reference checking, requires exact ref path"
 msgstr ""
 "vérification de référence plus stricte, nécessite un chemin de référence "
 "exact"
 
-#: builtin/show-ref.c:175 builtin/show-ref.c:177
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "afficher la référence HEAD, même si elle serait filtrée"
 
-#: builtin/show-ref.c:179
+#: builtin/show-ref.c:174
 msgid "dereference tags into object IDs"
 msgstr "déréférencer les étiquettes en IDs d'objet"
 
-#: builtin/show-ref.c:181
+#: builtin/show-ref.c:176
 msgid "only show SHA1 hash using <n> digits"
 msgstr "afficher seulement le hachage SHA1 en utilisant <n> chiffres"
 
-#: builtin/show-ref.c:185
+#: builtin/show-ref.c:180
 msgid "do not print results to stdout (useful with --verify)"
 msgstr ""
 "ne pas afficher les résultats sur la sortie standard (pratique avec --verify)"
 
-#: builtin/show-ref.c:187
+#: builtin/show-ref.c:182
 msgid "show refs from stdin that aren't in local repository"
 msgstr ""
 "afficher les références de l'entrée standard qui ne sont pas dans le dépôt "
 "local"
 
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr "git stripspace [-s | --strip-comments]"
+
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr "git stripspace [-c | --comment-lines]"
+
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr ""
+"sauter et supprimer toutes les lignes commençant par le caractère de "
+"commentaire"
+
+#: builtin/stripspace.c:38
+msgid "prepend comment character and blank to each line"
+msgstr "ajouter devant chaque ligne le caractère de commentaire et un espace"
+
+#: builtin/submodule--helper.c:79 builtin/submodule--helper.c:167
+msgid "alternative anchor for relative paths"
+msgstr "ancre alternative pour les chemins relatifs"
+
+#: builtin/submodule--helper.c:84
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper list [--prefix=<chemin>] [<chemin>...]"
+
+#: builtin/submodule--helper.c:114
+msgid "git submodule--helper name <path>"
+msgstr "git submodule--helper <nom> <chemin>"
+
+#: builtin/submodule--helper.c:120
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr ""
+"Pas de mise en correspondance du sous-module trouvé dans .gitmodules pour le "
+"chemin '%s'"
+
+#: builtin/submodule--helper.c:170
+msgid "where the new submodule will be cloned to"
+msgstr "emplacement où le sous-module sera cloné"
+
+#: builtin/submodule--helper.c:173
+msgid "name of the new submodule"
+msgstr "nom du nouveau sous-module"
+
+#: builtin/submodule--helper.c:176
+msgid "url where to clone the submodule from"
+msgstr "URL depuis laquelle cloner le sous-module"
+
+#: builtin/submodule--helper.c:182
+msgid "depth for shallow clones"
+msgstr "profondeur de l'historique des clones superficiels"
+
+#: builtin/submodule--helper.c:188
+msgid ""
+"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
+"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+msgstr ""
+"git submodule--helper clone [--prefix=<chemin>] [--quiet] [--reference "
+"<dépôt>] [--name <nom>] [--url <url>][--depth <profondeur>] [--] "
+"[<chemin>...]"
+
+#: builtin/submodule--helper.c:202 builtin/submodule--helper.c:208
+#: builtin/submodule--helper.c:216
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "impossible de créer le répertoire '%s'"
+
+#: builtin/submodule--helper.c:204
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr "Le clonage de '%s' dans le chemin de sous-module '%s' a échoué"
+
+#: builtin/submodule--helper.c:227
+#, c-format
+msgid "cannot open file '%s'"
+msgstr "impossible d'ouvrir le fichier '%s'"
+
+#: builtin/submodule--helper.c:232
+#, c-format
+msgid "could not close file %s"
+msgstr "impossible de fermer le fichier %s"
+
+#: builtin/submodule--helper.c:247
+#, c-format
+msgid "could not get submodule directory for '%s'"
+msgstr "impossible de créer le répertoire de sous-module pour '%s'"
+
+#: builtin/submodule--helper.c:273
+msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+msgstr ""
+"fatal : la sous-commande submodule--helper doit être appelée avec une sous-"
+"commande"
+
+#: builtin/submodule--helper.c:280
+#, c-format
+msgid "fatal: '%s' is not a valid submodule--helper subcommand"
+msgstr "fatal : '%s' n'est pas une sous-commande valide de submodule--helper"
+
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
 msgstr "git symbolic-ref [<options>] nom [<référence>]"
@@ -10593,7 +10778,7 @@
 msgid "reason of the update"
 msgstr "raison de la mise à jour"
 
-#: builtin/tag.c:22
+#: builtin/tag.c:23
 msgid ""
 "git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
 "[<head>]"
@@ -10601,48 +10786,43 @@
 "git tag [-a | -s | -u <id-clé>] [-f] [-m <message> | -F <file>] <nom-"
 "étiquette> [<head>]"
 
-#: builtin/tag.c:23
+#: builtin/tag.c:24
 msgid "git tag -d <tagname>..."
 msgstr "git tag -d <nométiquette>..."
 
-#: builtin/tag.c:24
+#: builtin/tag.c:25
 msgid ""
 "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
-"\t\t[<pattern>...]"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
 "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <objet>]\n"
-"\t\t[<motif>...]"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<motif>...]"
 
-#: builtin/tag.c:26
+#: builtin/tag.c:27
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <nométiquette>..."
 
-#: builtin/tag.c:69
-#, c-format
-msgid "malformed object at '%s'"
-msgstr "objet malformé à '%s'"
-
-#: builtin/tag.c:301
+#: builtin/tag.c:80
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "nom d'étiquette trop long : %.*s..."
 
-#: builtin/tag.c:306
+#: builtin/tag.c:85
 #, c-format
 msgid "tag '%s' not found."
 msgstr "étiquette '%s' non trouvée."
 
-#: builtin/tag.c:321
+#: builtin/tag.c:100
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Étiquette '%s' supprimée (elle était sur %s)\n"
 
-#: builtin/tag.c:333
+#: builtin/tag.c:112
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "impossible de vérifier l'étiquette '%s'"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:122
 #, c-format
 msgid ""
 "\n"
@@ -10655,7 +10835,7 @@
 "  %s\n"
 "Les lignes commençant par '%c' seront ignorées.\n"
 
-#: builtin/tag.c:347
+#: builtin/tag.c:126
 #, c-format
 msgid ""
 "\n"
@@ -10670,153 +10850,138 @@
 "Les lignes commençant par '%c' seront gardées ; vous pouvez les retirer vous-"
 "même si vous le souhaitez.\n"
 
-#: builtin/tag.c:371
-#, c-format
-msgid "unsupported sort specification '%s'"
-msgstr "spécification de tri non supportée '%s'"
-
-#: builtin/tag.c:373
-#, c-format
-msgid "unsupported sort specification '%s' in variable '%s'"
-msgstr "spécification de tri non supportée '%s' dans le variable '%s'"
-
-#: builtin/tag.c:428
+#: builtin/tag.c:199
 msgid "unable to sign the tag"
 msgstr "impossible de signer l'étiquette"
 
-#: builtin/tag.c:430
+#: builtin/tag.c:201
 msgid "unable to write tag file"
 msgstr "impossible d'écrire le fichier d'étiquettes"
 
-#: builtin/tag.c:455
+#: builtin/tag.c:226
 msgid "bad object type."
 msgstr "mauvais type d'objet."
 
-#: builtin/tag.c:468
+#: builtin/tag.c:239
 msgid "tag header too big."
 msgstr "en-tête d'étiquette trop gros."
 
-#: builtin/tag.c:504
+#: builtin/tag.c:275
 msgid "no tag message?"
 msgstr "pas de message pour l'étiquette ?"
 
-#: builtin/tag.c:510
+#: builtin/tag.c:281
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Le message pour l'étiquette a été laissé dans %s\n"
 
-#: builtin/tag.c:559
-msgid "switch 'points-at' requires an object"
-msgstr "le commutateur 'points-at' a besoin d'un objet"
-
-#: builtin/tag.c:561
-#, c-format
-msgid "malformed object name '%s'"
-msgstr "nom d'objet malformé '%s'"
-
-#: builtin/tag.c:590
+#: builtin/tag.c:339
 msgid "list tag names"
 msgstr "afficher les noms des étiquettes"
 
-#: builtin/tag.c:592
+#: builtin/tag.c:341
 msgid "print <n> lines of each tag message"
 msgstr "affiche <n> lignes de chaque message d'étiquette"
 
-#: builtin/tag.c:594
+#: builtin/tag.c:343
 msgid "delete tags"
 msgstr "supprimer des étiquettes"
 
-#: builtin/tag.c:595
+#: builtin/tag.c:344
 msgid "verify tags"
 msgstr "vérifier des étiquettes"
 
-#: builtin/tag.c:597
+#: builtin/tag.c:346
 msgid "Tag creation options"
 msgstr "Options de création de l'étiquette"
 
-#: builtin/tag.c:599
+#: builtin/tag.c:348
 msgid "annotated tag, needs a message"
 msgstr "étiquette annotée, nécessite un message"
 
-#: builtin/tag.c:601
+#: builtin/tag.c:350
 msgid "tag message"
 msgstr "message pour l'étiquette"
 
-#: builtin/tag.c:603
+#: builtin/tag.c:352
 msgid "annotated and GPG-signed tag"
 msgstr "étiquette annotée et signée avec GPG"
 
-#: builtin/tag.c:607
+#: builtin/tag.c:356
 msgid "use another key to sign the tag"
 msgstr "utiliser une autre clé pour signer l'étiquette"
 
-#: builtin/tag.c:608
+#: builtin/tag.c:357
 msgid "replace the tag if exists"
 msgstr "remplacer l'étiquette si elle existe"
 
-#: builtin/tag.c:609 builtin/update-ref.c:368
+#: builtin/tag.c:358 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "créer un reflog"
 
-#: builtin/tag.c:611
+#: builtin/tag.c:360
 msgid "Tag listing options"
 msgstr "Options d'affichage des étiquettes"
 
-#: builtin/tag.c:612
+#: builtin/tag.c:361
 msgid "show tag list in columns"
 msgstr "afficher la liste des étiquettes sous forme de colonnes"
 
-#: builtin/tag.c:614
-msgid "sort tags"
-msgstr "trier les étiquettes"
-
-#: builtin/tag.c:619 builtin/tag.c:625
+#: builtin/tag.c:362 builtin/tag.c:363
 msgid "print only tags that contain the commit"
 msgstr "afficher seulement les étiquettes qui contiennent la validation"
 
-#: builtin/tag.c:631
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
+msgstr "afficher seulement les étiquettes qui sont fusionnées"
+
+#: builtin/tag.c:365
+msgid "print only tags that are not merged"
+msgstr "afficher seulement les étiquettes qui ne sont pas fusionnées"
+
+#: builtin/tag.c:370
 msgid "print only tags of the object"
 msgstr "afficher seulement les étiquettes de l'objet"
 
-#: builtin/tag.c:657
+#: builtin/tag.c:399
 msgid "--column and -n are incompatible"
 msgstr "--column et -n sont incompatibles"
 
-#: builtin/tag.c:669
-msgid "--sort and -n are incompatible"
-msgstr "--sort et -n sont incompatibles"
-
-#: builtin/tag.c:676
+#: builtin/tag.c:419
 msgid "-n option is only allowed with -l."
 msgstr "l'option -n est autorisée seulement avec -l."
 
-#: builtin/tag.c:678
+#: builtin/tag.c:421
 msgid "--contains option is only allowed with -l."
 msgstr "l'option --contains est autorisée seulement avec -l."
 
-#: builtin/tag.c:680
+#: builtin/tag.c:423
 msgid "--points-at option is only allowed with -l."
 msgstr "l'option --points-at est autorisée seulement avec -l."
 
-#: builtin/tag.c:688
+#: builtin/tag.c:425
+msgid "--merged and --no-merged option are only allowed with -l"
+msgstr "les options --merged et --no-merged ne sont autorisées qu'avec -l."
+
+#: builtin/tag.c:433
 msgid "only one -F or -m option is allowed."
 msgstr "une seule option -F ou -m est autorisée."
 
-#: builtin/tag.c:708
+#: builtin/tag.c:453
 msgid "too many params"
 msgstr "trop de paramètres"
 
-#: builtin/tag.c:714
+#: builtin/tag.c:459
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' n'est pas un nom d'étiquette valide."
 
-#: builtin/tag.c:719
+#: builtin/tag.c:464
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "l'étiquette '%s' existe déjà"
 
-#: builtin/tag.c:744
+#: builtin/tag.c:489
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Étiquette '%s' mise à jour (elle était sur %s)\n"
@@ -11090,81 +11255,85 @@
 msgid "print tag contents"
 msgstr "afficher le contenu de l'étiquette"
 
-#: builtin/worktree.c:13
-msgid "git worktree add [<options>] <path> <branch>"
-msgstr "git worktree add [<options>] <chemin> <branche>"
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr "git worktree add [<options>] <chemin> [<branche>]"
 
-#: builtin/worktree.c:14
+#: builtin/worktree.c:16
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<options>]"
 
-#: builtin/worktree.c:36
+#: builtin/worktree.c:17
+msgid "git worktree list [<options>]"
+msgstr "git worktree prune [<options>]"
+
+#: builtin/worktree.c:39
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Suppression de worktrees/%s : répertoire invalide"
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:45
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Suppression de worktrees/%s : le fichier gitdir n'existe pas"
 
-#: builtin/worktree.c:47
+#: builtin/worktree.c:50
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr ""
 "Suppression de worktrees/%s : echec de la lecture du fichier gitdir (%s)"
 
-#: builtin/worktree.c:58
+#: builtin/worktree.c:61
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Suppression de worktrees/%s : fichier gitdir invalide"
 
-#: builtin/worktree.c:74
+#: builtin/worktree.c:77
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr ""
 "Suppression de worktrees/%s : le fichier gitdir point sur un endroit "
 "inexistant"
 
-#: builtin/worktree.c:109
+#: builtin/worktree.c:112
 #, c-format
 msgid "failed to remove: %s"
 msgstr "échec de la suppression de %s"
 
-#: builtin/worktree.c:198
+#: builtin/worktree.c:201
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' existe déjà"
 
-#: builtin/worktree.c:232
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "impossible de créer le répertoire de '%s'"
 
-#: builtin/worktree.c:268
+#: builtin/worktree.c:271
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Préparation de %s (identifiant %s)"
 
-#: builtin/worktree.c:316
+#: builtin/worktree.c:319
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr ""
 "extraire la <branche> même si elle est déjà extraite dans une autre copie de "
 "travail"
 
-#: builtin/worktree.c:318
+#: builtin/worktree.c:321
 msgid "create a new branch"
 msgstr "créer une nouvelle branche"
 
-#: builtin/worktree.c:320
+#: builtin/worktree.c:323
 msgid "create or reset a branch"
 msgstr "créer ou réinitialiser une branche"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:324
 msgid "detach HEAD at named commit"
 msgstr "détacher la HEAD au commit nommé"
 
-#: builtin/worktree.c:328
+#: builtin/worktree.c:331
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B et --detach sont mutuellement exclusifs"
 
@@ -11315,49 +11484,49 @@
 msgid "no-op (backward compatibility)"
 msgstr "sans action (rétrocompatibilité)"
 
-#: parse-options.h:236
+#: parse-options.h:237
 msgid "be more verbose"
 msgstr "être plus verbeux"
 
-#: parse-options.h:238
+#: parse-options.h:239
 msgid "be more quiet"
 msgstr "être plus silencieux"
 
-#: parse-options.h:244
+#: parse-options.h:245
 msgid "use <n> digits to display SHA-1s"
 msgstr "utiliser <n> chiffres pour afficher les SHA-1s"
 
-#: rerere.h:28
+#: rerere.h:38
 msgid "update the index with reused conflict resolution if possible"
 msgstr ""
 "met à jour l'index avec les résolutions de conflit réutilisées si possible"
 
-#: git-bisect.sh:50
+#: git-bisect.sh:55
 msgid "You need to start by \"git bisect start\""
 msgstr "Vous devez démarrer avec \"git bisect start\""
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:56
+#: git-bisect.sh:61
 msgid "Do you want me to do it for you [Y/n]? "
 msgstr "Souhaitez-vous que je le fasse pour vous [Y/n] ? "
 
-#: git-bisect.sh:99
+#: git-bisect.sh:122
 #, sh-format
 msgid "unrecognised option: '$arg'"
 msgstr "option inconnue : '$arg'"
 
-#: git-bisect.sh:103
+#: git-bisect.sh:126
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr "'$arg' ne semble être une révision valide"
 
-#: git-bisect.sh:132
+#: git-bisect.sh:155
 msgid "Bad HEAD - I need a HEAD"
 msgstr "Mauvaise HEAD - j'ai besoin d'une HEAD"
 
-#: git-bisect.sh:145
+#: git-bisect.sh:168
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
@@ -11365,39 +11534,39 @@
 "L'extraction de '$start_head' a échoué. Essayez 'git bisect reset <branche-"
 "valide>'."
 
-#: git-bisect.sh:155
+#: git-bisect.sh:178
 msgid "won't bisect on cg-seek'ed tree"
 msgstr "refus de bissecter sur un arbre 'cg-seeked'"
 
-#: git-bisect.sh:159
+#: git-bisect.sh:182
 msgid "Bad HEAD - strange symbolic ref"
 msgstr "Mauvaise HEAD - référence symbolique douteuse"
 
-#: git-bisect.sh:211
+#: git-bisect.sh:234
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr "Mauvais argument pour bisect_write : $state"
 
-#: git-bisect.sh:240
+#: git-bisect.sh:263
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr "Mauvaise révision en entrée : $arg"
 
-#: git-bisect.sh:255
+#: git-bisect.sh:278
 msgid "Please call 'bisect_state' with at least one argument."
 msgstr "Veuillez appeler 'bisect_state' avec au moins un argument."
 
-#: git-bisect.sh:267
+#: git-bisect.sh:290
 #, sh-format
 msgid "Bad rev input: $rev"
 msgstr "Mauvaise révision en entrée : $rev"
 
-#: git-bisect.sh:276
+#: git-bisect.sh:299
 #, sh-format
 msgid "'git bisect $TERM_BAD' can take only one argument."
 msgstr "'git bisect $TERM_BAD' n'accepte qu'un seul argument."
 
-#: git-bisect.sh:299
+#: git-bisect.sh:322
 #, sh-format
 msgid "Warning: bisecting only with a $TERM_BAD commit."
 msgstr "Attention : bissection avec seulement une validation $TERM_BAD."
@@ -11405,11 +11574,11 @@
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:305
+#: git-bisect.sh:328
 msgid "Are you sure [Y/n]? "
 msgstr "Êtes-vous sûr [Y/n] ? "
 
-#: git-bisect.sh:317
+#: git-bisect.sh:340
 #, sh-format
 msgid ""
 "You need to give me at least one $bad_syn and one $good_syn revision.\n"
@@ -11420,7 +11589,7 @@
 "(Vous pouvez utiliser \"git bisect $bad_syn\" et \"git bisect $good_syn\" "
 "pour cela.)"
 
-#: git-bisect.sh:320
+#: git-bisect.sh:343
 #, sh-format
 msgid ""
 "You need to start by \"git bisect start\".\n"
@@ -11433,16 +11602,16 @@
 "(Vous pouvez utiliser \"git bisect $bad_syn\" et \"git bisect $good_syn\" "
 "pour cela.)"
 
-#: git-bisect.sh:391 git-bisect.sh:521
+#: git-bisect.sh:414 git-bisect.sh:546
 msgid "We are not bisecting."
 msgstr "Pas de bissection en cours."
 
-#: git-bisect.sh:398
+#: git-bisect.sh:421
 #, sh-format
 msgid "'$invalid' is not a valid commit"
 msgstr "'$invalid' n'est pas une validation valide"
 
-#: git-bisect.sh:407
+#: git-bisect.sh:430
 #, sh-format
 msgid ""
 "Could not check out original HEAD '$branch'.\n"
@@ -11451,25 +11620,25 @@
 "Échec d'extraction de la HEAD d'origine '$branch'.\n"
 "Essayez 'git bisect reset <commit>'."
 
-#: git-bisect.sh:435
+#: git-bisect.sh:458
 msgid "No logfile given"
 msgstr "Pas de fichier de log donné"
 
-#: git-bisect.sh:436
+#: git-bisect.sh:459
 #, sh-format
 msgid "cannot read $file for replaying"
 msgstr "impossible de lire $file pour rejouer"
 
-#: git-bisect.sh:455
+#: git-bisect.sh:480
 msgid "?? what are you talking about?"
 msgstr "?? de quoi parlez-vous ?"
 
-#: git-bisect.sh:467
+#: git-bisect.sh:492
 #, sh-format
 msgid "running $command"
 msgstr "lancement de $command"
 
-#: git-bisect.sh:474
+#: git-bisect.sh:499
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -11478,11 +11647,11 @@
 "la bissection a échoué :\n"
 "le code retour $res de '$command' est < 0 ou >= 128"
 
-#: git-bisect.sh:500
+#: git-bisect.sh:525
 msgid "bisect run cannot continue any more"
 msgstr "la bissection ne peut plus continuer"
 
-#: git-bisect.sh:506
+#: git-bisect.sh:531
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -11491,17 +11660,50 @@
 "la bissection a échoué :\n"
 "'bisect_state $state' a retourné le code erreur $res"
 
-#: git-bisect.sh:513
+#: git-bisect.sh:538
 msgid "bisect run success"
 msgstr "succès de la bissection"
 
-#: git-bisect.sh:548
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr "veuillez utiliser deux termes différents"
+
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr "'$term' n'est pas un terme valide"
+
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr "impossible d'utiliser la commande incluse '$term' comme terme"
+
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr "impossible de modifier la signification du terme '$term'"
+
+#: git-bisect.sh:606
 #, sh-format
 msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
 msgstr ""
 "Commande invalide : vous êtes actuellement dans une bissection $TERM_BAD/"
 "$TERM_GOOD."
 
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "aucun terme défini"
+
+#: git-bisect.sh:653
+#, sh-format
+msgid ""
+"invalid argument $arg for 'git bisect terms'.\n"
+"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+msgstr ""
+"argument invalide $arg pour 'git bisect terms'.\n"
+"Les options supportées sont : --term-good|--term-old et --term-bad|--term-"
+"new."
+
 #: git-rebase.sh:57
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
@@ -11541,25 +11743,25 @@
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "Il semble que git-am soit en cours. Impossible de rebaser."
 
-#: git-rebase.sh:351
+#: git-rebase.sh:354
 msgid "The --exec option must be used with the --interactive option"
 msgstr "L'option --exec doit être utilisée avec l'option --interactive"
 
-#: git-rebase.sh:356
+#: git-rebase.sh:359
 msgid "No rebase in progress?"
 msgstr "Pas de rebasage en cours ?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:370
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "L'action --edit-todo peut seulement être utilisée lors d'un rebasage "
 "interactif."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:377
 msgid "Cannot read HEAD"
 msgstr "Impossible de lire HEAD"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:380
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -11567,12 +11769,12 @@
 "Vous devez éditer tous les conflits de fusion et\n"
 "les marquer comme résolus avec git add"
 
-#: git-rebase.sh:395
+#: git-rebase.sh:398
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Impossible de revenir à $head_name"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:417
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11594,65 +11796,65 @@
 "chose\n"
 "d'important ici."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:468
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "invalide $upstream_name en amont"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:492
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name : il y a plus d'une base de fusion"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:495 git-rebase.sh:499
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name : il n'y a pas de base de fusion"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:504
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Ne pointe pas sur une validation valide : $onto_name"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:527
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal : pas de branche : $branch_name"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:560
 msgid "Cannot autostash"
 msgstr "Autoremisage impossible"
 
-#: git-rebase.sh:562
+#: git-rebase.sh:565
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Autoremisage créé : $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:569
 msgid "Please commit or stash them."
 msgstr "Veuillez les valider ou les remiser."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:589
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "La branche courante $branch_name est à jour."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:593
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "La branche courante $branch_name est à jour, rebasage forcé."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:604
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Changements de $mb sur $onto :"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:613
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Premièrement, rembobinons head pour rejouer votre travail par-dessus..."
 
-#: git-rebase.sh:620
+#: git-rebase.sh:623
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "$branch_name mise à jour en avance rapide sur $onto_name."
@@ -11725,118 +11927,99 @@
 msgid "Cannot remove worktree changes"
 msgstr "Impossible de supprimer les changements de la copie de travail"
 
-#: git-stash.sh:387
+#: git-stash.sh:405
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "option inconnue : $opt"
 
-#: git-stash.sh:397
+#: git-stash.sh:415
 msgid "No stash found."
 msgstr "Pas de remisage trouvé."
 
-#: git-stash.sh:404
+#: git-stash.sh:422
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Trop de révisions spécifiées : $REV"
 
-#: git-stash.sh:410
+#: git-stash.sh:428
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference n'est pas une référence valide"
 
-#: git-stash.sh:438
+#: git-stash.sh:456
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' n'est pas une validation de type remisage"
 
-#: git-stash.sh:449
+#: git-stash.sh:467
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' n'est pas une référence de remisage"
 
-#: git-stash.sh:457
+#: git-stash.sh:475
 msgid "unable to refresh index"
 msgstr "impossible de rafraîchir l'index"
 
-#: git-stash.sh:461
+#: git-stash.sh:479
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Impossible d'appliquer un remisage en cours de fusion"
 
-#: git-stash.sh:469
+#: git-stash.sh:487
 msgid "Conflicts in index. Try without --index."
 msgstr "Conflits dans l'index. Essayez sans --index."
 
-#: git-stash.sh:471
+#: git-stash.sh:489
 msgid "Could not save index tree"
 msgstr "Impossible de sauvegarder l'arbre d'index"
 
-#: git-stash.sh:505
+#: git-stash.sh:523
 msgid "Cannot unstage modified files"
 msgstr "Impossible de désindexer les fichiers modifiés"
 
-#: git-stash.sh:520
+#: git-stash.sh:538
 msgid "Index was not unstashed."
 msgstr "L'index n'a pas été sorti de remise."
 
-#: git-stash.sh:543
+#: git-stash.sh:561
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "${REV} supprimé ($s)"
 
-#: git-stash.sh:544
+#: git-stash.sh:562
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Impossible de supprimer l'élément de stash"
 
-#: git-stash.sh:552
+#: git-stash.sh:570
 msgid "No branch name specified"
 msgstr "Aucune branche spécifiée"
 
-#: git-stash.sh:624
+#: git-stash.sh:642
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Pour les restaurer tapez \"git stash apply\")"
 
-#: git-submodule.sh:95
+#: git-submodule.sh:104
 #, sh-format
 msgid "cannot strip one component off url '$remoteurl'"
 msgstr "impossible de supprimer un composant de l'URL '$remoteurl'"
 
-#: git-submodule.sh:237
-#, sh-format
-msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
-msgstr ""
-"Pas de mise en correspondance du sous-module trouvé dans .gitmodules pour le "
-"chemin '$sm_path'"
-
-#: git-submodule.sh:287
-#, sh-format
-msgid "Clone of '$url' into submodule path '$sm_path' failed"
-msgstr "Le clonage de '$url' dans le chemin de sous-module '$sm_path' a échoué"
-
-#: git-submodule.sh:296
-#, sh-format
-msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-msgstr ""
-"Le répertoire Git '$a' fait partie du chemin de sous-module '$b' ou vice-"
-"versa"
-
-#: git-submodule.sh:406
+#: git-submodule.sh:281
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 "Un chemin relatif ne peut être utilisé que depuis la racine de la copie de "
 "travail"
 
-#: git-submodule.sh:416
+#: git-submodule.sh:291
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "L'URL de dépôt '$repo' doit être absolu ou commencer par ./|../"
 
-#: git-submodule.sh:433
+#: git-submodule.sh:308
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' existe déjà dans l'index"
 
-#: git-submodule.sh:437
+#: git-submodule.sh:312
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -11847,24 +12030,24 @@
 "$sm_path\n"
 "Utilisez -f si vous voulez vraiment l'ajouter."
 
-#: git-submodule.sh:455
+#: git-submodule.sh:330
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Ajout du dépôt existant à '$sm_path' dans l'index"
 
-#: git-submodule.sh:457
+#: git-submodule.sh:332
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' existe déjà et n'est pas un dépôt git valide"
 
-#: git-submodule.sh:465
+#: git-submodule.sh:340
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 "Un répertoire git pour '$sm_name' est trouvé en local avec le(s) serveur(s) "
 "distant(s) :"
 
-#: git-submodule.sh:467
+#: git-submodule.sh:342
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
@@ -11872,7 +12055,7 @@
 "Si vous voulez réutiliser ce répertoire git local au lieu de cloner à "
 "nouveau depuis"
 
-#: git-submodule.sh:469
+#: git-submodule.sh:344
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
@@ -11880,7 +12063,7 @@
 "utilisez l'option '--force'. Si le répertoire local git n'est pas le dépôt "
 "correct"
 
-#: git-submodule.sh:470
+#: git-submodule.sh:345
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -11889,74 +12072,74 @@
 "ou vous ne savez pas ce que cela signifie de choisir un autre nom avec "
 "l'option '--name'."
 
-#: git-submodule.sh:472
+#: git-submodule.sh:347
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Réactivation du répertoire git local pour le sous-module '$sm_name'."
 
-#: git-submodule.sh:484
+#: git-submodule.sh:359
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Impossible d'extraire le sous-module '$sm_path'"
 
-#: git-submodule.sh:489
+#: git-submodule.sh:364
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Échec d'ajout du sous-module '$sm_path'"
 
-#: git-submodule.sh:498
+#: git-submodule.sh:373
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Échec d'enregistrement du sous-module '$sm_path'"
 
-#: git-submodule.sh:542
+#: git-submodule.sh:417
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Entrée dans '$prefix$displaypath'"
 
-#: git-submodule.sh:562
+#: git-submodule.sh:437
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr ""
 "Arrêt sur '$prefix$displaypath' ; le script a retourné un statut non nul."
 
-#: git-submodule.sh:608
+#: git-submodule.sh:483
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr ""
 "URL non trouvée pour le chemin de sous-module '$displaypath' dans .gitmodules"
 
-#: git-submodule.sh:617
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr ""
 "Échec d'enregistrement de l'URL pour le chemin de sous-module '$displaypath'"
 
-#: git-submodule.sh:619
+#: git-submodule.sh:494
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr "Sous-module '$name' ($url) enregistré pour le chemin '$displaypath'"
 
-#: git-submodule.sh:636
+#: git-submodule.sh:511
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr ""
 "Échec d'enregistrement du mode de mise à jour pour le chemin de sous-module "
 "'$displaypath'"
 
-#: git-submodule.sh:674
+#: git-submodule.sh:549
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr ""
 "Utilisez '.' si vous voulez vraiment réinitialiser tous les sous-modules"
 
-#: git-submodule.sh:691
+#: git-submodule.sh:566
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr ""
 "La copie de travail du sous-module '$displaypath' contient un répertoire .git"
 
-#: git-submodule.sh:692
+#: git-submodule.sh:567
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -11964,7 +12147,7 @@
 "(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout son "
 "historique)"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:573
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -11973,30 +12156,30 @@
 "La copie de travail du sous-module '$displaypath' contient des modifications "
 "locales ; utilisez '-f' pour les annuler"
 
-#: git-submodule.sh:701
+#: git-submodule.sh:576
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Répertoire '$displaypath' nettoyé"
 
-#: git-submodule.sh:702
+#: git-submodule.sh:577
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 "Impossible de supprimer la copie de travail du sous-module '$displaypath'"
 
-#: git-submodule.sh:705
+#: git-submodule.sh:580
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "Impossible de créer le répertoire vide du sous-module '$displaypath'"
 
-#: git-submodule.sh:714
+#: git-submodule.sh:589
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 "Le sous-module '$name' ($url) n'est pas enregistré pour le chemin "
 "'$displaypath'"
 
-#: git-submodule.sh:830
+#: git-submodule.sh:705
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -12005,57 +12188,57 @@
 "Chemin de sous-module '$displaypath' non initialisé\n"
 "Peut-être souhaitez-vous utiliser 'update --init' ?"
 
-#: git-submodule.sh:843
+#: git-submodule.sh:718
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr ""
 "Impossible de trouver la révision courante dans le chemin de sous-module "
 "'$displaypath'"
 
-#: git-submodule.sh:852
+#: git-submodule.sh:727
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Impossible de rapatrier dans le chemin de sous-module '$sm_path'"
 
-#: git-submodule.sh:876
+#: git-submodule.sh:751
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Impossible de rapatrier dans le chemin de sous-module '$displaypath'"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:765
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr ""
 "Impossible d'extraire '$sha1' dans le chemin de sous-module '$displaypath'"
 
-#: git-submodule.sh:891
+#: git-submodule.sh:766
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Chemin de sous-module '$displaypath' : '$sha1' extrait"
 
-#: git-submodule.sh:895
+#: git-submodule.sh:770
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
 "Impossible de rebaser '$sha1' dans le chemin de sous-module '$displaypath'"
 
-#: git-submodule.sh:896
+#: git-submodule.sh:771
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Chemin de sous-module '$displaypath' : rebasé dans '$sha1'"
 
-#: git-submodule.sh:901
+#: git-submodule.sh:776
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr ""
 "Impossible de fusionner '$sha1' dans le chemin de sous-module '$displaypath'"
 
-#: git-submodule.sh:902
+#: git-submodule.sh:777
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Chemin de sous-module '$displaypath' : fusionné dans '$sha1'"
 
-#: git-submodule.sh:907
+#: git-submodule.sh:782
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
@@ -12063,56 +12246,114 @@
 "L'exécution de '$command $sha1' a échoué dans le chemin de sous-module "
 "'$prefix$sm_path'"
 
-#: git-submodule.sh:908
+#: git-submodule.sh:783
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "Chemin de sous-module '$prefix$sm_path' : '$command $sha1'"
 
-#: git-submodule.sh:938
+#: git-submodule.sh:813
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Échec de parcours dans le chemin du sous-module '$displaypath'"
 
-#: git-submodule.sh:1046
+#: git-submodule.sh:921
 msgid "The --cached option cannot be used with the --files option"
 msgstr "L'option --cached ne peut pas être utilisée avec l'option --files"
 
-#: git-submodule.sh:1098
+#: git-submodule.sh:973
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "mode $mod_dst inattendu"
 
-#: git-submodule.sh:1118
+#: git-submodule.sh:993
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Attention : $display_name ne contient pas la validation $sha1_src"
 
-#: git-submodule.sh:1121
+#: git-submodule.sh:996
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Attention : $display_name ne contient pas la validation $sha1_dst"
 
-#: git-submodule.sh:1124
+#: git-submodule.sh:999
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 "  Attention : $display_name ne contient pas les validations $sha1_src et "
 "$sha1_dst"
 
-#: git-submodule.sh:1149
+#: git-submodule.sh:1024
 msgid "blob"
 msgstr "blob"
 
-#: git-submodule.sh:1267
+#: git-submodule.sh:1142
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Échec de parcours dans le chemin du sous-module '$sm_path'"
 
-#: git-submodule.sh:1331
+#: git-submodule.sh:1206
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
 
+#~ msgid "unable to look up current user in the passwd file: %s"
+#~ msgstr ""
+#~ "impossible de rechercher l'utilisateur actuel dans le fichier de mots de "
+#~ "passe : %s"
+
+#~ msgid "no such user"
+#~ msgstr "utilisateur inconnu"
+
+#~ msgid "branch '%s' does not point at a commit"
+#~ msgstr "la branche '%s' ne pointe pas sur un commit"
+
+#~ msgid "object '%s' does not point to a commit"
+#~ msgstr "l'objet '%s' ne pointe pas sur un commit"
+
+#~ msgid "some refs could not be read"
+#~ msgstr "des références n'ont pas pu être lues"
+
+#~ msgid "print only merged branches"
+#~ msgstr "afficher seulement les branches fusionnées"
+
+#~ msgid "--dissociate given, but there is no --reference"
+#~ msgstr "--dissociate est spécifié, mais --reference est absent"
+
+#~ msgid "show usage"
+#~ msgstr "afficher l'usage"
+
+#~ msgid "insanely long template name %s"
+#~ msgstr "nom de modèle démentiellement long %s"
+
+#~ msgid "insanely long symlink %s"
+#~ msgstr "lien symbolique démentiellement long %s"
+
+#~ msgid "insanely long template path %s"
+#~ msgstr "chemin de modèle %s démentiellement long"
+
+#~ msgid "insane git directory %s"
+#~ msgstr "répertoire git démentiel %s"
+
+#~ msgid "unsupported sort specification '%s'"
+#~ msgstr "spécification de tri non supportée '%s'"
+
+#~ msgid "unsupported sort specification '%s' in variable '%s'"
+#~ msgstr "spécification de tri non supportée '%s' dans le variable '%s'"
+
+#~ msgid "switch 'points-at' requires an object"
+#~ msgstr "le commutateur 'points-at' a besoin d'un objet"
+
+#~ msgid "sort tags"
+#~ msgstr "trier les étiquettes"
+
+#~ msgid "--sort and -n are incompatible"
+#~ msgstr "--sort et -n sont incompatibles"
+
+#~ msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
+#~ msgstr ""
+#~ "Le répertoire Git '$a' fait partie du chemin de sous-module '$b' ou vice-"
+#~ "versa"
+
 #~ msgid "false|true|preserve"
 #~ msgstr "false|true|preserve"
 
diff --git a/po/git.pot b/po/git.pot
index d275f40..068f4bb 100644
--- a/po/git.pot
+++ b/po/git.pot
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2015-09-15 06:45+0800\n"
+"POT-Creation-Date: 2015-12-22 22:50+0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -29,12 +29,12 @@
 "as appropriate to mark resolution and make a commit."
 msgstr ""
 
-#: advice.c:101 builtin/merge.c:1227
+#: advice.c:101 builtin/merge.c:1225
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr ""
 
 #: advice.c:103
-msgid "Please, commit your changes before you can merge."
+msgid "Please, commit your changes before merging."
 msgstr ""
 
 #: advice.c:104
@@ -58,76 +58,76 @@
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr ""
 
-#: archive.c:343 builtin/add.c:137 builtin/add.c:426 builtin/rm.c:327
+#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr ""
 
-#: archive.c:428
+#: archive.c:429
 msgid "fmt"
 msgstr ""
 
-#: archive.c:428
+#: archive.c:429
 msgid "archive format"
 msgstr ""
 
-#: archive.c:429 builtin/log.c:1229
+#: archive.c:430 builtin/log.c:1229
 msgid "prefix"
 msgstr ""
 
-#: archive.c:430
+#: archive.c:431
 msgid "prepend prefix to each pathname in the archive"
 msgstr ""
 
-#: archive.c:431 builtin/archive.c:88 builtin/blame.c:2516
-#: builtin/blame.c:2517 builtin/config.c:58 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:712 builtin/hash-object.c:99
+#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535
+#: builtin/blame.c:2536 builtin/config.c:58 builtin/fast-export.c:987
+#: builtin/fast-export.c:989 builtin/grep.c:707 builtin/hash-object.c:99
 #: builtin/ls-files.c:446 builtin/ls-files.c:449 builtin/notes.c:395
 #: builtin/notes.c:558 builtin/read-tree.c:109 parse-options.h:153
 msgid "file"
 msgstr ""
 
-#: archive.c:432 builtin/archive.c:89
+#: archive.c:433 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr ""
 
-#: archive.c:434
+#: archive.c:435
 msgid "read .gitattributes in working directory"
 msgstr ""
 
-#: archive.c:435
+#: archive.c:436
 msgid "report archived files on stderr"
 msgstr ""
 
-#: archive.c:436
+#: archive.c:437
 msgid "store only"
 msgstr ""
 
-#: archive.c:437
+#: archive.c:438
 msgid "compress faster"
 msgstr ""
 
-#: archive.c:445
+#: archive.c:446
 msgid "compress better"
 msgstr ""
 
-#: archive.c:448
+#: archive.c:449
 msgid "list supported archive formats"
 msgstr ""
 
-#: archive.c:450 builtin/archive.c:90 builtin/clone.c:77
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77
 msgid "repo"
 msgstr ""
 
-#: archive.c:451 builtin/archive.c:91
+#: archive.c:452 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr ""
 
-#: archive.c:452 builtin/archive.c:92 builtin/notes.c:479
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479
 msgid "command"
 msgstr ""
 
-#: archive.c:453 builtin/archive.c:93
+#: archive.c:454 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr ""
 
@@ -137,81 +137,81 @@
 "Use '\\!' for literal leading exclamation."
 msgstr ""
 
-#: branch.c:60
+#: branch.c:61
 #, c-format
 msgid "Not setting branch %s as its own upstream."
 msgstr ""
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
 
-#: branch.c:84
+#: branch.c:85
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr ""
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr ""
 
-#: branch.c:89
+#: branch.c:90
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr ""
 
-#: branch.c:94
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr ""
 
-#: branch.c:95
+#: branch.c:96
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr ""
 
-#: branch.c:99
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
 
-#: branch.c:100
+#: branch.c:101
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr ""
 
-#: branch.c:133
+#: branch.c:134
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr ""
 
-#: branch.c:162
+#: branch.c:163
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr ""
 
-#: branch.c:167
+#: branch.c:168
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr ""
 
-#: branch.c:175
+#: branch.c:176
 msgid "Cannot force update the current branch."
 msgstr ""
 
-#: branch.c:195
+#: branch.c:196
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr ""
 
-#: branch.c:197
+#: branch.c:198
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr ""
 
-#: branch.c:199
+#: branch.c:200
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -223,22 +223,22 @@
 "\"git push -u\" to set the upstream config as you push."
 msgstr ""
 
-#: branch.c:243
+#: branch.c:244
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr ""
 
-#: branch.c:263
+#: branch.c:264
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr ""
 
-#: branch.c:268
+#: branch.c:269
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr ""
 
-#: branch.c:399
+#: branch.c:322
 #, c-format
 msgid "'%s' is already checked out at '%s'"
 msgstr ""
@@ -253,7 +253,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr ""
 
-#: bundle.c:87 builtin/commit.c:765
+#: bundle.c:87 builtin/commit.c:766
 #, c-format
 msgid "could not open '%s'"
 msgstr ""
@@ -262,9 +262,9 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr ""
 
-#: bundle.c:163 sequencer.c:636 sequencer.c:1083 builtin/blame.c:2708
-#: builtin/branch.c:652 builtin/commit.c:1044 builtin/log.c:334
-#: builtin/log.c:850 builtin/log.c:1457 builtin/log.c:1690 builtin/merge.c:358
+#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083
+#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334
+#: builtin/log.c:849 builtin/log.c:1461 builtin/log.c:1694 builtin/merge.c:358
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr ""
@@ -304,7 +304,7 @@
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr ""
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1367 builtin/shortlog.c:261
+#: bundle.c:443 builtin/log.c:157 builtin/log.c:1369 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr ""
@@ -322,13 +322,13 @@
 msgid "index-pack died"
 msgstr ""
 
-#: color.c:260
+#: color.c:275
 #, c-format
 msgid "invalid color value: %.*s"
 msgstr ""
 
-#: commit.c:40 builtin/am.c:451 builtin/am.c:487 builtin/am.c:1516
-#: builtin/am.c:2128
+#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520
+#: builtin/am.c:2149
 #, c-format
 msgid "could not parse %s"
 msgstr ""
@@ -486,54 +486,54 @@
 msgid "Performing inexact rename detection"
 msgstr ""
 
-#: diff.c:116
+#: diff.c:115
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
 
-#: diff.c:121
+#: diff.c:120
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr ""
 
-#: diff.c:216
+#: diff.c:215
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr ""
 
-#: diff.c:268
+#: diff.c:267
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
 "%s"
 msgstr ""
 
-#: diff.c:2998
+#: diff.c:3000
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr ""
 
-#: diff.c:3394
+#: diff.c:3396
 msgid "--follow requires exactly one pathspec"
 msgstr ""
 
-#: diff.c:3557
+#: diff.c:3559
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
 "%s"
 msgstr ""
 
-#: diff.c:3571
+#: diff.c:3573
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr ""
 
-#: dir.c:1853
+#: dir.c:1915
 msgid "failed to get kernel name and information"
 msgstr ""
 
-#: dir.c:1936
+#: dir.c:1998
 msgid "Untracked cache is disabled on this system."
 msgstr ""
 
@@ -634,8 +634,8 @@
 msgid "failed to read the cache"
 msgstr ""
 
-#: merge.c:94 builtin/am.c:2001 builtin/am.c:2036 builtin/checkout.c:375
-#: builtin/checkout.c:586 builtin/clone.c:715
+#: merge.c:94 builtin/am.c:2022 builtin/am.c:2057 builtin/checkout.c:376
+#: builtin/checkout.c:587 builtin/clone.c:722
 msgid "unable to write new index file"
 msgstr ""
 
@@ -653,233 +653,233 @@
 msgid "error building trees"
 msgstr ""
 
-#: merge-recursive.c:687
+#: merge-recursive.c:686
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr ""
 
-#: merge-recursive.c:698
+#: merge-recursive.c:697
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr ""
 
-#: merge-recursive.c:712 merge-recursive.c:733
+#: merge-recursive.c:711 merge-recursive.c:732
 msgid ": perhaps a D/F conflict?"
 msgstr ""
 
-#: merge-recursive.c:723
+#: merge-recursive.c:722
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr ""
 
-#: merge-recursive.c:763
+#: merge-recursive.c:762
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:765
+#: merge-recursive.c:764
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:788 builtin/clone.c:364
+#: merge-recursive.c:787 builtin/clone.c:369
 #, c-format
 msgid "failed to open '%s'"
 msgstr ""
 
-#: merge-recursive.c:796
+#: merge-recursive.c:795
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr ""
 
-#: merge-recursive.c:799
+#: merge-recursive.c:798
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:937
+#: merge-recursive.c:936
 msgid "Failed to execute internal merge"
 msgstr ""
 
-#: merge-recursive.c:941
+#: merge-recursive.c:940
 #, c-format
 msgid "Unable to add %s to database"
 msgstr ""
 
-#: merge-recursive.c:957
+#: merge-recursive.c:956
 msgid "unsupported object type in the tree"
 msgstr ""
 
-#: merge-recursive.c:1032 merge-recursive.c:1046
+#: merge-recursive.c:1031 merge-recursive.c:1045
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
 "in tree."
 msgstr ""
 
-#: merge-recursive.c:1038 merge-recursive.c:1051
+#: merge-recursive.c:1037 merge-recursive.c:1050
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
 "in tree at %s."
 msgstr ""
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "rename"
 msgstr ""
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "renamed"
 msgstr ""
 
-#: merge-recursive.c:1148
+#: merge-recursive.c:1147
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr ""
 
-#: merge-recursive.c:1170
+#: merge-recursive.c:1169
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
 "\"->\"%s\" in \"%s\"%s"
 msgstr ""
 
-#: merge-recursive.c:1175
+#: merge-recursive.c:1174
 msgid " (left unresolved)"
 msgstr ""
 
-#: merge-recursive.c:1229
+#: merge-recursive.c:1228
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 
-#: merge-recursive.c:1259
+#: merge-recursive.c:1258
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr ""
 
-#: merge-recursive.c:1458
+#: merge-recursive.c:1457
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 
-#: merge-recursive.c:1468
+#: merge-recursive.c:1467
 #, c-format
 msgid "Adding merged %s"
 msgstr ""
 
-#: merge-recursive.c:1473 merge-recursive.c:1671
+#: merge-recursive.c:1472 merge-recursive.c:1674
 #, c-format
 msgid "Adding as %s instead"
 msgstr ""
 
-#: merge-recursive.c:1524
+#: merge-recursive.c:1523
 #, c-format
 msgid "cannot read object %s"
 msgstr ""
 
-#: merge-recursive.c:1527
+#: merge-recursive.c:1526
 #, c-format
 msgid "object %s is not a blob"
 msgstr ""
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modify"
 msgstr ""
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modified"
 msgstr ""
 
-#: merge-recursive.c:1585
+#: merge-recursive.c:1588
 msgid "content"
 msgstr ""
 
-#: merge-recursive.c:1592
+#: merge-recursive.c:1595
 msgid "add/add"
 msgstr ""
 
-#: merge-recursive.c:1626
+#: merge-recursive.c:1629
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr ""
 
-#: merge-recursive.c:1640
+#: merge-recursive.c:1643
 #, c-format
 msgid "Auto-merging %s"
 msgstr ""
 
-#: merge-recursive.c:1644 git-submodule.sh:1150
+#: merge-recursive.c:1647 git-submodule.sh:1025
 msgid "submodule"
 msgstr ""
 
-#: merge-recursive.c:1645
+#: merge-recursive.c:1648
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr ""
 
-#: merge-recursive.c:1731
+#: merge-recursive.c:1734
 #, c-format
 msgid "Removing %s"
 msgstr ""
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1759
 msgid "file/directory"
 msgstr ""
 
-#: merge-recursive.c:1762
+#: merge-recursive.c:1765
 msgid "directory/file"
 msgstr ""
 
-#: merge-recursive.c:1767
+#: merge-recursive.c:1770
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1780
 #, c-format
 msgid "Adding %s"
 msgstr ""
 
-#: merge-recursive.c:1794
+#: merge-recursive.c:1797
 msgid "Fatal merge failure, shouldn't happen."
 msgstr ""
 
-#: merge-recursive.c:1813
+#: merge-recursive.c:1816
 msgid "Already up-to-date!"
 msgstr ""
 
-#: merge-recursive.c:1822
+#: merge-recursive.c:1825
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr ""
 
-#: merge-recursive.c:1852
+#: merge-recursive.c:1855
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr ""
 
-#: merge-recursive.c:1900
+#: merge-recursive.c:1903
 msgid "Merging:"
 msgstr ""
 
-#: merge-recursive.c:1913
+#: merge-recursive.c:1916
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: merge-recursive.c:1950
+#: merge-recursive.c:1953
 msgid "merge returned no commit"
 msgstr ""
 
-#: merge-recursive.c:2007
+#: merge-recursive.c:2010
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr ""
 
-#: merge-recursive.c:2018 builtin/merge.c:645
+#: merge-recursive.c:2021 builtin/merge.c:645
 msgid "Unable to write index."
 msgstr ""
 
@@ -909,31 +909,41 @@
 msgid "unable to parse object: %s"
 msgstr ""
 
-#: parse-options.c:563
+#: parse-options.c:570
 msgid "..."
 msgstr ""
 
-#: parse-options.c:581
+#: parse-options.c:588
 #, c-format
 msgid "usage: %s"
 msgstr ""
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:585
+#: parse-options.c:592
 #, c-format
 msgid "   or: %s"
 msgstr ""
 
-#: parse-options.c:588
+#: parse-options.c:595
 #, c-format
 msgid "    %s"
 msgstr ""
 
-#: parse-options.c:622
+#: parse-options.c:629
 msgid "-NUM"
 msgstr ""
 
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr ""
+
+#: path.c:752
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr ""
+
 #: pathspec.c:133
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
@@ -998,136 +1008,181 @@
 msgid "unable to parse --pretty format"
 msgstr ""
 
-#: progress.c:236
+#: progress.c:235
 msgid "done"
 msgstr ""
 
-#: read-cache.c:1296
+#: read-cache.c:1281
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
 "Using version %i"
 msgstr ""
 
-#: read-cache.c:1306
+#: read-cache.c:1291
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
 "Using version %i"
 msgstr ""
 
-#: refs.c:2941 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
+#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
 #: builtin/merge.c:983
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr ""
 
-#: refs.c:3001
+#: refs/files-backend.c:2359
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr ""
 
-#: refs.c:3004
+#: refs/files-backend.c:2362
 #, c-format
 msgid "could not delete references: %s"
 msgstr ""
 
-#: refs.c:3013
+#: refs/files-backend.c:2371
 #, c-format
 msgid "could not remove reference %s"
 msgstr ""
 
-#: ref-filter.c:660
+#: ref-filter.c:245
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr ""
+
+#: ref-filter.c:704
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr ""
+
+#: ref-filter.c:833
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr ""
+
+#: ref-filter.c:835
 msgid "unable to parse format"
 msgstr ""
 
-#: remote.c:792
+#: ref-filter.c:870
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr ""
+
+#: ref-filter.c:893
+#, c-format
+msgid "improper format entered align:%s"
+msgstr ""
+
+#: ref-filter.c:898
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr ""
+
+#: ref-filter.c:1219
+#, c-format
+msgid "malformed object at '%s'"
+msgstr ""
+
+#: ref-filter.c:1561
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr ""
+
+#: ref-filter.c:1615
+#, c-format
+msgid "malformed object name %s"
+msgstr ""
+
+#: remote.c:756
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr ""
 
-#: remote.c:796
+#: remote.c:760
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr ""
 
-#: remote.c:800
+#: remote.c:764
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr ""
 
-#: remote.c:808
+#: remote.c:772
 msgid "Internal error"
 msgstr ""
 
-#: remote.c:1723 remote.c:1766
+#: remote.c:1687 remote.c:1730
 msgid "HEAD does not point to a branch"
 msgstr ""
 
-#: remote.c:1732
+#: remote.c:1696
 #, c-format
 msgid "no such branch: '%s'"
 msgstr ""
 
-#: remote.c:1735
+#: remote.c:1699
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr ""
 
-#: remote.c:1741
+#: remote.c:1705
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr ""
 
-#: remote.c:1756
+#: remote.c:1720
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
 
-#: remote.c:1771
+#: remote.c:1735
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr ""
 
-#: remote.c:1782
+#: remote.c:1746
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr ""
 
-#: remote.c:1795
+#: remote.c:1759
 msgid "push has no destination (push.default is 'nothing')"
 msgstr ""
 
-#: remote.c:1817
+#: remote.c:1781
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr ""
 
-#: remote.c:2124
+#: remote.c:2083
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr ""
 
-#: remote.c:2128
+#: remote.c:2087
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr ""
 
-#: remote.c:2131
+#: remote.c:2090
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr ""
 
-#: remote.c:2135
+#: remote.c:2094
 #, c-format
 msgid "Your branch is ahead of '%s' by %d commit.\n"
 msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: remote.c:2141
+#: remote.c:2100
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr ""
 
-#: remote.c:2144
+#: remote.c:2103
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1135,11 +1190,11 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: remote.c:2152
+#: remote.c:2111
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr ""
 
-#: remote.c:2155
+#: remote.c:2114
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1150,28 +1205,28 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: remote.c:2165
+#: remote.c:2124
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
 
-#: revision.c:2198
+#: revision.c:2193
 msgid "your current branch appears to be broken"
 msgstr ""
 
-#: revision.c:2201
+#: revision.c:2196
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr ""
 
-#: revision.c:2395
+#: revision.c:2390
 msgid "--first-parent is incompatible with --bisect"
 msgstr ""
 
-#: run-command.c:83
+#: run-command.c:90
 msgid "open /dev/null failed"
 msgstr ""
 
-#: run-command.c:85
+#: run-command.c:92
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr ""
@@ -1382,7 +1437,7 @@
 msgid "cannot abort from a branch yet to be born"
 msgstr ""
 
-#: sequencer.c:887 builtin/apply.c:4291
+#: sequencer.c:887 builtin/apply.c:4287
 #, c-format
 msgid "cannot open %s: %s"
 msgstr ""
@@ -1424,12 +1479,12 @@
 msgid "Can't cherry-pick into empty head"
 msgstr ""
 
-#: setup.c:243
+#: setup.c:248
 #, c-format
 msgid "failed to read %s"
 msgstr ""
 
-#: sha1_name.c:453
+#: sha1_name.c:463
 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"
@@ -1465,7 +1520,7 @@
 msgid "staging updated .gitmodules failed"
 msgstr ""
 
-#: submodule.c:1045
+#: submodule.c:1040
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr ""
@@ -1476,7 +1531,7 @@
 msgid "unknown value '%s' for key '%s'"
 msgstr ""
 
-#: trailer.c:543 trailer.c:548 builtin/remote.c:290
+#: trailer.c:543 trailer.c:548 builtin/remote.c:296
 #, c-format
 msgid "more than one %s"
 msgstr ""
@@ -1543,8 +1598,8 @@
 msgid "could not open '%s' for writing"
 msgstr ""
 
-#: wrapper.c:223 wrapper.c:366 builtin/am.c:337 builtin/commit.c:1688
-#: builtin/merge.c:1076 builtin/pull.c:380
+#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691
+#: builtin/merge.c:1074 builtin/pull.c:380
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr ""
@@ -1559,30 +1614,21 @@
 msgid "unable to access '%s'"
 msgstr ""
 
-#: wrapper.c:611
-#, c-format
-msgid "unable to look up current user in the passwd file: %s"
-msgstr ""
-
-#: wrapper.c:612
-msgid "no such user"
-msgstr ""
-
-#: wrapper.c:620
+#: wrapper.c:608
 msgid "unable to get current working directory"
 msgstr ""
 
-#: wrapper.c:631
+#: wrapper.c:635
 #, c-format
 msgid "could not open %s for writing"
 msgstr ""
 
-#: wrapper.c:642 builtin/am.c:424
+#: wrapper.c:646 builtin/am.c:425
 #, c-format
 msgid "could not write to %s"
 msgstr ""
 
-#: wrapper.c:648
+#: wrapper.c:652
 #, c-format
 msgid "could not close %s"
 msgstr ""
@@ -1909,27 +1955,27 @@
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
 
-#: wt-status.c:1437
+#: wt-status.c:1438
 msgid "On branch "
 msgstr ""
 
-#: wt-status.c:1445
+#: wt-status.c:1444
 msgid "interactive rebase in progress; onto "
 msgstr ""
 
-#: wt-status.c:1447
+#: wt-status.c:1446
 msgid "rebase in progress; onto "
 msgstr ""
 
-#: wt-status.c:1452
+#: wt-status.c:1451
 msgid "HEAD detached at "
 msgstr ""
 
-#: wt-status.c:1454
+#: wt-status.c:1453
 msgid "HEAD detached from "
 msgstr ""
 
-#: wt-status.c:1457
+#: wt-status.c:1456
 msgid "Not currently on any branch."
 msgstr ""
 
@@ -2008,23 +2054,23 @@
 msgid "nothing to commit, working directory clean\n"
 msgstr ""
 
-#: wt-status.c:1644
-msgid "HEAD (no branch)"
-msgstr ""
-
-#: wt-status.c:1650
+#: wt-status.c:1642
 msgid "Initial commit on "
 msgstr ""
 
-#: wt-status.c:1677
+#: wt-status.c:1646
+msgid "HEAD (no branch)"
+msgstr ""
+
+#: wt-status.c:1675
 msgid "gone"
 msgstr ""
 
-#: wt-status.c:1679 wt-status.c:1687
+#: wt-status.c:1677 wt-status.c:1685
 msgid "behind "
 msgstr ""
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:403
+#: compat/precompose_utf8.c:56 builtin/clone.c:408
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr ""
@@ -2038,7 +2084,7 @@
 msgid "unexpected diff status %c"
 msgstr ""
 
-#: builtin/add.c:70 builtin/commit.c:277
+#: builtin/add.c:70 builtin/commit.c:278
 msgid "updating files failed"
 msgstr ""
 
@@ -2051,7 +2097,7 @@
 msgid "Unstaged changes after refreshing the index:"
 msgstr ""
 
-#: builtin/add.c:194 builtin/rev-parse.c:799
+#: builtin/add.c:194 builtin/rev-parse.c:796
 msgid "Could not read the index"
 msgstr ""
 
@@ -2086,15 +2132,15 @@
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
 
-#: builtin/add.c:249 builtin/clean.c:896 builtin/fetch.c:108 builtin/mv.c:110
-#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:545
-#: builtin/remote.c:1339 builtin/rm.c:268 builtin/send-pack.c:162
+#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:543
+#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162
 msgid "dry run"
 msgstr ""
 
-#: builtin/add.c:250 builtin/apply.c:4580 builtin/check-ignore.c:19
-#: builtin/commit.c:1321 builtin/count-objects.c:63 builtin/fsck.c:636
-#: builtin/log.c:1641 builtin/mv.c:109 builtin/read-tree.c:114
+#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19
+#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
+#: builtin/log.c:1645 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr ""
 
@@ -2102,7 +2148,7 @@
 msgid "interactive picking"
 msgstr ""
 
-#: builtin/add.c:253 builtin/checkout.c:1152 builtin/reset.c:286
+#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr ""
 
@@ -2159,181 +2205,181 @@
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr ""
 
-#: builtin/add.c:358
+#: builtin/add.c:352
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr ""
 
-#: builtin/add.c:359
+#: builtin/add.c:353
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr ""
 
-#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:940
-#: builtin/commit.c:336 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938
+#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:40
 msgid "index file corrupt"
 msgstr ""
 
-#: builtin/add.c:445 builtin/apply.c:4678 builtin/mv.c:279 builtin/rm.c:430
+#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430
 msgid "Unable to write new index file"
 msgstr ""
 
-#: builtin/am.c:41
+#: builtin/am.c:42
 #, c-format
 msgid "could not stat %s"
 msgstr ""
 
-#: builtin/am.c:270 builtin/am.c:1345 builtin/commit.c:737
-#: builtin/merge.c:1079
+#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077
 #, c-format
 msgid "could not read '%s'"
 msgstr ""
 
-#: builtin/am.c:444
+#: builtin/am.c:445
 msgid "could not parse author script"
 msgstr ""
 
-#: builtin/am.c:521
+#: builtin/am.c:522
 #, c-format
 msgid "'%s' was deleted by the applypatch-msg hook"
 msgstr ""
 
-#: builtin/am.c:562 builtin/notes.c:300
+#: builtin/am.c:563 builtin/notes.c:300
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr ""
 
-#: builtin/am.c:599 builtin/notes.c:315
+#: builtin/am.c:600 builtin/notes.c:315
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr ""
 
-#: builtin/am.c:625
+#: builtin/am.c:626
 msgid "fseek failed"
 msgstr ""
 
-#: builtin/am.c:786 builtin/am.c:874
+#: builtin/am.c:787 builtin/am.c:875
 #, c-format
 msgid "could not open '%s' for reading: %s"
 msgstr ""
 
-#: builtin/am.c:793
+#: builtin/am.c:794
 #, c-format
 msgid "could not open '%s' for writing: %s"
 msgstr ""
 
-#: builtin/am.c:802
+#: builtin/am.c:803
 #, c-format
 msgid "could not parse patch '%s'"
 msgstr ""
 
-#: builtin/am.c:867
+#: builtin/am.c:868
 msgid "Only one StGIT patch series can be applied at once"
 msgstr ""
 
-#: builtin/am.c:915
+#: builtin/am.c:916
 msgid "invalid timestamp"
 msgstr ""
 
-#: builtin/am.c:918 builtin/am.c:926
+#: builtin/am.c:919 builtin/am.c:927
 msgid "invalid Date line"
 msgstr ""
 
-#: builtin/am.c:923
+#: builtin/am.c:924
 msgid "invalid timezone offset"
 msgstr ""
 
-#: builtin/am.c:1010
+#: builtin/am.c:1011
 msgid "Patch format detection failed."
 msgstr ""
 
-#: builtin/am.c:1015 builtin/clone.c:368
+#: builtin/am.c:1016 builtin/clone.c:373
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr ""
 
-#: builtin/am.c:1019
+#: builtin/am.c:1020
 msgid "Failed to split patches."
 msgstr ""
 
-#: builtin/am.c:1151 builtin/commit.c:362
+#: builtin/am.c:1152 builtin/commit.c:363
 msgid "unable to write index file"
 msgstr ""
 
-#: builtin/am.c:1202
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr ""
-
 #: builtin/am.c:1203
 #, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgid "When you have resolved this problem, run \"%s --continue\"."
 msgstr ""
 
 #: builtin/am.c:1204
 #, c-format
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr ""
+
+#: builtin/am.c:1205
+#, c-format
 msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr ""
 
-#: builtin/am.c:1339
+#: builtin/am.c:1343
 msgid "Patch is empty. Was it split wrong?"
 msgstr ""
 
-#: builtin/am.c:1413 builtin/log.c:1345
+#: builtin/am.c:1417 builtin/log.c:1347
 #, c-format
 msgid "invalid ident line: %s"
 msgstr ""
 
-#: builtin/am.c:1440
+#: builtin/am.c:1444
 #, c-format
 msgid "unable to parse commit %s"
 msgstr ""
 
-#: builtin/am.c:1614
+#: builtin/am.c:1646
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 
-#: builtin/am.c:1616
+#: builtin/am.c:1648
 msgid "Using index info to reconstruct a base tree..."
 msgstr ""
 
-#: builtin/am.c:1635
+#: builtin/am.c:1667
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
 msgstr ""
 
-#: builtin/am.c:1641
+#: builtin/am.c:1673
 msgid "Falling back to patching base and 3-way merge..."
 msgstr ""
 
-#: builtin/am.c:1666
+#: builtin/am.c:1688
 msgid "Failed to merge in the changes."
 msgstr ""
 
-#: builtin/am.c:1691 builtin/merge.c:632
+#: builtin/am.c:1712 builtin/merge.c:632
 msgid "git write-tree failed to write a tree"
 msgstr ""
 
-#: builtin/am.c:1698
+#: builtin/am.c:1719
 msgid "applying to an empty history"
 msgstr ""
 
-#: builtin/am.c:1711 builtin/commit.c:1752 builtin/merge.c:829
+#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829
 #: builtin/merge.c:854
 msgid "failed to write commit object"
 msgstr ""
 
-#: builtin/am.c:1743 builtin/am.c:1747
+#: builtin/am.c:1764 builtin/am.c:1768
 #, c-format
 msgid "cannot resume: %s does not exist."
 msgstr ""
 
-#: builtin/am.c:1763
+#: builtin/am.c:1784
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 
-#: builtin/am.c:1768
+#: builtin/am.c:1789
 msgid "Commit Body is:"
 msgstr ""
 
@@ -2341,229 +2387,231 @@
 #. in your translation. The program will only accept English
 #. input at this point.
 #.
-#: builtin/am.c:1778
+#: builtin/am.c:1799
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 msgstr ""
 
-#: builtin/am.c:1828
+#: builtin/am.c:1849
 #, c-format
 msgid "Dirty index: cannot apply patches (dirty: %s)"
 msgstr ""
 
-#: builtin/am.c:1863 builtin/am.c:1934
+#: builtin/am.c:1884 builtin/am.c:1955
 #, c-format
 msgid "Applying: %.*s"
 msgstr ""
 
-#: builtin/am.c:1879
+#: builtin/am.c:1900
 msgid "No changes -- Patch already applied."
 msgstr ""
 
-#: builtin/am.c:1887
+#: builtin/am.c:1908
 #, c-format
 msgid "Patch failed at %s %.*s"
 msgstr ""
 
-#: builtin/am.c:1893
+#: builtin/am.c:1914
 #, c-format
 msgid "The copy of the patch that failed is found in: %s"
 msgstr ""
 
-#: builtin/am.c:1937
+#: builtin/am.c:1958
 msgid ""
 "No changes - did you forget to use 'git add'?\n"
 "If there is nothing left to stage, chances are that something else\n"
 "already introduced the same changes; you might want to skip this patch."
 msgstr ""
 
-#: builtin/am.c:1944
+#: builtin/am.c:1965
 msgid ""
 "You still have unmerged paths in your index.\n"
 "Did you forget to use 'git add'?"
 msgstr ""
 
-#: builtin/am.c:2052 builtin/am.c:2056 builtin/am.c:2068 builtin/reset.c:308
+#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308
 #: builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr ""
 
-#: builtin/am.c:2104
+#: builtin/am.c:2125
 msgid "failed to clean index"
 msgstr ""
 
-#: builtin/am.c:2138
+#: builtin/am.c:2159
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
 msgstr ""
 
-#: builtin/am.c:2199
+#: builtin/am.c:2220
 #, c-format
 msgid "Invalid value for --patch-format: %s"
 msgstr ""
 
-#: builtin/am.c:2221
-msgid "git am [options] [(<mbox>|<Maildir>)...]"
+#: builtin/am.c:2253
+msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
 msgstr ""
 
-#: builtin/am.c:2222
-msgid "git am [options] (--continue | --skip | --abort)"
+#: builtin/am.c:2254
+msgid "git am [<options>] (--continue | --skip | --abort)"
 msgstr ""
 
-#: builtin/am.c:2228
+#: builtin/am.c:2260
 msgid "run interactively"
 msgstr ""
 
-#: builtin/am.c:2230
+#: builtin/am.c:2262
 msgid "historical option -- no-op"
 msgstr ""
 
-#: builtin/am.c:2232
+#: builtin/am.c:2264
 msgid "allow fall back on 3way merging if needed"
 msgstr ""
 
-#: builtin/am.c:2233 builtin/init-db.c:509 builtin/prune-packed.c:57
+#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57
 #: builtin/repack.c:171
 msgid "be quiet"
 msgstr ""
 
-#: builtin/am.c:2235
+#: builtin/am.c:2267
 msgid "add a Signed-off-by line to the commit message"
 msgstr ""
 
-#: builtin/am.c:2238
+#: builtin/am.c:2270
 msgid "recode into utf8 (default)"
 msgstr ""
 
-#: builtin/am.c:2240
+#: builtin/am.c:2272
 msgid "pass -k flag to git-mailinfo"
 msgstr ""
 
-#: builtin/am.c:2242
+#: builtin/am.c:2274
 msgid "pass -b flag to git-mailinfo"
 msgstr ""
 
-#: builtin/am.c:2244
+#: builtin/am.c:2276
 msgid "pass -m flag to git-mailinfo"
 msgstr ""
 
-#: builtin/am.c:2246
+#: builtin/am.c:2278
 msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr ""
 
-#: builtin/am.c:2249
+#: builtin/am.c:2281
 msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr ""
 
-#: builtin/am.c:2252
+#: builtin/am.c:2284
 msgid "strip everything before a scissors line"
 msgstr ""
 
-#: builtin/am.c:2253 builtin/apply.c:4563
+#: builtin/am.c:2285 builtin/apply.c:4554
 msgid "action"
 msgstr ""
 
-#: builtin/am.c:2254 builtin/am.c:2257 builtin/am.c:2260 builtin/am.c:2263
-#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
-#: builtin/am.c:2281
+#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295
+#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307
+#: builtin/am.c:2313
 msgid "pass it through git-apply"
 msgstr ""
 
-#: builtin/am.c:2262 builtin/apply.c:4587
+#: builtin/am.c:2294 builtin/apply.c:4578
 msgid "root"
 msgstr ""
 
-#: builtin/am.c:2265 builtin/am.c:2268 builtin/apply.c:4525
-#: builtin/apply.c:4528 builtin/clone.c:85 builtin/fetch.c:93
-#: builtin/pull.c:167
+#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516
+#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93
+#: builtin/pull.c:167 builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
 msgid "path"
 msgstr ""
 
-#: builtin/am.c:2271 builtin/fmt-merge-msg.c:669 builtin/fmt-merge-msg.c:672
-#: builtin/grep.c:698 builtin/merge.c:198 builtin/pull.c:127
-#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:664
-#: builtin/show-ref.c:180 builtin/tag.c:591 parse-options.h:132
-#: parse-options.h:134 parse-options.h:243
+#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
+#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127
+#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645
+#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
+#: parse-options.h:134 parse-options.h:244
 msgid "n"
 msgstr ""
 
-#: builtin/am.c:2274 builtin/apply.c:4531
+#: builtin/am.c:2306 builtin/apply.c:4522
 msgid "num"
 msgstr ""
 
-#: builtin/am.c:2277 builtin/for-each-ref.c:34 builtin/replace.c:438
+#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
 msgid "format"
 msgstr ""
 
-#: builtin/am.c:2278
+#: builtin/am.c:2310
 msgid "format the patch(es) are in"
 msgstr ""
 
-#: builtin/am.c:2284
+#: builtin/am.c:2316
 msgid "override error message when patch failure occurs"
 msgstr ""
 
-#: builtin/am.c:2286
+#: builtin/am.c:2318
 msgid "continue applying patches after resolving a conflict"
 msgstr ""
 
-#: builtin/am.c:2289
+#: builtin/am.c:2321
 msgid "synonyms for --continue"
 msgstr ""
 
-#: builtin/am.c:2292
+#: builtin/am.c:2324
 msgid "skip the current patch"
 msgstr ""
 
-#: builtin/am.c:2295
+#: builtin/am.c:2327
 msgid "restore the original branch and abort the patching operation."
 msgstr ""
 
-#: builtin/am.c:2299
+#: builtin/am.c:2331
 msgid "lie about committer date"
 msgstr ""
 
-#: builtin/am.c:2301
+#: builtin/am.c:2333
 msgid "use current timestamp for author date"
 msgstr ""
 
-#: builtin/am.c:2303 builtin/commit.c:1590 builtin/merge.c:225
-#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:606
+#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225
+#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355
 msgid "key-id"
 msgstr ""
 
-#: builtin/am.c:2304
+#: builtin/am.c:2336
 msgid "GPG-sign commits"
 msgstr ""
 
-#: builtin/am.c:2307
+#: builtin/am.c:2339
 msgid "(internal use for git-rebase)"
 msgstr ""
 
-#: builtin/am.c:2322
+#: builtin/am.c:2354
 msgid ""
 "The -b/--binary option has been a no-op for long time, and\n"
 "it will be removed. Please do not use it anymore."
 msgstr ""
 
-#: builtin/am.c:2329
+#: builtin/am.c:2361
 msgid "failed to read the index"
 msgstr ""
 
-#: builtin/am.c:2344
+#: builtin/am.c:2376
 #, c-format
 msgid "previous rebase directory %s still exists but mbox given."
 msgstr ""
 
-#: builtin/am.c:2368
+#: builtin/am.c:2400
 #, c-format
 msgid ""
 "Stray %s directory found.\n"
 "Use \"git am --abort\" to remove it."
 msgstr ""
 
-#: builtin/am.c:2374
+#: builtin/am.c:2406
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr ""
 
@@ -2571,62 +2619,62 @@
 msgid "git apply [<options>] [<patch>...]"
 msgstr ""
 
-#: builtin/apply.c:112
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
 msgstr ""
 
-#: builtin/apply.c:127
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr ""
 
-#: builtin/apply.c:822
+#: builtin/apply.c:818
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr ""
 
-#: builtin/apply.c:831
+#: builtin/apply.c:827
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr ""
 
-#: builtin/apply.c:912
+#: builtin/apply.c:908
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr ""
 
-#: builtin/apply.c:944
+#: builtin/apply.c:940
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
 
-#: builtin/apply.c:948
+#: builtin/apply.c:944
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr ""
 
-#: builtin/apply.c:949
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr ""
 
-#: builtin/apply.c:956
+#: builtin/apply.c:952
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr ""
 
-#: builtin/apply.c:1419
+#: builtin/apply.c:1415
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr ""
 
-#: builtin/apply.c:1476
+#: builtin/apply.c:1472
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr ""
 
-#: builtin/apply.c:1493
+#: builtin/apply.c:1489
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2637,396 +2685,396 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/apply.c:1659
+#: builtin/apply.c:1655
 msgid "new file depends on old contents"
 msgstr ""
 
-#: builtin/apply.c:1661
+#: builtin/apply.c:1657
 msgid "deleted file still has contents"
 msgstr ""
 
-#: builtin/apply.c:1687
+#: builtin/apply.c:1683
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr ""
 
-#: builtin/apply.c:1723
+#: builtin/apply.c:1719
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr ""
 
-#: builtin/apply.c:1725
+#: builtin/apply.c:1721
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr ""
 
-#: builtin/apply.c:1728
+#: builtin/apply.c:1724
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr ""
 
-#: builtin/apply.c:1874
+#: builtin/apply.c:1870
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr ""
 
-#: builtin/apply.c:1903
+#: builtin/apply.c:1899
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr ""
 
-#: builtin/apply.c:2054
+#: builtin/apply.c:2050
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr ""
 
-#: builtin/apply.c:2144
+#: builtin/apply.c:2140
 #, c-format
 msgid "unable to read symlink %s"
 msgstr ""
 
-#: builtin/apply.c:2148
+#: builtin/apply.c:2144
 #, c-format
 msgid "unable to open or read %s"
 msgstr ""
 
-#: builtin/apply.c:2781
+#: builtin/apply.c:2777
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr ""
 
-#: builtin/apply.c:2900
+#: builtin/apply.c:2896
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2908
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr ""
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2914
 #, c-format
 msgid ""
 "while searching for:\n"
 "%.*s"
 msgstr ""
 
-#: builtin/apply.c:2938
+#: builtin/apply.c:2934
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr ""
 
-#: builtin/apply.c:3039
+#: builtin/apply.c:3035
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr ""
 
-#: builtin/apply.c:3045
+#: builtin/apply.c:3041
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
 
-#: builtin/apply.c:3066
+#: builtin/apply.c:3062
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr ""
 
-#: builtin/apply.c:3190
+#: builtin/apply.c:3186
 #, c-format
 msgid "cannot checkout %s"
 msgstr ""
 
-#: builtin/apply.c:3235 builtin/apply.c:3246 builtin/apply.c:3291
+#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
 #, c-format
 msgid "read of %s failed"
 msgstr ""
 
-#: builtin/apply.c:3243
+#: builtin/apply.c:3239
 #, c-format
 msgid "reading from '%s' beyond a symbolic link"
 msgstr ""
 
-#: builtin/apply.c:3271 builtin/apply.c:3493
+#: builtin/apply.c:3267 builtin/apply.c:3489
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr ""
 
-#: builtin/apply.c:3352 builtin/apply.c:3507
+#: builtin/apply.c:3348 builtin/apply.c:3503
 #, c-format
 msgid "%s: does not exist in index"
 msgstr ""
 
-#: builtin/apply.c:3356 builtin/apply.c:3499 builtin/apply.c:3521
+#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
 #, c-format
 msgid "%s: %s"
 msgstr ""
 
-#: builtin/apply.c:3361 builtin/apply.c:3515
+#: builtin/apply.c:3357 builtin/apply.c:3511
 #, c-format
 msgid "%s: does not match index"
 msgstr ""
 
-#: builtin/apply.c:3463
+#: builtin/apply.c:3459
 msgid "removal patch leaves file contents"
 msgstr ""
 
-#: builtin/apply.c:3532
+#: builtin/apply.c:3528
 #, c-format
 msgid "%s: wrong type"
 msgstr ""
 
-#: builtin/apply.c:3534
+#: builtin/apply.c:3530
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr ""
 
-#: builtin/apply.c:3693 builtin/apply.c:3695
+#: builtin/apply.c:3689 builtin/apply.c:3691
 #, c-format
 msgid "invalid path '%s'"
 msgstr ""
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3746
 #, c-format
 msgid "%s: already exists in index"
 msgstr ""
 
-#: builtin/apply.c:3753
+#: builtin/apply.c:3749
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr ""
 
-#: builtin/apply.c:3773
+#: builtin/apply.c:3769
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr ""
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3774
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr ""
 
-#: builtin/apply.c:3798
+#: builtin/apply.c:3794
 #, c-format
 msgid "affected file '%s' is beyond a symbolic link"
 msgstr ""
 
-#: builtin/apply.c:3802
+#: builtin/apply.c:3798
 #, c-format
 msgid "%s: patch does not apply"
 msgstr ""
 
-#: builtin/apply.c:3816
+#: builtin/apply.c:3812
 #, c-format
 msgid "Checking patch %s..."
 msgstr ""
 
-#: builtin/apply.c:3909 builtin/checkout.c:232 builtin/reset.c:135
+#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr ""
 
-#: builtin/apply.c:4052
+#: builtin/apply.c:4048
 #, c-format
 msgid "unable to remove %s from index"
 msgstr ""
 
-#: builtin/apply.c:4081
+#: builtin/apply.c:4077
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr ""
 
-#: builtin/apply.c:4085
+#: builtin/apply.c:4081
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr ""
 
-#: builtin/apply.c:4090
+#: builtin/apply.c:4086
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr ""
 
-#: builtin/apply.c:4093 builtin/apply.c:4201
+#: builtin/apply.c:4089 builtin/apply.c:4197
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr ""
 
-#: builtin/apply.c:4126
+#: builtin/apply.c:4122
 #, c-format
 msgid "closing file '%s'"
 msgstr ""
 
-#: builtin/apply.c:4175
+#: builtin/apply.c:4171
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr ""
 
-#: builtin/apply.c:4262
+#: builtin/apply.c:4258
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr ""
 
-#: builtin/apply.c:4270
+#: builtin/apply.c:4266
 msgid "internal error"
 msgstr ""
 
-#: builtin/apply.c:4273
+#: builtin/apply.c:4269
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/apply.c:4283
+#: builtin/apply.c:4279
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr ""
 
-#: builtin/apply.c:4304
+#: builtin/apply.c:4300
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr ""
 
-#: builtin/apply.c:4307
+#: builtin/apply.c:4303
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr ""
 
-#: builtin/apply.c:4397
+#: builtin/apply.c:4393
 msgid "unrecognized input"
 msgstr ""
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4404
 msgid "unable to read index file"
 msgstr ""
 
-#: builtin/apply.c:4526
+#: builtin/apply.c:4517
 msgid "don't apply changes matching the given path"
 msgstr ""
 
-#: builtin/apply.c:4529
+#: builtin/apply.c:4520
 msgid "apply changes matching the given path"
 msgstr ""
 
-#: builtin/apply.c:4532
+#: builtin/apply.c:4523
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr ""
 
-#: builtin/apply.c:4535
+#: builtin/apply.c:4526
 msgid "ignore additions made by the patch"
 msgstr ""
 
-#: builtin/apply.c:4537
+#: builtin/apply.c:4528
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr ""
 
-#: builtin/apply.c:4541
+#: builtin/apply.c:4532
 msgid "show number of added and deleted lines in decimal notation"
 msgstr ""
 
-#: builtin/apply.c:4543
+#: builtin/apply.c:4534
 msgid "instead of applying the patch, output a summary for the input"
 msgstr ""
 
-#: builtin/apply.c:4545
+#: builtin/apply.c:4536
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr ""
 
-#: builtin/apply.c:4547
+#: builtin/apply.c:4538
 msgid "make sure the patch is applicable to the current index"
 msgstr ""
 
-#: builtin/apply.c:4549
+#: builtin/apply.c:4540
 msgid "apply a patch without touching the working tree"
 msgstr ""
 
-#: builtin/apply.c:4551
+#: builtin/apply.c:4542
 msgid "accept a patch that touches outside the working area"
 msgstr ""
 
-#: builtin/apply.c:4553
+#: builtin/apply.c:4544
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr ""
 
-#: builtin/apply.c:4555
+#: builtin/apply.c:4546
 msgid "attempt three-way merge if a patch does not apply"
 msgstr ""
 
-#: builtin/apply.c:4557
+#: builtin/apply.c:4548
 msgid "build a temporary index based on embedded index information"
 msgstr ""
 
-#: builtin/apply.c:4559 builtin/checkout-index.c:198 builtin/ls-files.c:412
+#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412
 msgid "paths are separated with NUL character"
 msgstr ""
 
-#: builtin/apply.c:4562
+#: builtin/apply.c:4553
 msgid "ensure at least <n> lines of context match"
 msgstr ""
 
-#: builtin/apply.c:4564
+#: builtin/apply.c:4555
 msgid "detect new or modified lines that have whitespace errors"
 msgstr ""
 
-#: builtin/apply.c:4567 builtin/apply.c:4570
+#: builtin/apply.c:4558 builtin/apply.c:4561
 msgid "ignore changes in whitespace when finding context"
 msgstr ""
 
-#: builtin/apply.c:4573
+#: builtin/apply.c:4564
 msgid "apply the patch in reverse"
 msgstr ""
 
-#: builtin/apply.c:4575
+#: builtin/apply.c:4566
 msgid "don't expect at least one line of context"
 msgstr ""
 
-#: builtin/apply.c:4577
+#: builtin/apply.c:4568
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr ""
 
-#: builtin/apply.c:4579
+#: builtin/apply.c:4570
 msgid "allow overlapping hunks"
 msgstr ""
 
-#: builtin/apply.c:4582
+#: builtin/apply.c:4573
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr ""
 
-#: builtin/apply.c:4585
+#: builtin/apply.c:4576
 msgid "do not trust the line counts in the hunk headers"
 msgstr ""
 
-#: builtin/apply.c:4588
+#: builtin/apply.c:4579
 msgid "prepend <root> to all filenames"
 msgstr ""
 
-#: builtin/apply.c:4610
+#: builtin/apply.c:4601
 msgid "--3way outside a repository"
 msgstr ""
 
-#: builtin/apply.c:4618
+#: builtin/apply.c:4609
 msgid "--index outside a repository"
 msgstr ""
 
-#: builtin/apply.c:4621
+#: builtin/apply.c:4612
 msgid "--cached outside a repository"
 msgstr ""
 
-#: builtin/apply.c:4640
+#: builtin/apply.c:4631
 #, c-format
 msgid "can't open patch '%s'"
 msgstr ""
 
-#: builtin/apply.c:4654
+#: builtin/apply.c:4645
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/apply.c:4660 builtin/apply.c:4670
+#: builtin/apply.c:4651 builtin/apply.c:4661
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -3088,95 +3136,95 @@
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr ""
 
-#: builtin/blame.c:2500
+#: builtin/blame.c:2519
 msgid "Show blame entries as we find them, incrementally"
 msgstr ""
 
-#: builtin/blame.c:2501
+#: builtin/blame.c:2520
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2502
+#: builtin/blame.c:2521
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2503
+#: builtin/blame.c:2522
 msgid "Show work cost statistics"
 msgstr ""
 
-#: builtin/blame.c:2504
+#: builtin/blame.c:2523
 msgid "Show output score for blame entries"
 msgstr ""
 
-#: builtin/blame.c:2505
+#: builtin/blame.c:2524
 msgid "Show original filename (Default: auto)"
 msgstr ""
 
-#: builtin/blame.c:2506
+#: builtin/blame.c:2525
 msgid "Show original linenumber (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2507
+#: builtin/blame.c:2526
 msgid "Show in a format designed for machine consumption"
 msgstr ""
 
-#: builtin/blame.c:2508
+#: builtin/blame.c:2527
 msgid "Show porcelain format with per-line commit information"
 msgstr ""
 
-#: builtin/blame.c:2509
+#: builtin/blame.c:2528
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2510
+#: builtin/blame.c:2529
 msgid "Show raw timestamp (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2511
+#: builtin/blame.c:2530
 msgid "Show long commit SHA1 (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2512
+#: builtin/blame.c:2531
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2513
+#: builtin/blame.c:2532
 msgid "Show author email instead of name (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2514
+#: builtin/blame.c:2533
 msgid "Ignore whitespace differences"
 msgstr ""
 
-#: builtin/blame.c:2515
+#: builtin/blame.c:2534
 msgid "Spend extra cycles to find better match"
 msgstr ""
 
-#: builtin/blame.c:2516
+#: builtin/blame.c:2535
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr ""
 
-#: builtin/blame.c:2517
+#: builtin/blame.c:2536
 msgid "Use <file>'s contents as the final image"
 msgstr ""
 
-#: builtin/blame.c:2518 builtin/blame.c:2519
+#: builtin/blame.c:2537 builtin/blame.c:2538
 msgid "score"
 msgstr ""
 
-#: builtin/blame.c:2518
+#: builtin/blame.c:2537
 msgid "Find line copies within and across files"
 msgstr ""
 
-#: builtin/blame.c:2519
+#: builtin/blame.c:2538
 msgid "Find line movements within and across files"
 msgstr ""
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "n,m"
 msgstr ""
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "Process only line range n,m, counting from 1"
 msgstr ""
 
@@ -3186,396 +3234,392 @@
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2601
+#: builtin/blame.c:2620
 msgid "4 years, 11 months ago"
 msgstr ""
 
-#: builtin/branch.c:24
+#: builtin/branch.c:25
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr ""
 
-#: builtin/branch.c:25
+#: builtin/branch.c:26
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr ""
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr ""
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr ""
 
-#: builtin/branch.c:150
+#: builtin/branch.c:29
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr ""
+
+#: builtin/branch.c:142
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
 "         '%s', but not yet merged to HEAD."
 msgstr ""
 
-#: builtin/branch.c:154
+#: builtin/branch.c:146
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
 "         '%s', even though it is merged to HEAD."
 msgstr ""
 
-#: builtin/branch.c:168
+#: builtin/branch.c:160
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr ""
 
-#: builtin/branch.c:172
+#: builtin/branch.c:164
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
 "If you are sure you want to delete it, run 'git branch -D %s'."
 msgstr ""
 
-#: builtin/branch.c:185
+#: builtin/branch.c:177
 msgid "Update of config-file failed"
 msgstr ""
 
-#: builtin/branch.c:213
+#: builtin/branch.c:205
 msgid "cannot use -a with -d"
 msgstr ""
 
-#: builtin/branch.c:219
+#: builtin/branch.c:211
 msgid "Couldn't look up commit object for HEAD"
 msgstr ""
 
-#: builtin/branch.c:227
+#: builtin/branch.c:219
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr ""
 
-#: builtin/branch.c:243
+#: builtin/branch.c:235
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr ""
 
-#: builtin/branch.c:244
+#: builtin/branch.c:236
 #, c-format
 msgid "branch '%s' not found."
 msgstr ""
 
-#: builtin/branch.c:259
+#: builtin/branch.c:251
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr ""
 
-#: builtin/branch.c:260
+#: builtin/branch.c:252
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr ""
 
-#: builtin/branch.c:267
+#: builtin/branch.c:259
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr ""
 
-#: builtin/branch.c:268
+#: builtin/branch.c:260
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr ""
 
-#: builtin/branch.c:369
-#, c-format
-msgid "branch '%s' does not point at a commit"
-msgstr ""
-
-#: builtin/branch.c:452
+#: builtin/branch.c:303
 #, c-format
 msgid "[%s: gone]"
 msgstr ""
 
-#: builtin/branch.c:457
+#: builtin/branch.c:308
 #, c-format
 msgid "[%s]"
 msgstr ""
 
-#: builtin/branch.c:462
+#: builtin/branch.c:313
 #, c-format
 msgid "[%s: behind %d]"
 msgstr ""
 
-#: builtin/branch.c:464
+#: builtin/branch.c:315
 #, c-format
 msgid "[behind %d]"
 msgstr ""
 
-#: builtin/branch.c:468
+#: builtin/branch.c:319
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr ""
 
-#: builtin/branch.c:470
+#: builtin/branch.c:321
 #, c-format
 msgid "[ahead %d]"
 msgstr ""
 
-#: builtin/branch.c:473
+#: builtin/branch.c:324
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr ""
 
-#: builtin/branch.c:476
+#: builtin/branch.c:327
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr ""
 
-#: builtin/branch.c:489
+#: builtin/branch.c:340
 msgid " **** invalid ref ****"
 msgstr ""
 
-#: builtin/branch.c:580
+#: builtin/branch.c:366
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr ""
 
-#: builtin/branch.c:583
+#: builtin/branch.c:369
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr ""
 
-#: builtin/branch.c:589
+#: builtin/branch.c:375
 #, c-format
 msgid "(HEAD detached at %s)"
 msgstr ""
 
-#: builtin/branch.c:592
+#: builtin/branch.c:378
 #, c-format
 msgid "(HEAD detached from %s)"
 msgstr ""
 
-#: builtin/branch.c:596
+#: builtin/branch.c:382
 msgid "(no branch)"
 msgstr ""
 
-#: builtin/branch.c:643
-#, c-format
-msgid "object '%s' does not point to a commit"
-msgstr ""
-
-#: builtin/branch.c:691
-msgid "some refs could not be read"
-msgstr ""
-
-#: builtin/branch.c:704
+#: builtin/branch.c:524
 msgid "cannot rename the current branch while not on any."
 msgstr ""
 
-#: builtin/branch.c:714
+#: builtin/branch.c:534
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr ""
 
-#: builtin/branch.c:729
+#: builtin/branch.c:549
 msgid "Branch rename failed"
 msgstr ""
 
-#: builtin/branch.c:733
+#: builtin/branch.c:553
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr ""
 
-#: builtin/branch.c:737
+#: builtin/branch.c:557
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr ""
 
-#: builtin/branch.c:744
+#: builtin/branch.c:564
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 
-#: builtin/branch.c:759
-#, c-format
-msgid "malformed object name %s"
-msgstr ""
-
-#: builtin/branch.c:781
+#: builtin/branch.c:587
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr ""
 
-#: builtin/branch.c:811
+#: builtin/branch.c:616
 msgid "Generic options"
 msgstr ""
 
-#: builtin/branch.c:813
+#: builtin/branch.c:618
 msgid "show hash and subject, give twice for upstream branch"
 msgstr ""
 
-#: builtin/branch.c:814
+#: builtin/branch.c:619
 msgid "suppress informational messages"
 msgstr ""
 
-#: builtin/branch.c:815
+#: builtin/branch.c:620
 msgid "set up tracking mode (see git-pull(1))"
 msgstr ""
 
-#: builtin/branch.c:817
+#: builtin/branch.c:622
 msgid "change upstream info"
 msgstr ""
 
-#: builtin/branch.c:821
+#: builtin/branch.c:626
 msgid "use colored output"
 msgstr ""
 
-#: builtin/branch.c:822
+#: builtin/branch.c:627
 msgid "act on remote-tracking branches"
 msgstr ""
 
-#: builtin/branch.c:825 builtin/branch.c:831 builtin/branch.c:852
-#: builtin/branch.c:858 builtin/commit.c:1580 builtin/commit.c:1581
-#: builtin/commit.c:1582 builtin/commit.c:1583 builtin/tag.c:618
-#: builtin/tag.c:624
-msgid "commit"
-msgstr ""
-
-#: builtin/branch.c:826 builtin/branch.c:832
+#: builtin/branch.c:629 builtin/branch.c:630
 msgid "print only branches that contain the commit"
 msgstr ""
 
-#: builtin/branch.c:838
+#: builtin/branch.c:633
 msgid "Specific git-branch actions:"
 msgstr ""
 
-#: builtin/branch.c:839
+#: builtin/branch.c:634
 msgid "list both remote-tracking and local branches"
 msgstr ""
 
-#: builtin/branch.c:841
+#: builtin/branch.c:636
 msgid "delete fully merged branch"
 msgstr ""
 
-#: builtin/branch.c:842
+#: builtin/branch.c:637
 msgid "delete branch (even if not merged)"
 msgstr ""
 
-#: builtin/branch.c:843
+#: builtin/branch.c:638
 msgid "move/rename a branch and its reflog"
 msgstr ""
 
-#: builtin/branch.c:844
+#: builtin/branch.c:639
 msgid "move/rename a branch, even if target exists"
 msgstr ""
 
-#: builtin/branch.c:845
+#: builtin/branch.c:640
 msgid "list branch names"
 msgstr ""
 
-#: builtin/branch.c:846
+#: builtin/branch.c:641
 msgid "create the branch's reflog"
 msgstr ""
 
-#: builtin/branch.c:848
+#: builtin/branch.c:643
 msgid "edit the description for the branch"
 msgstr ""
 
-#: builtin/branch.c:849
+#: builtin/branch.c:644
 msgid "force creation, move/rename, deletion"
 msgstr ""
 
-#: builtin/branch.c:852
-msgid "print only not merged branches"
+#: builtin/branch.c:645
+msgid "print only branches that are merged"
 msgstr ""
 
-#: builtin/branch.c:858
-msgid "print only merged branches"
+#: builtin/branch.c:646
+msgid "print only branches that are not merged"
 msgstr ""
 
-#: builtin/branch.c:862
+#: builtin/branch.c:647
 msgid "list branches in columns"
 msgstr ""
 
-#: builtin/branch.c:875
+#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
+msgstr ""
+
+#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
+msgstr ""
+
+#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398
+#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564
+#: builtin/tag.c:369
+msgid "object"
+msgstr ""
+
+#: builtin/branch.c:652
+msgid "print only branches of the object"
+msgstr ""
+
+#: builtin/branch.c:670
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr ""
 
-#: builtin/branch.c:879 builtin/clone.c:690
+#: builtin/branch.c:674 builtin/clone.c:697
 msgid "HEAD not found below refs/heads!"
 msgstr ""
 
-#: builtin/branch.c:901
+#: builtin/branch.c:694
 msgid "--column and --verbose are incompatible"
 msgstr ""
 
-#: builtin/branch.c:912 builtin/branch.c:951
+#: builtin/branch.c:705 builtin/branch.c:747
 msgid "branch name required"
 msgstr ""
 
-#: builtin/branch.c:927
+#: builtin/branch.c:723
 msgid "Cannot give description to detached HEAD"
 msgstr ""
 
-#: builtin/branch.c:932
+#: builtin/branch.c:728
 msgid "cannot edit description of more than one branch"
 msgstr ""
 
-#: builtin/branch.c:939
+#: builtin/branch.c:735
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr ""
 
-#: builtin/branch.c:942
+#: builtin/branch.c:738
 #, c-format
 msgid "No branch named '%s'."
 msgstr ""
 
-#: builtin/branch.c:957
+#: builtin/branch.c:753
 msgid "too many branches for a rename operation"
 msgstr ""
 
-#: builtin/branch.c:962
+#: builtin/branch.c:758
 msgid "too many branches to set new upstream"
 msgstr ""
 
-#: builtin/branch.c:966
+#: builtin/branch.c:762
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr ""
 
-#: builtin/branch.c:969 builtin/branch.c:991 builtin/branch.c:1012
+#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808
 #, c-format
 msgid "no such branch '%s'"
 msgstr ""
 
-#: builtin/branch.c:973
+#: builtin/branch.c:769
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr ""
 
-#: builtin/branch.c:985
+#: builtin/branch.c:781
 msgid "too many branches to unset upstream"
 msgstr ""
 
-#: builtin/branch.c:989
+#: builtin/branch.c:785
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 
-#: builtin/branch.c:995
+#: builtin/branch.c:791
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr ""
 
-#: builtin/branch.c:1009
+#: builtin/branch.c:805
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr ""
 
-#: builtin/branch.c:1015
+#: builtin/branch.c:811
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 
-#: builtin/branch.c:1018
+#: builtin/branch.c:814
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
 "track or --set-upstream-to\n"
 msgstr ""
 
-#: builtin/branch.c:1035
+#: builtin/branch.c:831
 #, c-format
 msgid ""
 "\n"
@@ -3583,12 +3627,12 @@
 "\n"
 msgstr ""
 
-#: builtin/branch.c:1036
+#: builtin/branch.c:832
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr ""
 
-#: builtin/branch.c:1037
+#: builtin/branch.c:833
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr ""
@@ -3613,9 +3657,7 @@
 msgstr ""
 
 #: builtin/cat-file.c:429
-msgid ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <list-of-"
-"objects>"
+msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
 msgstr ""
 
 #: builtin/cat-file.c:466
@@ -3671,7 +3713,7 @@
 msgstr ""
 
 #: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...] < <list-of-paths>"
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
 msgstr ""
 
 #: builtin/check-attr.c:19
@@ -3690,7 +3732,7 @@
 msgid "terminate input and output records by a NUL character"
 msgstr ""
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1133 builtin/gc.c:267
+#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr ""
 
@@ -3776,6 +3818,8 @@
 msgstr ""
 
 #: builtin/checkout-index.c:204 builtin/column.c:30
+#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181
 msgid "string"
 msgstr ""
 
@@ -3795,105 +3839,105 @@
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr ""
 
-#: builtin/checkout.c:133 builtin/checkout.c:166
+#: builtin/checkout.c:134 builtin/checkout.c:167
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr ""
 
-#: builtin/checkout.c:135 builtin/checkout.c:168
+#: builtin/checkout.c:136 builtin/checkout.c:169
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr ""
 
-#: builtin/checkout.c:151
+#: builtin/checkout.c:152
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr ""
 
-#: builtin/checkout.c:195
+#: builtin/checkout.c:196
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr ""
 
-#: builtin/checkout.c:212
+#: builtin/checkout.c:213
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr ""
 
-#: builtin/checkout.c:229
+#: builtin/checkout.c:230
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr ""
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
+#: builtin/checkout.c:260
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr ""
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:263 builtin/checkout.c:266
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr ""
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:269
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 
-#: builtin/checkout.c:279 builtin/checkout.c:473
+#: builtin/checkout.c:280 builtin/checkout.c:474
 msgid "corrupt index file"
 msgstr ""
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:340 builtin/checkout.c:347
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr ""
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:496
 msgid "you need to resolve your current index first"
 msgstr ""
 
-#: builtin/checkout.c:622
+#: builtin/checkout.c:623
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr ""
 
-#: builtin/checkout.c:660
+#: builtin/checkout.c:661
 msgid "HEAD is now at"
 msgstr ""
 
-#: builtin/checkout.c:667
+#: builtin/checkout.c:668
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:670
+#: builtin/checkout.c:671
 #, c-format
 msgid "Already on '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:674
+#: builtin/checkout.c:675
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:676 builtin/checkout.c:1065
+#: builtin/checkout.c:677 builtin/checkout.c:1066
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:678
+#: builtin/checkout.c:679
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:731
 #, c-format
 msgid " ... and %d more.\n"
 msgstr ""
 
-#: builtin/checkout.c:736
+#: builtin/checkout.c:737
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -3908,7 +3952,7 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/checkout.c:755
+#: builtin/checkout.c:756
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -3925,156 +3969,162 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/checkout.c:791
+#: builtin/checkout.c:792
 msgid "internal error in revision walk"
 msgstr ""
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:796
 msgid "Previous HEAD position was"
 msgstr ""
 
-#: builtin/checkout.c:822 builtin/checkout.c:1060
+#: builtin/checkout.c:823 builtin/checkout.c:1061
 msgid "You are on a branch yet to be born"
 msgstr ""
 
-#: builtin/checkout.c:967
+#: builtin/checkout.c:968
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr ""
 
-#: builtin/checkout.c:1006 builtin/worktree.c:210
+#: builtin/checkout.c:1007 builtin/worktree.c:213
 #, c-format
 msgid "invalid reference: %s"
 msgstr ""
 
-#: builtin/checkout.c:1035
+#: builtin/checkout.c:1036
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr ""
 
-#: builtin/checkout.c:1074
+#: builtin/checkout.c:1075
 msgid "paths cannot be used with switching branches"
 msgstr ""
 
-#: builtin/checkout.c:1077 builtin/checkout.c:1081
+#: builtin/checkout.c:1078 builtin/checkout.c:1082
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr ""
 
-#: builtin/checkout.c:1085 builtin/checkout.c:1088 builtin/checkout.c:1093
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094
+#: builtin/checkout.c:1097
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr ""
 
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1102
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr ""
 
-#: builtin/checkout.c:1134 builtin/checkout.c:1136 builtin/clone.c:83
-#: builtin/remote.c:159 builtin/remote.c:161 builtin/worktree.c:317
-#: builtin/worktree.c:319
+#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320
+#: builtin/worktree.c:322
 msgid "branch"
 msgstr ""
 
-#: builtin/checkout.c:1135
+#: builtin/checkout.c:1136
 msgid "create and checkout a new branch"
 msgstr ""
 
-#: builtin/checkout.c:1137
+#: builtin/checkout.c:1138
 msgid "create/reset and checkout a branch"
 msgstr ""
 
-#: builtin/checkout.c:1138
+#: builtin/checkout.c:1139
 msgid "create reflog for new branch"
 msgstr ""
 
-#: builtin/checkout.c:1139
+#: builtin/checkout.c:1140
 msgid "detach the HEAD at named commit"
 msgstr ""
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "set upstream info for new branch"
 msgstr ""
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new-branch"
 msgstr ""
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new unparented branch"
 msgstr ""
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "checkout our version for unmerged files"
 msgstr ""
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "checkout their version for unmerged files"
 msgstr ""
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1148
 msgid "force checkout (throw away local modifications)"
 msgstr ""
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "perform a 3-way merge with the new branch"
 msgstr ""
 
-#: builtin/checkout.c:1149 builtin/merge.c:227
+#: builtin/checkout.c:1150 builtin/merge.c:227
 msgid "update ignored files (default)"
 msgstr ""
 
-#: builtin/checkout.c:1150 builtin/log.c:1264 parse-options.h:249
+#: builtin/checkout.c:1151 builtin/log.c:1266 parse-options.h:250
 msgid "style"
 msgstr ""
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "conflict style (merge or diff3)"
 msgstr ""
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "do not limit pathspecs to sparse entries only"
 msgstr ""
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1157
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr ""
 
-#: builtin/checkout.c:1158
+#: builtin/checkout.c:1159
 msgid "do not check if another worktree is holding the given ref"
 msgstr ""
 
-#: builtin/checkout.c:1181
+#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112
+#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:558
+#: builtin/send-pack.c:168
+msgid "force progress reporting"
+msgstr ""
+
+#: builtin/checkout.c:1191
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr ""
 
-#: builtin/checkout.c:1198
+#: builtin/checkout.c:1208
 msgid "--track needs a branch name"
 msgstr ""
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1213
 msgid "Missing branch name; try -b"
 msgstr ""
 
-#: builtin/checkout.c:1239
+#: builtin/checkout.c:1249
 msgid "invalid path specification"
 msgstr ""
 
-#: builtin/checkout.c:1246
+#: builtin/checkout.c:1256
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
 "Did you intend to checkout '%s' which can not be resolved as commit?"
 msgstr ""
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1261
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr ""
 
-#: builtin/checkout.c:1255
+#: builtin/checkout.c:1265
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4110,7 +4160,7 @@
 msgid "failed to remove %s"
 msgstr ""
 
-#: builtin/clean.c:317
+#: builtin/clean.c:315
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -4118,7 +4168,7 @@
 "           - (empty) select nothing"
 msgstr ""
 
-#: builtin/clean.c:321
+#: builtin/clean.c:319
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -4130,36 +4180,36 @@
 "           - (empty) finish selecting"
 msgstr ""
 
-#: builtin/clean.c:537
+#: builtin/clean.c:535
 #, c-format
 msgid "Huh (%s)?"
 msgstr ""
 
-#: builtin/clean.c:679
+#: builtin/clean.c:677
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr ""
 
-#: builtin/clean.c:716
+#: builtin/clean.c:714
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr ""
 
-#: builtin/clean.c:737
+#: builtin/clean.c:735
 msgid "Select items to delete"
 msgstr ""
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:778
+#: builtin/clean.c:776
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr ""
 
-#: builtin/clean.c:803
+#: builtin/clean.c:801
 msgid "Bye."
 msgstr ""
 
-#: builtin/clean.c:811
+#: builtin/clean.c:809
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -4170,68 +4220,68 @@
 "?                   - help for prompt selection"
 msgstr ""
 
-#: builtin/clean.c:838
+#: builtin/clean.c:836
 msgid "*** Commands ***"
 msgstr ""
 
-#: builtin/clean.c:839
+#: builtin/clean.c:837
 msgid "What now"
 msgstr ""
 
-#: builtin/clean.c:847
+#: builtin/clean.c:845
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/clean.c:864
+#: builtin/clean.c:862
 msgid "No more files to clean, exiting."
 msgstr ""
 
-#: builtin/clean.c:895
+#: builtin/clean.c:893
 msgid "do not print names of files removed"
 msgstr ""
 
-#: builtin/clean.c:897
+#: builtin/clean.c:895
 msgid "force"
 msgstr ""
 
-#: builtin/clean.c:898
+#: builtin/clean.c:896
 msgid "interactive cleaning"
 msgstr ""
 
-#: builtin/clean.c:900
+#: builtin/clean.c:898
 msgid "remove whole directories"
 msgstr ""
 
-#: builtin/clean.c:901 builtin/describe.c:407 builtin/grep.c:714
-#: builtin/ls-files.c:443 builtin/name-rev.c:311 builtin/show-ref.c:187
+#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709
+#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182
 msgid "pattern"
 msgstr ""
 
-#: builtin/clean.c:902
+#: builtin/clean.c:900
 msgid "add <pattern> to ignore rules"
 msgstr ""
 
-#: builtin/clean.c:903
+#: builtin/clean.c:901
 msgid "remove ignored files, too"
 msgstr ""
 
-#: builtin/clean.c:905
+#: builtin/clean.c:903
 msgid "remove only ignored files"
 msgstr ""
 
-#: builtin/clean.c:923
+#: builtin/clean.c:921
 msgid "-x and -X cannot be used together"
 msgstr ""
 
-#: builtin/clean.c:927
+#: builtin/clean.c:925
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
 msgstr ""
 
-#: builtin/clean.c:930
+#: builtin/clean.c:928
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -4241,16 +4291,11 @@
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr ""
 
-#: builtin/clone.c:57 builtin/fetch.c:112 builtin/merge.c:224
-#: builtin/pull.c:109 builtin/push.c:560 builtin/send-pack.c:168
-msgid "force progress reporting"
-msgstr ""
-
 #: builtin/clone.c:59
 msgid "don't create a checkout"
 msgstr ""
 
-#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:504
+#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469
 msgid "create a bare repository"
 msgstr ""
 
@@ -4274,15 +4319,15 @@
 msgid "initialize submodules in the clone"
 msgstr ""
 
-#: builtin/clone.c:75 builtin/init-db.c:501
+#: builtin/clone.c:75 builtin/init-db.c:466
 msgid "template-directory"
 msgstr ""
 
-#: builtin/clone.c:76 builtin/init-db.c:502
+#: builtin/clone.c:76 builtin/init-db.c:467
 msgid "directory from which templates will be used"
 msgstr ""
 
-#: builtin/clone.c:78
+#: builtin/clone.c:78 builtin/submodule--helper.c:179
 msgid "reference repository"
 msgstr ""
 
@@ -4306,7 +4351,7 @@
 msgid "path to git-upload-pack on the remote"
 msgstr ""
 
-#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:659
+#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654
 #: builtin/pull.c:186
 msgid "depth"
 msgstr ""
@@ -4319,11 +4364,11 @@
 msgid "clone only one branch, HEAD or --branch"
 msgstr ""
 
-#: builtin/clone.c:91 builtin/init-db.c:510
+#: builtin/clone.c:91 builtin/init-db.c:475
 msgid "gitdir"
 msgstr ""
 
-#: builtin/clone.c:92 builtin/init-db.c:511
+#: builtin/clone.c:92 builtin/init-db.c:476
 msgid "separate git dir from working tree"
 msgstr ""
 
@@ -4335,173 +4380,174 @@
 msgid "set config inside the new repository"
 msgstr ""
 
-#: builtin/clone.c:298
+#: builtin/clone.c:300
 #, c-format
-msgid "reference repository '%s' is not a local repository."
+msgid "reference repository '%s' as a linked checkout is not supported yet."
 msgstr ""
 
 #: builtin/clone.c:302
 #, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr ""
+
+#: builtin/clone.c:307
+#, c-format
 msgid "reference repository '%s' is shallow"
 msgstr ""
 
-#: builtin/clone.c:305
+#: builtin/clone.c:310
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr ""
 
-#: builtin/clone.c:370 builtin/diff.c:84
+#: builtin/clone.c:375 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr ""
 
-#: builtin/clone.c:372
+#: builtin/clone.c:377
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr ""
 
-#: builtin/clone.c:386
+#: builtin/clone.c:391
 #, c-format
 msgid "failed to stat %s\n"
 msgstr ""
 
-#: builtin/clone.c:408
+#: builtin/clone.c:413
 #, c-format
 msgid "failed to create link '%s'"
 msgstr ""
 
-#: builtin/clone.c:412
+#: builtin/clone.c:417
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr ""
 
-#: builtin/clone.c:435 builtin/clone.c:619
+#: builtin/clone.c:442 builtin/clone.c:626
 #, c-format
 msgid "done.\n"
 msgstr ""
 
-#: builtin/clone.c:447
+#: builtin/clone.c:454
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
 "and retry the checkout with 'git checkout -f HEAD'\n"
 msgstr ""
 
-#: builtin/clone.c:524
+#: builtin/clone.c:531
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr ""
 
-#: builtin/clone.c:614
+#: builtin/clone.c:621
 #, c-format
 msgid "Checking connectivity... "
 msgstr ""
 
-#: builtin/clone.c:617
+#: builtin/clone.c:624
 msgid "remote did not send all necessary objects"
 msgstr ""
 
-#: builtin/clone.c:681
+#: builtin/clone.c:688
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 
-#: builtin/clone.c:712
+#: builtin/clone.c:719
 msgid "unable to checkout working tree"
 msgstr ""
 
-#: builtin/clone.c:799
+#: builtin/clone.c:808
 msgid "cannot repack to clean up"
 msgstr ""
 
-#: builtin/clone.c:801
+#: builtin/clone.c:810
 msgid "cannot unlink temporary alternates file"
 msgstr ""
 
-#: builtin/clone.c:831
+#: builtin/clone.c:842
 msgid "Too many arguments."
 msgstr ""
 
-#: builtin/clone.c:835
+#: builtin/clone.c:846
 msgid "You must specify a repository to clone."
 msgstr ""
 
-#: builtin/clone.c:846
+#: builtin/clone.c:857
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr ""
 
-#: builtin/clone.c:849
+#: builtin/clone.c:860
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr ""
 
-#: builtin/clone.c:862
+#: builtin/clone.c:873
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr ""
 
-#: builtin/clone.c:868 builtin/fetch.c:1168
+#: builtin/clone.c:879 builtin/fetch.c:1166
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr ""
 
-#: builtin/clone.c:878
+#: builtin/clone.c:889
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr ""
 
-#: builtin/clone.c:888
+#: builtin/clone.c:899
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr ""
 
-#: builtin/clone.c:903 builtin/clone.c:914 builtin/worktree.c:218
-#: builtin/worktree.c:245
+#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224
+#: builtin/worktree.c:221 builtin/worktree.c:248
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr ""
 
-#: builtin/clone.c:906
+#: builtin/clone.c:917
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr ""
 
-#: builtin/clone.c:924
+#: builtin/clone.c:935
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr ""
 
-#: builtin/clone.c:926
+#: builtin/clone.c:937
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr ""
 
-#: builtin/clone.c:951
-msgid "--dissociate given, but there is no --reference"
-msgstr ""
-
-#: builtin/clone.c:968
+#: builtin/clone.c:975
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 
-#: builtin/clone.c:971
+#: builtin/clone.c:978
 msgid "source repository is shallow, ignoring --local"
 msgstr ""
 
-#: builtin/clone.c:976
+#: builtin/clone.c:983
 msgid "--local is ignored"
 msgstr ""
 
-#: builtin/clone.c:980
+#: builtin/clone.c:987
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr ""
 
-#: builtin/clone.c:1029 builtin/clone.c:1037
+#: builtin/clone.c:1036 builtin/clone.c:1044
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr ""
 
-#: builtin/clone.c:1040
+#: builtin/clone.c:1047
 msgid "You appear to have cloned an empty repository."
 msgstr ""
 
@@ -4537,15 +4583,15 @@
 msgid "--command must be the first argument"
 msgstr ""
 
-#: builtin/commit.c:37
+#: builtin/commit.c:38
 msgid "git commit [<options>] [--] <pathspec>..."
 msgstr ""
 
-#: builtin/commit.c:42
+#: builtin/commit.c:43
 msgid "git status [<options>] [--] <pathspec>..."
 msgstr ""
 
-#: builtin/commit.c:47
+#: builtin/commit.c:48
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4560,7 +4606,7 @@
 "    git commit --amend --reset-author\n"
 msgstr ""
 
-#: builtin/commit.c:60
+#: builtin/commit.c:61
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4574,14 +4620,14 @@
 "    git commit --amend --reset-author\n"
 msgstr ""
 
-#: builtin/commit.c:72
+#: builtin/commit.c:73
 msgid ""
 "You asked to amend the most recent commit, but doing so would make\n"
 "it empty. You can repeat your command with --allow-empty, or you can\n"
 "remove the commit entirely with \"git reset HEAD^\".\n"
 msgstr ""
 
-#: builtin/commit.c:77
+#: builtin/commit.c:78
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4590,11 +4636,11 @@
 "\n"
 msgstr ""
 
-#: builtin/commit.c:84
+#: builtin/commit.c:85
 msgid "Otherwise, please use 'git reset'\n"
 msgstr ""
 
-#: builtin/commit.c:87
+#: builtin/commit.c:88
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4604,103 +4650,103 @@
 "the remaining commits.\n"
 msgstr ""
 
-#: builtin/commit.c:304
+#: builtin/commit.c:305
 msgid "failed to unpack HEAD tree object"
 msgstr ""
 
-#: builtin/commit.c:345
+#: builtin/commit.c:346
 msgid "unable to create temporary index"
 msgstr ""
 
-#: builtin/commit.c:351
+#: builtin/commit.c:352
 msgid "interactive add failed"
 msgstr ""
 
-#: builtin/commit.c:364
+#: builtin/commit.c:365
 msgid "unable to update temporary index"
 msgstr ""
 
-#: builtin/commit.c:366
+#: builtin/commit.c:367
 msgid "Failed to update main cache tree"
 msgstr ""
 
-#: builtin/commit.c:390 builtin/commit.c:413 builtin/commit.c:462
+#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
 msgid "unable to write new_index file"
 msgstr ""
 
-#: builtin/commit.c:444
+#: builtin/commit.c:445
 msgid "cannot do a partial commit during a merge."
 msgstr ""
 
-#: builtin/commit.c:446
+#: builtin/commit.c:447
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr ""
 
-#: builtin/commit.c:455
+#: builtin/commit.c:456
 msgid "cannot read the index"
 msgstr ""
 
-#: builtin/commit.c:474
+#: builtin/commit.c:475
 msgid "unable to write temporary index file"
 msgstr ""
 
-#: builtin/commit.c:579
+#: builtin/commit.c:580
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr ""
 
-#: builtin/commit.c:581
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr ""
 
-#: builtin/commit.c:600
+#: builtin/commit.c:601
 msgid "malformed --author parameter"
 msgstr ""
 
-#: builtin/commit.c:608
+#: builtin/commit.c:609
 #, c-format
 msgid "invalid date format: %s"
 msgstr ""
 
-#: builtin/commit.c:652
+#: builtin/commit.c:653
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
 msgstr ""
 
-#: builtin/commit.c:689 builtin/commit.c:722 builtin/commit.c:1079
+#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
 #, c-format
 msgid "could not lookup commit %s"
 msgstr ""
 
-#: builtin/commit.c:701 builtin/shortlog.c:273
+#: builtin/commit.c:702 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr ""
 
-#: builtin/commit.c:703
+#: builtin/commit.c:704
 msgid "could not read log from standard input"
 msgstr ""
 
-#: builtin/commit.c:707
+#: builtin/commit.c:708
 #, c-format
 msgid "could not read log file '%s'"
 msgstr ""
 
-#: builtin/commit.c:729
+#: builtin/commit.c:730
 msgid "could not read MERGE_MSG"
 msgstr ""
 
-#: builtin/commit.c:733
+#: builtin/commit.c:734
 msgid "could not read SQUASH_MSG"
 msgstr ""
 
-#: builtin/commit.c:784
+#: builtin/commit.c:785
 msgid "could not write commit template"
 msgstr ""
 
-#: builtin/commit.c:802
+#: builtin/commit.c:803
 #, c-format
 msgid ""
 "\n"
@@ -4710,7 +4756,7 @@
 "and try again.\n"
 msgstr ""
 
-#: builtin/commit.c:807
+#: builtin/commit.c:808
 #, c-format
 msgid ""
 "\n"
@@ -4720,14 +4766,14 @@
 "and try again.\n"
 msgstr ""
 
-#: builtin/commit.c:820
+#: builtin/commit.c:821
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
 "with '%c' will be ignored, and an empty message aborts the commit.\n"
 msgstr ""
 
-#: builtin/commit.c:827
+#: builtin/commit.c:828
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4735,335 +4781,341 @@
 "An empty message aborts the commit.\n"
 msgstr ""
 
-#: builtin/commit.c:847
+#: builtin/commit.c:848
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr ""
 
-#: builtin/commit.c:855
+#: builtin/commit.c:856
 #, c-format
 msgid "%sDate:      %s"
 msgstr ""
 
-#: builtin/commit.c:862
+#: builtin/commit.c:863
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr ""
 
-#: builtin/commit.c:880
+#: builtin/commit.c:881
 msgid "Cannot read index"
 msgstr ""
 
-#: builtin/commit.c:937
+#: builtin/commit.c:938
 msgid "Error building trees"
 msgstr ""
 
-#: builtin/commit.c:952 builtin/tag.c:495
+#: builtin/commit.c:953 builtin/tag.c:266
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr ""
 
-#: builtin/commit.c:1054
+#: builtin/commit.c:1055
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 
-#: builtin/commit.c:1069 builtin/commit.c:1309
+#: builtin/commit.c:1070 builtin/commit.c:1310
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr ""
 
-#: builtin/commit.c:1106
+#: builtin/commit.c:1107
 msgid "--long and -z are incompatible"
 msgstr ""
 
-#: builtin/commit.c:1136
+#: builtin/commit.c:1137
 msgid "Using both --reset-author and --author does not make sense"
 msgstr ""
 
-#: builtin/commit.c:1145
+#: builtin/commit.c:1146
 msgid "You have nothing to amend."
 msgstr ""
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1149
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr ""
 
-#: builtin/commit.c:1150
+#: builtin/commit.c:1151
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr ""
 
-#: builtin/commit.c:1153
+#: builtin/commit.c:1154
 msgid "Options --squash and --fixup cannot be used together"
 msgstr ""
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1164
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr ""
 
-#: builtin/commit.c:1165
+#: builtin/commit.c:1166
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr ""
 
-#: builtin/commit.c:1173
+#: builtin/commit.c:1174
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr ""
 
-#: builtin/commit.c:1190
+#: builtin/commit.c:1191
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 
-#: builtin/commit.c:1192
+#: builtin/commit.c:1193
 msgid "No paths with --include/--only does not make sense."
 msgstr ""
 
-#: builtin/commit.c:1194
+#: builtin/commit.c:1195
 msgid "Clever... amending the last one with dirty index."
 msgstr ""
 
-#: builtin/commit.c:1196
+#: builtin/commit.c:1197
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
 
-#: builtin/commit.c:1208 builtin/tag.c:730
+#: builtin/commit.c:1209 builtin/tag.c:475
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr ""
 
-#: builtin/commit.c:1213
+#: builtin/commit.c:1214
 msgid "Paths with -a does not make sense."
 msgstr ""
 
-#: builtin/commit.c:1323 builtin/commit.c:1602
+#: builtin/commit.c:1324 builtin/commit.c:1605
 msgid "show status concisely"
 msgstr ""
 
-#: builtin/commit.c:1325 builtin/commit.c:1604
+#: builtin/commit.c:1326 builtin/commit.c:1607
 msgid "show branch information"
 msgstr ""
 
-#: builtin/commit.c:1327 builtin/commit.c:1606 builtin/push.c:546
+#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:544
+#: builtin/worktree.c:423
 msgid "machine-readable output"
 msgstr ""
 
-#: builtin/commit.c:1330 builtin/commit.c:1608
+#: builtin/commit.c:1331 builtin/commit.c:1611
 msgid "show status in long format (default)"
 msgstr ""
 
-#: builtin/commit.c:1333 builtin/commit.c:1611
+#: builtin/commit.c:1334 builtin/commit.c:1614
 msgid "terminate entries with NUL"
 msgstr ""
 
-#: builtin/commit.c:1335 builtin/commit.c:1614 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:604
+#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:353
 msgid "mode"
 msgstr ""
 
-#: builtin/commit.c:1336 builtin/commit.c:1614
+#: builtin/commit.c:1337 builtin/commit.c:1617
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 
-#: builtin/commit.c:1339
+#: builtin/commit.c:1340
 msgid "show ignored files"
 msgstr ""
 
-#: builtin/commit.c:1340 parse-options.h:155
+#: builtin/commit.c:1341 parse-options.h:155
 msgid "when"
 msgstr ""
 
-#: builtin/commit.c:1341
+#: builtin/commit.c:1342
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr ""
 
-#: builtin/commit.c:1343
+#: builtin/commit.c:1344
 msgid "list untracked files in columns"
 msgstr ""
 
-#: builtin/commit.c:1429
+#: builtin/commit.c:1430
 msgid "couldn't look up newly created commit"
 msgstr ""
 
-#: builtin/commit.c:1431
+#: builtin/commit.c:1432
 msgid "could not parse newly created commit"
 msgstr ""
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1477
 msgid "detached HEAD"
 msgstr ""
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1480
 msgid " (root-commit)"
 msgstr ""
 
-#: builtin/commit.c:1572
+#: builtin/commit.c:1575
 msgid "suppress summary after successful commit"
 msgstr ""
 
-#: builtin/commit.c:1573
+#: builtin/commit.c:1576
 msgid "show diff in commit message template"
 msgstr ""
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1578
 msgid "Commit message options"
 msgstr ""
 
-#: builtin/commit.c:1576 builtin/tag.c:602
+#: builtin/commit.c:1579 builtin/tag.c:351
 msgid "read message from file"
 msgstr ""
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "author"
 msgstr ""
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "override author for commit"
 msgstr ""
 
-#: builtin/commit.c:1578 builtin/gc.c:268
+#: builtin/commit.c:1581 builtin/gc.c:326
 msgid "date"
 msgstr ""
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1581
 msgid "override date for commit"
 msgstr ""
 
-#: builtin/commit.c:1579 builtin/merge.c:218 builtin/notes.c:392
-#: builtin/notes.c:555 builtin/tag.c:600
+#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392
+#: builtin/notes.c:555 builtin/tag.c:349
 msgid "message"
 msgstr ""
 
-#: builtin/commit.c:1579
+#: builtin/commit.c:1582
 msgid "commit message"
 msgstr ""
 
-#: builtin/commit.c:1580
-msgid "reuse and edit message from specified commit"
-msgstr ""
-
-#: builtin/commit.c:1581
-msgid "reuse message from specified commit"
-msgstr ""
-
-#: builtin/commit.c:1582
-msgid "use autosquash formatted message to fixup specified commit"
+#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
+#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
+msgid "commit"
 msgstr ""
 
 #: builtin/commit.c:1583
-msgid "use autosquash formatted message to squash specified commit"
+msgid "reuse and edit message from specified commit"
 msgstr ""
 
 #: builtin/commit.c:1584
-msgid "the commit is authored by me now (used with -C/-c/--amend)"
+msgid "reuse message from specified commit"
 msgstr ""
 
-#: builtin/commit.c:1585 builtin/log.c:1216 builtin/revert.c:86
-msgid "add Signed-off-by:"
+#: builtin/commit.c:1585
+msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 
 #: builtin/commit.c:1586
-msgid "use specified template file"
+msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 
 #: builtin/commit.c:1587
-msgid "force edit of commit"
+msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
 
-#: builtin/commit.c:1588
-msgid "default"
-msgstr ""
-
-#: builtin/commit.c:1588 builtin/tag.c:605
-msgid "how to strip spaces and #comments from message"
+#: builtin/commit.c:1588 builtin/log.c:1216 builtin/revert.c:86
+msgid "add Signed-off-by:"
 msgstr ""
 
 #: builtin/commit.c:1589
+msgid "use specified template file"
+msgstr ""
+
+#: builtin/commit.c:1590
+msgid "force edit of commit"
+msgstr ""
+
+#: builtin/commit.c:1591
+msgid "default"
+msgstr ""
+
+#: builtin/commit.c:1591 builtin/tag.c:354
+msgid "how to strip spaces and #comments from message"
+msgstr ""
+
+#: builtin/commit.c:1592
 msgid "include status in commit message template"
 msgstr ""
 
-#: builtin/commit.c:1591 builtin/merge.c:226 builtin/pull.c:156
+#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr ""
 
-#: builtin/commit.c:1594
+#: builtin/commit.c:1597
 msgid "Commit contents options"
 msgstr ""
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1598
 msgid "commit all changed files"
 msgstr ""
 
-#: builtin/commit.c:1596
+#: builtin/commit.c:1599
 msgid "add specified files to index for commit"
 msgstr ""
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1600
 msgid "interactively add files"
 msgstr ""
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1601
 msgid "interactively add changes"
 msgstr ""
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1602
 msgid "commit only specified files"
 msgstr ""
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1603
 msgid "bypass pre-commit hook"
 msgstr ""
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1604
 msgid "show what would be committed"
 msgstr ""
 
-#: builtin/commit.c:1612
+#: builtin/commit.c:1615
 msgid "amend previous commit"
 msgstr ""
 
-#: builtin/commit.c:1613
+#: builtin/commit.c:1616
 msgid "bypass post-rewrite hook"
 msgstr ""
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1621
 msgid "ok to record an empty change"
 msgstr ""
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1623
 msgid "ok to record a change with an empty message"
 msgstr ""
 
-#: builtin/commit.c:1649
+#: builtin/commit.c:1652
 msgid "could not parse HEAD commit"
 msgstr ""
 
-#: builtin/commit.c:1695
+#: builtin/commit.c:1698
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr ""
 
-#: builtin/commit.c:1702
+#: builtin/commit.c:1705
 msgid "could not read MERGE_MODE"
 msgstr ""
 
-#: builtin/commit.c:1721
+#: builtin/commit.c:1724
 #, c-format
 msgid "could not read commit message: %s"
 msgstr ""
 
-#: builtin/commit.c:1732
+#: builtin/commit.c:1735
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr ""
 
-#: builtin/commit.c:1737
+#: builtin/commit.c:1740
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr ""
 
-#: builtin/commit.c:1785
+#: builtin/commit.c:1788
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -5198,11 +5250,11 @@
 msgid "respect include directives on lookup"
 msgstr ""
 
-#: builtin/config.c:311
+#: builtin/config.c:303
 msgid "unable to parse default color value"
 msgstr ""
 
-#: builtin/config.c:449
+#: builtin/config.c:441
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5212,16 +5264,16 @@
 "#\temail = %s\n"
 msgstr ""
 
-#: builtin/config.c:583
+#: builtin/config.c:575
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr ""
 
-#: builtin/count-objects.c:55
+#: builtin/count-objects.c:77
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr ""
 
-#: builtin/count-objects.c:65
+#: builtin/count-objects.c:87
 msgid "print sizes in human readable format"
 msgstr ""
 
@@ -5335,7 +5387,7 @@
 msgid "only consider tags matching <pattern>"
 msgstr ""
 
-#: builtin/describe.c:410 builtin/name-rev.c:318
+#: builtin/describe.c:410 builtin/name-rev.c:314
 msgid "show abbreviated commit object as fallback"
 msgstr ""
 
@@ -5554,7 +5606,7 @@
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr ""
 
-#: builtin/fetch.c:478 builtin/fetch.c:564
+#: builtin/fetch.c:478 builtin/fetch.c:566
 msgid "[rejected]"
 msgstr ""
 
@@ -5578,125 +5630,125 @@
 msgid "[new ref]"
 msgstr ""
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "unable to update local ref"
 msgstr ""
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "forced update"
 msgstr ""
 
-#: builtin/fetch.c:566
+#: builtin/fetch.c:568
 msgid "(non-fast-forward)"
 msgstr ""
 
-#: builtin/fetch.c:600 builtin/fetch.c:842
+#: builtin/fetch.c:602 builtin/fetch.c:843
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr ""
 
-#: builtin/fetch.c:609
+#: builtin/fetch.c:611
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr ""
 
-#: builtin/fetch.c:627
+#: builtin/fetch.c:629
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 
-#: builtin/fetch.c:715 builtin/fetch.c:807
+#: builtin/fetch.c:716 builtin/fetch.c:808
 #, c-format
 msgid "From %.*s\n"
 msgstr ""
 
-#: builtin/fetch.c:726
+#: builtin/fetch.c:727
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
 " 'git remote prune %s' to remove any old, conflicting branches"
 msgstr ""
 
-#: builtin/fetch.c:778
+#: builtin/fetch.c:779
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr ""
 
-#: builtin/fetch.c:779
+#: builtin/fetch.c:780
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr ""
 
-#: builtin/fetch.c:811
+#: builtin/fetch.c:812
 msgid "[deleted]"
 msgstr ""
 
-#: builtin/fetch.c:812 builtin/remote.c:1034
+#: builtin/fetch.c:813 builtin/remote.c:1040
 msgid "(none)"
 msgstr ""
 
-#: builtin/fetch.c:832
+#: builtin/fetch.c:833
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr ""
 
-#: builtin/fetch.c:851
+#: builtin/fetch.c:852
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr ""
 
-#: builtin/fetch.c:854
+#: builtin/fetch.c:855
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr ""
 
-#: builtin/fetch.c:910
+#: builtin/fetch.c:911
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr ""
 
-#: builtin/fetch.c:1071
+#: builtin/fetch.c:1072
 #, c-format
 msgid "Fetching %s\n"
 msgstr ""
 
-#: builtin/fetch.c:1073 builtin/remote.c:90
+#: builtin/fetch.c:1074 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr ""
 
-#: builtin/fetch.c:1091
+#: builtin/fetch.c:1092
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
 msgstr ""
 
-#: builtin/fetch.c:1114
+#: builtin/fetch.c:1115
 msgid "You need to specify a tag name."
 msgstr ""
 
-#: builtin/fetch.c:1156
+#: builtin/fetch.c:1157
 msgid "--depth and --unshallow cannot be used together"
 msgstr ""
 
-#: builtin/fetch.c:1158
+#: builtin/fetch.c:1159
 msgid "--unshallow on a complete repository does not make sense"
 msgstr ""
 
-#: builtin/fetch.c:1181
+#: builtin/fetch.c:1179
 msgid "fetch --all does not take a repository argument"
 msgstr ""
 
-#: builtin/fetch.c:1183
+#: builtin/fetch.c:1181
 msgid "fetch --all does not make sense with refspecs"
 msgstr ""
 
-#: builtin/fetch.c:1194
+#: builtin/fetch.c:1192
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr ""
 
-#: builtin/fetch.c:1202
+#: builtin/fetch.c:1200
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr ""
 
@@ -5705,23 +5757,23 @@
 "git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:667
 msgid "populate log with at most <n> entries from shortlog"
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:670
 msgid "alias for --log (deprecated)"
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:676
+#: builtin/fmt-merge-msg.c:673
 msgid "text"
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:677
+#: builtin/fmt-merge-msg.c:674
 msgid "use <text> as start of message"
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:678
+#: builtin/fmt-merge-msg.c:675
 msgid "file to read from"
 msgstr ""
 
@@ -5729,95 +5781,115 @@
 msgid "git for-each-ref [<options>] [<pattern>]"
 msgstr ""
 
-#: builtin/for-each-ref.c:24
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
+msgstr ""
+
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+msgstr ""
+
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
+msgstr ""
+
+#: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
 msgstr ""
 
-#: builtin/for-each-ref.c:26
+#: builtin/for-each-ref.c:29
 msgid "quote placeholders suitably for perl"
 msgstr ""
 
-#: builtin/for-each-ref.c:28
+#: builtin/for-each-ref.c:31
 msgid "quote placeholders suitably for python"
 msgstr ""
 
-#: builtin/for-each-ref.c:30
+#: builtin/for-each-ref.c:33
 msgid "quote placeholders suitably for Tcl"
 msgstr ""
 
-#: builtin/for-each-ref.c:33
+#: builtin/for-each-ref.c:36
 msgid "show only <n> matched refs"
 msgstr ""
 
-#: builtin/for-each-ref.c:34
+#: builtin/for-each-ref.c:37 builtin/tag.c:372
 msgid "format to use for the output"
 msgstr ""
 
-#: builtin/for-each-ref.c:35
-msgid "key"
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
 msgstr ""
 
-#: builtin/for-each-ref.c:36
-msgid "field name to sort on"
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
 msgstr ""
 
-#: builtin/fsck.c:163 builtin/prune.c:137
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr ""
+
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
+msgstr ""
+
+#: builtin/fsck.c:156 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr ""
 
-#: builtin/fsck.c:568
+#: builtin/fsck.c:486
 msgid "Checking object directories"
 msgstr ""
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:553
 msgid "git fsck [<options>] [<object>...]"
 msgstr ""
 
-#: builtin/fsck.c:637
+#: builtin/fsck.c:559
 msgid "show unreachable objects"
 msgstr ""
 
-#: builtin/fsck.c:638
+#: builtin/fsck.c:560
 msgid "show dangling objects"
 msgstr ""
 
-#: builtin/fsck.c:639
+#: builtin/fsck.c:561
 msgid "report tags"
 msgstr ""
 
-#: builtin/fsck.c:640
+#: builtin/fsck.c:562
 msgid "report root nodes"
 msgstr ""
 
-#: builtin/fsck.c:641
+#: builtin/fsck.c:563
 msgid "make index objects head nodes"
 msgstr ""
 
-#: builtin/fsck.c:642
+#: builtin/fsck.c:564
 msgid "make reflogs head nodes (default)"
 msgstr ""
 
-#: builtin/fsck.c:643
+#: builtin/fsck.c:565
 msgid "also consider packs and alternate objects"
 msgstr ""
 
-#: builtin/fsck.c:644
+#: builtin/fsck.c:566
 msgid "check only connectivity"
 msgstr ""
 
-#: builtin/fsck.c:645
+#: builtin/fsck.c:567
 msgid "enable more strict checking"
 msgstr ""
 
-#: builtin/fsck.c:647
+#: builtin/fsck.c:569
 msgid "write dangling objects in .git/lost-found"
 msgstr ""
 
-#: builtin/fsck.c:648 builtin/prune.c:107
+#: builtin/fsck.c:570 builtin/prune.c:107
 msgid "show progress"
 msgstr ""
 
-#: builtin/fsck.c:707
+#: builtin/fsck.c:631
 msgid "Checking objects"
 msgstr ""
 
@@ -5825,54 +5897,64 @@
 msgid "git gc [<options>]"
 msgstr ""
 
-#: builtin/gc.c:55
+#: builtin/gc.c:72
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr ""
 
-#: builtin/gc.c:100
+#: builtin/gc.c:139
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr ""
 
-#: builtin/gc.c:269
+#: builtin/gc.c:290
+#, c-format
+msgid ""
+"The last gc run reported the following. Please correct the root cause\n"
+"and remove %s.\n"
+"Automatic cleanup will not be performed until the file is removed.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: builtin/gc.c:327
 msgid "prune unreferenced objects"
 msgstr ""
 
-#: builtin/gc.c:271
+#: builtin/gc.c:329
 msgid "be more thorough (increased runtime)"
 msgstr ""
 
-#: builtin/gc.c:272
+#: builtin/gc.c:330
 msgid "enable auto-gc mode"
 msgstr ""
 
-#: builtin/gc.c:273
+#: builtin/gc.c:331
 msgid "force running gc even if there may be another gc running"
 msgstr ""
 
-#: builtin/gc.c:315
+#: builtin/gc.c:373
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 
-#: builtin/gc.c:317
+#: builtin/gc.c:375
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr ""
 
-#: builtin/gc.c:318
+#: builtin/gc.c:376
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr ""
 
-#: builtin/gc.c:336
+#: builtin/gc.c:397
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
 msgstr ""
 
-#: builtin/gc.c:364
+#: builtin/gc.c:441
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -5906,199 +5988,195 @@
 msgid "cannot open '%s'"
 msgstr ""
 
-#: builtin/grep.c:638
+#: builtin/grep.c:633
 msgid "search in index instead of in the work tree"
 msgstr ""
 
-#: builtin/grep.c:640
+#: builtin/grep.c:635
 msgid "find in contents not managed by git"
 msgstr ""
 
-#: builtin/grep.c:642
+#: builtin/grep.c:637
 msgid "search in both tracked and untracked files"
 msgstr ""
 
-#: builtin/grep.c:644
+#: builtin/grep.c:639
 msgid "ignore files specified via '.gitignore'"
 msgstr ""
 
-#: builtin/grep.c:647
+#: builtin/grep.c:642
 msgid "show non-matching lines"
 msgstr ""
 
-#: builtin/grep.c:649
+#: builtin/grep.c:644
 msgid "case insensitive matching"
 msgstr ""
 
-#: builtin/grep.c:651
+#: builtin/grep.c:646
 msgid "match patterns only at word boundaries"
 msgstr ""
 
-#: builtin/grep.c:653
+#: builtin/grep.c:648
 msgid "process binary files as text"
 msgstr ""
 
-#: builtin/grep.c:655
+#: builtin/grep.c:650
 msgid "don't match patterns in binary files"
 msgstr ""
 
-#: builtin/grep.c:658
+#: builtin/grep.c:653
 msgid "process binary files with textconv filters"
 msgstr ""
 
-#: builtin/grep.c:660
+#: builtin/grep.c:655
 msgid "descend at most <depth> levels"
 msgstr ""
 
-#: builtin/grep.c:664
+#: builtin/grep.c:659
 msgid "use extended POSIX regular expressions"
 msgstr ""
 
-#: builtin/grep.c:667
+#: builtin/grep.c:662
 msgid "use basic POSIX regular expressions (default)"
 msgstr ""
 
-#: builtin/grep.c:670
+#: builtin/grep.c:665
 msgid "interpret patterns as fixed strings"
 msgstr ""
 
-#: builtin/grep.c:673
+#: builtin/grep.c:668
 msgid "use Perl-compatible regular expressions"
 msgstr ""
 
-#: builtin/grep.c:676
+#: builtin/grep.c:671
 msgid "show line numbers"
 msgstr ""
 
-#: builtin/grep.c:677
+#: builtin/grep.c:672
 msgid "don't show filenames"
 msgstr ""
 
-#: builtin/grep.c:678
+#: builtin/grep.c:673
 msgid "show filenames"
 msgstr ""
 
-#: builtin/grep.c:680
+#: builtin/grep.c:675
 msgid "show filenames relative to top directory"
 msgstr ""
 
-#: builtin/grep.c:682
+#: builtin/grep.c:677
 msgid "show only filenames instead of matching lines"
 msgstr ""
 
-#: builtin/grep.c:684
+#: builtin/grep.c:679
 msgid "synonym for --files-with-matches"
 msgstr ""
 
-#: builtin/grep.c:687
+#: builtin/grep.c:682
 msgid "show only the names of files without match"
 msgstr ""
 
-#: builtin/grep.c:689
+#: builtin/grep.c:684
 msgid "print NUL after filenames"
 msgstr ""
 
-#: builtin/grep.c:691
+#: builtin/grep.c:686
 msgid "show the number of matches instead of matching lines"
 msgstr ""
 
-#: builtin/grep.c:692
+#: builtin/grep.c:687
 msgid "highlight matches"
 msgstr ""
 
-#: builtin/grep.c:694
+#: builtin/grep.c:689
 msgid "print empty line between matches from different files"
 msgstr ""
 
-#: builtin/grep.c:696
+#: builtin/grep.c:691
 msgid "show filename only once above matches from same file"
 msgstr ""
 
-#: builtin/grep.c:699
+#: builtin/grep.c:694
 msgid "show <n> context lines before and after matches"
 msgstr ""
 
-#: builtin/grep.c:702
+#: builtin/grep.c:697
 msgid "show <n> context lines before matches"
 msgstr ""
 
-#: builtin/grep.c:704
+#: builtin/grep.c:699
 msgid "show <n> context lines after matches"
 msgstr ""
 
-#: builtin/grep.c:705
+#: builtin/grep.c:700
 msgid "shortcut for -C NUM"
 msgstr ""
 
-#: builtin/grep.c:708
+#: builtin/grep.c:703
 msgid "show a line with the function name before matches"
 msgstr ""
 
-#: builtin/grep.c:710
+#: builtin/grep.c:705
 msgid "show the surrounding function"
 msgstr ""
 
-#: builtin/grep.c:713
+#: builtin/grep.c:708
 msgid "read patterns from file"
 msgstr ""
 
-#: builtin/grep.c:715
+#: builtin/grep.c:710
 msgid "match <pattern>"
 msgstr ""
 
-#: builtin/grep.c:717
+#: builtin/grep.c:712
 msgid "combine patterns specified with -e"
 msgstr ""
 
-#: builtin/grep.c:729
+#: builtin/grep.c:724
 msgid "indicate hit with exit status without output"
 msgstr ""
 
-#: builtin/grep.c:731
+#: builtin/grep.c:726
 msgid "show only matches from files that match all patterns"
 msgstr ""
 
-#: builtin/grep.c:733
+#: builtin/grep.c:728
 msgid "show parse tree for grep expression"
 msgstr ""
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "pager"
 msgstr ""
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "show matching files in the pager"
 msgstr ""
 
-#: builtin/grep.c:740
+#: builtin/grep.c:735
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr ""
 
-#: builtin/grep.c:741 builtin/show-ref.c:189
-msgid "show usage"
-msgstr ""
-
-#: builtin/grep.c:808
+#: builtin/grep.c:793
 msgid "no pattern given."
 msgstr ""
 
-#: builtin/grep.c:866
+#: builtin/grep.c:851
 msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
 
-#: builtin/grep.c:892
+#: builtin/grep.c:877
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr ""
 
-#: builtin/grep.c:897
+#: builtin/grep.c:882
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr ""
 
-#: builtin/grep.c:900
+#: builtin/grep.c:885
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 
-#: builtin/grep.c:908
+#: builtin/grep.c:893
 msgid "both --cached and trees are given."
 msgstr ""
 
@@ -6109,10 +6187,10 @@
 msgstr ""
 
 #: builtin/hash-object.c:81
-msgid "git hash-object  --stdin-paths < <list-of-paths>"
+msgid "git hash-object  --stdin-paths"
 msgstr ""
 
-#: builtin/hash-object.c:92 builtin/tag.c:614
+#: builtin/hash-object.c:92
 msgid "type"
 msgstr ""
 
@@ -6183,80 +6261,80 @@
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr ""
 
-#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
+#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr ""
 
-#: builtin/help.c:215
+#: builtin/help.c:208
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
 "Please consider using 'man.<tool>.cmd' instead."
 msgstr ""
 
-#: builtin/help.c:227
+#: builtin/help.c:220
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
 "Please consider using 'man.<tool>.path' instead."
 msgstr ""
 
-#: builtin/help.c:354
+#: builtin/help.c:337
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr ""
 
-#: builtin/help.c:371
+#: builtin/help.c:354
 msgid "no man viewer handled the request"
 msgstr ""
 
-#: builtin/help.c:379
+#: builtin/help.c:362
 msgid "no info viewer handled the request"
 msgstr ""
 
-#: builtin/help.c:428
+#: builtin/help.c:411
 msgid "Defining attributes per path"
 msgstr ""
 
-#: builtin/help.c:429
+#: builtin/help.c:412
 msgid "Everyday Git With 20 Commands Or So"
 msgstr ""
 
-#: builtin/help.c:430
+#: builtin/help.c:413
 msgid "A Git glossary"
 msgstr ""
 
-#: builtin/help.c:431
+#: builtin/help.c:414
 msgid "Specifies intentionally untracked files to ignore"
 msgstr ""
 
-#: builtin/help.c:432
+#: builtin/help.c:415
 msgid "Defining submodule properties"
 msgstr ""
 
-#: builtin/help.c:433
+#: builtin/help.c:416
 msgid "Specifying revisions and ranges for Git"
 msgstr ""
 
-#: builtin/help.c:434
+#: builtin/help.c:417
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr ""
 
-#: builtin/help.c:435
+#: builtin/help.c:418
 msgid "An overview of recommended workflows with Git"
 msgstr ""
 
-#: builtin/help.c:447
+#: builtin/help.c:430
 msgid "The common Git guides are:\n"
 msgstr ""
 
-#: builtin/help.c:468 builtin/help.c:485
+#: builtin/help.c:451 builtin/help.c:468
 #, c-format
 msgid "usage: %s%s"
 msgstr ""
 
-#: builtin/help.c:501
+#: builtin/help.c:484
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr ""
@@ -6549,87 +6627,62 @@
 msgid "--verify with no packfile name given"
 msgstr ""
 
-#: builtin/init-db.c:36
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr ""
-
-#: builtin/init-db.c:63
-#, c-format
-msgid "insanely long template name %s"
-msgstr ""
-
-#: builtin/init-db.c:68
+#: builtin/init-db.c:55
 #, c-format
 msgid "cannot stat '%s'"
 msgstr ""
 
-#: builtin/init-db.c:74
+#: builtin/init-db.c:61
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr ""
 
-#: builtin/init-db.c:81
+#: builtin/init-db.c:66
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr ""
 
-#: builtin/init-db.c:98
+#: builtin/init-db.c:77
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr ""
 
-#: builtin/init-db.c:100
-#, c-format
-msgid "insanely long symlink %s"
-msgstr ""
-
-#: builtin/init-db.c:103
+#: builtin/init-db.c:79
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr ""
 
-#: builtin/init-db.c:107
+#: builtin/init-db.c:85
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr ""
 
-#: builtin/init-db.c:111
+#: builtin/init-db.c:89
 #, c-format
 msgid "ignoring template %s"
 msgstr ""
 
-#: builtin/init-db.c:137
-#, c-format
-msgid "insanely long template path %s"
-msgstr ""
-
-#: builtin/init-db.c:145
+#: builtin/init-db.c:118
 #, c-format
 msgid "templates not found %s"
 msgstr ""
 
-#: builtin/init-db.c:158
+#: builtin/init-db.c:131
 #, c-format
 msgid "not copying templates of a wrong format version %d from '%s'"
 msgstr ""
 
-#: builtin/init-db.c:212
-#, c-format
-msgid "insane git directory %s"
-msgstr ""
-
-#: builtin/init-db.c:344 builtin/init-db.c:347
+#: builtin/init-db.c:309 builtin/init-db.c:312
 #, c-format
 msgid "%s already exists"
 msgstr ""
 
-#: builtin/init-db.c:375
+#: builtin/init-db.c:340
 #, c-format
 msgid "unable to handle file type %d"
 msgstr ""
 
-#: builtin/init-db.c:378
+#: builtin/init-db.c:343
 #, c-format
 msgid "unable to move %s to %s"
 msgstr ""
@@ -6637,55 +6690,55 @@
 #. TRANSLATORS: The first '%s' is either "Reinitialized
 #. existing" or "Initialized empty", the second " shared" or
 #. "", and the last '%s%s' is the verbatim directory name.
-#: builtin/init-db.c:434
+#: builtin/init-db.c:399
 #, c-format
 msgid "%s%s Git repository in %s%s\n"
 msgstr ""
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Reinitialized existing"
 msgstr ""
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Initialized empty"
 msgstr ""
 
-#: builtin/init-db.c:436
+#: builtin/init-db.c:401
 msgid " shared"
 msgstr ""
 
-#: builtin/init-db.c:483
+#: builtin/init-db.c:448
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
 msgstr ""
 
-#: builtin/init-db.c:506
+#: builtin/init-db.c:471
 msgid "permissions"
 msgstr ""
 
-#: builtin/init-db.c:507
+#: builtin/init-db.c:472
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr ""
 
-#: builtin/init-db.c:541 builtin/init-db.c:546
+#: builtin/init-db.c:506 builtin/init-db.c:511
 #, c-format
 msgid "cannot mkdir %s"
 msgstr ""
 
-#: builtin/init-db.c:550
+#: builtin/init-db.c:515
 #, c-format
 msgid "cannot chdir to %s"
 msgstr ""
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:536
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
 "dir=<directory>)"
 msgstr ""
 
-#: builtin/init-db.c:599
+#: builtin/init-db.c:564
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr ""
@@ -6769,33 +6822,33 @@
 msgid "name of output directory is too long"
 msgstr ""
 
-#: builtin/log.c:814
+#: builtin/log.c:813
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr ""
 
-#: builtin/log.c:828
+#: builtin/log.c:827
 msgid "Need exactly one range."
 msgstr ""
 
-#: builtin/log.c:838
+#: builtin/log.c:837
 msgid "Not a range."
 msgstr ""
 
-#: builtin/log.c:944
+#: builtin/log.c:943
 msgid "Cover letter needs email format"
 msgstr ""
 
-#: builtin/log.c:1023
+#: builtin/log.c:1022
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr ""
 
-#: builtin/log.c:1051
+#: builtin/log.c:1050
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr ""
 
-#: builtin/log.c:1096
+#: builtin/log.c:1095
 msgid "Two output directories?"
 msgstr ""
 
@@ -6852,134 +6905,138 @@
 msgstr ""
 
 #: builtin/log.c:1241
-msgid "don't include a patch matching a commit upstream"
+msgid "output all-zero hash in From header"
 msgstr ""
 
 #: builtin/log.c:1243
-msgid "show patch format instead of default (patch + stat)"
+msgid "don't include a patch matching a commit upstream"
 msgstr ""
 
 #: builtin/log.c:1245
-msgid "Messaging"
-msgstr ""
-
-#: builtin/log.c:1246
-msgid "header"
+msgid "show patch format instead of default (patch + stat)"
 msgstr ""
 
 #: builtin/log.c:1247
-msgid "add email header"
-msgstr ""
-
-#: builtin/log.c:1248 builtin/log.c:1250
-msgid "email"
+msgid "Messaging"
 msgstr ""
 
 #: builtin/log.c:1248
-msgid "add To: header"
+msgid "header"
+msgstr ""
+
+#: builtin/log.c:1249
+msgid "add email header"
+msgstr ""
+
+#: builtin/log.c:1250 builtin/log.c:1252
+msgid "email"
 msgstr ""
 
 #: builtin/log.c:1250
-msgid "add Cc: header"
+msgid "add To: header"
 msgstr ""
 
 #: builtin/log.c:1252
+msgid "add Cc: header"
+msgstr ""
+
+#: builtin/log.c:1254
 msgid "ident"
 msgstr ""
 
-#: builtin/log.c:1253
+#: builtin/log.c:1255
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 
-#: builtin/log.c:1255
+#: builtin/log.c:1257
 msgid "message-id"
 msgstr ""
 
-#: builtin/log.c:1256
+#: builtin/log.c:1258
 msgid "make first mail a reply to <message-id>"
 msgstr ""
 
-#: builtin/log.c:1257 builtin/log.c:1260
+#: builtin/log.c:1259 builtin/log.c:1262
 msgid "boundary"
 msgstr ""
 
-#: builtin/log.c:1258
+#: builtin/log.c:1260
 msgid "attach the patch"
 msgstr ""
 
-#: builtin/log.c:1261
+#: builtin/log.c:1263
 msgid "inline the patch"
 msgstr ""
 
-#: builtin/log.c:1265
+#: builtin/log.c:1267
 msgid "enable message threading, styles: shallow, deep"
 msgstr ""
 
-#: builtin/log.c:1267
+#: builtin/log.c:1269
 msgid "signature"
 msgstr ""
 
-#: builtin/log.c:1268
+#: builtin/log.c:1270
 msgid "add a signature"
 msgstr ""
 
-#: builtin/log.c:1270
+#: builtin/log.c:1272
 msgid "add a signature from a file"
 msgstr ""
 
-#: builtin/log.c:1271
+#: builtin/log.c:1273
 msgid "don't print the patch filenames"
 msgstr ""
 
-#: builtin/log.c:1360
+#: builtin/log.c:1362
 msgid "-n and -k are mutually exclusive."
 msgstr ""
 
-#: builtin/log.c:1362
+#: builtin/log.c:1364
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr ""
 
-#: builtin/log.c:1370
+#: builtin/log.c:1372
 msgid "--name-only does not make sense"
 msgstr ""
 
-#: builtin/log.c:1372
+#: builtin/log.c:1374
 msgid "--name-status does not make sense"
 msgstr ""
 
-#: builtin/log.c:1374
+#: builtin/log.c:1376
 msgid "--check does not make sense"
 msgstr ""
 
-#: builtin/log.c:1397
+#: builtin/log.c:1401
 msgid "standard output, or directory, which one?"
 msgstr ""
 
-#: builtin/log.c:1399
+#: builtin/log.c:1403
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr ""
 
-#: builtin/log.c:1496
+#: builtin/log.c:1500
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr ""
 
-#: builtin/log.c:1559
+#: builtin/log.c:1563
 msgid "Failed to create output files"
 msgstr ""
 
-#: builtin/log.c:1607
+#: builtin/log.c:1611
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr ""
 
-#: builtin/log.c:1661
+#: builtin/log.c:1665
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr ""
 
-#: builtin/log.c:1672 builtin/log.c:1674 builtin/log.c:1686
+#: builtin/log.c:1676 builtin/log.c:1678 builtin/log.c:1690
 #, c-format
 msgid "Unknown commit %s"
 msgstr ""
@@ -7080,35 +7137,35 @@
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr ""
 
-#: builtin/ls-tree.c:127
+#: builtin/ls-tree.c:128
 msgid "only show trees"
 msgstr ""
 
-#: builtin/ls-tree.c:129
+#: builtin/ls-tree.c:130
 msgid "recurse into subtrees"
 msgstr ""
 
-#: builtin/ls-tree.c:131
+#: builtin/ls-tree.c:132
 msgid "show trees when recursing"
 msgstr ""
 
-#: builtin/ls-tree.c:134
+#: builtin/ls-tree.c:135
 msgid "terminate entries with NUL byte"
 msgstr ""
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:136
 msgid "include object size"
 msgstr ""
 
-#: builtin/ls-tree.c:137 builtin/ls-tree.c:139
+#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
 msgid "list only filenames"
 msgstr ""
 
-#: builtin/ls-tree.c:142
+#: builtin/ls-tree.c:143
 msgid "use full path names"
 msgstr ""
 
-#: builtin/ls-tree.c:144
+#: builtin/ls-tree.c:145
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr ""
 
@@ -7333,72 +7390,72 @@
 msgid "No remote-tracking branch for %s from %s"
 msgstr ""
 
-#: builtin/merge.c:1081
+#: builtin/merge.c:1079
 #, c-format
 msgid "could not close '%s'"
 msgstr ""
 
-#: builtin/merge.c:1208
+#: builtin/merge.c:1206
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr ""
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1222
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
 msgstr ""
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1229
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
 msgstr ""
 
-#: builtin/merge.c:1234
+#: builtin/merge.c:1232
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr ""
 
-#: builtin/merge.c:1243
+#: builtin/merge.c:1241
 msgid "You cannot combine --squash with --no-ff."
 msgstr ""
 
-#: builtin/merge.c:1251
+#: builtin/merge.c:1249
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 
-#: builtin/merge.c:1268
+#: builtin/merge.c:1266
 msgid "Squash commit into empty head not supported yet"
 msgstr ""
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1268
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 
-#: builtin/merge.c:1276
+#: builtin/merge.c:1274
 #, c-format
 msgid "%s - not something we can merge"
 msgstr ""
 
-#: builtin/merge.c:1278
+#: builtin/merge.c:1276
 msgid "Can merge only exactly one commit into empty head"
 msgstr ""
 
-#: builtin/merge.c:1333
+#: builtin/merge.c:1331
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 
-#: builtin/merge.c:1336
+#: builtin/merge.c:1334
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
 
-#: builtin/merge.c:1339
+#: builtin/merge.c:1337
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr ""
 
-#: builtin/merge.c:1342
+#: builtin/merge.c:1340
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr ""
@@ -7408,46 +7465,46 @@
 msgid "Updating %s..%s\n"
 msgstr ""
 
-#: builtin/merge.c:1462
+#: builtin/merge.c:1460
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr ""
 
-#: builtin/merge.c:1469
+#: builtin/merge.c:1467
 #, c-format
 msgid "Nope.\n"
 msgstr ""
 
-#: builtin/merge.c:1501
+#: builtin/merge.c:1499
 msgid "Not possible to fast-forward, aborting."
 msgstr ""
 
-#: builtin/merge.c:1524 builtin/merge.c:1603
+#: builtin/merge.c:1522 builtin/merge.c:1601
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr ""
 
-#: builtin/merge.c:1528
+#: builtin/merge.c:1526
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr ""
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1592
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr ""
 
-#: builtin/merge.c:1596
+#: builtin/merge.c:1594
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr ""
 
-#: builtin/merge.c:1605
+#: builtin/merge.c:1603
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr ""
 
-#: builtin/merge.c:1617
+#: builtin/merge.c:1615
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -7633,48 +7690,48 @@
 msgid "Renaming %s to %s\n"
 msgstr ""
 
-#: builtin/mv.c:256 builtin/remote.c:722 builtin/repack.c:362
+#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365
 #, c-format
 msgid "renaming '%s' failed"
 msgstr ""
 
-#: builtin/name-rev.c:255
+#: builtin/name-rev.c:251
 msgid "git name-rev [<options>] <commit>..."
 msgstr ""
 
-#: builtin/name-rev.c:256
+#: builtin/name-rev.c:252
 msgid "git name-rev [<options>] --all"
 msgstr ""
 
-#: builtin/name-rev.c:257
+#: builtin/name-rev.c:253
 msgid "git name-rev [<options>] --stdin"
 msgstr ""
 
-#: builtin/name-rev.c:309
+#: builtin/name-rev.c:305
 msgid "print only names (no SHA-1)"
 msgstr ""
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:306
 msgid "only use tags to name the commits"
 msgstr ""
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:308
 msgid "only use refs matching <pattern>"
 msgstr ""
 
-#: builtin/name-rev.c:314
+#: builtin/name-rev.c:310
 msgid "list all commits reachable from all refs"
 msgstr ""
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:311
 msgid "read from stdin"
 msgstr ""
 
-#: builtin/name-rev.c:316
+#: builtin/name-rev.c:312
 msgid "allow to print `undefined` names (default)"
 msgstr ""
 
-#: builtin/name-rev.c:322
+#: builtin/name-rev.c:318
 msgid "dereference tags in the input (internal use)"
 msgstr ""
 
@@ -7797,7 +7854,7 @@
 msgid "failed to finish 'show' for object '%s'"
 msgstr ""
 
-#: builtin/notes.c:174 builtin/tag.c:477
+#: builtin/notes.c:174 builtin/tag.c:248
 #, c-format
 msgid "could not create file '%s'"
 msgstr ""
@@ -7815,12 +7872,12 @@
 msgid "The note contents have been left in %s"
 msgstr ""
 
-#: builtin/notes.c:232 builtin/tag.c:695
+#: builtin/notes.c:232 builtin/tag.c:440
 #, c-format
 msgid "cannot read '%s'"
 msgstr ""
 
-#: builtin/notes.c:234 builtin/tag.c:698
+#: builtin/notes.c:234 builtin/tag.c:443
 #, c-format
 msgid "could not open or read '%s'"
 msgstr ""
@@ -7828,7 +7885,7 @@
 #: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306
 #: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507
 #: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653
-#: builtin/notes.c:877 builtin/tag.c:711
+#: builtin/notes.c:877 builtin/tag.c:456
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr ""
@@ -7862,11 +7919,6 @@
 msgid "note contents in a file"
 msgstr ""
 
-#: builtin/notes.c:398 builtin/notes.c:401 builtin/notes.c:561
-#: builtin/notes.c:564 builtin/tag.c:630
-msgid "object"
-msgstr ""
-
 #: builtin/notes.c:399 builtin/notes.c:562
 msgid "reuse and edit specified note object"
 msgstr ""
@@ -7987,7 +8039,7 @@
 msgid "use notes from <notes-ref>"
 msgstr ""
 
-#: builtin/notes.c:1012 builtin/remote.c:1588
+#: builtin/notes.c:1012 builtin/remote.c:1647
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr ""
@@ -8193,20 +8245,24 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr ""
 
-#: builtin/prune.c:105 builtin/worktree.c:121
+#: builtin/prune.c:105 builtin/worktree.c:124
 msgid "do not remove, show only"
 msgstr ""
 
-#: builtin/prune.c:106 builtin/worktree.c:122
+#: builtin/prune.c:106 builtin/worktree.c:125
 msgid "report pruned objects"
 msgstr ""
 
-#: builtin/prune.c:109 builtin/worktree.c:124
+#: builtin/prune.c:109 builtin/worktree.c:127
 msgid "expire objects older than <time>"
 msgstr ""
 
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
+msgstr ""
+
 #: builtin/pull.c:69
-msgid "git pull [options] [<repository> [<refspec>...]]"
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr ""
 
 #: builtin/pull.c:113
@@ -8337,25 +8393,25 @@
 msgid "Cannot rebase onto multiple branches."
 msgstr ""
 
-#: builtin/push.c:15
+#: builtin/push.c:16
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr ""
 
-#: builtin/push.c:86
+#: builtin/push.c:88
 msgid "tag shorthand without <tag>"
 msgstr ""
 
-#: builtin/push.c:96
+#: builtin/push.c:98
 msgid "--delete only accepts plain target ref names"
 msgstr ""
 
-#: builtin/push.c:140
+#: builtin/push.c:142
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
 msgstr ""
 
-#: builtin/push.c:143
+#: builtin/push.c:145
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -8370,7 +8426,7 @@
 "%s"
 msgstr ""
 
-#: builtin/push.c:158
+#: builtin/push.c:160
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -8380,7 +8436,7 @@
 "    git push %s HEAD:<name-of-remote-branch>\n"
 msgstr ""
 
-#: builtin/push.c:172
+#: builtin/push.c:174
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -8389,12 +8445,12 @@
 "    git push --set-upstream %s %s\n"
 msgstr ""
 
-#: builtin/push.c:180
+#: builtin/push.c:182
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr ""
 
-#: builtin/push.c:183
+#: builtin/push.c:185
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -8402,7 +8458,7 @@
 "to update which remote branch."
 msgstr ""
 
-#: builtin/push.c:206
+#: builtin/push.c:208
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -8427,12 +8483,12 @@
 "'current' instead of 'simple' if you sometimes use older versions of Git)"
 msgstr ""
 
-#: builtin/push.c:273
+#: builtin/push.c:275
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 
-#: builtin/push.c:280
+#: builtin/push.c:282
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -8440,7 +8496,7 @@
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/push.c:286
+#: builtin/push.c:288
 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"
@@ -8448,7 +8504,7 @@
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/push.c:292
+#: builtin/push.c:294
 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"
@@ -8457,33 +8513,33 @@
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/push.c:299
+#: builtin/push.c:301
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 
-#: builtin/push.c:302
+#: builtin/push.c:304
 msgid ""
 "You cannot update a remote ref that points at a non-commit object,\n"
 "or update a remote ref to make it point at a non-commit object,\n"
 "without using the '--force' option.\n"
 msgstr ""
 
-#: builtin/push.c:361
+#: builtin/push.c:363
 #, c-format
 msgid "Pushing to %s\n"
 msgstr ""
 
-#: builtin/push.c:365
+#: builtin/push.c:367
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr ""
 
-#: builtin/push.c:395
+#: builtin/push.c:397
 #, c-format
 msgid "bad repository '%s'"
 msgstr ""
 
-#: builtin/push.c:396
+#: builtin/push.c:398
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -8496,100 +8552,104 @@
 "    git push <name>\n"
 msgstr ""
 
-#: builtin/push.c:411
+#: builtin/push.c:413
 msgid "--all and --tags are incompatible"
 msgstr ""
 
-#: builtin/push.c:412
+#: builtin/push.c:414
 msgid "--all can't be combined with refspecs"
 msgstr ""
 
-#: builtin/push.c:417
+#: builtin/push.c:419
 msgid "--mirror and --tags are incompatible"
 msgstr ""
 
-#: builtin/push.c:418
+#: builtin/push.c:420
 msgid "--mirror can't be combined with refspecs"
 msgstr ""
 
-#: builtin/push.c:423
+#: builtin/push.c:425
 msgid "--all and --mirror are incompatible"
 msgstr ""
 
-#: builtin/push.c:539
+#: builtin/push.c:537
 msgid "repository"
 msgstr ""
 
-#: builtin/push.c:540 builtin/send-pack.c:161
+#: builtin/push.c:538 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr ""
 
-#: builtin/push.c:541 builtin/send-pack.c:163
+#: builtin/push.c:539 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr ""
 
-#: builtin/push.c:543
+#: builtin/push.c:541
 msgid "delete refs"
 msgstr ""
 
-#: builtin/push.c:544
+#: builtin/push.c:542
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr ""
 
-#: builtin/push.c:547 builtin/send-pack.c:164
+#: builtin/push.c:545 builtin/send-pack.c:164
 msgid "force updates"
 msgstr ""
 
-#: builtin/push.c:549 builtin/send-pack.c:175
+#: builtin/push.c:547 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr ""
 
-#: builtin/push.c:550 builtin/send-pack.c:176
+#: builtin/push.c:548 builtin/send-pack.c:176
 msgid "require old value of ref to be at this value"
 msgstr ""
 
-#: builtin/push.c:553
+#: builtin/push.c:550
+msgid "check|on-demand|no"
+msgstr ""
+
+#: builtin/push.c:551
 msgid "control recursive pushing of submodules"
 msgstr ""
 
-#: builtin/push.c:555 builtin/send-pack.c:169
+#: builtin/push.c:553 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr ""
 
-#: builtin/push.c:556 builtin/push.c:557 builtin/send-pack.c:158
+#: builtin/push.c:554 builtin/push.c:555 builtin/send-pack.c:158
 #: builtin/send-pack.c:159
 msgid "receive pack program"
 msgstr ""
 
-#: builtin/push.c:558
+#: builtin/push.c:556
 msgid "set upstream for git pull/status"
 msgstr ""
 
-#: builtin/push.c:561
+#: builtin/push.c:559
 msgid "prune locally removed refs"
 msgstr ""
 
-#: builtin/push.c:563
+#: builtin/push.c:561
 msgid "bypass pre-push hook"
 msgstr ""
 
-#: builtin/push.c:564
+#: builtin/push.c:562
 msgid "push missing but relevant tags"
 msgstr ""
 
-#: builtin/push.c:567 builtin/send-pack.c:166
+#: builtin/push.c:565 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr ""
 
-#: builtin/push.c:569 builtin/send-pack.c:170
+#: builtin/push.c:567 builtin/send-pack.c:170
 msgid "request atomic transaction on remote side"
 msgstr ""
 
-#: builtin/push.c:579
+#: builtin/push.c:577
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr ""
 
-#: builtin/push.c:581
+#: builtin/push.c:579
 msgid "--delete doesn't make sense without any refs"
 msgstr ""
 
@@ -8664,12 +8724,12 @@
 msgid "debug unpack-trees"
 msgstr ""
 
-#: builtin/reflog.c:432
+#: builtin/reflog.c:428
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
 msgstr ""
 
-#: builtin/reflog.c:549 builtin/reflog.c:554
+#: builtin/reflog.c:545 builtin/reflog.c:550
 #, c-format
 msgid "'%s' is not a valid timestamp"
 msgstr ""
@@ -8684,15 +8744,15 @@
 "mirror=<fetch|push>] <name> <url>"
 msgstr ""
 
-#: builtin/remote.c:14 builtin/remote.c:33
+#: builtin/remote.c:14 builtin/remote.c:34
 msgid "git remote rename <old> <new>"
 msgstr ""
 
-#: builtin/remote.c:15 builtin/remote.c:38
+#: builtin/remote.c:15 builtin/remote.c:39
 msgid "git remote remove <name>"
 msgstr ""
 
-#: builtin/remote.c:16 builtin/remote.c:43
+#: builtin/remote.c:16 builtin/remote.c:44
 msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
 msgstr ""
 
@@ -8713,143 +8773,147 @@
 msgid "git remote set-branches [--add] <name> <branch>..."
 msgstr ""
 
-#: builtin/remote.c:21 builtin/remote.c:69
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr ""
+
+#: builtin/remote.c:22 builtin/remote.c:75
 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
 msgstr ""
 
-#: builtin/remote.c:22 builtin/remote.c:70
+#: builtin/remote.c:23 builtin/remote.c:76
 msgid "git remote set-url --add <name> <newurl>"
 msgstr ""
 
-#: builtin/remote.c:23 builtin/remote.c:71
+#: builtin/remote.c:24 builtin/remote.c:77
 msgid "git remote set-url --delete <name> <url>"
 msgstr ""
 
-#: builtin/remote.c:28
+#: builtin/remote.c:29
 msgid "git remote add [<options>] <name> <url>"
 msgstr ""
 
-#: builtin/remote.c:48
+#: builtin/remote.c:49
 msgid "git remote set-branches <name> <branch>..."
 msgstr ""
 
-#: builtin/remote.c:49
+#: builtin/remote.c:50
 msgid "git remote set-branches --add <name> <branch>..."
 msgstr ""
 
-#: builtin/remote.c:54
+#: builtin/remote.c:55
 msgid "git remote show [<options>] <name>"
 msgstr ""
 
-#: builtin/remote.c:59
+#: builtin/remote.c:60
 msgid "git remote prune [<options>] <name>"
 msgstr ""
 
-#: builtin/remote.c:64
+#: builtin/remote.c:65
 msgid "git remote update [<options>] [<group> | <remote>]..."
 msgstr ""
 
-#: builtin/remote.c:88
+#: builtin/remote.c:94
 #, c-format
 msgid "Updating %s"
 msgstr ""
 
-#: builtin/remote.c:120
+#: builtin/remote.c:126
 msgid ""
 "--mirror is dangerous and deprecated; please\n"
 "\t use --mirror=fetch or --mirror=push instead"
 msgstr ""
 
-#: builtin/remote.c:137
+#: builtin/remote.c:143
 #, c-format
 msgid "unknown mirror argument: %s"
 msgstr ""
 
-#: builtin/remote.c:153
+#: builtin/remote.c:159
 msgid "fetch the remote branches"
 msgstr ""
 
-#: builtin/remote.c:155
+#: builtin/remote.c:161
 msgid "import all tags and associated objects when fetching"
 msgstr ""
 
-#: builtin/remote.c:158
+#: builtin/remote.c:164
 msgid "or do not fetch any tag at all (--no-tags)"
 msgstr ""
 
-#: builtin/remote.c:160
+#: builtin/remote.c:166
 msgid "branch(es) to track"
 msgstr ""
 
-#: builtin/remote.c:161
+#: builtin/remote.c:167
 msgid "master branch"
 msgstr ""
 
-#: builtin/remote.c:162
+#: builtin/remote.c:168
 msgid "push|fetch"
 msgstr ""
 
-#: builtin/remote.c:163
+#: builtin/remote.c:169
 msgid "set up remote as a mirror to push to or fetch from"
 msgstr ""
 
-#: builtin/remote.c:175
+#: builtin/remote.c:181
 msgid "specifying a master branch makes no sense with --mirror"
 msgstr ""
 
-#: builtin/remote.c:177
+#: builtin/remote.c:183
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr ""
 
-#: builtin/remote.c:187 builtin/remote.c:637
+#: builtin/remote.c:193 builtin/remote.c:643
 #, c-format
 msgid "remote %s already exists."
 msgstr ""
 
-#: builtin/remote.c:191 builtin/remote.c:641
+#: builtin/remote.c:197 builtin/remote.c:647
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr ""
 
-#: builtin/remote.c:235
+#: builtin/remote.c:241
 #, c-format
 msgid "Could not setup master '%s'"
 msgstr ""
 
-#: builtin/remote.c:335
+#: builtin/remote.c:341
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr ""
 
-#: builtin/remote.c:436 builtin/remote.c:444
+#: builtin/remote.c:442 builtin/remote.c:450
 msgid "(matching)"
 msgstr ""
 
-#: builtin/remote.c:448
+#: builtin/remote.c:454
 msgid "(delete)"
 msgstr ""
 
-#: builtin/remote.c:588 builtin/remote.c:594 builtin/remote.c:600
+#: builtin/remote.c:594 builtin/remote.c:600 builtin/remote.c:606
 #, c-format
 msgid "Could not append '%s' to '%s'"
 msgstr ""
 
-#: builtin/remote.c:630 builtin/remote.c:769 builtin/remote.c:869
+#: builtin/remote.c:636 builtin/remote.c:775 builtin/remote.c:875
 #, c-format
 msgid "No such remote: %s"
 msgstr ""
 
-#: builtin/remote.c:647
+#: builtin/remote.c:653
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr ""
 
-#: builtin/remote.c:653 builtin/remote.c:821
+#: builtin/remote.c:659 builtin/remote.c:827
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr ""
 
-#: builtin/remote.c:668
+#: builtin/remote.c:674
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -8857,27 +8921,27 @@
 "\tPlease update the configuration manually if necessary."
 msgstr ""
 
-#: builtin/remote.c:674
+#: builtin/remote.c:680
 #, c-format
 msgid "Could not append '%s'"
 msgstr ""
 
-#: builtin/remote.c:685
+#: builtin/remote.c:691
 #, c-format
 msgid "Could not set '%s'"
 msgstr ""
 
-#: builtin/remote.c:707
+#: builtin/remote.c:713
 #, c-format
 msgid "deleting '%s' failed"
 msgstr ""
 
-#: builtin/remote.c:741
+#: builtin/remote.c:747
 #, c-format
 msgid "creating '%s' failed"
 msgstr ""
 
-#: builtin/remote.c:807
+#: builtin/remote.c:813
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -8887,262 +8951,275 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/remote.c:922
+#: builtin/remote.c:928
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr ""
 
-#: builtin/remote.c:925
+#: builtin/remote.c:931
 msgid " tracked"
 msgstr ""
 
-#: builtin/remote.c:927
+#: builtin/remote.c:933
 msgid " stale (use 'git remote prune' to remove)"
 msgstr ""
 
-#: builtin/remote.c:929
+#: builtin/remote.c:935
 msgid " ???"
 msgstr ""
 
-#: builtin/remote.c:970
+#: builtin/remote.c:976
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr ""
 
-#: builtin/remote.c:977
+#: builtin/remote.c:983
 #, c-format
 msgid "rebases onto remote %s"
 msgstr ""
 
-#: builtin/remote.c:980
+#: builtin/remote.c:986
 #, c-format
 msgid " merges with remote %s"
 msgstr ""
 
-#: builtin/remote.c:981
+#: builtin/remote.c:987
 msgid "    and with remote"
 msgstr ""
 
-#: builtin/remote.c:983
+#: builtin/remote.c:989
 #, c-format
 msgid "merges with remote %s"
 msgstr ""
 
-#: builtin/remote.c:984
+#: builtin/remote.c:990
 msgid "   and with remote"
 msgstr ""
 
-#: builtin/remote.c:1030
+#: builtin/remote.c:1036
 msgid "create"
 msgstr ""
 
-#: builtin/remote.c:1033
+#: builtin/remote.c:1039
 msgid "delete"
 msgstr ""
 
-#: builtin/remote.c:1037
+#: builtin/remote.c:1043
 msgid "up to date"
 msgstr ""
 
-#: builtin/remote.c:1040
+#: builtin/remote.c:1046
 msgid "fast-forwardable"
 msgstr ""
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1049
 msgid "local out of date"
 msgstr ""
 
-#: builtin/remote.c:1050
+#: builtin/remote.c:1056
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr ""
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1059
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr ""
 
-#: builtin/remote.c:1057
+#: builtin/remote.c:1063
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr ""
 
-#: builtin/remote.c:1060
+#: builtin/remote.c:1066
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr ""
 
-#: builtin/remote.c:1128
+#: builtin/remote.c:1134
 msgid "do not query remotes"
 msgstr ""
 
-#: builtin/remote.c:1155
+#: builtin/remote.c:1161
 #, c-format
 msgid "* remote %s"
 msgstr ""
 
-#: builtin/remote.c:1156
+#: builtin/remote.c:1162
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr ""
 
-#: builtin/remote.c:1157 builtin/remote.c:1308
+#: builtin/remote.c:1163 builtin/remote.c:1314
 msgid "(no URL)"
 msgstr ""
 
-#: builtin/remote.c:1166 builtin/remote.c:1168
+#: builtin/remote.c:1172 builtin/remote.c:1174
 #, c-format
 msgid "  Push  URL: %s"
 msgstr ""
 
-#: builtin/remote.c:1170 builtin/remote.c:1172 builtin/remote.c:1174
+#: builtin/remote.c:1176 builtin/remote.c:1178 builtin/remote.c:1180
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr ""
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1182
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr ""
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1194
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/remote.c:1191 builtin/remote.c:1218
+#: builtin/remote.c:1197 builtin/remote.c:1224
 msgid " (status not queried)"
 msgstr ""
 
-#: builtin/remote.c:1200
+#: builtin/remote.c:1206
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/remote.c:1208
+#: builtin/remote.c:1214
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr ""
 
-#: builtin/remote.c:1215
+#: builtin/remote.c:1221
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/remote.c:1236
+#: builtin/remote.c:1242
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr ""
 
-#: builtin/remote.c:1238
+#: builtin/remote.c:1244
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr ""
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1259
 msgid "Cannot determine remote HEAD"
 msgstr ""
 
-#: builtin/remote.c:1255
+#: builtin/remote.c:1261
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 
-#: builtin/remote.c:1265
+#: builtin/remote.c:1271
 #, c-format
 msgid "Could not delete %s"
 msgstr ""
 
-#: builtin/remote.c:1273
+#: builtin/remote.c:1279
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr ""
 
-#: builtin/remote.c:1275
+#: builtin/remote.c:1281
 #, c-format
 msgid "Could not setup %s"
 msgstr ""
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1299
 #, c-format
 msgid " %s will become dangling!"
 msgstr ""
 
-#: builtin/remote.c:1294
+#: builtin/remote.c:1300
 #, c-format
 msgid " %s has become dangling!"
 msgstr ""
 
-#: builtin/remote.c:1304
+#: builtin/remote.c:1310
 #, c-format
 msgid "Pruning %s"
 msgstr ""
 
-#: builtin/remote.c:1305
+#: builtin/remote.c:1311
 #, c-format
 msgid "URL: %s"
 msgstr ""
 
-#: builtin/remote.c:1321
+#: builtin/remote.c:1327
 #, c-format
 msgid " * [would prune] %s"
 msgstr ""
 
-#: builtin/remote.c:1324
+#: builtin/remote.c:1330
 #, c-format
 msgid " * [pruned] %s"
 msgstr ""
 
-#: builtin/remote.c:1369
+#: builtin/remote.c:1375
 msgid "prune remotes after fetching"
 msgstr ""
 
-#: builtin/remote.c:1435 builtin/remote.c:1509
+#: builtin/remote.c:1441 builtin/remote.c:1498 builtin/remote.c:1566
 #, c-format
 msgid "No such remote '%s'"
 msgstr ""
 
-#: builtin/remote.c:1455
+#: builtin/remote.c:1461
 msgid "add branch"
 msgstr ""
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1468
 msgid "no remote specified"
 msgstr ""
 
-#: builtin/remote.c:1484
+#: builtin/remote.c:1485
+msgid "query push URLs rather than fetch URLs"
+msgstr ""
+
+#: builtin/remote.c:1487
+msgid "return all URLs"
+msgstr ""
+
+#: builtin/remote.c:1515
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr ""
+
+#: builtin/remote.c:1541
 msgid "manipulate push URLs"
 msgstr ""
 
-#: builtin/remote.c:1486
+#: builtin/remote.c:1543
 msgid "add URL"
 msgstr ""
 
-#: builtin/remote.c:1488
+#: builtin/remote.c:1545
 msgid "delete URLs"
 msgstr ""
 
-#: builtin/remote.c:1495
+#: builtin/remote.c:1552
 msgid "--add --delete doesn't make sense"
 msgstr ""
 
-#: builtin/remote.c:1535
+#: builtin/remote.c:1592
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr ""
 
-#: builtin/remote.c:1543
+#: builtin/remote.c:1600
 #, c-format
 msgid "No such URL found: %s"
 msgstr ""
 
-#: builtin/remote.c:1545
+#: builtin/remote.c:1602
 msgid "Will not delete all non-push URLs"
 msgstr ""
 
-#: builtin/remote.c:1559
+#: builtin/remote.c:1616
 msgid "be verbose; must be placed before a subcommand"
 msgstr ""
 
@@ -9214,7 +9291,11 @@
 msgid "repack objects in packs marked with .keep"
 msgstr ""
 
-#: builtin/repack.c:378
+#: builtin/repack.c:197
+msgid "cannot delete packs in a precious-objects repo"
+msgstr ""
+
+#: builtin/repack.c:381
 #, c-format
 msgid "removing '%s' failed"
 msgstr ""
@@ -9307,7 +9388,7 @@
 msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
 msgstr ""
 
-#: builtin/rerere.c:57
+#: builtin/rerere.c:58
 msgid "register clean resolutions in index"
 msgstr ""
 
@@ -9440,23 +9521,23 @@
 msgid "rev-list does not support display of notes"
 msgstr ""
 
-#: builtin/rev-parse.c:361
+#: builtin/rev-parse.c:358
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr ""
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:363
 msgid "keep the `--` passed as an arg"
 msgstr ""
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:365
 msgid "stop parsing after the first non-option argument"
 msgstr ""
 
-#: builtin/rev-parse.c:371
+#: builtin/rev-parse.c:368
 msgid "output in stuck long form"
 msgstr ""
 
-#: builtin/rev-parse.c:502
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -9691,7 +9772,7 @@
 msgid "Linewrap output"
 msgstr ""
 
-#: builtin/show-branch.c:9
+#: builtin/show-branch.c:10
 msgid ""
 "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
 "\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
@@ -9699,71 +9780,71 @@
 "\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]"
 msgstr ""
 
-#: builtin/show-branch.c:13
+#: builtin/show-branch.c:14
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr ""
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:640
 msgid "show remote-tracking and local branches"
 msgstr ""
 
-#: builtin/show-branch.c:661
+#: builtin/show-branch.c:642
 msgid "show remote-tracking branches"
 msgstr ""
 
-#: builtin/show-branch.c:663
+#: builtin/show-branch.c:644
 msgid "color '*!+-' corresponding to the branch"
 msgstr ""
 
-#: builtin/show-branch.c:665
+#: builtin/show-branch.c:646
 msgid "show <n> more commits after the common ancestor"
 msgstr ""
 
-#: builtin/show-branch.c:667
+#: builtin/show-branch.c:648
 msgid "synonym to more=-1"
 msgstr ""
 
-#: builtin/show-branch.c:668
+#: builtin/show-branch.c:649
 msgid "suppress naming strings"
 msgstr ""
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:651
 msgid "include the current branch"
 msgstr ""
 
-#: builtin/show-branch.c:672
+#: builtin/show-branch.c:653
 msgid "name commits with their object names"
 msgstr ""
 
-#: builtin/show-branch.c:674
+#: builtin/show-branch.c:655
 msgid "show possible merge bases"
 msgstr ""
 
-#: builtin/show-branch.c:676
+#: builtin/show-branch.c:657
 msgid "show refs unreachable from any other ref"
 msgstr ""
 
-#: builtin/show-branch.c:678
+#: builtin/show-branch.c:659
 msgid "show commits in topological order"
 msgstr ""
 
-#: builtin/show-branch.c:681
+#: builtin/show-branch.c:662
 msgid "show only commits not on the first branch"
 msgstr ""
 
-#: builtin/show-branch.c:683
+#: builtin/show-branch.c:664
 msgid "show merges reachable from only one tip"
 msgstr ""
 
-#: builtin/show-branch.c:685
+#: builtin/show-branch.c:666
 msgid "topologically sort, maintaining date order where possible"
 msgstr ""
 
-#: builtin/show-branch.c:688
+#: builtin/show-branch.c:669
 msgid "<n>[,<base>]"
 msgstr ""
 
-#: builtin/show-branch.c:689
+#: builtin/show-branch.c:670
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr ""
 
@@ -9774,41 +9855,131 @@
 msgstr ""
 
 #: builtin/show-ref.c:11
-msgid "git show-ref --exclude-existing[=<pattern>] < <ref-list>"
+msgid "git show-ref --exclude-existing[=<pattern>]"
 msgstr ""
 
-#: builtin/show-ref.c:170
+#: builtin/show-ref.c:165
 msgid "only show tags (can be combined with heads)"
 msgstr ""
 
-#: builtin/show-ref.c:171
+#: builtin/show-ref.c:166
 msgid "only show heads (can be combined with tags)"
 msgstr ""
 
-#: builtin/show-ref.c:172
+#: builtin/show-ref.c:167
 msgid "stricter reference checking, requires exact ref path"
 msgstr ""
 
-#: builtin/show-ref.c:175 builtin/show-ref.c:177
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr ""
 
-#: builtin/show-ref.c:179
+#: builtin/show-ref.c:174
 msgid "dereference tags into object IDs"
 msgstr ""
 
-#: builtin/show-ref.c:181
+#: builtin/show-ref.c:176
 msgid "only show SHA1 hash using <n> digits"
 msgstr ""
 
-#: builtin/show-ref.c:185
+#: builtin/show-ref.c:180
 msgid "do not print results to stdout (useful with --verify)"
 msgstr ""
 
-#: builtin/show-ref.c:187
+#: builtin/show-ref.c:182
 msgid "show refs from stdin that aren't in local repository"
 msgstr ""
 
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr ""
+
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr ""
+
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr ""
+
+#: builtin/stripspace.c:38
+msgid "prepend comment character and blank to each line"
+msgstr ""
+
+#: builtin/submodule--helper.c:79 builtin/submodule--helper.c:167
+msgid "alternative anchor for relative paths"
+msgstr ""
+
+#: builtin/submodule--helper.c:84
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr ""
+
+#: builtin/submodule--helper.c:114
+msgid "git submodule--helper name <path>"
+msgstr ""
+
+#: builtin/submodule--helper.c:120
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:170
+msgid "where the new submodule will be cloned to"
+msgstr ""
+
+#: builtin/submodule--helper.c:173
+msgid "name of the new submodule"
+msgstr ""
+
+#: builtin/submodule--helper.c:176
+msgid "url where to clone the submodule from"
+msgstr ""
+
+#: builtin/submodule--helper.c:182
+msgid "depth for shallow clones"
+msgstr ""
+
+#: builtin/submodule--helper.c:188
+msgid ""
+"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
+"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+msgstr ""
+
+#: builtin/submodule--helper.c:202 builtin/submodule--helper.c:208
+#: builtin/submodule--helper.c:216
+#, c-format
+msgid "could not create directory '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:204
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr ""
+
+#: builtin/submodule--helper.c:227
+#, c-format
+msgid "cannot open file '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:232
+#, c-format
+msgid "could not close file %s"
+msgstr ""
+
+#: builtin/submodule--helper.c:247
+#, c-format
+msgid "could not get submodule directory for '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:273
+msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+msgstr ""
+
+#: builtin/submodule--helper.c:280
+#, c-format
+msgid "fatal: '%s' is not a valid submodule--helper subcommand"
+msgstr ""
+
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
 msgstr ""
@@ -9837,52 +10008,47 @@
 msgid "reason of the update"
 msgstr ""
 
-#: builtin/tag.c:22
+#: builtin/tag.c:23
 msgid ""
 "git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
 "[<head>]"
 msgstr ""
 
-#: builtin/tag.c:23
+#: builtin/tag.c:24
 msgid "git tag -d <tagname>..."
 msgstr ""
 
-#: builtin/tag.c:24
+#: builtin/tag.c:25
 msgid ""
 "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
-"\t\t[<pattern>...]"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
 
-#: builtin/tag.c:26
+#: builtin/tag.c:27
 msgid "git tag -v <tagname>..."
 msgstr ""
 
-#: builtin/tag.c:69
-#, c-format
-msgid "malformed object at '%s'"
-msgstr ""
-
-#: builtin/tag.c:301
+#: builtin/tag.c:80
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr ""
 
-#: builtin/tag.c:306
+#: builtin/tag.c:85
 #, c-format
 msgid "tag '%s' not found."
 msgstr ""
 
-#: builtin/tag.c:321
+#: builtin/tag.c:100
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr ""
 
-#: builtin/tag.c:333
+#: builtin/tag.c:112
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr ""
 
-#: builtin/tag.c:343
+#: builtin/tag.c:122
 #, c-format
 msgid ""
 "\n"
@@ -9891,7 +10057,7 @@
 "Lines starting with '%c' will be ignored.\n"
 msgstr ""
 
-#: builtin/tag.c:347
+#: builtin/tag.c:126
 #, c-format
 msgid ""
 "\n"
@@ -9901,153 +10067,138 @@
 "want to.\n"
 msgstr ""
 
-#: builtin/tag.c:371
-#, c-format
-msgid "unsupported sort specification '%s'"
-msgstr ""
-
-#: builtin/tag.c:373
-#, c-format
-msgid "unsupported sort specification '%s' in variable '%s'"
-msgstr ""
-
-#: builtin/tag.c:428
+#: builtin/tag.c:199
 msgid "unable to sign the tag"
 msgstr ""
 
-#: builtin/tag.c:430
+#: builtin/tag.c:201
 msgid "unable to write tag file"
 msgstr ""
 
-#: builtin/tag.c:455
+#: builtin/tag.c:226
 msgid "bad object type."
 msgstr ""
 
-#: builtin/tag.c:468
+#: builtin/tag.c:239
 msgid "tag header too big."
 msgstr ""
 
-#: builtin/tag.c:504
+#: builtin/tag.c:275
 msgid "no tag message?"
 msgstr ""
 
-#: builtin/tag.c:510
+#: builtin/tag.c:281
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr ""
 
-#: builtin/tag.c:559
-msgid "switch 'points-at' requires an object"
-msgstr ""
-
-#: builtin/tag.c:561
-#, c-format
-msgid "malformed object name '%s'"
-msgstr ""
-
-#: builtin/tag.c:590
+#: builtin/tag.c:339
 msgid "list tag names"
 msgstr ""
 
-#: builtin/tag.c:592
+#: builtin/tag.c:341
 msgid "print <n> lines of each tag message"
 msgstr ""
 
-#: builtin/tag.c:594
+#: builtin/tag.c:343
 msgid "delete tags"
 msgstr ""
 
-#: builtin/tag.c:595
+#: builtin/tag.c:344
 msgid "verify tags"
 msgstr ""
 
-#: builtin/tag.c:597
+#: builtin/tag.c:346
 msgid "Tag creation options"
 msgstr ""
 
-#: builtin/tag.c:599
+#: builtin/tag.c:348
 msgid "annotated tag, needs a message"
 msgstr ""
 
-#: builtin/tag.c:601
+#: builtin/tag.c:350
 msgid "tag message"
 msgstr ""
 
-#: builtin/tag.c:603
+#: builtin/tag.c:352
 msgid "annotated and GPG-signed tag"
 msgstr ""
 
-#: builtin/tag.c:607
+#: builtin/tag.c:356
 msgid "use another key to sign the tag"
 msgstr ""
 
-#: builtin/tag.c:608
+#: builtin/tag.c:357
 msgid "replace the tag if exists"
 msgstr ""
 
-#: builtin/tag.c:609 builtin/update-ref.c:368
+#: builtin/tag.c:358 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr ""
 
-#: builtin/tag.c:611
+#: builtin/tag.c:360
 msgid "Tag listing options"
 msgstr ""
 
-#: builtin/tag.c:612
+#: builtin/tag.c:361
 msgid "show tag list in columns"
 msgstr ""
 
-#: builtin/tag.c:614
-msgid "sort tags"
-msgstr ""
-
-#: builtin/tag.c:619 builtin/tag.c:625
+#: builtin/tag.c:362 builtin/tag.c:363
 msgid "print only tags that contain the commit"
 msgstr ""
 
-#: builtin/tag.c:631
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
+msgstr ""
+
+#: builtin/tag.c:365
+msgid "print only tags that are not merged"
+msgstr ""
+
+#: builtin/tag.c:370
 msgid "print only tags of the object"
 msgstr ""
 
-#: builtin/tag.c:657
+#: builtin/tag.c:399
 msgid "--column and -n are incompatible"
 msgstr ""
 
-#: builtin/tag.c:669
-msgid "--sort and -n are incompatible"
-msgstr ""
-
-#: builtin/tag.c:676
+#: builtin/tag.c:419
 msgid "-n option is only allowed with -l."
 msgstr ""
 
-#: builtin/tag.c:678
+#: builtin/tag.c:421
 msgid "--contains option is only allowed with -l."
 msgstr ""
 
-#: builtin/tag.c:680
+#: builtin/tag.c:423
 msgid "--points-at option is only allowed with -l."
 msgstr ""
 
-#: builtin/tag.c:688
+#: builtin/tag.c:425
+msgid "--merged and --no-merged option are only allowed with -l"
+msgstr ""
+
+#: builtin/tag.c:433
 msgid "only one -F or -m option is allowed."
 msgstr ""
 
-#: builtin/tag.c:708
+#: builtin/tag.c:453
 msgid "too many params"
 msgstr ""
 
-#: builtin/tag.c:714
+#: builtin/tag.c:459
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr ""
 
-#: builtin/tag.c:719
+#: builtin/tag.c:464
 #, c-format
 msgid "tag '%s' already exists"
 msgstr ""
 
-#: builtin/tag.c:744
+#: builtin/tag.c:489
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr ""
@@ -10306,76 +10457,80 @@
 msgid "print tag contents"
 msgstr ""
 
-#: builtin/worktree.c:13
-msgid "git worktree add [<options>] <path> <branch>"
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
 msgstr ""
 
-#: builtin/worktree.c:14
+#: builtin/worktree.c:16
 msgid "git worktree prune [<options>]"
 msgstr ""
 
-#: builtin/worktree.c:36
+#: builtin/worktree.c:17
+msgid "git worktree list [<options>]"
+msgstr ""
+
+#: builtin/worktree.c:39
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr ""
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:45
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr ""
 
-#: builtin/worktree.c:47
+#: builtin/worktree.c:50
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr ""
 
-#: builtin/worktree.c:58
+#: builtin/worktree.c:61
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr ""
 
-#: builtin/worktree.c:74
+#: builtin/worktree.c:77
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr ""
 
-#: builtin/worktree.c:109
+#: builtin/worktree.c:112
 #, c-format
 msgid "failed to remove: %s"
 msgstr ""
 
-#: builtin/worktree.c:198
+#: builtin/worktree.c:201
 #, c-format
 msgid "'%s' already exists"
 msgstr ""
 
-#: builtin/worktree.c:232
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr ""
 
-#: builtin/worktree.c:268
+#: builtin/worktree.c:271
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr ""
 
-#: builtin/worktree.c:316
+#: builtin/worktree.c:319
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr ""
 
-#: builtin/worktree.c:318
+#: builtin/worktree.c:321
 msgid "create a new branch"
 msgstr ""
 
-#: builtin/worktree.c:320
+#: builtin/worktree.c:323
 msgid "create or reset a branch"
 msgstr ""
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:324
 msgid "detach HEAD at named commit"
 msgstr ""
 
-#: builtin/worktree.c:328
+#: builtin/worktree.c:331
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr ""
 
@@ -10518,86 +10673,86 @@
 msgid "no-op (backward compatibility)"
 msgstr ""
 
-#: parse-options.h:236
+#: parse-options.h:237
 msgid "be more verbose"
 msgstr ""
 
-#: parse-options.h:238
+#: parse-options.h:239
 msgid "be more quiet"
 msgstr ""
 
-#: parse-options.h:244
+#: parse-options.h:245
 msgid "use <n> digits to display SHA-1s"
 msgstr ""
 
-#: rerere.h:28
+#: rerere.h:38
 msgid "update the index with reused conflict resolution if possible"
 msgstr ""
 
-#: git-bisect.sh:50
+#: git-bisect.sh:55
 msgid "You need to start by \"git bisect start\""
 msgstr ""
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:56
+#: git-bisect.sh:61
 msgid "Do you want me to do it for you [Y/n]? "
 msgstr ""
 
-#: git-bisect.sh:99
+#: git-bisect.sh:122
 #, sh-format
 msgid "unrecognised option: '$arg'"
 msgstr ""
 
-#: git-bisect.sh:103
+#: git-bisect.sh:126
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr ""
 
-#: git-bisect.sh:132
+#: git-bisect.sh:155
 msgid "Bad HEAD - I need a HEAD"
 msgstr ""
 
-#: git-bisect.sh:145
+#: git-bisect.sh:168
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
 msgstr ""
 
-#: git-bisect.sh:155
+#: git-bisect.sh:178
 msgid "won't bisect on cg-seek'ed tree"
 msgstr ""
 
-#: git-bisect.sh:159
+#: git-bisect.sh:182
 msgid "Bad HEAD - strange symbolic ref"
 msgstr ""
 
-#: git-bisect.sh:211
+#: git-bisect.sh:234
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr ""
 
-#: git-bisect.sh:240
+#: git-bisect.sh:263
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr ""
 
-#: git-bisect.sh:255
+#: git-bisect.sh:278
 msgid "Please call 'bisect_state' with at least one argument."
 msgstr ""
 
-#: git-bisect.sh:267
+#: git-bisect.sh:290
 #, sh-format
 msgid "Bad rev input: $rev"
 msgstr ""
 
-#: git-bisect.sh:276
+#: git-bisect.sh:299
 #, sh-format
 msgid "'git bisect $TERM_BAD' can take only one argument."
 msgstr ""
 
-#: git-bisect.sh:299
+#: git-bisect.sh:322
 #, sh-format
 msgid "Warning: bisecting only with a $TERM_BAD commit."
 msgstr ""
@@ -10605,18 +10760,18 @@
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:305
+#: git-bisect.sh:328
 msgid "Are you sure [Y/n]? "
 msgstr ""
 
-#: git-bisect.sh:317
+#: git-bisect.sh:340
 #, sh-format
 msgid ""
 "You need to give me at least one $bad_syn and one $good_syn revision.\n"
 "(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
 msgstr ""
 
-#: git-bisect.sh:320
+#: git-bisect.sh:343
 #, sh-format
 msgid ""
 "You need to start by \"git bisect start\".\n"
@@ -10624,67 +10779,97 @@
 "(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
 msgstr ""
 
-#: git-bisect.sh:391 git-bisect.sh:521
+#: git-bisect.sh:414 git-bisect.sh:546
 msgid "We are not bisecting."
 msgstr ""
 
-#: git-bisect.sh:398
+#: git-bisect.sh:421
 #, sh-format
 msgid "'$invalid' is not a valid commit"
 msgstr ""
 
-#: git-bisect.sh:407
+#: git-bisect.sh:430
 #, sh-format
 msgid ""
 "Could not check out original HEAD '$branch'.\n"
 "Try 'git bisect reset <commit>'."
 msgstr ""
 
-#: git-bisect.sh:435
+#: git-bisect.sh:458
 msgid "No logfile given"
 msgstr ""
 
-#: git-bisect.sh:436
+#: git-bisect.sh:459
 #, sh-format
 msgid "cannot read $file for replaying"
 msgstr ""
 
-#: git-bisect.sh:455
+#: git-bisect.sh:480
 msgid "?? what are you talking about?"
 msgstr ""
 
-#: git-bisect.sh:467
+#: git-bisect.sh:492
 #, sh-format
 msgid "running $command"
 msgstr ""
 
-#: git-bisect.sh:474
+#: git-bisect.sh:499
 #, sh-format
 msgid ""
 "bisect run failed:\n"
 "exit code $res from '$command' is < 0 or >= 128"
 msgstr ""
 
-#: git-bisect.sh:500
+#: git-bisect.sh:525
 msgid "bisect run cannot continue any more"
 msgstr ""
 
-#: git-bisect.sh:506
+#: git-bisect.sh:531
 #, sh-format
 msgid ""
 "bisect run failed:\n"
 "'bisect_state $state' exited with error code $res"
 msgstr ""
 
-#: git-bisect.sh:513
+#: git-bisect.sh:538
 msgid "bisect run success"
 msgstr ""
 
-#: git-bisect.sh:548
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr ""
+
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr ""
+
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr ""
+
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr ""
+
+#: git-bisect.sh:606
 #, sh-format
 msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
 msgstr ""
 
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr ""
+
+#: git-bisect.sh:653
+#, sh-format
+msgid ""
+"invalid argument $arg for 'git bisect terms'.\n"
+"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+msgstr ""
+
 #: git-rebase.sh:57
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
@@ -10717,34 +10902,34 @@
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr ""
 
-#: git-rebase.sh:351
+#: git-rebase.sh:354
 msgid "The --exec option must be used with the --interactive option"
 msgstr ""
 
-#: git-rebase.sh:356
+#: git-rebase.sh:359
 msgid "No rebase in progress?"
 msgstr ""
 
-#: git-rebase.sh:367
+#: git-rebase.sh:370
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 
-#: git-rebase.sh:374
+#: git-rebase.sh:377
 msgid "Cannot read HEAD"
 msgstr ""
 
-#: git-rebase.sh:377
+#: git-rebase.sh:380
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
 msgstr ""
 
-#: git-rebase.sh:395
+#: git-rebase.sh:398
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr ""
 
-#: git-rebase.sh:414
+#: git-rebase.sh:417
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -10757,64 +10942,64 @@
 "valuable there."
 msgstr ""
 
-#: git-rebase.sh:465
+#: git-rebase.sh:468
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr ""
 
-#: git-rebase.sh:489
+#: git-rebase.sh:492
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr ""
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:495 git-rebase.sh:499
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr ""
 
-#: git-rebase.sh:501
+#: git-rebase.sh:504
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr ""
 
-#: git-rebase.sh:524
+#: git-rebase.sh:527
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr ""
 
-#: git-rebase.sh:557
+#: git-rebase.sh:560
 msgid "Cannot autostash"
 msgstr ""
 
-#: git-rebase.sh:562
+#: git-rebase.sh:565
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr ""
 
-#: git-rebase.sh:566
+#: git-rebase.sh:569
 msgid "Please commit or stash them."
 msgstr ""
 
-#: git-rebase.sh:586
+#: git-rebase.sh:589
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr ""
 
-#: git-rebase.sh:590
+#: git-rebase.sh:593
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr ""
 
-#: git-rebase.sh:601
+#: git-rebase.sh:604
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr ""
 
-#: git-rebase.sh:610
+#: git-rebase.sh:613
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 
-#: git-rebase.sh:620
+#: git-rebase.sh:623
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr ""
@@ -10885,112 +11070,97 @@
 msgid "Cannot remove worktree changes"
 msgstr ""
 
-#: git-stash.sh:387
+#: git-stash.sh:405
 #, sh-format
 msgid "unknown option: $opt"
 msgstr ""
 
-#: git-stash.sh:397
+#: git-stash.sh:415
 msgid "No stash found."
 msgstr ""
 
-#: git-stash.sh:404
+#: git-stash.sh:422
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr ""
 
-#: git-stash.sh:410
+#: git-stash.sh:428
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr ""
 
-#: git-stash.sh:438
+#: git-stash.sh:456
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr ""
 
-#: git-stash.sh:449
+#: git-stash.sh:467
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr ""
 
-#: git-stash.sh:457
+#: git-stash.sh:475
 msgid "unable to refresh index"
 msgstr ""
 
-#: git-stash.sh:461
+#: git-stash.sh:479
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr ""
 
-#: git-stash.sh:469
+#: git-stash.sh:487
 msgid "Conflicts in index. Try without --index."
 msgstr ""
 
-#: git-stash.sh:471
+#: git-stash.sh:489
 msgid "Could not save index tree"
 msgstr ""
 
-#: git-stash.sh:505
+#: git-stash.sh:523
 msgid "Cannot unstage modified files"
 msgstr ""
 
-#: git-stash.sh:520
+#: git-stash.sh:538
 msgid "Index was not unstashed."
 msgstr ""
 
-#: git-stash.sh:543
+#: git-stash.sh:561
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr ""
 
-#: git-stash.sh:544
+#: git-stash.sh:562
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr ""
 
-#: git-stash.sh:552
+#: git-stash.sh:570
 msgid "No branch name specified"
 msgstr ""
 
-#: git-stash.sh:624
+#: git-stash.sh:642
 msgid "(To restore them type \"git stash apply\")"
 msgstr ""
 
-#: git-submodule.sh:95
+#: git-submodule.sh:104
 #, sh-format
 msgid "cannot strip one component off url '$remoteurl'"
 msgstr ""
 
-#: git-submodule.sh:237
-#, sh-format
-msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
-msgstr ""
-
-#: git-submodule.sh:287
-#, sh-format
-msgid "Clone of '$url' into submodule path '$sm_path' failed"
-msgstr ""
-
-#: git-submodule.sh:296
-#, sh-format
-msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-msgstr ""
-
-#: git-submodule.sh:406
+#: git-submodule.sh:281
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 
-#: git-submodule.sh:416
+#: git-submodule.sh:291
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr ""
 
-#: git-submodule.sh:433
+#: git-submodule.sh:308
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr ""
 
-#: git-submodule.sh:437
+#: git-submodule.sh:312
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -10998,235 +11168,235 @@
 "Use -f if you really want to add it."
 msgstr ""
 
-#: git-submodule.sh:455
+#: git-submodule.sh:330
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr ""
 
-#: git-submodule.sh:457
+#: git-submodule.sh:332
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr ""
 
-#: git-submodule.sh:465
+#: git-submodule.sh:340
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 
-#: git-submodule.sh:467
+#: git-submodule.sh:342
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
 msgstr ""
 
-#: git-submodule.sh:469
+#: git-submodule.sh:344
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
 msgstr ""
 
-#: git-submodule.sh:470
+#: git-submodule.sh:345
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
 "option."
 msgstr ""
 
-#: git-submodule.sh:472
+#: git-submodule.sh:347
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr ""
 
-#: git-submodule.sh:484
+#: git-submodule.sh:359
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:489
+#: git-submodule.sh:364
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:498
+#: git-submodule.sh:373
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:542
+#: git-submodule.sh:417
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:562
+#: git-submodule.sh:437
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr ""
 
-#: git-submodule.sh:608
+#: git-submodule.sh:483
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr ""
 
-#: git-submodule.sh:617
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:619
+#: git-submodule.sh:494
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:636
+#: git-submodule.sh:511
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:674
+#: git-submodule.sh:549
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr ""
 
-#: git-submodule.sh:691
+#: git-submodule.sh:566
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr ""
 
-#: git-submodule.sh:692
+#: git-submodule.sh:567
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
 
-#: git-submodule.sh:698
+#: git-submodule.sh:573
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
 "discard them"
 msgstr ""
 
-#: git-submodule.sh:701
+#: git-submodule.sh:576
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:702
+#: git-submodule.sh:577
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:705
+#: git-submodule.sh:580
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:714
+#: git-submodule.sh:589
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:830
+#: git-submodule.sh:705
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
 "Maybe you want to use 'update --init'?"
 msgstr ""
 
-#: git-submodule.sh:843
+#: git-submodule.sh:718
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:852
+#: git-submodule.sh:727
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:876
+#: git-submodule.sh:751
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:890
+#: git-submodule.sh:765
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:891
+#: git-submodule.sh:766
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr ""
 
-#: git-submodule.sh:895
+#: git-submodule.sh:770
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:896
+#: git-submodule.sh:771
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr ""
 
-#: git-submodule.sh:901
+#: git-submodule.sh:776
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:902
+#: git-submodule.sh:777
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr ""
 
-#: git-submodule.sh:907
+#: git-submodule.sh:782
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:908
+#: git-submodule.sh:783
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr ""
 
-#: git-submodule.sh:938
+#: git-submodule.sh:813
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:1046
+#: git-submodule.sh:921
 msgid "The --cached option cannot be used with the --files option"
 msgstr ""
 
-#: git-submodule.sh:1098
+#: git-submodule.sh:973
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr ""
 
-#: git-submodule.sh:1118
+#: git-submodule.sh:993
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr ""
 
-#: git-submodule.sh:1121
+#: git-submodule.sh:996
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr ""
 
-#: git-submodule.sh:1124
+#: git-submodule.sh:999
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 
-#: git-submodule.sh:1149
+#: git-submodule.sh:1024
 msgid "blob"
 msgstr ""
 
-#: git-submodule.sh:1267
+#: git-submodule.sh:1142
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:1331
+#: git-submodule.sh:1206
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr ""
diff --git a/po/ko.po b/po/ko.po
new file mode 100644
index 0000000..8ec0eac
--- /dev/null
+++ b/po/ko.po
@@ -0,0 +1,11859 @@
+# Git Korean translation
+# Copyright (C) 2015-2016 Changwoo Ryu and contributors
+# This file is distributed under the same license as the Git package.
+#
+# Contributors:
+#  Hyunjun Kim <yoloseem AT users.noreply.github.com>, 2015.
+#  Changwoo Ryu <cwryu@debian.org>, 2015-2016.
+#
+# - 작업자는 위 Contributors 목록에 추가해 주세요.
+# - 번역하면서 80컬럼을 넘어가지 않도록 해 주세요.
+#   - 가능한한 원문이 1줄이면 1줄에 들어가게 하고, 부득이하면 경우에 따라
+#     알맞게 줄바꿈합니다. (커맨드라인이면 줄바꿈하고 다음 줄에 탭 2개)
+# - 용어는 일관성을 지켜 주십시오.
+#   - 용어가 바뀌어야 한다고 생각하면 그렇게 번역하기 전에 충분히 의견 교환을
+#     하십시오.
+# - 일반적인 문장에서 영어 단어를 그대로 쓰지 않습니다. 최소한 음역합니다.
+#   - 예외적으로 명령어 등 문자 그대로 가리키는 경우에만 원문 그대로 씁니다.
+#     - 예: 업스트림 추적에 'origin' 대신 <이름>을 사용합니다
+#   - 번역된 용어가 깃 명령어와 연관되는 경우에는 괄호 안에 씁니다.
+#     - 예: 되돌리기(revert)가 진행 중입니다
+# - 용어:
+#  +--------------+----------------------------------------------+
+#  | 3-way merge  | 3-방향 병합                                  |
+#  | author       | 작성자                                       |
+#  | bisect       | 이등분                                       |
+#  | blob         | 블롭                                         |
+#  | bundle       | 번들                                         |
+#  | branch       | 브랜치                                       |
+#  | cherry-pick  | (커밋) 빼오기                                |
+#  | commit       | 커밋                                         |
+#  | commit-ish   | 커밋-따위                                    |
+#  | committer    | 커미터                                       |
+#  | conflict     | 충돌                                         |
+#  | fast-forward | 정방향 진행                                  |
+#  | head         | 헤드                                         |
+#  | hook         | 훅                                           |
+#  | history      | (커밋) 내역                                  |
+#  | Git          | 깃                                           |
+#  | log          | 기록                                         |
+#  | merge        | 병합                                         |
+#  | note         | 노트                                         |
+#  | pack         | 묶음                                         |
+#  | pathspec     | 경로명세                                     |
+#  | rebase       | 리베이스                                     |
+#  | ref          | 레퍼런스                                     |
+#  | repo         | 저장소                                       |
+#  | remote       | 리모트 (저장소)                              |
+#  | reset        | 재지정                                       |
+#  | revert       | 되돌리기                                     |
+#  | subcommand   | 하위 명령                                    |
+#  | submodule    | 하위 모듈                                    |
+#  | tree-ish     | 트리-따위                                    |
+#  | working tree | 작업 폴더                                    |
+#  +--------------+----------------------------------------------+
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: git\n"
+"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
+"POT-Creation-Date: 2015-12-22 22:50+0800\n"
+"PO-Revision-Date: 2016-01-03 18:50+0900\n"
+"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
+"Language-Team: Git Korean translation <http://github.com/changwoo/git-l10n-"
+"ko>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: advice.c:55
+#, c-format
+msgid "hint: %.*s\n"
+msgstr "힌트: %.*s\n"
+
+#: advice.c:88
+msgid ""
+"Fix them up in the work tree, and then use 'git add/rm <file>'\n"
+"as appropriate to mark resolution and make a commit."
+msgstr ""
+"작업 폴더에서 문제를 바로잡은 다음, 'git add/rm <파일>'을 적절히\n"
+"사용해 해결 표시하고 커밋하십시오."
+
+#: advice.c:101 builtin/merge.c:1225
+msgid "You have not concluded your merge (MERGE_HEAD exists)."
+msgstr "병합 작업을 다 마치지 않았습니다 (MERGE_HEAD 파일이 있습니다)."
+
+#: advice.c:103
+msgid "Please, commit your changes before merging."
+msgstr "병합하기 전에 변경 사항을 커밋하십시오."
+
+#: advice.c:104
+msgid "Exiting because of unfinished merge."
+msgstr "병합을 마치지 못했기 때문에 끝납니다."
+
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<옵션>] <트리-따위> [<경로>...]"
+
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
+msgstr ""
+"git archive --remote <저장소> [--exec <명령>] [<옵션>] <트리-따위> [<경로"
+">...]"
+
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <저장소> [--exec <명령>] --list"
+
+#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
+#, c-format
+msgid "pathspec '%s' did not match any files"
+msgstr "'%s' 경로명세가 어떤 파일과도 일치하지 않습니다"
+
+#: archive.c:429
+msgid "fmt"
+msgstr "형식"
+
+#: archive.c:429
+msgid "archive format"
+msgstr "압축 형식"
+
+#: archive.c:430 builtin/log.c:1229
+msgid "prefix"
+msgstr "접두어"
+
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
+msgstr "아카이브의 각 경로 이름의 앞에 지정한 경로를 붙입니다"
+
+#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535 builtin/blame.c:2536
+#: builtin/config.c:58 builtin/fast-export.c:987 builtin/fast-export.c:989
+#: builtin/grep.c:707 builtin/hash-object.c:99 builtin/ls-files.c:446
+#: builtin/ls-files.c:449 builtin/notes.c:395 builtin/notes.c:558
+#: builtin/read-tree.c:109 parse-options.h:153
+msgid "file"
+msgstr "파일"
+
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "아카이브를 이 파일에 씁니다"
+
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr "작업 폴더의 .gitattributes를 읽습니다"
+
+#: archive.c:436
+msgid "report archived files on stderr"
+msgstr "아카이브에 포함된 파일을 표준오류로 표시합니다"
+
+#: archive.c:437
+msgid "store only"
+msgstr "저장만 하기"
+
+#: archive.c:438
+msgid "compress faster"
+msgstr "더 빠르게 압축"
+
+#: archive.c:446
+msgid "compress better"
+msgstr "더 작게 압축"
+
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "지원하는 압축 형식의 목록을 표시합니다"
+
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77
+msgid "repo"
+msgstr "저장소"
+
+#: archive.c:452 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "원격 저장소 <저장소>에서 아카이브를 가져옵니다"
+
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479
+msgid "command"
+msgstr "명령"
+
+#: archive.c:454 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "원격 git-upload-archive 명령의 경로"
+
+#: attr.c:265
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr ""
+"git attributes에서 반대 패턴은 무시됩니다.\n"
+"앞에 느낌표를 쓰려면 '\\!'를 사용하십시오."
+
+#: branch.c:61
+#, c-format
+msgid "Not setting branch %s as its own upstream."
+msgstr "%s 브랜치를 자신의 업스트림으로 지정하지 않음."
+
+#: branch.c:84
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr ""
+"%s 브랜치가 리베이스를 통해 리모트의 %s 브랜치를 (%s에서) 따라가도록 설정되었"
+"습니다."
+
+#: branch.c:85
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "%s 브랜치가 리모트의 %s 브랜치를 (%s에서) 따라가도록 설정되었습니다."
+
+#: branch.c:89
+#, c-format
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr ""
+"%s 브랜치가 리베이스를 통해 리모트의 %s 브랜치를 따라가도록 설정되었습니다."
+
+#: branch.c:90
+#, c-format
+msgid "Branch %s set up to track local branch %s."
+msgstr "%s 브랜치가 %s 브랜치를 따라가도록 설정되었습니다."
+
+#: branch.c:95
+#, c-format
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr ""
+"%s 브랜치가 리베이스를 통해 리모트의 %s 레퍼런스를 따라가도록 설정되었습니다."
+
+#: branch.c:96
+#, c-format
+msgid "Branch %s set up to track remote ref %s."
+msgstr "%s 브랜치가 리모트의 %s 레퍼런스를 따라가도록 설정되었습니다."
+
+#: branch.c:100
+#, c-format
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr ""
+"%s 브랜치가 리베이스를 통해 로컬의 %s 레퍼런스를 따라가도록 설정되었습니다."
+
+#: branch.c:101
+#, c-format
+msgid "Branch %s set up to track local ref %s."
+msgstr "%s 브랜치가 로컬의 %s 레퍼런스를 따라가도록 설정되었습니다."
+
+#: branch.c:134
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "따라가지 않음: %s 레퍼런스에 대해 애매한 정보"
+
+#: branch.c:163
+#, c-format
+msgid "'%s' is not a valid branch name."
+msgstr "'%s'은(는) 올바른 브랜치 이름이 아닙니다."
+
+#: branch.c:168
+#, c-format
+msgid "A branch named '%s' already exists."
+msgstr "이름이 '%s'인 브랜치가 이미 있습니다."
+
+#: branch.c:176
+msgid "Cannot force update the current branch."
+msgstr "현재 브랜치를 강제로 업데이트할 수 없습니다."
+
+#: branch.c:196
+#, c-format
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr ""
+"따라가기 정보를 설정할 수 없습니다. 시작 위치 '%s'이(가) 브랜치가 아닙니다."
+
+#: branch.c:198
+#, c-format
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "요청한 업스트림 '%s' 브랜치가 없습니다"
+
+#: branch.c:200
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr ""
+"\n"
+"리모트에 이미 있는 업스트림 브랜치를 기반으로 작업하려면,\n"
+"먼저 \"git fetch\"로 가져 리모트 브랜치를 가져옵니다.\n"
+"\n"
+"새 로컬 브랜치를 거기에 해당하는 리모트 브랜치로 push하려면,\n"
+"\"git push -u\"로 push하는 업스트림을 설정할 수 있습니다."
+
+#: branch.c:244
+#, c-format
+msgid "Not a valid object name: '%s'."
+msgstr "올바른 오브젝트 이름이 아닙니다: '%s'."
+
+#: branch.c:264
+#, c-format
+msgid "Ambiguous object name: '%s'."
+msgstr "애매한 오브젝트 이름: '%s'."
+
+#: branch.c:269
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr "올바른 브랜치 위치가 아닙니다: '%s'."
+
+#: branch.c:322
+#, c-format
+msgid "'%s' is already checked out at '%s'"
+msgstr "'%s'은(는) 이미 '%s' 위치에 받아져 있습니다"
+
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' 파일이 버전2 번들 파일로 보이지 않습니다"
+
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "인식할 수 없는 헤더: %s%s (%d)"
+
+#: bundle.c:87 builtin/commit.c:766
+#, c-format
+msgid "could not open '%s'"
+msgstr "'%s'을(를) 열 수 없습니다"
+
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "저장소에 필수적인 다음 커밋이 없습니다:"
+
+#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083
+#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334
+#: builtin/log.c:849 builtin/log.c:1461 builtin/log.c:1694 builtin/merge.c:358
+#: builtin/shortlog.c:158
+msgid "revision walk setup failed"
+msgstr "리비전 walk 준비가 실패했습니다"
+
+#: bundle.c:185
+#, c-format
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "번들에 다음 레퍼런스 %d개가 있습니다:"
+
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "번들은 전체 커밋 내역을 기록합니다."
+
+#: bundle.c:194
+#, c-format
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "번들에 다음 레퍼런스 %d개가 필요합니다:"
+
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "pack-objects 명령을 실행할 수 없습니다"
+
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "pack-objects 명령이 죽었습니다"
+
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "rev-list 명령이 죽었습니다"
+
+#: bundle.c:353
+#, c-format
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "rev-list 옵션에서 '%s' 레퍼런스가 제외되었습니다"
+
+#: bundle.c:443 builtin/log.c:157 builtin/log.c:1369 builtin/shortlog.c:261
+#, c-format
+msgid "unrecognized argument: %s"
+msgstr "알 수 없는 인자: %s"
+
+#: bundle.c:449
+msgid "Refusing to create empty bundle."
+msgstr "빈 번들은 만들지 않습니다."
+
+#: bundle.c:459
+#, c-format
+msgid "cannot create '%s'"
+msgstr "'%s'을(를) 만들 수 없습니다"
+
+#: bundle.c:480
+msgid "index-pack died"
+msgstr "index-pack 명령이 죽었습니다"
+
+#: color.c:275
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "잘못된 색 값: %.*s"
+
+#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520
+#: builtin/am.c:2149
+#, c-format
+msgid "could not parse %s"
+msgstr "parse %s을(를) 파싱할 수 없습니다"
+
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s, 커밋이 아닙니다"
+
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "메모리 바닥남"
+
+#: config.c:474 config.c:476
+#, c-format
+msgid "bad config file line %d in %s"
+msgstr "%2$s 파일 %1$d번 줄에 잘못된 설정"
+
+#: config.c:592
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s', %s 파일): %s"
+
+#: config.c:594
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s'): %s"
+
+#: config.c:679
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr "다음에 사용자 디렉터리 확장에 실패: '%s'"
+
+#: config.c:757 config.c:768
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr "%d번은 올바른 zlib 압축 단계가 아닙니다"
+
+#: config.c:890
+#, c-format
+msgid "invalid mode for object creation: %s"
+msgstr "오브젝트 생성 모드가 올바르지 않습니다: %s"
+
+#: config.c:1216
+msgid "unable to parse command-line config"
+msgstr "명령행 설정을 파싱할 수 없습니다"
+
+#: config.c:1277
+msgid "unknown error occured while reading the configuration files"
+msgstr "설정 파일을 읽는 중 알 수 없는 오류가 생겼습니다"
+
+#: config.c:1601
+#, c-format
+msgid "unable to parse '%s' from command-line config"
+msgstr "명령행 설정에서 '%s'을(를) 설정할 수 없습니다"
+
+#: config.c:1603
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "'%2$s' 파일의 %3$d번 줄 '%1$s' 설정 변수가 잘못되었습니다"
+
+#: config.c:1662
+#, c-format
+msgid "%s has multiple values"
+msgstr "%s은(는) 여러 개 값이 있습니다"
+
+#: connected.c:69
+msgid "Could not run 'git rev-list'"
+msgstr "'git rev-list'를 실행할 수 없습니다"
+
+#: connected.c:89
+#, c-format
+msgid "failed write to rev-list: %s"
+msgstr "rev-list 쓰기에 실패했습니다: %s"
+
+#: connected.c:97
+#, c-format
+msgid "failed to close rev-list's stdin: %s"
+msgstr "rev-list의 표준입력을 닫는데 실패했습니다: %s"
+
+#: date.c:95
+msgid "in the future"
+msgstr "미래에"
+
+#: date.c:101
+#, c-format
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "%lu초 전"
+
+#: date.c:108
+#, c-format
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "%lu분 전"
+
+#: date.c:115
+#, c-format
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "%lu시간 전"
+
+#: date.c:122
+#, c-format
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "%lu일 전"
+
+#: date.c:128
+#, c-format
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "%lu주 전"
+
+#: date.c:135
+#, c-format
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "%lu달 전"
+
+#: date.c:146
+#, c-format
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu년"
+
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:149
+#, c-format
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "%s %lu달 전"
+
+#: date.c:154 date.c:159
+#, c-format
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "%lu년 전"
+
+#: diffcore-order.c:24
+#, c-format
+msgid "failed to read orderfile '%s'"
+msgstr "'%s' 순서 파일을 읽는데 실패했습니다"
+
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "부정확한 이름 바꾸기 탐색을 수행하는 중"
+
+#: diff.c:115
+#, c-format
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr "  dirstat 자름 퍼센트 값 '%s' 파싱에 실패했습니다\n"
+
+#: diff.c:120
+#, c-format
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  알 수 없는 dirstat 파라미터 '%s'\n"
+
+#: diff.c:215
+#, c-format
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr "'diff.submodule' 설정 변수에 알 수 없는 값: '%s'"
+
+#: diff.c:267
+#, c-format
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"'diff.submodule' 설정 변수에 오류:\n"
+"%s'"
+
+#: diff.c:3000
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr "외부 diff 프로그램이 죽음, %s 위치에서 멈춤"
+
+#: diff.c:3396
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow 옵션에는 정확히 하나의 경로명세가 필요합니다"
+
+#: diff.c:3559
+#, c-format
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr ""
+"--dirstat/-X 옵션 파라미터를 파싱하는데 실패했습니다:\n"
+"%s"
+
+#: diff.c:3573
+#, c-format
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "--submodule 옵션 파라미터 파싱에 실패했습니다: '%s'"
+
+#: dir.c:1915
+msgid "failed to get kernel name and information"
+msgstr "커널 이름과 정보를 가져오는데 실패했습니다"
+
+#: dir.c:1998
+msgid "Untracked cache is disabled on this system."
+msgstr "이 시스템에서는 추적되지 않는 캐시를 사용하지 않습니다."
+
+#: gpg-interface.c:166 gpg-interface.c:237
+msgid "could not run gpg."
+msgstr "gpg를 실행할 수 없습니다."
+
+#: gpg-interface.c:178
+msgid "gpg did not accept the data"
+msgstr "gpg에서 데이터를 받아들이지 않습니다"
+
+#: gpg-interface.c:189
+msgid "gpg failed to sign the data"
+msgstr "gpg에서 데이터를 서명하는데 실패했습니다."
+
+#: gpg-interface.c:222
+#, c-format
+msgid "could not create temporary file '%s': %s"
+msgstr "임시 파일 '%s'을(를) 만들 수 없습니다: %s"
+
+#: gpg-interface.c:225
+#, c-format
+msgid "failed writing detached signature to '%s': %s"
+msgstr "분리된 서명을 '%s'에 쓰는데 실패했습니다: %s"
+
+#: grep.c:1718
+#, c-format
+msgid "'%s': unable to read %s"
+msgstr "'%s': %s을(를) 읽을 수 없습니다"
+
+#: grep.c:1735
+#, c-format
+msgid "'%s': %s"
+msgstr "'%s': %s"
+
+#: grep.c:1746
+#, c-format
+msgid "'%s': short read %s"
+msgstr "'%s': %s에서 읽다가 잘림"
+
+#: help.c:207
+#, c-format
+msgid "available git commands in '%s'"
+msgstr "'%s'에 있는 깃 명령"
+
+#: help.c:214
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "다른 $PATH에 있는 깃 명령"
+
+#: help.c:246
+msgid "These are common Git commands used in various situations:"
+msgstr "다음은 여러가지 상황에서 자주 사용하는 깃 명령입니다:"
+
+#: help.c:311
+#, c-format
+msgid ""
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
+msgstr ""
+"'%s'은(는) 깃 명령으로 보이지만, 실행할 수\n"
+"없습니다. 아마도 git-%s 망가진 것 같습니다."
+
+#: help.c:368
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "어라라. 시스템에 깃 명령이 하나도 없다고 나옵니다."
+
+#: help.c:390
+#, c-format
+msgid ""
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
+msgstr ""
+"경고: 이름이 '%s'인 깃 명령을 실행했지만, 그 명령이 없습니다.\n"
+"자동으로 '%s' 명령이라고 가정하고 계속합니다"
+
+#: help.c:395
+#, c-format
+msgid "in %0.1f seconds automatically..."
+msgstr "(%0.1f초 뒤에)..."
+
+#: help.c:402
+#, c-format
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: '%s'은(는) 깃 명령이 아닙니다. 'git --help'를 참고하십시오."
+
+#: help.c:406 help.c:466
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"다음을 의도하신 것 아니었나요?"
+
+#: help.c:462
+#, c-format
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
+
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "캐시를 읽는데 실패했습니다"
+
+#: merge.c:94 builtin/am.c:2022 builtin/am.c:2057 builtin/checkout.c:376
+#: builtin/checkout.c:587 builtin/clone.c:722
+msgid "unable to write new index file"
+msgstr "새 인덱스 파일을 쓸 수 없습니다"
+
+#: merge-recursive.c:189
+#, c-format
+msgid "(bad commit)\n"
+msgstr "(잘못된 커밋)\n"
+
+#: merge-recursive.c:209
+#, c-format
+msgid "addinfo_cache failed for path '%s'"
+msgstr "'%s' 경로에 대해 addinfo_cache가 실패했습니다"
+
+#: merge-recursive.c:270
+msgid "error building trees"
+msgstr "트리 빌드에 오류"
+
+#: merge-recursive.c:686
+#, c-format
+msgid "failed to create path '%s'%s"
+msgstr "'%s' 경로 만들기에 실패했습니다%s"
+
+#: merge-recursive.c:697
+#, c-format
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "하위 디렉터리에 공간을 만드려고 %s을(를) 제거합니다\n"
+
+#: merge-recursive.c:711 merge-recursive.c:732
+msgid ": perhaps a D/F conflict?"
+msgstr ": 아마도 D/F 충돌?"
+
+#: merge-recursive.c:722
+#, c-format
+msgid "refusing to lose untracked file at '%s'"
+msgstr "'%s' 위치의 추적되지 않는 파일을 잃기를 거부합니다"
+
+#: merge-recursive.c:762
+#, c-format
+msgid "cannot read object %s '%s'"
+msgstr "%s '%s' 오브젝트를 읽을 수 없음"
+
+#: merge-recursive.c:764
+#, c-format
+msgid "blob expected for %s '%s'"
+msgstr "%s '%s'에 대해 블롭을 예상"
+
+#: merge-recursive.c:787 builtin/clone.c:369
+#, c-format
+msgid "failed to open '%s'"
+msgstr "'%s'을(를) 여는데 실패"
+
+#: merge-recursive.c:795
+#, c-format
+msgid "failed to symlink '%s'"
+msgstr "'%s' 심볼릭 링크에 실패"
+
+#: merge-recursive.c:798
+#, c-format
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "다음을 어떻게 할지 알 수 없습니다: %06o %s '%s'"
+
+#: merge-recursive.c:936
+msgid "Failed to execute internal merge"
+msgstr "내부 병합 실행에 실패"
+
+#: merge-recursive.c:940
+#, c-format
+msgid "Unable to add %s to database"
+msgstr "%s을(를) 데이터베이스에 추가할 수 없습니다"
+
+#: merge-recursive.c:956
+msgid "unsupported object type in the tree"
+msgstr "트리에서 지원하지 않는 오브젝트 종류"
+
+#: merge-recursive.c:1031 merge-recursive.c:1045
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
+msgstr ""
+"충돌! (%s/삭제): %s (위치 %s) 및 %s (%s에서) 삭제. %s 버전의 %s 트리에 남음."
+
+#: merge-recursive.c:1037 merge-recursive.c:1050
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
+msgstr ""
+"충돌! (%s/삭제): %s (위치 %s) 및 %s (위치 %s) 삭제. %s 버전의 %s 트리에 "
+"%s(으)로 남음."
+
+#: merge-recursive.c:1091
+msgid "rename"
+msgstr "이름바꾸기"
+
+#: merge-recursive.c:1091
+msgid "renamed"
+msgstr "이름바꿈"
+
+#: merge-recursive.c:1147
+#, c-format
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s은(는) %s에 있는 디렉터리로 %s(으)로 이름을 바꿉니다"
+
+#: merge-recursive.c:1169
+#, c-format
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
+msgstr ""
+"충돌! (이름바꾸기/이름바꾸기): \"%3$s\" 브랜치에서 이름바꾸기 \"%1$s\"->"
+"\"%2$s\" \"%6$s\" 브랜치에서 이름 바꾸기 \"%4$s\"->\"%5$s\"%7$s"
+
+#: merge-recursive.c:1174
+msgid " (left unresolved)"
+msgstr " (해결되지 않음)"
+
+#: merge-recursive.c:1228
+#, c-format
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgstr ""
+"충돌! (rename/rename): 이름 바꾸기 %s->%s (위치 %s). 이름 바꾸기 %s->%s (위"
+"치 %s)"
+
+#: merge-recursive.c:1258
+#, c-format
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "대신 이름을 %s에서 %s(으)로 바꾸고 %s에서 %s(으)로 바꿉니다"
+
+#: merge-recursive.c:1457
+#, c-format
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+msgstr "충돌! (rename/add): 이름 바꾸기 %s->%s (위치 %s). %s 추가 (위치 %s)"
+
+#: merge-recursive.c:1467
+#, c-format
+msgid "Adding merged %s"
+msgstr "병합된 %s을(를) 추가합니다"
+
+#: merge-recursive.c:1472 merge-recursive.c:1674
+#, c-format
+msgid "Adding as %s instead"
+msgstr "대신 %s(으)로 추가합니다"
+
+#: merge-recursive.c:1523
+#, c-format
+msgid "cannot read object %s"
+msgstr "%s 오브젝트를 읽을 수 없습니다"
+
+#: merge-recursive.c:1526
+#, c-format
+msgid "object %s is not a blob"
+msgstr "%s 오브젝트는 블롭이 아닙니다"
+
+#: merge-recursive.c:1578
+msgid "modify"
+msgstr "수정"
+
+#: merge-recursive.c:1578
+msgid "modified"
+msgstr "수정됨"
+
+#: merge-recursive.c:1588
+msgid "content"
+msgstr "내용"
+
+#: merge-recursive.c:1595
+msgid "add/add"
+msgstr "추가/추가"
+
+#: merge-recursive.c:1629
+#, c-format
+msgid "Skipped %s (merged same as existing)"
+msgstr "건너뛰기: %s (기존과 같게 병합)"
+
+#: merge-recursive.c:1643
+#, c-format
+msgid "Auto-merging %s"
+msgstr "자동 병합: %s"
+
+#: merge-recursive.c:1647 git-submodule.sh:1025
+msgid "submodule"
+msgstr "하위 모듈"
+
+#: merge-recursive.c:1648
+#, c-format
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "충돌! (%s): %s에 병합 충돌"
+
+#: merge-recursive.c:1734
+#, c-format
+msgid "Removing %s"
+msgstr "제거: %s"
+
+#: merge-recursive.c:1759
+msgid "file/directory"
+msgstr "파일/디렉터리"
+
+#: merge-recursive.c:1765
+msgid "directory/file"
+msgstr "디렉터리/파일"
+
+#: merge-recursive.c:1770
+#, c-format
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
+msgstr ""
+"충돌! (%s): 이름이 %s인 디렉터리가 %s에 있습니다. %s을(를) %s(으)로 추가합니"
+"다"
+
+#: merge-recursive.c:1780
+#, c-format
+msgid "Adding %s"
+msgstr "추가: %s"
+
+#: merge-recursive.c:1797
+msgid "Fatal merge failure, shouldn't happen."
+msgstr "치명적인 병합 실패, 일어날 수 없는 상황."
+
+#: merge-recursive.c:1816
+msgid "Already up-to-date!"
+msgstr "이미 업데이트 상태입니다!"
+
+#: merge-recursive.c:1825
+#, c-format
+msgid "merging of trees %s and %s failed"
+msgstr "%s 및 %s 트리의 병합이 실패했습니다"
+
+#: merge-recursive.c:1855
+#, c-format
+msgid "Unprocessed path??? %s"
+msgstr "처리되지 않은 경로??? %s"
+
+#: merge-recursive.c:1903
+msgid "Merging:"
+msgstr "병합:"
+
+#: merge-recursive.c:1916
+#, c-format
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] "과거의 공통 커밋 %u개 발견:"
+
+#: merge-recursive.c:1953
+msgid "merge returned no commit"
+msgstr "병합 결과에 커밋이 없습니다"
+
+#: merge-recursive.c:2010
+#, c-format
+msgid "Could not parse object '%s'"
+msgstr "'%s' 오브젝트를 파싱할 수 없습니다"
+
+#: merge-recursive.c:2021 builtin/merge.c:645
+msgid "Unable to write index."
+msgstr "인덱스를 쓸 수 없습니다."
+
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr "초기화하지 않았거나 레퍼런스하지 않은 notes 트리를 커밋할 수 없습니다"
+
+#: notes-utils.c:100
+#, c-format
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "잘못된 notes.rewriteMode 값: '%s'"
+
+#: notes-utils.c:110
+#, c-format
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "%s에서 노트를 다시 쓰기를 거부합니다 (refs/notes/ 밖임)"
+
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:137
+#, c-format
+msgid "Bad %s value: '%s'"
+msgstr "잘못된 %s 값: '%s'"
+
+#: object.c:242
+#, c-format
+msgid "unable to parse object: %s"
+msgstr "오브젝트를 파싱할 수 없습니다: %s"
+
+#: parse-options.c:570
+msgid "..."
+msgstr "..."
+
+#: parse-options.c:588
+#, c-format
+msgid "usage: %s"
+msgstr "사용법: %s"
+
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:592
+#, c-format
+msgid "   or: %s"
+msgstr "  또는: %s"
+
+#: parse-options.c:595
+#, c-format
+msgid "    %s"
+msgstr "    %s"
+
+#: parse-options.c:629
+msgid "-NUM"
+msgstr "-NUM"
+
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "잘못된 형식의 오브젝트 이름 '%s'"
+
+#: path.c:752
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "%s을(를) 그룹에서 쓰기 가능하도록 만들 수 없습니다"
+
+#: pathspec.c:133
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+msgstr "'glob' 및 'noglob' 경로명세 전체 설정은 호환되지 않습니다"
+
+#: pathspec.c:143
+msgid ""
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
+msgstr ""
+"'literal' 경로명세 전체 설정은 다른 경로명세 전체 설정과 호환되지 않습니다"
+
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "경로명세 지시어 'prefix'에 잘못된 파라미터"
+
+#: pathspec.c:183
+#, c-format
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "잘못된 경로명세 지시어 '%.*s' (위치 '%s')"
+
+#: pathspec.c:187
+#, c-format
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "경로 명세 지시어 끝에 ')' 빠짐 (위치 '%s')"
+
+#: pathspec.c:205
+#, c-format
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "구현되지 않은 경로명세 지시어 '%c' (위치 '%s')"
+
+#: pathspec.c:230
+#, c-format
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: 'literal'과 'glob'은 호환되지 않습니다"
+
+#: pathspec.c:241
+#, c-format
+msgid "%s: '%s' is outside repository"
+msgstr "%s: '%s'은(는) 저장소 밖입니다"
+
+#: pathspec.c:291
+#, c-format
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "경로명세 '%s'은(는) ''%.*s' 하위 모듈 안에 있습니다"
+
+#: pathspec.c:353
+#, c-format
+msgid "%s: pathspec magic not supported by this command: %s"
+msgstr "%s: 경로명세 지시어가 이 명령어에서 지원하지 않습니다: %s"
+
+#: pathspec.c:432
+#, c-format
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "'%s' 경로명세는 심볼릭 링크 아래에 있습니다"
+
+#: pathspec.c:441
+msgid ""
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
+msgstr ""
+":(exclude) 패턴으로 제외할 사항이 없습니다.\n"
+"':/' 또는 '.' 추가를 잊으신 것 아닙니까?"
+
+#: pretty.c:969
+msgid "unable to parse --pretty format"
+msgstr "--pretty 형식을 파싱할 수 없습니다"
+
+#: progress.c:235
+msgid "done"
+msgstr "완료"
+
+#: read-cache.c:1281
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"index.version이 설정되었지만, 이 값이 잘못되었습니다.\n"
+"%i 버전을 사용합니다"
+
+#: read-cache.c:1291
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION이 설정되었지만, 이 값이 잘못되었습니다.\n"
+"%i 버전을 사용합니다"
+
+#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
+#: builtin/merge.c:983
+#, c-format
+msgid "Could not open '%s' for writing"
+msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다"
+
+#: refs/files-backend.c:2359
+#, c-format
+msgid "could not delete reference %s: %s"
+msgstr "%s 레퍼런스를 삭제할 수 없습니다: %s"
+
+#: refs/files-backend.c:2362
+#, c-format
+msgid "could not delete references: %s"
+msgstr "레퍼런스를 삭제할 수 없습니다: %s"
+
+#: refs/files-backend.c:2371
+#, c-format
+msgid "could not remove reference %s"
+msgstr "%s 레퍼런스를 제거할 수 없습니다"
+
+#: ref-filter.c:245
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "형식: %%(end) 아톰이 대응되는 아톰 없이 사용되었습니다"
+
+#: ref-filter.c:704
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "'contents:lines=%s'에서 0보다 큰 값이 와야 합니다"
+
+#: ref-filter.c:833
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "예상한 형식: %%(color:<색>)"
+
+#: ref-filter.c:835
+msgid "unable to parse format"
+msgstr "형식을 파싱할 수 없습니다"
+
+#: ref-filter.c:870
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "예상한 형식: %%(align:<너비>,<위치>)"
+
+#: ref-filter.c:893
+#, c-format
+msgid "improper format entered align:%s"
+msgstr "align:%s 잘못된 형식이 입력되었습니다"
+
+#: ref-filter.c:898
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "%%(align) 아톰에 너비가 0보다 커야 합니다"
+
+#: ref-filter.c:1219
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "'%s'에 잘못된 형식의 오브젝트"
+
+#: ref-filter.c:1561
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "형식: %%(end) 아톰이 없습니다"
+
+#: ref-filter.c:1615
+#, c-format
+msgid "malformed object name %s"
+msgstr "잘못된 형식의 오브젝트 이름 %s"
+
+#: remote.c:756
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "%s 및 %s을(를) 모두 %s에 가져올 수 없습니다"
+
+#: remote.c:760
+#, c-format
+msgid "%s usually tracks %s, not %s"
+msgstr "%s은(는) 보통 %s을(를) 추적하고, %s을(를) 추적하지 않습니다"
+
+#: remote.c:764
+#, c-format
+msgid "%s tracks both %s and %s"
+msgstr "%s은(는) %s 및 %s 모두 추적합니다"
+
+#: remote.c:772
+msgid "Internal error"
+msgstr "내부 오류"
+
+#: remote.c:1687 remote.c:1730
+msgid "HEAD does not point to a branch"
+msgstr "HEAD가 브랜치를 가리키지 않습니다"
+
+#: remote.c:1696
+#, c-format
+msgid "no such branch: '%s'"
+msgstr "그런 브랜치가 없습니다: '%s'"
+
+#: remote.c:1699
+#, c-format
+msgid "no upstream configured for branch '%s'"
+msgstr "'%s' 브랜치에 대해 업스트림을 설정하지 않았습니다"
+
+#: remote.c:1705
+#, c-format
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "업스트림 '%s' 브랜치가 리모트 추적 브랜치로 저장되지 않았습니다"
+
+#: remote.c:1720
+#, c-format
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgstr "리모트 '%2$s'의 푸시 대상 '%1$s'에 로컬 추적 브랜치가 없습니다"
+
+#: remote.c:1735
+#, c-format
+msgid "branch '%s' has no remote for pushing"
+msgstr "'%s' 브랜치에 푸시 리모트가 없습니다"
+
+#: remote.c:1746
+#, c-format
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "'%s'에 대한 푸시 레퍼런스명세에 '%s'이(가) 들어 있지 않습니다"
+
+#: remote.c:1759
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "푸시의 대상이 없습니다 (push.default가 'nothing'입니다)"
+
+#: remote.c:1781
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "하나의 대상에 대해 'simple' 푸시를 처리할 수 없습니다"
+
+#: remote.c:2083
+#, c-format
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgstr "현재 브랜치가 '%s' 기반이지만, 업스트림이 없어졌습니다.\n"
+
+#: remote.c:2087
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (바로잡으려면 \"git branch --unset-upstream\"을 사용하십시오)\n"
+
+#: remote.c:2090
+#, c-format
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "브랜치가 '%s'에 맞게 업데이트된 상태입니다.\n"
+
+#: remote.c:2094
+#, c-format
+msgid "Your branch is ahead of '%s' by %d commit.\n"
+msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
+msgstr[0] "브랜치가 '%s'보다 %d개 커밋만큼 앞에 있습니다.\n"
+
+#: remote.c:2100
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (로컬에 있는 커밋을 제출하려면 \"git push\"를 사용하십시오)\n"
+
+#: remote.c:2103
+#, c-format
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] "브랜치가 '%s'보다 %d개 커밋 뒤에 있고, 앞으로 돌릴 수 있습니다.\n"
+
+#: remote.c:2111
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr "  (로컬 브랜치를 업데이트하려면 \"git pull\"을 사용하십시오)\n"
+
+#: remote.c:2114
+#, c-format
+msgid ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] ""
+"현재 브랜치와 '%s'이(가) 갈라졌습니다,\n"
+"다른 커밋이 각각 %d개와 %d개 있습니다.\n"
+
+#: remote.c:2124
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+msgstr ""
+"  (리모트의 브랜치를 현재 브랜치로 병합하려면 \"git pull\"을 사용하십시오)\n"
+
+#: revision.c:2193
+msgid "your current branch appears to be broken"
+msgstr "현재 브랜치가 망가진 것처럼 보입니다"
+
+#: revision.c:2196
+#, c-format
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "현재 '%s' 브랜치에 아직 아무 커밋도 없습니다"
+
+#: revision.c:2390
+msgid "--first-parent is incompatible with --bisect"
+msgstr "--first-parent 옵션은 --bisect 옵션과 호환되지 않습니다"
+
+#: run-command.c:90
+msgid "open /dev/null failed"
+msgstr "/dev/null 열기 실패"
+
+#: run-command.c:92
+#, c-format
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) 실패"
+
+#: send-pack.c:295
+msgid "failed to sign the push certificate"
+msgstr "푸시 인증서 서명에 실패했습니다"
+
+#: send-pack.c:404
+msgid "the receiving end does not support --signed push"
+msgstr "받는 쪽에서 --signed 푸시를 지원하지 않습니다"
+
+#: send-pack.c:406
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
+msgstr ""
+"받는 쪽에서 --signed 푸시를 지원하지 않으므로 푸시 인증서를 보내지 않습니다"
+
+#: send-pack.c:418
+msgid "the receiving end does not support --atomic push"
+msgstr "받는 쪽에서 --atomic 푸시를 지원하지 않습니다"
+
+#: sequencer.c:183
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr ""
+"이 충돌을 해결한 뒤에, 바로잡은 경로를\n"
+"'git add <경로>' 또는 'git rm <경로>'로 표시하십시오"
+
+#: sequencer.c:186
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
+msgstr ""
+"이 충돌을 해결한 뒤에, 바로잡은 경로를\n"
+"'git add <경로>' 또는 'git rm <경로>'로 표시하십시오.\n"
+"그리고 결과물을 'git commit'으로 커밋하십시오"
+
+#: sequencer.c:199 sequencer.c:842 sequencer.c:922
+#, c-format
+msgid "Could not write to %s"
+msgstr "%s에 쓸 수 없습니다"
+
+#: sequencer.c:202
+#, c-format
+msgid "Error wrapping up %s"
+msgstr "%s 잠그는데 오류"
+
+#: sequencer.c:217
+msgid "Your local changes would be overwritten by cherry-pick."
+msgstr "로컬 변경 사항을 cherry-pick 때문에 덮어 쓰게 됩니다."
+
+#: sequencer.c:219
+msgid "Your local changes would be overwritten by revert."
+msgstr "로컬 변경 사항을 revert 때문에 덮어 쓰게 됩니다."
+
+#: sequencer.c:222
+msgid "Commit your changes or stash them to proceed."
+msgstr "변경 사항을 스테이징하거나 스태시한 다음 계속하십시오."
+
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:309
+#, c-format
+msgid "%s: Unable to write new index file"
+msgstr "%s: 새 인덱스 파일을 쓸 수 없습니다"
+
+#: sequencer.c:327
+msgid "Could not resolve HEAD commit\n"
+msgstr "HEAD 커밋을 처리할 수 없습니다\n"
+
+#: sequencer.c:347
+msgid "Unable to update cache tree\n"
+msgstr "캐시 트리를 업데이트할 수 없습니다\n"
+
+#: sequencer.c:399
+#, c-format
+msgid "Could not parse commit %s\n"
+msgstr "%s 커밋을 파싱할 수 없습니다\n"
+
+#: sequencer.c:404
+#, c-format
+msgid "Could not parse parent commit %s\n"
+msgstr "%s 이전 커밋을 파싱할 수 없습니다\n"
+
+#: sequencer.c:469
+msgid "Your index file is unmerged."
+msgstr "인덱스 파일이 병합되지 않았습니다."
+
+#: sequencer.c:488
+#, c-format
+msgid "Commit %s is a merge but no -m option was given."
+msgstr "%s 커밋은 병합이지만 -m 옵션이 주어지지 않았습니다."
+
+# FIXME: "parent %d" 번호가 무슨 의미?
+#: sequencer.c:496
+#, c-format
+msgid "Commit %s does not have parent %d"
+msgstr "Commit %s 커밋에 이전 커밋 %d이(가) 없습니다"
+
+#: sequencer.c:500
+#, c-format
+msgid "Mainline was specified but commit %s is not a merge."
+msgstr "메인라인을 지정했지만 %s 커밋이 병합 커밋이 아닙니다."
+
+#. TRANSLATORS: The first %s will be "revert" or
+#. "cherry-pick", the second %s a SHA1
+#: sequencer.c:513
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: %s 이전 커밋을 파싱할 수 없습니다"
+
+#: sequencer.c:517
+#, c-format
+msgid "Cannot get commit message for %s"
+msgstr "%s에 대한 커밋 메시지를 가져올 수 없습니다"
+
+#: sequencer.c:603
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "다음을 되돌릴(revert) 수 없습니다: %s... %s"
+
+#: sequencer.c:604
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "다음을 적용할(apply) 수 없습니다: %s... %s"
+
+#: sequencer.c:639
+msgid "empty commit set passed"
+msgstr "빈 커밋 모음을 건너 뜁니다"
+
+#: sequencer.c:647
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s: 인덱스 읽기에 실패했습니다"
+
+#: sequencer.c:651
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: 인덱스 새로 고침에 실패했습니다"
+
+#: sequencer.c:711
+#, c-format
+msgid "Cannot %s during a %s"
+msgstr "%2$s 동안 %1$s 할 수 없습니다"
+
+#: sequencer.c:733
+#, c-format
+msgid "Could not parse line %d."
+msgstr "%d번 줄을 파싱할 수 없습니다."
+
+#: sequencer.c:738
+msgid "No commits parsed."
+msgstr "파싱한 커밋이 없습니다."
+
+#: sequencer.c:750
+#, c-format
+msgid "Could not open %s"
+msgstr "%s을(를) 열 수 없습니다"
+
+#: sequencer.c:754
+#, c-format
+msgid "Could not read %s."
+msgstr "%s을(를) 읽을 수 없습니다."
+
+#: sequencer.c:761
+#, c-format
+msgid "Unusable instruction sheet: %s"
+msgstr "사용 불가능 인스트럭션 파일: %s"
+
+#: sequencer.c:791
+#, c-format
+msgid "Invalid key: %s"
+msgstr "잘못된 키: %s"
+
+#: sequencer.c:794 builtin/pull.c:47 builtin/pull.c:49
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "%s의 값이 올바르지 않습니다: %s"
+
+#: sequencer.c:804
+#, c-format
+msgid "Malformed options sheet: %s"
+msgstr "형식이 잘못된 옵션 파일: %s"
+
+#: sequencer.c:823
+msgid "a cherry-pick or revert is already in progress"
+msgstr "이미 커밋 빼오기(cherry-pick) 또는 되돌리기(revert)가 진행 중입니다"
+
+#: sequencer.c:824
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "\"git cherry-pick (--continue | --quit | --abort)\" 명령을 해 보십시오"
+
+#: sequencer.c:828
+#, c-format
+msgid "Could not create sequencer directory %s"
+msgstr "%s 시퀀서 디렉터리를 만들 수 없습니다"
+
+#: sequencer.c:844 sequencer.c:926
+#, c-format
+msgid "Error wrapping up %s."
+msgstr "%s 잠그는데 오류."
+
+#: sequencer.c:863 sequencer.c:996
+msgid "no cherry-pick or revert in progress"
+msgstr "빼오기(cherry-pick) 또는 되돌리기(revert)가 진행 중이지 않습니다"
+
+#: sequencer.c:865
+msgid "cannot resolve HEAD"
+msgstr "HEAD를 구해 올 수 없습니다"
+
+#: sequencer.c:867
+msgid "cannot abort from a branch yet to be born"
+msgstr "새로 만들고 있는 브랜치에서 중지할 수 없습니다"
+
+#: sequencer.c:887 builtin/apply.c:4287
+#, c-format
+msgid "cannot open %s: %s"
+msgstr "%s을(를) 열 수 없습니다: %s"
+
+#: sequencer.c:890
+#, c-format
+msgid "cannot read %s: %s"
+msgstr "%s을(를) 읽을 수 없습니다: %s"
+
+#: sequencer.c:891
+msgid "unexpected end of file"
+msgstr "예상치 못하게 파일이 끝났습니다"
+
+#: sequencer.c:897
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "빼오기 전에 저장한 HEAD 파일이('%s') 손상되었습니다"
+
+#: sequencer.c:919
+#, c-format
+msgid "Could not format %s."
+msgstr "%s에 포매팅할 수 없습니다."
+
+#: sequencer.c:1064
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: %s 커밋을 빼올 수 없습니다"
+
+#: sequencer.c:1067
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: 잘못된 리비전"
+
+#: sequencer.c:1101
+msgid "Can't revert as initial commit"
+msgstr "최초의 커밋을 되돌릴 수 없습니다"
+
+#: sequencer.c:1102
+msgid "Can't cherry-pick into empty head"
+msgstr "빈 헤드로 커밋을 빼올 수 없습니다."
+
+#: setup.c:248
+#, c-format
+msgid "failed to read %s"
+msgstr "%s을(를) 읽는데 실패했습니다"
+
+#: sha1_name.c:463
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
+msgstr ""
+"깃에서는 보통 40개의 16진수 문자로 끝나는 레퍼런스를 만들지 않습니다.\n"
+"16진수 문자 40자를 지정했을 때 이 레퍼런스가 무시되기 때문입니다. 이\n"
+"레퍼런스는 실수로 만들어졌을 수도 있습니다. 예를 들어,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"여기서 \"$br\"은 비어 있으므로 40자 레퍼런스가 만들어집니다. 이 레퍼런스를\n"
+"확인해 보시고 잘못 만들어진 것이면 지우십시오. 이 메시지를 보고 싶지\n"
+"않으면 \"git config advice.objectNameWarning false\" 명령을 사용하십시오."
+
+#: submodule.c:61 submodule.c:95
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+"병합하지 않은 .gitmodules를 바꿀 수 없습니다. 병합 충돌을 먼저 해결하십시오"
+
+#: submodule.c:65 submodule.c:99
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "경로가 %s일 때 .gitmodules의 섹션을 찾을 수 없습니다"
+
+#: submodule.c:73
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr ".gitmodules 항목 %s을(를) 업데이트할 수 없습니다"
+
+#: submodule.c:106
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "%s에 대한 .gitmodules 항목을 제거할 수 없습니다"
+
+#: submodule.c:117
+msgid "staging updated .gitmodules failed"
+msgstr "업데이트한 .gitmodules를 커밋할 사항으로 표시하는데 실패"
+
+#: submodule.c:1040
+#, c-format
+msgid "Could not set core.worktree in %s"
+msgstr "%s에서 core.worktree를 설정할 수 없습니다"
+
+#: trailer.c:491 trailer.c:495 trailer.c:499 trailer.c:553 trailer.c:557
+#: trailer.c:561
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "알 수 없는 값 '%s', 키 '%s'"
+
+#: trailer.c:543 trailer.c:548 builtin/remote.c:296
+#, c-format
+msgid "more than one %s"
+msgstr "%s이(가) 여러개입니다"
+
+#: trailer.c:581
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "트레일러 '%.*s'에서 빈 트레일러 토큰"
+
+#: trailer.c:701
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "'%s' 입력 파일을 읽을 수 없습니다"
+
+#: trailer.c:704
+msgid "could not read from stdin"
+msgstr "표준 입력에서 읽을 수 없습니다"
+
+#: transport-helper.c:1025
+#, c-format
+msgid "Could not read ref %s"
+msgstr "%s 레퍼런스를 읽을 수 없습니다"
+
+#: unpack-trees.c:203
+msgid "Checking out files"
+msgstr "파일을 가져옵니다"
+
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "URL 스킴 이름이 잘못되었거나 '://'가 뒤에 붙지 않았습니다"
+
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "잘못된 %XX 이스케이프 시퀀스"
+
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr "호스트가 없고 스킴이 'file:'이 아닙니다"
+
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr "'file:' URL에는 포트 번호를 쓸 수 없습니다"
+
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "호스트 이름에 잘못된 문자"
+
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "잘못된 포트 번호"
+
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "경로에서 잘못된 '..' 부분"
+
+#: wrapper.c:219 wrapper.c:362
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "읽기와 쓰기용으로 '%s'을(를) 열 수 없습니다"
+
+#: wrapper.c:221 wrapper.c:364
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다"
+
+#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691
+#: builtin/merge.c:1074 builtin/pull.c:380
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "'%s'을(를) 읽기용으로 열 수 없습니다"
+
+#: wrapper.c:579
+#, c-format
+msgid "unable to access '%s': %s"
+msgstr "'%s'에 접근할 수 없습니다: %s"
+
+#: wrapper.c:600
+#, c-format
+msgid "unable to access '%s'"
+msgstr "'%s'에 접근할 수 없습니다"
+
+#: wrapper.c:608
+msgid "unable to get current working directory"
+msgstr "현재 작업 디렉터리를 가져올 수 없습니다"
+
+#: wrapper.c:635
+#, c-format
+msgid "could not open %s for writing"
+msgstr "%s을(를) 쓰기용으로 열 수 없습니다"
+
+#: wrapper.c:646 builtin/am.c:425
+#, c-format
+msgid "could not write to %s"
+msgstr "%s에 쓸 수 없습니다"
+
+#: wrapper.c:652
+#, c-format
+msgid "could not close %s"
+msgstr "%s을(를) 닫을 수 없습니다"
+
+#: wt-status.c:149
+msgid "Unmerged paths:"
+msgstr "병합하지 않은 경로:"
+
+#: wt-status.c:176 wt-status.c:203
+#, c-format
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (스테이지 해제하려면 \"git reset %s <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:178 wt-status.c:205
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (스테이지 해제하려면 \"git rm --cached <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:182
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (해결했다고 표시하려면 \"git add <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:184 wt-status.c:188
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr ""
+"  (해결했다고 표시하려면 알맞게 \"git add/rm <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:186
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (해결했다고 표시하려면 \"git rm <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:197 wt-status.c:880
+msgid "Changes to be committed:"
+msgstr "커밋할 변경 사항:"
+
+#: wt-status.c:215 wt-status.c:889
+msgid "Changes not staged for commit:"
+msgstr "커밋하도록 정하지 않은 변경 사항:"
+
+#: wt-status.c:219
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr "  (무엇을 커밋할지 바꾸려면 \"git add <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:221
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr "  (무엇을 커밋할지 바꾸려면 \"git add/rm <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:222
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr ""
+"  (작업 폴더의 변경 사항을 버리려면 \"git checkout -- <파일>...\"을 사용하십"
+"시오)"
+
+#: wt-status.c:224
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr ""
+"  (하위 모듈의 추적되지 않는 파일이나 수정된 내용을 커밋하거나 버리십시오)"
+
+#: wt-status.c:236
+#, c-format
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr "  (커밋할 사항에 포함하려면 \"git %s <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:251
+msgid "both deleted:"
+msgstr "양쪽에서 삭제:"
+
+#: wt-status.c:253
+msgid "added by us:"
+msgstr "이 쪽에서 추가:"
+
+#: wt-status.c:255
+msgid "deleted by them:"
+msgstr "저 쪽에서 삭제:"
+
+#: wt-status.c:257
+msgid "added by them:"
+msgstr "저 쪽에서 추가:"
+
+#: wt-status.c:259
+msgid "deleted by us:"
+msgstr "이 쪽에서 삭제:"
+
+#: wt-status.c:261
+msgid "both added:"
+msgstr "양쪽에서 추가:"
+
+#: wt-status.c:263
+msgid "both modified:"
+msgstr "양쪽에서 수정:"
+
+#: wt-status.c:265
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "bug: 병합하지 않은 상태 %x 처리되지 않음"
+
+#: wt-status.c:273
+msgid "new file:"
+msgstr "새 파일:"
+
+#: wt-status.c:275
+msgid "copied:"
+msgstr "복사함:"
+
+#: wt-status.c:277
+msgid "deleted:"
+msgstr "삭제함:"
+
+#: wt-status.c:279
+msgid "modified:"
+msgstr "수정함:"
+
+#: wt-status.c:281
+msgid "renamed:"
+msgstr "이름 바꿈:"
+
+#: wt-status.c:283
+msgid "typechange:"
+msgstr "종류 바뀜:"
+
+#: wt-status.c:285
+msgid "unknown:"
+msgstr "알 수 없음:"
+
+#: wt-status.c:287
+msgid "unmerged:"
+msgstr "병합하지 않음:"
+
+#: wt-status.c:369
+msgid "new commits, "
+msgstr "새 커밋, "
+
+#: wt-status.c:371
+msgid "modified content, "
+msgstr "수정한 내용, "
+
+#: wt-status.c:373
+msgid "untracked content, "
+msgstr "추적하지 않은 내용, "
+
+#: wt-status.c:390
+#, c-format
+msgid "bug: unhandled diff status %c"
+msgstr "버그: 처리되지 않은 diff 상태 %c"
+
+#: wt-status.c:754
+msgid "Submodules changed but not updated:"
+msgstr "변경되었지만 업데이트하지 않은 하위 모듈:"
+
+#: wt-status.c:756
+msgid "Submodule changes to be committed:"
+msgstr "커밋할 하위 모듈의 변경 사항:"
+
+#: wt-status.c:837
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr ""
+"위의 줄을 바꾸지 마십시오.\n"
+"아래 있는 내용은 모두 제거됩니다."
+
+#: wt-status.c:948
+msgid "You have unmerged paths."
+msgstr "병합하지 않은 경로가 있습니다."
+
+#: wt-status.c:951
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (충돌을 바로잡고 \"git commit\"을 실행하십시오)"
+
+#: wt-status.c:954
+msgid "All conflicts fixed but you are still merging."
+msgstr "모든 충돌을 바로잡았지만 아직 병합하는 중입니다."
+
+#: wt-status.c:957
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (병합을 마무리하려면 \"git commit\"을 사용하십시오)"
+
+#: wt-status.c:967
+msgid "You are in the middle of an am session."
+msgstr "am 세션 중간에 있습니다."
+
+#: wt-status.c:970
+msgid "The current patch is empty."
+msgstr "현재 패치가 비어 있습니다."
+
+#: wt-status.c:974
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (충돌을 바로잡은 다음 \"git am --continue\"를 사용하십시오)"
+
+#: wt-status.c:976
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (이 패치를 건너 뛰려면 \"git am --skip\"을 사용하십시오)"
+
+#: wt-status.c:978
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (원본 브랜치를 복구하려면 \"git am --abort\"를 사용하십시오)"
+
+#: wt-status.c:1105
+msgid "No commands done."
+msgstr "완료한 명령 없음."
+
+#: wt-status.c:1108
+#, c-format
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "최근 완료한 명령 (%d개 명령 완료):"
+
+#: wt-status.c:1119
+#, c-format
+msgid "  (see more in file %s)"
+msgstr "  (자세한 정보는 %s 파일 참고)"
+
+#: wt-status.c:1124
+msgid "No commands remaining."
+msgstr "명령이 남아있지 않음."
+
+#: wt-status.c:1127
+#, c-format
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "다음에 할 명령 (%d개 명령 남음):"
+
+#: wt-status.c:1135
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (보고 편집하려면 \"git rebase --edit-todo\"를 사용하십시오)"
+
+#: wt-status.c:1148
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "현재 '%s' 브랜치를 '%s' 위로 리베이스하는 중입니다."
+
+#: wt-status.c:1153
+msgid "You are currently rebasing."
+msgstr "현재 리베이스하는 중입니다."
+
+#: wt-status.c:1167
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (충돌을 바로잡고 \"git rebase --continue\"를 사용하십시오)"
+
+#: wt-status.c:1169
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (이 패치를 건너뛰려면 \"git rebase --skip\"을 사용하십시오)"
+
+#: wt-status.c:1171
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (원본 브랜치를 가져오려면 \"git rebase --abort\"를 사용하십시오)"
+
+#: wt-status.c:1177
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr ""
+"  (모든 충돌을 바로잡았습니다: \"git rebase --continue\"를 실행하십시오)"
+
+#: wt-status.c:1181
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr "현재 '%s' 브랜치를 '%s' 위로 리베이스하는 중 커밋을 분리하는 중입니다."
+
+#: wt-status.c:1186
+msgid "You are currently splitting a commit during a rebase."
+msgstr "현재 리베이스하는 중 커밋을 분리하는 중입니다."
+
+#: wt-status.c:1189
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr "  (작업 폴더가 깨끗해지면, \"git rebase --continue\"를 실행하십시오)"
+
+#: wt-status.c:1193
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr "'%s' 브랜치를 '%s' 위로 리베이스하는 중 커밋을 편집하는 중입니다."
+
+#: wt-status.c:1198
+msgid "You are currently editing a commit during a rebase."
+msgstr "리베이스 중에 커밋을 편집하는 중입니다."
+
+#: wt-status.c:1201
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (현재 커밋을 수정하려면 \"git commit --amend\"을 사용하십시오)"
+
+#: wt-status.c:1203
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr "  (변경 사항에 만족할 때 \"git rebase --continue\"를 사용하십시오)"
+
+#: wt-status.c:1213
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "현재 %s 커밋을 뽑아 내고 있습니다."
+
+#: wt-status.c:1218
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (충돌을 바로잡고 \"git cherry-pick --continue\"를 실행하십시오)"
+
+#: wt-status.c:1221
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (모든 충돌을 바로잡았습니다: \"git cherry-pick --continue\"를 실행하십시오)"
+
+#: wt-status.c:1223
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr "  (뽑기 작업을 취소하려면 \"git cherry-pick --abort\"를 사용하십시오)"
+
+#: wt-status.c:1232
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "현재 %s 커밋을 되돌리는 중입니다."
+
+#: wt-status.c:1237
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (충돌을 바로잡고 \"git revert --continue\"를 실행하십시오)"
+
+#: wt-status.c:1240
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr ""
+"  (모든 충돌을 바로잡았습니다: \"git revert --continue\"를 실행하십시오)"
+
+#: wt-status.c:1242
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (되돌리기 작업을 취소하려면 \"git revert --abort\"를 사용하십시오)"
+
+#: wt-status.c:1253
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "'이등분하는 중입니다. '%s' 브랜치부터 시작."
+
+#: wt-status.c:1257
+msgid "You are currently bisecting."
+msgstr "'이등분하는 중입니다."
+
+#: wt-status.c:1260
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (원래 브랜치로 돌아가려면 \"git bisect reset\"을 사용하십시오)"
+
+#: wt-status.c:1438
+msgid "On branch "
+msgstr "현재 브랜치 "
+
+#: wt-status.c:1444
+msgid "interactive rebase in progress; onto "
+msgstr "대화형 리베이스 진행 중. 갈 위치는 "
+
+#: wt-status.c:1446
+msgid "rebase in progress; onto "
+msgstr "리베이스 진행 중. 갈 위치는 "
+
+#: wt-status.c:1451
+msgid "HEAD detached at "
+msgstr "HEAD가 다음 위치에서 분리: "
+
+#: wt-status.c:1453
+msgid "HEAD detached from "
+msgstr "HEAD가 다음으로부터 분리: "
+
+#: wt-status.c:1456
+msgid "Not currently on any branch."
+msgstr "현재 어떤 브랜치도 사용하지 않음."
+
+#: wt-status.c:1474
+msgid "Initial commit"
+msgstr "최초 커밋"
+
+#: wt-status.c:1488
+msgid "Untracked files"
+msgstr "추적하지 않는 파일"
+
+#: wt-status.c:1490
+msgid "Ignored files"
+msgstr "무시한 파일"
+
+#: wt-status.c:1494
+#, c-format
+msgid ""
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
+msgstr ""
+"추적하지 않는 파일을 모두 확인하는데 %.2f초가 걸렸습니다.\n"
+"'status -uno' 옵션을 쓰면 빨라질 수도 있지만, 새 파일을\n"
+"직접 찾아서 추가해야 합니다. ('git help status' 참고)"
+
+#: wt-status.c:1500
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "추적하지 않는 파일을 보지 않습니다%s"
+
+#: wt-status.c:1502
+msgid " (use -u option to show untracked files)"
+msgstr " (추적하지 않는 파일을 보려면 -u 옵션을 사용하십시오)"
+
+#: wt-status.c:1508
+msgid "No changes"
+msgstr "변경 사항 없음"
+
+#: wt-status.c:1513
+#, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+"커밋할 변경 사항을 추가하지 않았습니다 (\"git add\" 및/또는 \"git commit -a"
+"\"를\n"
+"사용하십시오)\n"
+
+#: wt-status.c:1516
+#, c-format
+msgid "no changes added to commit\n"
+msgstr "커밋할 변경 사항을 추가하지 않았습니다\n"
+
+#: wt-status.c:1519
+#, c-format
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr ""
+"커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "
+"\"git\n"
+"add\"를 사용하십시오)\n"
+
+#: wt-status.c:1522
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
+msgstr "커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다\n"
+
+#: wt-status.c:1525
+#, c-format
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr ""
+"커밋할 사항 없음 (파일을 만들거나 복사하고 \"git add\"를 사용하면 추적합니"
+"다)\n"
+
+#: wt-status.c:1528 wt-status.c:1533
+#, c-format
+msgid "nothing to commit\n"
+msgstr "커밋할 사항 없음\n"
+
+#: wt-status.c:1531
+#, c-format
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr ""
+"커밋할 사항 없음 (추적하지 않는 파일을 보려면 -u 옵션을 사용하십시오)\n"
+
+#: wt-status.c:1535
+#, c-format
+msgid "nothing to commit, working directory clean\n"
+msgstr "커밋할 사항 없음, 작업 폴더 깨끗함\n"
+
+#: wt-status.c:1642
+msgid "Initial commit on "
+msgstr "최초 커밋, 브랜치: "
+
+#: wt-status.c:1646
+msgid "HEAD (no branch)"
+msgstr "HEAD (브랜치 없음)"
+
+#: wt-status.c:1675
+msgid "gone"
+msgstr "없음"
+
+#: wt-status.c:1677 wt-status.c:1685
+msgid "behind "
+msgstr "뒤에: "
+
+#: compat/precompose_utf8.c:56 builtin/clone.c:408
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "'%s' 파일 삭제에 실패했습니다"
+
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<옵션>] [--] <경로명세>..."
+
+#: builtin/add.c:65
+#, c-format
+msgid "unexpected diff status %c"
+msgstr "예상치 못한 diff 상태 %c"
+
+#: builtin/add.c:70 builtin/commit.c:278
+msgid "updating files failed"
+msgstr "파일 업데이트가 실패했습니다"
+
+#: builtin/add.c:80
+#, c-format
+msgid "remove '%s'\n"
+msgstr "'%s' 제거\n"
+
+#: builtin/add.c:134
+msgid "Unstaged changes after refreshing the index:"
+msgstr "인덱스를 새로 고친 다음 커밋 표시하지 않은 변경 사항:"
+
+#: builtin/add.c:194 builtin/rev-parse.c:796
+msgid "Could not read the index"
+msgstr "인덱스를 읽을 수 없습니다"
+
+#: builtin/add.c:205
+#, c-format
+msgid "Could not open '%s' for writing."
+msgstr "'%s' 파일을 쓰기용으로 열 수 없습니다."
+
+#: builtin/add.c:209
+msgid "Could not write patch"
+msgstr "패치를 쓸 수 없습니다"
+
+#: builtin/add.c:212
+msgid "editing patch failed"
+msgstr "패치 편집에 실패했습니다"
+
+#: builtin/add.c:215
+#, c-format
+msgid "Could not stat '%s'"
+msgstr "'%s'을(를) stat()할 수 없습니다"
+
+#: builtin/add.c:217
+msgid "Empty patch. Aborted."
+msgstr "빈 패치. 중지."
+
+#: builtin/add.c:222
+#, c-format
+msgid "Could not apply '%s'"
+msgstr "'%s'을(를) 적용할 수 없습니다"
+
+#: builtin/add.c:232
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr "다음 경로는 .gitignore 파일 중 하나 때문에 무시합니다:\n"
+
+#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:543
+#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162
+msgid "dry run"
+msgstr "가짜로 실행"
+
+#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19
+#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
+#: builtin/log.c:1645 builtin/mv.c:109 builtin/read-tree.c:114
+msgid "be verbose"
+msgstr "자세히 표시"
+
+#: builtin/add.c:252
+msgid "interactive picking"
+msgstr "대화식으로 고릅니다"
+
+#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "대화식으로 변경된 부분을 선택합니다"
+
+#: builtin/add.c:254
+msgid "edit current diff and apply"
+msgstr "현재 diff를 편집하고 적용합니다"
+
+#: builtin/add.c:255
+msgid "allow adding otherwise ignored files"
+msgstr "무시하는 파일의 추가를 허용합니다"
+
+#: builtin/add.c:256
+msgid "update tracked files"
+msgstr "추적되는 파일을 업데이트합니다"
+
+#: builtin/add.c:257
+msgid "record only the fact that the path will be added later"
+msgstr "나중에 추가할 것이라는 사실만 기록합니다"
+
+#: builtin/add.c:258
+msgid "add changes from all tracked and untracked files"
+msgstr "추적되고 추적되지 않는 모든 파일의 변경 사항을 추가합니다"
+
+#: builtin/add.c:261
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr "작업 폴더에서 제거한 경로를 무시합니다 (--no-all과 동일)"
+
+#: builtin/add.c:263
+msgid "don't add, only refresh the index"
+msgstr "추가하지 않고 인덱스만 새로 고칩니다"
+
+#: builtin/add.c:264
+msgid "just skip files which cannot be added because of errors"
+msgstr "오류 때문에 추가할 수 없는 파일을 건너뜁니다"
+
+#: builtin/add.c:265
+msgid "check if - even missing - files are ignored in dry run"
+msgstr "가짜로 실행했을 때 파일을 무시하는지 확인합니다"
+
+#: builtin/add.c:287
+#, c-format
+msgid "Use -f if you really want to add them.\n"
+msgstr "정말로 추가하려면 -f 옵션을 사용하십시오.\n"
+
+#: builtin/add.c:294
+msgid "adding files failed"
+msgstr "파일 추가가 실패했습니다"
+
+#: builtin/add.c:330
+msgid "-A and -u are mutually incompatible"
+msgstr "-A 및 -u 옵션은 서로 호환되지 않습니다"
+
+#: builtin/add.c:337
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr ""
+"--ignore-missing 옵션은 --dry-run 옵션과 같이 사용할 경우에만 쓸 수 있습니다."
+
+#: builtin/add.c:352
+#, c-format
+msgid "Nothing specified, nothing added.\n"
+msgstr "아무 것도 지정하지 않았으므로 아무 것도 추가하지 않습니다.\n"
+
+#: builtin/add.c:353
+#, c-format
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "'git add .' 명령을 실행하려고 한 것 아니었습니까?\n"
+
+#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938
+#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:40
+msgid "index file corrupt"
+msgstr "인덱스 파일이 손상되었습니다"
+
+#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430
+msgid "Unable to write new index file"
+msgstr "새 인덱스 파일에 쓸 수 없습니다"
+
+#: builtin/am.c:42
+#, c-format
+msgid "could not stat %s"
+msgstr "%s에 대해 stat()할 수 없습니다"
+
+#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077
+#, c-format
+msgid "could not read '%s'"
+msgstr "'%s'에서 읽을 수 없습니다"
+
+#: builtin/am.c:445
+msgid "could not parse author script"
+msgstr "작성자 스크립트를 파싱할 수 없습니다"
+
+#: builtin/am.c:522
+#, c-format
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "applypatch-msg 훅 때문에 '%s'이(가) 삭제되었습니다."
+
+#: builtin/am.c:563 builtin/notes.c:300
+#, c-format
+msgid "Malformed input line: '%s'."
+msgstr "잘못된 형식의 입력 줄: '%s'."
+
+#: builtin/am.c:600 builtin/notes.c:315
+#, c-format
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "'%s'에서 '%s'(으)로 노트를 복사하는데 실패했습니다"
+
+#: builtin/am.c:626
+msgid "fseek failed"
+msgstr "fseek 실패"
+
+#: builtin/am.c:787 builtin/am.c:875
+#, c-format
+msgid "could not open '%s' for reading: %s"
+msgstr "'%s'을(를) 읽기용으로 열 수 없습니다: %s"
+
+#: builtin/am.c:794
+#, c-format
+msgid "could not open '%s' for writing: %s"
+msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다: %s"
+
+#: builtin/am.c:803
+#, c-format
+msgid "could not parse patch '%s'"
+msgstr "'%s' 패치를 파싱할 수 없습니다"
+
+#: builtin/am.c:868
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "한번에 하나의 StGIT 패치 시리즈만 적용할 수 있습니다"
+
+#: builtin/am.c:916
+msgid "invalid timestamp"
+msgstr "시각이 잘못되었습니다"
+
+#: builtin/am.c:919 builtin/am.c:927
+msgid "invalid Date line"
+msgstr "Date 줄이 잘못되었습니다"
+
+#: builtin/am.c:924
+msgid "invalid timezone offset"
+msgstr "시간대 오프셋이 잘못되었습니다"
+
+#: builtin/am.c:1011
+msgid "Patch format detection failed."
+msgstr "패치 형식 검색이 실패했습니다."
+
+#: builtin/am.c:1016 builtin/clone.c:373
+#, c-format
+msgid "failed to create directory '%s'"
+msgstr "'%s' 디렉터리 만들기가 실패했습니다"
+
+#: builtin/am.c:1020
+msgid "Failed to split patches."
+msgstr "패치를 쪼개는데 실패했습니다."
+
+#: builtin/am.c:1152 builtin/commit.c:363
+msgid "unable to write index file"
+msgstr "인덱스 파일을 쓸 수 없습니다"
+
+#: builtin/am.c:1203
+#, c-format
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "이 문제를 해결했을 때 \"%s --continue\"를 실행하십시오."
+
+#: builtin/am.c:1204
+#, c-format
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr "이 패치를 건너뛰려면, 그 대신 \"%s --skip\"을 실행하십시오."
+
+#: builtin/am.c:1205
+#, c-format
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr ""
+"원래 브랜치를 복구하고 패치 적용을 중지하려면 \"%s --abort\"를 실행하십시오."
+
+#: builtin/am.c:1343
+msgid "Patch is empty. Was it split wrong?"
+msgstr "패치가 비어 있습니다. 잘못 쪼개지지 않았나요?"
+
+#: builtin/am.c:1417 builtin/log.c:1347
+#, c-format
+msgid "invalid ident line: %s"
+msgstr "잘못된 신원 줄: %s"
+
+#: builtin/am.c:1444
+#, c-format
+msgid "unable to parse commit %s"
+msgstr "%s 커밋을 파싱할 수 없습니다"
+
+#: builtin/am.c:1646
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr "저장소에 3-방향 병합으로 대신할 때 필요한 블롭이 없습니다."
+
+#: builtin/am.c:1648
+msgid "Using index info to reconstruct a base tree..."
+msgstr "인덱스 정보를 사용해 기본 트리를 다시 만듭니다..."
+
+#: builtin/am.c:1667
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"패치를 직접 편집하셨습니까?\n"
+"이 패치는 인덱스에 기록된 블롭에는 적용되지 않습니다."
+
+#: builtin/am.c:1673
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "베이스 패치 적용 및 3-방향 병합으로 대신합니다..."
+
+#: builtin/am.c:1688
+msgid "Failed to merge in the changes."
+msgstr "변경 사항에서 병합하는데 실패했습니다."
+
+#: builtin/am.c:1712 builtin/merge.c:632
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree가 트리를 쓰는데 실패했습니다"
+
+#: builtin/am.c:1719
+msgid "applying to an empty history"
+msgstr "빈 커밋 내역에 대해 적용합니다"
+
+#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829
+#: builtin/merge.c:854
+msgid "failed to write commit object"
+msgstr "커밋 오브젝트를 쓰는데 실패했습니다"
+
+#: builtin/am.c:1764 builtin/am.c:1768
+#, c-format
+msgid "cannot resume: %s does not exist."
+msgstr "다시 시작할 수 없습니다: %s이(가) 없습니다."
+
+#: builtin/am.c:1784
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr ""
+"터미널에 표준 입력이 연결되지 않은 상태에서 대화형으로 실행할 수 없습니다."
+
+#: builtin/am.c:1789
+msgid "Commit Body is:"
+msgstr "커밋 본문은:"
+
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1799
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr "적용? 예[y]/아니오[n]/편집[e]/패치 보기[v]/모두 적용[a]: "
+
+#: builtin/am.c:1849
+#, c-format
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "변경된 인덱스: 패치를 적용할 수 없습니다 (dirty: %s)"
+
+#: builtin/am.c:1884 builtin/am.c:1955
+#, c-format
+msgid "Applying: %.*s"
+msgstr "적용하는 중: %.*s"
+
+#: builtin/am.c:1900
+msgid "No changes -- Patch already applied."
+msgstr "변경 사항 없음 -- 패치가 이미 적용되었습니다."
+
+#: builtin/am.c:1908
+#, c-format
+msgid "Patch failed at %s %.*s"
+msgstr "패치가 %s %.*s 위치에서 실패했습니다"
+
+#: builtin/am.c:1914
+#, c-format
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "실패한 패치의 복사본이 다음 위치에 있습니다: %s"
+
+#: builtin/am.c:1958
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr ""
+"변경 사항이 없습니다 - 'git add' 사용을 잊으셨습니까?\n"
+"커밋으로 표시할 사항이 남아 있지 않으면, 이미 같은 패치에서 적용된\n"
+"경우일 수도 있습니다. 그런 경우에는 이 패치를 건너뛰면 됩니다."
+
+#: builtin/am.c:1965
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"인덱스에 병합하지 않은 경로가 남아 있습니다.\n"
+"'git add' 사용을 잊지 않으셨습니까?"
+
+#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308
+#: builtin/reset.c:316
+#, c-format
+msgid "Could not parse object '%s'."
+msgstr "'%s' 오브젝트를 파싱할 수 없습니다."
+
+#: builtin/am.c:2125
+msgid "failed to clean index"
+msgstr "인덱스 지우기에 실패했습니다"
+
+#: builtin/am.c:2159
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"마지막 'am' 실패 이후 HEAD를 옮긴 것 같습니다.\n"
+"ORIG_HEAD로 되돌리지 않습니다."
+
+#: builtin/am.c:2220
+#, c-format
+msgid "Invalid value for --patch-format: %s"
+msgstr "--patch-format 옵션에 대해 잘못된 값: %s"
+
+#: builtin/am.c:2253
+msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
+msgstr "git am [<옵션>] [(<mbox>|<Maildir>)...]"
+
+#: builtin/am.c:2254
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<옵션>] (--continue | --skip | --abort)"
+
+#: builtin/am.c:2260
+msgid "run interactively"
+msgstr "대화형으로 실행합니다"
+
+#: builtin/am.c:2262
+msgid "historical option -- no-op"
+msgstr "아무 동작도 하지 않습니다 (과거부터 있었던 옵션)"
+
+#: builtin/am.c:2264
+msgid "allow fall back on 3way merging if needed"
+msgstr "필요하면 3-방향 병합으로 대신하도록 허용합니다"
+
+#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57
+#: builtin/repack.c:171
+msgid "be quiet"
+msgstr "간략히 표시합니다"
+
+#: builtin/am.c:2267
+msgid "add a Signed-off-by line to the commit message"
+msgstr "커밋 메시지에 Signed-off-by 줄을 남깁니다"
+
+#: builtin/am.c:2270
+msgid "recode into utf8 (default)"
+msgstr "UTF-8 인코딩으로 변환합니다 (기본값)"
+
+#: builtin/am.c:2272
+msgid "pass -k flag to git-mailinfo"
+msgstr "git-mailinfo에 -k 옵션을 씁니다"
+
+#: builtin/am.c:2274
+msgid "pass -b flag to git-mailinfo"
+msgstr "git-mailinfo에 -b 옵션을 씁니다"
+
+#: builtin/am.c:2276
+msgid "pass -m flag to git-mailinfo"
+msgstr "git-mailinfo에 -m 옵션을 씁니다"
+
+#: builtin/am.c:2278
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "mbox 형식에 대해 git-mailsplit에 --keep-cr 옵션을 사용합니다"
+
+#: builtin/am.c:2281
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr ""
+"am.keepcr에 무관하게 git-mailsplit에 --keep-cr 옵션을 사용하지 않습니다."
+
+#: builtin/am.c:2284
+msgid "strip everything before a scissors line"
+msgstr "절취선 앞의 모든 사항을 무시합니다"
+
+#: builtin/am.c:2285 builtin/apply.c:4554
+msgid "action"
+msgstr "동작"
+
+#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295
+#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307
+#: builtin/am.c:2313
+msgid "pass it through git-apply"
+msgstr "git-apply에 넘깁니다"
+
+#: builtin/am.c:2294 builtin/apply.c:4578
+msgid "root"
+msgstr "최상위"
+
+#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516
+#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93
+#: builtin/pull.c:167 builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
+msgid "path"
+msgstr "경로"
+
+#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
+#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127
+#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645
+#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
+#: parse-options.h:134 parse-options.h:244
+msgid "n"
+msgstr "n"
+
+#: builtin/am.c:2306 builtin/apply.c:4522
+msgid "num"
+msgstr "개수"
+
+#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "형식"
+
+#: builtin/am.c:2310
+msgid "format the patch(es) are in"
+msgstr "패치의 형식"
+
+#: builtin/am.c:2316
+msgid "override error message when patch failure occurs"
+msgstr "패치 실패가 발생했을 때 오류 메시지 대신 사용합니다"
+
+#: builtin/am.c:2318
+msgid "continue applying patches after resolving a conflict"
+msgstr "충돌을 해결한 다음 패치 적용을 계속합니다"
+
+#: builtin/am.c:2321
+msgid "synonyms for --continue"
+msgstr "--continue 옵션과 동일"
+
+#: builtin/am.c:2324
+msgid "skip the current patch"
+msgstr "현재 패치 건너뛰기"
+
+#: builtin/am.c:2327
+msgid "restore the original branch and abort the patching operation."
+msgstr "원래 브랜치를 복구하고 패치 적용 작업을 중지합니다."
+
+# NOTE: 옵션의 의미는 이게 맞다. 원문에서는 사용자가
+# --committer-date-is-author-date라는 옵션을 보고 의미를 알 수 있다고 가정하고 있다.
+#: builtin/am.c:2331
+msgid "lie about committer date"
+msgstr "커미터 시각을 작성자 시각으로 넣습니다"
+
+#: builtin/am.c:2333
+msgid "use current timestamp for author date"
+msgstr "현재 시각을 작성자 시각으로 사용합니다"
+
+#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225
+#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355
+msgid "key-id"
+msgstr "키-ID"
+
+#: builtin/am.c:2336
+msgid "GPG-sign commits"
+msgstr "GPG 서명 커밋"
+
+#: builtin/am.c:2339
+msgid "(internal use for git-rebase)"
+msgstr "(git-rebase를 위한 내부 용도)"
+
+#: builtin/am.c:2354
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr ""
+"-b/--binary 옵션은 오랜 시간 동안 아무 동작도 하지 않았으므로, 이\n"
+"옵션은 제거될 예정입니다. 이제 사용하지 마십시오."
+
+#: builtin/am.c:2361
+msgid "failed to read the index"
+msgstr "인덱스 읽기에 실패했습니다"
+
+#: builtin/am.c:2376
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "이전 리베이스 디렉터리 %s이(가) 아직 있고 mbox를 지정했습니다."
+
+#: builtin/am.c:2400
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"벗어난 %s 디렉터리가 발견되었습니다.\n"
+"제거하려면 \"git am --abort\"를 사용하십시오."
+
+#: builtin/am.c:2406
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "해소 작업이 진행 중입니다. 다시 시작하지 않습니다."
+
+#: builtin/apply.c:59
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<옵션>] [<패치>...]"
+
+#: builtin/apply.c:111
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "알 수 없는 공백 옵션 '%s'"
+
+#: builtin/apply.c:126
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "알 수 없는 공백 무시 옵션 '%s'"
+
+#: builtin/apply.c:818
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "타임스탬프 정규식을 준비할 수 없습니다 (%s)"
+
+#: builtin/apply.c:827
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec()에서 다음 입력에 대해 %d번을 리턴했습니다: %s"
+
+#: builtin/apply.c:908
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "패치의 %d번 줄에 파일 이름을 찾을 수 없습니다"
+
+#: builtin/apply.c:940
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr "git apply: 잘못된 git-diff - %2$d번 줄에서 /dev/null을 기대했지만, '%1$s'이(가) 왔습니다"
+
+#: builtin/apply.c:944
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr "git apply: 잘못된 git-diff - %d번 줄에 새 파일 이름이 올바르지 않습니다"
+
+#: builtin/apply.c:945
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr "git apply: 잘못된 git-diff - %d번 줄에 예전 파일 이름이 올바르지 않습니다"
+
+#: builtin/apply.c:952
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply: 잘못된 git-diff - %d번 줄에서 /dev/null을 기대했습니다"
+
+#: builtin/apply.c:1415
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recount: 예상치 못한 줄: %.*s"
+
+#: builtin/apply.c:1472
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "%d번 줄에 헤더 없는 패치 부분: %.*s"
+
+#: builtin/apply.c:1489
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"경로 이름 부분에서 %d개를 제거라 때 git diff 헤더에 파일 이름 정보가 없습니"
+"다. (%d번 줄)"
+
+#: builtin/apply.c:1655
+msgid "new file depends on old contents"
+msgstr "새 파일이 예전 내용에 의존합니다"
+
+#: builtin/apply.c:1657
+msgid "deleted file still has contents"
+msgstr "삭제한 파일에 아직 내용이 들어 있습니다"
+
+#: builtin/apply.c:1683
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "패치가 %d번 줄에서 망가졌습니다"
+
+#: builtin/apply.c:1719
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "새 파일 %s이(가) 예전 내용에 의존합니다"
+
+#: builtin/apply.c:1721
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "삭제한 파일 %s이(가) 아직 내용이 들어 있습니다"
+
+#: builtin/apply.c:1724
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** 경고: %s 파일의 내용이 비어 있지만 삭제되지 않았습니다"
+
+#: builtin/apply.c:1870
+#, c-format
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "%d번 줄에 바이너리 패치가 손상되었습니다: %.*s"
+
+#: builtin/apply.c:1899
+#, c-format
+msgid "unrecognized binary patch at line %d"
+msgstr "%d번 줄에 바이너리 패치가 이해할 수 없습니다"
+
+#: builtin/apply.c:2050
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "%d번 줄에 쓰레기 데이터만 있는 패치"
+
+#: builtin/apply.c:2140
+#, c-format
+msgid "unable to read symlink %s"
+msgstr "%s 심볼릭 링크를 읽을 수 없습니다"
+
+#: builtin/apply.c:2144
+#, c-format
+msgid "unable to open or read %s"
+msgstr "%s을(를) 열거나 읽을 수 없습니다"
+
+#: builtin/apply.c:2777
+#, c-format
+msgid "invalid start of line: '%c'"
+msgstr "줄 시작이 잘못됨: '%c'"
+
+#: builtin/apply.c:2896
+#, c-format
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "패치 %d번 부분 %d번 줄에서 성공 (오프셋 %d줄)"
+
+#: builtin/apply.c:2908
+#, c-format
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "컨텍스트가 (%ld/%ld)로 줄어듭니다. (%d번 줄에서 적용)"
+
+#: builtin/apply.c:2914
+#, c-format
+msgid ""
+"while searching for:\n"
+"%.*s"
+msgstr ""
+"다음을 검색하던 중:\n"
+"%.*s"
+
+#: builtin/apply.c:2934
+#, c-format
+msgid "missing binary patch data for '%s'"
+msgstr "'%s'에 대한 바이너리 패치 데이터가 없습니다"
+
+#: builtin/apply.c:3035
+#, c-format
+msgid "binary patch does not apply to '%s'"
+msgstr "바이너리 패치를 '%s'에 적용할 수 없습니다"
+
+#: builtin/apply.c:3041
+#, c-format
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+"'%s'에 대한 바이너리 패치가 올바르지 않은 결과를 만듭니다. (기대한 값 %s, 실"
+"제 %s)"
+
+#: builtin/apply.c:3062
+#, c-format
+msgid "patch failed: %s:%ld"
+msgstr "패치 실패: %s:%ld"
+
+#: builtin/apply.c:3186
+#, c-format
+msgid "cannot checkout %s"
+msgstr "%s을(를) 가져올 수 없습니다"
+
+#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
+#, c-format
+msgid "read of %s failed"
+msgstr "%s 읽기가 실패했습니다"
+
+#: builtin/apply.c:3239
+#, c-format
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "심볼릭 링크 뒤에 있는 '%s' 읽기"
+
+#: builtin/apply.c:3267 builtin/apply.c:3489
+#, c-format
+msgid "path %s has been renamed/deleted"
+msgstr "%s 경로가 이름이 바뀌었거나 삭제되었습니다"
+
+#: builtin/apply.c:3348 builtin/apply.c:3503
+#, c-format
+msgid "%s: does not exist in index"
+msgstr "%s: 인덱스에 없습니다"
+
+#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: builtin/apply.c:3357 builtin/apply.c:3511
+#, c-format
+msgid "%s: does not match index"
+msgstr "%s: 인덱스와 맞지 않습니다"
+
+#: builtin/apply.c:3459
+msgid "removal patch leaves file contents"
+msgstr "제거하는 패치 다음에 파일 내용이 남았습니다"
+
+#: builtin/apply.c:3528
+#, c-format
+msgid "%s: wrong type"
+msgstr "%s: 잘못된 종류"
+
+#: builtin/apply.c:3530
+#, c-format
+msgid "%s has type %o, expected %o"
+msgstr "%s의 종류가 %o이지만 %o이(가) 되어야 합니다"
+
+#: builtin/apply.c:3689 builtin/apply.c:3691
+#, c-format
+msgid "invalid path '%s'"
+msgstr "잘못된 경로 '%s'"
+
+#: builtin/apply.c:3746
+#, c-format
+msgid "%s: already exists in index"
+msgstr "%s: 이미 인덱스에 있습니다"
+
+#: builtin/apply.c:3749
+#, c-format
+msgid "%s: already exists in working directory"
+msgstr "%s: 이미 작업 디렉터리에 있습니다"
+
+#: builtin/apply.c:3769
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "%2$s의 새 모드(%1$o)가 예전 모드(%3$o)와 다릅니다"
+
+#: builtin/apply.c:3774
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "%2$s의 새 모드(%1$o)가 %4$s의 예전 모드(%3$o)와 다릅니다"
+
+#: builtin/apply.c:3794
+#, c-format
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "영향 받는 '%s' 파일이 심볼릭 링크 뒤에 있습니다"
+
+#: builtin/apply.c:3798
+#, c-format
+msgid "%s: patch does not apply"
+msgstr "%s: 패치를 적용하지 않습니다"
+
+#: builtin/apply.c:3812
+#, c-format
+msgid "Checking patch %s..."
+msgstr "%s 패치를 확인하는 중입니다..."
+
+#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
+#, c-format
+msgid "make_cache_entry failed for path '%s'"
+msgstr "경로 '%s'에 대해 make_cache_entry 실패"
+
+#: builtin/apply.c:4048
+#, c-format
+msgid "unable to remove %s from index"
+msgstr "인덱스에서 %s을(를) 제거할 수 없습니다"
+
+#: builtin/apply.c:4077
+#, c-format
+msgid "corrupt patch for submodule %s"
+msgstr "하위 모듈 %s에 대해 손상된 패치"
+
+#: builtin/apply.c:4081
+#, c-format
+msgid "unable to stat newly created file '%s'"
+msgstr "새로 만든 파일 '%s'에 대해 stat()할 수 없습니다"
+
+#: builtin/apply.c:4086
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr "새로 만든 파일 '%s'에 대해 예비 저장소를 만들 수 없습니다"
+
+#: builtin/apply.c:4089 builtin/apply.c:4197
+#, c-format
+msgid "unable to add cache entry for %s"
+msgstr "%s에 대해 캐시 항목을 추가할 수 없습니다"
+
+#: builtin/apply.c:4122
+#, c-format
+msgid "closing file '%s'"
+msgstr "'%s' 파일을 닫는 중입니다"
+
+#: builtin/apply.c:4171
+#, c-format
+msgid "unable to write file '%s' mode %o"
+msgstr "'%s' 파일에 쓸 수 없습니다 ('%o' 모드)"
+
+#: builtin/apply.c:4258
+#, c-format
+msgid "Applied patch %s cleanly."
+msgstr "%s 패치 깔끔하게 적용."
+
+#: builtin/apply.c:4266
+msgid "internal error"
+msgstr "내부 오류"
+
+#: builtin/apply.c:4269
+#, c-format
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "%%s 패치를 (%d개 거부) 적용..."
+
+#: builtin/apply.c:4279
+#, c-format
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "truncating .rej 파일 이름을 '%.*s.rej'(으)로 자름"
+
+#: builtin/apply.c:4300
+#, c-format
+msgid "Hunk #%d applied cleanly."
+msgstr "패치 부위 #%d 깔끔하게 적용."
+
+#: builtin/apply.c:4303
+#, c-format
+msgid "Rejected hunk #%d."
+msgstr "패치 부위 #%d 거부됨."
+
+#: builtin/apply.c:4393
+msgid "unrecognized input"
+msgstr "인식할 수 없는 입력"
+
+#: builtin/apply.c:4404
+msgid "unable to read index file"
+msgstr "인덱스 파일을 읽을 수 없습니다"
+
+#: builtin/apply.c:4517
+msgid "don't apply changes matching the given path"
+msgstr "주어진 경로에 해당하는 변경 사항을 적용하지 않습니다"
+
+#: builtin/apply.c:4520
+msgid "apply changes matching the given path"
+msgstr "주어진 경로에 해당하는 변경 사항을 적용합니다"
+
+#: builtin/apply.c:4523
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "전통적인 diff 경로 앞의 <개수>개의 앞 슬래시(/)를 제거합니다"
+
+#: builtin/apply.c:4526
+msgid "ignore additions made by the patch"
+msgstr "패치에서 추가하는 파일을 무시합니다"
+
+#: builtin/apply.c:4528
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr "패치를 적용하는 대신, 입력에 대한 diffstat을 출력합니다"
+
+#: builtin/apply.c:4532
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "십진수로 추가 및 삭제한 줄 수를 표시합니다"
+
+#: builtin/apply.c:4534
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "패치를 적용하는 대신, 입력에 대한 요약을 출력합니다"
+
+#: builtin/apply.c:4536
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "패치를 적용하는 대신, 패치를 적용 가능한지 확인합니다"
+
+#: builtin/apply.c:4538
+msgid "make sure the patch is applicable to the current index"
+msgstr "현재 인덱스에서 패치가 적용 가능한지 확인합니다"
+
+#: builtin/apply.c:4540
+msgid "apply a patch without touching the working tree"
+msgstr "작업 폴더를 바꾸지 않고 패치를 적용합니다"
+
+#: builtin/apply.c:4542
+msgid "accept a patch that touches outside the working area"
+msgstr "작업 영역 밖의 파일을 바꾸는 패치를 허용합니다"
+
+#: builtin/apply.c:4544
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "그리고 패치도 적용합니다 (--stat/--summary/--check 옵션과 같이 사용)"
+
+#: builtin/apply.c:4546
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "패치를 적용하지 않으면 3-방향 병합을 시도합니다"
+
+#: builtin/apply.c:4548
+msgid "build a temporary index based on embedded index information"
+msgstr "내장 인덱스 정보를 사용해 임시 인덱스를 만듭니다"
+
+#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412
+msgid "paths are separated with NUL character"
+msgstr "경로를 NUL 문자로 구분합니다"
+
+#: builtin/apply.c:4553
+msgid "ensure at least <n> lines of context match"
+msgstr "최소한 <n>줄이 컨텍스트와 일치하는지 확인합니다"
+
+#: builtin/apply.c:4555
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "공백 오류가 있는 추가됐거나 수정된 줄을 찾습니다"
+
+#: builtin/apply.c:4558 builtin/apply.c:4561
+msgid "ignore changes in whitespace when finding context"
+msgstr "컨텍스트를 찾을 때 공백 변경 사항을 무시합니다"
+
+#: builtin/apply.c:4564
+msgid "apply the patch in reverse"
+msgstr "패치를 반대 순서로 적용합니다"
+
+#: builtin/apply.c:4566
+msgid "don't expect at least one line of context"
+msgstr "최소한의 컨텍스트 한 줄도 없이 적용합니다"
+
+#: builtin/apply.c:4568
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "거부된 패치 부분을 대응되는 *.rej 파일에 남겨둡니다"
+
+#: builtin/apply.c:4570
+msgid "allow overlapping hunks"
+msgstr "패치 부분이 겹쳐도 허용합니다"
+
+#: builtin/apply.c:4573
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "파일 끝에 줄바꿈이 빠졌음을 잘못 검색한 경우에 무시합니다"
+
+#: builtin/apply.c:4576
+msgid "do not trust the line counts in the hunk headers"
+msgstr "패치 부분의 헤더의 줄 수를 신용하지 않습니다"
+
+#: builtin/apply.c:4579
+msgid "prepend <root> to all filenames"
+msgstr "모든 파일 이름에 <최상위>를 앞에 붙입니다"
+
+#: builtin/apply.c:4601
+msgid "--3way outside a repository"
+msgstr "저장소 밖에서 --3way 옵션 사용"
+
+#: builtin/apply.c:4609
+msgid "--index outside a repository"
+msgstr "저장소 밖에서 --index 옵션 사용"
+
+#: builtin/apply.c:4612
+msgid "--cached outside a repository"
+msgstr "저장소 밖에서 --cached 옵션 사용"
+
+#: builtin/apply.c:4631
+#, c-format
+msgid "can't open patch '%s'"
+msgstr "'%s' 패치를 열 수 없습니다"
+
+#: builtin/apply.c:4645
+#, c-format
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "공백 오류 %d개를 넘어갑니다"
+
+#: builtin/apply.c:4651 builtin/apply.c:4661
+#, c-format
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d줄에서 공백 오류를 추가합니다."
+
+#: builtin/archive.c:17
+#, c-format
+msgid "could not create archive file '%s'"
+msgstr "'%s' 아카이브 파일을 만들 수 없습니다"
+
+#: builtin/archive.c:20
+msgid "could not redirect output"
+msgstr "출력 방향을 돌릴 수 없습니다"
+
+#: builtin/archive.c:37
+msgid "git archive: Remote with no URL"
+msgstr "git archive: URL 없는 리모트"
+
+#: builtin/archive.c:58
+msgid "git archive: expected ACK/NAK, got EOF"
+msgstr "git archive: ACK/NAK가 와야 하지만, EOF를 받았습니다"
+
+#: builtin/archive.c:61
+#, c-format
+msgid "git archive: NACK %s"
+msgstr "git archive: NACK %s"
+
+#: builtin/archive.c:63
+#, c-format
+msgid "remote error: %s"
+msgstr "리모트 오류: %s"
+
+#: builtin/archive.c:64
+msgid "git archive: protocol error"
+msgstr "git archive: 프로토콜 오류"
+
+#: builtin/archive.c:68
+msgid "git archive: expected a flush"
+msgstr "git archive: 파일 끝을 예상함"
+
+#: builtin/bisect--helper.c:7
+msgid "git bisect--helper --next-all [--no-checkout]"
+msgstr "git bisect--helper --next-all [--no-checkout]"
+
+#: builtin/bisect--helper.c:17
+msgid "perform 'git bisect next'"
+msgstr "'git bisect next'를 수행합니다"
+
+#: builtin/bisect--helper.c:19
+msgid "update BISECT_HEAD instead of checking out the current commit"
+msgstr "현재 커밋을 가져오는 대신 BISECT_HEAD를 업데이트합니다"
+
+#: builtin/blame.c:32
+msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
+msgstr "git blame [<옵션>] [<리비전-옵션>] [<리비전>] [--] <파일>"
+
+#: builtin/blame.c:37
+msgid "<rev-opts> are documented in git-rev-list(1)"
+msgstr "<리비전-옵션>은 git-rev-list(1)에 설명되어 있습니다"
+
+#: builtin/blame.c:2519
+msgid "Show blame entries as we find them, incrementally"
+msgstr "blame 항목을 찾자마자 점진적으로 표시합니다"
+
+#: builtin/blame.c:2520
+msgid "Show blank SHA-1 for boundary commits (Default: off)"
+msgstr "가장자리 커밋에 대해 빈 SHA-1을 표시합니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2521
+msgid "Do not treat root commits as boundaries (Default: off)"
+msgstr "최상위 커밋을 가장자리 커밋으로 취급하지 않습니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2522
+msgid "Show work cost statistics"
+msgstr "작업 비용 통계를 표시합니다"
+
+#: builtin/blame.c:2523
+msgid "Show output score for blame entries"
+msgstr "blame 항목에 대해 출력 점수를 표시합니다"
+
+#: builtin/blame.c:2524
+msgid "Show original filename (Default: auto)"
+msgstr "원래 파일 이름 표시 (기본값: 자동)"
+
+#: builtin/blame.c:2525
+msgid "Show original linenumber (Default: off)"
+msgstr "원래 줄 번호 표시 (기본값: 하지 않음)"
+
+#: builtin/blame.c:2526
+msgid "Show in a format designed for machine consumption"
+msgstr "컴퓨터 처리용으로 설계된 형식으로 표시합니다"
+
+#: builtin/blame.c:2527
+msgid "Show porcelain format with per-line commit information"
+msgstr "줄마다 커밋 정보가 표시되는 사용자용 형식으로 표시합니다"
+
+#: builtin/blame.c:2528
+msgid "Use the same output mode as git-annotate (Default: off)"
+msgstr "git-annotate와 동일한 형식을 사용합니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2529
+msgid "Show raw timestamp (Default: off)"
+msgstr "내부 형식으로 시각을 표시합니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2530
+msgid "Show long commit SHA1 (Default: off)"
+msgstr "길게 커밋 SHA1을 표시합니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2531
+msgid "Suppress author name and timestamp (Default: off)"
+msgstr "작성자 이름과 시각을 표시하지 않습니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2532
+msgid "Show author email instead of name (Default: off)"
+msgstr "작성자 이름 대신에 전자메일을 표시합니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2533
+msgid "Ignore whitespace differences"
+msgstr "공백 문자 차이점을 무시합니다"
+
+#: builtin/blame.c:2534
+msgid "Spend extra cycles to find better match"
+msgstr "더 일치하는 항목을 찾는데 더 시간을 소모합니다"
+
+#: builtin/blame.c:2535
+msgid "Use revisions from <file> instead of calling git-rev-list"
+msgstr "git-rev-list를 호출하는 대신 <파일>에서 리비전을 사용합니다"
+
+#: builtin/blame.c:2536
+msgid "Use <file>'s contents as the final image"
+msgstr "<파일>의 내용을 최종 이미지로 사용합니다"
+
+#: builtin/blame.c:2537 builtin/blame.c:2538
+msgid "score"
+msgstr "점수"
+
+#: builtin/blame.c:2537
+msgid "Find line copies within and across files"
+msgstr "파일 내부와 파일 사이의 복사된 줄을 찾습니다"
+
+#: builtin/blame.c:2538
+msgid "Find line movements within and across files"
+msgstr "파일 내부와 파일 사이의 옮겨진 줄을 찾습니다"
+
+#: builtin/blame.c:2539
+msgid "n,m"
+msgstr "n,m"
+
+#: builtin/blame.c:2539
+msgid "Process only line range n,m, counting from 1"
+msgstr "n,m줄 (1번 줄부터 시작) 사이의 범위만 처리"
+
+#. TRANSLATORS: This string is used to tell us the maximum
+#. display width for a relative timestamp in "git blame"
+#. output.  For C locale, "4 years, 11 months ago", which
+#. takes 22 places, is the longest among various forms of
+#. relative timestamps, but your language may need more or
+#. fewer display columns.
+#: builtin/blame.c:2620
+msgid "4 years, 11 months ago"
+msgstr "4년 11달 전"
+
+#: builtin/branch.c:25
+msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
+msgstr "git branch [<옵션>] [-r | -a] [--merged | --no-merged]"
+
+#: builtin/branch.c:26
+msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
+msgstr "git branch [<옵션>] [-l] [-f] <브랜치-이름> [<시작-지점>]"
+
+#: builtin/branch.c:27
+msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
+msgstr "git branch [<옵션>] [-r] (-d | -D) <브랜치-이름>..."
+
+#: builtin/branch.c:28
+msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
+msgstr "git branch [<옵션>] (-m | -M) [<과거-브랜치>] <새-브랜치>"
+
+#: builtin/branch.c:29
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr "git branch [<옵션>] [-r | -a] [--points-at]"
+
+#: builtin/branch.c:142
+#, c-format
+msgid ""
+"deleting branch '%s' that has been merged to\n"
+"         '%s', but not yet merged to HEAD."
+msgstr ""
+"'%s' 브랜치를 삭제합니다. 이 브랜치는 '%s'에\n"
+"         병합되었지만, HEAD에는 병합되지 않았습니다."
+
+#: builtin/branch.c:146
+#, c-format
+msgid ""
+"not deleting branch '%s' that is not yet merged to\n"
+"         '%s', even though it is merged to HEAD."
+msgstr ""
+"'%s' 브랜치를 삭제하지 않습니다. 이 브랜치는 '%s'에\n"
+"         병합되지 않았지만, HEAD에는 병합되었습니다."
+
+#: builtin/branch.c:160
+#, c-format
+msgid "Couldn't look up commit object for '%s'"
+msgstr "'%s'에 대한 커밋 오브젝트를 찾아볼 수 없습니다"
+
+#: builtin/branch.c:164
+#, c-format
+msgid ""
+"The branch '%s' is not fully merged.\n"
+"If you are sure you want to delete it, run 'git branch -D %s'."
+msgstr ""
+"'%s' 브랜치가 완전히 병합되지 않았습니다.\n"
+"정말로 삭제하려면 'git branch -D %s' 명령을 실행하십시오."
+
+#: builtin/branch.c:177
+msgid "Update of config-file failed"
+msgstr "config-file 업데이트가 실패했습니다"
+
+#: builtin/branch.c:205
+msgid "cannot use -a with -d"
+msgstr "-a 옵션을 -d 옵션과 같이 쓸 수 없습니다"
+
+#: builtin/branch.c:211
+msgid "Couldn't look up commit object for HEAD"
+msgstr "HEAD에 대한 커밋 오브젝트를 찾아볼 수 없습니다"
+
+#: builtin/branch.c:219
+#, c-format
+msgid "Cannot delete the branch '%s' which you are currently on."
+msgstr "'%s' 브랜치는 현재 위치한 브랜치이기 때문에 삭제할 수 없습니다."
+
+#: builtin/branch.c:235
+#, c-format
+msgid "remote-tracking branch '%s' not found."
+msgstr "리모트 추적 '%s' 브랜치가 없습니다."
+
+#: builtin/branch.c:236
+#, c-format
+msgid "branch '%s' not found."
+msgstr "'%s' 브랜치가 없습니다."
+
+#: builtin/branch.c:251
+#, c-format
+msgid "Error deleting remote-tracking branch '%s'"
+msgstr "리모트 추적 '%s' 브랜치를 삭제하는데 오류"
+
+#: builtin/branch.c:252
+#, c-format
+msgid "Error deleting branch '%s'"
+msgstr "'%s' 브랜치를 삭제하는데 오류"
+
+#: builtin/branch.c:259
+#, c-format
+msgid "Deleted remote-tracking branch %s (was %s).\n"
+msgstr "리모트 추적 '%s' 브랜치를 삭제합니다. (과거 %s)\n"
+
+#: builtin/branch.c:260
+#, c-format
+msgid "Deleted branch %s (was %s).\n"
+msgstr "%s 브랜치 삭제 (과거 %s).\n"
+
+#: builtin/branch.c:303
+#, c-format
+msgid "[%s: gone]"
+msgstr "[%s: 사라짐]"
+
+#: builtin/branch.c:308
+#, c-format
+msgid "[%s]"
+msgstr "[%s]"
+
+#: builtin/branch.c:313
+#, c-format
+msgid "[%s: behind %d]"
+msgstr "[%s: %d개 뒤]"
+
+#: builtin/branch.c:315
+#, c-format
+msgid "[behind %d]"
+msgstr "[%d개 뒤]"
+
+#: builtin/branch.c:319
+#, c-format
+msgid "[%s: ahead %d]"
+msgstr "[%s: %d개 앞]"
+
+#: builtin/branch.c:321
+#, c-format
+msgid "[ahead %d]"
+msgstr "[%d개 앞]"
+
+#: builtin/branch.c:324
+#, c-format
+msgid "[%s: ahead %d, behind %d]"
+msgstr "[%s: %d개 앞, %d개 뒤]"
+
+#: builtin/branch.c:327
+#, c-format
+msgid "[ahead %d, behind %d]"
+msgstr "[%d개 앞, %d개 뒤]"
+
+#: builtin/branch.c:340
+msgid " **** invalid ref ****"
+msgstr " **** 잘못된 레퍼런스 ****"
+
+#: builtin/branch.c:366
+#, c-format
+msgid "(no branch, rebasing %s)"
+msgstr "(브랜치 없음, %s 리베이스)"
+
+#: builtin/branch.c:369
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr "(브랜치 없음, 이등분 %s에서 시작)"
+
+#: builtin/branch.c:375
+#, c-format
+msgid "(HEAD detached at %s)"
+msgstr "(HEAD %s 위치에서 분리됨)"
+
+#: builtin/branch.c:378
+#, c-format
+msgid "(HEAD detached from %s)"
+msgstr "(HEAD %s(으)로부터 분리됨)"
+
+#: builtin/branch.c:382
+msgid "(no branch)"
+msgstr "(브랜치 없음)"
+
+#: builtin/branch.c:524
+msgid "cannot rename the current branch while not on any."
+msgstr "브랜치 위에 없으면서 현재 브랜치 이름을 바꿀 수 없습니다."
+
+#: builtin/branch.c:534
+#, c-format
+msgid "Invalid branch name: '%s'"
+msgstr "잘못된 브랜치 이름: '%s'"
+
+#: builtin/branch.c:549
+msgid "Branch rename failed"
+msgstr "브랜치 이름 바꾸기 실패"
+
+#: builtin/branch.c:553
+#, c-format
+msgid "Renamed a misnamed branch '%s' away"
+msgstr "이름이 잘못된 '%s' 브랜치의 이름을 다르게 바꿉니다"
+
+#: builtin/branch.c:557
+#, c-format
+msgid "Branch renamed to %s, but HEAD is not updated!"
+msgstr "브랜치 이름을 %s(으)로 바꾸지만, HEAD를 업데이트하지 않습니다!"
+
+#: builtin/branch.c:564
+msgid "Branch is renamed, but update of config-file failed"
+msgstr "브랜치의 이름을 바꾸지만, config-file 업데이트가 실패했습니다"
+
+#: builtin/branch.c:587
+#, c-format
+msgid "could not write branch description template: %s"
+msgstr "브랜치 설명 서식을 쓸 수 없습니다: %s"
+
+#: builtin/branch.c:616
+msgid "Generic options"
+msgstr "일반 옵션"
+
+# FIXME: give twice?
+#: builtin/branch.c:618
+msgid "show hash and subject, give twice for upstream branch"
+msgstr "해시와 제목을 표시하고, 업스트림 브랜치에 대한 위치를 표시합니다"
+
+#: builtin/branch.c:619
+msgid "suppress informational messages"
+msgstr "여러가지 안내 메시지를 표시하지 않습니다"
+
+#: builtin/branch.c:620
+msgid "set up tracking mode (see git-pull(1))"
+msgstr "추적 모드를 설정합니다 (git-pull(1) 참고)"
+
+#: builtin/branch.c:622
+msgid "change upstream info"
+msgstr "업스트림 정보를 바꿉니다"
+
+#: builtin/branch.c:626
+msgid "use colored output"
+msgstr "여러 색으로 출력합니다"
+
+#: builtin/branch.c:627
+msgid "act on remote-tracking branches"
+msgstr "리모트 추적 브랜치에 대해 동작합니다"
+
+#: builtin/branch.c:629 builtin/branch.c:630
+msgid "print only branches that contain the commit"
+msgstr "커밋이 있는 브랜치만 표시합니다"
+
+#: builtin/branch.c:633
+msgid "Specific git-branch actions:"
+msgstr "특정 git-branch 동작:"
+
+#: builtin/branch.c:634
+msgid "list both remote-tracking and local branches"
+msgstr "리모트와 로컬의 브랜치 목록을 모두 표시합니다"
+
+#: builtin/branch.c:636
+msgid "delete fully merged branch"
+msgstr "완전히 병합된 브랜치를 삭제합니다"
+
+#: builtin/branch.c:637
+msgid "delete branch (even if not merged)"
+msgstr "브랜치를 삭제합니다 (병합되지 않았더라도)"
+
+#: builtin/branch.c:638
+msgid "move/rename a branch and its reflog"
+msgstr "브랜치와 그 reflog를 옮기거나 이름을 바꿉니다"
+
+#: builtin/branch.c:639
+msgid "move/rename a branch, even if target exists"
+msgstr "대상이 이미 있더라도 브랜치를 옮기거나 이름을 바꿉니다"
+
+#: builtin/branch.c:640
+msgid "list branch names"
+msgstr "브랜치 이름 목록을 표시합니다"
+
+#: builtin/branch.c:641
+msgid "create the branch's reflog"
+msgstr "브랜치의 reflog를 만듭니다"
+
+#: builtin/branch.c:643
+msgid "edit the description for the branch"
+msgstr "브랜치의 설명을 편집합니다"
+
+#: builtin/branch.c:644
+msgid "force creation, move/rename, deletion"
+msgstr "강제로 만들고, 옮기거나 이름을 바꾸고, 삭제합니다"
+
+#: builtin/branch.c:645
+msgid "print only branches that are merged"
+msgstr "병합되는 브랜치만 표시합니다"
+
+#: builtin/branch.c:646
+msgid "print only branches that are not merged"
+msgstr "병합되지 않는 브랜치만 표시합니다"
+
+#: builtin/branch.c:647
+msgid "list branches in columns"
+msgstr "목록을 여러 열로 표시합니다"
+
+#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
+msgstr "키"
+
+#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
+msgstr "정렬한 기준이 되는 필드 이름"
+
+#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398
+#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564
+#: builtin/tag.c:369
+msgid "object"
+msgstr "오브젝트"
+
+#: builtin/branch.c:652
+msgid "print only branches of the object"
+msgstr "해당 오브젝트의 브랜치만 표시합니다"
+
+#: builtin/branch.c:670
+msgid "Failed to resolve HEAD as a valid ref."
+msgstr "HEAD를 올바른 레퍼런스로 구해내는데 실패했습니다."
+
+#: builtin/branch.c:674 builtin/clone.c:697
+msgid "HEAD not found below refs/heads!"
+msgstr "레퍼런스/헤드 아래에 HEAD가 없습니다!"
+
+#: builtin/branch.c:694
+msgid "--column and --verbose are incompatible"
+msgstr "--column 및 --verbose 옵션은 호환되지 않습니다"
+
+#: builtin/branch.c:705 builtin/branch.c:747
+msgid "branch name required"
+msgstr "브랜치 이름이 필요합니다"
+
+#: builtin/branch.c:723
+msgid "Cannot give description to detached HEAD"
+msgstr "분리된 HEAD에 대한 설명을 부여할 수 없습니다"
+
+#: builtin/branch.c:728
+msgid "cannot edit description of more than one branch"
+msgstr "여러 브랜치에 대한 설명을 편집할 수 없습니다"
+
+#: builtin/branch.c:735
+#, c-format
+msgid "No commit on branch '%s' yet."
+msgstr "아직 '%s' 브랜치에 커밋이 없습니다."
+
+#: builtin/branch.c:738
+#, c-format
+msgid "No branch named '%s'."
+msgstr "이름이 '%s'인 브랜치가 없습니다."
+
+#: builtin/branch.c:753
+msgid "too many branches for a rename operation"
+msgstr "이름 바꾸기 작업에 대해 브랜치가 너무 많습니다"
+
+#: builtin/branch.c:758
+msgid "too many branches to set new upstream"
+msgstr "새 업스트림을 설정하는데 브랜치가 너무 많습니다"
+
+#: builtin/branch.c:762
+#, c-format
+msgid ""
+"could not set upstream of HEAD to %s when it does not point to any branch."
+msgstr "HEAD의 업스트림을 %s(으)로 설정할 수 없습니다. 어떤 브랜치도 가리키지 않습니다."
+
+#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808
+#, c-format
+msgid "no such branch '%s'"
+msgstr "그런 브랜치가 ('%s') 없습니다"
+
+#: builtin/branch.c:769
+#, c-format
+msgid "branch '%s' does not exist"
+msgstr "'%s' 브랜치가 없습니다"
+
+#: builtin/branch.c:781
+msgid "too many branches to unset upstream"
+msgstr "업스트림 설정을 해제하는데 브랜치가 너무 많습니다"
+
+#: builtin/branch.c:785
+msgid "could not unset upstream of HEAD when it does not point to any branch."
+msgstr "HEAD의 업스트림 설정을 해제할 수 없습니다. 어떤 브랜치도 가리키지 않습니다."
+
+#: builtin/branch.c:791
+#, c-format
+msgid "Branch '%s' has no upstream information"
+msgstr "'%s' 브랜치에 업스트림 정보가 없습니다"
+
+#: builtin/branch.c:805
+msgid "it does not make sense to create 'HEAD' manually"
+msgstr "'HEAD'를 수동으로 만드는 건 앞뒤가 맞지 않습니다"
+
+#: builtin/branch.c:811
+msgid "-a and -r options to 'git branch' do not make sense with a branch name"
+msgstr "'git branch'에 대해 -a 및 -r 옵션은 브랜치 이름과 같이 쓰면 앞뒤가 맞지 않습니다"
+
+#: builtin/branch.c:814
+#, c-format
+msgid ""
+"The --set-upstream flag is deprecated and will be removed. Consider using --"
+"track or --set-upstream-to\n"
+msgstr "--set-upstream 옵션은 더 이상 사용되지 않고 제거될 예정입니다. --track 또는 --set-upstream-to 옵션을 사용해 보십시오\n"
+
+#: builtin/branch.c:831
+#, c-format
+msgid ""
+"\n"
+"If you wanted to make '%s' track '%s', do this:\n"
+"\n"
+msgstr "\n'%s'을(를) 만들고 '%s'을(를) 추적하게 하려면, 다음을 하십시오:\n"
+
+#: builtin/branch.c:832
+#, c-format
+msgid "    git branch -d %s\n"
+msgstr "    git branch -d %s\n"
+
+#: builtin/branch.c:833
+#, c-format
+msgid "    git branch --set-upstream-to %s\n"
+msgstr "    git branch --set-upstream-to %s\n"
+
+#: builtin/bundle.c:51
+#, c-format
+msgid "%s is okay\n"
+msgstr "%s 정상입니다\n"
+
+#: builtin/bundle.c:64
+msgid "Need a repository to create a bundle."
+msgstr "번들을 만드려면 저장소가 필요합니다."
+
+#: builtin/bundle.c:68
+msgid "Need a repository to unbundle."
+msgstr "번들을 해제하려면 저장소가 필요합니다."
+
+#: builtin/cat-file.c:428
+msgid ""
+"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
+"<type>|--textconv) <object>"
+msgstr ""
+"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|<종류"
+">|--textconv) <오브젝트>"
+
+#: builtin/cat-file.c:429
+msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+
+#: builtin/cat-file.c:466
+msgid "<type> can be one of: blob, tree, commit, tag"
+msgstr "<종류>는 다음 중 하나가 될 수 있습니다: blob, tree, commit, tag"
+
+#: builtin/cat-file.c:467
+msgid "show object type"
+msgstr "오브젝트 종류를 봅니다"
+
+#: builtin/cat-file.c:468
+msgid "show object size"
+msgstr "오브젝트 크기를 봅니다"
+
+#: builtin/cat-file.c:470
+msgid "exit with zero when there's no error"
+msgstr "오류가 없을 때 0을 리턴하고 끝냅니다"
+
+#: builtin/cat-file.c:471
+msgid "pretty-print object's content"
+msgstr "오브젝트의 내용을 예쁘게 표시합니다"
+
+#: builtin/cat-file.c:473
+msgid "for blob objects, run textconv on object's content"
+msgstr "블롭 오브젝트에 대해서는, 오브젝트의 내용에 대해 textconv를 실행합니다"
+
+#: builtin/cat-file.c:475
+msgid "allow -s and -t to work with broken/corrupt objects"
+msgstr "-s 및 -t 옵션이 손상된 오브젝트에 대해 동작하도록 허용합니다"
+
+#: builtin/cat-file.c:476
+msgid "buffer --batch output"
+msgstr "--batch 출력에 대해 버퍼링합니다"
+
+#: builtin/cat-file.c:478
+msgid "show info and content of objects fed from the standard input"
+msgstr "표준 입력에서 입력된 오브젝트의 정보와 내용을 표시합니다"
+
+#: builtin/cat-file.c:481
+msgid "show info about objects fed from the standard input"
+msgstr "표준 입력에서 입력된 오브젝트의 정보를 표시합니다"
+
+#: builtin/cat-file.c:484
+msgid "follow in-tree symlinks (used with --batch or --batch-check)"
+msgstr "트리 내부의 심볼릭 링크를 따라갑니다 (--batch 또는 --batch-check와 같이 사용)"
+
+#: builtin/cat-file.c:486
+msgid "show all objects with --batch or --batch-check"
+msgstr "--batch 또는 --batch-check에서 모든 오브젝트를 표시합니다"
+
+#: builtin/check-attr.c:11
+msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
+msgstr "git check-attr [-a | --all | <속성>...] [--] <경로이름>..."
+
+#: builtin/check-attr.c:12
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+msgstr "git check-attr --stdin [-z] [-a | --all | <속성>...]"
+
+#: builtin/check-attr.c:19
+msgid "report all attributes set on file"
+msgstr "파일에 설정된 모든 속성을 표시합니다"
+
+#: builtin/check-attr.c:20
+msgid "use .gitattributes only from the index"
+msgstr "인덱스에서만 .gitattributes를 사용합니다"
+
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:96
+msgid "read file names from stdin"
+msgstr "표준 입력에서 파일 이름을 읽습니다"
+
+#: builtin/check-attr.c:23 builtin/check-ignore.c:24
+msgid "terminate input and output records by a NUL character"
+msgstr "NUL 문자를 기준으로 자료 입력 및 출력을 멈춥니다"
+
+#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325
+msgid "suppress progress reporting"
+msgstr "진행 상황 표시를 하지 않습니다"
+
+#: builtin/check-ignore.c:26
+msgid "show non-matching input paths"
+msgstr "일치하지 않는 입력 경로를 표시합니다"
+
+#: builtin/check-ignore.c:28
+msgid "ignore index when checking"
+msgstr "검사할 때 인덱스를 무시합니다"
+
+#: builtin/check-ignore.c:154
+msgid "cannot specify pathnames with --stdin"
+msgstr "--stdin으로 경로 이름을 지정할 수 없습니다"
+
+#: builtin/check-ignore.c:157
+msgid "-z only makes sense with --stdin"
+msgstr "-z 옵션은 --stdin 옵션과 같이 써야만 의미가 있습니다"
+
+#: builtin/check-ignore.c:159
+msgid "no path specified"
+msgstr "경로를 지정하지 않았습니다"
+
+#: builtin/check-ignore.c:163
+msgid "--quiet is only valid with a single pathname"
+msgstr "--quiet 옵션은 하나의 경로 이름과 같이 써야 합니다"
+
+#: builtin/check-ignore.c:165
+msgid "cannot have both --quiet and --verbose"
+msgstr "--quiet 및 --verbose 옵션을 같이 쓸 수 없습니다"
+
+#: builtin/check-ignore.c:168
+msgid "--non-matching is only valid with --verbose"
+msgstr "--non-matching 옵션은 --verbose 옵션과 같이 써야 합니다"
+
+#: builtin/check-mailmap.c:8
+msgid "git check-mailmap [<options>] <contact>..."
+msgstr "git check-mailmap [<옵션>] <연락처>..."
+
+#: builtin/check-mailmap.c:13
+msgid "also read contacts from stdin"
+msgstr "또 연락처를 표준 입력에서 읽습니다"
+
+#: builtin/check-mailmap.c:24
+#, c-format
+msgid "unable to parse contact: %s"
+msgstr "연락처를 파싱할 수 없습니다: %s"
+
+#: builtin/check-mailmap.c:47
+msgid "no contacts specified"
+msgstr "연락처를 지정하지 않았습니다"
+
+#: builtin/checkout-index.c:126
+msgid "git checkout-index [<options>] [--] [<file>...]"
+msgstr "git checkout-index [<옵션>] [--] [<파일>...]"
+
+#: builtin/checkout-index.c:188
+msgid "check out all files in the index"
+msgstr "인덱스의 모든 파일을 가져옵니다"
+
+#: builtin/checkout-index.c:189
+msgid "force overwrite of existing files"
+msgstr "기존 파일을 강제로 덮어 씁니다"
+
+#: builtin/checkout-index.c:191
+msgid "no warning for existing files and files not in index"
+msgstr "기존 파일과 인덱스에 없는 파일에 대해 경고하지 않습니다"
+
+#: builtin/checkout-index.c:193
+msgid "don't checkout new files"
+msgstr "새 파일을 가져오지 않습니다"
+
+#: builtin/checkout-index.c:195
+msgid "update stat information in the index file"
+msgstr "인덱스 파일의 stat 정보를 업데이트합니다"
+
+#: builtin/checkout-index.c:201
+msgid "read list of paths from the standard input"
+msgstr "표준 입력에서 경로의 목록을 읽습니다"
+
+#: builtin/checkout-index.c:203
+msgid "write the content to temporary files"
+msgstr "내용을 임시 파일에 씁니다"
+
+#: builtin/checkout-index.c:204 builtin/column.c:30
+#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181
+msgid "string"
+msgstr "문자열"
+
+#: builtin/checkout-index.c:205
+msgid "when creating files, prepend <string>"
+msgstr "파일을 만들 때, 앞에 <문자열>을 붙입니다"
+
+#: builtin/checkout-index.c:208
+msgid "copy out the files from named stage"
+msgstr "지정한 스테이지에서 파일을 복사해 옵니다"
+
+#: builtin/checkout.c:25
+msgid "git checkout [<options>] <branch>"
+msgstr "git checkout [<옵션>] <브랜치>"
+
+#: builtin/checkout.c:26
+msgid "git checkout [<options>] [<branch>] -- <file>..."
+msgstr "git checkout [<옵션>] [<브랜치>] -- <파일>..."
+
+#: builtin/checkout.c:134 builtin/checkout.c:167
+#, c-format
+msgid "path '%s' does not have our version"
+msgstr "'%s' 경로에 우리쪽 버전이 없습니다"
+
+#: builtin/checkout.c:136 builtin/checkout.c:169
+#, c-format
+msgid "path '%s' does not have their version"
+msgstr "'%s' 경로에 상대편 버전이 없습니다"
+
+#: builtin/checkout.c:152
+#, c-format
+msgid "path '%s' does not have all necessary versions"
+msgstr "'%s' 경로에 필요한 모든 버전이 없습니다"
+
+#: builtin/checkout.c:196
+#, c-format
+msgid "path '%s' does not have necessary versions"
+msgstr "'%s' 경로에 필요한 버전이 없습니다"
+
+#: builtin/checkout.c:213
+#, c-format
+msgid "path '%s': cannot merge"
+msgstr "'%s' 경로: 병합할 수 없습니다"
+
+#: builtin/checkout.c:230
+#, c-format
+msgid "Unable to add merge result for '%s'"
+msgstr "'%s'에 대한 병합 결과를 추가할 수 없습니다"
+
+#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
+#: builtin/checkout.c:260
+#, c-format
+msgid "'%s' cannot be used with updating paths"
+msgstr "'%s' 옵션은 업데이트하는 경로에서 쓸 수 없습니다"
+
+#: builtin/checkout.c:263 builtin/checkout.c:266
+#, c-format
+msgid "'%s' cannot be used with %s"
+msgstr "'%s' 옵션은 %s 옵션과 같이 쓸 수 없습니다"
+
+#: builtin/checkout.c:269
+#, c-format
+msgid "Cannot update paths and switch to branch '%s' at the same time."
+msgstr "경로를 업데이트하고 '%s' 브랜치로 전환하는 일은 동시에 할 수 없습니다."
+
+#: builtin/checkout.c:280 builtin/checkout.c:474
+msgid "corrupt index file"
+msgstr "손상된 인덱스 파일"
+
+#: builtin/checkout.c:340 builtin/checkout.c:347
+#, c-format
+msgid "path '%s' is unmerged"
+msgstr "'%s' 경로를 병합하지 않았습니다"
+
+#: builtin/checkout.c:496
+msgid "you need to resolve your current index first"
+msgstr "현재 인덱스를 먼저 해결해야 합니다"
+
+#: builtin/checkout.c:623
+#, c-format
+msgid "Can not do reflog for '%s': %s\n"
+msgstr "'%s'에 대해 reflog할 수 없습니다: %s\n"
+
+#: builtin/checkout.c:661
+msgid "HEAD is now at"
+msgstr "HEAD의 현재 위치는"
+
+#: builtin/checkout.c:668
+#, c-format
+msgid "Reset branch '%s'\n"
+msgstr "'%s' 브랜치 리셋\n"
+
+#: builtin/checkout.c:671
+#, c-format
+msgid "Already on '%s'\n"
+msgstr "이미 '%s'에 있습니다\n"
+
+#: builtin/checkout.c:675
+#, c-format
+msgid "Switched to and reset branch '%s'\n"
+msgstr "'%s' 브랜치로 전환하고 리셋합니다\n"
+
+#: builtin/checkout.c:677 builtin/checkout.c:1066
+#, c-format
+msgid "Switched to a new branch '%s'\n"
+msgstr "새로 만든 '%s' 브랜치로 전환합니다\n"
+
+#: builtin/checkout.c:679
+#, c-format
+msgid "Switched to branch '%s'\n"
+msgstr "'%s' 브랜치로 전환합니다\n"
+
+#: builtin/checkout.c:731
+#, c-format
+msgid " ... and %d more.\n"
+msgstr " ... 그리고 %d개 더.\n"
+
+#: builtin/checkout.c:737
+#, c-format
+msgid ""
+"Warning: you are leaving %d commit behind, not connected to\n"
+"any of your branches:\n"
+"\n"
+"%s\n"
+msgid_plural ""
+"Warning: you are leaving %d commits behind, not connected to\n"
+"any of your branches:\n"
+"\n"
+"%s\n"
+msgstr[0] ""
+"경고: 브랜치 중에 아무것에도 연결되지 않은 커밋이 뒤에\n"
+"%d개 있습니다:\n"
+"\n"
+"%s\n"
+
+#: builtin/checkout.c:756
+#, c-format
+msgid ""
+"If you want to keep it by creating a new branch, this may be a good time\n"
+"to do so with:\n"
+"\n"
+" git branch <new-branch-name> %s\n"
+"\n"
+msgid_plural ""
+"If you want to keep them by creating a new branch, this may be a good time\n"
+"to do so with:\n"
+"\n"
+" git branch <new-branch-name> %s\n"
+"\n"
+msgstr[0] ""
+"새 브랜치를 만들어서 이 커밋을 저장하고 싶으면, 지금 다음과\n"
+"같이 할 수 있습니다:\n"
+"\n"
+" git branch <새-브랜치-이름> %s\n"
+"\n"
+
+#: builtin/checkout.c:792
+msgid "internal error in revision walk"
+msgstr "리비전 walk에 내부 오류"
+
+#: builtin/checkout.c:796
+msgid "Previous HEAD position was"
+msgstr "이전 HEAD 위치는"
+
+#: builtin/checkout.c:823 builtin/checkout.c:1061
+msgid "You are on a branch yet to be born"
+msgstr "현재 위치가 만들 예정인 브랜치에 있습니다"
+
+#: builtin/checkout.c:968
+#, c-format
+msgid "only one reference expected, %d given."
+msgstr "하나의 레퍼런스만 지정해야 하지만 %d개를 지정했습니다."
+
+#: builtin/checkout.c:1007 builtin/worktree.c:213
+#, c-format
+msgid "invalid reference: %s"
+msgstr "잘못된 레퍼런스: %s"
+
+#: builtin/checkout.c:1036
+#, c-format
+msgid "reference is not a tree: %s"
+msgstr "레퍼런스가 트리가 아닙니다: %s"
+
+#: builtin/checkout.c:1075
+msgid "paths cannot be used with switching branches"
+msgstr "브랜치를 전환하는데 경로를 사용할 수 없습니다"
+
+#: builtin/checkout.c:1078 builtin/checkout.c:1082
+#, c-format
+msgid "'%s' cannot be used with switching branches"
+msgstr "'%s' 옵션은 브랜치를 전환할 때 쓸 수 없습니다"
+
+#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094
+#: builtin/checkout.c:1097
+#, c-format
+msgid "'%s' cannot be used with '%s'"
+msgstr "'%s' 옵션은 '%s' 옵션과 같이 쓸 수 없습니다"
+
+#: builtin/checkout.c:1102
+#, c-format
+msgid "Cannot switch branch to a non-commit '%s'"
+msgstr "브랜치를 커밋이 아닌 '%s'(으)로 전환할 수 없습니다"
+
+#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320
+#: builtin/worktree.c:322
+msgid "branch"
+msgstr "브랜치"
+
+#: builtin/checkout.c:1136
+msgid "create and checkout a new branch"
+msgstr "새 브랜치를 만들고 가져옵니다"
+
+#: builtin/checkout.c:1138
+msgid "create/reset and checkout a branch"
+msgstr "브랜치를 만들거나 리셋하고 가져옵니다"
+
+#: builtin/checkout.c:1139
+msgid "create reflog for new branch"
+msgstr "새 브랜치에 대한 reflog를 만듭니다"
+
+#: builtin/checkout.c:1140
+msgid "detach the HEAD at named commit"
+msgstr "지정한 커밋에서 HEAD를 분리합니다"
+
+#: builtin/checkout.c:1141
+msgid "set upstream info for new branch"
+msgstr "새 브랜치에 대한 업스트림 정보를 설정합니다"
+
+#: builtin/checkout.c:1143
+msgid "new-branch"
+msgstr "새-브랜치"
+
+#: builtin/checkout.c:1143
+msgid "new unparented branch"
+msgstr "상위 브랜치가 없는 새 브랜치"
+
+#: builtin/checkout.c:1144
+msgid "checkout our version for unmerged files"
+msgstr "병합되지 않은 파일에 대해 우리쪽 버전을 가져옵니다"
+
+#: builtin/checkout.c:1146
+msgid "checkout their version for unmerged files"
+msgstr "병합되지 않은 파일에 대해 상대편 버전을 가져옵니다"
+
+#: builtin/checkout.c:1148
+msgid "force checkout (throw away local modifications)"
+msgstr "강제로 체크아웃합니다 (로컬에서 수정한 사항을 버립니다)"
+
+#: builtin/checkout.c:1149
+msgid "perform a 3-way merge with the new branch"
+msgstr "새 브랜치에 대해 3-방향 병합을 수행합니다"
+
+#: builtin/checkout.c:1150 builtin/merge.c:227
+msgid "update ignored files (default)"
+msgstr "무시하는 파일을 업데이트합니다 (기본값)"
+
+#: builtin/checkout.c:1151 builtin/log.c:1266 parse-options.h:250
+msgid "style"
+msgstr "스타일"
+
+#: builtin/checkout.c:1152
+msgid "conflict style (merge or diff3)"
+msgstr "충돌 스타일 (merge 또는 diff3)"
+
+# FIXME: 의미 불명
+#: builtin/checkout.c:1155
+msgid "do not limit pathspecs to sparse entries only"
+msgstr "경로명세를 드문 항목에만 제한하지 않습니다"
+
+#: builtin/checkout.c:1157
+msgid "second guess 'git checkout <no-such-branch>'"
+msgstr "'git checkout <없는-브랜치>'에 대해 추측합니다"
+
+#: builtin/checkout.c:1159
+msgid "do not check if another worktree is holding the given ref"
+msgstr "다른 작업폴더에 주어진 레퍼런스가 있는지 확인하지 않습니다"
+
+#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112
+#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:558
+#: builtin/send-pack.c:168
+msgid "force progress reporting"
+msgstr "강제로 진행 상황을 표시합니다"
+
+#: builtin/checkout.c:1191
+msgid "-b, -B and --orphan are mutually exclusive"
+msgstr "-b, -B 및 --orphan 옵션은 서로 호환되지 않습니다"
+
+#: builtin/checkout.c:1208
+msgid "--track needs a branch name"
+msgstr "--track 옵션은 브랜치 이름이 필요합니다"
+
+#: builtin/checkout.c:1213
+msgid "Missing branch name; try -b"
+msgstr "브랜치 이름이 없습니다. -b 옵션을 사용해 보십시오"
+
+#: builtin/checkout.c:1249
+msgid "invalid path specification"
+msgstr "경로 명세가 잘못되었습니다"
+
+#: builtin/checkout.c:1256
+#, c-format
+msgid ""
+"Cannot update paths and switch to branch '%s' at the same time.\n"
+"Did you intend to checkout '%s' which can not be resolved as commit?"
+msgstr ""
+"동시에 경로를 업데이트하고 '%s' 브랜치로 전환할 수 없습니다.\n"
+"커밋을 확인할 수 없는 '%s'을(를) 가져오려고 하셨습니까?"
+
+#: builtin/checkout.c:1261
+#, c-format
+msgid "git checkout: --detach does not take a path argument '%s'"
+msgstr "git checkout: --detach 옵션은 경로 인자를 받지 않습니다 '%s'"
+
+#: builtin/checkout.c:1265
+msgid ""
+"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
+"checking out of the index."
+msgstr ""
+"git checkout: --ours/--theirs, --force 및 --merge 옵션은 인덱스에서\n"
+"가져올 경우에는 서로 호환되지 않습니다."
+
+#: builtin/clean.c:25
+msgid ""
+"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
+msgstr ""
+"git clean [-d] [-f] [-i] [-n] [-q] [-e <패턴>] [-x | -X] [--] <경로>..."
+
+#: builtin/clean.c:29
+#, c-format
+msgid "Removing %s\n"
+msgstr "%s 제거\n"
+
+#: builtin/clean.c:30
+#, c-format
+msgid "Would remove %s\n"
+msgstr "%s 제거할 예정\n"
+
+#: builtin/clean.c:31
+#, c-format
+msgid "Skipping repository %s\n"
+msgstr "%s 저장소 건너뜀\n"
+
+#: builtin/clean.c:32
+#, c-format
+msgid "Would skip repository %s\n"
+msgstr "%s 저장소 건너뛸 예정\n"
+
+#: builtin/clean.c:33
+#, c-format
+msgid "failed to remove %s"
+msgstr "%s 제거에 실패했습니다"
+
+#: builtin/clean.c:315
+msgid ""
+"Prompt help:\n"
+"1          - select a numbered item\n"
+"foo        - select item based on unique prefix\n"
+"           - (empty) select nothing"
+msgstr ""
+"프롬프트 도움말:\n"
+"1          - 해당 번호의 항목을 선택\n"
+"foo        - 유일한 접두어에 해당하는 항목 선택\n"
+"           - (빈 입력) 선택하지 않음"
+
+#: builtin/clean.c:319
+msgid ""
+"Prompt help:\n"
+"1          - select a single item\n"
+"3-5        - select a range of items\n"
+"2-3,6-9    - select multiple ranges\n"
+"foo        - select item based on unique prefix\n"
+"-...       - unselect specified items\n"
+"*          - choose all items\n"
+"           - (empty) finish selecting"
+msgstr ""
+"프롬프트 도움말:\n"
+"1          - 해당 번호의 항목을 선택\n"
+"3-5        - 해당 범위의 항목을 선택\n"
+"2-3,6-9    - 여러 개 범위를 선택\n"
+"foo        - 유일한 접두어에 해당하는 항목 선택\n"
+"-...       - 해당 항목 선택 해제\n"
+"*          - 모든 항목 선택\n"
+"           - (빈 입력) 선택 마침"
+
+#: builtin/clean.c:535
+#, c-format
+msgid "Huh (%s)?"
+msgstr "어라라 (%s)?"
+
+#: builtin/clean.c:677
+#, c-format
+msgid "Input ignore patterns>> "
+msgstr "무시할 패턴을 입력하십시오>> "
+
+#: builtin/clean.c:714
+#, c-format
+msgid "WARNING: Cannot find items matched by: %s"
+msgstr "경고: 다음에 해당하는 항목을 찾을 수 없습니다: %s"
+
+#: builtin/clean.c:735
+msgid "Select items to delete"
+msgstr "삭제할 항목을 선택하십시오"
+
+#. TRANSLATORS: Make sure to keep [y/N] as is
+#: builtin/clean.c:776
+#, c-format
+msgid "Remove %s [y/N]? "
+msgstr "%s 제거합니까 [y/N]? "
+
+#: builtin/clean.c:801
+msgid "Bye."
+msgstr "끝."
+
+#: builtin/clean.c:809
+msgid ""
+"clean               - start cleaning\n"
+"filter by pattern   - exclude items from deletion\n"
+"select by numbers   - select items to be deleted by numbers\n"
+"ask each            - confirm each deletion (like \"rm -i\")\n"
+"quit                - stop cleaning\n"
+"help                - this screen\n"
+"?                   - help for prompt selection"
+msgstr ""
+"clean               - 지우기 시작\n"
+"filter by pattern   - exclude items from deletion\n"
+"select by numbers   - 삭제할 항목을 번호로 선택\n"
+"ask each            - 삭제 항목을 (\"rm -i\" 처럼) 하나하나 확인\n"
+"quit                - 지우기 중지\n"
+"help                - 이 화면 표시\n"
+"?                   - 프롬프트 선택 도움말"
+
+#: builtin/clean.c:836
+msgid "*** Commands ***"
+msgstr "*** 명령 ***"
+
+#: builtin/clean.c:837
+msgid "What now"
+msgstr "무엇을 할까요"
+
+#: builtin/clean.c:845
+msgid "Would remove the following item:"
+msgid_plural "Would remove the following items:"
+msgstr[0] "다음 항목을 제거할 예정입니다:"
+
+#: builtin/clean.c:862
+msgid "No more files to clean, exiting."
+msgstr "지울 파일이 이제 없으므로 끝냅니다."
+
+#: builtin/clean.c:893
+msgid "do not print names of files removed"
+msgstr "제거할 파일 이름을 표시하지 않습니다"
+
+#: builtin/clean.c:895
+msgid "force"
+msgstr "강제"
+
+#: builtin/clean.c:896
+msgid "interactive cleaning"
+msgstr "대화형 지우기"
+
+#: builtin/clean.c:898
+msgid "remove whole directories"
+msgstr "전체 디렉터리 제거"
+
+#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709
+#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182
+msgid "pattern"
+msgstr "패턴"
+
+#: builtin/clean.c:900
+msgid "add <pattern> to ignore rules"
+msgstr "규칙을 무시하려면 <패턴>을 추가하십시오"
+
+#: builtin/clean.c:901
+msgid "remove ignored files, too"
+msgstr "무시한 파일도 제거"
+
+#: builtin/clean.c:903
+msgid "remove only ignored files"
+msgstr "무시한 파일만 제거"
+
+#: builtin/clean.c:921
+msgid "-x and -X cannot be used together"
+msgstr "-x 및 -X 옵션은 같이 쓸 수 없습니다"
+
+#: builtin/clean.c:925
+msgid ""
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
+"clean"
+msgstr "clean.requireForce가 true로 설정되었고 -i, -n, -f 옵션 중 하나도 쓰지 않았습니다. 지우지 않습니다"
+
+#: builtin/clean.c:928
+msgid ""
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
+"refusing to clean"
+msgstr "clean.requireForce 기본값이 true이고 -i, -n, -f 옵션 중 하나도 쓰지 않았습니다. 지우지 않습니다"
+
+#: builtin/clone.c:37
+msgid "git clone [<options>] [--] <repo> [<dir>]"
+msgstr "git clone [<옵션>] [--] <저장소> [<디렉터리>]"
+
+#: builtin/clone.c:59
+msgid "don't create a checkout"
+msgstr "체크아웃을 만들지 않습니다"
+
+#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469
+msgid "create a bare repository"
+msgstr "간략한 저장소를 만듭니다"
+
+#: builtin/clone.c:64
+msgid "create a mirror repository (implies bare)"
+msgstr "미러 저장소를 만듭니다 (간략한 저장소로 취급)"
+
+#: builtin/clone.c:66
+msgid "to clone from a local repository"
+msgstr "로컬 저장소에서 복제합니다"
+
+#: builtin/clone.c:68
+msgid "don't use local hardlinks, always copy"
+msgstr "로컬 하드링크를 사용하지 않고, 항상 복사합니다"
+
+#: builtin/clone.c:70
+msgid "setup as shared repository"
+msgstr "공유 저장소로 설정합니다"
+
+#: builtin/clone.c:72 builtin/clone.c:74
+msgid "initialize submodules in the clone"
+msgstr "복제한 결과물에서 하위 모듈을 초기화합니다"
+
+#: builtin/clone.c:75 builtin/init-db.c:466
+msgid "template-directory"
+msgstr "서식-디렉터리"
+
+#: builtin/clone.c:76 builtin/init-db.c:467
+msgid "directory from which templates will be used"
+msgstr "서식을 사용할 디렉터리 위치"
+
+#: builtin/clone.c:78 builtin/submodule--helper.c:179
+msgid "reference repository"
+msgstr "레퍼런스 저장소"
+
+#: builtin/clone.c:80
+msgid "use --reference only while cloning"
+msgstr "복제할 경우에만 --reference를 사용합니다"
+
+#: builtin/clone.c:81 builtin/column.c:26 builtin/merge-file.c:44
+msgid "name"
+msgstr "이름"
+
+#: builtin/clone.c:82
+msgid "use <name> instead of 'origin' to track upstream"
+msgstr "업스트림 추적에 'origin' 대신 <이름>을 사용합니다"
+
+#: builtin/clone.c:84
+msgid "checkout <branch> instead of the remote's HEAD"
+msgstr "리모트의 HEAD 대신 <브랜치>를 가져옵니다"
+
+#: builtin/clone.c:86
+msgid "path to git-upload-pack on the remote"
+msgstr "리모트의 git-upload-pack 경로"
+
+#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654 builtin/pull.c:186
+msgid "depth"
+msgstr "깊이"
+
+#: builtin/clone.c:88
+msgid "create a shallow clone of that depth"
+msgstr "지정한 깊이의 얕은 복제를 만듭니다"
+
+#: builtin/clone.c:90
+msgid "clone only one branch, HEAD or --branch"
+msgstr "하나의 브랜치만 복제합니다 (HEAD 또는 --branch로 지정)"
+
+#: builtin/clone.c:91 builtin/init-db.c:475
+msgid "gitdir"
+msgstr "gitdir"
+
+#: builtin/clone.c:92 builtin/init-db.c:476
+msgid "separate git dir from working tree"
+msgstr "깃 디렉터리를 작업 폴더와 별개의 위치에 놓습니다"
+
+#: builtin/clone.c:93
+msgid "key=value"
+msgstr "키=값"
+
+#: builtin/clone.c:94
+msgid "set config inside the new repository"
+msgstr "새 저장소 안에서 설정합니다"
+
+#: builtin/clone.c:300
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "레퍼런스 '%s' 저장소를 연결된 체크아웃으로 쓰기는 아직 지원하지 않습니다."
+
+#: builtin/clone.c:302
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "레퍼런스 '%s' 저장소가 로컬 저장소가 아닙니다."
+
+#: builtin/clone.c:307
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "레퍼런스 '%s' 저장소가 얕은 저장소입니다"
+
+#: builtin/clone.c:310
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "레퍼런스 '%s' 저장소가 붙어 있는 저장소입니다"
+
+#: builtin/clone.c:375 builtin/diff.c:84
+#, c-format
+msgid "failed to stat '%s'"
+msgstr "'%s'에 대해 stat()이 실패했습니다"
+
+#: builtin/clone.c:377
+#, c-format
+msgid "%s exists and is not a directory"
+msgstr "'%s'이(가) 있지만 디렉터리가 아닙니다"
+
+#: builtin/clone.c:391
+#, c-format
+msgid "failed to stat %s\n"
+msgstr "'%s'에 대해 stat()이 실패했습니다\n"
+
+#: builtin/clone.c:413
+#, c-format
+msgid "failed to create link '%s'"
+msgstr "'%s' 링크를 만드는데 실패했습니다"
+
+#: builtin/clone.c:417
+#, c-format
+msgid "failed to copy file to '%s'"
+msgstr "파일을 '%s'(으)로 복사하는데 실패했습니다"
+
+#: builtin/clone.c:442 builtin/clone.c:626
+#, c-format
+msgid "done.\n"
+msgstr "완료.\n"
+
+#: builtin/clone.c:454
+msgid ""
+"Clone succeeded, but checkout failed.\n"
+"You can inspect what was checked out with 'git status'\n"
+"and retry the checkout with 'git checkout -f HEAD'\n"
+msgstr ""
+"복제가 성공했지만, 체크아웃이 실패했습니다.\n"
+"'git status' 명령으로 무엇을 체크아웃했는지 살펴볼 수 있고\n"
+"'git checkout -f HEAD'로 체크아웃을 다시 할 수 있습니다\n"
+
+#: builtin/clone.c:531
+#, c-format
+msgid "Could not find remote branch %s to clone."
+msgstr "복제할 리모트의 %s 브랜치를 찾을 수 없습니다."
+
+#: builtin/clone.c:621
+#, c-format
+msgid "Checking connectivity... "
+msgstr "연결을 확인하는 중입니다..."
+
+#: builtin/clone.c:624
+msgid "remote did not send all necessary objects"
+msgstr "리모트에서 필요한 오브젝트를 모두 보내지 않았습니다"
+
+#: builtin/clone.c:688
+msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
+msgstr "리모트 HEAD가 없는 레퍼런스를 참고하므로, 체크아웃할 수 없습니다.\n"
+
+#: builtin/clone.c:719
+msgid "unable to checkout working tree"
+msgstr "작업 폴더를 체크아웃할 수 없습니다"
+
+#: builtin/clone.c:808
+msgid "cannot repack to clean up"
+msgstr "정리용으로 repack할 수 없습니다"
+
+#: builtin/clone.c:810
+msgid "cannot unlink temporary alternates file"
+msgstr "보조 임시 파일을 삭제할 수 없습니다"
+
+#: builtin/clone.c:842
+msgid "Too many arguments."
+msgstr "너무 인자가 많습니다."
+
+#: builtin/clone.c:846
+msgid "You must specify a repository to clone."
+msgstr "복제할 저장소를 지정해야 합니다."
+
+#: builtin/clone.c:857
+#, c-format
+msgid "--bare and --origin %s options are incompatible."
+msgstr "--bare 및 --origin %s 옵션은 호환되지 않습니다."
+
+#: builtin/clone.c:860
+msgid "--bare and --separate-git-dir are incompatible."
+msgstr "--bare 및 --separate-git-dir 옵션은 호환되지 않습니다."
+
+#: builtin/clone.c:873
+#, c-format
+msgid "repository '%s' does not exist"
+msgstr "'%s' 저장소가 없습니다"
+
+#: builtin/clone.c:879 builtin/fetch.c:1166
+#, c-format
+msgid "depth %s is not a positive number"
+msgstr "깊이가(%s) 0보다 큰 수가 아닙니다"
+
+#: builtin/clone.c:889
+#, c-format
+msgid "destination path '%s' already exists and is not an empty directory."
+msgstr "대상 경로가('%s') 이미 있고 빈 디렉터리가 아닙니다."
+
+#: builtin/clone.c:899
+#, c-format
+msgid "working tree '%s' already exists."
+msgstr "작업 폴더가('%s') 이미 있습니다."
+
+#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224
+#: builtin/worktree.c:221 builtin/worktree.c:248
+#, c-format
+msgid "could not create leading directories of '%s'"
+msgstr "'%s'의 앞 디렉터리를 만들 수 없습니다"
+
+#: builtin/clone.c:917
+#, c-format
+msgid "could not create work tree dir '%s'"
+msgstr "작업 디렉터리를('%s') 만들 수 없습니다"
+
+#: builtin/clone.c:935
+#, c-format
+msgid "Cloning into bare repository '%s'...\n"
+msgstr "간략한 저장소로('%s') 복제합니다...\n"
+
+#: builtin/clone.c:937
+#, c-format
+msgid "Cloning into '%s'...\n"
+msgstr "'%s'에 복제합니다...\n"
+
+#: builtin/clone.c:975
+msgid "--depth is ignored in local clones; use file:// instead."
+msgstr "--depth 옵션은 로컬 복제에서 무시됩니다. 대신에 'file://'을 사용하십시오."
+
+#: builtin/clone.c:978
+msgid "source repository is shallow, ignoring --local"
+msgstr "원본 저장소가 얕은 저장소이므로, --local 옵션을 무시합니다"
+
+#: builtin/clone.c:983
+msgid "--local is ignored"
+msgstr "--local 옵션은 무시됩니다"
+
+#: builtin/clone.c:987
+#, c-format
+msgid "Don't know how to clone %s"
+msgstr "%s의 복제 방법을 알지 못합니다"
+
+#: builtin/clone.c:1036 builtin/clone.c:1044
+#, c-format
+msgid "Remote branch %s not found in upstream %s"
+msgstr "리모트의 %s 브랜치가 업스트림 %s에 없습니다"
+
+#: builtin/clone.c:1047
+msgid "You appear to have cloned an empty repository."
+msgstr "빈 저장소를 복제한 것처럼 보입니다."
+
+#: builtin/column.c:9
+msgid "git column [<options>]"
+msgstr "git column [<옵션>]"
+
+#: builtin/column.c:26
+msgid "lookup config vars"
+msgstr "설정 변수를 찾아 봅니다"
+
+#: builtin/column.c:27 builtin/column.c:28
+msgid "layout to use"
+msgstr "사용할 배치"
+
+#: builtin/column.c:29
+msgid "Maximum width"
+msgstr "최대 너비"
+
+#: builtin/column.c:30
+msgid "Padding space on left border"
+msgstr "왼쪽 가장자리에 채울 공백"
+
+#: builtin/column.c:31
+msgid "Padding space on right border"
+msgstr "오른쪽 가장자리에 채울 공백"
+
+#: builtin/column.c:32
+msgid "Padding space between columns"
+msgstr "열 사이에 채울 공백"
+
+#: builtin/column.c:51
+msgid "--command must be the first argument"
+msgstr "--command는 첫 번째 인자여야 합니다"
+
+#: builtin/commit.c:38
+msgid "git commit [<options>] [--] <pathspec>..."
+msgstr "git commit [<옵션>] [--] <경로명세>..."
+
+#: builtin/commit.c:43
+msgid "git status [<options>] [--] <pathspec>..."
+msgstr "git status [<옵션>] [--] <경로명세>..."
+
+#: builtin/commit.c:48
+msgid ""
+"Your name and email address were configured automatically based\n"
+"on your username and hostname. Please check that they are accurate.\n"
+"You can suppress this message by setting them explicitly. Run the\n"
+"following command and follow the instructions in your editor to edit\n"
+"your configuration file:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"After doing this, you may fix the identity used for this commit with:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+msgstr ""
+"이름과 전자메일 주소를 사용자 이름과 호스트 이름을 이용해서 자동으로\n"
+"설정했습니다. 이 정보가 맞는지 확인하십시오. 이 메시지를 보지 않으려면 정보"
+"를\n"
+"명시적으로 설정하십시오. 다음 명령어를 실행하고 편집기의 안내에 따라 설정\n"
+"파일을 편집하십시오:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"이렇게 한 다음, 이 커밋에 사용한 신원 정보를 다음과 같이 해서 바꿀 수 있습니"
+"다:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+
+#: builtin/commit.c:61
+msgid ""
+"Your name and email address were configured automatically based\n"
+"on your username and hostname. Please check that they are accurate.\n"
+"You can suppress this message by setting them explicitly:\n"
+"\n"
+"    git config --global user.name \"Your Name\"\n"
+"    git config --global user.email you@example.com\n"
+"\n"
+"After doing this, you may fix the identity used for this commit with:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+msgstr ""
+"이름과 전자메일 주소를 사용자 이름과 호스트 이름을 이용해서\n"
+"자동으로 설정했습니다. 이 정보가 맞는지 확인하십시오. 이 메시지를\n"
+"보지 않으려면 정보를 명시적으로 설정하십시오:\n"
+"\n"
+"    git config --global user.name \"내 이름\"\n"
+"    git config --global user.email you@example.com\n"
+"\n"
+"이렇게 한 다음, 이 커밋에 사용한 신원 정보를 다음과 같이 해서 바꿀 수 있습니"
+"다:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+
+#: builtin/commit.c:73
+msgid ""
+"You asked to amend the most recent commit, but doing so would make\n"
+"it empty. You can repeat your command with --allow-empty, or you can\n"
+"remove the commit entirely with \"git reset HEAD^\".\n"
+msgstr ""
+"최초의 커밋을 바꾸려고 하지만, 그렇게 하면 커밋이 비어 있게 됩니다.\n"
+"--allow-empty 옵션과 같이 이 명령을 반복할 수도 있고, \"git reset HEAD\"\n"
+"명령으로 커밋을 완전히 제거할 수도 있습니다.\n"
+
+#: builtin/commit.c:78
+msgid ""
+"The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
+"If you wish to commit it anyway, use:\n"
+"\n"
+"    git commit --allow-empty\n"
+"\n"
+msgstr ""
+"이전 커맷 빼오기가 비어 있습니다. 아마도 충돌 해결 과정에서 그렇게 됐을\n"
+"것입니다. 그래도 커밋하려면 다음과 같이 하십시오:\n"
+"\n"
+"    git commit --allow-empty\n"
+"\n"
+
+#: builtin/commit.c:85
+msgid "Otherwise, please use 'git reset'\n"
+msgstr "아니면 'git reset'을 사용하십시오\n"
+
+#: builtin/commit.c:88
+msgid ""
+"If you wish to skip this commit, use:\n"
+"\n"
+"    git reset\n"
+"\n"
+"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
+"the remaining commits.\n"
+msgstr ""
+"이 커밋을 건너뛰려면, 다음을 사용하십시오:\n"
+"\n"
+"    git reset\n"
+"\n"
+"그 다음에 \"git cherry-pick --continue\"를 하면 나머지 커밋에\n"
+"대해 커밋 빼오기를 다시 시작합니다.\n"
+
+#: builtin/commit.c:305
+msgid "failed to unpack HEAD tree object"
+msgstr "HEAD 트리 오브젝트의 묶음을 푸는데 실패했습니다"
+
+#: builtin/commit.c:346
+msgid "unable to create temporary index"
+msgstr "임시 인덱스를 만들 수 없습니다"
+
+#: builtin/commit.c:352
+msgid "interactive add failed"
+msgstr "대화형 추가가 실패했습니다"
+
+#: builtin/commit.c:365
+msgid "unable to update temporary index"
+msgstr "임시 인덱스를 업데이트할 수 없습니다"
+
+#: builtin/commit.c:367
+msgid "Failed to update main cache tree"
+msgstr "주요 캐시 트리를 업데이트하는데 실패했습니다"
+
+#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
+msgid "unable to write new_index file"
+msgstr "new_index 파일에 쓸 수 없습니다"
+
+#: builtin/commit.c:445
+msgid "cannot do a partial commit during a merge."
+msgstr "병합하는 중 부분 커밋을 할 수 없습니다."
+
+#: builtin/commit.c:447
+msgid "cannot do a partial commit during a cherry-pick."
+msgstr "커밋 빼오기를 하는 중 부분 커밋을 할 수 없습니다."
+
+#: builtin/commit.c:456
+msgid "cannot read the index"
+msgstr "인덱스를 읽을 수 없습니다"
+
+#: builtin/commit.c:475
+msgid "unable to write temporary index file"
+msgstr "임시 인덱스 파일을 쓸 수 없습니다"
+
+#: builtin/commit.c:580
+#, c-format
+msgid "commit '%s' lacks author header"
+msgstr "'%s' 커밋에 작성자 헤더가 없습니다"
+
+#: builtin/commit.c:582
+#, c-format
+msgid "commit '%s' has malformed author line"
+msgstr "'%s' 커밋의 작성자 헤더 형식이 잘못되었습니다"
+
+#: builtin/commit.c:601
+msgid "malformed --author parameter"
+msgstr "--author 파라미터 형식이 잘못되었습니다"
+
+#: builtin/commit.c:609
+#, c-format
+msgid "invalid date format: %s"
+msgstr "시각 형식이 잘못되었습니다: %s"
+
+#: builtin/commit.c:653
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
+msgstr ""
+"현재 커밋 메시지에서 사용되지 않는 주석 문자를\n"
+"선택할 수 없습니다"
+
+#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
+#, c-format
+msgid "could not lookup commit %s"
+msgstr "%s 커밋을 찾아볼 수 없습니다"
+
+#: builtin/commit.c:702 builtin/shortlog.c:273
+#, c-format
+msgid "(reading log message from standard input)\n"
+msgstr "(표준 입력에서 로그 메시지를 읽음)\n"
+
+#: builtin/commit.c:704
+msgid "could not read log from standard input"
+msgstr "표준 입력에서 로그 메시지를 읽을 수 없습니다"
+
+#: builtin/commit.c:708
+#, c-format
+msgid "could not read log file '%s'"
+msgstr "'%s' 로그 파일을 읽을 수 없습니다"
+
+#: builtin/commit.c:730
+msgid "could not read MERGE_MSG"
+msgstr "MERGE_MSG를 읽을 수 없습니다"
+
+#: builtin/commit.c:734
+msgid "could not read SQUASH_MSG"
+msgstr "SQUASH_MSG를 읽을 수 없습니다"
+
+#: builtin/commit.c:785
+msgid "could not write commit template"
+msgstr "커밋 서식을 쓸 수 없습니다"
+
+#: builtin/commit.c:803
+#, c-format
+msgid ""
+"\n"
+"It looks like you may be committing a merge.\n"
+"If this is not correct, please remove the file\n"
+"\t%s\n"
+"and try again.\n"
+msgstr ""
+"\n"
+"병합을 커밋하려는 것으로 보입니다.\n"
+"그렇지 않다면, 다음 파일을 지우고,\n"
+"\t%s\n"
+"다시 시도하십시오.\n"
+
+#: builtin/commit.c:808
+#, c-format
+msgid ""
+"\n"
+"It looks like you may be committing a cherry-pick.\n"
+"If this is not correct, please remove the file\n"
+"\t%s\n"
+"and try again.\n"
+msgstr ""
+"\n"
+"커밋 빼오기를 커밋하려는 것으로 보입니다.\n"
+"그렇지 않다면, 다음 파일을 지우고,\n"
+"\t%s\n"
+"다시 시도하십시오.\n"
+
+#: builtin/commit.c:821
+#, c-format
+msgid ""
+"Please enter the commit message for your changes. Lines starting\n"
+"with '%c' will be ignored, and an empty message aborts the commit.\n"
+msgstr ""
+"변경 사항에 대한 커밋 메시지를 입력하십시오. '%c' 문자로 시작하는\n"
+"줄은 무시되고, 메시지를 입력하지 않으면 커밋이 중지됩니다.\n"
+
+#: builtin/commit.c:828
+#, c-format
+msgid ""
+"Please enter the commit message for your changes. Lines starting\n"
+"with '%c' will be kept; you may remove them yourself if you want to.\n"
+"An empty message aborts the commit.\n"
+msgstr ""
+"변경 사항에 대한 커밋 메시지를 입력하십시오. '%c' 문자로 시작하는\n"
+"줄은 보존되니, 필요하면 직접 제거하십시오. 메시지를 입력하지\n"
+"않으면 커밋이 중지됩니다.\n"
+
+#: builtin/commit.c:848
+#, c-format
+msgid "%sAuthor:    %.*s <%.*s>"
+msgstr "%s작성자:    %.*s <%.*s>"
+
+#: builtin/commit.c:856
+#, c-format
+msgid "%sDate:      %s"
+msgstr "%s시각:      %s"
+
+#: builtin/commit.c:863
+#, c-format
+msgid "%sCommitter: %.*s <%.*s>"
+msgstr "%s커미터: %.*s <%.*s>"
+
+#: builtin/commit.c:881
+msgid "Cannot read index"
+msgstr "인덱스를 읽을 수 없습니다"
+
+#: builtin/commit.c:938
+msgid "Error building trees"
+msgstr "트리를 만드는데 오류"
+
+#: builtin/commit.c:953 builtin/tag.c:266
+#, c-format
+msgid "Please supply the message using either -m or -F option.\n"
+msgstr "메시지를 -m 또는 -F 옵션으로 입력하십시오.\n"
+
+#: builtin/commit.c:1055
+#, c-format
+msgid "--author '%s' is not 'Name <email>' and matches no existing author"
+msgstr ""
+"--author '%s' 옵션이 '이름 <전자메일>' 형식이 아니고 기존 작성자에도 없습니다"
+
+#: builtin/commit.c:1070 builtin/commit.c:1310
+#, c-format
+msgid "Invalid untracked files mode '%s'"
+msgstr "추적되지 않는 파일 모드가 ('%s') 잘못되었습니다"
+
+#: builtin/commit.c:1107
+msgid "--long and -z are incompatible"
+msgstr "--long 및 -z 옵션은 호환되지 않습니다"
+
+#: builtin/commit.c:1137
+msgid "Using both --reset-author and --author does not make sense"
+msgstr "--reset-author 및 --author 옵션을 모두 사용하면 앞뒤가 맞지 않습니다"
+
+#: builtin/commit.c:1146
+msgid "You have nothing to amend."
+msgstr "바꿀 사항이 없습니다."
+
+#: builtin/commit.c:1149
+msgid "You are in the middle of a merge -- cannot amend."
+msgstr "병합 중에 있습니다 -- 커밋을 바꿀 수 없습니다."
+
+#: builtin/commit.c:1151
+msgid "You are in the middle of a cherry-pick -- cannot amend."
+msgstr "커밋 빼오기 중에 있습니다 -- 커밋을 바꿀 수 없습니다."
+
+#: builtin/commit.c:1154
+msgid "Options --squash and --fixup cannot be used together"
+msgstr "--squash 및 --fixup 옵션은 같이 쓸 수 없습니다"
+
+#: builtin/commit.c:1164
+msgid "Only one of -c/-C/-F/--fixup can be used."
+msgstr "-c/-C/-F/--fixup 옵션 중에 하나만 사용할 수 있습니다."
+
+#: builtin/commit.c:1166
+msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
+msgstr "-m 옵션은 -c/-C/-F/--fixup 옵션과 같이 쓸 수 없습니다."
+
+#: builtin/commit.c:1174
+msgid "--reset-author can be used only with -C, -c or --amend."
+msgstr "--reset-author 옵션은 -C, -c 또는 --amend 옵션과 같이 써야 합니다."
+
+#: builtin/commit.c:1191
+msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
+msgstr ""
+"--include/--only/--all/--interactive/--patch 옵션 중 하나만 사용할 수 있습니"
+"다."
+
+#: builtin/commit.c:1193
+msgid "No paths with --include/--only does not make sense."
+msgstr "경로가 없이 --include/--only 옵션을 쓰면 앞뒤가 맞지 않습니다."
+
+#: builtin/commit.c:1195
+msgid "Clever... amending the last one with dirty index."
+msgstr "기발하네요... 마지막을 변경된 인덱스로 바꿉니다."
+
+#: builtin/commit.c:1197
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
+msgstr "-i 또는 -o 없이 명시적인 경로를 지정했습니다. --only 경로를 가정합니다..."
+
+#: builtin/commit.c:1209 builtin/tag.c:475
+#, c-format
+msgid "Invalid cleanup mode %s"
+msgstr "잘못된 정리 모드 %s"
+
+#: builtin/commit.c:1214
+msgid "Paths with -a does not make sense."
+msgstr "-a 옵션과 경로를 같이 사용하면 앞뒤가 맞지 않습니다."
+
+#: builtin/commit.c:1324 builtin/commit.c:1605
+msgid "show status concisely"
+msgstr "상태를 간략하게 표시합니다"
+
+#: builtin/commit.c:1326 builtin/commit.c:1607
+msgid "show branch information"
+msgstr "브랜치 정보를 표시합니다"
+
+#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:544
+#: builtin/worktree.c:423
+msgid "machine-readable output"
+msgstr "컴퓨터가 읽을 수 있는 형식"
+
+#: builtin/commit.c:1331 builtin/commit.c:1611
+msgid "show status in long format (default)"
+msgstr "긴 형식으로 상태를 표시합니다 (기본값)"
+
+#: builtin/commit.c:1334 builtin/commit.c:1614
+msgid "terminate entries with NUL"
+msgstr "NUL 문자로 항목을 끝냅니다"
+
+#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:353
+msgid "mode"
+msgstr "모드"
+
+#: builtin/commit.c:1337 builtin/commit.c:1617
+msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
+msgstr "추적되지 않는 파일을 표시합니다. 추가 옵션: all, normal, no (기본값: all)"
+
+#: builtin/commit.c:1340
+msgid "show ignored files"
+msgstr "무시되는 파일을 표시합니다"
+
+#: builtin/commit.c:1341 parse-options.h:155
+msgid "when"
+msgstr "언제"
+
+#: builtin/commit.c:1342
+msgid ""
+"ignore changes to submodules, optional when: all, dirty, untracked. "
+"(Default: all)"
+msgstr "하위 모듈의 변경을 무시합니다. 추가 옵션: all, dirty, untracked. (기본값: all)"
+
+#: builtin/commit.c:1344
+msgid "list untracked files in columns"
+msgstr "추적되지 않는 파일의 목록을 여러 열로 표시합니다"
+
+#: builtin/commit.c:1430
+msgid "couldn't look up newly created commit"
+msgstr "새로 만든 커밋을 찾아볼 수 없습니다"
+
+#: builtin/commit.c:1432
+msgid "could not parse newly created commit"
+msgstr "새로 만든 커밋을 파싱할 수 없습니다"
+
+#: builtin/commit.c:1477
+msgid "detached HEAD"
+msgstr "HEAD 분리됨"
+
+#: builtin/commit.c:1480
+msgid " (root-commit)"
+msgstr " (최상위-커밋)"
+
+#: builtin/commit.c:1575
+msgid "suppress summary after successful commit"
+msgstr "성공적인 커밋 후에 요약을 표시하지 않습니다"
+
+#: builtin/commit.c:1576
+msgid "show diff in commit message template"
+msgstr "커밋 메시지 서식에 diff를 표시합니다"
+
+#: builtin/commit.c:1578
+msgid "Commit message options"
+msgstr "커밋 메시지 옵션"
+
+#: builtin/commit.c:1579 builtin/tag.c:351
+msgid "read message from file"
+msgstr "파일에서 메시지를 읽습니다"
+
+#: builtin/commit.c:1580
+msgid "author"
+msgstr "작성자"
+
+#: builtin/commit.c:1580
+msgid "override author for commit"
+msgstr "커밋의 작성자를 지정합니다"
+
+#: builtin/commit.c:1581 builtin/gc.c:326
+msgid "date"
+msgstr "시각"
+
+#: builtin/commit.c:1581
+msgid "override date for commit"
+msgstr "커밋의 시각을 지정합니다"
+
+#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392
+#: builtin/notes.c:555 builtin/tag.c:349
+msgid "message"
+msgstr "메시지"
+
+#: builtin/commit.c:1582
+msgid "commit message"
+msgstr "커밋 메시지"
+
+#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
+#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
+msgid "commit"
+msgstr "커밋"
+
+#: builtin/commit.c:1583
+msgid "reuse and edit message from specified commit"
+msgstr "지정한 커밋의 메시지를 재사용하고 편집합니다"
+
+#: builtin/commit.c:1584
+msgid "reuse message from specified commit"
+msgstr "지정한 커밋에서 메시지를 재사용합니다"
+
+#: builtin/commit.c:1585
+msgid "use autosquash formatted message to fixup specified commit"
+msgstr "지정한 커밋을 수정하는데 autosquash 형식 메시지를 사용합니다"
+
+#: builtin/commit.c:1586
+msgid "use autosquash formatted message to squash specified commit"
+msgstr "지정한 커밋을 합치는데 autosquash 형식 메시지를 사용합니다"
+
+#: builtin/commit.c:1587
+msgid "the commit is authored by me now (used with -C/-c/--amend)"
+msgstr "커밋을 내가 작성한 것으로 만듭니다 (-C/-c/--amend와 같이 사용)"
+
+#: builtin/commit.c:1588 builtin/log.c:1216 builtin/revert.c:86
+msgid "add Signed-off-by:"
+msgstr "Signed-off-by: 줄을 추가합니다"
+
+#: builtin/commit.c:1589
+msgid "use specified template file"
+msgstr "지정한 서식 파일을 사용합니다"
+
+#: builtin/commit.c:1590
+msgid "force edit of commit"
+msgstr "커밋 편집을 강제합니다"
+
+#: builtin/commit.c:1591
+msgid "default"
+msgstr "기본값"
+
+#: builtin/commit.c:1591 builtin/tag.c:354
+msgid "how to strip spaces and #comments from message"
+msgstr "메시지에서 공백과 #주석을 지웁니다"
+
+#: builtin/commit.c:1592
+msgid "include status in commit message template"
+msgstr "커밋 메시지 서식에 상태를 포함합니다"
+
+#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156
+#: builtin/revert.c:93
+msgid "GPG sign commit"
+msgstr "GPG 서명 커밋"
+
+#: builtin/commit.c:1597
+msgid "Commit contents options"
+msgstr "커밋 내용 옵션"
+
+#: builtin/commit.c:1598
+msgid "commit all changed files"
+msgstr "변경된 파일을 모두 커밋합니다"
+
+#: builtin/commit.c:1599
+msgid "add specified files to index for commit"
+msgstr "지정한 파일을 커밋할 인덱스에 추가합니다"
+
+#: builtin/commit.c:1600
+msgid "interactively add files"
+msgstr "대화형으로 파일을 추가합니다"
+
+#: builtin/commit.c:1601
+msgid "interactively add changes"
+msgstr "대화형으로 변경 사항을 추가합니다"
+
+#: builtin/commit.c:1602
+msgid "commit only specified files"
+msgstr "지정한 파일만 커밋합니다"
+
+#: builtin/commit.c:1603
+msgid "bypass pre-commit hook"
+msgstr "커밋 전 후크를 건너뜁니다"
+
+#: builtin/commit.c:1604
+msgid "show what would be committed"
+msgstr "무엇을 커밋할지 표시합니다"
+
+#: builtin/commit.c:1615
+msgid "amend previous commit"
+msgstr "바로 앞 커밋을 바꿉니다"
+
+#: builtin/commit.c:1616
+msgid "bypass post-rewrite hook"
+msgstr "다시쓰기 후 후크를 건너뜁니다"
+
+#: builtin/commit.c:1621
+msgid "ok to record an empty change"
+msgstr "빈 변경 사항을 기록하도록 허용합니다"
+
+#: builtin/commit.c:1623
+msgid "ok to record a change with an empty message"
+msgstr "빈 메시지와 같이 변경 사항을 기록하도록 허용합니다"
+
+#: builtin/commit.c:1652
+msgid "could not parse HEAD commit"
+msgstr "HEAD 커밋을 파싱할 수 없습니다"
+
+#: builtin/commit.c:1698
+#, c-format
+msgid "Corrupt MERGE_HEAD file (%s)"
+msgstr "손상된 MERGE_HEAD 파일 (%s)"
+
+#: builtin/commit.c:1705
+msgid "could not read MERGE_MODE"
+msgstr "MERGE_MODE를 읽을 수 없습니다"
+
+#: builtin/commit.c:1724
+#, c-format
+msgid "could not read commit message: %s"
+msgstr "커밋 메시지를 읽을 수 없습니다: %s"
+
+#: builtin/commit.c:1735
+#, c-format
+msgid "Aborting commit; you did not edit the message.\n"
+msgstr "커밋을 중지합니다. 메시지를 편집하지 않았습니다.\n"
+
+#: builtin/commit.c:1740
+#, c-format
+msgid "Aborting commit due to empty commit message.\n"
+msgstr "커밋을 중지합니다. 커밋 메시지가 비어 있습니다.\n"
+
+#: builtin/commit.c:1788
+msgid ""
+"Repository has been updated, but unable to write\n"
+"new_index file. Check that disk is not full and quota is\n"
+"not exceeded, and then \"git reset HEAD\" to recover."
+msgstr ""
+"저장소를 업데이트했습니다. 하지만 new_index 파일을 쓸 수\n"
+"없습니다. 디스크가 꽉 차지 않았고 제한 용량을 넘어가지\n"
+"않았는지 확인하십시오. 그리고 'git reset HEAD'로 복구하십시오."
+
+#: builtin/config.c:8
+msgid "git config [<options>]"
+msgstr "git config [<옵션>]"
+
+#: builtin/config.c:54
+msgid "Config file location"
+msgstr "설정 파일 위치"
+
+#: builtin/config.c:55
+msgid "use global config file"
+msgstr "공통 설정 파일을 사용합니다"
+
+#: builtin/config.c:56
+msgid "use system config file"
+msgstr "시스템 설정 파일을 사용합니다"
+
+#: builtin/config.c:57
+msgid "use repository config file"
+msgstr "저장소 설정 파일을 사용합니다"
+
+#: builtin/config.c:58
+msgid "use given config file"
+msgstr "지정한 설정 파일을 사용합니다"
+
+#: builtin/config.c:59
+msgid "blob-id"
+msgstr "블롭-id"
+
+#: builtin/config.c:59
+msgid "read config from given blob object"
+msgstr "지정한 블롭 오브젝트에서 설정을 읽습니다"
+
+#: builtin/config.c:60
+msgid "Action"
+msgstr "동작"
+
+#: builtin/config.c:61
+msgid "get value: name [value-regex]"
+msgstr "값을 가져옵니다: <이름> [<값-정규식>]"
+
+#: builtin/config.c:62
+msgid "get all values: key [value-regex]"
+msgstr "모든 값을 가져옵니다: <키> [<값-정규식>]"
+
+#: builtin/config.c:63
+msgid "get values for regexp: name-regex [value-regex]"
+msgstr "정규식에 대한 값을 가져옵니다: <이름-정규식> [<값-정규식>]"
+
+#: builtin/config.c:64
+msgid "get value specific for the URL: section[.var] URL"
+msgstr "<URL>에 특정되는 값을 가져옵니다: <섹션>[.<변수>] <URL>"
+
+#: builtin/config.c:65
+msgid "replace all matching variables: name value [value_regex]"
+msgstr "해당하는 변수를 모두 제거합니다: <이름> <값> [<값-정규식>]"
+
+#: builtin/config.c:66
+msgid "add a new variable: name value"
+msgstr "새 변수를 추가합니다: <이름> <값>"
+
+#: builtin/config.c:67
+msgid "remove a variable: name [value-regex]"
+msgstr "변수를 제거합니다: <이름> [<값-정규식>]"
+
+#: builtin/config.c:68
+msgid "remove all matches: name [value-regex]"
+msgstr "해당하는 항목을 모두 제거합니다: <이름> [<값-정규식>]"
+
+#: builtin/config.c:69
+msgid "rename section: old-name new-name"
+msgstr "섹션의 이름을 바꿉니다: <옛-이름> <새-이름>"
+
+#: builtin/config.c:70
+msgid "remove a section: name"
+msgstr "섹션을 제거합니다: <이름>"
+
+#: builtin/config.c:71
+msgid "list all"
+msgstr "전체 목록을 표시합니다"
+
+#: builtin/config.c:72
+msgid "open an editor"
+msgstr "편집기를 엽니다"
+
+#: builtin/config.c:73
+msgid "find the color configured: slot [default]"
+msgstr "설정한 색을 찾습니다: slot [<기본값>]"
+
+#: builtin/config.c:74
+msgid "find the color setting: slot [stdout-is-tty]"
+msgstr "색 설정을 찾습니다: slot [<표준출력이-TTY인지-여부>]"
+
+#: builtin/config.c:75
+msgid "Type"
+msgstr "값 종류"
+
+#: builtin/config.c:76
+msgid "value is \"true\" or \"false\""
+msgstr "값이 \"true\" 또는 \"false\"입니다"
+
+#: builtin/config.c:77
+msgid "value is decimal number"
+msgstr "값이 십진수입니다"
+
+#: builtin/config.c:78
+msgid "value is --bool or --int"
+msgstr "값이 --bool 또는 --int입니다"
+
+#: builtin/config.c:79
+msgid "value is a path (file or directory name)"
+msgstr "값이 경로(파일 또는 디렉터리 이름)입니다"
+
+#: builtin/config.c:80
+msgid "Other"
+msgstr "기타"
+
+#: builtin/config.c:81
+msgid "terminate values with NUL byte"
+msgstr "값을 NUL 바이트로 끝냅니다"
+
+#: builtin/config.c:82
+msgid "show variable names only"
+msgstr "변수 이름만 표시합니다"
+
+#: builtin/config.c:83
+msgid "respect include directives on lookup"
+msgstr "찾아볼 때 include 지시어를 고려합니다"
+
+#: builtin/config.c:303
+msgid "unable to parse default color value"
+msgstr "기본 색 값을 파싱할 수 없습니다"
+
+#: builtin/config.c:441
+#, c-format
+msgid ""
+"# This is Git's per-user configuration file.\n"
+"[user]\n"
+"# Please adapt and uncomment the following lines:\n"
+"#\tname = %s\n"
+"#\temail = %s\n"
+msgstr ""
+"# 깃의 사용자별 설정 파일입니다.\n"
+"[user]\n"
+"# 다음 줄을 알맞게 고치고 앞의 주석을 제거하십시오:\n"
+"#\tname = %s\n"
+"#\temail = %s\n"
+
+#: builtin/config.c:575
+#, c-format
+msgid "cannot create configuration file %s"
+msgstr "%s 설정 파일을 만들 수 없습니다"
+
+#: builtin/count-objects.c:77
+msgid "git count-objects [-v] [-H | --human-readable]"
+msgstr "git count-objects [-v] [-H | --human-readable]"
+
+#: builtin/count-objects.c:87
+msgid "print sizes in human readable format"
+msgstr "사람이 읽기 좋은 형식으로 크기를 표시합니다"
+
+#: builtin/describe.c:17
+msgid "git describe [<options>] [<commit-ish>...]"
+msgstr "git describe [<옵션>] [<커밋-따위>...]"
+
+#: builtin/describe.c:18
+msgid "git describe [<options>] --dirty"
+msgstr "git describe [<옵션>] --dirty"
+
+#: builtin/describe.c:217
+#, c-format
+msgid "annotated tag %s not available"
+msgstr "주석 달린 %s 태그를 사용할 수 없습니다"
+
+#: builtin/describe.c:221
+#, c-format
+msgid "annotated tag %s has no embedded name"
+msgstr "주석 달린 %s 태그에 내장된 이름이 없습니다"
+
+#: builtin/describe.c:223
+#, c-format
+msgid "tag '%s' is really '%s' here"
+msgstr "'%s' 태그가 실제 여기 '%s'입니다"
+
+#: builtin/describe.c:250 builtin/log.c:459
+#, c-format
+msgid "Not a valid object name %s"
+msgstr "올바른 오브젝트 이름이 아닙니다 (%s)"
+
+#: builtin/describe.c:253
+#, c-format
+msgid "%s is not a valid '%s' object"
+msgstr "%s은(는) 올바른 '%s' 오브젝트가 아닙니다"
+
+#: builtin/describe.c:270
+#, c-format
+msgid "no tag exactly matches '%s'"
+msgstr "어떤 태그도 '%s'와(과) 정확히 일치하지 않습니다"
+
+#: builtin/describe.c:272
+#, c-format
+msgid "searching to describe %s\n"
+msgstr "%s 설명을 위해 검색하는 중\n"
+
+#: builtin/describe.c:319
+#, c-format
+msgid "finished search at %s\n"
+msgstr "%s에서 검색 마침\n"
+
+#: builtin/describe.c:346
+#, c-format
+msgid ""
+"No annotated tags can describe '%s'.\n"
+"However, there were unannotated tags: try --tags."
+msgstr ""
+"어떤 주석 달린 태그도 '%s'을(를) 설명하지 않습니다.\n"
+"하지만 주석 달리지 않은 태그가 있습니다: --tags 옵션을 해 보십시오."
+
+#: builtin/describe.c:350
+#, c-format
+msgid ""
+"No tags can describe '%s'.\n"
+"Try --always, or create some tags."
+msgstr ""
+"어떤 태그도 '%s'을(를) 설명할 수 없습니다.\n"
+"--always 옵션을 써 보거나, 태그를 만들어 보십시오."
+
+#: builtin/describe.c:371
+#, c-format
+msgid "traversed %lu commits\n"
+msgstr "커밋 %lu개를 가로질렀습니다\n"
+
+#: builtin/describe.c:374
+#, c-format
+msgid ""
+"more than %i tags found; listed %i most recent\n"
+"gave up search at %s\n"
+msgstr ""
+"태그를 %i개 넘게 찾았습니다. 가장 최근의 %i개 목록을\n"
+"표시합니다. %s 위치에서 검색을 중지합니다.\n"
+
+#: builtin/describe.c:396
+msgid "find the tag that comes after the commit"
+msgstr "커밋 다음에 오는 태그를 찾습니다"
+
+#: builtin/describe.c:397
+msgid "debug search strategy on stderr"
+msgstr "표준 오류에서 검색 전략을 디버깅합니다"
+
+#: builtin/describe.c:398
+msgid "use any ref"
+msgstr "모든 레퍼런스를 사용합니다"
+
+#: builtin/describe.c:399
+msgid "use any tag, even unannotated"
+msgstr "모든 태그를, 주석 달리지 않은 태그까지 사용합니다"
+
+#: builtin/describe.c:400
+msgid "always use long format"
+msgstr "항상 긴 형식을 사용합니다"
+
+#: builtin/describe.c:401
+msgid "only follow first parent"
+msgstr "첫 번째 이전 커밋만 따라갑니다"
+
+#: builtin/describe.c:404
+msgid "only output exact matches"
+msgstr "정확히 일치하는 항목만 출력합니다"
+
+#: builtin/describe.c:406
+msgid "consider <n> most recent tags (default: 10)"
+msgstr "<n>개의 가장 최근의 태그만 고려합니다 (기본값: 10)"
+
+#: builtin/describe.c:408
+msgid "only consider tags matching <pattern>"
+msgstr "<패턴>과 일치하는 태그만 고려합니다"
+
+#: builtin/describe.c:410 builtin/name-rev.c:314
+msgid "show abbreviated commit object as fallback"
+msgstr "대안으로 요약한 커밋 오브젝트를 표시합니다"
+
+#: builtin/describe.c:411
+msgid "mark"
+msgstr "표시"
+
+#: builtin/describe.c:412
+msgid "append <mark> on dirty working tree (default: \"-dirty\")"
+msgstr "변경된 작업 폴더에 <표시>를 뒤에 붙입니다 (기본값: \"-dirty\")"
+
+#: builtin/describe.c:430
+msgid "--long is incompatible with --abbrev=0"
+msgstr "--long 옵션은 --abbrev=0 옵션과 호환되지 않습니다"
+
+#: builtin/describe.c:456
+msgid "No names found, cannot describe anything."
+msgstr "이름이 없습니다. 아무것도 설명할 수 없습니다."
+
+#: builtin/describe.c:476
+msgid "--dirty is incompatible with commit-ishes"
+msgstr "--dirty 옵션은 커밋같은 항목과 호환되지 않았습니다"
+
+#: builtin/diff.c:86
+#, c-format
+msgid "'%s': not a regular file or symlink"
+msgstr "'%s': 일반 파일이나 심볼릭 링크가 아닙니다"
+
+#: builtin/diff.c:237
+#, c-format
+msgid "invalid option: %s"
+msgstr "잘못된 옵션: %s"
+
+#: builtin/diff.c:358
+msgid "Not a git repository"
+msgstr "깃 저장소가 아닙니다"
+
+#: builtin/diff.c:401
+#, c-format
+msgid "invalid object '%s' given."
+msgstr "잘못된 '%s' 오브젝트가 주어졌습니다."
+
+#: builtin/diff.c:410
+#, c-format
+msgid "more than two blobs given: '%s'"
+msgstr "두 개보다 많은 블롭이 주어졌습니다: '%s'"
+
+#: builtin/diff.c:417
+#, c-format
+msgid "unhandled object '%s' given."
+msgstr "처리하지 않은 '%s' 오브젝트가 주어졌습니다."
+
+#: builtin/fast-export.c:25
+msgid "git fast-export [rev-list-opts]"
+msgstr "git fast-export [rev-list-옵션]"
+
+#: builtin/fast-export.c:980
+msgid "show progress after <n> objects"
+msgstr "오브젝트 <n>개 뒤에 진행 상황을 표시합니다"
+
+#: builtin/fast-export.c:982
+msgid "select handling of signed tags"
+msgstr "서명한 태그의 처리 방식을 선택합니다"
+
+#: builtin/fast-export.c:985
+msgid "select handling of tags that tag filtered objects"
+msgstr "필터링한 오브젝트에 대한 태그의 처리 방식을 선택합니다"
+
+#: builtin/fast-export.c:988
+msgid "Dump marks to this file"
+msgstr "이 파일로 표시를 내보냅니다"
+
+#: builtin/fast-export.c:990
+msgid "Import marks from this file"
+msgstr "이 파일에서 표시를 가져옵니다"
+
+#: builtin/fast-export.c:992
+msgid "Fake a tagger when tags lack one"
+msgstr "태그에 태그붙인 사람이 없을 때 가짜로 만듭니다"
+
+#: builtin/fast-export.c:994
+msgid "Output full tree for each commit"
+msgstr "커밋 마다 전체 트리를 출력합니다"
+
+#: builtin/fast-export.c:996
+msgid "Use the done feature to terminate the stream"
+msgstr "스트림을 끝내는데 완료 기능을 사용합니다"
+
+#: builtin/fast-export.c:997
+msgid "Skip output of blob data"
+msgstr "블롭 데이터의 출력을 건너뜁니다"
+
+#: builtin/fast-export.c:998
+msgid "refspec"
+msgstr "레퍼런스명세"
+
+#: builtin/fast-export.c:999
+msgid "Apply refspec to exported refs"
+msgstr "레퍼런스명세를 내보낸 레퍼런스에 적용합니다"
+
+#: builtin/fast-export.c:1000
+msgid "anonymize output"
+msgstr "출력을 익명화합니다"
+
+#: builtin/fetch.c:20
+msgid "git fetch [<options>] [<repository> [<refspec>...]]"
+msgstr "git fetch [<옵션>] [<저장소> [<레퍼런스명세>...]]"
+
+#: builtin/fetch.c:21
+msgid "git fetch [<options>] <group>"
+msgstr "git fetch [<옵션>] <그룹>"
+
+#: builtin/fetch.c:22
+msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
+msgstr "git fetch --multiple [<옵션>] [(<저장소> | <그룹>)...]"
+
+#: builtin/fetch.c:23
+msgid "git fetch --all [<options>]"
+msgstr "git fetch --all [<옵션>]"
+
+#: builtin/fetch.c:90 builtin/pull.c:162
+msgid "fetch from all remotes"
+msgstr "모든 리모트에서 가져옵니다"
+
+#: builtin/fetch.c:92 builtin/pull.c:165
+msgid "append to .git/FETCH_HEAD instead of overwriting"
+msgstr "덮어쓰지 말고 .git/FETCH_HEAD에 덧붙입니다"
+
+#: builtin/fetch.c:94 builtin/pull.c:168
+msgid "path to upload pack on remote end"
+msgstr "리모트 쪽에 묶음을 업로드할 경로"
+
+#: builtin/fetch.c:95 builtin/pull.c:170
+msgid "force overwrite of local branch"
+msgstr "로컬 브랜치를 강제로 덮어씁니다"
+
+#: builtin/fetch.c:97
+msgid "fetch from multiple remotes"
+msgstr "여러 리모트에서 가져옵니다"
+
+#: builtin/fetch.c:99 builtin/pull.c:172
+msgid "fetch all tags and associated objects"
+msgstr "모든 태그와 관련 오브젝트를 가져옵니다"
+
+#: builtin/fetch.c:101
+msgid "do not fetch all tags (--no-tags)"
+msgstr "모든 태그를 가져오지 않습니다 (--no-tags)"
+
+#: builtin/fetch.c:103 builtin/pull.c:175
+msgid "prune remote-tracking branches no longer on remote"
+msgstr "리모트에 이제 없는 리모트 추적 브랜치를 잘라냅니다"
+
+#: builtin/fetch.c:104 builtin/pull.c:178
+msgid "on-demand"
+msgstr "주문형"
+
+#: builtin/fetch.c:105 builtin/pull.c:179
+msgid "control recursive fetching of submodules"
+msgstr "하위 모듈 재귀적으로 가져오기 방식을 설정합니다"
+
+#: builtin/fetch.c:109 builtin/pull.c:184
+msgid "keep downloaded pack"
+msgstr "다운로드한 묶음을 보존합니다"
+
+#: builtin/fetch.c:111
+msgid "allow updating of HEAD ref"
+msgstr "HEAD 레퍼런스 업데이트를 허용합니다"
+
+#: builtin/fetch.c:114 builtin/pull.c:187
+msgid "deepen history of shallow clone"
+msgstr "얕은 복제의 커밋 내역을 깊게 만듭니다"
+
+#: builtin/fetch.c:116 builtin/pull.c:190
+msgid "convert to a complete repository"
+msgstr "완전한 저장소로 전환합니다"
+
+#: builtin/fetch.c:118 builtin/log.c:1233
+msgid "dir"
+msgstr "디렉터리"
+
+#: builtin/fetch.c:119
+msgid "prepend this to submodule path output"
+msgstr "하위 모듈 경로 출력의 앞에 이 디렉터리를 붙입니다"
+
+#: builtin/fetch.c:122
+msgid "default mode for recursion"
+msgstr "재귀 기본 모드"
+
+#: builtin/fetch.c:124 builtin/pull.c:193
+msgid "accept refs that update .git/shallow"
+msgstr ".git/shallow를 업데이트하는 레퍼런스를 허용합니다"
+
+#: builtin/fetch.c:125 builtin/pull.c:195
+msgid "refmap"
+msgstr "레퍼런스맵"
+
+#: builtin/fetch.c:126 builtin/pull.c:196
+msgid "specify fetch refmap"
+msgstr "레퍼런스맵 가져오기를 지정합니다"
+
+#: builtin/fetch.c:378
+msgid "Couldn't find remote ref HEAD"
+msgstr "리모트 레퍼런스 HEAD를 찾을 수 없습니다"
+
+#: builtin/fetch.c:458
+#, c-format
+msgid "object %s not found"
+msgstr "%s 오브젝트가 없습니다"
+
+#: builtin/fetch.c:463
+msgid "[up to date]"
+msgstr "[최신 상태]"
+
+#: builtin/fetch.c:477
+#, c-format
+msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
+msgstr "! %-*s %-*s -> %s  (현재 브랜치에서 가져올 수 없음)"
+
+#: builtin/fetch.c:478 builtin/fetch.c:566
+msgid "[rejected]"
+msgstr "[거부됨]"
+
+#: builtin/fetch.c:489
+msgid "[tag update]"
+msgstr "[태그 업데이트]"
+
+#: builtin/fetch.c:491 builtin/fetch.c:526 builtin/fetch.c:544
+msgid "  (unable to update local ref)"
+msgstr "  (로컬 레퍼런스를 업데이트할 수 없음)"
+
+#: builtin/fetch.c:509
+msgid "[new tag]"
+msgstr "[새로운 태그]"
+
+#: builtin/fetch.c:512
+msgid "[new branch]"
+msgstr "[새로운 브랜치]"
+
+#: builtin/fetch.c:515
+msgid "[new ref]"
+msgstr "[새로운 레퍼런스]"
+
+#: builtin/fetch.c:561
+msgid "unable to update local ref"
+msgstr "로컬 레퍼런스를 업데이트할 수 없습니다"
+
+#: builtin/fetch.c:561
+msgid "forced update"
+msgstr "강제 업데이트"
+
+#: builtin/fetch.c:568
+msgid "(non-fast-forward)"
+msgstr "(정방향 진행이 아님)"
+
+#: builtin/fetch.c:602 builtin/fetch.c:843
+#, c-format
+msgid "cannot open %s: %s\n"
+msgstr "%s을(를) 열 수 없습니다: %s\n"
+
+#: builtin/fetch.c:611
+#, c-format
+msgid "%s did not send all necessary objects\n"
+msgstr "%s이(가) 모든 필요한 오브젝트를 보내지 않았습니다\n"
+
+#: builtin/fetch.c:629
+#, c-format
+msgid "reject %s because shallow roots are not allowed to be updated"
+msgstr "얕은 최상위의 업데이트가 허용되지 않으므로 %s을(를) 거부합니다"
+
+#: builtin/fetch.c:716 builtin/fetch.c:808
+#, c-format
+msgid "From %.*s\n"
+msgstr "%.*s URL에서\n"
+
+#: builtin/fetch.c:727
+#, c-format
+msgid ""
+"some local refs could not be updated; try running\n"
+" 'git remote prune %s' to remove any old, conflicting branches"
+msgstr ""
+"업데이트할 수 없는 로컬 레퍼런스가 있습니다. 과거 충돌 브랜치를\n"
+" 제거하려면 'git remote prune %s' 명령을 실행해 보십시오"
+
+#: builtin/fetch.c:779
+#, c-format
+msgid "   (%s will become dangling)"
+msgstr "   (%s 레퍼런스가 연결이 끊어지게 됩니다)"
+
+#: builtin/fetch.c:780
+#, c-format
+msgid "   (%s has become dangling)"
+msgstr "   (%s 레퍼런스가 연결이 끊어졌습니다)"
+
+#: builtin/fetch.c:812
+msgid "[deleted]"
+msgstr "[삭제됨]"
+
+#: builtin/fetch.c:813 builtin/remote.c:1040
+msgid "(none)"
+msgstr "(없음)"
+
+#: builtin/fetch.c:833
+#, c-format
+msgid "Refusing to fetch into current branch %s of non-bare repository"
+msgstr "간략한 저장소가 아닌 저장소의 현재 %s 브랜치로 가져오기를 거절합니다"
+
+#: builtin/fetch.c:852
+#, c-format
+msgid "Option \"%s\" value \"%s\" is not valid for %s"
+msgstr "\"%s\" 옵션의 \"%s\" 값은 %s에 대해 올바르지 않습니다"
+
+#: builtin/fetch.c:855
+#, c-format
+msgid "Option \"%s\" is ignored for %s\n"
+msgstr "\"%s\" 옵션은 '%s'에 대해 무시됩니다\n"
+
+#: builtin/fetch.c:911
+#, c-format
+msgid "Don't know how to fetch from %s"
+msgstr "'%s'에서 가져오는 방법을 알 수 없습니다"
+
+#: builtin/fetch.c:1072
+#, c-format
+msgid "Fetching %s\n"
+msgstr "%s을(를) 가져오는 중\n"
+
+#: builtin/fetch.c:1074 builtin/remote.c:96
+#, c-format
+msgid "Could not fetch %s"
+msgstr "%s을(를) 가져올 수 없습니다"
+
+#: builtin/fetch.c:1092
+msgid ""
+"No remote repository specified.  Please, specify either a URL or a\n"
+"remote name from which new revisions should be fetched."
+msgstr ""
+"리모트 저장소를 지정하지 않았습니다. 새 리비전을 가져올 수 있는\n"
+"URL이나 리모트 이름을 지정하십시오."
+
+#: builtin/fetch.c:1115
+msgid "You need to specify a tag name."
+msgstr "태그 이름을 지정해야 합니다."
+
+#: builtin/fetch.c:1157
+msgid "--depth and --unshallow cannot be used together"
+msgstr "--depth 및 --unshallow 옵션은 같이 쓸 수 없습니다"
+
+#: builtin/fetch.c:1159
+msgid "--unshallow on a complete repository does not make sense"
+msgstr "완전한 저장소에 대해 --unshallow 옵션을 사용하는 건 앞뒤가 맞지 않습니다"
+
+#: builtin/fetch.c:1179
+msgid "fetch --all does not take a repository argument"
+msgstr "fetch --all 명령에 저장소 인자가 없습니다"
+
+#: builtin/fetch.c:1181
+msgid "fetch --all does not make sense with refspecs"
+msgstr "fetch --all 명령은 레퍼런스명세 인자와 같이 쓰면 앞뒤가 맞지 않습니다"
+
+#: builtin/fetch.c:1192
+#, c-format
+msgid "No such remote or remote group: %s"
+msgstr "그런 리모트나 리모트 그룹이 없습니다: %s"
+
+#: builtin/fetch.c:1200
+msgid "Fetching a group and specifying refspecs does not make sense"
+msgstr "그룹을 가져오고 레퍼런스명세를 지정하면 앞뒤가 맞지 않습니다"
+
+#: builtin/fmt-merge-msg.c:14
+msgid ""
+"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
+msgstr ""
+"git fmt-merge-msg [-m <메시지>] [--log[=<n>] | --no-log] [--file <파일>]"
+
+#: builtin/fmt-merge-msg.c:667
+msgid "populate log with at most <n> entries from shortlog"
+msgstr "shortlog에서 최대 <n>개 로그를 표시합니다"
+
+#: builtin/fmt-merge-msg.c:670
+msgid "alias for --log (deprecated)"
+msgstr "--log와 동일 (없어질 예정)"
+
+#: builtin/fmt-merge-msg.c:673
+msgid "text"
+msgstr "텍스트"
+
+#: builtin/fmt-merge-msg.c:674
+msgid "use <text> as start of message"
+msgstr "<텍스트>를 시작 메시지로 사용합니다"
+
+#: builtin/fmt-merge-msg.c:675
+msgid "file to read from"
+msgstr "읽어들일 파일"
+
+#: builtin/for-each-ref.c:9
+msgid "git for-each-ref [<options>] [<pattern>]"
+msgstr "git for-each-ref [<옵션>] [<패턴>]"
+
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
+msgstr "git for-each-ref [--points-at <오브젝트>]"
+
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<오브젝트>]]"
+
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
+msgstr "git for-each-ref [--contains [<오브젝트>]]"
+
+#: builtin/for-each-ref.c:27
+msgid "quote placeholders suitably for shells"
+msgstr "셸에 적합하게 플레이스홀더를 인용합니다"
+
+#: builtin/for-each-ref.c:29
+msgid "quote placeholders suitably for perl"
+msgstr "펄에 적합하게 플레이스홀더를 인용합니다"
+
+#: builtin/for-each-ref.c:31
+msgid "quote placeholders suitably for python"
+msgstr "파이썬에 적합하게 플레이스홀더를 인용합니다"
+
+#: builtin/for-each-ref.c:33
+msgid "quote placeholders suitably for Tcl"
+msgstr "티클에 적합하게 플레이스홀더를 인용합니다"
+
+#: builtin/for-each-ref.c:36
+msgid "show only <n> matched refs"
+msgstr "<n>개의 해당하는 레퍼런스만 표시합니다"
+
+#: builtin/for-each-ref.c:37 builtin/tag.c:372
+msgid "format to use for the output"
+msgstr "출력에 사용할 형식"
+
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
+msgstr "주어진 오브젝트를 가리키는 레퍼런스만 표시합니다"
+
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
+msgstr "병합하는 레퍼런스만 표시합니다"
+
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr "병합하지 않는 레퍼런스만 표시합니다"
+
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
+msgstr "커밋이 포함된 레퍼런스만 표시합니다"
+
+#: builtin/fsck.c:156 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "연결을 확인하는 중입니다"
+
+#: builtin/fsck.c:486
+msgid "Checking object directories"
+msgstr "오브젝트 디렉터리를 확인하는 중입니다"
+
+#: builtin/fsck.c:553
+msgid "git fsck [<options>] [<object>...]"
+msgstr "git fsck [<옵션>] [<오브젝트>...]"
+
+#: builtin/fsck.c:559
+msgid "show unreachable objects"
+msgstr "점근할 수 없는 오브젝트를 표시합니다"
+
+#: builtin/fsck.c:560
+msgid "show dangling objects"
+msgstr "연결이 끊어진 오브젝트를 표시합니다"
+
+#: builtin/fsck.c:561
+msgid "report tags"
+msgstr "태그를 알립니다"
+
+#: builtin/fsck.c:562
+msgid "report root nodes"
+msgstr "최상위 노드를 알립니다"
+
+#: builtin/fsck.c:563
+msgid "make index objects head nodes"
+msgstr "인덱스 오브젝트 헤드 노드를 만듭니다"
+
+#: builtin/fsck.c:564
+msgid "make reflogs head nodes (default)"
+msgstr "reflog 헤드 노드를 만듭니다 (기본값)"
+
+#: builtin/fsck.c:565
+msgid "also consider packs and alternate objects"
+msgstr "묶음과 보조 오브젝트도 만듭니다"
+
+#: builtin/fsck.c:566
+msgid "check only connectivity"
+msgstr "연결만 확인합니다"
+
+#: builtin/fsck.c:567
+msgid "enable more strict checking"
+msgstr "더 엄격하게 확인합니다"
+
+#: builtin/fsck.c:569
+msgid "write dangling objects in .git/lost-found"
+msgstr ".git/lost-found 안에 연결이 끊어진 오브젝트를 씁니다"
+
+#: builtin/fsck.c:570 builtin/prune.c:107
+msgid "show progress"
+msgstr "진행 상황을 표시합니다"
+
+#: builtin/fsck.c:631
+msgid "Checking objects"
+msgstr "오브젝트를 확인합니다"
+
+#: builtin/gc.c:25
+msgid "git gc [<options>]"
+msgstr "git gc [<옵션>]"
+
+#: builtin/gc.c:72
+#, c-format
+msgid "Invalid %s: '%s'"
+msgstr "잘못된 %s: '%s'"
+
+#: builtin/gc.c:139
+#, c-format
+msgid "insanely long object directory %.*s"
+msgstr "비정상적으로 긴 오브젝트 디렉터리 %.*s"
+
+#: builtin/gc.c:290
+#, c-format
+msgid ""
+"The last gc run reported the following. Please correct the root cause\n"
+"and remove %s.\n"
+"Automatic cleanup will not be performed until the file is removed.\n"
+"\n"
+"%s"
+msgstr ""
+"마지막 가비지컬렉터에서 다음을 알려왔습니다. 원인을 바로잡은\n"
+"다음 %s 파일을 제거하십시오.\n"
+"이 파일을 제거하기 전에는 자동 정리 작업을 수행하지 않습니다.\n"
+"\n"
+"%s"
+
+#: builtin/gc.c:327
+msgid "prune unreferenced objects"
+msgstr "레퍼런스하지 않는 오브젝트를 잘라냅니다"
+
+#: builtin/gc.c:329
+msgid "be more thorough (increased runtime)"
+msgstr "더 자세히 검사합니다 (실행 시간 늘어남)"
+
+#: builtin/gc.c:330
+msgid "enable auto-gc mode"
+msgstr "자동 가비지컬렉터 모드를 사용합니다"
+
+#: builtin/gc.c:331
+msgid "force running gc even if there may be another gc running"
+msgstr "이미 가비지컬렉터가 실행 중이더라도 강제로 가비지컬렉터를 실행합니다"
+
+#: builtin/gc.c:373
+#, c-format
+msgid "Auto packing the repository in background for optimum performance.\n"
+msgstr "최적 성능을 위해 백그라운드에서 자동으로 저장소의 묶음을 만듭니다.\n"
+
+#: builtin/gc.c:375
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "최적 성능을 위해 자동으로 저장소의 묶음을 만듭니다.\n"
+
+#: builtin/gc.c:376
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr "수동 관리 작업은 \"git help gc\" 내용을 참고하십시오.\n"
+
+#: builtin/gc.c:397
+#, c-format
+msgid ""
+"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
+msgstr "가비지컬렉터가 이미 '%s' 컴퓨터에서 %<PRIuMAX> PID로 실행 중입니다 (아니면 --force를 사용하십시오)"
+
+#: builtin/gc.c:441
+msgid ""
+"There are too many unreachable loose objects; run 'git prune' to remove them."
+msgstr "느슨한 오브젝트가 너무 많습니다. 제거하려면 'git prune'을 실행하십시오."
+
+#: builtin/grep.c:23
+msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
+msgstr "git grep [<옵션>] [-e] <패턴> [<리비전>...] [[--] <경로>...]"
+
+#: builtin/grep.c:218
+#, c-format
+msgid "grep: failed to create thread: %s"
+msgstr "grep: 스레드를 만드는데 실패했습니다: %s"
+
+#: builtin/grep.c:441 builtin/grep.c:476
+#, c-format
+msgid "unable to read tree (%s)"
+msgstr "트리를 읽을 수 없습니다 (%s)"
+
+#: builtin/grep.c:491
+#, c-format
+msgid "unable to grep from object of type %s"
+msgstr "종류가 %s인 오브젝트에서 grep을 할 수 없습니다"
+
+#: builtin/grep.c:547
+#, c-format
+msgid "switch `%c' expects a numerical value"
+msgstr "`%c' 옵션에는 숫자 값이 와야 합니다"
+
+#: builtin/grep.c:564
+#, c-format
+msgid "cannot open '%s'"
+msgstr "'%s'을(를) 열 수 없습니다"
+
+#: builtin/grep.c:633
+msgid "search in index instead of in the work tree"
+msgstr "작업 폴더 대신에 인덱스에서 검색합니다"
+
+#: builtin/grep.c:635
+msgid "find in contents not managed by git"
+msgstr "깃으로 관리하지 않은 내용에서 찾습니다"
+
+#: builtin/grep.c:637
+msgid "search in both tracked and untracked files"
+msgstr "추적되는 파일과 추적되지 않는 파일 모두에서 검색합니다"
+
+#: builtin/grep.c:639
+msgid "ignore files specified via '.gitignore'"
+msgstr "'.gitignore'로 지정한 파일을 무시합니다"
+
+#: builtin/grep.c:642
+msgid "show non-matching lines"
+msgstr "일치하지 않는 줄을 표시합니다"
+
+#: builtin/grep.c:644
+msgid "case insensitive matching"
+msgstr "대소문자 구별하지 않고 맞춥니다"
+
+#: builtin/grep.c:646
+msgid "match patterns only at word boundaries"
+msgstr "단어 경계 부분에 대해서만 패턴을 맞춥니다"
+
+#: builtin/grep.c:648
+msgid "process binary files as text"
+msgstr "바이너리 파일을 텍스트로 처리합니다"
+
+#: builtin/grep.c:650
+msgid "don't match patterns in binary files"
+msgstr "바이너리 파일에서 패턴을 맞추지 않습니다"
+
+#: builtin/grep.c:653
+msgid "process binary files with textconv filters"
+msgstr "textconv 필터를 사용해 바이너리 파일을 처리합니다"
+
+#: builtin/grep.c:655
+msgid "descend at most <depth> levels"
+msgstr "최대 <깊이> 단계만큼 내려갑니다"
+
+#: builtin/grep.c:659
+msgid "use extended POSIX regular expressions"
+msgstr "POSIX 확장 정규식을 사용합니다"
+
+#: builtin/grep.c:662
+msgid "use basic POSIX regular expressions (default)"
+msgstr "기본 POSIX 정규식을 사용합니다 (기본값)"
+
+#: builtin/grep.c:665
+msgid "interpret patterns as fixed strings"
+msgstr "패턴을 고정 문자열로 해석합니다"
+
+#: builtin/grep.c:668
+msgid "use Perl-compatible regular expressions"
+msgstr "펄과 호환되는 정규식을 사용합니다"
+
+#: builtin/grep.c:671
+msgid "show line numbers"
+msgstr "줄 번호를 표시합니다"
+
+#: builtin/grep.c:672
+msgid "don't show filenames"
+msgstr "파일 이름을 표시하지 않습니다"
+
+#: builtin/grep.c:673
+msgid "show filenames"
+msgstr "파일 이름을 표시합니다"
+
+#: builtin/grep.c:675
+msgid "show filenames relative to top directory"
+msgstr "파일 이름을 최상위 디렉터리 상대 경로로 표시합니다"
+
+#: builtin/grep.c:677
+msgid "show only filenames instead of matching lines"
+msgstr "일치하는 줄을 표시하지 않고 파일 이름만 표시합니다"
+
+#: builtin/grep.c:679
+msgid "synonym for --files-with-matches"
+msgstr "--files-with-matches 옵션과 동일"
+
+#: builtin/grep.c:682
+msgid "show only the names of files without match"
+msgstr "일치하지 않는 파일의 이름만 표시합니다"
+
+#: builtin/grep.c:684
+msgid "print NUL after filenames"
+msgstr "파일 이름 다음에 NUL을 출력합니다"
+
+#: builtin/grep.c:686
+msgid "show the number of matches instead of matching lines"
+msgstr "일치하는 줄을 표시하지 않고 일치하는 수를 표시합니다"
+
+#: builtin/grep.c:687
+msgid "highlight matches"
+msgstr "일치하는 부분을 강조합니다"
+
+#: builtin/grep.c:689
+msgid "print empty line between matches from different files"
+msgstr "다른 파일 사이에 일치하는 부분의 사이에 빈 줄을 출력합니다"
+
+#: builtin/grep.c:691
+msgid "show filename only once above matches from same file"
+msgstr "같은 파일에서 여러 개가 일치하면 파일 이름을 한 번만 표시합니다"
+
+#: builtin/grep.c:694
+msgid "show <n> context lines before and after matches"
+msgstr "일치하는 부분 앞뒤에 컨텍스트를 <n>줄 표시합니다"
+
+#: builtin/grep.c:697
+msgid "show <n> context lines before matches"
+msgstr "일치하는 부분 앞에 컨텍스트를 <n>줄 표시합니다"
+
+#: builtin/grep.c:699
+msgid "show <n> context lines after matches"
+msgstr "일치하는 부분 뒤에 컨텍스트를 <n>줄 표시합니다"
+
+#: builtin/grep.c:700
+msgid "shortcut for -C NUM"
+msgstr "-C NUM 옵션의 줄임"
+
+#: builtin/grep.c:703
+msgid "show a line with the function name before matches"
+msgstr "일치 항목 앞에 함수 이름 줄을 표시합니다"
+
+#: builtin/grep.c:705
+msgid "show the surrounding function"
+msgstr "들어 있는 함수를 표시합니다"
+
+#: builtin/grep.c:708
+msgid "read patterns from file"
+msgstr "파일에서 패턴을 읽습니다"
+
+#: builtin/grep.c:710
+msgid "match <pattern>"
+msgstr "<패턴>과 일치"
+
+#: builtin/grep.c:712
+msgid "combine patterns specified with -e"
+msgstr "-e 옵션으로 지정한 패턴을 결합합니다"
+
+#: builtin/grep.c:724
+msgid "indicate hit with exit status without output"
+msgstr "출력하지 않고 일치하는 항목을 exit() 상태 번호로 리턴합니다"
+
+#: builtin/grep.c:726
+msgid "show only matches from files that match all patterns"
+msgstr "모든 패턴과 일치하는 파일의 일치하는 부분만 표시합니다"
+
+#: builtin/grep.c:728
+msgid "show parse tree for grep expression"
+msgstr "grep 표현식에 대한 파싱 트리를 표시합니다"
+
+#: builtin/grep.c:732
+msgid "pager"
+msgstr "페이저"
+
+#: builtin/grep.c:732
+msgid "show matching files in the pager"
+msgstr "일치하는 파일을 페이저 프로그램에서 표시합니다"
+
+#: builtin/grep.c:735
+msgid "allow calling of grep(1) (ignored by this build)"
+msgstr "grep(1) 실행을 허용합니다 (이 빌드에서는 무시)"
+
+#: builtin/grep.c:793
+msgid "no pattern given."
+msgstr "패턴을 지정하지 않았습니다."
+
+#: builtin/grep.c:851
+msgid "--open-files-in-pager only works on the worktree"
+msgstr "--open-files-in-pager 옵션은 작업 폴더에서만 동작합니다"
+
+#: builtin/grep.c:877
+msgid "--cached or --untracked cannot be used with --no-index."
+msgstr "--cached 또는 --untracked 옵션은 --no-index 옵션과 같이 쓸 수 없습니다."
+
+#: builtin/grep.c:882
+msgid "--no-index or --untracked cannot be used with revs."
+msgstr "--no-index 또는 --untracked 옵션은 리비전과 같이 쓸 수 없습니다."
+
+#: builtin/grep.c:885
+msgid "--[no-]exclude-standard cannot be used for tracked contents."
+msgstr "--[no-]exclude-standard 옵션은 추적되는 내용에 대해 쓸 수 없습니다."
+
+#: builtin/grep.c:893
+msgid "both --cached and trees are given."
+msgstr "--cached 옵션과 트리를 모두 지정했습니다."
+
+#: builtin/hash-object.c:80
+msgid ""
+"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
+"[--] <file>..."
+msgstr ""
+"git hash-object [-t <종류>] [-w] [--path=<파일> | --no-filters] [--stdin] "
+"[--] <파일>..."
+
+#: builtin/hash-object.c:81
+msgid "git hash-object  --stdin-paths"
+msgstr "git hash-object  --stdin-paths"
+
+#: builtin/hash-object.c:92
+msgid "type"
+msgstr "종류"
+
+#: builtin/hash-object.c:92
+msgid "object type"
+msgstr "오브젝트 종류"
+
+#: builtin/hash-object.c:93
+msgid "write the object into the object database"
+msgstr "오브젝트를 오브젝트 데이터베이스로 씁니다"
+
+#: builtin/hash-object.c:95
+msgid "read the object from stdin"
+msgstr "표준 입력에서 오브젝트를 읽습니다"
+
+#: builtin/hash-object.c:97
+msgid "store file as is without filters"
+msgstr "파일을 필터 없이 그대로 저장합니다"
+
+#: builtin/hash-object.c:98
+msgid ""
+"just hash any random garbage to create corrupt objects for debugging Git"
+msgstr "임의의 쓰레기 데이터를 해시해 손상된 오브젝트를 만듭니다 (디버깅용)"
+
+#: builtin/hash-object.c:99
+msgid "process file as it were from this path"
+msgstr "파일이 이 경로에서 온 것처럼 처리합니다"
+
+#: builtin/help.c:41
+msgid "print all available commands"
+msgstr "사용 가능한 모든 명령의 목록을 표시합니다"
+
+#: builtin/help.c:42
+msgid "print list of useful guides"
+msgstr "유용한 안내서 목록을 표시합니다"
+
+#: builtin/help.c:43
+msgid "show man page"
+msgstr "맨 페이지를 표시합니다"
+
+#: builtin/help.c:44
+msgid "show manual in web browser"
+msgstr "웹 브라우저에서 설명서를 표시합니다"
+
+#: builtin/help.c:46
+msgid "show info page"
+msgstr "인포 페이지를 표시합니다"
+
+#: builtin/help.c:52
+msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
+msgstr "git help [--all] [--guides] [--man | --web | --info] [<명령>]"
+
+#: builtin/help.c:64
+#, c-format
+msgid "unrecognized help format '%s'"
+msgstr "'%s' 도움말 포맷을 인식할 수 없습니다"
+
+#: builtin/help.c:91
+msgid "Failed to start emacsclient."
+msgstr "emacsclient 시작에 실패했습니다."
+
+#: builtin/help.c:104
+msgid "Failed to parse emacsclient version."
+msgstr "emacsclient 버전 파싱에 실패했습니다."
+
+#: builtin/help.c:112
+#, c-format
+msgid "emacsclient version '%d' too old (< 22)."
+msgstr "emacsclient '%d' 버전은 너무 과거 (< 22) 버전입니다."
+
+#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#, c-format
+msgid "failed to exec '%s': %s"
+msgstr "실행 실패: '%s': %s"
+
+#: builtin/help.c:208
+#, c-format
+msgid ""
+"'%s': path for unsupported man viewer.\n"
+"Please consider using 'man.<tool>.cmd' instead."
+msgstr ""
+"'%s': 지원하지 않는 맨 페이지 보기 프로그램 경로.\n"
+"대신에 'man.<도구>.cmd' 옵션을 사용해 보십시오."
+
+#: builtin/help.c:220
+#, c-format
+msgid ""
+"'%s': cmd for supported man viewer.\n"
+"Please consider using 'man.<tool>.path' instead."
+msgstr ""
+"'%s': 지원하지 않는 맨 페이지 보기 프로그램 명령.\n"
+"대신에 'man.<도구>.path' 옵션을 사용해 보십시오."
+
+#: builtin/help.c:337
+#, c-format
+msgid "'%s': unknown man viewer."
+msgstr "'%s': 알 수 없는 맨 페이지 보기 프로그램."
+
+#: builtin/help.c:354
+msgid "no man viewer handled the request"
+msgstr "요청을 처리한 맨 페이지 보기 프로그램이 없습니다"
+
+#: builtin/help.c:362
+msgid "no info viewer handled the request"
+msgstr "요청을 처리한 인포 페이지 보기 프로그램이 없습니다"
+
+#: builtin/help.c:411
+msgid "Defining attributes per path"
+msgstr "경로마다 속성 정의하기"
+
+#: builtin/help.c:412
+msgid "Everyday Git With 20 Commands Or So"
+msgstr "매일매일 사용하는 20개 내외의 깃 명령"
+
+#: builtin/help.c:413
+msgid "A Git glossary"
+msgstr "깃 용어 사전"
+
+#: builtin/help.c:414
+msgid "Specifies intentionally untracked files to ignore"
+msgstr "의도적으로 추적하지 않는 파일을 무시하게 지정하기"
+
+#: builtin/help.c:415
+msgid "Defining submodule properties"
+msgstr "하위 모듈 속성 정의하기"
+
+#: builtin/help.c:416
+msgid "Specifying revisions and ranges for Git"
+msgstr "깃의 리비전 및 범위를 지정하기"
+
+#: builtin/help.c:417
+msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
+msgstr "깃 따라하기 안내서 (버전 1.5.1 이후)"
+
+#: builtin/help.c:418
+msgid "An overview of recommended workflows with Git"
+msgstr "추천하는 깃 활용 작업 순서의 개요"
+
+#: builtin/help.c:430
+msgid "The common Git guides are:\n"
+msgstr "자주 사용하는 깃 안내서는 다음과 같습니다:\n"
+
+#: builtin/help.c:451 builtin/help.c:468
+#, c-format
+msgid "usage: %s%s"
+msgstr "사용법: %s%s"
+
+#: builtin/help.c:484
+#, c-format
+msgid "`git %s' is aliased to `%s'"
+msgstr "`git %s' 명령은 `%s' 명령의 단축입니다"
+
+#: builtin/index-pack.c:152
+#, c-format
+msgid "unable to open %s"
+msgstr "%s을(를) 열 수 없습니다"
+
+#: builtin/index-pack.c:202
+#, c-format
+msgid "object type mismatch at %s"
+msgstr "오브젝트 종류가 맞지 않습니다 (%s)"
+
+#: builtin/index-pack.c:222
+#, c-format
+msgid "did not receive expected object %s"
+msgstr "예상한 %s 오브젝트를 받지 않았습니다"
+
+#: builtin/index-pack.c:225
+#, c-format
+msgid "object %s: expected type %s, found %s"
+msgstr "%s 오브젝트: 예상한 종류 %s, 실제 %s"
+
+#: builtin/index-pack.c:267
+#, c-format
+msgid "cannot fill %d byte"
+msgid_plural "cannot fill %d bytes"
+msgstr[0] "%d 바이트를 채울 수 없습니다"
+
+#: builtin/index-pack.c:277
+msgid "early EOF"
+msgstr "너무 빨리 파일이 끝남"
+
+#: builtin/index-pack.c:278
+msgid "read error on input"
+msgstr "입력에 읽기 오류"
+
+#: builtin/index-pack.c:290
+msgid "used more bytes than were available"
+msgstr "있는 바이트보다 더 많이 사용합니다"
+
+#: builtin/index-pack.c:297
+msgid "pack too large for current definition of off_t"
+msgstr "현재 정의된 off_t에 비해 묶음이 너무 큽니다"
+
+#: builtin/index-pack.c:313
+#, c-format
+msgid "unable to create '%s'"
+msgstr "'%s'을(를) 만들 수 없습니다"
+
+#: builtin/index-pack.c:318
+#, c-format
+msgid "cannot open packfile '%s'"
+msgstr "'%s' 묶음 파일을 열 수 없습니다"
+
+#: builtin/index-pack.c:332
+msgid "pack signature mismatch"
+msgstr "묶음 서명이 맞지 않습니다"
+
+#: builtin/index-pack.c:334
+#, c-format
+msgid "pack version %<PRIu32> unsupported"
+msgstr "묶음의 %<PRIu32> 버전을 지원하지 않습니다"
+
+#: builtin/index-pack.c:352
+#, c-format
+msgid "pack has bad object at offset %lu: %s"
+msgstr "묶음의 %lu 오프셋에 잘못된 오브젝트가 있습니다: %s"
+
+#: builtin/index-pack.c:473
+#, c-format
+msgid "inflate returned %d"
+msgstr "inflate가 %d번을 리턴했습니다"
+
+#: builtin/index-pack.c:522
+msgid "offset value overflow for delta base object"
+msgstr "델타 베이스 오브젝트에 대해 오프셋 값이 오버플로우"
+
+#: builtin/index-pack.c:530
+msgid "delta base offset is out of bound"
+msgstr "델타 베이스 오프셋이 범위를 벗어났습니다"
+
+#: builtin/index-pack.c:538
+#, c-format
+msgid "unknown object type %d"
+msgstr "알 수 없는 오브젝트 종류 %d번"
+
+#: builtin/index-pack.c:569
+msgid "cannot pread pack file"
+msgstr "묶음 파일에 대해 pread를 할 수 없습니다"
+
+#: builtin/index-pack.c:571
+#, c-format
+msgid "premature end of pack file, %lu byte missing"
+msgid_plural "premature end of pack file, %lu bytes missing"
+msgstr[0] "묶음 파일이 너무 일찍 끝남. %lu 바이트 부족"
+
+#: builtin/index-pack.c:597
+msgid "serious inflate inconsistency"
+msgstr "심각한 inflate 부조화"
+
+#: builtin/index-pack.c:743 builtin/index-pack.c:749 builtin/index-pack.c:772
+#: builtin/index-pack.c:806 builtin/index-pack.c:815
+#, c-format
+msgid "SHA1 COLLISION FOUND WITH %s !"
+msgstr "SHA1 충돌이 %s에서 발견되었습니다!"
+
+#: builtin/index-pack.c:746 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
+#, c-format
+msgid "unable to read %s"
+msgstr "%s을(를) 읽을 수 없습니다"
+
+#: builtin/index-pack.c:812
+#, c-format
+msgid "cannot read existing object %s"
+msgstr "기존 %s 오브젝트를 읽을 수 없습니다"
+
+#: builtin/index-pack.c:826
+#, c-format
+msgid "invalid blob object %s"
+msgstr "잘못된 블롭 오브젝트 %s"
+
+#: builtin/index-pack.c:840
+#, c-format
+msgid "invalid %s"
+msgstr "잘못된 %s"
+
+#: builtin/index-pack.c:843
+msgid "Error in object"
+msgstr "오브젝트에 오류"
+
+#: builtin/index-pack.c:845
+#, c-format
+msgid "Not all child objects of %s are reachable"
+msgstr "%s의 모든 하위 오브젝트에 접근할 수 없습니다"
+
+#: builtin/index-pack.c:917 builtin/index-pack.c:948
+msgid "failed to apply delta"
+msgstr "델타를 적용하는데 실패했습니다"
+
+#: builtin/index-pack.c:1118
+msgid "Receiving objects"
+msgstr "오브젝트를 받는 중"
+
+#: builtin/index-pack.c:1118
+msgid "Indexing objects"
+msgstr "오브젝트 인덱스를 만드는 중"
+
+#: builtin/index-pack.c:1150
+msgid "pack is corrupted (SHA1 mismatch)"
+msgstr "묶음이 손상되었습니다 (SHA1 일치하지 않음)"
+
+#: builtin/index-pack.c:1155
+msgid "cannot fstat packfile"
+msgstr "묶음 파일에 대해 fstat()할 수 없습니다"
+
+#: builtin/index-pack.c:1158
+msgid "pack has junk at the end"
+msgstr "묶음의 끝에 쓰레기 데이터가 있습니다"
+
+#: builtin/index-pack.c:1169
+msgid "confusion beyond insanity in parse_pack_objects()"
+msgstr "parse_pack_objects()에서 극심한 혼란"
+
+#: builtin/index-pack.c:1194
+msgid "Resolving deltas"
+msgstr "델타를 알아내는 중"
+
+#: builtin/index-pack.c:1205
+#, c-format
+msgid "unable to create thread: %s"
+msgstr "스레드를 만들 수 없습니다: %s"
+
+#: builtin/index-pack.c:1247
+msgid "confusion beyond insanity"
+msgstr "극심한 혼란"
+
+#: builtin/index-pack.c:1253
+#, c-format
+msgid "completed with %d local objects"
+msgstr "로컬 오브젝트 %d개 마침"
+
+#: builtin/index-pack.c:1263
+#, c-format
+msgid "Unexpected tail checksum for %s (disk corruption?)"
+msgstr "%s에 대해 예상치 못한 테일 체크섬 (디스크 손상?)"
+
+#: builtin/index-pack.c:1267
+#, c-format
+msgid "pack has %d unresolved delta"
+msgid_plural "pack has %d unresolved deltas"
+msgstr[0] "묶음에 알아내지 못한 델타 %d개가 있습니다"
+
+#: builtin/index-pack.c:1291
+#, c-format
+msgid "unable to deflate appended object (%d)"
+msgstr "추가한 오브젝트를 deflate할 수 없습니다 (%d)"
+
+#: builtin/index-pack.c:1367
+#, c-format
+msgid "local object %s is corrupt"
+msgstr "%s 로컬 오브젝트가 손상되었습니다"
+
+#: builtin/index-pack.c:1391
+msgid "error while closing pack file"
+msgstr "묶음 파일을 닫는데 오류"
+
+#: builtin/index-pack.c:1404
+#, c-format
+msgid "cannot write keep file '%s'"
+msgstr "'%s' 보존 파일을 쓸 수 없습니다"
+
+#: builtin/index-pack.c:1412
+#, c-format
+msgid "cannot close written keep file '%s'"
+msgstr "쓴 '%s' 보존 파일을 닫지 못했습니다"
+
+#: builtin/index-pack.c:1425
+msgid "cannot store pack file"
+msgstr "묶음 파일을 저장할 수 없습니다"
+
+#: builtin/index-pack.c:1436
+msgid "cannot store index file"
+msgstr "인덱스 파일을 저장할 수 없습니다"
+
+#: builtin/index-pack.c:1469
+#, c-format
+msgid "bad pack.indexversion=%<PRIu32>"
+msgstr "잘못된 pack.indexversion=%<PRIu32>"
+
+#: builtin/index-pack.c:1475
+#, c-format
+msgid "invalid number of threads specified (%d)"
+msgstr "잘못된 스레드 수를 지정했습니다 (%d)"
+
+#: builtin/index-pack.c:1479 builtin/index-pack.c:1663
+#, c-format
+msgid "no threads support, ignoring %s"
+msgstr "스레드 기능이 없습니다. %s 무시"
+
+#: builtin/index-pack.c:1537
+#, c-format
+msgid "Cannot open existing pack file '%s'"
+msgstr "기존 '%s' 묶음 파일을 열 수 없습니다"
+
+#: builtin/index-pack.c:1539
+#, c-format
+msgid "Cannot open existing pack idx file for '%s'"
+msgstr "'%s'에 대한 기존 묶음 idx 파일을 열 수 없습니다"
+
+#: builtin/index-pack.c:1586
+#, c-format
+msgid "non delta: %d object"
+msgid_plural "non delta: %d objects"
+msgstr[0] "델타 아님: 오브젝트 %d개"
+
+#: builtin/index-pack.c:1593
+#, c-format
+msgid "chain length = %d: %lu object"
+msgid_plural "chain length = %d: %lu objects"
+msgstr[0] "체인 길이 = %d: 오브젝트 %lu개"
+
+#: builtin/index-pack.c:1623
+msgid "Cannot come back to cwd"
+msgstr "현재 디렉터리로 돌아올 수 없습니다"
+
+#: builtin/index-pack.c:1675 builtin/index-pack.c:1678
+#: builtin/index-pack.c:1690 builtin/index-pack.c:1694
+#, c-format
+msgid "bad %s"
+msgstr "잘못된 %s"
+
+#: builtin/index-pack.c:1708
+msgid "--fix-thin cannot be used without --stdin"
+msgstr "--fix-thin 옵션은 --stdin 옵션과 같이 쓸 수 없습니다"
+
+#: builtin/index-pack.c:1712 builtin/index-pack.c:1721
+#, c-format
+msgid "packfile name '%s' does not end with '.pack'"
+msgstr "'%s' 묶음파일 이름이 '.pack'으로 끝나지 않습니다"
+
+#: builtin/index-pack.c:1729
+msgid "--verify with no packfile name given"
+msgstr "--verify 옵션에 묶음파일 이름을 지정하지 않았습니다"
+
+#: builtin/init-db.c:55
+#, c-format
+msgid "cannot stat '%s'"
+msgstr "'%s'을(를) stat()할 수 없습니다"
+
+#: builtin/init-db.c:61
+#, c-format
+msgid "cannot stat template '%s'"
+msgstr "'%s' 서식을 stat()할 수 없습니다"
+
+#: builtin/init-db.c:66
+#, c-format
+msgid "cannot opendir '%s'"
+msgstr "'%s'을(를) opendir()할 수 없습니다"
+
+#: builtin/init-db.c:77
+#, c-format
+msgid "cannot readlink '%s'"
+msgstr "'%s'을(를) readlink()할 수 없습니다"
+
+#: builtin/init-db.c:79
+#, c-format
+msgid "cannot symlink '%s' '%s'"
+msgstr "'%s'을(를) '%s'에 symlink()할 수 없습니다"
+
+#: builtin/init-db.c:85
+#, c-format
+msgid "cannot copy '%s' to '%s'"
+msgstr "'%s'을(를) '%s'에 복사할 수 없습니다"
+
+#: builtin/init-db.c:89
+#, c-format
+msgid "ignoring template %s"
+msgstr "%s 서식을 무시합니다"
+
+#: builtin/init-db.c:118
+#, c-format
+msgid "templates not found %s"
+msgstr "%s에 서식이 없습니다"
+
+#: builtin/init-db.c:131
+#, c-format
+msgid "not copying templates of a wrong format version %d from '%s'"
+msgstr "'%2$s'에서 잘못된 형식 버전 %1$d의 서식을 복사하지 않습니다"
+
+#: builtin/init-db.c:309 builtin/init-db.c:312
+#, c-format
+msgid "%s already exists"
+msgstr "%s 파일이 이미 있습니다"
+
+#: builtin/init-db.c:340
+#, c-format
+msgid "unable to handle file type %d"
+msgstr "파일 종류 %d번을 처리할 수 없습니다"
+
+#: builtin/init-db.c:343
+#, c-format
+msgid "unable to move %s to %s"
+msgstr "%s을(를) %s(으)로 옮길 수 없습니다"
+
+#. TRANSLATORS: The first '%s' is either "Reinitialized
+#. existing" or "Initialized empty", the second " shared" or
+#. "", and the last '%s%s' is the verbatim directory name.
+#: builtin/init-db.c:399
+#, c-format
+msgid "%s%s Git repository in %s%s\n"
+msgstr "%s%s 깃 저장소, 위치 %s%s\n"
+
+#: builtin/init-db.c:400
+msgid "Reinitialized existing"
+msgstr "다시 초기화: 기존"
+
+#: builtin/init-db.c:400
+msgid "Initialized empty"
+msgstr "초기화: 빈"
+
+#: builtin/init-db.c:401
+msgid " shared"
+msgstr " 공유"
+
+#: builtin/init-db.c:448
+msgid ""
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
+"shared[=<permissions>]] [<directory>]"
+msgstr ""
+"git init [-q | --quiet] [--bare] [--template=<서식-디렉터리>] [--shared[=<권"
+"한>]] [<디렉터리>]"
+
+#: builtin/init-db.c:471
+msgid "permissions"
+msgstr "권한"
+
+#: builtin/init-db.c:472
+msgid "specify that the git repository is to be shared amongst several users"
+msgstr "깃 저장소를 다른 사용자가 공유할 수 있게 지정"
+
+#: builtin/init-db.c:506 builtin/init-db.c:511
+#, c-format
+msgid "cannot mkdir %s"
+msgstr "%s에 대해 mkdir를 할 수 없습니다"
+
+#: builtin/init-db.c:515
+#, c-format
+msgid "cannot chdir to %s"
+msgstr "%s에 대해 chdir를 할 수 없습니다"
+
+#: builtin/init-db.c:536
+#, c-format
+msgid ""
+"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
+"dir=<directory>)"
+msgstr ""
+"%s (또는 --work-tree=<디렉터리>) 허용되지 않음. %s (또는 --git-"
+"dir=<directory>) 지정이 없으면"
+
+#: builtin/init-db.c:564
+#, c-format
+msgid "Cannot access work tree '%s'"
+msgstr "작업 폴더 '%s'에 접근할 수 없습니다"
+
+#: builtin/interpret-trailers.c:15
+msgid ""
+"git interpret-trailers [--trim-empty] [(--trailer <token>[(=|:)<value>])...] "
+"[<file>...]"
+msgstr ""
+"git interpret-trailers [--trim-empty] [(--trailer <토큰>[(=|:)<값>])...] [<파"
+"일>...]"
+
+#: builtin/interpret-trailers.c:25
+msgid "trim empty trailers"
+msgstr "빈 트레일러를 잘라냅니다"
+
+#: builtin/interpret-trailers.c:26
+msgid "trailer"
+msgstr "트레일러"
+
+#: builtin/interpret-trailers.c:27
+msgid "trailer(s) to add"
+msgstr "추가할 트레일러"
+
+#: builtin/log.c:43
+msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
+msgstr "git log [<옵션>] [<리비전-범위>] [[--] <경로>...]"
+
+#: builtin/log.c:44
+msgid "git show [<options>] <object>..."
+msgstr "git show [<옵션>] <오브젝트>..."
+
+#: builtin/log.c:83
+#, c-format
+msgid "invalid --decorate option: %s"
+msgstr "잘못된 --decorate 옵션: %s"
+
+#: builtin/log.c:131
+msgid "suppress diff output"
+msgstr "diff를 출력하지 않습니다"
+
+#: builtin/log.c:132
+msgid "show source"
+msgstr "소스를 표시합니다"
+
+#: builtin/log.c:133
+msgid "Use mail map file"
+msgstr "메일 맵 파일을 사용합니다"
+
+#: builtin/log.c:134
+msgid "decorate options"
+msgstr "꾸미기 옵션"
+
+#: builtin/log.c:137
+msgid "Process line range n,m in file, counting from 1"
+msgstr "파일에서 n,m 범위의 줄을 처리합니다 (1부터 시작)"
+
+#: builtin/log.c:233
+#, c-format
+msgid "Final output: %d %s\n"
+msgstr "최종 출력: %d %s\n"
+
+#: builtin/log.c:465
+#, c-format
+msgid "git show %s: bad file"
+msgstr "git show %s: 잘못된 파일"
+
+#: builtin/log.c:479 builtin/log.c:572
+#, c-format
+msgid "Could not read object %s"
+msgstr "%s 오브젝트를 읽을 수 없습니다"
+
+#: builtin/log.c:596
+#, c-format
+msgid "Unknown type: %d"
+msgstr "알 수 없는 종류: %d"
+
+#: builtin/log.c:714
+msgid "format.headers without value"
+msgstr "format.headers 설정에 값이 없음"
+
+#: builtin/log.c:798
+msgid "name of output directory is too long"
+msgstr "출력 디렉터리의 이름이 너무 깁니다"
+
+#: builtin/log.c:813
+#, c-format
+msgid "Cannot open patch file %s"
+msgstr "%s 패치 파일을 열 수 없습니다"
+
+#: builtin/log.c:827
+msgid "Need exactly one range."
+msgstr "정확히 하나의 범위가 필요합니다."
+
+#: builtin/log.c:837
+msgid "Not a range."
+msgstr "범위가 아닙니다."
+
+#: builtin/log.c:943
+msgid "Cover letter needs email format"
+msgstr "커버레터는 전자메일 형식이어야 합니다"
+
+#: builtin/log.c:1022
+#, c-format
+msgid "insane in-reply-to: %s"
+msgstr "정신나간 in-reply-to 헤더: %s"
+
+#: builtin/log.c:1050
+msgid "git format-patch [<options>] [<since> | <revision-range>]"
+msgstr "git format-patch [<옵션>] [<시작시각> | <리비전-범위>]"
+
+#: builtin/log.c:1095
+msgid "Two output directories?"
+msgstr "출력 디렉터리가 두개?"
+
+#: builtin/log.c:1211
+msgid "use [PATCH n/m] even with a single patch"
+msgstr "하나의 패치에 대해서도 [PATCh n/m]을 붙입니다"
+
+#: builtin/log.c:1214
+msgid "use [PATCH] even with multiple patches"
+msgstr "여러 개 패치에 대해서도 [PATCH]를 붙입니다"
+
+#: builtin/log.c:1218
+msgid "print patches to standard out"
+msgstr "패치를 표준 출력으로 표시합니다"
+
+#: builtin/log.c:1220
+msgid "generate a cover letter"
+msgstr "커버레터를 만듭니다"
+
+#: builtin/log.c:1222
+msgid "use simple number sequence for output file names"
+msgstr "출력 파일 이름에 간단한 일련 번호를 사용합니다"
+
+#: builtin/log.c:1223
+msgid "sfx"
+msgstr "확장자"
+
+#: builtin/log.c:1224
+msgid "use <sfx> instead of '.patch'"
+msgstr "'.patch' 대신 <확장자>를 사용합니다"
+
+#: builtin/log.c:1226
+msgid "start numbering patches at <n> instead of 1"
+msgstr "패치 번호를 1 대신 <n>에서 시작합니다"
+
+#: builtin/log.c:1228
+msgid "mark the series as Nth re-roll"
+msgstr "시리즈를 N번째 re-roll로 표시합니다"
+
+#: builtin/log.c:1230
+msgid "Use [<prefix>] instead of [PATCH]"
+msgstr "[PATCH] 대신 [<접두어>]를 사용합니다"
+
+#: builtin/log.c:1233
+msgid "store resulting files in <dir>"
+msgstr "결과 파일을 <디렉터리>에 저장합니다"
+
+#: builtin/log.c:1236
+msgid "don't strip/add [PATCH]"
+msgstr "[PATCH]를 자르거나 추가하지 않습니다"
+
+#: builtin/log.c:1239
+msgid "don't output binary diffs"
+msgstr "바이너리 diff를 만들지 않습니다"
+
+#: builtin/log.c:1241
+msgid "output all-zero hash in From header"
+msgstr "From 헤더에서 모두 0인 해시를 출력합니다"
+
+#: builtin/log.c:1243
+msgid "don't include a patch matching a commit upstream"
+msgstr "업스트림에 있는 패치를 포함하지 않습니다"
+
+#: builtin/log.c:1245
+msgid "show patch format instead of default (patch + stat)"
+msgstr "기본값 (패치 + 통계) 대신 패치 형식을 표시합니다"
+
+#: builtin/log.c:1247
+msgid "Messaging"
+msgstr "메시징"
+
+#: builtin/log.c:1248
+msgid "header"
+msgstr "헤더"
+
+#: builtin/log.c:1249
+msgid "add email header"
+msgstr "전자메일 헤더"
+
+#: builtin/log.c:1250 builtin/log.c:1252
+msgid "email"
+msgstr "전자메일"
+
+#: builtin/log.c:1250
+msgid "add To: header"
+msgstr "To: 헤더를 추가합니다"
+
+#: builtin/log.c:1252
+msgid "add Cc: header"
+msgstr "Cc: 헤더를 추가합니다"
+
+#: builtin/log.c:1254
+msgid "ident"
+msgstr "신원"
+
+#: builtin/log.c:1255
+msgid "set From address to <ident> (or committer ident if absent)"
+msgstr "<신원>에서 From 주소를 설정합니다 (없으면 커미터 주소 신원 사용)"
+
+#: builtin/log.c:1257
+msgid "message-id"
+msgstr "메시지-ID"
+
+#: builtin/log.c:1258
+msgid "make first mail a reply to <message-id>"
+msgstr "첫 메일을 <메시지-ID>에 대한 답장 메일로 만듭니다"
+
+#: builtin/log.c:1259 builtin/log.c:1262
+msgid "boundary"
+msgstr "경계"
+
+#: builtin/log.c:1260
+msgid "attach the patch"
+msgstr "패치를 첨부합니다"
+
+#: builtin/log.c:1263
+msgid "inline the patch"
+msgstr "패치를 본문에 포함합니다"
+
+#: builtin/log.c:1267
+msgid "enable message threading, styles: shallow, deep"
+msgstr "메시지에 스레드를 사용, 스타일: shallow, deep"
+
+#: builtin/log.c:1269
+msgid "signature"
+msgstr "서명"
+
+#: builtin/log.c:1270
+msgid "add a signature"
+msgstr "서명을 추가합니다"
+
+#: builtin/log.c:1272
+msgid "add a signature from a file"
+msgstr "파일에서 서명을 추가합니다"
+
+#: builtin/log.c:1273
+msgid "don't print the patch filenames"
+msgstr "패치 파일 이름을 표시하지 않습니다"
+
+#: builtin/log.c:1362
+msgid "-n and -k are mutually exclusive."
+msgstr "-n 및 -k 옵션은 하나만 써야 합니다."
+
+#: builtin/log.c:1364
+msgid "--subject-prefix and -k are mutually exclusive."
+msgstr "--subject-prefix 및 -k 옵션은 하나만 써야 합니다."
+
+#: builtin/log.c:1372
+msgid "--name-only does not make sense"
+msgstr "--name-only 옵션은 앞뒤가 맞지 않습니다"
+
+#: builtin/log.c:1374
+msgid "--name-status does not make sense"
+msgstr "--name-status 옵션은 앞뒤가 맞지 않습니다"
+
+#: builtin/log.c:1376
+msgid "--check does not make sense"
+msgstr "--check 옵션은 앞뒤가 맞지 않습니다"
+
+#: builtin/log.c:1401
+msgid "standard output, or directory, which one?"
+msgstr "표준 출력이나 디렉터리 중에 하나만 지정해야 합니다."
+
+#: builtin/log.c:1403
+#, c-format
+msgid "Could not create directory '%s'"
+msgstr "'%s' 디렉터리를 만들 수 없습니다"
+
+#: builtin/log.c:1500
+#, c-format
+msgid "unable to read signature file '%s'"
+msgstr "'%s' 서명 파일을 읽을 수 없습니다"
+
+#: builtin/log.c:1563
+msgid "Failed to create output files"
+msgstr "출력 파일을 만드는데 실패했습니다"
+
+#: builtin/log.c:1611
+msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
+msgstr "git cherry [-v] [<업스트림> [<헤드> [<한계값>]]]"
+
+#: builtin/log.c:1665
+#, c-format
+msgid ""
+"Could not find a tracked remote branch, please specify <upstream> manually.\n"
+msgstr "추적되는 리모트 브랜치를 찾을 수 없습니다. <업스트림>을 수동으로 지정하십시오.\n"
+
+#: builtin/log.c:1676 builtin/log.c:1678 builtin/log.c:1690
+#, c-format
+msgid "Unknown commit %s"
+msgstr "알 수 없는 커밋 %s"
+
+#: builtin/ls-files.c:358
+msgid "git ls-files [<options>] [<file>...]"
+msgstr "git ls-files [<옵션>] [<파일>...]"
+
+#: builtin/ls-files.c:415
+msgid "identify the file status with tags"
+msgstr "파일 상태를 태그와 같이 표시합니다"
+
+#: builtin/ls-files.c:417
+msgid "use lowercase letters for 'assume unchanged' files"
+msgstr "'변경되지 않았다고 가정' 파일에 소문자를 사용합니다"
+
+#: builtin/ls-files.c:419
+msgid "show cached files in the output (default)"
+msgstr "출력에 캐시된 파일을 표시합니다 (기본값)"
+
+#: builtin/ls-files.c:421
+msgid "show deleted files in the output"
+msgstr "출력에 삭제된 파일을 표시합니다"
+
+#: builtin/ls-files.c:423
+msgid "show modified files in the output"
+msgstr "출력에 수정된 파일을 표시합니다"
+
+#: builtin/ls-files.c:425
+msgid "show other files in the output"
+msgstr "출력에 기타 파일을 표시합니다"
+
+#: builtin/ls-files.c:427
+msgid "show ignored files in the output"
+msgstr "출력에 무시된 파일을 표시합니다"
+
+#: builtin/ls-files.c:430
+msgid "show staged contents' object name in the output"
+msgstr "출력에 커밋 표시된 내용의 오브젝트 이름을 표시합니다"
+
+#: builtin/ls-files.c:432
+msgid "show files on the filesystem that need to be removed"
+msgstr "파일 시스템에서 제거해야 하는 파일을 표시합니다"
+
+#: builtin/ls-files.c:434
+msgid "show 'other' directories' names only"
+msgstr "기타 디렉터리의 이름만 표시합니다"
+
+#: builtin/ls-files.c:437
+msgid "don't show empty directories"
+msgstr "빈 디렉터리 표시하지 않기"
+
+#: builtin/ls-files.c:440
+msgid "show unmerged files in the output"
+msgstr "출력에 병합하지 않은 파일을 표시합니다"
+
+#: builtin/ls-files.c:442
+msgid "show resolve-undo information"
+msgstr "resolve-undo 정보를 표시합니다"
+
+#: builtin/ls-files.c:444
+msgid "skip files matching pattern"
+msgstr "패턴에 일치하는 파일을 건너뜁니다"
+
+#: builtin/ls-files.c:447
+msgid "exclude patterns are read from <file>"
+msgstr "제외할 패턴을 <파일>에서 읽습니다"
+
+#: builtin/ls-files.c:450
+msgid "read additional per-directory exclude patterns in <file>"
+msgstr "<파일>에서 추가적인 디렉토리별 제외 패턴을 읽습니다"
+
+#: builtin/ls-files.c:452
+msgid "add the standard git exclusions"
+msgstr "표준 깃 제외 패턴을 추가합니다"
+
+#: builtin/ls-files.c:455
+msgid "make the output relative to the project top directory"
+msgstr "최상위 디렉토리 상대 경로로 출력합니다"
+
+#: builtin/ls-files.c:458
+msgid "if any <file> is not in the index, treat this as an error"
+msgstr "<파일>이 인덱스 안에 없으면 오류로 취급합니다"
+
+#: builtin/ls-files.c:459
+msgid "tree-ish"
+msgstr "트리-따위"
+
+#: builtin/ls-files.c:460
+msgid "pretend that paths removed since <tree-ish> are still present"
+msgstr "<트리-따위> 뒤로 제거한 경로가 있다고 가정합니다"
+
+#: builtin/ls-files.c:462
+msgid "show debugging data"
+msgstr "디버깅 데이터를 표시합니다"
+
+#: builtin/ls-tree.c:28
+msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
+msgstr "git ls-tree [<옵션>] <트리-따위> [<경로>...]"
+
+#: builtin/ls-tree.c:128
+msgid "only show trees"
+msgstr "트리만 표시"
+
+#: builtin/ls-tree.c:130
+msgid "recurse into subtrees"
+msgstr "하위 트리로 재귀적으로 적용"
+
+#: builtin/ls-tree.c:132
+msgid "show trees when recursing"
+msgstr "재귀적으로 적용할 때 트리 표시"
+
+#: builtin/ls-tree.c:135
+msgid "terminate entries with NUL byte"
+msgstr "항목을 NUL 바이트로 끝냅니다"
+
+#: builtin/ls-tree.c:136
+msgid "include object size"
+msgstr "오브젝트 크기 포함"
+
+#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
+msgid "list only filenames"
+msgstr "파일 이름만 목록 표시"
+
+#: builtin/ls-tree.c:143
+msgid "use full path names"
+msgstr "전체 경로 이름 사용"
+
+#: builtin/ls-tree.c:145
+msgid "list entire tree; not just current directory (implies --full-name)"
+msgstr "전체 트리 목록 표시, 현재 디렉터리만 아니라 (--full-name 옵션 포함)"
+
+#: builtin/merge.c:45
+msgid "git merge [<options>] [<commit>...]"
+msgstr "git merge [<옵션>] [<커밋>...]"
+
+#: builtin/merge.c:46
+msgid "git merge [<options>] <msg> HEAD <commit>"
+msgstr "git merge [<옵션>] <메시지> HEAD <커밋>"
+
+#: builtin/merge.c:47
+msgid "git merge --abort"
+msgstr "git merge --abort"
+
+#: builtin/merge.c:100
+msgid "switch `m' requires a value"
+msgstr "`m' 옵션에는 값이 필요합니다"
+
+#: builtin/merge.c:137
+#, c-format
+msgid "Could not find merge strategy '%s'.\n"
+msgstr "'%s' 병합 전략을 찾을 수 없습니다.\n"
+
+#: builtin/merge.c:138
+#, c-format
+msgid "Available strategies are:"
+msgstr "사용 가능한 전략은:"
+
+#: builtin/merge.c:143
+#, c-format
+msgid "Available custom strategies are:"
+msgstr "사용 가능한 사용자 설정 전략은:"
+
+#: builtin/merge.c:193 builtin/pull.c:119
+msgid "do not show a diffstat at the end of the merge"
+msgstr "병합이 끝날 때 diffstat을 표시하지 않습니다"
+
+#: builtin/merge.c:196 builtin/pull.c:122
+msgid "show a diffstat at the end of the merge"
+msgstr "병합이 끝날 때 diffstat을 표시합니다"
+
+#: builtin/merge.c:197 builtin/pull.c:125
+msgid "(synonym to --stat)"
+msgstr "(--stat 옵션과 동일)"
+
+#: builtin/merge.c:199 builtin/pull.c:128
+msgid "add (at most <n>) entries from shortlog to merge commit message"
+msgstr "병합 커밋의 메시지에 shortlog 항목을 (최대 <n>개) 추가합니다"
+
+#: builtin/merge.c:202 builtin/pull.c:131
+msgid "create a single commit instead of doing a merge"
+msgstr "병합하는 대신 하나의 커밋을 만듭니다"
+
+#: builtin/merge.c:204 builtin/pull.c:134
+msgid "perform a commit if the merge succeeds (default)"
+msgstr "병합이 성공하면 커밋을 합니다 (기본값)"
+
+#: builtin/merge.c:206 builtin/pull.c:137
+msgid "edit message before committing"
+msgstr "커밋 전에 메시지를 편집합니다"
+
+#: builtin/merge.c:207
+msgid "allow fast-forward (default)"
+msgstr "정방향 진행을 허용합니다 (기본값)"
+
+#: builtin/merge.c:209 builtin/pull.c:143
+msgid "abort if fast-forward is not possible"
+msgstr "정방향 진행이 불가능하면 중지합니다"
+
+#: builtin/merge.c:213
+msgid "Verify that the named commit has a valid GPG signature"
+msgstr "이름 붙인 커밋에 올바른 GPG 서명이 있는지 검증합니다"
+
+#: builtin/merge.c:214 builtin/notes.c:767 builtin/pull.c:148
+#: builtin/revert.c:89
+msgid "strategy"
+msgstr "전략"
+
+#: builtin/merge.c:215 builtin/pull.c:149
+msgid "merge strategy to use"
+msgstr "사용할 병합 전략"
+
+#: builtin/merge.c:216 builtin/pull.c:152
+msgid "option=value"
+msgstr "옵션=값"
+
+#: builtin/merge.c:217 builtin/pull.c:153
+msgid "option for selected merge strategy"
+msgstr "선택한 병합 전략에 대한 옵션"
+
+#: builtin/merge.c:219
+msgid "merge commit message (for a non-fast-forward merge)"
+msgstr "병합 커밋 메시지 (정방향이 아닌 병합에 대해)"
+
+#: builtin/merge.c:223
+msgid "abort the current in-progress merge"
+msgstr "현재 진행 중인 병합을 중지합니다"
+
+#: builtin/merge.c:251
+msgid "could not run stash."
+msgstr "stash를 실행할 수 없습니다."
+
+#: builtin/merge.c:256
+msgid "stash failed"
+msgstr "stash 실패"
+
+#: builtin/merge.c:261
+#, c-format
+msgid "not a valid object: %s"
+msgstr "올바른 오브젝트가 아닙니다: %s"
+
+#: builtin/merge.c:280 builtin/merge.c:297
+msgid "read-tree failed"
+msgstr "read-tree 실패"
+
+#: builtin/merge.c:327
+msgid " (nothing to squash)"
+msgstr " (합칠 내용이 없습니다)"
+
+#: builtin/merge.c:340
+#, c-format
+msgid "Squash commit -- not updating HEAD\n"
+msgstr "커밋 합치기 -- HEAD를 업데이트하지 않습니다\n"
+
+#: builtin/merge.c:344 builtin/merge.c:763 builtin/merge.c:975
+#: builtin/merge.c:988
+#, c-format
+msgid "Could not write to '%s'"
+msgstr "'%s'에 쓸 수 없습니다"
+
+#: builtin/merge.c:372
+msgid "Writing SQUASH_MSG"
+msgstr "SQUASH_MSG를 쓰는 중"
+
+#: builtin/merge.c:374
+msgid "Finishing SQUASH_MSG"
+msgstr "SQUASH_MSG를 마치는 중"
+
+#: builtin/merge.c:397
+#, c-format
+msgid "No merge message -- not updating HEAD\n"
+msgstr "병합 메시지가 없습니다 -- HEAD를 업데이트하지 않습니다\n"
+
+#: builtin/merge.c:447
+#, c-format
+msgid "'%s' does not point to a commit"
+msgstr "'%s'이(가) 커밋을 가리키지 않습니다"
+
+#: builtin/merge.c:537
+#, c-format
+msgid "Bad branch.%s.mergeoptions string: %s"
+msgstr "잘못된 branch.%s.mergeoptions 문자열: %s"
+
+#: builtin/merge.c:656
+msgid "Not handling anything other than two heads merge."
+msgstr "두 개의 헤드 병합 외에는 처리하지 않습니다."
+
+#: builtin/merge.c:670
+#, c-format
+msgid "Unknown option for merge-recursive: -X%s"
+msgstr "merge-recursive에 대해 알 수 없는 옵션: -X%s"
+
+#: builtin/merge.c:683
+#, c-format
+msgid "unable to write %s"
+msgstr "%s에 쓸 수 없습니다"
+
+#: builtin/merge.c:772
+#, c-format
+msgid "Could not read from '%s'"
+msgstr "'%s'에서 읽을 수 없습니다"
+
+#: builtin/merge.c:781
+#, c-format
+msgid "Not committing merge; use 'git commit' to complete the merge.\n"
+msgstr "병합을 커밋하지 않습니다. 병합을 마치려면 'git commit'을 사용하십시오.\n"
+
+#: builtin/merge.c:787
+#, c-format
+msgid ""
+"Please enter a commit message to explain why this merge is necessary,\n"
+"especially if it merges an updated upstream into a topic branch.\n"
+"\n"
+"Lines starting with '%c' will be ignored, and an empty message aborts\n"
+"the commit.\n"
+msgstr ""
+"왜 이 병합이 필요한지를 설명하는 커밋 메시지를 입력하십시오. 특히\n"
+"업스트림 업데이트를 어떤 목적용 브랜치로 병합할 때는 반드시 그렇게\n"
+"하십시오.\n"
+"\n"
+"'%c' 문자로 시작하는 줄은 무시되고, 메시지가 비어 있으면 커밋을\n"
+"중지합니다.\n"
+
+#: builtin/merge.c:811
+msgid "Empty commit message."
+msgstr "빈 커밋 메시지."
+
+#: builtin/merge.c:823
+#, c-format
+msgid "Wonderful.\n"
+msgstr "훌륭합니다.\n"
+
+#: builtin/merge.c:878
+#, c-format
+msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
+msgstr "자동 병합이 실패했습니다. 충돌을 바로잡고 결과물을 커밋하십시오.\n"
+
+#: builtin/merge.c:894
+#, c-format
+msgid "'%s' is not a commit"
+msgstr "'%s'은(는) 커밋이 아닙니다"
+
+#: builtin/merge.c:935
+msgid "No current branch."
+msgstr "현재 브랜치가 없습니다."
+
+#: builtin/merge.c:937
+msgid "No remote for the current branch."
+msgstr "현재 브랜치에 대한 리모트가 없습니다."
+
+#: builtin/merge.c:939
+msgid "No default upstream defined for the current branch."
+msgstr "현재 브랜치에 대해 기본 업스트림을 지정하지 않았습니다."
+
+#: builtin/merge.c:944
+#, c-format
+msgid "No remote-tracking branch for %s from %s"
+msgstr "리모트 %2$s에서 %1$s에 대한 리모트 추적 브랜치가 없습니다"
+
+#: builtin/merge.c:1079
+#, c-format
+msgid "could not close '%s'"
+msgstr "'%s'을(를) 닫을 수 없습니다"
+
+#: builtin/merge.c:1206
+msgid "There is no merge to abort (MERGE_HEAD missing)."
+msgstr "중지할 병합 작업이 없습니다. (MERGE_HEAD가 없음)"
+
+#: builtin/merge.c:1222
+msgid ""
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you merge."
+msgstr ""
+"병합을 마치지 않았습니다. (MERGE_HEAD 있음)\n"
+"병합하기 전에 변경 사항을 커밋하십시오."
+
+#: builtin/merge.c:1229
+msgid ""
+"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
+"Please, commit your changes before you merge."
+msgstr ""
+"커밋 빼오기를 마치지 않았습니다. (COMMIT_PICK_HEAD 있음)\n"
+"병합하기 전에 변경 사항을 커밋하십시오."
+
+#: builtin/merge.c:1232
+msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
+msgstr "커밋 빼오기를 마치지 않았습니다. (CHERRY_PICK_HEAD 있음)"
+
+#: builtin/merge.c:1241
+msgid "You cannot combine --squash with --no-ff."
+msgstr "--squash 옵션을 --no-ff 옵션과 같이 쓸 수 없습니다."
+
+#: builtin/merge.c:1249
+msgid "No commit specified and merge.defaultToUpstream not set."
+msgstr "커밋을 지정하지 않았고  merge.defaultToUpstream를 설정하지 않았습니다."
+
+#: builtin/merge.c:1266
+msgid "Squash commit into empty head not supported yet"
+msgstr "빈 헤드로 커밋을 합치기는 지원하지 않습니다"
+
+#: builtin/merge.c:1268
+msgid "Non-fast-forward commit does not make sense into an empty head"
+msgstr "정방향이 아닌 커밋은 빈 헤드에서는 앞뒤가 맞지 않습니다"
+
+#: builtin/merge.c:1274
+#, c-format
+msgid "%s - not something we can merge"
+msgstr "%s - 병합할 수 있는 항목이 아닙니다"
+
+#: builtin/merge.c:1276
+msgid "Can merge only exactly one commit into empty head"
+msgstr "빈 헤드에는 정확히 하나의 커밋만 병합할 수 있습니다"
+
+#: builtin/merge.c:1331
+#, c-format
+msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
+msgstr "%s 커밋에 신뢰하지 않는 (서명자가 %s라고 하는) GPG 서명이 있습니다."
+
+#: builtin/merge.c:1334
+#, c-format
+msgid "Commit %s has a bad GPG signature allegedly by %s."
+msgstr "%s 커밋에 잘못된 (서명자가 %s라고 하는) GPG 서명이 있습니다."
+
+#: builtin/merge.c:1337
+#, c-format
+msgid "Commit %s does not have a GPG signature."
+msgstr "%s 커밋에 GPG 서명이 없습니다."
+
+#: builtin/merge.c:1340
+#, c-format
+msgid "Commit %s has a good GPG signature by %s\n"
+msgstr "%s 커밋에 %s의 올바른 GPG 서명이 없습니다\n"
+
+#: builtin/merge.c:1423
+#, c-format
+msgid "Updating %s..%s\n"
+msgstr "업데이트 중 %s..%s\n"
+
+#: builtin/merge.c:1460
+#, c-format
+msgid "Trying really trivial in-index merge...\n"
+msgstr "아주 간단한 인덱스 내부 병합을 시도합니다...\n"
+
+#: builtin/merge.c:1467
+#, c-format
+msgid "Nope.\n"
+msgstr "아님.\n"
+
+#: builtin/merge.c:1499
+msgid "Not possible to fast-forward, aborting."
+msgstr "정방향이 불가능하므로, 중지합니다."
+
+#: builtin/merge.c:1522 builtin/merge.c:1601
+#, c-format
+msgid "Rewinding the tree to pristine...\n"
+msgstr "트리를 본래 위치로 되돌립니다...\n"
+
+#: builtin/merge.c:1526
+#, c-format
+msgid "Trying merge strategy %s...\n"
+msgstr "병합 전략 %s 시도...\n"
+
+#: builtin/merge.c:1592
+#, c-format
+msgid "No merge strategy handled the merge.\n"
+msgstr "병합을 처리한 전략이 없습니다.\n"
+
+#: builtin/merge.c:1594
+#, c-format
+msgid "Merge with strategy %s failed.\n"
+msgstr "전략 %s(으)로 병합이 실패했습니다.\n"
+
+#: builtin/merge.c:1603
+#, c-format
+msgid "Using the %s to prepare resolving by hand.\n"
+msgstr "수동 해결의 준비를 위해 %s 전략을 사용합니다.\n"
+
+#: builtin/merge.c:1615
+#, c-format
+msgid "Automatic merge went well; stopped before committing as requested\n"
+msgstr "자동 병합이 잘 진행되었습니다. 요청한대로 커밋 전에 중지합니다\n"
+
+#: builtin/merge-base.c:29
+msgid "git merge-base [-a | --all] <commit> <commit>..."
+msgstr "git merge-base [-a | --all] <커밋> <커밋>..."
+
+#: builtin/merge-base.c:30
+msgid "git merge-base [-a | --all] --octopus <commit>..."
+msgstr "git merge-base [-a | --all] --octopus <커밋>..."
+
+#: builtin/merge-base.c:31
+msgid "git merge-base --independent <commit>..."
+msgstr "git merge-base --independent <커밋>..."
+
+#: builtin/merge-base.c:32
+msgid "git merge-base --is-ancestor <commit> <commit>"
+msgstr "git merge-base --is-ancestor <커밋> <커밋>"
+
+#: builtin/merge-base.c:33
+msgid "git merge-base --fork-point <ref> [<commit>]"
+msgstr "git merge-base --fork-point <레퍼런스> [<커밋>]"
+
+#: builtin/merge-base.c:214
+msgid "output all common ancestors"
+msgstr "모든 과거 공통 커밋을 출력합니다"
+
+#: builtin/merge-base.c:216
+msgid "find ancestors for a single n-way merge"
+msgstr "하나의 n-방향 병합에 대한 과거 커밋을 찾습니다"
+
+#: builtin/merge-base.c:218
+msgid "list revs not reachable from others"
+msgstr "다른 곳에서 접근 불가능한 리비전 목록을 출력합니다"
+
+#: builtin/merge-base.c:220
+msgid "is the first one ancestor of the other?"
+msgstr "첫번째가 다른 것의 과거 커밋인지 여부?"
+
+#: builtin/merge-base.c:222
+msgid "find where <commit> forked from reflog of <ref>"
+msgstr "<레퍼런스>의 reflog에서 <커밋>이 분리된 위치를 찾습니다"
+
+#: builtin/merge-file.c:8
+msgid ""
+"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
+"<orig-file> <file2>"
+msgstr "git merge-file [<옵션>] [-L <이름1> [-L <orig> [-L <이름2>]]] <파일1> <본래-파일> <파일2>"
+
+#: builtin/merge-file.c:33
+msgid "send results to standard output"
+msgstr "결과를 표준 출력으로 보냅니다"
+
+#: builtin/merge-file.c:34
+msgid "use a diff3 based merge"
+msgstr "diff3 기반 병합을 사용합니다"
+
+#: builtin/merge-file.c:35
+msgid "for conflicts, use our version"
+msgstr "충돌이 발생하면, 우리쪽 버전을 사용합니다"
+
+#: builtin/merge-file.c:37
+msgid "for conflicts, use their version"
+msgstr "충돌이 발생하면, 상대편 버전을 사용합니다"
+
+#: builtin/merge-file.c:39
+msgid "for conflicts, use a union version"
+msgstr "충돌이 발생하면, 합친 버전을 사용합니다"
+
+#: builtin/merge-file.c:42
+msgid "for conflicts, use this marker size"
+msgstr "충돌이 발생하면, 이 크기로 표시합니다"
+
+#: builtin/merge-file.c:43
+msgid "do not warn about conflicts"
+msgstr "충돌에 대해 경고하지 않습니다"
+
+#: builtin/merge-file.c:45
+msgid "set labels for file1/orig-file/file2"
+msgstr "<파일1>/<본래-파일>/<파일2>에 대한 레이블을 설정합니다"
+
+#: builtin/mktree.c:64
+msgid "git mktree [-z] [--missing] [--batch]"
+msgstr "git mktree [-z] [--missing] [--batch]"
+
+#: builtin/mktree.c:150
+msgid "input is NUL terminated"
+msgstr "입력이 NUL로 끝납니다"
+
+#: builtin/mktree.c:151 builtin/write-tree.c:24
+msgid "allow missing objects"
+msgstr "없는 오브젝트를 허용합니다"
+
+#: builtin/mktree.c:152
+msgid "allow creation of more than one tree"
+msgstr "여러개 트리 만들기를 허용합니다"
+
+#: builtin/mv.c:15
+msgid "git mv [<options>] <source>... <destination>"
+msgstr "git mv [<옵션>] <원본>... <대상>"
+
+#: builtin/mv.c:69
+#, c-format
+msgid "Directory %s is in index and no submodule?"
+msgstr "%s 디렉터리가 인덱스에 있고 하위 모듈이 없습니다?"
+
+#: builtin/mv.c:71
+msgid "Please stage your changes to .gitmodules or stash them to proceed"
+msgstr "계속하려면 .gitmodules의 변경 사항을 스테이지에 넣거나 stash 하십시오"
+
+#: builtin/mv.c:89
+#, c-format
+msgid "%.*s is in index"
+msgstr "%.*s이(가) 인덱스에 있습니다"
+
+#: builtin/mv.c:111
+msgid "force move/rename even if target exists"
+msgstr "대상이 이미 있어도 강제로 옮기기/이름 바꾸기를 합니다"
+
+#: builtin/mv.c:112
+msgid "skip move/rename errors"
+msgstr "옮기기/이름 바꾸기 오류를 건너 뜁니다"
+
+#: builtin/mv.c:151
+#, c-format
+msgid "destination '%s' is not a directory"
+msgstr "대상이 ('%s') 디렉터리가 아닙니다"
+
+#: builtin/mv.c:162
+#, c-format
+msgid "Checking rename of '%s' to '%s'\n"
+msgstr "'%s'을(를) '%s'(으)로 이름 바꾸기합니다\n"
+
+#: builtin/mv.c:166
+msgid "bad source"
+msgstr "잘못된 원본"
+
+#: builtin/mv.c:169
+msgid "can not move directory into itself"
+msgstr "디렉터리를 자기 자신으로 옮길 수 없습니다"
+
+#: builtin/mv.c:172
+msgid "cannot move directory over file"
+msgstr "디렉터리를 파일로 옮길 수 없습니다"
+
+#: builtin/mv.c:181
+msgid "source directory is empty"
+msgstr "원본 디렉터리가 비어 있습니다"
+
+#: builtin/mv.c:206
+msgid "not under version control"
+msgstr "버전 컨트롤 중이 아닙니다"
+
+#: builtin/mv.c:209
+msgid "destination exists"
+msgstr "대상이 있습니다"
+
+#: builtin/mv.c:217
+#, c-format
+msgid "overwriting '%s'"
+msgstr "'%s' 덮어쓰기"
+
+#: builtin/mv.c:220
+msgid "Cannot overwrite"
+msgstr "덮어쓸 수 없습니다"
+
+#: builtin/mv.c:223
+msgid "multiple sources for the same target"
+msgstr "동일한 대상에 대해 여러 개 원본"
+
+#: builtin/mv.c:225
+msgid "destination directory does not exist"
+msgstr "대상 디렉터리가 없습니다"
+
+#: builtin/mv.c:232
+#, c-format
+msgid "%s, source=%s, destination=%s"
+msgstr "%s, 원본=%s, 대상=%s"
+
+#: builtin/mv.c:253
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "이름 바꾸기, '%s'에서 '%s'(으)로\n"
+
+#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365
+#, c-format
+msgid "renaming '%s' failed"
+msgstr "'%s'의 이름 바꾸기가 실패했습니다"
+
+#: builtin/name-rev.c:251
+msgid "git name-rev [<options>] <commit>..."
+msgstr "git name-rev [<옵션>] <커밋>..."
+
+#: builtin/name-rev.c:252
+msgid "git name-rev [<options>] --all"
+msgstr "git name-rev [<옵션>] --all"
+
+#: builtin/name-rev.c:253
+msgid "git name-rev [<options>] --stdin"
+msgstr "git name-rev [<옵션>] --stdin"
+
+#: builtin/name-rev.c:305
+msgid "print only names (no SHA-1)"
+msgstr "이름만 표시 (SHA-1 없이)"
+
+#: builtin/name-rev.c:306
+msgid "only use tags to name the commits"
+msgstr "커밋을 지정할 때 태그만 사용합니다"
+
+#: builtin/name-rev.c:308
+msgid "only use refs matching <pattern>"
+msgstr "<패턴>과 일치하는 레퍼런스만 사용합니다"
+
+#: builtin/name-rev.c:310
+msgid "list all commits reachable from all refs"
+msgstr "모든 레퍼런스에서 접근 가능한 모든 커밋 목록을 표시합니다"
+
+#: builtin/name-rev.c:311
+msgid "read from stdin"
+msgstr "표준입력에서 읽습니다"
+
+#: builtin/name-rev.c:312
+msgid "allow to print `undefined` names (default)"
+msgstr "`정의되지 않은' 이름 표시를 허용합니다 (기본값)"
+
+#: builtin/name-rev.c:318
+msgid "dereference tags in the input (internal use)"
+msgstr "입력의 태그 레퍼런스를 따라갑니다 (내부 사용)"
+
+#: builtin/notes.c:25
+msgid "git notes [--ref <notes-ref>] [list [<object>]]"
+msgstr "git notes [--ref <노트-레퍼런스>] [list [<오브젝트>]]"
+
+#: builtin/notes.c:26
+msgid ""
+"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> "
+"| (-c | -C) <object>] [<object>]"
+msgstr ""
+"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <메시지> | -F <파"
+"일> | (-c | -C) <오브젝트>] [<오브젝트>]"
+
+#: builtin/notes.c:27
+msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
+msgstr "git notes [--ref <노트-레퍼런스>] copy [-f] <원본-오브젝트> <대상-오브젝트>"
+
+#: builtin/notes.c:28
+msgid ""
+"git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | "
+"(-c | -C) <object>] [<object>]"
+msgstr ""
+"git notes [--ref <쪽지-레퍼런스>] append [--allow-empty] [-m <메시지> | -F <"
+"파일> | (-c | -C) <오브젝트>] [<오브젝트>]"
+
+#: builtin/notes.c:29
+msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
+msgstr "git notes [--ref <쪽지-레퍼런스>] edit [--allow-empty] [<오브젝트>]"
+
+#: builtin/notes.c:30
+msgid "git notes [--ref <notes-ref>] show [<object>]"
+msgstr "git notes [--ref <notes-ref>] show [<오브젝트>]"
+
+#: builtin/notes.c:31
+msgid ""
+"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
+msgstr "git notes [--ref <노트-레퍼런스>] merge [-v | -q] [-s <전략>] <노트-레퍼런스>"
+
+#: builtin/notes.c:32
+msgid "git notes merge --commit [-v | -q]"
+msgstr "git notes merge --commit [-v | -q]"
+
+#: builtin/notes.c:33
+msgid "git notes merge --abort [-v | -q]"
+msgstr "git notes merge --abort [-v | -q]"
+
+#: builtin/notes.c:34
+msgid "git notes [--ref <notes-ref>] remove [<object>...]"
+msgstr "git notes [--ref <노트-레퍼런스>] remove [<오브젝트>...]"
+
+#: builtin/notes.c:35
+msgid "git notes [--ref <notes-ref>] prune [-n | -v]"
+msgstr "git notes [--ref <노트-레퍼런스>] prune [-n | -v]"
+
+#: builtin/notes.c:36
+msgid "git notes [--ref <notes-ref>] get-ref"
+msgstr "git notes [--ref <노트-레퍼런스>] get-ref"
+
+#: builtin/notes.c:41
+msgid "git notes [list [<object>]]"
+msgstr "git notes [list [<오브젝트>]]"
+
+#: builtin/notes.c:46
+msgid "git notes add [<options>] [<object>]"
+msgstr "git notes add [<옵션>] [<오브젝트>]"
+
+#: builtin/notes.c:51
+msgid "git notes copy [<options>] <from-object> <to-object>"
+msgstr "git notes copy [<옵션>] <원본-오브젝트> <대상-오브젝트>"
+
+#: builtin/notes.c:52
+msgid "git notes copy --stdin [<from-object> <to-object>]..."
+msgstr "git notes copy --stdin [<원본-오브젝트> <대상-오브젝트>]..."
+
+#: builtin/notes.c:57
+msgid "git notes append [<options>] [<object>]"
+msgstr "git notes append [<옵션>] [<오브젝트>]"
+
+#: builtin/notes.c:62
+msgid "git notes edit [<object>]"
+msgstr "git notes edit [<오브젝트>]"
+
+#: builtin/notes.c:67
+msgid "git notes show [<object>]"
+msgstr "git notes show [<오브젝트>]"
+
+#: builtin/notes.c:72
+msgid "git notes merge [<options>] <notes-ref>"
+msgstr "git notes merge [<옵션>] <쪽지-레퍼런스>"
+
+#: builtin/notes.c:73
+msgid "git notes merge --commit [<options>]"
+msgstr "git notes merge --commit [<옵션>]"
+
+#: builtin/notes.c:74
+msgid "git notes merge --abort [<options>]"
+msgstr "git notes merge --abort [<옵션>]"
+
+#: builtin/notes.c:79
+msgid "git notes remove [<object>]"
+msgstr "git notes remove [<오브젝트>]"
+
+#: builtin/notes.c:84
+msgid "git notes prune [<options>]"
+msgstr "git notes prune [<옵션>]"
+
+#: builtin/notes.c:89
+msgid "git notes get-ref"
+msgstr "git notes get-ref"
+
+#: builtin/notes.c:147
+#, c-format
+msgid "unable to start 'show' for object '%s'"
+msgstr "'%s' 오브젝트에 대해 'show'를 시작할 수 없습니다"
+
+#: builtin/notes.c:151
+msgid "could not read 'show' output"
+msgstr "'show' 출력을 읽을 수 없습니다"
+
+#: builtin/notes.c:159
+#, c-format
+msgid "failed to finish 'show' for object '%s'"
+msgstr "오브젝트 '%s'에 대해 'show'를 마치는데 실패했습니다"
+
+#: builtin/notes.c:174 builtin/tag.c:248
+#, c-format
+msgid "could not create file '%s'"
+msgstr "'%s' 파일을 만들 수 없습니다"
+
+#: builtin/notes.c:193
+msgid "Please supply the note contents using either -m or -F option"
+msgstr "노트 내용을 -m 또는 -F 옵션으로 입력하십시오"
+
+#: builtin/notes.c:202
+msgid "unable to write note object"
+msgstr "노트 오브젝트를 쓸 수 없습니다"
+
+#: builtin/notes.c:204
+#, c-format
+msgid "The note contents have been left in %s"
+msgstr "노트 내용은 %s에 남습니다"
+
+#: builtin/notes.c:232 builtin/tag.c:440
+#, c-format
+msgid "cannot read '%s'"
+msgstr "'%s'을(를) 읽을 수 없습니다"
+
+#: builtin/notes.c:234 builtin/tag.c:443
+#, c-format
+msgid "could not open or read '%s'"
+msgstr "'%s'을(를) 열거나 읽을 수 없습니다"
+
+#: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306
+#: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507
+#: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653
+#: builtin/notes.c:877 builtin/tag.c:456
+#, c-format
+msgid "Failed to resolve '%s' as a valid ref."
+msgstr "'%s'을(를) 올바른 레퍼런스로 알아내는데 실패했습니다."
+
+#: builtin/notes.c:256
+#, c-format
+msgid "Failed to read object '%s'."
+msgstr "'%s' 오브젝트 읽기에 실패했습니다."
+
+#: builtin/notes.c:260
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr "블롭이 아닌 '%s' 오브젝트에 대해 노트 데이터를 읽을 수 없습니다."
+
+#: builtin/notes.c:359 builtin/notes.c:414 builtin/notes.c:490
+#: builtin/notes.c:502 builtin/notes.c:578 builtin/notes.c:646
+#: builtin/notes.c:942
+msgid "too many parameters"
+msgstr "파라미터가 너무 많습니다"
+
+#: builtin/notes.c:372 builtin/notes.c:659
+#, c-format
+msgid "No note found for object %s."
+msgstr "%s 오브젝트에 대해 노트가 없습니다."
+
+#: builtin/notes.c:393 builtin/notes.c:556
+msgid "note contents as a string"
+msgstr "문자열로 노트 내용"
+
+#: builtin/notes.c:396 builtin/notes.c:559
+msgid "note contents in a file"
+msgstr "파일 안에 노트 내용"
+
+#: builtin/notes.c:399 builtin/notes.c:562
+msgid "reuse and edit specified note object"
+msgstr "지정한 노트 오브젝트를 재사용하고 편집합니다"
+
+#: builtin/notes.c:402 builtin/notes.c:565
+msgid "reuse specified note object"
+msgstr "지정한 노트 오브젝트를 재사용합니다"
+
+#: builtin/notes.c:405 builtin/notes.c:568
+msgid "allow storing empty note"
+msgstr "빈 노트 저장을 허용합니다"
+
+#: builtin/notes.c:406 builtin/notes.c:477
+msgid "replace existing notes"
+msgstr "기존 노트를 바꿉니다"
+
+#: builtin/notes.c:431
+#, c-format
+msgid ""
+"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+msgstr "노트를 추가할 수 없습니다. %s 오브젝트에 대한 기존 노트가 있습니다. 기존 노트를 덮어쓰려면 '-f' 옵션을 사용하십시오"
+
+#: builtin/notes.c:446 builtin/notes.c:525
+#, c-format
+msgid "Overwriting existing notes for object %s\n"
+msgstr "%s 오브젝트에 대한 기존 노트를 덮어씁니다\n"
+
+#: builtin/notes.c:457 builtin/notes.c:618 builtin/notes.c:882
+#, c-format
+msgid "Removing note for object %s\n"
+msgstr "%s 오브젝트에 대한 노트를 제거합니다\n"
+
+#: builtin/notes.c:478
+msgid "read objects from stdin"
+msgstr "표준 입력에서 오브젝트를 읽습니다"
+
+#: builtin/notes.c:480
+msgid "load rewriting config for <command> (implies --stdin)"
+msgstr "<명령>에 대한 다시쓰기 설정을 읽어들입니다 (--stdin 옵션 포함)"
+
+#: builtin/notes.c:498
+msgid "too few parameters"
+msgstr "파라미터가 너무 적습니다"
+
+#: builtin/notes.c:519
+#, c-format
+msgid ""
+"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+msgstr "노트를 복사할 수 없습니다. %s 오브젝트에 대한 기존 노트가 있습니다. 기존 노트를 덮어쓰려면 '-f' 옵션을 사용하십시오"
+
+#: builtin/notes.c:531
+#, c-format
+msgid "Missing notes on source object %s. Cannot copy."
+msgstr "원본 %s 오브젝트에 대한 노트가 없습니다. 복사할 수 없습니다."
+
+#: builtin/notes.c:583
+#, c-format
+msgid ""
+"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
+"Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
+msgstr ""
+"-m/-F/-c/-C 옵션은 'edit' 하위 명령에 대해 사용을 권하지 않습니다.\n"
+"대신에 'git notes add -f -m/-F/-c/-C' 명령을 사용하십시오.\n"
+
+#: builtin/notes.c:764
+msgid "General options"
+msgstr "일반 옵션"
+
+#: builtin/notes.c:766
+msgid "Merge options"
+msgstr "병합 옵션"
+
+#: builtin/notes.c:768
+msgid ""
+"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
+"cat_sort_uniq)"
+msgstr "주어진 전략을 사용해 노트 충돌을 해결합니다 (manual/ours/theirs/union/cat_sort_uniq)"
+
+#: builtin/notes.c:770
+msgid "Committing unmerged notes"
+msgstr "병합하지 않은 노트 커밋"
+
+#: builtin/notes.c:772
+msgid "finalize notes merge by committing unmerged notes"
+msgstr "병합하지 않은 노트를 커밋해 노트 병합을 마칩니다"
+
+#: builtin/notes.c:774
+msgid "Aborting notes merge resolution"
+msgstr "노트 병합 해결 중지"
+
+#: builtin/notes.c:776
+msgid "abort notes merge"
+msgstr "노트 병합을 중지합니다"
+
+#: builtin/notes.c:853
+#, c-format
+msgid "A notes merge into %s is already in-progress at %s"
+msgstr "%s 위치로 노트 병합이 이미 %s에서 진행중입니다"
+
+#: builtin/notes.c:880
+#, c-format
+msgid "Object %s has no note\n"
+msgstr "%s 오브젝트에 노트가 없습니다\n"
+
+#: builtin/notes.c:892
+msgid "attempt to remove non-existent note is not an error"
+msgstr "없는 노트를 제거하려는 시도를 오류가 아닌 것으로 취급합니다"
+
+#: builtin/notes.c:895
+msgid "read object names from the standard input"
+msgstr "표준 입력에서 오브젝트 이름을 읽습니다"
+
+#: builtin/notes.c:976
+msgid "notes-ref"
+msgstr "노트-레퍼런스"
+
+#: builtin/notes.c:977
+msgid "use notes from <notes-ref>"
+msgstr "<노트-레퍼런스>에서 노트를 사용합니다"
+
+#: builtin/notes.c:1012 builtin/remote.c:1647
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "알 수 없는 하위 명령: %s"
+
+#: builtin/pack-objects.c:28
+msgid ""
+"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
+msgstr ""
+"git pack-objects --stdout [<옵션>...] [< <레퍼런스목록> | < <오브젝트목록>]"
+
+#: builtin/pack-objects.c:29
+msgid ""
+"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
+msgstr ""
+"git pack-objects [<옵션>...] <베이스이름> [< <레퍼런스목록> | < <오브젝트목록"
+">]"
+
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
+#, c-format
+msgid "deflate error (%d)"
+msgstr "deflate 오류 (%d)"
+
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "오브젝트 쓰는 중"
+
+#: builtin/pack-objects.c:1011
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr "묶음에 들어있지 않은 오브젝트가 있으므로, 비트맵 쓰기를 하지 않습니다"
+
+#: builtin/pack-objects.c:2171
+msgid "Compressing objects"
+msgstr "오브젝트 압축하는 중"
+
+#: builtin/pack-objects.c:2568
+#, c-format
+msgid "unsupported index version %s"
+msgstr "지원하지 않는 인덱스 버전 %s"
+
+#: builtin/pack-objects.c:2572
+#, c-format
+msgid "bad index version '%s'"
+msgstr "잘못된 인덱스 버전 '%s'"
+
+#: builtin/pack-objects.c:2602
+msgid "do not show progress meter"
+msgstr "진행률을 표시하지 않습니다"
+
+#: builtin/pack-objects.c:2604
+msgid "show progress meter"
+msgstr "진행률을 표시합니다"
+
+#: builtin/pack-objects.c:2606
+msgid "show progress meter during object writing phase"
+msgstr "오브젝트 쓰기 단계에서 진행률을 표시합니다"
+
+#: builtin/pack-objects.c:2609
+msgid "similar to --all-progress when progress meter is shown"
+msgstr "진행률이 표시될 때 --all-progress와 비슷합니다"
+
+#: builtin/pack-objects.c:2610
+msgid "version[,offset]"
+msgstr "버전[,오프셋]"
+
+#: builtin/pack-objects.c:2611
+msgid "write the pack index file in the specified idx format version"
+msgstr "지정한 버전의 인덱스 형식에 따라 묶음 인덱스 파일을 씁니다"
+
+#: builtin/pack-objects.c:2614
+msgid "maximum size of each output pack file"
+msgstr "출력 묶음 파일의 최대 크기"
+
+#: builtin/pack-objects.c:2616
+msgid "ignore borrowed objects from alternate object store"
+msgstr "보조 오브젝트 저장소에서 빌려온 오브젝트를 무시합니다"
+
+#: builtin/pack-objects.c:2618
+msgid "ignore packed objects"
+msgstr "묶음 오브젝트를 무시합니다"
+
+#: builtin/pack-objects.c:2620
+msgid "limit pack window by objects"
+msgstr "묶음 윈도우를 오브젝트 단위로 제한합니다"
+
+#: builtin/pack-objects.c:2622
+msgid "limit pack window by memory in addition to object limit"
+msgstr "묶음 윈도우를 오브젝트 단위에 추가로 메모리 단위로 제한합니다"
+
+#: builtin/pack-objects.c:2624
+msgid "maximum length of delta chain allowed in the resulting pack"
+msgstr "결과물 묶음에서 허용되는 최대 길이의 델타 체인"
+
+#: builtin/pack-objects.c:2626
+msgid "reuse existing deltas"
+msgstr "기존 델타를 재사용합니다"
+
+#: builtin/pack-objects.c:2628
+msgid "reuse existing objects"
+msgstr "기존 오브젝트를 재사용합니다"
+
+#: builtin/pack-objects.c:2630
+msgid "use OFS_DELTA objects"
+msgstr "OFS_DELTA 오브젝트를 사용합니다"
+
+#: builtin/pack-objects.c:2632
+msgid "use threads when searching for best delta matches"
+msgstr "최상의 델타 일치를 검색하는데 스레드를 사용합니다"
+
+#: builtin/pack-objects.c:2634
+msgid "do not create an empty pack output"
+msgstr "빈 묶음 출력을 만들지 않습니다"
+
+#: builtin/pack-objects.c:2636
+msgid "read revision arguments from standard input"
+msgstr "표준 입력에서 리비전 인자를 읽습니다"
+
+#: builtin/pack-objects.c:2638
+msgid "limit the objects to those that are not yet packed"
+msgstr "묶지 않는 오브젝트 수를 제한합니다"
+
+#: builtin/pack-objects.c:2641
+msgid "include objects reachable from any reference"
+msgstr "모든 레퍼런스에서 접근 가능한 오브젝트를 포함합니다"
+
+#: builtin/pack-objects.c:2644
+msgid "include objects referred by reflog entries"
+msgstr "reflog 항목에서 레퍼런스할 수 있는 오브젝트를 포함합니다"
+
+#: builtin/pack-objects.c:2647
+msgid "include objects referred to by the index"
+msgstr "인덱스에서< 레퍼런스하는 오브젝트를 포함합니다"
+
+#: builtin/pack-objects.c:2650
+msgid "output pack to stdout"
+msgstr "묶음을 표준 출력으로 출력합니다"
+
+#: builtin/pack-objects.c:2652
+msgid "include tag objects that refer to objects to be packed"
+msgstr "묶음에 들어갈 오브젝트를 레퍼런스하는 태그 오브젝트를 포함합니다"
+
+#: builtin/pack-objects.c:2654
+msgid "keep unreachable objects"
+msgstr "접근 불가능 오브젝트를 보존합니다"
+
+#: builtin/pack-objects.c:2655 parse-options.h:142
+msgid "time"
+msgstr "시각"
+
+#: builtin/pack-objects.c:2656
+msgid "unpack unreachable objects newer than <time>"
+msgstr "<시각>보다 새로운 접근 불가능 오브젝트의 묶음을 풉니다"
+
+#: builtin/pack-objects.c:2659
+msgid "create thin packs"
+msgstr "얇은 묶음을 만듭니다"
+
+#: builtin/pack-objects.c:2661
+msgid "create packs suitable for shallow fetches"
+msgstr "얕은 가져오기에 적합한 묶음을 만듭니다"
+
+#: builtin/pack-objects.c:2663
+msgid "ignore packs that have companion .keep file"
+msgstr "해당하는 .keep 파일이 있는 묶음을 무시합니다"
+
+#: builtin/pack-objects.c:2665
+msgid "pack compression level"
+msgstr "묶음 압축 단계"
+
+# FIXME: graft?
+#: builtin/pack-objects.c:2667
+msgid "do not hide commits by grafts"
+msgstr "붙어 있는 커밋을 숨기지 않습니다"
+
+#: builtin/pack-objects.c:2669
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr "가능하면 비트맵 인덱스를 사용해 오브젝트 세기 속도를 높입니다"
+
+#: builtin/pack-objects.c:2671
+msgid "write a bitmap index together with the pack index"
+msgstr "묶음 인덱스와 같이 비트맵 인덱스를 씁니다"
+
+#: builtin/pack-objects.c:2762
+msgid "Counting objects"
+msgstr "오브젝트 개수 세는 중"
+
+#: builtin/pack-refs.c:6
+msgid "git pack-refs [<options>]"
+msgstr "git pack-refs [<옵션>]"
+
+#: builtin/pack-refs.c:14
+msgid "pack everything"
+msgstr "모두 묶습니다"
+
+#: builtin/pack-refs.c:15
+msgid "prune loose refs (default)"
+msgstr "느슨한 레퍼런스를 잘라냅니다 (기본값)"
+
+#: builtin/prune-packed.c:7
+msgid "git prune-packed [-n | --dry-run] [-q | --quiet]"
+msgstr "git prune-packed [-n | --dry-run] [-q | --quiet]"
+
+#: builtin/prune-packed.c:40
+msgid "Removing duplicate objects"
+msgstr "중복된 오브젝트 제거"
+
+#: builtin/prune.c:11
+msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
+msgstr "git prune [-n] [-v] [--expire <시각>] [--] [<헤드>...]"
+
+#: builtin/prune.c:105 builtin/worktree.c:124
+msgid "do not remove, show only"
+msgstr "제거하지 않고, 보여주기만 합니다"
+
+#: builtin/prune.c:106 builtin/worktree.c:125
+msgid "report pruned objects"
+msgstr "잘라낸 오브젝트를 알립니다"
+
+#: builtin/prune.c:109 builtin/worktree.c:127
+msgid "expire objects older than <time>"
+msgstr "<시각>보다 오래 된 오브젝트가 만료됩니다"
+
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
+msgstr "precious-objects 저장소에서 잘라낼 수 없습니다"
+
+#: builtin/pull.c:69
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
+msgstr "git pull [<옵션>] [<저장소> [<레퍼런스명세>...]]"
+
+#: builtin/pull.c:113
+msgid "Options related to merging"
+msgstr "병합 관련 옵션"
+
+#: builtin/pull.c:116
+msgid "incorporate changes by rebasing rather than merging"
+msgstr "변경 사항을 적용할 때 병합하는 대신 리베이스합니다"
+
+#: builtin/pull.c:140 builtin/revert.c:105
+msgid "allow fast-forward"
+msgstr "정방향 진행을 허용합니다"
+
+#: builtin/pull.c:146
+msgid "verify that the named commit has a valid GPG signature"
+msgstr "지정한 커밋에 올바른 GPG 서명이 있는지 검증합니다"
+
+#: builtin/pull.c:160
+msgid "Options related to fetching"
+msgstr "가져오기 관련 옵션"
+
+#: builtin/pull.c:268
+#, c-format
+msgid "Invalid value for pull.ff: %s"
+msgstr "pull.ff에 대해 잘못된 값: %s"
+
+#: builtin/pull.c:352
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr "리베이스로 풀을 할 수 없습니다: 스테이징하지 않은 변경 사항이 있습니다."
+
+#: builtin/pull.c:358
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "추가로, 인덱스에 커밋하지 않은 변경 사항이 있습니다."
+
+#: builtin/pull.c:360
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr "리베이스로 풀을 할 수 없습니다: 인덱스에 커밋하지 않은 변경 사항이 있습니다."
+
+#: builtin/pull.c:436
+msgid ""
+"There is no candidate for rebasing against among the refs that you just "
+"fetched."
+msgstr "가져온 레퍼런스 중에 리베이스할 대상 후보가 없습니다."
+
+#: builtin/pull.c:438
+msgid ""
+"There are no candidates for merging among the refs that you just fetched."
+msgstr "가져온 레퍼런스 중에 병합할 대상 후보가 없습니다."
+
+#: builtin/pull.c:439
+msgid ""
+"Generally this means that you provided a wildcard refspec which had no\n"
+"matches on the remote end."
+msgstr ""
+"보통 이런 경우는 리모트 쪽에는 없는 와일드카드 레퍼런스명세가\n"
+"주어졌을 때 일어납니다."
+
+#: builtin/pull.c:442
+#, 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:447
+msgid "You are not currently on a branch."
+msgstr "현재 어떤 브랜치 위에도 있지 않습니다."
+
+#: builtin/pull.c:449 builtin/pull.c:464
+msgid "Please specify which branch you want to rebase against."
+msgstr "어떤 브랜치를 대상으로 리베이스할지 지정하십시오."
+
+#: builtin/pull.c:451 builtin/pull.c:466
+msgid "Please specify which branch you want to merge with."
+msgstr "어떤 브랜치를 대상으로 병합할지 지정하십시오."
+
+#: builtin/pull.c:452 builtin/pull.c:467
+msgid "See git-pull(1) for details."
+msgstr "자세한 정보는 git-pull(1) 페이지를 참고하십시오."
+
+#: builtin/pull.c:462
+msgid "There is no tracking information for the current branch."
+msgstr "현재 브랜치에 추적 정보가 없습니다."
+
+#: builtin/pull.c:471
+#, c-format
+msgid ""
+"If you wish to set tracking information for this branch you can do so with:\n"
+"\n"
+"    git branch --set-upstream-to=%s/<branch> %s\n"
+msgstr ""
+"이 브랜치에 대한 추적 정보를 설정하려면 다음과 같이 할 수 있습니다:\n"
+"\n"
+"    git branch --set-upstream-to=%s/<브랜치> %s\n"
+
+#: builtin/pull.c:476
+#, 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:830
+msgid "Updating an unborn branch with changes added to the index."
+msgstr "만들어지지 않은 브랜치를 인덱스에 추가된 변경 사항으로 업데이트합니다."
+
+#: builtin/pull.c:859
+#, c-format
+msgid ""
+"fetch updated the current branch head.\n"
+"fast-forwarding your working tree from\n"
+"commit %s."
+msgstr ""
+"현재 브랜치 헤드를 업데이트했습니다.\n"
+"작업 폴더를 %s 커밋에서 정방향\n"
+"진행합니다."
+
+#: builtin/pull.c:864
+#, c-format
+msgid ""
+"Cannot fast-forward your working tree.\n"
+"After making sure that you saved anything precious from\n"
+"$ git diff %s\n"
+"output, run\n"
+"$ git reset --hard\n"
+"to recover."
+msgstr ""
+"작업 폴더를 정방향 진행할 수 없습니다.\n"
+"다음 명령 출력에서 중요한 사항을 저장한 다음,\n"
+"$ git diff %s\n"
+"다음을 실행하면\n"
+"$ git reset --hard\n"
+"복구됩니다."
+
+#: builtin/pull.c:879
+msgid "Cannot merge multiple branches into empty head."
+msgstr "여러 브랜치를 빈 헤드로 병합할 수 없습니다."
+
+#: builtin/pull.c:883
+msgid "Cannot rebase onto multiple branches."
+msgstr "여러 브랜치로 리베이스할 수 없습니다."
+
+#: builtin/push.c:16
+msgid "git push [<options>] [<repository> [<refspec>...]]"
+msgstr "git push [<옵션>] [<저장소> [<레퍼런스명세>...]]"
+
+#: builtin/push.c:88
+msgid "tag shorthand without <tag>"
+msgstr "<태그> 없이 태그 줄임"
+
+#: builtin/push.c:98
+msgid "--delete only accepts plain target ref names"
+msgstr "--delete 옵션은 일반 대상 레퍼런스 이름만 받습니다"
+
+#: builtin/push.c:142
+msgid ""
+"\n"
+"To choose either option permanently, see push.default in 'git help config'."
+msgstr "\n어느 한 쪽 옵션만 계속 선택하려면, 'git help config'에서 push.default를 참고하십시오."
+
+#: builtin/push.c:145
+#, c-format
+msgid ""
+"The upstream branch of your current branch does not match\n"
+"the name of your current branch.  To push to the upstream branch\n"
+"on the remote, use\n"
+"\n"
+"    git push %s HEAD:%s\n"
+"\n"
+"To push to the branch of the same name on the remote, use\n"
+"\n"
+"    git push %s %s\n"
+"%s"
+msgstr ""
+"현재 브랜치의 업스트림 브랜치가 현재 브랜치의 이름과\n"
+"같지 않습니다. 리모트의 업스트림 브랜치로 푸시하려면\n"
+"다음과 같이 하십시오.\n"
+"\n"
+"    git push %s HEAD:%s\n"
+"\n"
+"리모트의 같은 이름으로 푸시하려면 다음과 같이 하십시오.\n"
+"\n"
+"    git push %s %s\n"
+"%s"
+
+#: builtin/push.c:160
+#, c-format
+msgid ""
+"You are not currently on a branch.\n"
+"To push the history leading to the current (detached HEAD)\n"
+"state now, use\n"
+"\n"
+"    git push %s HEAD:<name-of-remote-branch>\n"
+msgstr ""
+"현재 어떤 브랜치 위에도 있지 않습니다.\n"
+"지금 현재 (HEAD 분리) 상태까지의 커밋 내역을 푸시하려면\n"
+"다음과 같이 하십시오.\n"
+"\n"
+"    git push %s HEAD:<name-of-remote-branch>\n"
+
+#: builtin/push.c:174
+#, c-format
+msgid ""
+"The current branch %s has no upstream branch.\n"
+"To push the current branch and set the remote as upstream, use\n"
+"\n"
+"    git push --set-upstream %s %s\n"
+msgstr ""
+"현재 브랜치 %s에 업스트림 브랜치가 없습니다.\n"
+"현재 브랜치를 푸시하고 해당 리모트를 업스트림으로 지정하려면\n"
+"다음과 같이 하십시오.\n"
+"\n"
+"    git push --set-upstream %s %s\n"
+
+#: builtin/push.c:182
+#, c-format
+msgid "The current branch %s has multiple upstream branches, refusing to push."
+msgstr "현재 브랜치  %s에 여러 업스트림 브랜치가 있습니다. 푸시를 거절합니다."
+
+#: builtin/push.c:185
+#, c-format
+msgid ""
+"You are pushing to remote '%s', which is not the upstream of\n"
+"your current branch '%s', without telling me what to push\n"
+"to update which remote branch."
+msgstr ""
+"'%s' 리모트로 푸시하는 중입니다. 하지만 이 리모트는 현재\n"
+"'%s' 브랜치의 업스트림이 아닙니다. 어떤 리모트 브랜치에 무엇을\n"
+"푸시할지 설정하지 않았습니다."
+
+#: builtin/push.c:208
+msgid ""
+"push.default is unset; its implicit value has changed in\n"
+"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
+"and maintain the traditional behavior, use:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"To squelch this message and adopt the new behavior now, use:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"When push.default is set to 'matching', git will push local branches\n"
+"to the remote branches that already exist with the same name.\n"
+"\n"
+"Since Git 2.0, Git defaults to the more conservative 'simple'\n"
+"behavior, which only pushes the current branch to the corresponding\n"
+"remote branch that 'git pull' uses to update the current branch.\n"
+"\n"
+"See 'git help config' and search for 'push.default' for further "
+"information.\n"
+"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
+"'current' instead of 'simple' if you sometimes use older versions of Git)"
+msgstr ""
+"push.default를 설정하지 않았습니다. 묵시적 값은 깃 2.0에서\n"
+"'matching'에서 'simple'로 바뀌었습니다. 이 메시지를 표시하지\n"
+"않고 과거의 동작을 유지하려면 다음과 같이 하십시오:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"이 메시지를 표시하지 않고 새 동작을 받아들이려면 다음과 같이\n"
+"하십시오:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"push.default가 'matching'으로 설정되면, 로컬 브랜치를 이미 같은 이름이\n"
+"있는 리모트 브랜치로 푸시합니다.\n"
+"\n"
+"깃 2.0부터 더 보수적인 'simple' 동작이 기본값입니다. 여기서는 현재\n"
+"브랜치를 'git pull'에서 현재 브랜치를 업데이트할 때 사용하는 해당\n"
+"리모트 브랜치로 푸시합니다.\n"
+"\n"
+"더 자세한 정보는 'git help config'에서 'push.default' 설명을 보십시오.\n"
+"('simple' 모드는 깃 1.7.11에 추가되었습니다. 과거 버전의 깃을 사용하게\n"
+"되면 비슷한 'current' 모드를 사용하십시오.)"
+
+#: builtin/push.c:275
+msgid ""
+"You didn't specify any refspecs to push, and push.default is \"nothing\"."
+msgstr "푸시할 레퍼런스명세를 지정하지 않았고, push.default 값이 'nothing'입니다."
+
+#: builtin/push.c:282
+msgid ""
+"Updates were rejected because the tip of your current branch is behind\n"
+"its remote counterpart. Integrate the remote changes (e.g.\n"
+"'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
+msgstr ""
+"현재 브랜치의 끝이 리모트 브랜치보다 뒤에 있으므로 업데이트가\n"
+"거부되었습니다. 푸시하기 전에 ('git pull ...' 등 명령으로) 리모트\n"
+"변경 사항을 포함하십시오.\n"
+"자세한 정보는 'git push --help'의 \"Note about fast-forwards' 부분을\n"
+"참고하십시오."
+
+#: builtin/push.c:288
+msgid ""
+"Updates were rejected because a pushed branch tip is behind its remote\n"
+"counterpart. Check out this branch and integrate the remote changes\n"
+"(e.g. 'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
+msgstr ""
+"현재 브랜치의 끝이 리모트 브랜치보다 뒤에 있으므로 업데이트가\n"
+"거부되었습니다. 이 브랜치를 체크아웃하고 푸시하기 전에\n"
+"('git pull ...' 등 명령으로) 리모트 변경 사항을 포함하십시오.\n"
+"자세한 정보는 'git push --help'의 \"Note about fast-forwards' 부분을\n"
+"참고하십시오."
+
+#: builtin/push.c:294
+msgid ""
+"Updates were rejected because the remote contains work that you do\n"
+"not have locally. This is usually caused by another repository pushing\n"
+"to the same ref. You may want to first integrate the remote changes\n"
+"(e.g., 'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
+msgstr ""
+"리모트에 로컬에 없는 사항이 들어 있으므로 업데이트가\n"
+"거부되었습니다. 이 상황은 보통 또 다른 저장소에서 같은\n"
+"저장소로 푸시할 때 발생합니다.  푸시하기 전에\n"
+"('git pull ...' 등 명령으로) 리모트 변경 사항을 먼저\n"
+"포함해야 합니다.\n"
+"자세한 정보는 'git push --help'의 \"Note about fast-forwards' 부분을\n"
+"참고하십시오."
+
+#: builtin/push.c:301
+msgid "Updates were rejected because the tag already exists in the remote."
+msgstr "리모트에 태그가 이미 있기 때문에 업데이트가 거부되었습니다."
+
+#: builtin/push.c:304
+msgid ""
+"You cannot update a remote ref that points at a non-commit object,\n"
+"or update a remote ref to make it point at a non-commit object,\n"
+"without using the '--force' option.\n"
+msgstr ""
+"'--force' 옵션이 없이 커밋이 아닌 오브젝트를 가리키는 리모트\n"
+"레퍼런스를 업데이트하거나, 커밋이 아닌 오브젝트를 가리키도록\n"
+"업데이트할 수 없습니다.\n"
+
+#: builtin/push.c:363
+#, c-format
+msgid "Pushing to %s\n"
+msgstr "다음에 푸시: %s\n"
+
+#: builtin/push.c:367
+#, c-format
+msgid "failed to push some refs to '%s'"
+msgstr "레퍼런스를 '%s'에 푸시하는데 실패했습니다"
+
+#: builtin/push.c:397
+#, c-format
+msgid "bad repository '%s'"
+msgstr "잘못된 저장소 '%s'"
+
+#: builtin/push.c:398
+msgid ""
+"No configured push destination.\n"
+"Either specify the URL from the command-line or configure a remote "
+"repository using\n"
+"\n"
+"    git remote add <name> <url>\n"
+"\n"
+"and then push using the remote name\n"
+"\n"
+"    git push <name>\n"
+msgstr ""
+"푸시 대상을 설정하지 않았습니다.\n"
+"명령해에서 URL을 지정하거나 다음을 사용해 리모트 저장소를 설정하십시오\n"
+"\n"
+"    git remote add <이름> <URL>\n"
+"\n"
+"그리고 이 리모트 이름을 사용해 푸시하십시오\n"
+"\n"
+"    git push <name>\n"
+
+#: builtin/push.c:413
+msgid "--all and --tags are incompatible"
+msgstr "--all 및 --tags 옵션은 호환되지 않습니다"
+
+#: builtin/push.c:414
+msgid "--all can't be combined with refspecs"
+msgstr "--all 옵션은 레퍼런스명세와 같이 쓸 수 없습니다"
+
+#: builtin/push.c:419
+msgid "--mirror and --tags are incompatible"
+msgstr "--mirror 및 --tags 옵션은 호환되지 않습니다"
+
+#: builtin/push.c:420
+msgid "--mirror can't be combined with refspecs"
+msgstr "--mirror 옵션은 레퍼런스명세와 같이 쓸 수 없습니다"
+
+#: builtin/push.c:425
+msgid "--all and --mirror are incompatible"
+msgstr "--all 및 --mirror 옵션은 호환되지 않습니다"
+
+#: builtin/push.c:537
+msgid "repository"
+msgstr "저장소"
+
+#: builtin/push.c:538 builtin/send-pack.c:161
+msgid "push all refs"
+msgstr "모든 레퍼런스 푸시하기"
+
+#: builtin/push.c:539 builtin/send-pack.c:163
+msgid "mirror all refs"
+msgstr "모든 레퍼런스 미러"
+
+#: builtin/push.c:541
+msgid "delete refs"
+msgstr "레퍼런스 삭제"
+
+#: builtin/push.c:542
+msgid "push tags (can't be used with --all or --mirror)"
+msgstr "태그 푸시하기 (--all 또는 --mirror 옵션과 같이 쓸 수 없음)"
+
+#: builtin/push.c:545 builtin/send-pack.c:164
+msgid "force updates"
+msgstr "강제로 업데이트"
+
+#: builtin/push.c:547 builtin/send-pack.c:175
+msgid "refname>:<expect"
+msgstr "레퍼런스이름>:<예상"
+
+#: builtin/push.c:548 builtin/send-pack.c:176
+msgid "require old value of ref to be at this value"
+msgstr "레퍼런스의 과거 값이 이 값이어야 합니다"
+
+#: builtin/push.c:550
+msgid "check|on-demand|no"
+msgstr "check|on-demand|no"
+
+#: builtin/push.c:551
+msgid "control recursive pushing of submodules"
+msgstr "재귀적 하위 모듈 푸시 방식을 설정합니다"
+
+#: builtin/push.c:553 builtin/send-pack.c:169
+msgid "use thin pack"
+msgstr "얇은 묶음을 사용합니다"
+
+#: builtin/push.c:554 builtin/push.c:555 builtin/send-pack.c:158
+#: builtin/send-pack.c:159
+msgid "receive pack program"
+msgstr "receive pack 프로그램"
+
+#: builtin/push.c:556
+msgid "set upstream for git pull/status"
+msgstr "git pull/status에 대한 업스트림을 설정합니다"
+
+#: builtin/push.c:559
+msgid "prune locally removed refs"
+msgstr "로컬에서 제거한 레퍼런스를 잘라냅니다"
+
+#: builtin/push.c:561
+msgid "bypass pre-push hook"
+msgstr "푸시 전 후크를 건너뜁니다"
+
+#: builtin/push.c:562
+msgid "push missing but relevant tags"
+msgstr "빠졌지만 관련된 태그를 푸시합니다"
+
+#: builtin/push.c:565 builtin/send-pack.c:166
+msgid "GPG sign the push"
+msgstr "푸시에 GPG 서명"
+
+#: builtin/push.c:567 builtin/send-pack.c:170
+msgid "request atomic transaction on remote side"
+msgstr "리모트 쪽에 원자 트랜잭션을 요청합니다"
+
+#: builtin/push.c:577
+msgid "--delete is incompatible with --all, --mirror and --tags"
+msgstr "--delete 옵션은 --all, --mirror, --tags 옵션과 호환되지 않습니다"
+
+#: builtin/push.c:579
+msgid "--delete doesn't make sense without any refs"
+msgstr "--delete 옵션은 레퍼런스 없이 앞뒤가 맞지 않습니다"
+
+#: builtin/read-tree.c:37
+msgid ""
+"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
+"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
+"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
+msgstr "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<접두어>) [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--index-output=<파일>] (--empty | <트리-따위> [<트리-따위2> [<트리-따위3>]])"
+
+#: builtin/read-tree.c:110
+msgid "write resulting index to <file>"
+msgstr "결과 인덱스를 <파일>에 씁니다"
+
+#: builtin/read-tree.c:113
+msgid "only empty the index"
+msgstr "인덱스를 비우기만 합니다"
+
+#: builtin/read-tree.c:115
+msgid "Merging"
+msgstr "병합하기"
+
+#: builtin/read-tree.c:117
+msgid "perform a merge in addition to a read"
+msgstr "읽은 다음 병합을 수행합니다"
+
+#: builtin/read-tree.c:119
+msgid "3-way merge if no file level merging required"
+msgstr "파일 단위 병합이 필요하지 않으면 3-방향 병합을 합니다"
+
+#: builtin/read-tree.c:121
+msgid "3-way merge in presence of adds and removes"
+msgstr "추가와 제거가 있을 때 3-방향 병합을 합니다"
+
+#: builtin/read-tree.c:123
+msgid "same as -m, but discard unmerged entries"
+msgstr "-m과 동일하지만, 병합되지 않은 항목을 버립니다"
+
+#: builtin/read-tree.c:124
+msgid "<subdirectory>/"
+msgstr "<하위디렉터리>/"
+
+#: builtin/read-tree.c:125
+msgid "read the tree into the index under <subdirectory>/"
+msgstr "트리를 <하위디렉터리>/ 아래 인덱스로 읽습니다"
+
+#: builtin/read-tree.c:128
+msgid "update working tree with merge result"
+msgstr "작업 폴더를 병합 결과로 업데이트합니다"
+
+#: builtin/read-tree.c:130
+msgid "gitignore"
+msgstr "gitignore"
+
+#: builtin/read-tree.c:131
+msgid "allow explicitly ignored files to be overwritten"
+msgstr "무시하는 파일을 덮어쓰도록 명시적으로 허용합니다"
+
+#: builtin/read-tree.c:134
+msgid "don't check the working tree after merging"
+msgstr "병합 후에 작업 폴더를 확인하지 않습니다"
+
+#: builtin/read-tree.c:135
+msgid "don't update the index or the work tree"
+msgstr "인덱스나 작업 폴더를 업데이트하지 않습니다"
+
+#: builtin/read-tree.c:137
+msgid "skip applying sparse checkout filter"
+msgstr "드문 체크아웃 필터 적용을 건너뜁니다"
+
+#: builtin/read-tree.c:139
+msgid "debug unpack-trees"
+msgstr "unpack-trees 디버깅"
+
+#: builtin/reflog.c:428
+#, c-format
+msgid "'%s' for '%s' is not a valid timestamp"
+msgstr "'%s' 값이 '%s'에 대해 올바른 시각 값이 아닙니다"
+
+#: builtin/reflog.c:545 builtin/reflog.c:550
+#, c-format
+msgid "'%s' is not a valid timestamp"
+msgstr "'%s'은(는) 올바른 시각 값이 아닙니다"
+
+#: builtin/remote.c:12
+msgid "git remote [-v | --verbose]"
+msgstr "git remote [-v | --verbose]"
+
+#: builtin/remote.c:13
+msgid ""
+"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
+"mirror=<fetch|push>] <name> <url>"
+msgstr ""
+"git remote add [-t <브랜치>] [-m <master>] [-f] [--tags | --no-tags] [--"
+"mirror=<fetch|push>] <이름> <url>"
+
+#: builtin/remote.c:14 builtin/remote.c:34
+msgid "git remote rename <old> <new>"
+msgstr "git remote rename <옛이름> <새이름>"
+
+#: builtin/remote.c:15 builtin/remote.c:39
+msgid "git remote remove <name>"
+msgstr "git remote remove <이름>"
+
+#: builtin/remote.c:16 builtin/remote.c:44
+msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
+msgstr "git remote set-head <이름> (-a | --auto | -d | --delete | <브랜치>)"
+
+#: builtin/remote.c:17
+msgid "git remote [-v | --verbose] show [-n] <name>"
+msgstr "git remote [-v | --verbose] show [-n] <이름>"
+
+#: builtin/remote.c:18
+msgid "git remote prune [-n | --dry-run] <name>"
+msgstr "git remote prune [-n | --dry-run] <이름>"
+
+#: builtin/remote.c:19
+msgid ""
+"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+msgstr ""
+"git remote [-v | --verbose] update [-p | --prune] [(<그룹> | <리모트>)...]"
+
+#: builtin/remote.c:20
+msgid "git remote set-branches [--add] <name> <branch>..."
+msgstr "git remote set-branches [--add] <이름> <브랜치>..."
+
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr "git remote get-url [--push] [--all] <이름>"
+
+#: builtin/remote.c:22 builtin/remote.c:75
+msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
+msgstr "git remote set-url [--push] <이름> <새url> [<옛url>]"
+
+#: builtin/remote.c:23 builtin/remote.c:76
+msgid "git remote set-url --add <name> <newurl>"
+msgstr "git remote set-url --add <이름> <새url>"
+
+#: builtin/remote.c:24 builtin/remote.c:77
+msgid "git remote set-url --delete <name> <url>"
+msgstr "git remote set-url --delete <이름> <url>"
+
+#: builtin/remote.c:29
+msgid "git remote add [<options>] <name> <url>"
+msgstr "git remote add [<옵션>] <이름> <url>"
+
+#: builtin/remote.c:49
+msgid "git remote set-branches <name> <branch>..."
+msgstr "git remote set-branches <이름> <브랜치>..."
+
+#: builtin/remote.c:50
+msgid "git remote set-branches --add <name> <branch>..."
+msgstr "git remote set-branches --add <이름> <브랜치>..."
+
+#: builtin/remote.c:55
+msgid "git remote show [<options>] <name>"
+msgstr "git remote show [<옵션>] <이름>"
+
+#: builtin/remote.c:60
+msgid "git remote prune [<options>] <name>"
+msgstr "git remote prune [<옵션>] <이름>"
+
+#: builtin/remote.c:65
+msgid "git remote update [<options>] [<group> | <remote>]..."
+msgstr "git remote update [<옵션>] [<그룹> | <리모트>]..."
+
+#: builtin/remote.c:94
+#, c-format
+msgid "Updating %s"
+msgstr "%s 업데이트 중"
+
+#: builtin/remote.c:126
+msgid ""
+"--mirror is dangerous and deprecated; please\n"
+"\t use --mirror=fetch or --mirror=push instead"
+msgstr ""
+"--mirror는 위험하므로 사용을 권하지 않습니다. 대신에\n"
+"\t --mirror=fetch 또는 --mirror=push를 사용하십시오"
+
+#: builtin/remote.c:143
+#, c-format
+msgid "unknown mirror argument: %s"
+msgstr "알 수 없는 --mirror 옵션 인자: %s"
+
+#: builtin/remote.c:159
+msgid "fetch the remote branches"
+msgstr "리모트 브랜치를 가져옵니다"
+
+#: builtin/remote.c:161
+msgid "import all tags and associated objects when fetching"
+msgstr "가져올 때 모든 태그와 관련 오브젝트를 가져옵니다"
+
+#: builtin/remote.c:164
+msgid "or do not fetch any tag at all (--no-tags)"
+msgstr "아니면 아무 태그도 가져오지 않습니다 (--no-tags)"
+
+#: builtin/remote.c:166
+msgid "branch(es) to track"
+msgstr "추적할 브랜치"
+
+#: builtin/remote.c:167
+msgid "master branch"
+msgstr "마스터 브랜치"
+
+#: builtin/remote.c:168
+msgid "push|fetch"
+msgstr "push|fetch"
+
+#: builtin/remote.c:169
+msgid "set up remote as a mirror to push to or fetch from"
+msgstr "리모트를 푸시 또는 가져올 때 사용할 미러로 설정합니다"
+
+#: builtin/remote.c:181
+msgid "specifying a master branch makes no sense with --mirror"
+msgstr "--mirror 옵션과 같이 마스터 브랜치를 지정하면 앞뒤가 맞지 않습니다"
+
+#: builtin/remote.c:183
+msgid "specifying branches to track makes sense only with fetch mirrors"
+msgstr "마스터 브랜치를 지정은 fetch 미러에서만 앞뒤가 맞습니다"
+
+#: builtin/remote.c:193 builtin/remote.c:643
+#, c-format
+msgid "remote %s already exists."
+msgstr "%s 리모트가 이미 있습니다."
+
+#: builtin/remote.c:197 builtin/remote.c:647
+#, c-format
+msgid "'%s' is not a valid remote name"
+msgstr "'%s'은(는) 올바른 리모트 이름이 아닙니다"
+
+#: builtin/remote.c:241
+#, c-format
+msgid "Could not setup master '%s'"
+msgstr "마스터 '%s'을(를) 설정할 수 없습니다"
+
+#: builtin/remote.c:341
+#, c-format
+msgid "Could not get fetch map for refspec %s"
+msgstr "%s 레퍼런스명세에 대한 가져오기 맵을 얻을 수 없습니다"
+
+#: builtin/remote.c:442 builtin/remote.c:450
+msgid "(matching)"
+msgstr "(일치)"
+
+#: builtin/remote.c:454
+msgid "(delete)"
+msgstr "(삭제)"
+
+#: builtin/remote.c:594 builtin/remote.c:600 builtin/remote.c:606
+#, c-format
+msgid "Could not append '%s' to '%s'"
+msgstr "'%s'을(를) '%s'에 추가할 수 없습니다"
+
+#: builtin/remote.c:636 builtin/remote.c:775 builtin/remote.c:875
+#, c-format
+msgid "No such remote: %s"
+msgstr "그런 리모트가 없습니다: %s"
+
+#: builtin/remote.c:653
+#, c-format
+msgid "Could not rename config section '%s' to '%s'"
+msgstr "설정 섹션을 '%s'에서 '%s'(으)로 바꿀 수 없습니다"
+
+#: builtin/remote.c:659 builtin/remote.c:827
+#, c-format
+msgid "Could not remove config section '%s'"
+msgstr "설정 섹션 '%s'을(를) 제거할 수 없습니다"
+
+#: builtin/remote.c:674
+#, c-format
+msgid ""
+"Not updating non-default fetch refspec\n"
+"\t%s\n"
+"\tPlease update the configuration manually if necessary."
+msgstr ""
+"기본값이 아닌 가져오기 레퍼런스명세를 업데이트하지 않습니다\n"
+"\t%s\n"
+"\t필요하면 설정을 수동으로 업데이트하십시오."
+
+#: builtin/remote.c:680
+#, c-format
+msgid "Could not append '%s'"
+msgstr "'%s'에 덧붙일 수 없습니다"
+
+#: builtin/remote.c:691
+#, c-format
+msgid "Could not set '%s'"
+msgstr "'%s'을(를) 설정할 수 없습니다"
+
+#: builtin/remote.c:713
+#, c-format
+msgid "deleting '%s' failed"
+msgstr "'%s' 삭제가 실패했습니다"
+
+#: builtin/remote.c:747
+#, c-format
+msgid "creating '%s' failed"
+msgstr "'%s' 만들기가 실패했습니다"
+
+#: builtin/remote.c:813
+msgid ""
+"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
+"to delete it, use:"
+msgid_plural ""
+"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n"
+"to delete them, use:"
+msgstr[0] ""
+"알림: 레퍼런스/리모트/ 계층 구조 밖에 있는 일부 브랜치가 제거되지 않았습니다.\n"
+"삭제하려면 다음을 사용하십시오:"
+
+#: builtin/remote.c:928
+#, c-format
+msgid " new (next fetch will store in remotes/%s)"
+msgstr " 새 항목 (다음 가져오기는 remotes/%s 아래 저장됩니다)"
+
+#: builtin/remote.c:931
+msgid " tracked"
+msgstr " 추적됨"
+
+#: builtin/remote.c:933
+msgid " stale (use 'git remote prune' to remove)"
+msgstr " 오래됨 (제거하려면 'git remote prune'을 사용하십시오)"
+
+#: builtin/remote.c:935
+msgid " ???"
+msgstr " ???"
+
+#: builtin/remote.c:976
+#, c-format
+msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
+msgstr "잘못된 branch.%s.merge 값. 여러 개 브랜치로 리베이스할 수 없습니다"
+
+#: builtin/remote.c:983
+#, c-format
+msgid "rebases onto remote %s"
+msgstr "리베이스: 리모트 %s"
+
+#: builtin/remote.c:986
+#, c-format
+msgid " merges with remote %s"
+msgstr " 병합: 리모트 %s"
+
+#: builtin/remote.c:987
+msgid "    and with remote"
+msgstr "    그리고 리모트"
+
+#: builtin/remote.c:989
+#, c-format
+msgid "merges with remote %s"
+msgstr "병합: 리모트 %s"
+
+#: builtin/remote.c:990
+msgid "   and with remote"
+msgstr "   그리고 리모트"
+
+#: builtin/remote.c:1036
+msgid "create"
+msgstr "만들기"
+
+#: builtin/remote.c:1039
+msgid "delete"
+msgstr "삭제"
+
+#: builtin/remote.c:1043
+msgid "up to date"
+msgstr "최신 상태"
+
+#: builtin/remote.c:1046
+msgid "fast-forwardable"
+msgstr "정방향 진행 가능"
+
+#: builtin/remote.c:1049
+msgid "local out of date"
+msgstr "로컬이 뒤떨어짐"
+
+#: builtin/remote.c:1056
+#, c-format
+msgid "    %-*s forces to %-*s (%s)"
+msgstr "    %-*s에서 %-*s(으)로 강제 (%s)"
+
+#: builtin/remote.c:1059
+#, c-format
+msgid "    %-*s pushes to %-*s (%s)"
+msgstr "    %-*s에서 %-*s(으)로 푸시 (%s)"
+
+#: builtin/remote.c:1063
+#, c-format
+msgid "    %-*s forces to %s"
+msgstr "    %-*s에서 %s(으)로 강제"
+
+#: builtin/remote.c:1066
+#, c-format
+msgid "    %-*s pushes to %s"
+msgstr "    %-*s에서 %s(으)로 푸시"
+
+#: builtin/remote.c:1134
+msgid "do not query remotes"
+msgstr "리모트에 질의하지 않습니다"
+
+#: builtin/remote.c:1161
+#, c-format
+msgid "* remote %s"
+msgstr "* 리모트 %s"
+
+#: builtin/remote.c:1162
+#, c-format
+msgid "  Fetch URL: %s"
+msgstr "  가져오기 URL: %s"
+
+#: builtin/remote.c:1163 builtin/remote.c:1314
+msgid "(no URL)"
+msgstr "(URL 없음)"
+
+#: builtin/remote.c:1172 builtin/remote.c:1174
+#, c-format
+msgid "  Push  URL: %s"
+msgstr "  푸시  URL: %s"
+
+#: builtin/remote.c:1176 builtin/remote.c:1178 builtin/remote.c:1180
+#, c-format
+msgid "  HEAD branch: %s"
+msgstr "  HEAD 브랜치: %s"
+
+#: builtin/remote.c:1182
+#, c-format
+msgid ""
+"  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
+msgstr "  HEAD 브랜치 (리모트 HEAD는 애매하고, 다음 중 하나일 수 있습니다):\n"
+
+#: builtin/remote.c:1194
+#, c-format
+msgid "  Remote branch:%s"
+msgid_plural "  Remote branches:%s"
+msgstr[0] "  리모트 브랜치:%s"
+
+#: builtin/remote.c:1197 builtin/remote.c:1224
+msgid " (status not queried)"
+msgstr " (상태를 질의하지 않음)"
+
+#: builtin/remote.c:1206
+msgid "  Local branch configured for 'git pull':"
+msgid_plural "  Local branches configured for 'git pull':"
+msgstr[0] "  'git pull'에 사용할 로컬 브랜치를 설정:"
+
+#: builtin/remote.c:1214
+msgid "  Local refs will be mirrored by 'git push'"
+msgstr "  로컬 레퍼런스를 'git push'로 미러링할 예정"
+
+#: builtin/remote.c:1221
+#, c-format
+msgid "  Local ref configured for 'git push'%s:"
+msgid_plural "  Local refs configured for 'git push'%s:"
+msgstr[0] "  로컬 레퍼런스를 'git push'로 미러링%s:"
+
+#: builtin/remote.c:1242
+msgid "set refs/remotes/<name>/HEAD according to remote"
+msgstr "레퍼런스/리모트/<이름>/HEAD 값을 리모트에 맞게 설정합니다"
+
+#: builtin/remote.c:1244
+msgid "delete refs/remotes/<name>/HEAD"
+msgstr "레퍼런스/리모트/<이름>/HEAD 값을 삭제합니다"
+
+#: builtin/remote.c:1259
+msgid "Cannot determine remote HEAD"
+msgstr "리모트 HEAD를 결정할 수 없습니다"
+
+#: builtin/remote.c:1261
+msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
+msgstr "리모트 HEAD 브랜치가 여러개입니다. 다음 중 하나를 명시적으로 지정하십시오:"
+
+#: builtin/remote.c:1271
+#, c-format
+msgid "Could not delete %s"
+msgstr "%s을(를) 삭제할 수 없습니다"
+
+#: builtin/remote.c:1279
+#, c-format
+msgid "Not a valid ref: %s"
+msgstr "올바른 레퍼런스가 아닙니다: %s"
+
+#: builtin/remote.c:1281
+#, c-format
+msgid "Could not setup %s"
+msgstr "%s을(를) 설정할 수 없습니다"
+
+#: builtin/remote.c:1299
+#, c-format
+msgid " %s will become dangling!"
+msgstr " %s의 연결이 끊어집니다!"
+
+#: builtin/remote.c:1300
+#, c-format
+msgid " %s has become dangling!"
+msgstr " %s의 연결이 끊어졌습니다!"
+
+#: builtin/remote.c:1310
+#, c-format
+msgid "Pruning %s"
+msgstr "잘라냄: %s"
+
+#: builtin/remote.c:1311
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: builtin/remote.c:1327
+#, c-format
+msgid " * [would prune] %s"
+msgstr " * [잘라낼 예정] %s"
+
+#: builtin/remote.c:1330
+#, c-format
+msgid " * [pruned] %s"
+msgstr " * [잘라냄] %s"
+
+#: builtin/remote.c:1375
+msgid "prune remotes after fetching"
+msgstr "가져온 후에 리모트를 잘라냅니다"
+
+#: builtin/remote.c:1441 builtin/remote.c:1498 builtin/remote.c:1566
+#, c-format
+msgid "No such remote '%s'"
+msgstr "그런 리모트가 없습니다 ('%s')"
+
+#: builtin/remote.c:1461
+msgid "add branch"
+msgstr "브랜치를 추가합니다"
+
+#: builtin/remote.c:1468
+msgid "no remote specified"
+msgstr "리모트를 지정하지 않았습니다"
+
+#: builtin/remote.c:1485
+msgid "query push URLs rather than fetch URLs"
+msgstr "가져오기 URL이 아니라 푸시 URL을 질의합니다"
+
+#: builtin/remote.c:1487
+msgid "return all URLs"
+msgstr "모든 URL을 리턴합니다"
+
+#: builtin/remote.c:1515
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr "'%s' 리모트에 대한 URL을 설정하지 않았습니다"
+
+#: builtin/remote.c:1541
+msgid "manipulate push URLs"
+msgstr "푸시 URL을 지정합니다"
+
+#: builtin/remote.c:1543
+msgid "add URL"
+msgstr "URL을 추가합니다"
+
+#: builtin/remote.c:1545
+msgid "delete URLs"
+msgstr "URL을 삭제합니다"
+
+#: builtin/remote.c:1552
+msgid "--add --delete doesn't make sense"
+msgstr "--add --delete 옵션을 둘다 쓰면 안 됩니다"
+
+#: builtin/remote.c:1592
+#, c-format
+msgid "Invalid old URL pattern: %s"
+msgstr "잘못된 오래전 URL 패턴: %s"
+
+#: builtin/remote.c:1600
+#, c-format
+msgid "No such URL found: %s"
+msgstr "그런 URL이 없습니다: %s"
+
+#: builtin/remote.c:1602
+msgid "Will not delete all non-push URLs"
+msgstr "푸시용이 아닌 모든 URL을 삭제하지 않습니다"
+
+#: builtin/remote.c:1616
+msgid "be verbose; must be placed before a subcommand"
+msgstr "자세히 표시합니다 (하위 명령 앞에 와야 합니다)"
+
+#: builtin/repack.c:17
+msgid "git repack [<options>]"
+msgstr "git repack [<옵션>]"
+
+#: builtin/repack.c:159
+msgid "pack everything in a single pack"
+msgstr "하나의 묶음 안에 모두 묶습니다"
+
+#: builtin/repack.c:161
+msgid "same as -a, and turn unreachable objects loose"
+msgstr "-a와 동일하고, 접근 불가능 오브젝트를 느슨하게 바꿉니다"
+
+#: builtin/repack.c:164
+msgid "remove redundant packs, and run git-prune-packed"
+msgstr "여분의 묶음을 제거하고, git-prune-packed를 실행합니다"
+
+#: builtin/repack.c:166
+msgid "pass --no-reuse-delta to git-pack-objects"
+msgstr "git-pack-objects에 --no-reuse-delta 옵션을 넘깁니다"
+
+#: builtin/repack.c:168
+msgid "pass --no-reuse-object to git-pack-objects"
+msgstr "git-pack-objects에 --no-reuse-object 옵션을 넘깁니다"
+
+#: builtin/repack.c:170
+msgid "do not run git-update-server-info"
+msgstr "git-update-server-info를 실행하지 않습니다"
+
+#: builtin/repack.c:173
+msgid "pass --local to git-pack-objects"
+msgstr "git-pack-objects에 --local 옵션을 넘깁니다"
+
+#: builtin/repack.c:175
+msgid "write bitmap index"
+msgstr "비트맵 인덱스를 씁니다"
+
+#: builtin/repack.c:176
+msgid "approxidate"
+msgstr "대략의시각"
+
+#: builtin/repack.c:177
+msgid "with -A, do not loosen objects older than this"
+msgstr "-A에 추가로, 지정한 시각보다 오래된 오브젝트를 느슨하게 만들지 않습니다"
+
+#: builtin/repack.c:179
+msgid "size of the window used for delta compression"
+msgstr "델타 압축에 사용할 윈도우 크기"
+
+#: builtin/repack.c:180 builtin/repack.c:184
+msgid "bytes"
+msgstr "바이트수"
+
+#: builtin/repack.c:181
+msgid "same as the above, but limit memory size instead of entries count"
+msgstr "위와 동일하지만, 항목 수 대신 메모리 크기를 제한합니다"
+
+#: builtin/repack.c:183
+msgid "limits the maximum delta depth"
+msgstr "최대 델타 깊이를 제한합니다"
+
+#: builtin/repack.c:185
+msgid "maximum size of each packfile"
+msgstr "묶음 파일의 최대 크기"
+
+#: builtin/repack.c:187
+msgid "repack objects in packs marked with .keep"
+msgstr ".keep으로 표시된 묶음의 오브젝트를 다시 묶습니다"
+
+#: builtin/repack.c:197
+msgid "cannot delete packs in a precious-objects repo"
+msgstr "precious-objects 저장소의 묶음을 삭제할 수 없습니다"
+
+#: builtin/repack.c:381
+#, c-format
+msgid "removing '%s' failed"
+msgstr "'%s' 제거가 실패했습니다"
+
+#: builtin/replace.c:19
+msgid "git replace [-f] <object> <replacement>"
+msgstr "git replace [-f] <오브젝트> <대체이름>"
+
+#: builtin/replace.c:20
+msgid "git replace [-f] --edit <object>"
+msgstr "git replace [-f] --edit <오브젝트>"
+
+#: builtin/replace.c:21
+msgid "git replace [-f] --graft <commit> [<parent>...]"
+msgstr "git replace [-f] --graft <커밋> [<상위>...]"
+
+#: builtin/replace.c:22
+msgid "git replace -d <object>..."
+msgstr "git replace -d <오브젝트>..."
+
+#: builtin/replace.c:23
+msgid "git replace [--format=<format>] [-l [<pattern>]]"
+msgstr "git replace [--format=<형식>] [-l [<패턴>]]"
+
+#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#, c-format
+msgid "Not a valid object name: '%s'"
+msgstr "올바른 오브젝트 이름이 아닙니다: '%s'"
+
+#: builtin/replace.c:355
+#, c-format
+msgid "bad mergetag in commit '%s'"
+msgstr "커밋 '%s'에 잘못된 병합태그"
+
+#: builtin/replace.c:357
+#, c-format
+msgid "malformed mergetag in commit '%s'"
+msgstr "커밋 '%s'에 잘못된 형식의 병합태그"
+
+#: builtin/replace.c:368
+#, c-format
+msgid ""
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
+msgstr "본래 커밋 '%s'에 버려진 병합태그 '%s'이(가) 들어 있습니다. --graft 대신 --edit 옵션을 사용하십시오"
+
+#: builtin/replace.c:401
+#, c-format
+msgid "the original commit '%s' has a gpg signature."
+msgstr "본래 커밋 '%s'에 GPG 서명이 있습니다."
+
+#: builtin/replace.c:402
+msgid "the signature will be removed in the replacement commit!"
+msgstr "대체 커밋에서 서명을 제거합니다!"
+
+#: builtin/replace.c:408
+#, c-format
+msgid "could not write replacement commit for: '%s'"
+msgstr "다음에 대한 대체 커밋을 쓸 수 없습니다: '%s'"
+
+#: builtin/replace.c:432
+msgid "list replace refs"
+msgstr "대체 레퍼런스 목록을 표시합니다"
+
+#: builtin/replace.c:433
+msgid "delete replace refs"
+msgstr "대체 레퍼런스를 삭제합니다"
+
+#: builtin/replace.c:434
+msgid "edit existing object"
+msgstr "현재 오브젝트를 편집합니다"
+
+#: builtin/replace.c:435
+msgid "change a commit's parents"
+msgstr "커밋의 상위 항목을 바꿉니다"
+
+#: builtin/replace.c:436
+msgid "replace the ref if it exists"
+msgstr "레퍼런스가 있으면 대체합니다"
+
+#: builtin/replace.c:437
+msgid "do not pretty-print contents for --edit"
+msgstr "--edit에 대한 내용을 예쁘게 표시하지 않습니다"
+
+#: builtin/replace.c:438
+msgid "use this format"
+msgstr "이 형식을 사용합니다"
+
+#: builtin/rerere.c:12
+msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
+msgstr "git rerere [clear | forget <경로>... | status | remaining | diff | gc]"
+
+#: builtin/rerere.c:58
+msgid "register clean resolutions in index"
+msgstr "인덱스에 깔끔한 해결을 등록합니다"
+
+#: builtin/reset.c:26
+msgid ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
+msgstr "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<커밋>]"
+
+#: builtin/reset.c:27
+msgid "git reset [-q] <tree-ish> [--] <paths>..."
+msgstr "git reset [-q] <트리-따위> [--] <경로>..."
+
+#: builtin/reset.c:28
+msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
+msgstr "git reset --patch [<트리-따위>] [--] [<경로>...]"
+
+#: builtin/reset.c:34
+msgid "mixed"
+msgstr "혼합"
+
+#: builtin/reset.c:34
+msgid "soft"
+msgstr "소프트"
+
+#: builtin/reset.c:34
+msgid "hard"
+msgstr "하드"
+
+#: builtin/reset.c:34
+msgid "merge"
+msgstr "병합"
+
+#: builtin/reset.c:34
+msgid "keep"
+msgstr "유지"
+
+#: builtin/reset.c:74
+msgid "You do not have a valid HEAD."
+msgstr "올바른 HEAD가 없습니다."
+
+#: builtin/reset.c:76
+msgid "Failed to find tree of HEAD."
+msgstr "HEAD의 트리를 찾는데 실패했습니다."
+
+#: builtin/reset.c:82
+#, c-format
+msgid "Failed to find tree of %s."
+msgstr "%s의 트리를 찾는데 실패했습니다."
+
+#: builtin/reset.c:100
+#, c-format
+msgid "HEAD is now at %s"
+msgstr "HEAD의 현재 위치는 %s입니다"
+
+#: builtin/reset.c:183
+#, c-format
+msgid "Cannot do a %s reset in the middle of a merge."
+msgstr "병합 중에 %s 리셋을 할 수 없습니다."
+
+#: builtin/reset.c:276
+msgid "be quiet, only report errors"
+msgstr "간략히 표시, 오류만 표시합니다"
+
+#: builtin/reset.c:278
+msgid "reset HEAD and index"
+msgstr "HEAD와 인덱스를 리셋합니다"
+
+#: builtin/reset.c:279
+msgid "reset only HEAD"
+msgstr "HEAD만 리셋합니다"
+
+#: builtin/reset.c:281 builtin/reset.c:283
+msgid "reset HEAD, index and working tree"
+msgstr "HEAD, 인덱스, 작업폴더를 리셋합니다"
+
+#: builtin/reset.c:285
+msgid "reset HEAD but keep local changes"
+msgstr "HEAD를 리셋하지만 로컬 변경 사항을 남겨둡니다"
+
+#: builtin/reset.c:288
+msgid "record only the fact that removed paths will be added later"
+msgstr "제거한 경로를 나중에 추가한다는 사실만 기록합니다"
+
+#: builtin/reset.c:305
+#, c-format
+msgid "Failed to resolve '%s' as a valid revision."
+msgstr "'%s'을(를) 올바른 리비전으로 찾는데 실패했습니다."
+
+#: builtin/reset.c:313
+#, c-format
+msgid "Failed to resolve '%s' as a valid tree."
+msgstr "'%s'을(를) 올바른 트리로 찾는데 실패했습니다."
+
+#: builtin/reset.c:322
+msgid "--patch is incompatible with --{hard,mixed,soft}"
+msgstr "--patch 옵션은 --{hard,mixed,soft} 옵션과 호환되지 않습니다"
+
+#: builtin/reset.c:331
+msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
+msgstr "--mixed 옵션을 경로와 같이 쓰기는 제거될 예정입니다. 대신에 'git reset -- <경로>'를 사용하십시오."
+
+#: builtin/reset.c:333
+#, c-format
+msgid "Cannot do %s reset with paths."
+msgstr "경로와 같이 %s 리셋을 할 수 없습니다."
+
+#: builtin/reset.c:343
+#, c-format
+msgid "%s reset is not allowed in a bare repository"
+msgstr "%s 리셋은 간략한 저장소에서만 쓸 수 있습니다"
+
+#: builtin/reset.c:347
+msgid "-N can only be used with --mixed"
+msgstr "-N 옵션은 --mixed 옵션과 같이 써야만 합니다"
+
+#: builtin/reset.c:364
+msgid "Unstaged changes after reset:"
+msgstr "리셋 뒤에 스테이징하지 않은 변경 사항:"
+
+#: builtin/reset.c:370
+#, c-format
+msgid "Could not reset index file to revision '%s'."
+msgstr "인덱스 파일을 '%s' 리비전으로 리셋할 수 없습니다."
+
+#: builtin/reset.c:374
+msgid "Could not write new index file."
+msgstr "새 인덱스 파일을 쓸 수 없습니다."
+
+#: builtin/rev-list.c:354
+msgid "rev-list does not support display of notes"
+msgstr "rev-list는 노트 표시를 지원하지 않습니다"
+
+#: builtin/rev-parse.c:358
+msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
+msgstr "git rev-parse --parseopt [<옵션>] -- [<인자>...]"
+
+#: builtin/rev-parse.c:363
+msgid "keep the `--` passed as an arg"
+msgstr "인자로 넘긴 `--`를 유지합니다"
+
+#: builtin/rev-parse.c:365
+msgid "stop parsing after the first non-option argument"
+msgstr "첫번째 옵션이 아닌 인자 뒤에 파싱을 중지합니다"
+
+#: builtin/rev-parse.c:368
+msgid "output in stuck long form"
+msgstr "stuck long 형식으로 출력합니다"
+
+#: builtin/rev-parse.c:499
+msgid ""
+"git rev-parse --parseopt [<options>] -- [<args>...]\n"
+"   or: git rev-parse --sq-quote [<arg>...]\n"
+"   or: git rev-parse [<options>] [<arg>...]\n"
+"\n"
+"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
+msgstr ""
+"git rev-parse --parseopt [<옵션>] -- [<인자>...]\n"
+"   or: git rev-parse --sq-quote [<인자>...]\n"
+"   or: git rev-parse [<옵션>] [<인자>...]\n"
+"\n"
+"첫번째 사용방법에 대해 자세히 알고 싶으면, \"git rev-parse --parseopt -h\"를\n"
+"실행해 보십시오."
+
+#: builtin/revert.c:22
+msgid "git revert [<options>] <commit-ish>..."
+msgstr "git revert [<옵션>] <커밋-따위>..."
+
+#: builtin/revert.c:23
+msgid "git revert <subcommand>"
+msgstr "git revert <하위명령>"
+
+#: builtin/revert.c:28
+msgid "git cherry-pick [<options>] <commit-ish>..."
+msgstr "git cherry-pick [<옵션>] <커밋-따위>..."
+
+#: builtin/revert.c:29
+msgid "git cherry-pick <subcommand>"
+msgstr "git cherry-pick <하위명령>"
+
+#: builtin/revert.c:71
+#, c-format
+msgid "%s: %s cannot be used with %s"
+msgstr "%s: %s은(는) %s와(과) 같이 쓸 수 없습니다"
+
+#: builtin/revert.c:80
+msgid "end revert or cherry-pick sequence"
+msgstr "되돌리기 또는 커밋 빼오기 연속을 끝냅니다"
+
+#: builtin/revert.c:81
+msgid "resume revert or cherry-pick sequence"
+msgstr "되돌리기 또는 커밋 빼오기 연속을 계속합니다"
+
+#: builtin/revert.c:82
+msgid "cancel revert or cherry-pick sequence"
+msgstr "되돌리기 또는 커밋 빼오기 연속을 취소합니다"
+
+#: builtin/revert.c:83
+msgid "don't automatically commit"
+msgstr "자동으로 커밋하지 않습니다"
+
+#: builtin/revert.c:84
+msgid "edit the commit message"
+msgstr "커밋 메시지를 편집합니다"
+
+#: builtin/revert.c:87
+msgid "parent number"
+msgstr "이전 커밋 번호"
+
+#: builtin/revert.c:89
+msgid "merge strategy"
+msgstr "병합 전략"
+
+#: builtin/revert.c:90
+msgid "option"
+msgstr "옵션"
+
+#: builtin/revert.c:91
+msgid "option for merge strategy"
+msgstr "병합 전략 옵션"
+
+#: builtin/revert.c:104
+msgid "append commit name"
+msgstr "커밋 이름을 뒤에 붙입니다"
+
+#: builtin/revert.c:106
+msgid "preserve initially empty commits"
+msgstr "최초 빈 커밋을 유지합니다"
+
+#: builtin/revert.c:107
+msgid "allow commits with empty messages"
+msgstr "빈 메시지로 커밋을 허용합니다"
+
+#: builtin/revert.c:108
+msgid "keep redundant, empty commits"
+msgstr "여분의 빈 커밋을 유지합니다"
+
+#: builtin/revert.c:112
+msgid "program error"
+msgstr "프로그램 오류"
+
+#: builtin/revert.c:197
+msgid "revert failed"
+msgstr "되돌리기 실패"
+
+#: builtin/revert.c:212
+msgid "cherry-pick failed"
+msgstr "cherry-pick 실패"
+
+#: builtin/rm.c:17
+msgid "git rm [<options>] [--] <file>..."
+msgstr "git rm [<옵션>] [--] <파일>..."
+
+#: builtin/rm.c:65
+msgid ""
+"the following submodule (or one of its nested submodules)\n"
+"uses a .git directory:"
+msgid_plural ""
+"the following submodules (or one of their nested submodules)\n"
+"use a .git directory:"
+msgstr[0] ""
+"다음 하위 모듈이 (또는 그 내부 하위 모듈이) .git\n"
+"디렉터리를 사용합니다:"
+
+#: builtin/rm.c:71
+msgid ""
+"\n"
+"(use 'rm -rf' if you really want to remove it including all of its history)"
+msgstr "\n(정말로 그 커밋 내역까지 포함해 제거하려면 'rm -rf'를 사용하십시오)"
+
+#: builtin/rm.c:230
+msgid ""
+"the following file has staged content different from both the\n"
+"file and the HEAD:"
+msgid_plural ""
+"the following files have staged content different from both the\n"
+"file and the HEAD:"
+msgstr[0] ""
+"다음 파일에 파일과 HEAD 모두 다른 스테이징한 내용이\n"
+"있습니다:"
+
+#: builtin/rm.c:235
+msgid ""
+"\n"
+"(use -f to force removal)"
+msgstr ""
+"\n"
+"(강제로 제거하려면 -f 옵션을 사용하십시오)"
+
+#: builtin/rm.c:239
+msgid "the following file has changes staged in the index:"
+msgid_plural "the following files have changes staged in the index:"
+msgstr[0] "다음 파일이 인덱스에 스테이징한 변경 사항이 있습니다:"
+
+#: builtin/rm.c:243 builtin/rm.c:254
+msgid ""
+"\n"
+"(use --cached to keep the file, or -f to force removal)"
+msgstr "\n(파일을 유지하려면 --cached 옵션, 강제로 제거하려면 -f 옵션을 사용하십시오)"
+
+#: builtin/rm.c:251
+msgid "the following file has local modifications:"
+msgid_plural "the following files have local modifications:"
+msgstr[0] "다음 파일에 로컬 수정 사항이 있습니다:"
+
+#: builtin/rm.c:269
+msgid "do not list removed files"
+msgstr "제거한 파일 목록을 표시하지 않습니다"
+
+#: builtin/rm.c:270
+msgid "only remove from the index"
+msgstr "인덱스에서만 제거합니다"
+
+#: builtin/rm.c:271
+msgid "override the up-to-date check"
+msgstr "최신 버전 확인을 하지 않습니다"
+
+#: builtin/rm.c:272
+msgid "allow recursive removal"
+msgstr "재귀적 제거를 허용합니다"
+
+#: builtin/rm.c:274
+msgid "exit with a zero status even if nothing matched"
+msgstr "아무 것도 일치하지 않으면 상태 0번으로 끝납니다"
+
+#: builtin/rm.c:317
+msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+msgstr "계속하려면 .gitmodules의 변경 사항을 스테이징하거나 stash하십시오"
+
+#: builtin/rm.c:335
+#, c-format
+msgid "not removing '%s' recursively without -r"
+msgstr "-r 옵션이 없으면 재귀적으로 '%s'을(를) 제거하지 않습니다"
+
+#: builtin/rm.c:374
+#, c-format
+msgid "git rm: unable to remove %s"
+msgstr "git rm: %s을(를) 제거할 수 없습니다"
+
+#: builtin/send-pack.c:18
+msgid ""
+"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
+"receive-pack>] [--verbose] [--thin] [--atomic] [<host>:]<directory> "
+"[<ref>...]\n"
+"  --all and explicit <ref> specification are mutually exclusive."
+msgstr ""
+"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [--atomic] [<호스트>:]<디렉터리> [<레퍼런스>...]\n"
+"  --all 옵션과 명시적인 <레퍼런스> 명세 중 하나만 사용할 수 있습니다."
+
+#: builtin/send-pack.c:160
+msgid "remote name"
+msgstr "리모트 이름"
+
+#: builtin/send-pack.c:171
+msgid "use stateless RPC protocol"
+msgstr "상태 없는 RPC 프로토콜을 사용합니다"
+
+#: builtin/send-pack.c:172
+msgid "read refs from stdin"
+msgstr "표준 입력에서 레퍼런스를 읽습니다"
+
+#: builtin/send-pack.c:173
+msgid "print status from remote helper"
+msgstr "리모트 도움 프로그램의 상태를 표시합니다"
+
+#: builtin/shortlog.c:13
+msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
+msgstr "git shortlog [<옵션>] [<리비전-범위>] [[--] [<경로>...]]"
+
+#: builtin/shortlog.c:131
+#, c-format
+msgid "Missing author: %s"
+msgstr "작성자 정보가 없습니다: %s"
+
+#: builtin/shortlog.c:230
+msgid "sort output according to the number of commits per author"
+msgstr "작성자별 커밋 수에 따라 정렬합니다"
+
+#: builtin/shortlog.c:232
+msgid "Suppress commit descriptions, only provides commit count"
+msgstr "커밋 설명을 생략하고, 커밋 수만 표시합니다"
+
+#: builtin/shortlog.c:234
+msgid "Show the email address of each author"
+msgstr "작성자의 전자메일 주소를 표시합니다"
+
+#: builtin/shortlog.c:235
+msgid "w[,i1[,i2]]"
+msgstr "w[,i1[,i2]]"
+
+#: builtin/shortlog.c:236
+msgid "Linewrap output"
+msgstr "줄바꿈 출력"
+
+#: builtin/show-branch.c:10
+msgid ""
+"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
+"\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
+"\t\t[--more=<n> | --list | --independent | --merge-base]\n"
+"\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]"
+msgstr ""
+"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
+"\t\t[--current] [--color[=<시각>] | --no-color] [--sparse]\n"
+"\t\t[--more=<n> | --list | --independent | --merge-base]\n"
+"\t\t[--no-name | --sha1-name] [--topics] [(<리비전> | <glob>)...]"
+
+#: builtin/show-branch.c:14
+msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
+msgstr "git show-branch (-g | --reflog)[=<n>[,<베이스>]] [--list] [<레퍼런스>]"
+
+#: builtin/show-branch.c:640
+msgid "show remote-tracking and local branches"
+msgstr "리모트 추적 및 로컬 브랜치를 표시합니다"
+
+#: builtin/show-branch.c:642
+msgid "show remote-tracking branches"
+msgstr "리모트 추적 브랜치를 표시합니다"
+
+#: builtin/show-branch.c:644
+msgid "color '*!+-' corresponding to the branch"
+msgstr "브랜치에 따른 '*!+-' 표시에 색을 입힙니다"
+
+#: builtin/show-branch.c:646
+msgid "show <n> more commits after the common ancestor"
+msgstr "공통 이전 커밋 뒤의 <n>개의 커밋을 표시합니다"
+
+#: builtin/show-branch.c:648
+msgid "synonym to more=-1"
+msgstr "--more=-1 옵션과 동일"
+
+#: builtin/show-branch.c:649
+msgid "suppress naming strings"
+msgstr "이름 문자열을 표시하지 않습니다"
+
+#: builtin/show-branch.c:651
+msgid "include the current branch"
+msgstr "현재 브랜치를 포함"
+
+#: builtin/show-branch.c:653
+msgid "name commits with their object names"
+msgstr "커밋의 이름을 그 오브젝트 이름으로 붙입니다"
+
+#: builtin/show-branch.c:655
+msgid "show possible merge bases"
+msgstr "가능한 병합 기준점을 표시합니다"
+
+#: builtin/show-branch.c:657
+msgid "show refs unreachable from any other ref"
+msgstr "다른 어떤 레퍼런스에서도 접근 불가능한 레퍼런스를 표시합니다"
+
+#: builtin/show-branch.c:659
+msgid "show commits in topological order"
+msgstr "위상 순서에 따라 커밋을 표시합니다"
+
+#: builtin/show-branch.c:662
+msgid "show only commits not on the first branch"
+msgstr "첫 브랜치에 없는 커밋만 표시합니다"
+
+#: builtin/show-branch.c:664
+msgid "show merges reachable from only one tip"
+msgstr "하나의 끝에서만 접근 가능한 병합을 표시합니다"
+
+#: builtin/show-branch.c:666
+msgid "topologically sort, maintaining date order where possible"
+msgstr "가능하면 시간 순서를 유지하면서 위상 순서로 정렬"
+
+#: builtin/show-branch.c:669
+msgid "<n>[,<base>]"
+msgstr "<n>[,<베이스>]"
+
+#: builtin/show-branch.c:670
+msgid "show <n> most recent ref-log entries starting at base"
+msgstr "기준부터 시작해 최대 <n>개의 최근 ref-log 항목을 표시합니다"
+
+#: builtin/show-ref.c:10
+msgid ""
+"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
+"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]"
+msgstr ""
+"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
+"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<패턴>...]"
+
+#: builtin/show-ref.c:11
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr "git show-ref --exclude-existing[=<패턴>]"
+
+#: builtin/show-ref.c:165
+msgid "only show tags (can be combined with heads)"
+msgstr "태그만 표시 (헤드와 결합 가능)"
+
+#: builtin/show-ref.c:166
+msgid "only show heads (can be combined with tags)"
+msgstr "헤드만 표시 (태그와 결합 가능)"
+
+#: builtin/show-ref.c:167
+msgid "stricter reference checking, requires exact ref path"
+msgstr "더 엄격한 레퍼런스 검사, 정확히 하나의 레퍼런스 경로 필요"
+
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
+msgid "show the HEAD reference, even if it would be filtered out"
+msgstr "HEAD 레퍼런스를 표시합니다 (필터링되서 제외되더라도)"
+
+#: builtin/show-ref.c:174
+msgid "dereference tags into object IDs"
+msgstr "태그를 오브젝트 ID로 따라갑니다"
+
+#: builtin/show-ref.c:176
+msgid "only show SHA1 hash using <n> digits"
+msgstr "SHA-1 표시에 <n>개의 숫자만 사용합니다"
+
+#: builtin/show-ref.c:180
+msgid "do not print results to stdout (useful with --verify)"
+msgstr "표준 출력에 결과를 표시하지 않습니다 (--verify 옵션과 사용하면 좋음)"
+
+#: builtin/show-ref.c:182
+msgid "show refs from stdin that aren't in local repository"
+msgstr "로컬 저장소에 없는 레퍼런스를 표준 입력에서 읽어 표시합니다"
+
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr "git stripspace [-s | --strip-comments]"
+
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr "git stripspace [-c | --comment-lines]"
+
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr "주석 문자로 시작하는 모든 줄을 건너뛰고 제거합니다"
+
+#: builtin/stripspace.c:38
+msgid "prepend comment character and blank to each line"
+msgstr "각 줄의 앞에 주석 문자를 붙이고 빈 줄로 만듭니다"
+
+#: builtin/submodule--helper.c:79 builtin/submodule--helper.c:167
+msgid "alternative anchor for relative paths"
+msgstr "상대 경로에 사용할 또다른 기준"
+
+#: builtin/submodule--helper.c:84
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper list [--prefix=<경로>] [<경로>...]"
+
+#: builtin/submodule--helper.c:114
+msgid "git submodule--helper name <path>"
+msgstr "git submodule--helper name <경로>"
+
+#: builtin/submodule--helper.c:120
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr "경로 '%s'에 대해 .gitmodules에 있는 하위모듈 매핑이 없습니다"
+
+#: builtin/submodule--helper.c:170
+msgid "where the new submodule will be cloned to"
+msgstr "새 하위 모듈을 복제할 대상 위치"
+
+#: builtin/submodule--helper.c:173
+msgid "name of the new submodule"
+msgstr "새 하위 모듈 이름"
+
+#: builtin/submodule--helper.c:176
+msgid "url where to clone the submodule from"
+msgstr "하위 모듈을 복제해 올 URL"
+
+#: builtin/submodule--helper.c:182
+msgid "depth for shallow clones"
+msgstr "얕은 복제에 사용할 깊이"
+
+#: builtin/submodule--helper.c:188
+msgid ""
+"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
+"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+msgstr ""
+"git submodule--helper clone [--prefix=<경로>] [--quiet] [--reference <저장소"
+">] [--name <이름>] [--url <URL>][--depth <깊이>] [--] [<경로>...]"
+
+#: builtin/submodule--helper.c:202 builtin/submodule--helper.c:208
+#: builtin/submodule--helper.c:216
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "'%s' 디렉터리를 만들 수 없습니다"
+
+#: builtin/submodule--helper.c:204
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr "'%s'에서 하위 모듈 경로 '%s'에 복제하는데 실패했습니다"
+
+#: builtin/submodule--helper.c:227
+#, c-format
+msgid "cannot open file '%s'"
+msgstr "'%s' 파일을 열 수 없습니다"
+
+#: builtin/submodule--helper.c:232
+#, c-format
+msgid "could not close file %s"
+msgstr "%s 파일을 닫을 수 없습니다"
+
+#: builtin/submodule--helper.c:247
+#, c-format
+msgid "could not get submodule directory for '%s'"
+msgstr "'%s'에 대한 하위 모듈 디렉터리를 가져올 수 없습니다"
+
+#: builtin/submodule--helper.c:273
+msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+msgstr ""
+"치명적 이상: submodule--helper 하위 명령은 하위 명령으로 호출해야 합니다"
+
+#: builtin/submodule--helper.c:280
+#, c-format
+msgid "fatal: '%s' is not a valid submodule--helper subcommand"
+msgstr "치명적 이상: '%s'은(는) 올바른 submodule--helper 하위 명령이 아닙니다"
+
+#: builtin/symbolic-ref.c:7
+msgid "git symbolic-ref [<options>] <name> [<ref>]"
+msgstr "git symbolic-ref [<옵션>] <이름> [<레퍼런스>]"
+
+#: builtin/symbolic-ref.c:8
+msgid "git symbolic-ref -d [-q] <name>"
+msgstr "git symbolic-ref -d [-q] <이름>"
+
+#: builtin/symbolic-ref.c:40
+msgid "suppress error message for non-symbolic (detached) refs"
+msgstr "심볼이 아닌 (분리된) 레퍼런스에 대해 에러 메시지를 표시하지 않습니다"
+
+#: builtin/symbolic-ref.c:41
+msgid "delete symbolic ref"
+msgstr "심볼릭 레퍼런스를 삭제합니다"
+
+#: builtin/symbolic-ref.c:42
+msgid "shorten ref output"
+msgstr "레퍼런스 출력을 줄입니다"
+
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
+msgid "reason"
+msgstr "이유"
+
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
+msgid "reason of the update"
+msgstr "업데이트의 이유"
+
+#: builtin/tag.c:23
+msgid ""
+"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
+"[<head>]"
+msgstr ""
+"git tag [-a | -s | -u <키-ID>] [-f] [-m <메시지> | -F <파일>] <태그이름>\n"
+"\t\t[<헤드>]"
+
+#: builtin/tag.c:24
+msgid "git tag -d <tagname>..."
+msgstr "git tag -d <태그이름>..."
+
+#: builtin/tag.c:25
+msgid ""
+"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
+msgstr ""
+"git tag -l [-n[<개수>]] [--contains <커밋>] [--points-at <오브젝트>]\n"
+"\t\t[--format=<형식>] [--[no-]merged [<커밋>]] [<패턴>...]"
+
+#: builtin/tag.c:27
+msgid "git tag -v <tagname>..."
+msgstr "git tag -v <태그이름>..."
+
+#: builtin/tag.c:80
+#, c-format
+msgid "tag name too long: %.*s..."
+msgstr "태그 이름이 너무 깁니다: %.*s..."
+
+#: builtin/tag.c:85
+#, c-format
+msgid "tag '%s' not found."
+msgstr "'%s' 태그가 없습니다."
+
+#: builtin/tag.c:100
+#, c-format
+msgid "Deleted tag '%s' (was %s)\n"
+msgstr "'%s' 태그 삭제함 (과거 %s)\n"
+
+#: builtin/tag.c:112
+#, c-format
+msgid "could not verify the tag '%s'"
+msgstr "'%s' 태그를 검증할 수 없습니다"
+
+#: builtin/tag.c:122
+#, c-format
+msgid ""
+"\n"
+"Write a message for tag:\n"
+"  %s\n"
+"Lines starting with '%c' will be ignored.\n"
+msgstr ""
+"\n"
+"다음 태그에 대한 메시지를 쓰십시오:\n"
+"  %s\n"
+"'%c' 문자로 시작하는 줄은 무시됩니다.\n"
+
+#: builtin/tag.c:126
+#, c-format
+msgid ""
+"\n"
+"Write a message for tag:\n"
+"  %s\n"
+"Lines starting with '%c' will be kept; you may remove them yourself if you "
+"want to.\n"
+msgstr ""
+"\n"
+"다음 태그에 대한 메시지를 쓰십시오:\n"
+"  %s\n"
+"'%c' 문자로 시작하는 줄은 유지됩니다. 제거하려면 직접 지워야 합니다.\n"
+
+#: builtin/tag.c:199
+msgid "unable to sign the tag"
+msgstr "태그에 서명할 수 없습니다"
+
+#: builtin/tag.c:201
+msgid "unable to write tag file"
+msgstr "태그 파일을 쓸 수 없습니다"
+
+#: builtin/tag.c:226
+msgid "bad object type."
+msgstr "잘못된 오브젝트 종류."
+
+#: builtin/tag.c:239
+msgid "tag header too big."
+msgstr "태그 헤더가 너무 큽니다."
+
+#: builtin/tag.c:275
+msgid "no tag message?"
+msgstr "태그 메시지 없음?"
+
+#: builtin/tag.c:281
+#, c-format
+msgid "The tag message has been left in %s\n"
+msgstr "태그 메시지가 %s 파일에 남아 있습니다\n"
+
+#: builtin/tag.c:339
+msgid "list tag names"
+msgstr "태그 이름 목록을 표시합니다"
+
+#: builtin/tag.c:341
+msgid "print <n> lines of each tag message"
+msgstr "각 태그 메시지의 <n>줄을 표시합니다"
+
+#: builtin/tag.c:343
+msgid "delete tags"
+msgstr "태그를 삭제합니다"
+
+#: builtin/tag.c:344
+msgid "verify tags"
+msgstr "태그를 검증합니다"
+
+#: builtin/tag.c:346
+msgid "Tag creation options"
+msgstr "태그 만들기 옵션"
+
+#: builtin/tag.c:348
+msgid "annotated tag, needs a message"
+msgstr "주석 달린 태그, 메시지가 필요합니다"
+
+#: builtin/tag.c:350
+msgid "tag message"
+msgstr "태그 메시지"
+
+#: builtin/tag.c:352
+msgid "annotated and GPG-signed tag"
+msgstr "주석 달리고 GPG 서명한 태그"
+
+#: builtin/tag.c:356
+msgid "use another key to sign the tag"
+msgstr "태그를 서명하는데 지정한 키를 사용합니다"
+
+#: builtin/tag.c:357
+msgid "replace the tag if exists"
+msgstr "태그가 있으면 바꿉니다"
+
+#: builtin/tag.c:358 builtin/update-ref.c:368
+msgid "create a reflog"
+msgstr "reflog를 만듭니다"
+
+#: builtin/tag.c:360
+msgid "Tag listing options"
+msgstr "태그 목록 보기 옵션"
+
+#: builtin/tag.c:361
+msgid "show tag list in columns"
+msgstr "태그 목록을 여러 열로 표시합니다"
+
+#: builtin/tag.c:362 builtin/tag.c:363
+msgid "print only tags that contain the commit"
+msgstr "해당 커밋이 들어 있는 태그만 표시합니다"
+
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
+msgstr "병합된 태그만 표시합니다"
+
+#: builtin/tag.c:365
+msgid "print only tags that are not merged"
+msgstr "병합되지 않은 태그만 표시합니다"
+
+#: builtin/tag.c:370
+msgid "print only tags of the object"
+msgstr "해당 오브젝트의 태그만 표시합니다"
+
+#: builtin/tag.c:399
+msgid "--column and -n are incompatible"
+msgstr "--column 및 -n 옵션은 호환되지 않습니다"
+
+#: builtin/tag.c:419
+msgid "-n option is only allowed with -l."
+msgstr "-n 옵션은 -l 옵션과 같이 써야 합니다."
+
+#: builtin/tag.c:421
+msgid "--contains option is only allowed with -l."
+msgstr "--contains 옵션은 -l 옵션과 같이 써야 합니다."
+
+#: builtin/tag.c:423
+msgid "--points-at option is only allowed with -l."
+msgstr "--points-at 옵션은 -l 옵션과 같이 써야 합니다."
+
+#: builtin/tag.c:425
+msgid "--merged and --no-merged option are only allowed with -l"
+msgstr "--merged 및 --no-merged 옵션은 -l 옵션과 같이 써야 합니다."
+
+#: builtin/tag.c:433
+msgid "only one -F or -m option is allowed."
+msgstr "하나의 -F 또는 -m 옵션만 쓸 수 있습니다."
+
+#: builtin/tag.c:453
+msgid "too many params"
+msgstr "파라미터가 너무 많습니다"
+
+#: builtin/tag.c:459
+#, c-format
+msgid "'%s' is not a valid tag name."
+msgstr "'%s'은9는) 올바른 태그 이름이 아닙니다."
+
+#: builtin/tag.c:464
+#, c-format
+msgid "tag '%s' already exists"
+msgstr "태그 '%s'이(가) 이미 있습니다"
+
+#: builtin/tag.c:489
+#, c-format
+msgid "Updated tag '%s' (was %s)\n"
+msgstr "태그 '%s' 업데이트 (과거 %s)\n"
+
+#: builtin/unpack-objects.c:490
+msgid "Unpacking objects"
+msgstr "오브젝트 묶음 푸는 중"
+
+#: builtin/update-index.c:70
+#, c-format
+msgid "failed to create directory %s"
+msgstr "%s 디렉터리 만들기 실패했습니다"
+
+#: builtin/update-index.c:76
+#, c-format
+msgid "failed to stat %s"
+msgstr "%s에 stat()하는데 실패했습니다"
+
+#: builtin/update-index.c:86
+#, c-format
+msgid "failed to create file %s"
+msgstr "%s 파일을 만드는데 실패했습니다"
+
+#: builtin/update-index.c:94
+#, c-format
+msgid "failed to delete file %s"
+msgstr "%s 파일을 삭제하는데 실패했습니다"
+
+#: builtin/update-index.c:101 builtin/update-index.c:203
+#, c-format
+msgid "failed to delete directory %s"
+msgstr "%s 디렉터리를 삭제하는데 실패했습니다"
+
+#: builtin/update-index.c:124
+#, c-format
+msgid "Testing "
+msgstr "테스트중 "
+
+#: builtin/update-index.c:136
+msgid "directory stat info does not change after adding a new file"
+msgstr "새 파일을 추가한 후에 디렉터리 정보가 바뀌지 않았습니다"
+
+#: builtin/update-index.c:149
+msgid "directory stat info does not change after adding a new directory"
+msgstr "새 디렉터리를 추가한 후에 디렉터리 정보가 바뀌지 않았습니다"
+
+#: builtin/update-index.c:162
+msgid "directory stat info changes after updating a file"
+msgstr "파일을 업데이트한 후에 디렉터리 정보가 바뀌지 않았습니다"
+
+#: builtin/update-index.c:173
+msgid "directory stat info changes after adding a file inside subdirectory"
+msgstr "하위 디렉터리에 파일을 추가한 후에 디렉터리 정보가 바뀌지 않았습니다"
+
+#: builtin/update-index.c:184
+msgid "directory stat info does not change after deleting a file"
+msgstr "파일을 삭제한 후에 디렉터리 정보가 바뀌지 않았습니다"
+
+#: builtin/update-index.c:197
+msgid "directory stat info does not change after deleting a directory"
+msgstr "디렉터리를 삭제한 후에 디렉터리 정보가 바뀌지 않았습니다"
+
+#: builtin/update-index.c:204
+msgid " OK"
+msgstr " 오케이"
+
+#: builtin/update-index.c:564
+msgid "git update-index [<options>] [--] [<file>...]"
+msgstr "git update-index [<옵션>] [--] [<파일>...]"
+
+#: builtin/update-index.c:918
+msgid "continue refresh even when index needs update"
+msgstr "인덱스에 업데이트가 필요하더라도 새로 고침을 계속합니다"
+
+#: builtin/update-index.c:921
+msgid "refresh: ignore submodules"
+msgstr "새로 고침: 하위 모듈 무시"
+
+#: builtin/update-index.c:924
+msgid "do not ignore new files"
+msgstr "새 파일을 무시할 수 않습니다"
+
+#: builtin/update-index.c:926
+msgid "let files replace directories and vice-versa"
+msgstr "디렉터리를 파일로, 또는 그 반대로 바꿀 수 있게 허용합니다"
+
+#: builtin/update-index.c:928
+msgid "notice files missing from worktree"
+msgstr "작업폴더에서 알림 파일이 없습니다"
+
+#: builtin/update-index.c:930
+msgid "refresh even if index contains unmerged entries"
+msgstr "인덱스에 병합하지 않은 항목이 있어도 새로 고칩니다"
+
+#: builtin/update-index.c:933
+msgid "refresh stat information"
+msgstr "파일 정보를 새로 고칩니다"
+
+#: builtin/update-index.c:937
+msgid "like --refresh, but ignore assume-unchanged setting"
+msgstr "--refresh와 동일하지만, assume-unchanged 설정을 무시합니다"
+
+#: builtin/update-index.c:941
+msgid "<mode>,<object>,<path>"
+msgstr "<모드>,<오브젝트>,<경로>"
+
+#: builtin/update-index.c:942
+msgid "add the specified entry to the index"
+msgstr "지정한 항목을 인덱스에 추가합니다"
+
+#: builtin/update-index.c:946
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/update-index.c:947
+msgid "override the executable bit of the listed files"
+msgstr "목록의 파일에서 실행 가능 비트를 바꿉니다"
+
+#: builtin/update-index.c:951
+msgid "mark files as \"not changing\""
+msgstr "파일을 \"바꾸지 않음\"으로 표시합니다"
+
+#: builtin/update-index.c:954
+msgid "clear assumed-unchanged bit"
+msgstr "바꾸지 않음으로 가정 (assumed-unchanged) 비트를 지웁니다"
+
+#: builtin/update-index.c:957
+msgid "mark files as \"index-only\""
+msgstr "파일을 인덱스 전용으로 (\"index-only\") 표시합니다"
+
+#: builtin/update-index.c:960
+msgid "clear skip-worktree bit"
+msgstr "작업폴더 건너뛰기 (skip-worktree) 비트를 지웁니다"
+
+#: builtin/update-index.c:963
+msgid "add to index only; do not add content to object database"
+msgstr "인덱스에만 추가합니다. 내용을 오브젝트 데이터베이스에 추가하지 않습니다"
+
+#: builtin/update-index.c:965
+msgid "remove named paths even if present in worktree"
+msgstr "작업 폴더에 있어도 해당 경로를 제거합니다"
+
+#: builtin/update-index.c:967
+msgid "with --stdin: input lines are terminated by null bytes"
+msgstr "--stdin과 같이 사용: 입력 줄은 NUL 바이트로 끝납니다"
+
+#: builtin/update-index.c:969
+msgid "read list of paths to be updated from standard input"
+msgstr "표준 입력에서 업데이트할 경로의 목록을 읽습니다"
+
+#: builtin/update-index.c:973
+msgid "add entries from standard input to the index"
+msgstr "표준 입력에서 읽은 항목을 인덱스에 추가합니다"
+
+#: builtin/update-index.c:977
+msgid "repopulate stages #2 and #3 for the listed paths"
+msgstr "경로 목록에 대해 #2 및 #3 스테이징을 다시 합니다"
+
+#: builtin/update-index.c:981
+msgid "only update entries that differ from HEAD"
+msgstr "HEAD와 다른 항목만 업데이트합니다"
+
+#: builtin/update-index.c:985
+msgid "ignore files missing from worktree"
+msgstr "작업 폴더에 없는 파일을 무시합니다"
+
+#: builtin/update-index.c:988
+msgid "report actions to standard output"
+msgstr "표준 출력에 동작을 알립니다"
+
+#: builtin/update-index.c:990
+msgid "(for porcelains) forget saved unresolved conflicts"
+msgstr "저장한 해결되지 않은 충돌을 무시합니다 (사용자용 명령 용도)"
+
+#: builtin/update-index.c:994
+msgid "write index in this format"
+msgstr "인덱스를 이 형식으로 씁니다"
+
+#: builtin/update-index.c:996
+msgid "enable or disable split index"
+msgstr "스플릿 인덱스를 켜거나 끕니다"
+
+#: builtin/update-index.c:998
+msgid "enable/disable untracked cache"
+msgstr "추적하지 않는 캐시 사용을 켜거나 끕니다"
+
+#: builtin/update-index.c:1000
+msgid "enable untracked cache without testing the filesystem"
+msgstr "파일 시스템 테스트 없이 추적하지 않는 캐시를 사용합니다"
+
+#: builtin/update-ref.c:9
+msgid "git update-ref [<options>] -d <refname> [<old-val>]"
+msgstr "git update-ref [<옵션>] -d <레퍼런스이름> [<과거-값>]"
+
+#: builtin/update-ref.c:10
+msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
+msgstr "git update-ref [<옵션>]    <레퍼런스이름> <새-값> [<과거-값>]"
+
+#: builtin/update-ref.c:11
+msgid "git update-ref [<options>] --stdin [-z]"
+msgstr "git update-ref [<옵션>] --stdin [-z]"
+
+#: builtin/update-ref.c:363
+msgid "delete the reference"
+msgstr "레퍼런스를 삭제합니다"
+
+#: builtin/update-ref.c:365
+msgid "update <refname> not the one it points to"
+msgstr "<레퍼런스이름>을 가리키지 않는 항목으로 업데이트합니다"
+
+#: builtin/update-ref.c:366
+msgid "stdin has NUL-terminated arguments"
+msgstr "표준 입력에 NUL로 끝나는 인자가 있습니다"
+
+#: builtin/update-ref.c:367
+msgid "read updates from stdin"
+msgstr "표준 입력에서 업데이트를 읽습니다"
+
+#: builtin/update-server-info.c:6
+msgid "git update-server-info [--force]"
+msgstr "git update-server-info [--force]"
+
+#: builtin/update-server-info.c:14
+msgid "update the info files from scratch"
+msgstr "바닥부터 정보 파일을 업데이트합니다"
+
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v | --verbose] <commit>..."
+msgstr "git verify-commit [-v | --verbose] <커밋>..."
+
+#: builtin/verify-commit.c:72
+msgid "print commit contents"
+msgstr "커밋 내용을 표시합니다"
+
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:84
+msgid "print raw gpg status output"
+msgstr "원본 GPG 상태를 출력합니다"
+
+#: builtin/verify-pack.c:54
+msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
+msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <묶음>..."
+
+#: builtin/verify-pack.c:64
+msgid "verbose"
+msgstr "자세히 표시"
+
+#: builtin/verify-pack.c:66
+msgid "show statistics only"
+msgstr "통계만 표시"
+
+#: builtin/verify-tag.c:17
+msgid "git verify-tag [-v | --verbose] <tag>..."
+msgstr "git verify-tag [-v | --verbose] <태그>..."
+
+#: builtin/verify-tag.c:83
+msgid "print tag contents"
+msgstr "태그 내용 표시"
+
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr "git worktree add [<옵션>] <경로> [<브랜치>]"
+
+#: builtin/worktree.c:16
+msgid "git worktree prune [<options>]"
+msgstr "git worktree prune [<옵션>]"
+
+#: builtin/worktree.c:17
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<옵션>]"
+
+#: builtin/worktree.c:39
+#, c-format
+msgid "Removing worktrees/%s: not a valid directory"
+msgstr "worktrees/%s 제거: 올바른 디렉터리가 아닙나다"
+
+#: builtin/worktree.c:45
+#, c-format
+msgid "Removing worktrees/%s: gitdir file does not exist"
+msgstr "worktrees/%s 제거: gitdir 파일이 없습니다"
+
+#: builtin/worktree.c:50
+#, c-format
+msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
+msgstr "worktrees/%s 제거: gitdir 파일을 읽을 수 없습니다 (%s)"
+
+#: builtin/worktree.c:61
+#, c-format
+msgid "Removing worktrees/%s: invalid gitdir file"
+msgstr "worktrees/%s 제거: gitdir 파일이 올바르지 않습니다"
+
+#: builtin/worktree.c:77
+#, c-format
+msgid "Removing worktrees/%s: gitdir file points to non-existent location"
+msgstr "worktrees/%s 제거: gitdir 파일이 없는 위치를 가리킵니다"
+
+#: builtin/worktree.c:112
+#, c-format
+msgid "failed to remove: %s"
+msgstr "제거에 실패했습니다: %s"
+
+#: builtin/worktree.c:201
+#, c-format
+msgid "'%s' already exists"
+msgstr "'%s'이(가) 이미 있습니다"
+
+#: builtin/worktree.c:235
+#, c-format
+msgid "could not create directory of '%s'"
+msgstr "'%s'의 디렉터리를 만들 수 없습니다"
+
+#: builtin/worktree.c:271
+#, c-format
+msgid "Preparing %s (identifier %s)"
+msgstr "%s 준비 중 (ID %s)"
+
+#: builtin/worktree.c:319
+msgid "checkout <branch> even if already checked out in other worktree"
+msgstr "다른 작업 폴더에서 체크아웃했더라도 <브랜치>를 체크아웃합니다"
+
+#: builtin/worktree.c:321
+msgid "create a new branch"
+msgstr "새 브랜치를 만듭니다"
+
+#: builtin/worktree.c:323
+msgid "create or reset a branch"
+msgstr "브랜치를 만들거나 리셋합니다"
+
+#: builtin/worktree.c:324
+msgid "detach HEAD at named commit"
+msgstr "HEAD를 해당 커밋에서 분리합니다"
+
+#: builtin/worktree.c:331
+msgid "-b, -B, and --detach are mutually exclusive"
+msgstr "-b, -B, --detach 옵션 중 하나만 쓸 수 있습니다"
+
+#: builtin/write-tree.c:13
+msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+msgstr "git write-tree [--missing-ok] [--prefix=<접두어>/]"
+
+#: builtin/write-tree.c:26
+msgid "<prefix>/"
+msgstr "<접두어>/"
+
+#: builtin/write-tree.c:27
+msgid "write tree object for a subdirectory <prefix>"
+msgstr "하위 디렉터리 <접두어>에 대해 트리 오브젝트를 씁니다"
+
+#: builtin/write-tree.c:30
+msgid "only useful for debugging"
+msgstr "디버깅 용도로만 사용"
+
+#: credential-cache--daemon.c:255
+msgid "print debugging messages to stderr"
+msgstr "디버깅 메시지를 표준오류로 출력합니다"
+
+#: git.c:14
+msgid ""
+"'git help -a' and 'git help -g' list available subcommands and some\n"
+"concept guides. See 'git help <command>' or 'git help <concept>'\n"
+"to read about a specific subcommand or concept."
+msgstr ""
+"'git help -a' 및 'git help -g' 명령을 실행하면 하위 명령어와 개념 설명서의\n"
+"목록을 볼 수 있습니다. 특정 하위 명령어나 개념에 대해 읽어 보려면 'git help\n"
+"<명령>' 또는 'git help <개념>' 명령을 실행하십시오."
+
+#: common-cmds.h:9
+msgid "start a working area (see also: git help tutorial)"
+msgstr "작업 공간 시작 (참고: git help tutorial)"
+
+#: common-cmds.h:10
+msgid "work on the current change (see also: git help everyday)"
+msgstr "변경 사항에 대한 작업 (참고: git help everyday)"
+
+#: common-cmds.h:11
+msgid "examine the history and state (see also: git help revisions)"
+msgstr "커밋 내역과 상태 보기 (참고: git help revisions)"
+
+#: common-cmds.h:12
+msgid "grow, mark and tweak your common history"
+msgstr "커밋 내역을 키우고, 표시하고, 조작하기"
+
+#: common-cmds.h:13
+msgid "collaborate (see also: git help workflows)"
+msgstr "협동 작업 (참고: git help workflows)"
+
+#: common-cmds.h:17
+msgid "Add file contents to the index"
+msgstr "파일 내용을 인덱스에 추가합니다"
+
+#: common-cmds.h:18
+msgid "Use binary search to find the commit that introduced a bug"
+msgstr "이진 탐색으로 버그를 만들어낸 커밋을 찾습니다"
+
+#: common-cmds.h:19
+msgid "List, create, or delete branches"
+msgstr "브랜치를 만들거나, 삭제하거나, 목록을 출력합니다"
+
+#: common-cmds.h:20
+msgid "Switch branches or restore working tree files"
+msgstr "브랜치를 전환하거나 작업 파일을 복구합니다"
+
+#: common-cmds.h:21
+msgid "Clone a repository into a new directory"
+msgstr "저장소를 복제해 새 디렉터리로 가져 옵니다"
+
+#: common-cmds.h:22
+msgid "Record changes to the repository"
+msgstr "바뀐 사항을 저장소에 기록합니다."
+
+#: common-cmds.h:23
+msgid "Show changes between commits, commit and working tree, etc"
+msgstr "커밋과 커밋 사이, 커밋과 작업 내용 사이 등의 바뀐 점을 봅니다"
+
+#: common-cmds.h:24
+msgid "Download objects and refs from another repository"
+msgstr "다른 저장소에서 오브젝트와 레퍼런스를 다운로드합니다"
+
+#: common-cmds.h:25
+msgid "Print lines matching a pattern"
+msgstr "패턴과 일치하는 줄을 표시합니다"
+
+#: common-cmds.h:26
+msgid "Create an empty Git repository or reinitialize an existing one"
+msgstr "빈 깃 저장소를 만들거나 기존 저장소를 다시 초기화합니다"
+
+#: common-cmds.h:27
+msgid "Show commit logs"
+msgstr "커밋 기록을 표시합니다"
+
+#: common-cmds.h:28
+msgid "Join two or more development histories together"
+msgstr "여러 개의 개발 내역을 하나로 합칩니다"
+
+#: common-cmds.h:29
+msgid "Move or rename a file, a directory, or a symlink"
+msgstr "파일, 디렉터리, 심볼릭 링크를 옮기거나 이름을 바꿉니다"
+
+#: common-cmds.h:30
+msgid "Fetch from and integrate with another repository or a local branch"
+msgstr "다른 저장소 또는 다른 로컬 브랜치에서 가져오거나 통합합니다"
+
+#: common-cmds.h:31
+msgid "Update remote refs along with associated objects"
+msgstr "원격 레퍼런스 및 그와 관련된 오브젝트를 업데이트합니다"
+
+#: common-cmds.h:32
+msgid "Forward-port local commits to the updated upstream head"
+msgstr "로컬 커밋을 업데이트된 업스트림 head 다음에 맞춰 넣습니다"
+
+#: common-cmds.h:33
+msgid "Reset current HEAD to the specified state"
+msgstr "현재 HEAD를 지정한 상태로 재설정화합니다"
+
+#: common-cmds.h:34
+msgid "Remove files from the working tree and from the index"
+msgstr "파일을 작업 폴더에서 제거하고 인덱스에서도 제거합니다"
+
+#: common-cmds.h:35
+msgid "Show various types of objects"
+msgstr "여러가지 종류의 오브젝트를 표시합니다"
+
+#: common-cmds.h:36
+msgid "Show the working tree status"
+msgstr "작업 폴더 상태를 표시합니다"
+
+#: common-cmds.h:37
+msgid "Create, list, delete or verify a tag object signed with GPG"
+msgstr "태그를 만들거나, 표시하거나, 삭제하거나, GPG 서명을 검증합니다"
+
+#: parse-options.h:145
+msgid "expiry-date"
+msgstr "만료-시각"
+
+#: parse-options.h:160
+msgid "no-op (backward compatibility)"
+msgstr "아무 동작도 하지 않음 (호환용)"
+
+#: parse-options.h:237
+msgid "be more verbose"
+msgstr "더 자세히 표시합니다"
+
+#: parse-options.h:239
+msgid "be more quiet"
+msgstr "더 간략히 표시합니다"
+
+#: parse-options.h:245
+msgid "use <n> digits to display SHA-1s"
+msgstr "SHA-1 표시에 <n>개의 숫자를 사용합니다"
+
+#: rerere.h:38
+msgid "update the index with reused conflict resolution if possible"
+msgstr "가능하면 인덱스를 재사용한 충돌 해결로 업데이트합니다"
+
+#: git-bisect.sh:55
+msgid "You need to start by \"git bisect start\""
+msgstr "\"git bisect start\" 명령으로 시작해야 합니다"
+
+#. TRANSLATORS: Make sure to include [Y] and [n] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-bisect.sh:61
+msgid "Do you want me to do it for you [Y/n]? "
+msgstr "지금 하시겠습니까 [Y/n]? "
+
+#: git-bisect.sh:122
+#, sh-format
+msgid "unrecognised option: '$arg'"
+msgstr "알 수 없는 옵션: '$arg'"
+
+#: git-bisect.sh:126
+#, sh-format
+msgid "'$arg' does not appear to be a valid revision"
+msgstr "'$arg'은(는) 올바른 리비전처럼 보이지 않습니다"
+
+#: git-bisect.sh:155
+msgid "Bad HEAD - I need a HEAD"
+msgstr "잘못된 HEAD - HEAD가 필요합니다"
+
+#: git-bisect.sh:168
+#, sh-format
+msgid ""
+"Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
+msgstr ""
+"'$start_head' 받아오기가 실패했습니다. 'git bisect reset <valid-branch>'를 "
+"해 보십시오."
+
+#: git-bisect.sh:178
+msgid "won't bisect on cg-seek'ed tree"
+msgstr "cg-seek한 트리에서 bisect를 할 수 없습니다"
+
+#: git-bisect.sh:182
+msgid "Bad HEAD - strange symbolic ref"
+msgstr "잘못된 HEAD - 심볼릭 레퍼런스가 잘못되었습니다"
+
+#: git-bisect.sh:234
+#, sh-format
+msgid "Bad bisect_write argument: $state"
+msgstr "잘못된 bisect_write 인자: $state"
+
+#: git-bisect.sh:263
+#, sh-format
+msgid "Bad rev input: $arg"
+msgstr "잘못된 리비전 입력: $arg"
+
+#: git-bisect.sh:278
+msgid "Please call 'bisect_state' with at least one argument."
+msgstr "'bisect_state' 호출은 최소한 하나의 인자를 써야 합니다."
+
+#: git-bisect.sh:290
+#, sh-format
+msgid "Bad rev input: $rev"
+msgstr "잘못된 리비전 입력: $rev"
+
+#: git-bisect.sh:299
+#, sh-format
+msgid "'git bisect $TERM_BAD' can take only one argument."
+msgstr "'git bisect $TERM_BAD' 명령은 하나의 인자만 쓸 수 있습니다."
+
+#: git-bisect.sh:322
+#, sh-format
+msgid "Warning: bisecting only with a $TERM_BAD commit."
+msgstr "경고: 하나의 $TERM_BAD 커밋에 대해서만 이등분."
+
+#. TRANSLATORS: Make sure to include [Y] and [n] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-bisect.sh:328
+msgid "Are you sure [Y/n]? "
+msgstr "확실합니까 [Y/n]? "
+
+#: git-bisect.sh:340
+#, sh-format
+msgid ""
+"You need to give me at least one $bad_syn and one $good_syn revision.\n"
+"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
+msgstr ""
+"최소한 하나의 $bad_syn 및 하나의 $good_syn 리비전을 넘겨야 합니다.\n"
+"(\"git bisect $bad_syn\" 및 \"git bisect $good_syn\" 명령을 실행하면 됩니다.)"
+
+#: git-bisect.sh:343
+#, sh-format
+msgid ""
+"You need to start by \"git bisect start\".\n"
+"You then need to give me at least one $good_syn and one $bad_syn revision.\n"
+"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
+msgstr ""
+"\"git bisect start\"를 실행해야 합니다.\n"
+"그 다음 최소한 하나의 $good_syn 및 하나의 $bad_syn 리비전을 넘겨야 합니다\n"
+"(\"git bisect $bad_syn\" 및 \"git bisect $good_syn\" 명령을 실행하면 됩니다.)"
+
+#: git-bisect.sh:414 git-bisect.sh:546
+msgid "We are not bisecting."
+msgstr "이등분하는 중입니다."
+
+#: git-bisect.sh:421
+#, sh-format
+msgid "'$invalid' is not a valid commit"
+msgstr "'$invalid'은(는) 올바른 커밋이 아닙니다"
+
+#: git-bisect.sh:430
+#, sh-format
+msgid ""
+"Could not check out original HEAD '$branch'.\n"
+"Try 'git bisect reset <commit>'."
+msgstr ""
+"본래의 HEAD '$branch'을(를) 체크아웃할 수 없습니다.\n"
+"'git bisect reset <커밋>'을 해 보십시오"
+
+#: git-bisect.sh:458
+msgid "No logfile given"
+msgstr "로그 파일이 주어지지 않았습니다"
+
+#: git-bisect.sh:459
+#, sh-format
+msgid "cannot read $file for replaying"
+msgstr "다시 재생할 $file 파일을 읽을 수 없습니다"
+
+#: git-bisect.sh:480
+msgid "?? what are you talking about?"
+msgstr "?? 무슨 소리인지 모르겠습니다?"
+
+#: git-bisect.sh:492
+#, sh-format
+msgid "running $command"
+msgstr "실행: $command"
+
+#: git-bisect.sh:499
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"exit code $res from '$command' is < 0 or >= 128"
+msgstr ""
+"이등분 실행이 실패했습니다:\n"
+"'$command' 명령에서 상태 코드 '$res'이(가) 0보다 작거나 128보다 큽니다"
+
+#: git-bisect.sh:525
+msgid "bisect run cannot continue any more"
+msgstr "이등분 실행을 계속 할 수 없습니다"
+
+#: git-bisect.sh:531
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"'bisect_state $state' exited with error code $res"
+msgstr ""
+"이등분 실행이 실패했습니다:\n"
+"'bisect_state $state' 명령에서 상태 코드가 '$res'입니다"
+
+#: git-bisect.sh:538
+msgid "bisect run success"
+msgstr "이등분 실행 성공"
+
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr "두 다른 용어를 사용하십시오"
+
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr "'$term'이(가) 올바른 용어가 아닙니다"
+
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr "내부 명령어 '$term'을(를) 용어로 사용할 수 없습니다"
+
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr "용어 '$term'의 의미를 바꿀 수 없습니다"
+
+#: git-bisect.sh:606
+#, sh-format
+msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
+msgstr "잘못된 명령어: 현재 $TERM_BAD/$TERM_GOOD 이등분 중입니다."
+
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "용어를 정의하지 않았습니다"
+
+#: git-bisect.sh:653
+#, sh-format
+msgid ""
+"invalid argument $arg for 'git bisect terms'.\n"
+"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+msgstr ""
+"'git bisect terms'에 대해 잘못된 인자 '$arg'.\n"
+"지원하는 옵션은: --term-good|--term-old 및 --term-bad|--term-new."
+
+#: git-rebase.sh:57
+msgid ""
+"When you have resolved this problem, run \"git rebase --continue\".\n"
+"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
+"To check out the original branch and stop rebasing, run \"git rebase --abort"
+"\"."
+msgstr ""
+"이 문제를 해결하면, \"\"git rebase --continue\"를 실행하십시오.\n"
+"이 패치를 건너뛰려면, 대신에 \"git rebase --skip\"을 실행하십시오.\n"
+"원래 브랜치를 체크아웃하고 리베이스를 중지하려면, \"git rebase --abort\"를 실행하십시오."
+
+#: git-rebase.sh:165
+msgid "Applied autostash."
+msgstr "자동스태시 적용."
+
+#: git-rebase.sh:168
+#, sh-format
+msgid "Cannot store $stash_sha1"
+msgstr "\"$stash_sha1\"을(를) 저장할 수 없습니다"
+
+#: git-rebase.sh:169
+msgid ""
+"Applying autostash resulted in conflicts.\n"
+"Your changes are safe in the stash.\n"
+"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
+msgstr ""
+"자동스태시 적용에 충돌이 발생했습니다.\n"
+"변경 사항은 스태시 안에 안전하게 들어 있습니다.\n"
+"언제든지 \"git stash pop\" 또는 \"git stash drop\"을 실행할 수 있습니다.\n"
+
+#: git-rebase.sh:208
+msgid "The pre-rebase hook refused to rebase."
+msgstr "리베이스 전 후크에서 리베이스를 거부했습니다."
+
+#: git-rebase.sh:213
+msgid "It looks like git-am is in progress. Cannot rebase."
+msgstr "git-am이 진행 중인 것처럼 보입니다. 리베이스할 수 없습니다."
+
+#: git-rebase.sh:354
+msgid "The --exec option must be used with the --interactive option"
+msgstr "--exec 옵션은 --interactive 옵션과 같이 사용해야 합니다"
+
+#: git-rebase.sh:359
+msgid "No rebase in progress?"
+msgstr "리베이스가 진행 중이지 않습니다"
+
+#: git-rebase.sh:370
+msgid "The --edit-todo action can only be used during interactive rebase."
+msgstr "--edit-todo 동작은 대화형 리베이스에서만 사용할 수 있습니다."
+
+#: git-rebase.sh:377
+msgid "Cannot read HEAD"
+msgstr "HEAD를 읽을 수 없습니다"
+
+#: git-rebase.sh:380
+msgid ""
+"You must edit all merge conflicts and then\n"
+"mark them as resolved using git add"
+msgstr ""
+"모든 병합 충돌을 편집하고 git add\n"
+"명령으로 해결되었다고 표시해야 합니다"
+
+#: git-rebase.sh:398
+#, sh-format
+msgid "Could not move back to $head_name"
+msgstr "'$head_name' 위치로 돌아갈 수 없습니다"
+
+#: git-rebase.sh:417
+#, sh-format
+msgid ""
+"It seems that there is already a $state_dir_base directory, and\n"
+"I wonder if you are in the middle of another rebase.  If that is the\n"
+"case, please try\n"
+"\t$cmd_live_rebase\n"
+"If that is not the case, please\n"
+"\t$cmd_clear_stale_rebase\n"
+"and run me again.  I am stopping in case you still have something\n"
+"valuable there."
+msgstr ""
+"이미 '$state_dir_base' 디렉터리가 있는 것으로 보아, 이미\n"
+"또 다른 리베이스 중에 있는 것 같습니다. 그러한 경우에는\n"
+"다음을 시도해 보십시오:\n"
+"\t$cmd_live_rebase\n"
+"리베이스 중이 아니라면 다음을 시도하고,\n"
+"\t$cmd_clear_stale_rebase\n"
+"이 명령을 다시 실행하십시오. 중요한 사항이 남아 있을 경우를\n"
+"대비해 여기서 멈춥니다."
+
+#: git-rebase.sh:468
+#, sh-format
+msgid "invalid upstream $upstream_name"
+msgstr "잘못된 업스트림 $upstream_name"
+
+#: git-rebase.sh:492
+#, sh-format
+msgid "$onto_name: there are more than one merge bases"
+msgstr "$onto_name: 여러 개의 병합 베이스가 있습니다"
+
+#: git-rebase.sh:495 git-rebase.sh:499
+#, sh-format
+msgid "$onto_name: there is no merge base"
+msgstr "$onto_name: 병합 베이스가 없습니다"
+
+#: git-rebase.sh:504
+#, sh-format
+msgid "Does not point to a valid commit: $onto_name"
+msgstr "올바른 커밋을 가리키지 않습니다: $onto_name"
+
+#: git-rebase.sh:527
+#, sh-format
+msgid "fatal: no such branch: $branch_name"
+msgstr "치명적 이상: 그런 브랜치가 없습니다: $branch_name"
+
+#: git-rebase.sh:560
+msgid "Cannot autostash"
+msgstr "자동 스태시를 할 수 없습니다"
+
+#: git-rebase.sh:565
+#, sh-format
+msgid "Created autostash: $stash_abbrev"
+msgstr "자동 스태시를 만들었습니다: $stash_abbrev"
+
+#: git-rebase.sh:569
+msgid "Please commit or stash them."
+msgstr "커밋하거나 스태시에 넣으십시오."
+
+#: git-rebase.sh:589
+#, sh-format
+msgid "Current branch $branch_name is up to date."
+msgstr "현재 브랜치가 ($branch_name) 최신 상태입니다."
+
+#: git-rebase.sh:593
+#, sh-format
+msgid "Current branch $branch_name is up to date, rebase forced."
+msgstr "현재 브랜치가 ($branch_name) 최신 상태입니다. 강제 리베이스합니다."
+
+#: git-rebase.sh:604
+#, sh-format
+msgid "Changes from $mb to $onto:"
+msgstr "변경 사항 '$mb'에서 '$onto'(으)로:"
+
+#: git-rebase.sh:613
+msgid "First, rewinding head to replay your work on top of it..."
+msgstr "작업 사항을 다시 넣기 위해 먼저 헤드를 뒤로 돌립니다..."
+
+#: git-rebase.sh:623
+#, sh-format
+msgid "Fast-forwarded $branch_name to $onto_name."
+msgstr "$branch_name 브랜치를 $onto_name 위치로 정방향 진행합니다."
+
+#: git-stash.sh:51
+msgid "git stash clear with parameters is unimplemented"
+msgstr "git stash clear 명령을 파라미터와 같이 쓰기는 구현되지 않았습니다"
+
+#: git-stash.sh:74
+msgid "You do not have the initial commit yet"
+msgstr "아직 최초 커밋이 없습니다"
+
+#: git-stash.sh:89
+msgid "Cannot save the current index state"
+msgstr "현재 인덱스 상태를 저장할 수 없습니다"
+
+#: git-stash.sh:124 git-stash.sh:137
+msgid "Cannot save the current worktree state"
+msgstr "현재 작업 폴더 상태를 저장할 수 없습니다"
+
+#: git-stash.sh:141
+msgid "No changes selected"
+msgstr "변경 사항을 선택하지 않았습니다"
+
+#: git-stash.sh:144
+msgid "Cannot remove temporary index (can't happen)"
+msgstr "임시 인덱스를 제거할 수 없습니다 (일어날 수 없는 상황)"
+
+#: git-stash.sh:157
+msgid "Cannot record working tree state"
+msgstr "작업 폴더 상태를 기록할 수 없습니다"
+
+#: git-stash.sh:189
+#, sh-format
+msgid "Cannot update $ref_stash with $w_commit"
+msgstr "$ref_stash을(를) $w_commit(으)로 업데이트할 수 없습니다"
+
+#. TRANSLATORS: $option is an invalid option, like
+#. `--blah-blah'. The 7 spaces at the beginning of the
+#. second line correspond to "error: ". So you should line
+#. up the second line with however many characters the
+#. translation of "error: " takes in your language. E.g. in
+#. English this is:
+#.
+#. $ git stash save --blah-blah 2>&1 | head -n 2
+#. error: unknown option for 'stash save': --blah-blah
+#. To provide a message, use git stash save -- '--blah-blah'
+#: git-stash.sh:239
+#, sh-format
+msgid ""
+"error: unknown option for 'stash save': $option\n"
+"       To provide a message, use git stash save -- '$option'"
+msgstr ""
+"오류: 'stash save'에 대해 알 수 없는 옵션: $option\n"
+"       메시지를 넘기려면, 다음과 같이 쓰십시오: git stash save -- '$option'"
+
+#: git-stash.sh:260
+msgid "No local changes to save"
+msgstr "저장할 로컬 변경 사항이 없습니다"
+
+#: git-stash.sh:264
+msgid "Cannot initialize stash"
+msgstr "스태시를 초기화할 수 없습니다"
+
+#: git-stash.sh:268
+msgid "Cannot save the current status"
+msgstr "현재 상태를 저장할 수 없습니다"
+
+#: git-stash.sh:286
+msgid "Cannot remove worktree changes"
+msgstr "작업폴더 변경 사항을 제거할 수 없습니다"
+
+#: git-stash.sh:405
+#, sh-format
+msgid "unknown option: $opt"
+msgstr "알 수 없는 옵션: $opt"
+
+#: git-stash.sh:415
+msgid "No stash found."
+msgstr "스태시가 없습니다."
+
+#: git-stash.sh:422
+#, sh-format
+msgid "Too many revisions specified: $REV"
+msgstr "너무 많은 리비전을 지정했습니다: $REV"
+
+#: git-stash.sh:428
+#, sh-format
+msgid "$reference is not a valid reference"
+msgstr "$reference은(는) 올바른 레퍼런스가 아닙니다"
+
+#: git-stash.sh:456
+#, sh-format
+msgid "'$args' is not a stash-like commit"
+msgstr "'$args'은(는) 스태시 커밋이 아닙니다"
+
+#: git-stash.sh:467
+#, sh-format
+msgid "'$args' is not a stash reference"
+msgstr "'$args'은(는) 스태시 레퍼런스가 아닙니다"
+
+#: git-stash.sh:475
+msgid "unable to refresh index"
+msgstr "인덱스를 새로 고칠 수 없습니다"
+
+#: git-stash.sh:479
+msgid "Cannot apply a stash in the middle of a merge"
+msgstr "병합 도중에 스태시를 적용할 수 없습니다"
+
+#: git-stash.sh:487
+msgid "Conflicts in index. Try without --index."
+msgstr "인덱스에 충돌. --index 없이 시도해 보십시오."
+
+#: git-stash.sh:489
+msgid "Could not save index tree"
+msgstr "인덱스 트리를 저장할 수 없습니다"
+
+#: git-stash.sh:523
+msgid "Cannot unstage modified files"
+msgstr "수정한 파일을 스테이지에서 뺄 수 없습니다"
+
+#: git-stash.sh:538
+msgid "Index was not unstashed."
+msgstr "인덱스가 스태시에서 빠졌습니다."
+
+#: git-stash.sh:561
+#, sh-format
+msgid "Dropped ${REV} ($s)"
+msgstr "${REV} 지움 ($s)"
+
+#: git-stash.sh:562
+#, sh-format
+msgid "${REV}: Could not drop stash entry"
+msgstr "${REV}: 스태시 항목을 지울 수 없습니다"
+
+#: git-stash.sh:570
+msgid "No branch name specified"
+msgstr "브랜치 이름을 지정하지 않았습니다"
+
+#: git-stash.sh:642
+msgid "(To restore them type \"git stash apply\")"
+msgstr "(복구하려면 \"git stash apply\"를 실행하십시오)"
+
+#: git-submodule.sh:104
+#, sh-format
+msgid "cannot strip one component off url '$remoteurl'"
+msgstr "'$remoteurl' URL에서 하나의 항목을 잘라낼 수 없습니다"
+
+#: git-submodule.sh:281
+msgid "Relative path can only be used from the toplevel of the working tree"
+msgstr "상대 경로는 작업 폴더의 최상위에서만 쓸 수 있습니다"
+
+#: git-submodule.sh:291
+#, sh-format
+msgid "repo URL: '$repo' must be absolute or begin with ./|../"
+msgstr "저장소 URL: '$repo' 값은 절대 경로거나 ./ 또는 ../로 시작해야 합니다."
+
+#: git-submodule.sh:308
+#, sh-format
+msgid "'$sm_path' already exists in the index"
+msgstr "'$sm_path'은(는) 이미 인덱스에 있습니다"
+
+#: git-submodule.sh:312
+#, sh-format
+msgid ""
+"The following path is ignored by one of your .gitignore files:\n"
+"$sm_path\n"
+"Use -f if you really want to add it."
+msgstr ""
+"다음 경로는 .gitignore 파일에서 무시합니다:\n"
+"$sm_path\n"
+"정말로 추가하려면 -f 옵션을 사용하십시오."
+
+#: git-submodule.sh:330
+#, sh-format
+msgid "Adding existing repo at '$sm_path' to the index"
+msgstr "'$sm_path'의 기존 저장소를 인덱스에 추가합니다"
+
+#: git-submodule.sh:332
+#, sh-format
+msgid "'$sm_path' already exists and is not a valid git repo"
+msgstr "'$sm_path'이(가) 이미 있고 올바른 git 저장소가 아닙니다"
+
+#: git-submodule.sh:340
+#, sh-format
+msgid "A git directory for '$sm_name' is found locally with remote(s):"
+msgstr "'$sm_name'에 대한 깃 디렉터리가 로컬에서 리모트가 있는 채로 있습니다:"
+
+#: git-submodule.sh:342
+#, sh-format
+msgid ""
+"If you want to reuse this local git directory instead of cloning again from"
+msgstr "다시 복제하지 않고 이 로컬 깃 디렉터리를 재활용하려면"
+
+#: git-submodule.sh:344
+#, sh-format
+msgid ""
+"use the '--force' option. If the local git directory is not the correct repo"
+msgstr ""
+"'--force' 옵션을 사용하십시오. 로컬 깃 디렉터리가 올바른 저장소가 아니거나"
+
+#: git-submodule.sh:345
+#, sh-format
+msgid ""
+"or you are unsure what this means choose another name with the '--name' "
+"option."
+msgstr "무슨 의미인지 잘 모르겠다면 '--name' 옵션으로 다른 이름을 쓰십시오."
+
+#: git-submodule.sh:347
+#, sh-format
+msgid "Reactivating local git directory for submodule '$sm_name'."
+msgstr "로컬 깃 디렉터리를 '$sm_name' 하위모듈로 다시 활성화합니다."
+
+#: git-submodule.sh:359
+#, sh-format
+msgid "Unable to checkout submodule '$sm_path'"
+msgstr "'$sm_path' 하위 모듈을 체크아웃할 수 없습니다"
+
+#: git-submodule.sh:364
+#, sh-format
+msgid "Failed to add submodule '$sm_path'"
+msgstr "'$sm_path' 하위 모듈을 추가하는데 실패했습니다"
+
+#: git-submodule.sh:373
+#, sh-format
+msgid "Failed to register submodule '$sm_path'"
+msgstr "'$sm_path' 하위 모듈을 등록하는데 실패했습니다"
+
+#: git-submodule.sh:417
+#, sh-format
+msgid "Entering '$prefix$displaypath'"
+msgstr "'$prefix$displaypath' 입력"
+
+#: git-submodule.sh:437
+#, sh-format
+msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
+msgstr "'$prefix$displaypath' 위치에서 멈춤. 스크립트에서 0이 아닌 상태를 리턴했습니다."
+
+#: git-submodule.sh:483
+#, sh-format
+msgid "No url found for submodule path '$displaypath' in .gitmodules"
+msgstr ".gitmodules에서 하위 모듈 경로 '$displaypath'에 대한 URL이 없습니다"
+
+#: git-submodule.sh:492
+#, sh-format
+msgid "Failed to register url for submodule path '$displaypath'"
+msgstr "하위 모듈 경로 '$displaypath'에 대한 URL을 등록하는데 실패했습니다"
+
+#: git-submodule.sh:494
+#, sh-format
+msgid "Submodule '$name' ($url) registered for path '$displaypath'"
+msgstr "'$displaypath' 경로에 ($url) 대해 등록된 '$name' 하위 모듈"
+
+#: git-submodule.sh:511
+#, sh-format
+msgid "Failed to register update mode for submodule path '$displaypath'"
+msgstr "하위 모듈 경로 '$displaypath'에 대해 업데이트 모드를 등록하는데 실패했습니다"
+
+#: git-submodule.sh:549
+#, sh-format
+msgid "Use '.' if you really want to deinitialize all submodules"
+msgstr "정말로 모든 하위 모듈 초기화를 해제하려면 '.'을 사용하십시오"
+
+#: git-submodule.sh:566
+#, sh-format
+msgid "Submodule work tree '$displaypath' contains a .git directory"
+msgstr "하위 모듈 작업 폴더에 ('$displaypath') .git 디렉터리가 들어 있습니다"
+
+#: git-submodule.sh:567
+#, sh-format
+msgid ""
+"(use 'rm -rf' if you really want to remove it including all of its history)"
+msgstr "(정말로 그 커밋 내역까지 포함해 제거하려면 'rm -rf'를 사용하십시오)"
+
+#: git-submodule.sh:573
+#, sh-format
+msgid ""
+"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
+"discard them"
+msgstr "하위 모듈 작업 폴더에 ('$displaypath') 로컬 수정 사항이 있습니다. 버리려면 '-f'를 사용하십시오"
+
+#: git-submodule.sh:576
+#, sh-format
+msgid "Cleared directory '$displaypath'"
+msgstr "'$displaypath' 디렉터리를 지웁니다"
+
+#: git-submodule.sh:577
+#, sh-format
+msgid "Could not remove submodule work tree '$displaypath'"
+msgstr "하위 모듈 디렉터리를 ('$displaypath') 제거할 수 없습니다"
+
+#: git-submodule.sh:580
+#, sh-format
+msgid "Could not create empty submodule directory '$displaypath'"
+msgstr "빈 하위 모듈 디렉터리를 ('$displaypath') 만들 수 없습니다"
+
+#: git-submodule.sh:589
+#, sh-format
+msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
+msgstr "'$name' 하위 모듈이 ($url) '$displaypath' 경로에 대해 등록되지 않았습니다"
+
+#: git-submodule.sh:705
+#, sh-format
+msgid ""
+"Submodule path '$displaypath' not initialized\n"
+"Maybe you want to use 'update --init'?"
+msgstr ""
+"하위 모듈 경로가 ('$displaypath') 초기화되지 않았습니다\n"
+"아마도 'update --init'이 필요합니다?"
+
+#: git-submodule.sh:718
+#, sh-format
+msgid "Unable to find current revision in submodule path '$displaypath'"
+msgstr "하위 모듈 경로에서 ('$displaypath') 현재 리비전을 찾을 수 없습니다"
+
+#: git-submodule.sh:727
+#, sh-format
+msgid "Unable to fetch in submodule path '$sm_path'"
+msgstr "하위 모듈 경로 '$sm_path'에서 가져올 수 없습니다"
+
+#: git-submodule.sh:751
+#, sh-format
+msgid "Unable to fetch in submodule path '$displaypath'"
+msgstr "하위 모듈 경로 '$displaypath'에서 가져올 수 없습니다"
+
+#: git-submodule.sh:765
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr "하위 모듈 경로 '$displaypath'에서 '$sha1'을(를) 체크아웃할 수 없습니다"
+
+#: git-submodule.sh:766
+#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "하위 모듈 경로 '$displaypath': '$sha1' 체크아웃"
+
+#: git-submodule.sh:770
+#, sh-format
+msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
+msgstr "하위 모듈 경로 '$displaypath'에서 '$sha1'을(를) 리베이스할 수 없습니다"
+
+#: git-submodule.sh:771
+#, sh-format
+msgid "Submodule path '$displaypath': rebased into '$sha1'"
+msgstr "하위 모듈 경로 '$displaypath': '$sha1'(으)로 리베이스"
+
+#: git-submodule.sh:776
+#, sh-format
+msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
+msgstr "하위 모듈 경로 '$displaypath'에서 '$sha1' 병합할 수 없습니다"
+
+#: git-submodule.sh:777
+#, sh-format
+msgid "Submodule path '$displaypath': merged in '$sha1'"
+msgstr "하위 모듈 경로 '$displaypath': '$sha1'에서 병합"
+
+#: git-submodule.sh:782
+#, sh-format
+msgid ""
+"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
+msgstr "하위 모듈 경로 '$prefix$sm_path'에서 '$command $sha1' 실행이 실패했습니다"
+
+#: git-submodule.sh:783
+#, sh-format
+msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
+msgstr "하위 모듈 경로 '$prefix$sm_path': '$command $sha1'"
+
+#: git-submodule.sh:813
+#, sh-format
+msgid "Failed to recurse into submodule path '$displaypath'"
+msgstr "재귀적으로 하위 모듈 경로 '$displaypath'에 들어가는데 실패했습니다"
+
+#: git-submodule.sh:921
+msgid "The --cached option cannot be used with the --files option"
+msgstr "--cached 옵션은 --files 옵션과 같이 쓸 수 없습니다"
+
+#: git-submodule.sh:973
+#, sh-format
+msgid "unexpected mode $mod_dst"
+msgstr "예상치 못한 모드 $mod_dst"
+
+#: git-submodule.sh:993
+#, sh-format
+msgid "  Warn: $display_name doesn't contain commit $sha1_src"
+msgstr "  경고: '$display_name'에 '$sha1_src' 커밋이 들어있지 않습니다"
+
+#: git-submodule.sh:996
+#, sh-format
+msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
+msgstr "  경고: '$display_name'에 '$sha1_dst' 커밋이 들어있지 않습니다"
+
+#: git-submodule.sh:999
+#, sh-format
+msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
+msgstr "  경고: '$display_name'에 '$sha1_src' 및 '$sha1_dst' 커밋이 들어있지 않습니다"
+
+#: git-submodule.sh:1024
+msgid "blob"
+msgstr "블롭"
+
+#: git-submodule.sh:1142
+#, sh-format
+msgid "Failed to recurse into submodule path '$sm_path'"
+msgstr "재귀적으로 하위 모듈 경로 '$sm_path'에 들어가는데 실패했습니다"
+
+#: git-submodule.sh:1206
+#, sh-format
+msgid "Synchronizing submodule url for '$displaypath'"
+msgstr "하위 모듈 URL을 '$displaypath'에 대해 동기화"
diff --git a/po/ru.po b/po/ru.po
index c9e1fb8..0de4ff9 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -8,10 +8,10 @@
 # insolor <insolor@gmail.com>, 2014
 msgid ""
 msgstr ""
-"Project-Id-Version: Перевод Git на русский язык\n"
+"Project-Id-Version: Git Russian Localization Project\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2015-09-15 06:45+0800\n"
-"PO-Revision-Date: 2015-09-30 14:53+0000\n"
+"POT-Creation-Date: 2015-12-22 22:50+0800\n"
+"PO-Revision-Date: 2015-12-25 11:57+0000\n"
 "Last-Translator: Dimitriy Ryazantcev <DJm00n@mail.ru>\n"
 "Language-Team: Russian (http://www.transifex.com/djm00n/git-po-ru/language/ru/)\n"
 "MIME-Version: 1.0\n"
@@ -31,13 +31,13 @@
 "as appropriate to mark resolution and make a commit."
 msgstr "Исправьте их в рабочем каталоге, затем запустите «git add/rm <файл>»,\nчтобы пометить исправление и сделайте коммит."
 
-#: advice.c:101 builtin/merge.c:1227
+#: advice.c:101 builtin/merge.c:1225
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Вы не завершили слияние (присутствует файл MERGE_HEAD)."
 
 #: advice.c:103
-msgid "Please, commit your changes before you can merge."
-msgstr "Выполните коммит ваших изменений, перед слиянием."
+msgid "Please, commit your changes before merging."
+msgstr "Перед слиянием, выполните коммит ваших изменений."
 
 #: advice.c:104
 msgid "Exiting because of unfinished merge."
@@ -61,76 +61,76 @@
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <репозиторий> [--exec <команда>] --list"
 
-#: archive.c:343 builtin/add.c:137 builtin/add.c:426 builtin/rm.c:327
+#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "спецификация пути «%s» не соответствует ни одному файлу"
 
-#: archive.c:428
+#: archive.c:429
 msgid "fmt"
 msgstr "формат"
 
-#: archive.c:428
+#: archive.c:429
 msgid "archive format"
 msgstr "формат архива"
 
-#: archive.c:429 builtin/log.c:1229
+#: archive.c:430 builtin/log.c:1229
 msgid "prefix"
 msgstr "префикс"
 
-#: archive.c:430
+#: archive.c:431
 msgid "prepend prefix to each pathname in the archive"
 msgstr "добавлять префикс перед каждым путем файла в архиве"
 
-#: archive.c:431 builtin/archive.c:88 builtin/blame.c:2516
-#: builtin/blame.c:2517 builtin/config.c:58 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:712 builtin/hash-object.c:99
+#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535
+#: builtin/blame.c:2536 builtin/config.c:58 builtin/fast-export.c:987
+#: builtin/fast-export.c:989 builtin/grep.c:707 builtin/hash-object.c:99
 #: builtin/ls-files.c:446 builtin/ls-files.c:449 builtin/notes.c:395
 #: builtin/notes.c:558 builtin/read-tree.c:109 parse-options.h:153
 msgid "file"
 msgstr "файл"
 
-#: archive.c:432 builtin/archive.c:89
+#: archive.c:433 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "запись архива в этот файл"
 
-#: archive.c:434
+#: archive.c:435
 msgid "read .gitattributes in working directory"
 msgstr "читать .gitattributes в рабочем каталоге"
 
-#: archive.c:435
+#: archive.c:436
 msgid "report archived files on stderr"
 msgstr "отчет об архивированных файлах в stderr"
 
-#: archive.c:436
+#: archive.c:437
 msgid "store only"
 msgstr "только хранение"
 
-#: archive.c:437
+#: archive.c:438
 msgid "compress faster"
 msgstr "сжимать быстрее"
 
-#: archive.c:445
+#: archive.c:446
 msgid "compress better"
 msgstr "сжимать лучше"
 
-#: archive.c:448
+#: archive.c:449
 msgid "list supported archive formats"
 msgstr "перечислить поддерживаемые форматы архивов"
 
-#: archive.c:450 builtin/archive.c:90 builtin/clone.c:77
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77
 msgid "repo"
 msgstr "репозиторий"
 
-#: archive.c:451 builtin/archive.c:91
+#: archive.c:452 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "получить архив из внешнего <репозитория>"
 
-#: archive.c:452 builtin/archive.c:92 builtin/notes.c:479
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479
 msgid "command"
 msgstr "комманда"
 
-#: archive.c:453 builtin/archive.c:93
+#: archive.c:454 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "путь к команде git-upload-archive на машине с внешним репозиторием"
 
@@ -140,82 +140,82 @@
 "Use '\\!' for literal leading exclamation."
 msgstr "Отрицающие шаблоны в атрибутах git игнорируются.\nИспользуйте «\\!» для буквального использования символа в значении «восклицательный знак»."
 
-#: branch.c:60
+#: branch.c:61
 #, c-format
 msgid "Not setting branch %s as its own upstream."
 msgstr "Не устанавливаю ветку %s, так так она принадлежит вышестоящему репозиторию."
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr "Ветка %s отслеживает внешнюю ветку %s из %s перемещением."
 
-#: branch.c:84
+#: branch.c:85
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr "Ветка %s отслеживает внешнюю ветку %s из %s."
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr "Ветка %s отслеживает локальную ветку %s перемещением."
 
-#: branch.c:89
+#: branch.c:90
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "Ветка %s отслеживает локальную ветку %s."
 
-#: branch.c:94
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr "Ветка %s отслеживает внешнюю ссылку %s перемещением."
 
-#: branch.c:95
+#: branch.c:96
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "Ветка %s отслеживает внешнюю ссылку %s."
 
-#: branch.c:99
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr "Ветка %s отслеживает локальную ссылку %s перемещением."
 
-#: branch.c:100
+#: branch.c:101
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "Ветка %s отслеживает локальную ссылку %s."
 
-#: branch.c:133
+#: branch.c:134
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "Не отслеживается: неоднозначная информация для ссылки %s"
 
-#: branch.c:162
+#: branch.c:163
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "«%s» не является действительным именем ветки."
 
-#: branch.c:167
+#: branch.c:168
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Ветка с именем «%s» уже существует."
 
-#: branch.c:175
+#: branch.c:176
 msgid "Cannot force update the current branch."
 msgstr "Не удалось принудительно обновить текущую ветку."
 
-#: branch.c:195
+#: branch.c:196
 #, c-format
 msgid ""
 "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr "Не удалось настроить информацию отслеживания; стартовая точка «%s» не является веткой."
 
-#: branch.c:197
+#: branch.c:198
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "запрошенная ветка вышестоящего репозитория «%s» не существует"
 
-#: branch.c:199
+#: branch.c:200
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -227,22 +227,22 @@
 "\"git push -u\" to set the upstream config as you push."
 msgstr "\nЕсли вы планируете основывать свою работу на вышестоящей ветке, которая уже существует во внешнем репозитории, вам может потребоваться запустить «git fetch» для ее получения.\n\nЕсли вы планируете отправить новую локальную ветку, которая будет отслеживаться, во внешний репозиторий, вам может потребоваться запустить «git push -u» — чтобы сохранить настройку вышестоящего репозитория для отправки."
 
-#: branch.c:243
+#: branch.c:244
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Недопустимое имя объекта: «%s»."
 
-#: branch.c:263
+#: branch.c:264
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Неоднозначное имя объекта: «%s»."
 
-#: branch.c:268
+#: branch.c:269
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Недопустимая точка ветки: «%s»."
 
-#: branch.c:399
+#: branch.c:322
 #, c-format
 msgid "'%s' is already checked out at '%s'"
 msgstr "«%s» уже находится на «%s»"
@@ -257,7 +257,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr "неопознанный заголовок: %s%s (%d)"
 
-#: bundle.c:87 builtin/commit.c:765
+#: bundle.c:87 builtin/commit.c:766
 #, c-format
 msgid "could not open '%s'"
 msgstr "не удалось открыть «%s»"
@@ -266,9 +266,9 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr "В репозитории отсутствуют необходимые коммиты:"
 
-#: bundle.c:163 sequencer.c:636 sequencer.c:1083 builtin/blame.c:2708
-#: builtin/branch.c:652 builtin/commit.c:1044 builtin/log.c:334
-#: builtin/log.c:850 builtin/log.c:1457 builtin/log.c:1690 builtin/merge.c:358
+#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083
+#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334
+#: builtin/log.c:849 builtin/log.c:1461 builtin/log.c:1694 builtin/merge.c:358
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "сбой инициализации прохода по редакциям"
@@ -312,7 +312,7 @@
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "ссылка «%s» исключена в соответствии с опциями rev-list"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1367 builtin/shortlog.c:261
+#: bundle.c:443 builtin/log.c:157 builtin/log.c:1369 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "неопознанный аргумент: %s"
@@ -330,13 +330,13 @@
 msgid "index-pack died"
 msgstr "критическая ошибка index-pack"
 
-#: color.c:260
+#: color.c:275
 #, c-format
 msgid "invalid color value: %.*s"
 msgstr "недопустимое значение цвета: %.*s"
 
-#: commit.c:40 builtin/am.c:451 builtin/am.c:487 builtin/am.c:1516
-#: builtin/am.c:2128
+#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520
+#: builtin/am.c:2149
 #, c-format
 msgid "could not parse %s"
 msgstr "не удалось разобрать %s"
@@ -512,54 +512,54 @@
 msgid "Performing inexact rename detection"
 msgstr "Выполняется неточное определение переименования"
 
-#: diff.c:116
+#: diff.c:115
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr "  Сбой разбора величины среза (cut-off) у dirstat «%s»\n"
 
-#: diff.c:121
+#: diff.c:120
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "Неизвестный параметр dirstat: «%s»\n"
 
-#: diff.c:216
+#: diff.c:215
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Неизвестное значения для переменной «diff.submodule»: «%s»"
 
-#: diff.c:268
+#: diff.c:267
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
 "%s"
 msgstr "Найдены ошибки в переменной «diff.dirstat»:\n%s"
 
-#: diff.c:2998
+#: diff.c:3000
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "критическая ошибка при внешнем сравнении, останов на %s"
 
-#: diff.c:3394
+#: diff.c:3396
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow требует ровно одной спецификации пути"
 
-#: diff.c:3557
+#: diff.c:3559
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
 "%s"
 msgstr "Сбой разбора параметра опции --dirstat/-X :\n%s"
 
-#: diff.c:3571
+#: diff.c:3573
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Сбой разбора параметра опции --submodule: «%s»"
 
-#: dir.c:1853
+#: dir.c:1915
 msgid "failed to get kernel name and information"
 msgstr "не удалось получить имя ядра и информацию"
 
-#: dir.c:1936
+#: dir.c:1998
 msgid "Untracked cache is disabled on this system."
 msgstr "Кэш неотслеживаемых файлов отключен на этой системе."
 
@@ -662,8 +662,8 @@
 msgid "failed to read the cache"
 msgstr "сбой чтения кэша"
 
-#: merge.c:94 builtin/am.c:2001 builtin/am.c:2036 builtin/checkout.c:375
-#: builtin/checkout.c:586 builtin/clone.c:715
+#: merge.c:94 builtin/am.c:2022 builtin/am.c:2057 builtin/checkout.c:376
+#: builtin/checkout.c:587 builtin/clone.c:722
 msgid "unable to write new index file"
 msgstr "не удалось записать новый файл индекса"
 
@@ -681,218 +681,218 @@
 msgid "error building trees"
 msgstr "ошибка при построении деревьев"
 
-#: merge-recursive.c:687
+#: merge-recursive.c:686
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "не удалось создать путь «%s»%s"
 
-#: merge-recursive.c:698
+#: merge-recursive.c:697
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Удаление %s, чтобы освободить место для подкаталогов\n"
 
-#: merge-recursive.c:712 merge-recursive.c:733
+#: merge-recursive.c:711 merge-recursive.c:732
 msgid ": perhaps a D/F conflict?"
 msgstr ": возможно, конфликт каталогов/файлов?"
 
-#: merge-recursive.c:723
+#: merge-recursive.c:722
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "отказ потери неотслеживаемого файла в «%s»"
 
-#: merge-recursive.c:763
+#: merge-recursive.c:762
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "невозможно прочитать объект %s «%s»"
 
-#: merge-recursive.c:765
+#: merge-recursive.c:764
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "ожидается двоичный объект для %s «%s»"
 
-#: merge-recursive.c:788 builtin/clone.c:364
+#: merge-recursive.c:787 builtin/clone.c:369
 #, c-format
 msgid "failed to open '%s'"
 msgstr "не удалось открыть «%s»"
 
-#: merge-recursive.c:796
+#: merge-recursive.c:795
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "не удалось создать символьную ссылку «%s»"
 
-#: merge-recursive.c:799
+#: merge-recursive.c:798
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "не понятно, что делать с %06o %s «%s»"
 
-#: merge-recursive.c:937
+#: merge-recursive.c:936
 msgid "Failed to execute internal merge"
 msgstr "Не удалось запустить внутреннее слияние"
 
-#: merge-recursive.c:941
+#: merge-recursive.c:940
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Не удалось добавить %s в базу данных"
 
-#: merge-recursive.c:957
+#: merge-recursive.c:956
 msgid "unsupported object type in the tree"
 msgstr "объект неподдерживаемого типа в дереве"
 
-#: merge-recursive.c:1032 merge-recursive.c:1046
+#: merge-recursive.c:1031 merge-recursive.c:1045
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
 "in tree."
 msgstr "КОНФЛИКТ (%s/удаление): %s удалено в %s и %s в %s. Версия %s из %s оставлена в дереве."
 
-#: merge-recursive.c:1038 merge-recursive.c:1051
+#: merge-recursive.c:1037 merge-recursive.c:1050
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
 "in tree at %s."
 msgstr "КОНФЛИКТ (%s/удаление): %s удалено в %s и %s в %s. Версия %s из %s оставлена в дереве на %s."
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "rename"
 msgstr "переименование"
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "renamed"
 msgstr "переименовано"
 
-#: merge-recursive.c:1148
+#: merge-recursive.c:1147
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s — это каталог в %s, добавляем как %s вместо этого"
 
-#: merge-recursive.c:1170
+#: merge-recursive.c:1169
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename "
 "\"%s\"->\"%s\" in \"%s\"%s"
 msgstr "КОНФЛИКТ (переименование/переименование): Переименование «%s»→«%s» в ветке «%s» и переименование «%s»→«%s» в ветке «%s»%s"
 
-#: merge-recursive.c:1175
+#: merge-recursive.c:1174
 msgid " (left unresolved)"
 msgstr " (оставлено неразрешенным)"
 
-#: merge-recursive.c:1229
+#: merge-recursive.c:1228
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr "КОНФЛИКТ (переименование/переименование): Переименование «%s»→«%s» в ветке «%s» и переименование «%s»→«%s» в ветке «%s»"
 
-#: merge-recursive.c:1259
+#: merge-recursive.c:1258
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Переименовываю %s в %s и %s в %s вместо этого"
 
-#: merge-recursive.c:1458
+#: merge-recursive.c:1457
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr "КОНФЛИКТ (переименование/добавление): Переименование «%s»→«%s» в ветке «%s» и добавление «%s» в ветке «%s»"
 
-#: merge-recursive.c:1468
+#: merge-recursive.c:1467
 #, c-format
 msgid "Adding merged %s"
 msgstr "Добавление слитого %s"
 
-#: merge-recursive.c:1473 merge-recursive.c:1671
+#: merge-recursive.c:1472 merge-recursive.c:1674
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Добавление вместо этого как %s"
 
-#: merge-recursive.c:1524
+#: merge-recursive.c:1523
 #, c-format
 msgid "cannot read object %s"
 msgstr "невозможно прочитать объект «%s»"
 
-#: merge-recursive.c:1527
+#: merge-recursive.c:1526
 #, c-format
 msgid "object %s is not a blob"
 msgstr "объект %s не является двоичным объектом"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modify"
 msgstr "изменение"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modified"
 msgstr "изменено"
 
-#: merge-recursive.c:1585
+#: merge-recursive.c:1588
 msgid "content"
 msgstr "содержимое"
 
-#: merge-recursive.c:1592
+#: merge-recursive.c:1595
 msgid "add/add"
 msgstr "добавление/добавление"
 
-#: merge-recursive.c:1626
+#: merge-recursive.c:1629
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Пропуск %s (слиты одинаковые изменения как существующие)"
 
-#: merge-recursive.c:1640
+#: merge-recursive.c:1643
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Автослияние %s"
 
-#: merge-recursive.c:1644 git-submodule.sh:1150
+#: merge-recursive.c:1647 git-submodule.sh:1025
 msgid "submodule"
 msgstr "подмодуль"
 
-#: merge-recursive.c:1645
+#: merge-recursive.c:1648
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "КОНФЛИКТ (%s): Конфликт слияния в %s"
 
-#: merge-recursive.c:1731
+#: merge-recursive.c:1734
 #, c-format
 msgid "Removing %s"
 msgstr "Удаление %s"
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1759
 msgid "file/directory"
 msgstr "файл/каталог"
 
-#: merge-recursive.c:1762
+#: merge-recursive.c:1765
 msgid "directory/file"
 msgstr "каталог/файл"
 
-#: merge-recursive.c:1767
+#: merge-recursive.c:1770
 #, c-format
 msgid ""
 "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr "КОНФЛИКТ (%s): Уже существует каталог с именем «%s» в «%s». Добавление «%s» как «%s»"
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1780
 #, c-format
 msgid "Adding %s"
 msgstr "Добавление %s"
 
-#: merge-recursive.c:1794
+#: merge-recursive.c:1797
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Критическая ошибка слияния, такого не должно случаться."
 
-#: merge-recursive.c:1813
+#: merge-recursive.c:1816
 msgid "Already up-to-date!"
 msgstr "Уже обновлено!"
 
-#: merge-recursive.c:1822
+#: merge-recursive.c:1825
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "сбой слияния деревьев «%s» и «%s»"
 
-#: merge-recursive.c:1852
+#: merge-recursive.c:1855
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "Необработанный путь??? %s"
 
-#: merge-recursive.c:1900
+#: merge-recursive.c:1903
 msgid "Merging:"
 msgstr "Слияние:"
 
-#: merge-recursive.c:1913
+#: merge-recursive.c:1916
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
@@ -901,16 +901,16 @@
 msgstr[2] "найдено %u общих предков:"
 msgstr[3] "найдено %u общих предков:"
 
-#: merge-recursive.c:1950
+#: merge-recursive.c:1953
 msgid "merge returned no commit"
 msgstr "слияние не вернуло коммит"
 
-#: merge-recursive.c:2007
+#: merge-recursive.c:2010
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Не удалось разобрать объект «%s»"
 
-#: merge-recursive.c:2018 builtin/merge.c:645
+#: merge-recursive.c:2021 builtin/merge.c:645
 msgid "Unable to write index."
 msgstr "Не удается записать индекс."
 
@@ -940,31 +940,41 @@
 msgid "unable to parse object: %s"
 msgstr "не удалось разобрать объект: %s"
 
-#: parse-options.c:563
+#: parse-options.c:570
 msgid "..."
 msgstr "…"
 
-#: parse-options.c:581
+#: parse-options.c:588
 #, c-format
 msgid "usage: %s"
 msgstr "использование: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:585
+#: parse-options.c:592
 #, c-format
 msgid "   or: %s"
 msgstr "          или: %s"
 
-#: parse-options.c:588
+#: parse-options.c:595
 #, c-format
 msgid "    %s"
 msgstr "            %s"
 
-#: parse-options.c:622
+#: parse-options.c:629
 msgid "-NUM"
 msgstr "-КОЛИЧЕСТВО"
 
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "Поврежденное имя объекта «%s»"
+
+#: path.c:752
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "Не удалось предоставить доступ к %s на запись"
+
 #: pathspec.c:133
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr "глобальные опции спецификации пути «glob» и «noglob» нельзя использовать одновременно"
@@ -1029,125 +1039,170 @@
 msgid "unable to parse --pretty format"
 msgstr "не удалось разобрать формат для --pretty"
 
-#: progress.c:236
+#: progress.c:235
 msgid "done"
 msgstr "готово"
 
-#: read-cache.c:1296
+#: read-cache.c:1281
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
 "Using version %i"
 msgstr "index.version указан, но значение недействительное.\nИспользую версию %i"
 
-#: read-cache.c:1306
+#: read-cache.c:1291
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
 "Using version %i"
 msgstr "GIT_INDEX_VERSION указан, но значение недействительное.\nИспользую версию %i"
 
-#: refs.c:2941 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
+#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
 #: builtin/merge.c:983
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Не удалось открыть «%s» для записи"
 
-#: refs.c:3001
+#: refs/files-backend.c:2359
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "не удалось удалить ссылку %s: %s"
 
-#: refs.c:3004
+#: refs/files-backend.c:2362
 #, c-format
 msgid "could not delete references: %s"
 msgstr "не удалось удалить ссылки: %s"
 
-#: refs.c:3013
+#: refs/files-backend.c:2371
 #, c-format
 msgid "could not remove reference %s"
 msgstr "не удалось удалить ссылки %s"
 
-#: ref-filter.c:660
+#: ref-filter.c:245
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "формат: частица %%(end) использована без соответствующей частицы"
+
+#: ref-filter.c:704
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "положительное значение ожидает содержимое:lines=%s"
+
+#: ref-filter.c:833
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "ожидаемый формат: %%(color:<color>)"
+
+#: ref-filter.c:835
 msgid "unable to parse format"
 msgstr "не удалось разобрать формат"
 
-#: remote.c:792
+#: ref-filter.c:870
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "ожидаемый формат: %%(align:<width>,<position>)"
+
+#: ref-filter.c:893
+#, c-format
+msgid "improper format entered align:%s"
+msgstr "указан неверный формат align:%s"
+
+#: ref-filter.c:898
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "ожидается положительная ширина с указанием частицы %%(align)"
+
+#: ref-filter.c:1219
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "Поврежденный объект «%s»"
+
+#: ref-filter.c:1561
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "format: пропущена частица %%(end)"
+
+#: ref-filter.c:1615
+#, c-format
+msgid "malformed object name %s"
+msgstr "плохое имя объекта %s"
+
+#: remote.c:756
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "Нельзя извлечь одновременно %s и %s в %s"
 
-#: remote.c:796
+#: remote.c:760
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s обычно отслеживает %s, а не %s"
 
-#: remote.c:800
+#: remote.c:764
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s отслеживает и %s и %s"
 
-#: remote.c:808
+#: remote.c:772
 msgid "Internal error"
 msgstr "Внутренняя ошибка"
 
-#: remote.c:1723 remote.c:1766
+#: remote.c:1687 remote.c:1730
 msgid "HEAD does not point to a branch"
 msgstr "HEAD не указывает на ветку"
 
-#: remote.c:1732
+#: remote.c:1696
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "нет такой ветки: «%s»"
 
-#: remote.c:1735
+#: remote.c:1699
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "вышестоящая ветка не настроена для ветки «%s»"
 
-#: remote.c:1741
+#: remote.c:1705
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "вышестоящая ветка «%s» не сохранена как отслеживаемая ветка"
 
-#: remote.c:1756
+#: remote.c:1720
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr "назначение для отправки «%s» на внешнем сервере «%s» не имеет локальной отслеживаемой ветки"
 
-#: remote.c:1771
+#: remote.c:1735
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "ветка «%s» не имеет внешнего сервера для отправки"
 
-#: remote.c:1782
+#: remote.c:1746
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "спецификации пути для отправки «%s» не включают в себя «%s»"
 
-#: remote.c:1795
+#: remote.c:1759
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "отправка не имеет точки назначения (push.default выставлен в «nothing»)"
 
-#: remote.c:1817
+#: remote.c:1781
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "не удалось выполнить «simple» отправку в единственную точку назначения"
 
-#: remote.c:2124
+#: remote.c:2083
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "Ваша ветка базируется на «%s», но вышестоящий репозиторий исчез.\n"
 
-#: remote.c:2128
+#: remote.c:2087
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "(для исправления запустите «git branch --unset-upstream»)\n"
 
-#: remote.c:2131
+#: remote.c:2090
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "Ваша ветка обновлена в соответствии с «%s».\n"
 
-#: remote.c:2135
+#: remote.c:2094
 #, 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"
@@ -1156,11 +1211,11 @@
 msgstr[2] "Ваша ветка опережает «%s» на %d коммитов.\n"
 msgstr[3] "Ваша ветка опережает «%s» на %d коммитов.\n"
 
-#: remote.c:2141
+#: remote.c:2100
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (используйте «git push», чтобы опубликовать ваши локальные коммиты)\n"
 
-#: remote.c:2144
+#: remote.c:2103
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1170,11 +1225,11 @@
 msgstr[2] "Ваша ветка отстает от «%s» на %d коммитов и может быть перемотана вперед.\n"
 msgstr[3] "Ваша ветка отстает от «%s» на %d коммитов и может быть перемотана вперед.\n"
 
-#: remote.c:2152
+#: remote.c:2111
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (используйте «git pull», чтобы обновить вашу локальную ветку)\n"
 
-#: remote.c:2155
+#: remote.c:2114
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1187,28 +1242,28 @@
 msgstr[2] "Ваша ветка и «%s» разошлись\nи теперь имеют %d и %d разных коммитов в каждой соответственно.\n"
 msgstr[3] "Ваша ветка и «%s» разошлись\nи теперь имеют %d и %d разных коммитов в каждой соответственно.\n"
 
-#: remote.c:2165
+#: remote.c:2124
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (используйте «git pull», чтобы слить внешнюю ветку в вашу)\n"
 
-#: revision.c:2198
+#: revision.c:2193
 msgid "your current branch appears to be broken"
 msgstr "похоже, ваша текущая ветка повреждена"
 
-#: revision.c:2201
+#: revision.c:2196
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "ваша текущая ветка «%s» еще не содержит ни одного коммита"
 
-#: revision.c:2395
+#: revision.c:2390
 msgid "--first-parent is incompatible with --bisect"
 msgstr "опцию --first-parent нельзя использовать одновременно с --bisect"
 
-#: run-command.c:83
+#: run-command.c:90
 msgid "open /dev/null failed"
 msgstr "сбой открытия /dev/null"
 
-#: run-command.c:85
+#: run-command.c:92
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) сбой"
@@ -1419,7 +1474,7 @@
 msgid "cannot abort from a branch yet to be born"
 msgstr "нельзя отменить изменения с ветки, которая еще не создана"
 
-#: sequencer.c:887 builtin/apply.c:4291
+#: sequencer.c:887 builtin/apply.c:4287
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "не удалось открыть %s: %s"
@@ -1461,12 +1516,12 @@
 msgid "Can't cherry-pick into empty head"
 msgstr "Нельзя отобрать лучшее в пустой HEAD"
 
-#: setup.c:243
+#: setup.c:248
 #, c-format
 msgid "failed to read %s"
 msgstr "не удалось прочитать %s"
 
-#: sha1_name.c:453
+#: sha1_name.c:463
 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"
@@ -1502,7 +1557,7 @@
 msgid "staging updated .gitmodules failed"
 msgstr "сбой индексирования обновленного .gitmodules"
 
-#: submodule.c:1045
+#: submodule.c:1040
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Не удалось установить core.worktree в %s"
@@ -1513,7 +1568,7 @@
 msgid "unknown value '%s' for key '%s'"
 msgstr "неизвестное значение «%s» для ключа «%s»"
 
-#: trailer.c:543 trailer.c:548 builtin/remote.c:290
+#: trailer.c:543 trailer.c:548 builtin/remote.c:296
 #, c-format
 msgid "more than one %s"
 msgstr "больше одного %s"
@@ -1580,8 +1635,8 @@
 msgid "could not open '%s' for writing"
 msgstr "не удалось открыть «%s» для записи"
 
-#: wrapper.c:223 wrapper.c:366 builtin/am.c:337 builtin/commit.c:1688
-#: builtin/merge.c:1076 builtin/pull.c:380
+#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691
+#: builtin/merge.c:1074 builtin/pull.c:380
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "не удалось открыть «%s» для чтения"
@@ -1596,30 +1651,21 @@
 msgid "unable to access '%s'"
 msgstr "«%s» недоступно"
 
-#: wrapper.c:611
-#, c-format
-msgid "unable to look up current user in the passwd file: %s"
-msgstr "не удалось запросить текущего пользователя в файле passwd: %s"
-
-#: wrapper.c:612
-msgid "no such user"
-msgstr "нет такого пользователя"
-
-#: wrapper.c:620
+#: wrapper.c:608
 msgid "unable to get current working directory"
 msgstr "не удалось получить текущий рабочий каталог"
 
-#: wrapper.c:631
+#: wrapper.c:635
 #, c-format
 msgid "could not open %s for writing"
 msgstr "не удалось открыть «%s» для записи"
 
-#: wrapper.c:642 builtin/am.c:424
+#: wrapper.c:646 builtin/am.c:425
 #, c-format
 msgid "could not write to %s"
 msgstr "не удалось записать в %s"
 
-#: wrapper.c:648
+#: wrapper.c:652
 #, c-format
 msgid "could not close %s"
 msgstr "не удалось закрыть %s"
@@ -1950,27 +1996,27 @@
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr "  (используйте «git bisect reset», чтобы вернуться на исходную ветку)"
 
-#: wt-status.c:1437
+#: wt-status.c:1438
 msgid "On branch "
 msgstr "На ветке "
 
-#: wt-status.c:1445
+#: wt-status.c:1444
 msgid "interactive rebase in progress; onto "
 msgstr "интерактивное перемещение в процессе; над "
 
-#: wt-status.c:1447
+#: wt-status.c:1446
 msgid "rebase in progress; onto "
 msgstr "перемещение в процессе; над "
 
-#: wt-status.c:1452
+#: wt-status.c:1451
 msgid "HEAD detached at "
 msgstr "HEAD отделен на "
 
-#: wt-status.c:1454
+#: wt-status.c:1453
 msgid "HEAD detached from "
 msgstr "HEAD отделен начиная с "
 
-#: wt-status.c:1457
+#: wt-status.c:1456
 msgid "Not currently on any branch."
 msgstr "Сейчас ни на одной из веток"
 
@@ -2022,7 +2068,7 @@
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
 "track)\n"
-msgstr "ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте \"git add\", чтобы отслеживать их)\n"
+msgstr "ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)\n"
 
 #: wt-status.c:1522
 #, c-format
@@ -2049,23 +2095,23 @@
 msgid "nothing to commit, working directory clean\n"
 msgstr "нечего коммитить, нет изменений в рабочем каталоге\n"
 
-#: wt-status.c:1644
-msgid "HEAD (no branch)"
-msgstr "HEAD (нет ветки)"
-
-#: wt-status.c:1650
+#: wt-status.c:1642
 msgid "Initial commit on "
 msgstr "Начальный коммит на "
 
-#: wt-status.c:1677
+#: wt-status.c:1646
+msgid "HEAD (no branch)"
+msgstr "HEAD (нет ветки)"
+
+#: wt-status.c:1675
 msgid "gone"
 msgstr "исчез"
 
-#: wt-status.c:1679 wt-status.c:1687
+#: wt-status.c:1677 wt-status.c:1685
 msgid "behind "
 msgstr "позади"
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:403
+#: compat/precompose_utf8.c:56 builtin/clone.c:408
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "сбой отсоединения «%s»"
@@ -2079,7 +2125,7 @@
 msgid "unexpected diff status %c"
 msgstr "неожиданный статус различий %c"
 
-#: builtin/add.c:70 builtin/commit.c:277
+#: builtin/add.c:70 builtin/commit.c:278
 msgid "updating files failed"
 msgstr "сбой при обновлении файлов"
 
@@ -2092,7 +2138,7 @@
 msgid "Unstaged changes after refreshing the index:"
 msgstr "Непроиндексированные изменения после обновления индекса:"
 
-#: builtin/add.c:194 builtin/rev-parse.c:799
+#: builtin/add.c:194 builtin/rev-parse.c:796
 msgid "Could not read the index"
 msgstr "Не удалось прочитать индекс"
 
@@ -2127,15 +2173,15 @@
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr "Следующие пути игнорируются одним из ваших файлов .gitignore:\n"
 
-#: builtin/add.c:249 builtin/clean.c:896 builtin/fetch.c:108 builtin/mv.c:110
-#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:545
-#: builtin/remote.c:1339 builtin/rm.c:268 builtin/send-pack.c:162
+#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:543
+#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162
 msgid "dry run"
 msgstr "пробный запуск"
 
-#: builtin/add.c:250 builtin/apply.c:4580 builtin/check-ignore.c:19
-#: builtin/commit.c:1321 builtin/count-objects.c:63 builtin/fsck.c:636
-#: builtin/log.c:1641 builtin/mv.c:109 builtin/read-tree.c:114
+#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19
+#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
+#: builtin/log.c:1645 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr "быть многословнее"
 
@@ -2143,7 +2189,7 @@
 msgid "interactive picking"
 msgstr "интерактивный выбор"
 
-#: builtin/add.c:253 builtin/checkout.c:1152 builtin/reset.c:286
+#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "интерактивный выбор блоков"
 
@@ -2200,410 +2246,412 @@
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "Опция --ignore-missing может использоваться только вместе с --dry-run"
 
-#: builtin/add.c:358
+#: builtin/add.c:352
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Ничего не указано, ничего не добавлено.\n"
 
-#: builtin/add.c:359
+#: builtin/add.c:353
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Возможно, вы имели в виду «git add .»?\n"
 
-#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:940
-#: builtin/commit.c:336 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938
+#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:40
 msgid "index file corrupt"
 msgstr "файл индекса поврежден"
 
-#: builtin/add.c:445 builtin/apply.c:4678 builtin/mv.c:279 builtin/rm.c:430
+#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430
 msgid "Unable to write new index file"
 msgstr "Не удалось записать новый файл индекса"
 
-#: builtin/am.c:41
+#: builtin/am.c:42
 #, c-format
 msgid "could not stat %s"
 msgstr "не удалось выполнить stat для %s"
 
-#: builtin/am.c:270 builtin/am.c:1345 builtin/commit.c:737
-#: builtin/merge.c:1079
+#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077
 #, c-format
 msgid "could not read '%s'"
 msgstr "не удалось прочитать «%s»"
 
-#: builtin/am.c:444
+#: builtin/am.c:445
 msgid "could not parse author script"
 msgstr "не удалось разобрать сценарий авторства"
 
-#: builtin/am.c:521
+#: builtin/am.c:522
 #, c-format
 msgid "'%s' was deleted by the applypatch-msg hook"
 msgstr "«%s» был удален перехватчиком applypatch-msg"
 
-#: builtin/am.c:562 builtin/notes.c:300
+#: builtin/am.c:563 builtin/notes.c:300
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Плохая строка ввода: «%s»."
 
-#: builtin/am.c:599 builtin/notes.c:315
+#: builtin/am.c:600 builtin/notes.c:315
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "Не удалось скопировать заметку из «%s» в «%s»"
 
-#: builtin/am.c:625
+#: builtin/am.c:626
 msgid "fseek failed"
 msgstr "сбой при выполнении fseek"
 
-#: builtin/am.c:786 builtin/am.c:874
+#: builtin/am.c:787 builtin/am.c:875
 #, c-format
 msgid "could not open '%s' for reading: %s"
 msgstr "не удалось открыть «%s» для чтения: %s"
 
-#: builtin/am.c:793
+#: builtin/am.c:794
 #, c-format
 msgid "could not open '%s' for writing: %s"
 msgstr "не удалось открыть «%s» для записи: %s"
 
-#: builtin/am.c:802
+#: builtin/am.c:803
 #, c-format
 msgid "could not parse patch '%s'"
 msgstr "не удалось разобрать патч «%s»"
 
-#: builtin/am.c:867
+#: builtin/am.c:868
 msgid "Only one StGIT patch series can be applied at once"
 msgstr "Только серия патчей StGIT может быть применена за раз"
 
-#: builtin/am.c:915
+#: builtin/am.c:916
 msgid "invalid timestamp"
 msgstr "недопустимая метка даты/времени"
 
-#: builtin/am.c:918 builtin/am.c:926
+#: builtin/am.c:919 builtin/am.c:927
 msgid "invalid Date line"
 msgstr "недопустимая строка даты"
 
-#: builtin/am.c:923
+#: builtin/am.c:924
 msgid "invalid timezone offset"
 msgstr "недопустимое смещение часового пояса"
 
-#: builtin/am.c:1010
+#: builtin/am.c:1011
 msgid "Patch format detection failed."
 msgstr "Сбой определения формата патча."
 
-#: builtin/am.c:1015 builtin/clone.c:368
+#: builtin/am.c:1016 builtin/clone.c:373
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "не удалось создать каталог «%s»"
 
-#: builtin/am.c:1019
+#: builtin/am.c:1020
 msgid "Failed to split patches."
 msgstr "Не удалось разделить патчи на части."
 
-#: builtin/am.c:1151 builtin/commit.c:362
+#: builtin/am.c:1152 builtin/commit.c:363
 msgid "unable to write index file"
 msgstr "не удалось записать индекс"
 
-#: builtin/am.c:1202
+#: builtin/am.c:1203
 #, c-format
 msgid "When you have resolved this problem, run \"%s --continue\"."
 msgstr "Когда вы устраните эту проблему, запустите «%s --continue»."
 
-#: builtin/am.c:1203
+#: builtin/am.c:1204
 #, c-format
 msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
 msgstr "Если вы хотите пропустить этот патч, то запустите «%s --skip»."
 
-#: builtin/am.c:1204
+#: builtin/am.c:1205
 #, c-format
 msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr "Чтобы вернуться на предыдущую ветку и остановить применение изменений, запустите «%s --abort»."
 
-#: builtin/am.c:1339
+#: builtin/am.c:1343
 msgid "Patch is empty. Was it split wrong?"
 msgstr "Патч пуст. Возможно, он был неправильно разделён?"
 
-#: builtin/am.c:1413 builtin/log.c:1345
+#: builtin/am.c:1417 builtin/log.c:1347
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "неправильная строка идентификации: %s"
 
-#: builtin/am.c:1440
+#: builtin/am.c:1444
 #, c-format
 msgid "unable to parse commit %s"
 msgstr "не удалось разобрать коммит %s"
 
-#: builtin/am.c:1614
+#: builtin/am.c:1646
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr "В репозитории отсутствуют двоичные объекты, необходимые для отката к трехходовому слиянию."
 
-#: builtin/am.c:1616
+#: builtin/am.c:1648
 msgid "Using index info to reconstruct a base tree..."
 msgstr "Использую индекс для реконструкции базового дерева…"
 
-#: builtin/am.c:1635
+#: builtin/am.c:1667
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
 msgstr "Вы вручную изменяли патч?\nОн не накладывается без ошибок на двоичные объекты, записанные в его заголовке."
 
-#: builtin/am.c:1641
+#: builtin/am.c:1673
 msgid "Falling back to patching base and 3-way merge..."
 msgstr "Откат к применению изменений к базовому коммиту с помощью трехходового слияния…"
 
-#: builtin/am.c:1666
+#: builtin/am.c:1688
 msgid "Failed to merge in the changes."
 msgstr "Не удалось слить изменения."
 
-#: builtin/am.c:1691 builtin/merge.c:632
+#: builtin/am.c:1712 builtin/merge.c:632
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree не удалось записать дерево"
 
-#: builtin/am.c:1698
+#: builtin/am.c:1719
 msgid "applying to an empty history"
 msgstr "применение к пустой истории"
 
-#: builtin/am.c:1711 builtin/commit.c:1752 builtin/merge.c:829
+#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829
 #: builtin/merge.c:854
 msgid "failed to write commit object"
 msgstr "сбой записи объекта коммита"
 
-#: builtin/am.c:1743 builtin/am.c:1747
+#: builtin/am.c:1764 builtin/am.c:1768
 #, c-format
 msgid "cannot resume: %s does not exist."
 msgstr "нельзя продолжнить: %s не существует "
 
-#: builtin/am.c:1763
+#: builtin/am.c:1784
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr "не удалось использовать интерактивное поведение, без stdin подключенного к терминалу."
 
-#: builtin/am.c:1768
+#: builtin/am.c:1789
 msgid "Commit Body is:"
 msgstr "Тело коммита:"
 
 #. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
 #. in your translation. The program will only accept English
 #. input at this point.
-#: builtin/am.c:1778
+#: builtin/am.c:1799
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 msgstr "Применить? [y] - да/[n] - нет/[e] - редактировать/[v] - просмотреть патч/[a] - применить всё: "
 
-#: builtin/am.c:1828
+#: builtin/am.c:1849
 #, c-format
 msgid "Dirty index: cannot apply patches (dirty: %s)"
 msgstr "Индекс не пустой: нельзя применять патчи (в индексе: %s)"
 
-#: builtin/am.c:1863 builtin/am.c:1934
+#: builtin/am.c:1884 builtin/am.c:1955
 #, c-format
 msgid "Applying: %.*s"
 msgstr "Применение: %.*s"
 
-#: builtin/am.c:1879
+#: builtin/am.c:1900
 msgid "No changes -- Patch already applied."
 msgstr "Нет изменений — Патч уже применен."
 
-#: builtin/am.c:1887
+#: builtin/am.c:1908
 #, c-format
 msgid "Patch failed at %s %.*s"
 msgstr "Ошибка применения изменений на %s %.*s"
 
-#: builtin/am.c:1893
+#: builtin/am.c:1914
 #, c-format
 msgid "The copy of the patch that failed is found in: %s"
 msgstr "Копию изменений, которые не удалось применить, вы можете найти в: %s"
 
-#: builtin/am.c:1937
+#: builtin/am.c:1958
 msgid ""
 "No changes - did you forget to use 'git add'?\n"
 "If there is nothing left to stage, chances are that something else\n"
 "already introduced the same changes; you might want to skip this patch."
 msgstr "Нет изменений — возможно, вы забыли вызвать «git add»?\nЕсли ничего не осталось для индексации, то, скорее всего, что-то другое уже сделало те же изменения; возможно, вам следует пропустить этот патч."
 
-#: builtin/am.c:1944
+#: builtin/am.c:1965
 msgid ""
 "You still have unmerged paths in your index.\n"
 "Did you forget to use 'git add'?"
 msgstr "У вас все еще имеются не слитые пути в индексе.\nВозможно, вы забыли вызвать «git add»?"
 
-#: builtin/am.c:2052 builtin/am.c:2056 builtin/am.c:2068 builtin/reset.c:308
+#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308
 #: builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "Не удалось разобрать объект «%s»."
 
-#: builtin/am.c:2104
+#: builtin/am.c:2125
 msgid "failed to clean index"
 msgstr "не удалось очистить индекс"
 
-#: builtin/am.c:2138
+#: builtin/am.c:2159
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
 msgstr "Похоже, что вы переместили HEAD с момента последней ошибки выполнения «am».\nПеремотка на ORIG_HEAD не выполняется"
 
-#: builtin/am.c:2199
+#: builtin/am.c:2220
 #, c-format
 msgid "Invalid value for --patch-format: %s"
 msgstr "Неправильное значение для --patch-format: %s"
 
-#: builtin/am.c:2221
-msgid "git am [options] [(<mbox>|<Maildir>)...]"
-msgstr "git am [опции] [(<mbox>|<Maildir>)…]"
+#: builtin/am.c:2253
+msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
+msgstr "git am [<опции>] [(<mbox>|<Maildir>)…]"
 
-#: builtin/am.c:2222
-msgid "git am [options] (--continue | --skip | --abort)"
-msgstr "git am [опции] (--continue | --skip | --abort)"
+#: builtin/am.c:2254
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<опции>] (--continue | --skip | --abort)"
 
-#: builtin/am.c:2228
+#: builtin/am.c:2260
 msgid "run interactively"
 msgstr "запустить в интерактивном режиме"
 
-#: builtin/am.c:2230
+#: builtin/am.c:2262
 msgid "historical option -- no-op"
 msgstr "историческая опция — ничего не делает"
 
-#: builtin/am.c:2232
+#: builtin/am.c:2264
 msgid "allow fall back on 3way merging if needed"
 msgstr "разрешить откатиться к трехходовому слиянию, если нужно"
 
-#: builtin/am.c:2233 builtin/init-db.c:509 builtin/prune-packed.c:57
+#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57
 #: builtin/repack.c:171
 msgid "be quiet"
 msgstr "тихий режим"
 
-#: builtin/am.c:2235
+#: builtin/am.c:2267
 msgid "add a Signed-off-by line to the commit message"
 msgstr "добавить строку Signed-off-by к сообщению коммита"
 
-#: builtin/am.c:2238
+#: builtin/am.c:2270
 msgid "recode into utf8 (default)"
 msgstr "перекодировать в utf8 (по умолчанию)"
 
-#: builtin/am.c:2240
+#: builtin/am.c:2272
 msgid "pass -k flag to git-mailinfo"
 msgstr "передать флаг -k в git-mailinfo"
 
-#: builtin/am.c:2242
+#: builtin/am.c:2274
 msgid "pass -b flag to git-mailinfo"
 msgstr "передать флаг -b в git-mailinfo"
 
-#: builtin/am.c:2244
+#: builtin/am.c:2276
 msgid "pass -m flag to git-mailinfo"
 msgstr "передать флаг -m в git-mailinfo"
 
-#: builtin/am.c:2246
+#: builtin/am.c:2278
 msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr "передать флаг --keep-cr в git-mailsplit для формата mbox"
 
-#: builtin/am.c:2249
+#: builtin/am.c:2281
 msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr "не передавать --keep-cr флаг в git-mailsplit вне зависимости от am.keepcr"
 
-#: builtin/am.c:2252
+#: builtin/am.c:2284
 msgid "strip everything before a scissors line"
 msgstr "обрезать все до строки обрезки"
 
-#: builtin/am.c:2253 builtin/apply.c:4563
+#: builtin/am.c:2285 builtin/apply.c:4554
 msgid "action"
 msgstr "действие"
 
-#: builtin/am.c:2254 builtin/am.c:2257 builtin/am.c:2260 builtin/am.c:2263
-#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
-#: builtin/am.c:2281
+#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295
+#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307
+#: builtin/am.c:2313
 msgid "pass it through git-apply"
 msgstr "передать его в git-apply"
 
-#: builtin/am.c:2262 builtin/apply.c:4587
+#: builtin/am.c:2294 builtin/apply.c:4578
 msgid "root"
 msgstr "корень"
 
-#: builtin/am.c:2265 builtin/am.c:2268 builtin/apply.c:4525
-#: builtin/apply.c:4528 builtin/clone.c:85 builtin/fetch.c:93
-#: builtin/pull.c:167
+#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516
+#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93
+#: builtin/pull.c:167 builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
 msgid "path"
 msgstr "путь"
 
-#: builtin/am.c:2271 builtin/fmt-merge-msg.c:669 builtin/fmt-merge-msg.c:672
-#: builtin/grep.c:698 builtin/merge.c:198 builtin/pull.c:127
-#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:664
-#: builtin/show-ref.c:180 builtin/tag.c:591 parse-options.h:132
-#: parse-options.h:134 parse-options.h:243
+#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
+#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127
+#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645
+#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
+#: parse-options.h:134 parse-options.h:244
 msgid "n"
 msgstr "n"
 
-#: builtin/am.c:2274 builtin/apply.c:4531
+#: builtin/am.c:2306 builtin/apply.c:4522
 msgid "num"
 msgstr "количество"
 
-#: builtin/am.c:2277 builtin/for-each-ref.c:34 builtin/replace.c:438
+#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
 msgid "format"
 msgstr "формат"
 
-#: builtin/am.c:2278
+#: builtin/am.c:2310
 msgid "format the patch(es) are in"
 msgstr "формат, в котором находятся патчи"
 
-#: builtin/am.c:2284
+#: builtin/am.c:2316
 msgid "override error message when patch failure occurs"
 msgstr "переопределить сообщение об ошибке, если не удалось наложить изменения"
 
-#: builtin/am.c:2286
+#: builtin/am.c:2318
 msgid "continue applying patches after resolving a conflict"
 msgstr "продолжить применение изменений после разрешения конфиликта"
 
-#: builtin/am.c:2289
+#: builtin/am.c:2321
 msgid "synonyms for --continue"
 msgstr "синонимы для --continue"
 
-#: builtin/am.c:2292
+#: builtin/am.c:2324
 msgid "skip the current patch"
 msgstr "пропустить текущий патч"
 
-#: builtin/am.c:2295
+#: builtin/am.c:2327
 msgid "restore the original branch and abort the patching operation."
 msgstr "восстановить оригинальную ветку и отменить операцию применения изменений."
 
-#: builtin/am.c:2299
+#: builtin/am.c:2331
 msgid "lie about committer date"
 msgstr "соврать о дате коммитера"
 
-#: builtin/am.c:2301
+#: builtin/am.c:2333
 msgid "use current timestamp for author date"
 msgstr "использовать текущее время как время авторства"
 
-#: builtin/am.c:2303 builtin/commit.c:1590 builtin/merge.c:225
-#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:606
+#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225
+#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355
 msgid "key-id"
 msgstr "key-id"
 
-#: builtin/am.c:2304
+#: builtin/am.c:2336
 msgid "GPG-sign commits"
 msgstr "подписать коммиты с помощью GPG"
 
-#: builtin/am.c:2307
+#: builtin/am.c:2339
 msgid "(internal use for git-rebase)"
 msgstr "(внутреннее использование для git-rebase)"
 
-#: builtin/am.c:2322
+#: builtin/am.c:2354
 msgid ""
 "The -b/--binary option has been a no-op for long time, and\n"
 "it will be removed. Please do not use it anymore."
 msgstr "Опция -b/--binary уже долгое время ничего не делает и будет удалена с следующих версиях Git. Пожалуйста, не используйте ее."
 
-#: builtin/am.c:2329
+#: builtin/am.c:2361
 msgid "failed to read the index"
 msgstr "сбой чтения индекса"
 
-#: builtin/am.c:2344
+#: builtin/am.c:2376
 #, c-format
 msgid "previous rebase directory %s still exists but mbox given."
 msgstr "предыдущий каталог перемещения %s еще существует, но передан mbox."
 
-#: builtin/am.c:2368
+#: builtin/am.c:2400
 #, c-format
 msgid ""
 "Stray %s directory found.\n"
 "Use \"git am --abort\" to remove it."
 msgstr "Найден забытый каталог %s.\nИспользуйте «git am --abort», чтобы удалить его."
 
-#: builtin/am.c:2374
+#: builtin/am.c:2406
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr "Операция разрешения конфликтов не в процессе выполнения, не продолжаем."
 
@@ -2611,62 +2659,62 @@
 msgid "git apply [<options>] [<patch>...]"
 msgstr "git apply [<опции>] [<патч>…]"
 
-#: builtin/apply.c:112
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
 msgstr "неопознанная опция для пробелов «%s»"
 
-#: builtin/apply.c:127
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "неопознанная опция для игнорирования пробелов «%s»"
 
-#: builtin/apply.c:822
+#: builtin/apply.c:818
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "Не удалось подготовить регулярное выражение для метки времени %s"
 
-#: builtin/apply.c:831
+#: builtin/apply.c:827
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "regexec возвратил %d для ввода: %s"
 
-#: builtin/apply.c:912
+#: builtin/apply.c:908
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "не удалось найти имя файла в строке патча %d"
 
-#: builtin/apply.c:944
+#: builtin/apply.c:940
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr "git apply: плохой git-diff — ожидалось /dev/null, получено %s на строке %d"
 
-#: builtin/apply.c:948
+#: builtin/apply.c:944
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr "git apply: плохой git-diff — не согласующееся новое имя файла на строке %d"
 
-#: builtin/apply.c:949
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr "git apply: плохой git-diff — не согласующееся старое имя файла на строке %d"
 
-#: builtin/apply.c:956
+#: builtin/apply.c:952
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr "git apply: плохой git-diff  — ожидалось /dev/null на строке %d"
 
-#: builtin/apply.c:1419
+#: builtin/apply.c:1415
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "recount: не ожидаемая строка: %.*s"
 
-#: builtin/apply.c:1476
+#: builtin/apply.c:1472
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "фрагмент изменений без заголовка на строке %d: %.*s"
 
-#: builtin/apply.c:1493
+#: builtin/apply.c:1489
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname"
@@ -2679,65 +2727,65 @@
 msgstr[2] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
 msgstr[3] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
 
-#: builtin/apply.c:1659
+#: builtin/apply.c:1655
 msgid "new file depends on old contents"
 msgstr "новый файл зависит от старого содержимого"
 
-#: builtin/apply.c:1661
+#: builtin/apply.c:1657
 msgid "deleted file still has contents"
 msgstr "удаленный файл все еще имеет содержимое"
 
-#: builtin/apply.c:1687
+#: builtin/apply.c:1683
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "патч поврежден на строке %d"
 
-#: builtin/apply.c:1723
+#: builtin/apply.c:1719
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "новый файл %s зависит от старого содержимого"
 
-#: builtin/apply.c:1725
+#: builtin/apply.c:1721
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "удаленный файл %s все еще имеет содержимое"
 
-#: builtin/apply.c:1728
+#: builtin/apply.c:1724
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "** предупреждение: файл %s становится пустым, но не удаляется"
 
-#: builtin/apply.c:1874
+#: builtin/apply.c:1870
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "поврежденный двоичный патч на строке %d: %.*s"
 
-#: builtin/apply.c:1903
+#: builtin/apply.c:1899
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "неопознанный двоичный патч на строке %d"
 
-#: builtin/apply.c:2054
+#: builtin/apply.c:2050
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "патч с мусором на строке %d"
 
-#: builtin/apply.c:2144
+#: builtin/apply.c:2140
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "не удалось прочитать символьную ссылку %s"
 
-#: builtin/apply.c:2148
+#: builtin/apply.c:2144
 #, c-format
 msgid "unable to open or read %s"
 msgstr "не удалось открыть или прочесть %s"
 
-#: builtin/apply.c:2781
+#: builtin/apply.c:2777
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "неправильное начало строки: «%c»"
 
-#: builtin/apply.c:2900
+#: builtin/apply.c:2896
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
@@ -2746,177 +2794,177 @@
 msgstr[2] "Часть #%d успешно применена на %d (со сдвигом в %d строк)."
 msgstr[3] "Часть #%d успешно применена на %d (со сдвигом в %d строк)."
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2908
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr "Контекст сужен до (%ld/%ld), чтобы применить фрагмент на %d строке"
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2914
 #, c-format
 msgid ""
 "while searching for:\n"
 "%.*s"
 msgstr "при поиске:\n%.*s"
 
-#: builtin/apply.c:2938
+#: builtin/apply.c:2934
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "пропущены данные двоичного патча для «%s»"
 
-#: builtin/apply.c:3039
+#: builtin/apply.c:3035
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "не удалось применить двоичный патч к «%s»"
 
-#: builtin/apply.c:3045
+#: builtin/apply.c:3041
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr "после применения двоичного патча для «%s» был получен неправильный результат (ожидалось %s, получено %s)"
 
-#: builtin/apply.c:3066
+#: builtin/apply.c:3062
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "ошибка применения изменений: %s:%ld"
 
-#: builtin/apply.c:3190
+#: builtin/apply.c:3186
 #, c-format
 msgid "cannot checkout %s"
 msgstr "не удалось перейти на %s"
 
-#: builtin/apply.c:3235 builtin/apply.c:3246 builtin/apply.c:3291
+#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
 #, c-format
 msgid "read of %s failed"
 msgstr "ошибка чтения %s"
 
-#: builtin/apply.c:3243
+#: builtin/apply.c:3239
 #, c-format
 msgid "reading from '%s' beyond a symbolic link"
 msgstr "чтение из «%s» за символической ссылкой"
 
-#: builtin/apply.c:3271 builtin/apply.c:3493
+#: builtin/apply.c:3267 builtin/apply.c:3489
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "путь %s был переименован/удален"
 
-#: builtin/apply.c:3352 builtin/apply.c:3507
+#: builtin/apply.c:3348 builtin/apply.c:3503
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s: нет в индексе"
 
-#: builtin/apply.c:3356 builtin/apply.c:3499 builtin/apply.c:3521
+#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: builtin/apply.c:3361 builtin/apply.c:3515
+#: builtin/apply.c:3357 builtin/apply.c:3511
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s: не совпадает с индексом"
 
-#: builtin/apply.c:3463
+#: builtin/apply.c:3459
 msgid "removal patch leaves file contents"
 msgstr "патч удаления не удалил содержимое файла"
 
-#: builtin/apply.c:3532
+#: builtin/apply.c:3528
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s: неправильный тип"
 
-#: builtin/apply.c:3534
+#: builtin/apply.c:3530
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s имеет тип %o, а ожидался %o"
 
-#: builtin/apply.c:3693 builtin/apply.c:3695
+#: builtin/apply.c:3689 builtin/apply.c:3691
 #, c-format
 msgid "invalid path '%s'"
 msgstr "неправильный путь «%s»"
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3746
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s: уже содержится в индексе"
 
-#: builtin/apply.c:3753
+#: builtin/apply.c:3749
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s: уже содержится в рабочем каталоге"
 
-#: builtin/apply.c:3773
+#: builtin/apply.c:3769
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "новый режим доступа (%o) для %s не соответствует старому режиму доступа (%o)"
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3774
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr "новый режим доступа (%o) для %s не соответствует старому режиму доступа (%o) для %s"
 
-#: builtin/apply.c:3798
+#: builtin/apply.c:3794
 #, c-format
 msgid "affected file '%s' is beyond a symbolic link"
 msgstr "затронутый файл «%s» находится за символической ссылкой"
 
-#: builtin/apply.c:3802
+#: builtin/apply.c:3798
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s: не удалось применить патч"
 
-#: builtin/apply.c:3816
+#: builtin/apply.c:3812
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Проверка патча %s…"
 
-#: builtin/apply.c:3909 builtin/checkout.c:232 builtin/reset.c:135
+#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "сбой make_cache_entry для пути «%s»"
 
-#: builtin/apply.c:4052
+#: builtin/apply.c:4048
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "не удалось удалить %s из индекса"
 
-#: builtin/apply.c:4081
+#: builtin/apply.c:4077
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "поврежденный патч для подмодуля %s"
 
-#: builtin/apply.c:4085
+#: builtin/apply.c:4081
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "не удалось выполнить stat для созданного файла «%s»"
 
-#: builtin/apply.c:4090
+#: builtin/apply.c:4086
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr "не удалось создать вспомогательный файл для созданного файла %s"
 
-#: builtin/apply.c:4093 builtin/apply.c:4201
+#: builtin/apply.c:4089 builtin/apply.c:4197
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "не удалось создать запись в кэше для %s"
 
-#: builtin/apply.c:4126
+#: builtin/apply.c:4122
 #, c-format
 msgid "closing file '%s'"
 msgstr "закрытие файла «%s»"
 
-#: builtin/apply.c:4175
+#: builtin/apply.c:4171
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "не удалось записать файл «%s» с режимом доступа %o"
 
-#: builtin/apply.c:4262
+#: builtin/apply.c:4258
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Патч %s применен без ошибок."
 
-#: builtin/apply.c:4270
+#: builtin/apply.c:4266
 msgid "internal error"
 msgstr "внутренняя ошибка"
 
-#: builtin/apply.c:4273
+#: builtin/apply.c:4269
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
@@ -2925,147 +2973,147 @@
 msgstr[2] "Применение патча %%s с %d отказами…"
 msgstr[3] "Применение патча %%s с %d отказами…"
 
-#: builtin/apply.c:4283
+#: builtin/apply.c:4279
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "усечение имени .rej файла до %.*s.rej"
 
-#: builtin/apply.c:4304
+#: builtin/apply.c:4300
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "Блок №%d применен без ошибок."
 
-#: builtin/apply.c:4307
+#: builtin/apply.c:4303
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "Блок №%d отклонен."
 
-#: builtin/apply.c:4397
+#: builtin/apply.c:4393
 msgid "unrecognized input"
 msgstr "не распознанный ввод"
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4404
 msgid "unable to read index file"
 msgstr "не удалось прочитать файл индекса"
 
-#: builtin/apply.c:4526
+#: builtin/apply.c:4517
 msgid "don't apply changes matching the given path"
 msgstr "не применять изменения по указанному пути"
 
-#: builtin/apply.c:4529
+#: builtin/apply.c:4520
 msgid "apply changes matching the given path"
 msgstr "применять изменения по указанному пути"
 
-#: builtin/apply.c:4532
+#: builtin/apply.c:4523
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "удалить <количество> ведущих косых черт из традиционных путей списка изменений"
 
-#: builtin/apply.c:4535
+#: builtin/apply.c:4526
 msgid "ignore additions made by the patch"
 msgstr "игнорировать добавления, сделанные этим патчем"
 
-#: builtin/apply.c:4537
+#: builtin/apply.c:4528
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr "вместо применения патча вывести статистику добавлений и удалений для ввода"
 
-#: builtin/apply.c:4541
+#: builtin/apply.c:4532
 msgid "show number of added and deleted lines in decimal notation"
 msgstr "показать количество добавленных и удаленных строк в десятичном представлении"
 
-#: builtin/apply.c:4543
+#: builtin/apply.c:4534
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "вместо применения патча вывести статистику изменений для ввода"
 
-#: builtin/apply.c:4545
+#: builtin/apply.c:4536
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "вместо применения патча проверить подходит ли он"
 
-#: builtin/apply.c:4547
+#: builtin/apply.c:4538
 msgid "make sure the patch is applicable to the current index"
 msgstr "проверить, что патч применяется к текущему индексу"
 
-#: builtin/apply.c:4549
+#: builtin/apply.c:4540
 msgid "apply a patch without touching the working tree"
 msgstr "применить патч, не изменяя рабочий каталог"
 
-#: builtin/apply.c:4551
+#: builtin/apply.c:4542
 msgid "accept a patch that touches outside the working area"
 msgstr "принять патч, который затрагивает файлы за рабочим каталогом"
 
-#: builtin/apply.c:4553
+#: builtin/apply.c:4544
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr "а также применить патч (используйте с --stat/--summary/--check)"
 
-#: builtin/apply.c:4555
+#: builtin/apply.c:4546
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "попытаться сделать трехходовое слияние, если патч не применяется"
 
-#: builtin/apply.c:4557
+#: builtin/apply.c:4548
 msgid "build a temporary index based on embedded index information"
 msgstr "построить временный индекс, основанный на встроенной информации об индексе"
 
-#: builtin/apply.c:4559 builtin/checkout-index.c:198 builtin/ls-files.c:412
+#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412
 msgid "paths are separated with NUL character"
 msgstr "пути, отделенные НУЛЕВЫМ символом"
 
-#: builtin/apply.c:4562
+#: builtin/apply.c:4553
 msgid "ensure at least <n> lines of context match"
 msgstr "удостовериться, что по крайней мере <n> строк контекста совпадают"
 
-#: builtin/apply.c:4564
+#: builtin/apply.c:4555
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "определять новые или модифицированные строки, у которых есть ошибки в пробельных символах"
 
-#: builtin/apply.c:4567 builtin/apply.c:4570
+#: builtin/apply.c:4558 builtin/apply.c:4561
 msgid "ignore changes in whitespace when finding context"
 msgstr "игнорировать изменения в пробельных символах при поиске контекста"
 
-#: builtin/apply.c:4573
+#: builtin/apply.c:4564
 msgid "apply the patch in reverse"
 msgstr "применить патч с обращением изменений"
 
-#: builtin/apply.c:4575
+#: builtin/apply.c:4566
 msgid "don't expect at least one line of context"
 msgstr "не ожидать как минимум одной строки контекста"
 
-#: builtin/apply.c:4577
+#: builtin/apply.c:4568
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "оставить отклоненные блоки изменений в соответствующих *.rej файлах"
 
-#: builtin/apply.c:4579
+#: builtin/apply.c:4570
 msgid "allow overlapping hunks"
 msgstr "разрешить перекрывающиеся блоки изменений"
 
-#: builtin/apply.c:4582
+#: builtin/apply.c:4573
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr "разрешить некорректно определенные пропущенные пустые строки в конце файла"
 
-#: builtin/apply.c:4585
+#: builtin/apply.c:4576
 msgid "do not trust the line counts in the hunk headers"
 msgstr "не доверять количеству строк из заголовка блока изменений"
 
-#: builtin/apply.c:4588
+#: builtin/apply.c:4579
 msgid "prepend <root> to all filenames"
 msgstr "добавить <корень> спереди ко всем именам файлов"
 
-#: builtin/apply.c:4610
+#: builtin/apply.c:4601
 msgid "--3way outside a repository"
 msgstr "--3way вне репозитория"
 
-#: builtin/apply.c:4618
+#: builtin/apply.c:4609
 msgid "--index outside a repository"
 msgstr "--index вне репозитория"
 
-#: builtin/apply.c:4621
+#: builtin/apply.c:4612
 msgid "--cached outside a repository"
 msgstr "--cached вне репозитория"
 
-#: builtin/apply.c:4640
+#: builtin/apply.c:4631
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "не удалось открыть патч «%s»"
 
-#: builtin/apply.c:4654
+#: builtin/apply.c:4645
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
@@ -3074,7 +3122,7 @@
 msgstr[2] "пропущено %d ошибок в пробельных символах"
 msgstr[3] "пропущено %d ошибок в пробельных символах"
 
-#: builtin/apply.c:4660 builtin/apply.c:4670
+#: builtin/apply.c:4651 builtin/apply.c:4661
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -3138,95 +3186,95 @@
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<опции-rev-list> документированы в git-rev-list(1)"
 
-#: builtin/blame.c:2500
+#: builtin/blame.c:2519
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Показать записи авторства постепенно, в процессе нахождения"
 
-#: builtin/blame.c:2501
+#: builtin/blame.c:2520
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "Не показывать SHA-1 для коммитов, не входящих в границы запроса (По умолчанию: отключено)"
 
-#: builtin/blame.c:2502
+#: builtin/blame.c:2521
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Не воспринимать корневые коммиты как граничные (По умолчанию: отключено)"
 
-#: builtin/blame.c:2503
+#: builtin/blame.c:2522
 msgid "Show work cost statistics"
 msgstr "Показать статистику расходов на выполнение запроса"
 
-#: builtin/blame.c:2504
+#: builtin/blame.c:2523
 msgid "Show output score for blame entries"
 msgstr "Показать оценку для записей авторства"
 
-#: builtin/blame.c:2505
+#: builtin/blame.c:2524
 msgid "Show original filename (Default: auto)"
 msgstr "Показать оригинальное имя файла (По умолчанию: автоматически)"
 
-#: builtin/blame.c:2506
+#: builtin/blame.c:2525
 msgid "Show original linenumber (Default: off)"
 msgstr "Показать оригинальные номера строк (По умолчанию: отключено)"
 
-#: builtin/blame.c:2507
+#: builtin/blame.c:2526
 msgid "Show in a format designed for machine consumption"
 msgstr "Показать в формате для программного разбора"
 
-#: builtin/blame.c:2508
+#: builtin/blame.c:2527
 msgid "Show porcelain format with per-line commit information"
 msgstr "Показать в машиночитаемом формате, с построчной информацией о коммите"
 
-#: builtin/blame.c:2509
+#: builtin/blame.c:2528
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Использовать такой же формат вывода, как и git-annotate (По умолчанию: отключено)"
 
-#: builtin/blame.c:2510
+#: builtin/blame.c:2529
 msgid "Show raw timestamp (Default: off)"
 msgstr "Показать необработанные временные метки (По умолчанию: отключено)"
 
-#: builtin/blame.c:2511
+#: builtin/blame.c:2530
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Показать длинный SHA1 идентификатор коммита (По умолчанию: отключено)"
 
-#: builtin/blame.c:2512
+#: builtin/blame.c:2531
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Не показывать имя автора и временные метки (По умолчанию: отключено)"
 
-#: builtin/blame.c:2513
+#: builtin/blame.c:2532
 msgid "Show author email instead of name (Default: off)"
 msgstr "Показать почту автора вместо имени (По умолчанию: отключено)"
 
-#: builtin/blame.c:2514
+#: builtin/blame.c:2533
 msgid "Ignore whitespace differences"
 msgstr "Игнорировать различия в пробелах"
 
-#: builtin/blame.c:2515
+#: builtin/blame.c:2534
 msgid "Spend extra cycles to find better match"
 msgstr "Потратить больше времени, для нахождения лучших совпадений"
 
-#: builtin/blame.c:2516
+#: builtin/blame.c:2535
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Использовать редакции из <файла> вместо вызова git-rev-list"
 
-#: builtin/blame.c:2517
+#: builtin/blame.c:2536
 msgid "Use <file>'s contents as the final image"
 msgstr "Использовать содержимое <файла> как финальный снимок"
 
-#: builtin/blame.c:2518 builtin/blame.c:2519
+#: builtin/blame.c:2537 builtin/blame.c:2538
 msgid "score"
 msgstr "мин-длина"
 
-#: builtin/blame.c:2518
+#: builtin/blame.c:2537
 msgid "Find line copies within and across files"
 msgstr "Найти копирование строк в пределах и между файлами"
 
-#: builtin/blame.c:2519
+#: builtin/blame.c:2538
 msgid "Find line movements within and across files"
 msgstr "Найти перемещения строк в пределах и между файлами"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "n,m"
 msgstr "начало,конец"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "Process only line range n,m, counting from 1"
 msgstr "Обработать только строки в диапазоне начало,конец, начиная с 1"
 
@@ -3236,396 +3284,392 @@
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2601
+#: builtin/blame.c:2620
 msgid "4 years, 11 months ago"
 msgstr "4 года и 11 месяцев назад"
 
-#: builtin/branch.c:24
+#: builtin/branch.c:25
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<опции>] [-r | -a] [--merged | --no-merged]"
 
-#: builtin/branch.c:25
+#: builtin/branch.c:26
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<опции>] [-l] [-f] <имя-ветки> [<точка-начала>]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<опции>] [-r] (-d | -D) <имя-ветки>…"
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [<опции>] (-m | -M) [<старая-ветка>] <новая-ветка>"
 
-#: builtin/branch.c:150
+#: builtin/branch.c:29
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr "git branch [<опции>] [-r | -a] [--points-at]"
+
+#: builtin/branch.c:142
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
 "         '%s', but not yet merged to HEAD."
 msgstr "удаление ветки «%s», которая была слита с\n         «%s», но не слита с HEAD."
 
-#: builtin/branch.c:154
+#: builtin/branch.c:146
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
 "         '%s', even though it is merged to HEAD."
 msgstr "не удаление ветки «%s», которая еще не слита с\n         «%s», хотя уже слита с HEAD."
 
-#: builtin/branch.c:168
+#: builtin/branch.c:160
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Не удалось найти объект коммита для «%s»"
 
-#: builtin/branch.c:172
+#: builtin/branch.c:164
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
 "If you are sure you want to delete it, run 'git branch -D %s'."
 msgstr "Ветка «%s» не слита полностью.\nЕсли вы уверены, что хотите ее удалить, запустите «git branch -D %s»."
 
-#: builtin/branch.c:185
+#: builtin/branch.c:177
 msgid "Update of config-file failed"
 msgstr "Не удалось обновить файл конфигурации"
 
-#: builtin/branch.c:213
+#: builtin/branch.c:205
 msgid "cannot use -a with -d"
 msgstr "нельзя использовать одновременно ключи -a и -d"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:211
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Не удалось найти объект коммита для HEAD"
 
-#: builtin/branch.c:227
+#: builtin/branch.c:219
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr "Нельзя удалить ветку «%s», так как вы сейчас на ней находитесь."
 
-#: builtin/branch.c:243
+#: builtin/branch.c:235
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "внешняя отслеживаемая ветка «%s» не найдена."
 
-#: builtin/branch.c:244
+#: builtin/branch.c:236
 #, c-format
 msgid "branch '%s' not found."
 msgstr "ветка «%s» не найдена."
 
-#: builtin/branch.c:259
+#: builtin/branch.c:251
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Ошибка удаления внешней отслеживаемой ветки «%s»"
 
-#: builtin/branch.c:260
+#: builtin/branch.c:252
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Ошибка удаления ветки «%s»"
 
-#: builtin/branch.c:267
+#: builtin/branch.c:259
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Внешняя отслеживаемая ветка %s удалена (была %s).\n"
 
-#: builtin/branch.c:268
+#: builtin/branch.c:260
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Ветка %s удалена (была %s).\n"
 
-#: builtin/branch.c:369
-#, c-format
-msgid "branch '%s' does not point at a commit"
-msgstr "ветка «%s» не указывает на коммит"
-
-#: builtin/branch.c:452
+#: builtin/branch.c:303
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: пропал]"
 
-#: builtin/branch.c:457
+#: builtin/branch.c:308
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:462
+#: builtin/branch.c:313
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: позади %d]"
 
-#: builtin/branch.c:464
+#: builtin/branch.c:315
 #, c-format
 msgid "[behind %d]"
 msgstr "[позади %d]"
 
-#: builtin/branch.c:468
+#: builtin/branch.c:319
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: впереди %d]"
 
-#: builtin/branch.c:470
+#: builtin/branch.c:321
 #, c-format
 msgid "[ahead %d]"
 msgstr "[впереди %d]"
 
-#: builtin/branch.c:473
+#: builtin/branch.c:324
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: впереди %d, позади %d]"
 
-#: builtin/branch.c:476
+#: builtin/branch.c:327
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[впереди %d, позади %d]"
 
-#: builtin/branch.c:489
+#: builtin/branch.c:340
 msgid " **** invalid ref ****"
 msgstr " **** недействительная ссылка ****"
 
-#: builtin/branch.c:580
+#: builtin/branch.c:366
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(нет ветки, перемещение %s)"
 
-#: builtin/branch.c:583
+#: builtin/branch.c:369
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(нет ветки, двоичный поиск начат на %s)"
 
-#: builtin/branch.c:589
+#: builtin/branch.c:375
 #, c-format
 msgid "(HEAD detached at %s)"
 msgstr "(HEAD отделён на %s)"
 
-#: builtin/branch.c:592
+#: builtin/branch.c:378
 #, c-format
 msgid "(HEAD detached from %s)"
 msgstr "(HEAD отделён начиная с %s)"
 
-#: builtin/branch.c:596
+#: builtin/branch.c:382
 msgid "(no branch)"
 msgstr "(нет ветки)"
 
-#: builtin/branch.c:643
-#, c-format
-msgid "object '%s' does not point to a commit"
-msgstr "объект «%s» не указывает на коммит"
-
-#: builtin/branch.c:691
-msgid "some refs could not be read"
-msgstr "не удается прочитать некоторые ссылки"
-
-#: builtin/branch.c:704
+#: builtin/branch.c:524
 msgid "cannot rename the current branch while not on any."
 msgstr "невозможно переименовать текущую ветку, если вы не находитесь ни на одной из них."
 
-#: builtin/branch.c:714
+#: builtin/branch.c:534
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Недействительное имя ветки: «%s»"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:549
 msgid "Branch rename failed"
 msgstr "Сбой переименования ветки"
 
-#: builtin/branch.c:733
+#: builtin/branch.c:553
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Переименована неправильно названная ветка «%s»"
 
-#: builtin/branch.c:737
+#: builtin/branch.c:557
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Ветка переименована в %s, но HEAD не обновлен!"
 
-#: builtin/branch.c:744
+#: builtin/branch.c:564
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "Ветка переименована, но произошел сбой обновления файла конфигурации"
 
-#: builtin/branch.c:759
-#, c-format
-msgid "malformed object name %s"
-msgstr "плохое имя объекта %s"
-
-#: builtin/branch.c:781
+#: builtin/branch.c:587
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr "не удалось записать шаблон описания ветки: %s"
 
-#: builtin/branch.c:811
+#: builtin/branch.c:616
 msgid "Generic options"
 msgstr "Общие параметры"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:618
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "показывать хеш-сумму и тему, укажите дважды для вышестоящей ветки"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:619
 msgid "suppress informational messages"
 msgstr "не выводить информационные сообщения"
 
-#: builtin/branch.c:815
+#: builtin/branch.c:620
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "установить режим отслеживания вышестоящей ветки (см. git-pull(1))"
 
-#: builtin/branch.c:817
+#: builtin/branch.c:622
 msgid "change upstream info"
 msgstr "изменить информацию о вышестоящей ветке"
 
-#: builtin/branch.c:821
+#: builtin/branch.c:626
 msgid "use colored output"
 msgstr "использовать цветной вывод"
 
-#: builtin/branch.c:822
+#: builtin/branch.c:627
 msgid "act on remote-tracking branches"
 msgstr "выполнить действия на отслеживаемых внешних ветках"
 
-#: builtin/branch.c:825 builtin/branch.c:831 builtin/branch.c:852
-#: builtin/branch.c:858 builtin/commit.c:1580 builtin/commit.c:1581
-#: builtin/commit.c:1582 builtin/commit.c:1583 builtin/tag.c:618
-#: builtin/tag.c:624
-msgid "commit"
-msgstr "коммит"
-
-#: builtin/branch.c:826 builtin/branch.c:832
+#: builtin/branch.c:629 builtin/branch.c:630
 msgid "print only branches that contain the commit"
 msgstr "вывод только веток, которые содержат коммит"
 
-#: builtin/branch.c:838
+#: builtin/branch.c:633
 msgid "Specific git-branch actions:"
 msgstr "Специфичные для git-branch действия:"
 
-#: builtin/branch.c:839
+#: builtin/branch.c:634
 msgid "list both remote-tracking and local branches"
 msgstr "показать список и отслеживаемых и локальных веток"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:636
 msgid "delete fully merged branch"
 msgstr "удалить полностью слитую ветку"
 
-#: builtin/branch.c:842
+#: builtin/branch.c:637
 msgid "delete branch (even if not merged)"
 msgstr "удалить ветку (даже никуда не слитую)"
 
-#: builtin/branch.c:843
+#: builtin/branch.c:638
 msgid "move/rename a branch and its reflog"
 msgstr "переместить/переименовать ветки и ее журнал ссылок"
 
-#: builtin/branch.c:844
+#: builtin/branch.c:639
 msgid "move/rename a branch, even if target exists"
 msgstr "переместить/переименовать ветку, даже если целевое имя уже существует"
 
-#: builtin/branch.c:845
+#: builtin/branch.c:640
 msgid "list branch names"
 msgstr "показать список имен веток"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:641
 msgid "create the branch's reflog"
 msgstr "создать журнал ссылок ветки"
 
-#: builtin/branch.c:848
+#: builtin/branch.c:643
 msgid "edit the description for the branch"
 msgstr "изменить описание ветки"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:644
 msgid "force creation, move/rename, deletion"
 msgstr "принудительное создание, перемещение или удаление ветки"
 
-#: builtin/branch.c:852
-msgid "print only not merged branches"
-msgstr "вывод только не слитых веток"
-
-#: builtin/branch.c:858
-msgid "print only merged branches"
+#: builtin/branch.c:645
+msgid "print only branches that are merged"
 msgstr "вывод только слитых веток"
 
-#: builtin/branch.c:862
+#: builtin/branch.c:646
+msgid "print only branches that are not merged"
+msgstr "вывод только не слитых веток"
+
+#: builtin/branch.c:647
 msgid "list branches in columns"
 msgstr "показать список веток по столбцам"
 
-#: builtin/branch.c:875
+#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
+msgstr "ключ"
+
+#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
+msgstr "имя поля, по которому выполнить сортировку"
+
+#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398
+#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564
+#: builtin/tag.c:369
+msgid "object"
+msgstr "объект"
+
+#: builtin/branch.c:652
+msgid "print only branches of the object"
+msgstr "вывод только веток, определенного объекта"
+
+#: builtin/branch.c:670
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Не удалось определить HEAD как действительную ссылку."
 
-#: builtin/branch.c:879 builtin/clone.c:690
+#: builtin/branch.c:674 builtin/clone.c:697
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD не найден в refs/heads!"
 
-#: builtin/branch.c:901
+#: builtin/branch.c:694
 msgid "--column and --verbose are incompatible"
 msgstr "--column и --verbose нельзя использовать одновременно"
 
-#: builtin/branch.c:912 builtin/branch.c:951
+#: builtin/branch.c:705 builtin/branch.c:747
 msgid "branch name required"
 msgstr "требуется имя ветки"
 
-#: builtin/branch.c:927
+#: builtin/branch.c:723
 msgid "Cannot give description to detached HEAD"
 msgstr "Нельзя дать описание отделенному HEAD"
 
-#: builtin/branch.c:932
+#: builtin/branch.c:728
 msgid "cannot edit description of more than one branch"
 msgstr "нельзя изменить описание более одной ветки за раз"
 
-#: builtin/branch.c:939
+#: builtin/branch.c:735
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Еще нет коммита на ветке «%s»."
 
-#: builtin/branch.c:942
+#: builtin/branch.c:738
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Нет ветки с именем «%s»."
 
-#: builtin/branch.c:957
+#: builtin/branch.c:753
 msgid "too many branches for a rename operation"
 msgstr "слишком много веток для операции переименования"
 
-#: builtin/branch.c:962
+#: builtin/branch.c:758
 msgid "too many branches to set new upstream"
 msgstr "слишком много веток для указания новых вышестоящих"
 
-#: builtin/branch.c:966
+#: builtin/branch.c:762
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr "невозможно установить вышестоящий репозиторий для HEAD на %s, когда он не указывает ни на одну ветку."
 
-#: builtin/branch.c:969 builtin/branch.c:991 builtin/branch.c:1012
+#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808
 #, c-format
 msgid "no such branch '%s'"
 msgstr "нет такой ветки «%s»"
 
-#: builtin/branch.c:973
+#: builtin/branch.c:769
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "ветка «%s» не существует"
 
-#: builtin/branch.c:985
+#: builtin/branch.c:781
 msgid "too many branches to unset upstream"
 msgstr "слишком много веток для убирания вышестоящих"
 
-#: builtin/branch.c:989
+#: builtin/branch.c:785
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr "невозможно убрать вышестоящий репозиторий для HEAD, когда он не указывает ни на одну ветку."
 
-#: builtin/branch.c:995
+#: builtin/branch.c:791
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Ветка «%s» не имеет информации о вышестоящей ветке"
 
-#: builtin/branch.c:1009
+#: builtin/branch.c:805
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "не имеет смысла создавать «HEAD» вручную"
 
-#: builtin/branch.c:1015
+#: builtin/branch.c:811
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr "параметры -a и -r для «git branch» не имеют смысла с указанием имени ветки"
 
-#: builtin/branch.c:1018
+#: builtin/branch.c:814
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using "
 "--track or --set-upstream-to\n"
 msgstr "Флаг --set-upstream устарел и будет удален в будущем. Вместо него используйте --track или --set-upstream-to\n"
 
-#: builtin/branch.c:1035
+#: builtin/branch.c:831
 #, c-format
 msgid ""
 "\n"
@@ -3633,12 +3677,12 @@
 "\n"
 msgstr "\nЕсли вы хотите, чтобы «%s» отслеживала «%s», сделайте следующее:\n\n"
 
-#: builtin/branch.c:1036
+#: builtin/branch.c:832
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr "git branch -d %s\n"
 
-#: builtin/branch.c:1037
+#: builtin/branch.c:833
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr "    git branch --set-upstream-to %s\n"
@@ -3663,10 +3707,8 @@
 msgstr "git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|<тип>|--textconv) <объект>"
 
 #: builtin/cat-file.c:429
-msgid ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <list-of-"
-"objects>"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks] < <список-объектов>"
+msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
 
 #: builtin/cat-file.c:466
 msgid "<type> can be one of: blob, tree, commit, tag"
@@ -3721,8 +3763,8 @@
 msgstr "git check-attr [-a | --all | <атрибут>…] [--] <путь>…"
 
 #: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...] < <list-of-paths>"
-msgstr "git check-attr --stdin [-z] [-a | --all | <атрибут>…] < <список путей>"
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+msgstr "git check-attr --stdin [-z] [-a | --all | <атрибут>…]"
 
 #: builtin/check-attr.c:19
 msgid "report all attributes set on file"
@@ -3740,7 +3782,7 @@
 msgid "terminate input and output records by a NUL character"
 msgstr "окончание ввода и вывода записей по НУЛЕВОМУ символу"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1133 builtin/gc.c:267
+#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "не выводить прогресс выполнения"
 
@@ -3826,6 +3868,8 @@
 msgstr "записать содержимое во временные файлы"
 
 #: builtin/checkout-index.c:204 builtin/column.c:30
+#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181
 msgid "string"
 msgstr "строка"
 
@@ -3845,105 +3889,105 @@
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<опции>] [<ветка>] -- <файл>…"
 
-#: builtin/checkout.c:133 builtin/checkout.c:166
+#: builtin/checkout.c:134 builtin/checkout.c:167
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "путь «%s» не имеет нашей версии"
 
-#: builtin/checkout.c:135 builtin/checkout.c:168
+#: builtin/checkout.c:136 builtin/checkout.c:169
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "путь «%s» не имеет их версии"
 
-#: builtin/checkout.c:151
+#: builtin/checkout.c:152
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "путь «%s» не имеет всех необходимых версий"
 
-#: builtin/checkout.c:195
+#: builtin/checkout.c:196
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "путь «%s» не имеет необходимых версий"
 
-#: builtin/checkout.c:212
+#: builtin/checkout.c:213
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "путь «%s»: не удалось слить"
 
-#: builtin/checkout.c:229
+#: builtin/checkout.c:230
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "Не удалось добавить результат слияния «%s»"
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
+#: builtin/checkout.c:260
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "«%s» нельзя использовать при обновлении путей"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:263 builtin/checkout.c:266
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "«%s» нельзя использовать одновременно с %s"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:269
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr "Нельзя обновлять пути и переключаться на ветку «%s» одновременно."
 
-#: builtin/checkout.c:279 builtin/checkout.c:473
+#: builtin/checkout.c:280 builtin/checkout.c:474
 msgid "corrupt index file"
 msgstr "файл индекса поврежден"
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:340 builtin/checkout.c:347
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "путь «%s» не слит"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:496
 msgid "you need to resolve your current index first"
 msgstr "сначала нужно разрешить конфликты в вашем текущем индексе"
 
-#: builtin/checkout.c:622
+#: builtin/checkout.c:623
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
-msgstr "Не удалось создать журнал ссылок для «%s»': %s\n"
+msgstr "Не удалось создать журнал ссылок для «%s»: %s\n"
 
-#: builtin/checkout.c:660
+#: builtin/checkout.c:661
 msgid "HEAD is now at"
 msgstr "HEAD сейчас на"
 
-#: builtin/checkout.c:667
+#: builtin/checkout.c:668
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Сброс ветки «%s»\n"
 
-#: builtin/checkout.c:670
+#: builtin/checkout.c:671
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Уже на «%s»\n"
 
-#: builtin/checkout.c:674
+#: builtin/checkout.c:675
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Переключение и сброс ветки «%s»\n"
 
-#: builtin/checkout.c:676 builtin/checkout.c:1065
+#: builtin/checkout.c:677 builtin/checkout.c:1066
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Переключено на новую ветку «%s»\n"
 
-#: builtin/checkout.c:678
+#: builtin/checkout.c:679
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Переключено на ветку «%s»\n"
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:731
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " … и еще %d.\n"
 
-#: builtin/checkout.c:736
+#: builtin/checkout.c:737
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -3960,7 +4004,7 @@
 msgstr[2] "Предупреждение: вы оставляете позади %d коммитов не соединенные ни с одной из ваших веток:\n\n%s\n"
 msgstr[3] "Предупреждение: вы оставляете позади %d коммитов не соединенные ни с одной из ваших веток:\n\n%s\n"
 
-#: builtin/checkout.c:755
+#: builtin/checkout.c:756
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -3979,156 +4023,162 @@
 msgstr[2] "Если вы хотите сохранить их с помощью создания новой ветки, то сейчас самое время\nсделать это с помощью:\n\n git branch <имя-новой-ветки> %s\n\n"
 msgstr[3] "Если вы хотите сохранить их с помощью создания новой ветки, то сейчас самое время\nсделать это с помощью:\n\n git branch <имя-новой-ветки> %s\n\n"
 
-#: builtin/checkout.c:791
+#: builtin/checkout.c:792
 msgid "internal error in revision walk"
 msgstr "внутренняя ошибка при хождении по редакциям"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:796
 msgid "Previous HEAD position was"
 msgstr "Предыдущая позиция HEAD была"
 
-#: builtin/checkout.c:822 builtin/checkout.c:1060
+#: builtin/checkout.c:823 builtin/checkout.c:1061
 msgid "You are on a branch yet to be born"
 msgstr "Вы находитесь на еще не созданной ветке"
 
-#: builtin/checkout.c:967
+#: builtin/checkout.c:968
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "ожидается только одна ссылка, а передано %d."
 
-#: builtin/checkout.c:1006 builtin/worktree.c:210
+#: builtin/checkout.c:1007 builtin/worktree.c:213
 #, c-format
 msgid "invalid reference: %s"
 msgstr "неправильная ссылка: %s"
 
-#: builtin/checkout.c:1035
+#: builtin/checkout.c:1036
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "в дереве нет такой ссылки: %s"
 
-#: builtin/checkout.c:1074
+#: builtin/checkout.c:1075
 msgid "paths cannot be used with switching branches"
 msgstr "нельзя использовать пути при переключении веток"
 
-#: builtin/checkout.c:1077 builtin/checkout.c:1081
+#: builtin/checkout.c:1078 builtin/checkout.c:1082
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "нельзя использовать «%s» при переключении веток"
 
-#: builtin/checkout.c:1085 builtin/checkout.c:1088 builtin/checkout.c:1093
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094
+#: builtin/checkout.c:1097
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "«%s» нельзя использовать одновременно с «%s»"
 
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1102
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Нельзя переключить ветку на не коммит «%s»"
 
-#: builtin/checkout.c:1134 builtin/checkout.c:1136 builtin/clone.c:83
-#: builtin/remote.c:159 builtin/remote.c:161 builtin/worktree.c:317
-#: builtin/worktree.c:319
+#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320
+#: builtin/worktree.c:322
 msgid "branch"
 msgstr "ветка"
 
-#: builtin/checkout.c:1135
+#: builtin/checkout.c:1136
 msgid "create and checkout a new branch"
 msgstr "создать и перейти на новую ветку"
 
-#: builtin/checkout.c:1137
+#: builtin/checkout.c:1138
 msgid "create/reset and checkout a branch"
 msgstr "создать/сбросить и перейти на новую ветку"
 
-#: builtin/checkout.c:1138
+#: builtin/checkout.c:1139
 msgid "create reflog for new branch"
 msgstr "создать журнал ссылок для новой ветки"
 
-#: builtin/checkout.c:1139
+#: builtin/checkout.c:1140
 msgid "detach the HEAD at named commit"
 msgstr "отсоединить HEAD на указанном коммите"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "set upstream info for new branch"
 msgstr "установить информацию о вышестоящей ветке для новой ветки"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new-branch"
 msgstr "новая-ветка"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new unparented branch"
 msgstr "новая ветка без родителей"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "checkout our version for unmerged files"
 msgstr "перейти на нашу версию для не слитых файлов"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "checkout their version for unmerged files"
 msgstr "перейти на их версию для не слитых файлов"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1148
 msgid "force checkout (throw away local modifications)"
 msgstr "принудительный переход (отбрасывает все локальные изменения)"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "perform a 3-way merge with the new branch"
 msgstr "выполнить трехходовое слияние с новой веткой"
 
-#: builtin/checkout.c:1149 builtin/merge.c:227
+#: builtin/checkout.c:1150 builtin/merge.c:227
 msgid "update ignored files (default)"
 msgstr "обновить игнорируемые файлы (по умолчанию)"
 
-#: builtin/checkout.c:1150 builtin/log.c:1264 parse-options.h:249
+#: builtin/checkout.c:1151 builtin/log.c:1266 parse-options.h:250
 msgid "style"
 msgstr "стиль"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "conflict style (merge or diff3)"
 msgstr "стиль конфликтов слияния (merge или diff3)"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "не ограничивать спецификаторы пути только частичными записями"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1157
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "пересмотр «git checkout <no-such-branch>»"
 
-#: builtin/checkout.c:1158
+#: builtin/checkout.c:1159
 msgid "do not check if another worktree is holding the given ref"
 msgstr "не проверять, что другое дерево уже содержит указанную ссылку"
 
-#: builtin/checkout.c:1181
+#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112
+#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:558
+#: builtin/send-pack.c:168
+msgid "force progress reporting"
+msgstr "принудительно выводить прогресс"
+
+#: builtin/checkout.c:1191
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B и --orphan нельзя использовать одновременно"
 
-#: builtin/checkout.c:1198
+#: builtin/checkout.c:1208
 msgid "--track needs a branch name"
 msgstr "--track требует имя ветки"
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1213
 msgid "Missing branch name; try -b"
 msgstr "Пропущено имя ветки; попробуйте -b"
 
-#: builtin/checkout.c:1239
+#: builtin/checkout.c:1249
 msgid "invalid path specification"
 msgstr "неправильная спецификация пути"
 
-#: builtin/checkout.c:1246
+#: builtin/checkout.c:1256
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
 "Did you intend to checkout '%s' which can not be resolved as commit?"
 msgstr "Нельзя обновить пути и одновременно переключить на ветку «%s».\nВы хотели переключиться на «%s», что не может быть определено как коммит?"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1261
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach не принимает путь «%s» как аргумент"
 
-#: builtin/checkout.c:1255
+#: builtin/checkout.c:1265
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4164,7 +4214,7 @@
 msgid "failed to remove %s"
 msgstr "сбой удаления %s"
 
-#: builtin/clean.c:317
+#: builtin/clean.c:315
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -4172,7 +4222,7 @@
 "           - (empty) select nothing"
 msgstr "Справка по выделению:\n1          - выбрать указанный элемент\nfoo        - выбрать элемент с указанным префиксом\n           - (пусто) не выбирать ничего"
 
-#: builtin/clean.c:321
+#: builtin/clean.c:319
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -4184,36 +4234,36 @@
 "           - (empty) finish selecting"
 msgstr "Справка по выделению:\n1          - выбрать один элемент\n3-5        - выбрать диапазон элементов\n2-3,6-9    - выбрать несколько диапазонов\nfoo        - выбрать элемент с указанным префиксом\n-…       - убрать выделение с указанных элементов\n*          - выбрать все элементы\n           - (пусто) завершить выделение"
 
-#: builtin/clean.c:537
+#: builtin/clean.c:535
 #, c-format
 msgid "Huh (%s)?"
 msgstr "Хм (%s)?"
 
-#: builtin/clean.c:679
+#: builtin/clean.c:677
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Шаблоны игнорирования ввода>> "
 
-#: builtin/clean.c:716
+#: builtin/clean.c:714
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "ПРЕДУПРЕЖДЕНИЕ: Не удалось найти элементы соответствующие: %s"
 
-#: builtin/clean.c:737
+#: builtin/clean.c:735
 msgid "Select items to delete"
 msgstr "Укажите элементы для удаления"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:778
+#: builtin/clean.c:776
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "Удалить %s [y - да/N - нет]? "
 
-#: builtin/clean.c:803
+#: builtin/clean.c:801
 msgid "Bye."
 msgstr "До свидания."
 
-#: builtin/clean.c:811
+#: builtin/clean.c:809
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -4224,15 +4274,15 @@
 "?                   - help for prompt selection"
 msgstr "clean               - начать очистку\nfilter by pattern   - исключить удаление элементов\nselect by numbers   - исключить удаление элементов по номерам\nask each            - запрашивать подтверждение на удаление каждого элемента (как «rm -i»)\nquit                - прекратить очистку\nhelp                - этот экран\n?                   - справка по выделению"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:836
 msgid "*** Commands ***"
 msgstr "*** Команды ***"
 
-#: builtin/clean.c:839
+#: builtin/clean.c:837
 msgid "What now"
 msgstr "Что теперь"
 
-#: builtin/clean.c:847
+#: builtin/clean.c:845
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Удалить следующие элементы:"
@@ -4240,54 +4290,54 @@
 msgstr[2] "Удалить следующие элементы:"
 msgstr[3] "Удалить следующие элементы:"
 
-#: builtin/clean.c:864
+#: builtin/clean.c:862
 msgid "No more files to clean, exiting."
 msgstr "Больше нет файлов для очистки, выходим."
 
-#: builtin/clean.c:895
+#: builtin/clean.c:893
 msgid "do not print names of files removed"
 msgstr "не выводить имена удаляемых файлов"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:895
 msgid "force"
 msgstr "принудительно"
 
-#: builtin/clean.c:898
+#: builtin/clean.c:896
 msgid "interactive cleaning"
 msgstr "интерактивная очистка"
 
-#: builtin/clean.c:900
+#: builtin/clean.c:898
 msgid "remove whole directories"
 msgstr "удалить каталоги полностью"
 
-#: builtin/clean.c:901 builtin/describe.c:407 builtin/grep.c:714
-#: builtin/ls-files.c:443 builtin/name-rev.c:311 builtin/show-ref.c:187
+#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709
+#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182
 msgid "pattern"
 msgstr "шаблон"
 
-#: builtin/clean.c:902
+#: builtin/clean.c:900
 msgid "add <pattern> to ignore rules"
 msgstr "добавить <шаблон> в правила игнорирования"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:901
 msgid "remove ignored files, too"
 msgstr "также удалить игнорируемые файлы"
 
-#: builtin/clean.c:905
+#: builtin/clean.c:903
 msgid "remove only ignored files"
 msgstr "удалить только игнорируемые файлы"
 
-#: builtin/clean.c:923
+#: builtin/clean.c:921
 msgid "-x and -X cannot be used together"
 msgstr "нельзя использовать одновременно -x и -X"
 
-#: builtin/clean.c:927
+#: builtin/clean.c:925
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to"
 " clean"
 msgstr "clean.requireForce установлен как true и ни одна из опций -i, -n или -f не указана; отказ очистки"
 
-#: builtin/clean.c:930
+#: builtin/clean.c:928
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -4297,16 +4347,11 @@
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<опции>] [--] <репозиторий> [<каталог>]"
 
-#: builtin/clone.c:57 builtin/fetch.c:112 builtin/merge.c:224
-#: builtin/pull.c:109 builtin/push.c:560 builtin/send-pack.c:168
-msgid "force progress reporting"
-msgstr "принудительно выводить прогресс"
-
 #: builtin/clone.c:59
 msgid "don't create a checkout"
 msgstr "не переключать рабочую копию на HEAD"
 
-#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:504
+#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469
 msgid "create a bare repository"
 msgstr "создать голый репозиторий"
 
@@ -4330,15 +4375,15 @@
 msgid "initialize submodules in the clone"
 msgstr "инициализировать подмодули в клоне"
 
-#: builtin/clone.c:75 builtin/init-db.c:501
+#: builtin/clone.c:75 builtin/init-db.c:466
 msgid "template-directory"
 msgstr "каталог-шаблонов"
 
-#: builtin/clone.c:76 builtin/init-db.c:502
+#: builtin/clone.c:76 builtin/init-db.c:467
 msgid "directory from which templates will be used"
 msgstr "каталог, шаблоны из которого будут использованы"
 
-#: builtin/clone.c:78
+#: builtin/clone.c:78 builtin/submodule--helper.c:179
 msgid "reference repository"
 msgstr "ссылаемый репозиторий"
 
@@ -4362,7 +4407,7 @@
 msgid "path to git-upload-pack on the remote"
 msgstr "путь к git-upload-pack на внешнем репозитории"
 
-#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:659
+#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654
 #: builtin/pull.c:186
 msgid "depth"
 msgstr "глубина"
@@ -4375,11 +4420,11 @@
 msgid "clone only one branch, HEAD or --branch"
 msgstr "клонировать только одну ветку, HEAD или --branch"
 
-#: builtin/clone.c:91 builtin/init-db.c:510
+#: builtin/clone.c:91 builtin/init-db.c:475
 msgid "gitdir"
 msgstr "каталог-git"
 
-#: builtin/clone.c:92 builtin/init-db.c:511
+#: builtin/clone.c:92 builtin/init-db.c:476
 msgid "separate git dir from working tree"
 msgstr "разместить каталог git отдельно от рабочей копии"
 
@@ -4391,173 +4436,174 @@
 msgid "set config inside the new repository"
 msgstr "установить параметры внутри нового репозитория"
 
-#: builtin/clone.c:298
+#: builtin/clone.c:300
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "ссылаемый репозиторий «%s» как связанное состояние, пока не поддерживается."
+
+#: builtin/clone.c:302
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr "ссылаемый репозиторий «%s» не является локальным."
 
-#: builtin/clone.c:302
+#: builtin/clone.c:307
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "ссылаемый репозиторий «%s» является частичным"
 
-#: builtin/clone.c:305
+#: builtin/clone.c:310
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "ссылаемый репозиторий «%s» является сращенным"
 
-#: builtin/clone.c:370 builtin/diff.c:84
+#: builtin/clone.c:375 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "не удалось выполнить stat «%s»"
 
-#: builtin/clone.c:372
+#: builtin/clone.c:377
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s уже существует и не является каталогом"
 
-#: builtin/clone.c:386
+#: builtin/clone.c:391
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "не удалось выполнить stat %s\n"
 
-#: builtin/clone.c:408
+#: builtin/clone.c:413
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "не удалось создать ссылку «%s»"
 
-#: builtin/clone.c:412
+#: builtin/clone.c:417
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "не удалось копировать файл в «%s»"
 
-#: builtin/clone.c:435 builtin/clone.c:619
+#: builtin/clone.c:442 builtin/clone.c:626
 #, c-format
 msgid "done.\n"
 msgstr "готово.\n"
 
-#: builtin/clone.c:447
+#: builtin/clone.c:454
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
 "and retry the checkout with 'git checkout -f HEAD'\n"
 msgstr "Клонирование прошло успешно, но во время перехода на версию произошла ошибка.\nС помощь команды «git status» вы можете просмотреть, какие файлы были обновлены, а повторить попытку перехода на версию с помощью «git checkout -f HEAD»\n"
 
-#: builtin/clone.c:524
+#: builtin/clone.c:531
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Не удалось найти внешнюю ветку %s для клонирования."
 
-#: builtin/clone.c:614
+#: builtin/clone.c:621
 #, c-format
 msgid "Checking connectivity... "
 msgstr "Проверка соединения… "
 
-#: builtin/clone.c:617
+#: builtin/clone.c:624
 msgid "remote did not send all necessary objects"
 msgstr "внешний репозиторий прислал не все необходимые объекты"
 
-#: builtin/clone.c:681
+#: builtin/clone.c:688
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr "внешний HEAD ссылается на несуществующую ссылку, нельзя перейти на такую версию.\n"
 
-#: builtin/clone.c:712
+#: builtin/clone.c:719
 msgid "unable to checkout working tree"
 msgstr "не удалось перейти на версию в рабочем каталоге"
 
-#: builtin/clone.c:799
+#: builtin/clone.c:808
 msgid "cannot repack to clean up"
 msgstr "не удалось выполнить перепаковку для очистки"
 
-#: builtin/clone.c:801
+#: builtin/clone.c:810
 msgid "cannot unlink temporary alternates file"
 msgstr "не удалось отсоединить временные альтернативные файлы"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:842
 msgid "Too many arguments."
 msgstr "Слишком много аргументов."
 
-#: builtin/clone.c:835
+#: builtin/clone.c:846
 msgid "You must specify a repository to clone."
 msgstr "Вы должны указать репозиторий для клонирования."
 
-#: builtin/clone.c:846
+#: builtin/clone.c:857
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "--bare и --origin %s нельзя использовать одновременно."
 
-#: builtin/clone.c:849
+#: builtin/clone.c:860
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare и --separate-git-dir нельзя использовать одновременно."
 
-#: builtin/clone.c:862
+#: builtin/clone.c:873
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "репозиторий «%s» не существует"
 
-#: builtin/clone.c:868 builtin/fetch.c:1168
+#: builtin/clone.c:879 builtin/fetch.c:1166
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "глубина %s не является положительным числом"
 
-#: builtin/clone.c:878
+#: builtin/clone.c:889
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "целевой путь «%s» уже существует и не является пустым каталогом."
 
-#: builtin/clone.c:888
+#: builtin/clone.c:899
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "рабочий каталог «%s» уже существует."
 
-#: builtin/clone.c:903 builtin/clone.c:914 builtin/worktree.c:218
-#: builtin/worktree.c:245
+#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224
+#: builtin/worktree.c:221 builtin/worktree.c:248
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "не удалось создать родительские каталоги для «%s»"
 
-#: builtin/clone.c:906
+#: builtin/clone.c:917
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "не удалось создать рабочий каталог «%s»"
 
-#: builtin/clone.c:924
+#: builtin/clone.c:935
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Клонирование в голый репозиторий «%s»…\n"
 
-#: builtin/clone.c:926
+#: builtin/clone.c:937
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Клонирование в «%s»…\n"
 
-#: builtin/clone.c:951
-msgid "--dissociate given, but there is no --reference"
-msgstr "передана опция --dissociate, но не передана --reference"
-
-#: builtin/clone.c:968
+#: builtin/clone.c:975
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth игнорируется на локальных клонах; вместо этого используйте file://."
 
-#: builtin/clone.c:971
+#: builtin/clone.c:978
 msgid "source repository is shallow, ignoring --local"
 msgstr "исходный репозиторий является частичным, --local игнорируется"
 
-#: builtin/clone.c:976
+#: builtin/clone.c:983
 msgid "--local is ignored"
 msgstr "--local игнорируется"
 
-#: builtin/clone.c:980
+#: builtin/clone.c:987
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Не знаю как клонировать %s"
 
-#: builtin/clone.c:1029 builtin/clone.c:1037
+#: builtin/clone.c:1036 builtin/clone.c:1044
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Внешняя ветка %s не найдена в вышестоящем репозитории %s"
 
-#: builtin/clone.c:1040
+#: builtin/clone.c:1047
 msgid "You appear to have cloned an empty repository."
 msgstr "Похоже, что вы клонировали пустой репозиторий."
 
@@ -4593,15 +4639,15 @@
 msgid "--command must be the first argument"
 msgstr "параметр --command должен быть первым"
 
-#: builtin/commit.c:37
+#: builtin/commit.c:38
 msgid "git commit [<options>] [--] <pathspec>..."
 msgstr "git commit [<опции>] [--] <спецификация-пути>…"
 
-#: builtin/commit.c:42
+#: builtin/commit.c:43
 msgid "git status [<options>] [--] <pathspec>..."
 msgstr "git status [<опции>] [--] <спецификация-пути>…"
 
-#: builtin/commit.c:47
+#: builtin/commit.c:48
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4616,7 +4662,7 @@
 "    git commit --amend --reset-author\n"
 msgstr "Ваше имя или электронная почта настроены автоматически на основании вашего\nимени пользователя и имени машины. Пожалуйста, проверьте, что они \nопределены правильно.\nВы можете отключить это уведомление установив их напрямую. Запустите следующую\nкоманду и следуйте инструкциям вашего текстового редактора, для\nредактирования вашего файла конфигурации:\n\n    git config --global --edit\n\nПосле этого, изменить авторство этой коммита можно будет с помощью команды:\n\n    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:60
+#: builtin/commit.c:61
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4630,14 +4676,14 @@
 "    git commit --amend --reset-author\n"
 msgstr "Ваше имя или электронная почта настроены автоматически на основании вашего\nимени пользователя и имени машины. Пожалуйста, проверьте, что они \nопределены правильно.\nВы можете отключить это уведомление установив их напрямую:\n\n    git config --global user.name \"Ваше Имя\"\n    git config --global user.email you@example.com\n\nПосле этого, изменить авторство этой коммита можно будет с помощью команды:\n\n    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:72
+#: builtin/commit.c:73
 msgid ""
 "You asked to amend the most recent commit, but doing so would make\n"
 "it empty. You can repeat your command with --allow-empty, or you can\n"
 "remove the commit entirely with \"git reset HEAD^\".\n"
 msgstr "Вы попросили исправить последний коммит, но делая это вы сделаете\nпустой коммит. Вы можете повторить эту команду с опцией --allow-empty\nили вы можете удалить коммит полностью с помощью команды \n«git reset HEAD^».\n"
 
-#: builtin/commit.c:77
+#: builtin/commit.c:78
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4646,11 +4692,11 @@
 "\n"
 msgstr "Предыдущий отбор лучшего теперь пуст, возможно после разрешения конфликтов.\nЕсли вы все равно хотите сделать пустой коммит, используйте:\n\n    git commit --allow-empty\n\n"
 
-#: builtin/commit.c:84
+#: builtin/commit.c:85
 msgid "Otherwise, please use 'git reset'\n"
 msgstr "В противном случае, используйте «git reset»\n"
 
-#: builtin/commit.c:87
+#: builtin/commit.c:88
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4660,103 +4706,103 @@
 "the remaining commits.\n"
 msgstr "Если вы хотите пропустит этот коммит, используйте команду:\n\n    git reset\n\nПосле этого «git cherry-pick --continue» продолжит отбор лучшего\nв оставшихся коммитах.\n"
 
-#: builtin/commit.c:304
+#: builtin/commit.c:305
 msgid "failed to unpack HEAD tree object"
 msgstr "сбой распаковки объекта дерева HEAD"
 
-#: builtin/commit.c:345
+#: builtin/commit.c:346
 msgid "unable to create temporary index"
 msgstr "не удалось создать временный индекс"
 
-#: builtin/commit.c:351
+#: builtin/commit.c:352
 msgid "interactive add failed"
 msgstr "сбой интерактивного добавления"
 
-#: builtin/commit.c:364
+#: builtin/commit.c:365
 msgid "unable to update temporary index"
 msgstr "не удалось обновить временный индекс"
 
-#: builtin/commit.c:366
+#: builtin/commit.c:367
 msgid "Failed to update main cache tree"
 msgstr "Сбой при обновлении основного кэша дерева"
 
-#: builtin/commit.c:390 builtin/commit.c:413 builtin/commit.c:462
+#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
 msgid "unable to write new_index file"
 msgstr "не удалось записать файл new_index"
 
-#: builtin/commit.c:444
+#: builtin/commit.c:445
 msgid "cannot do a partial commit during a merge."
 msgstr "нельзя создать частичный коммит во время слияния."
 
-#: builtin/commit.c:446
+#: builtin/commit.c:447
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "нельзя создать частичный коммит во время отбора лучшего коммита."
 
-#: builtin/commit.c:455
+#: builtin/commit.c:456
 msgid "cannot read the index"
 msgstr "не удалось прочитать индекс"
 
-#: builtin/commit.c:474
+#: builtin/commit.c:475
 msgid "unable to write temporary index file"
 msgstr "не удалось записать временный файл индекса"
 
-#: builtin/commit.c:579
+#: builtin/commit.c:580
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "у коммита «%s» отсутствует автор в заголовке"
 
-#: builtin/commit.c:581
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "у коммита «%s» автор в неверном формате"
 
-#: builtin/commit.c:600
+#: builtin/commit.c:601
 msgid "malformed --author parameter"
 msgstr "параметр --author в неверном формате"
 
-#: builtin/commit.c:608
+#: builtin/commit.c:609
 #, c-format
 msgid "invalid date format: %s"
 msgstr "неправильный формат даты: %s"
 
-#: builtin/commit.c:652
+#: builtin/commit.c:653
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
 msgstr "нельзя выбрать символ комментария, который\nне используется в текущем сообщении коммита"
 
-#: builtin/commit.c:689 builtin/commit.c:722 builtin/commit.c:1079
+#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "не удалось запросить коммит %s"
 
-#: builtin/commit.c:701 builtin/shortlog.c:273
+#: builtin/commit.c:702 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(чтение файла журнала из стандартного ввода)\n"
 
-#: builtin/commit.c:703
+#: builtin/commit.c:704
 msgid "could not read log from standard input"
 msgstr "не удалось прочитать файл журнала из стандартного ввода"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:708
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "не удалось прочитать файл журнала «%s»"
 
-#: builtin/commit.c:729
+#: builtin/commit.c:730
 msgid "could not read MERGE_MSG"
 msgstr "не удалось прочитать MERGE_MSG"
 
-#: builtin/commit.c:733
+#: builtin/commit.c:734
 msgid "could not read SQUASH_MSG"
 msgstr "не удалось прочитать SQUASH_MSG"
 
-#: builtin/commit.c:784
+#: builtin/commit.c:785
 msgid "could not write commit template"
 msgstr "не удалось записать шаблон описания коммита"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:803
 #, c-format
 msgid ""
 "\n"
@@ -4766,7 +4812,7 @@
 "and try again.\n"
 msgstr "\nПохоже, что вы пытаетесь закоммитить слияние.\nЕсли это ошибка, пожалуйста удалите файл\n\t%s\nи попробуйте снова.\n"
 
-#: builtin/commit.c:807
+#: builtin/commit.c:808
 #, c-format
 msgid ""
 "\n"
@@ -4776,14 +4822,14 @@
 "and try again.\n"
 msgstr "\nПохоже, что вы пытаетесь закоммитить отбор лучшего.\nЕсли это ошибка, пожалуйста удалите файл\n\t%s\nи попробуйте снова.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:821
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
 "with '%c' will be ignored, and an empty message aborts the commit.\n"
 msgstr "Пожалуйста, введите сообщение коммита для ваших изменений. Строки,\nначинающиеся с «%c» будут проигнорированы, а пустое сообщение\nотменяет процесс коммита.\n"
 
-#: builtin/commit.c:827
+#: builtin/commit.c:828
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4791,335 +4837,341 @@
 "An empty message aborts the commit.\n"
 msgstr "Пожалуйста, введите сообщение коммита для ваших изменений. Строки,\nначинающиеся с «%c» будут оставлены; вы можете удалить их вручную,\nесли хотите. Пустое сообщение отменяет процесс коммита.\n"
 
-#: builtin/commit.c:847
+#: builtin/commit.c:848
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sАвтор:     %.*s <%.*s>"
 
-#: builtin/commit.c:855
+#: builtin/commit.c:856
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sДата:      %s"
 
-#: builtin/commit.c:862
+#: builtin/commit.c:863
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sКоммитер:  %.*s <%.*s>"
 
-#: builtin/commit.c:880
+#: builtin/commit.c:881
 msgid "Cannot read index"
 msgstr "Не удалось прочитать индекс"
 
-#: builtin/commit.c:937
+#: builtin/commit.c:938
 msgid "Error building trees"
 msgstr "Ошибка при построении деревьев"
 
-#: builtin/commit.c:952 builtin/tag.c:495
+#: builtin/commit.c:953 builtin/tag.c:266
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Пожалуйста, укажите сообщение, при указании опций -m или -F.\n"
 
-#: builtin/commit.c:1054
+#: builtin/commit.c:1055
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr "--author «%s» не в формате «Имя <почта>» и не совпадает с существующим автором"
 
-#: builtin/commit.c:1069 builtin/commit.c:1309
+#: builtin/commit.c:1070 builtin/commit.c:1310
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Неправильный режим неотслеживаемых файлов «%s»"
 
-#: builtin/commit.c:1106
+#: builtin/commit.c:1107
 msgid "--long and -z are incompatible"
 msgstr "--long и -z нельзя использовать одновременно"
 
-#: builtin/commit.c:1136
+#: builtin/commit.c:1137
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Указание одновременно опций --reset-author и --author не имеет смысла"
 
-#: builtin/commit.c:1145
+#: builtin/commit.c:1146
 msgid "You have nothing to amend."
 msgstr "Нечего исправлять."
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1149
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Вы в процессе слияния —  сейчас нельзя исправлять."
 
-#: builtin/commit.c:1150
+#: builtin/commit.c:1151
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "Вы в процессе отбора лучшего —  сейчас нельзя исправлять."
 
-#: builtin/commit.c:1153
+#: builtin/commit.c:1154
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Опции --squash и --fixup не могут использоваться одновременно"
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1164
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Может использоваться только одна из опций -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1165
+#: builtin/commit.c:1166
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Опция -m не может использоваться с -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1173
+#: builtin/commit.c:1174
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author может использоваться только одновременно с опциями -C, -c или --amend."
 
-#: builtin/commit.c:1190
+#: builtin/commit.c:1191
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr "Может использоваться только одна из опций --include/--only/--all/--interactive/--patch."
 
-#: builtin/commit.c:1192
+#: builtin/commit.c:1193
 msgid "No paths with --include/--only does not make sense."
 msgstr "Указание путей каталогов с опциями --include/--only не имеет смысла."
 
-#: builtin/commit.c:1194
+#: builtin/commit.c:1195
 msgid "Clever... amending the last one with dirty index."
 msgstr "Умно… отмена последнего с измененным индексом."
 
-#: builtin/commit.c:1196
+#: builtin/commit.c:1197
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "Пути явно указаны пути без опций -i или -o; предполагаю опцию --only…"
 
-#: builtin/commit.c:1208 builtin/tag.c:730
+#: builtin/commit.c:1209 builtin/tag.c:475
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Неправильное значение режима очистки %s"
 
-#: builtin/commit.c:1213
+#: builtin/commit.c:1214
 msgid "Paths with -a does not make sense."
 msgstr "С опцией -a указание пути не имеет смысла."
 
-#: builtin/commit.c:1323 builtin/commit.c:1602
+#: builtin/commit.c:1324 builtin/commit.c:1605
 msgid "show status concisely"
 msgstr "кратко показать статус"
 
-#: builtin/commit.c:1325 builtin/commit.c:1604
+#: builtin/commit.c:1326 builtin/commit.c:1607
 msgid "show branch information"
 msgstr "показать информацию о версии"
 
-#: builtin/commit.c:1327 builtin/commit.c:1606 builtin/push.c:546
+#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:544
+#: builtin/worktree.c:423
 msgid "machine-readable output"
 msgstr "машиночитаемый вывод"
 
-#: builtin/commit.c:1330 builtin/commit.c:1608
+#: builtin/commit.c:1331 builtin/commit.c:1611
 msgid "show status in long format (default)"
 msgstr "показать статус в длинном формате (по умолчанию)"
 
-#: builtin/commit.c:1333 builtin/commit.c:1611
+#: builtin/commit.c:1334 builtin/commit.c:1614
 msgid "terminate entries with NUL"
 msgstr "завершать записи НУЛЕВЫМ байтом"
 
-#: builtin/commit.c:1335 builtin/commit.c:1614 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:604
+#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:353
 msgid "mode"
 msgstr "режим"
 
-#: builtin/commit.c:1336 builtin/commit.c:1614
+#: builtin/commit.c:1337 builtin/commit.c:1617
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr "показать неотслеживаемые файлы, опциональные режимы: all (все), normal (как обычно), no (нет). (По умолчанию: all)"
 
-#: builtin/commit.c:1339
+#: builtin/commit.c:1340
 msgid "show ignored files"
 msgstr "показать игнорируемые файлы"
 
-#: builtin/commit.c:1340 parse-options.h:155
+#: builtin/commit.c:1341 parse-options.h:155
 msgid "when"
 msgstr "когда"
 
-#: builtin/commit.c:1341
+#: builtin/commit.c:1342
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr "игнорировать изменения в подмодулях, опционально когда: all (всегда), dirty (измененные), untracked (неотслеживаемые). (По умолчанию: all)"
 
-#: builtin/commit.c:1343
+#: builtin/commit.c:1344
 msgid "list untracked files in columns"
 msgstr "показать неотслеживаемые файлы по столбцам"
 
-#: builtin/commit.c:1429
+#: builtin/commit.c:1430
 msgid "couldn't look up newly created commit"
 msgstr "нельзя запросить новосозданный коммит"
 
-#: builtin/commit.c:1431
+#: builtin/commit.c:1432
 msgid "could not parse newly created commit"
 msgstr "нельзя разобрать новосозданный коммит"
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1477
 msgid "detached HEAD"
 msgstr "отделенный HEAD"
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1480
 msgid " (root-commit)"
 msgstr " (корневой коммит)"
 
-#: builtin/commit.c:1572
+#: builtin/commit.c:1575
 msgid "suppress summary after successful commit"
 msgstr "не выводить сводку после успешного коммита"
 
-#: builtin/commit.c:1573
+#: builtin/commit.c:1576
 msgid "show diff in commit message template"
 msgstr "добавить список изменений в шаблон сообщения коммита"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1578
 msgid "Commit message options"
 msgstr "Опции сообщения коммита"
 
-#: builtin/commit.c:1576 builtin/tag.c:602
+#: builtin/commit.c:1579 builtin/tag.c:351
 msgid "read message from file"
 msgstr "прочитать сообщение из файла"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "author"
 msgstr "автор"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "override author for commit"
 msgstr "подменить автора коммита"
 
-#: builtin/commit.c:1578 builtin/gc.c:268
+#: builtin/commit.c:1581 builtin/gc.c:326
 msgid "date"
 msgstr "дата"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1581
 msgid "override date for commit"
 msgstr "подменить дату коммита"
 
-#: builtin/commit.c:1579 builtin/merge.c:218 builtin/notes.c:392
-#: builtin/notes.c:555 builtin/tag.c:600
+#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392
+#: builtin/notes.c:555 builtin/tag.c:349
 msgid "message"
 msgstr "сообщение"
 
-#: builtin/commit.c:1579
+#: builtin/commit.c:1582
 msgid "commit message"
 msgstr "сообщение коммита"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
+#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
+msgid "commit"
+msgstr "коммит"
+
+#: builtin/commit.c:1583
 msgid "reuse and edit message from specified commit"
 msgstr "использовать и отредактировать сообщение от указанного коммита"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1584
 msgid "reuse message from specified commit"
 msgstr "использовать сообщение указанного коммита"
 
-#: builtin/commit.c:1582
+#: builtin/commit.c:1585
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr "использовать форматированное сообщение автоуплотнения для исправления указанного коммита"
 
-#: builtin/commit.c:1583
+#: builtin/commit.c:1586
 msgid "use autosquash formatted message to squash specified commit"
 msgstr "использовать форматированное сообщение автоуплотнения для уплотнения указанного коммита"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1587
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "коммит теперь за моим авторством (с использованием -C/-c/--amend)"
 
-#: builtin/commit.c:1585 builtin/log.c:1216 builtin/revert.c:86
+#: builtin/commit.c:1588 builtin/log.c:1216 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "добавить Signed-off-by:"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1589
 msgid "use specified template file"
 msgstr "использовать указанный файл шаблона"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1590
 msgid "force edit of commit"
 msgstr "принудительно редактировать коммит"
 
-#: builtin/commit.c:1588
+#: builtin/commit.c:1591
 msgid "default"
 msgstr "по-умолчанию"
 
-#: builtin/commit.c:1588 builtin/tag.c:605
+#: builtin/commit.c:1591 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "как удалять пробелы и #комментарии из сообщения коммита"
 
-#: builtin/commit.c:1589
+#: builtin/commit.c:1592
 msgid "include status in commit message template"
 msgstr "включить статус файлов в шаблон сообщения коммита"
 
-#: builtin/commit.c:1591 builtin/merge.c:226 builtin/pull.c:156
+#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "подписать коммит с помощью GPG"
 
-#: builtin/commit.c:1594
+#: builtin/commit.c:1597
 msgid "Commit contents options"
 msgstr "Опции содержимого коммита"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1598
 msgid "commit all changed files"
 msgstr "закоммитить все измененные файлы"
 
-#: builtin/commit.c:1596
+#: builtin/commit.c:1599
 msgid "add specified files to index for commit"
 msgstr "добавить указанные файлы в индекс для коммита"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1600
 msgid "interactively add files"
 msgstr "интерактивное добавление файлов"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1601
 msgid "interactively add changes"
 msgstr "интерактивное добавление изменений"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1602
 msgid "commit only specified files"
 msgstr "закоммитить только указанные файлы"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1603
 msgid "bypass pre-commit hook"
 msgstr "пропустить перехватчик перед-коммитом"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1604
 msgid "show what would be committed"
 msgstr "показать, что будет закоммичено"
 
-#: builtin/commit.c:1612
+#: builtin/commit.c:1615
 msgid "amend previous commit"
 msgstr "исправить предыдущий коммит"
 
-#: builtin/commit.c:1613
+#: builtin/commit.c:1616
 msgid "bypass post-rewrite hook"
 msgstr "пропустить перехватчик после-перезаписи"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1621
 msgid "ok to record an empty change"
 msgstr "разрешить запись пустого коммита"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1623
 msgid "ok to record a change with an empty message"
 msgstr "разрешить запись изменений с пустым сообщением"
 
-#: builtin/commit.c:1649
+#: builtin/commit.c:1652
 msgid "could not parse HEAD commit"
 msgstr "не удалось разобрать HEAD коммит"
 
-#: builtin/commit.c:1695
+#: builtin/commit.c:1698
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Файл MERGE_HEAD поврежден (%s)"
 
-#: builtin/commit.c:1702
+#: builtin/commit.c:1705
 msgid "could not read MERGE_MODE"
 msgstr "не удалось прочитать MERGE_MODE"
 
-#: builtin/commit.c:1721
+#: builtin/commit.c:1724
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "не удалось открыть сообщение коммита: %s"
 
-#: builtin/commit.c:1732
+#: builtin/commit.c:1735
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Отмена коммита; вы не изменили сообщение.\n"
 
-#: builtin/commit.c:1737
+#: builtin/commit.c:1740
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Отмена коммита из-за пустого сообщения коммита.\n"
 
-#: builtin/commit.c:1785
+#: builtin/commit.c:1788
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -5254,11 +5306,11 @@
 msgid "respect include directives on lookup"
 msgstr "учитывать директивы include (включения файлов) при запросе"
 
-#: builtin/config.c:311
+#: builtin/config.c:303
 msgid "unable to parse default color value"
 msgstr "не удалось разобрать значение цвета по умолчанию"
 
-#: builtin/config.c:449
+#: builtin/config.c:441
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5268,16 +5320,16 @@
 "#\temail = %s\n"
 msgstr "# Это файл конфигурации пользователя Git.\n[user]\n# Пожалуйста, адаптируйте и раскомментируйте следующие строки:\n#\tuser = %s\n#\temail = %s\n"
 
-#: builtin/config.c:583
+#: builtin/config.c:575
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "не удалось создать файл конфигурации %s"
 
-#: builtin/count-objects.c:55
+#: builtin/count-objects.c:77
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:65
+#: builtin/count-objects.c:87
 msgid "print sizes in human readable format"
 msgstr "вывод размеров в удобочитаемом для человека виде"
 
@@ -5391,7 +5443,7 @@
 msgid "only consider tags matching <pattern>"
 msgstr "рассматривать только метки по <шаблону>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:318
+#: builtin/describe.c:410 builtin/name-rev.c:314
 msgid "show abbreviated commit object as fallback"
 msgstr "если не найдено, показать сокращенный номер ревизии коммита"
 
@@ -5610,7 +5662,7 @@
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s → %s  (не удалось извлечь в текущую ветку)"
 
-#: builtin/fetch.c:478 builtin/fetch.c:564
+#: builtin/fetch.c:478 builtin/fetch.c:566
 msgid "[rejected]"
 msgstr "[отклонено]"
 
@@ -5634,125 +5686,125 @@
 msgid "[new ref]"
 msgstr "[новая ссылка]"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "unable to update local ref"
 msgstr "не удалось обновить локальную ссылку"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "forced update"
 msgstr "принудительное обновление"
 
-#: builtin/fetch.c:566
+#: builtin/fetch.c:568
 msgid "(non-fast-forward)"
 msgstr "(без перемотки вперед)"
 
-#: builtin/fetch.c:600 builtin/fetch.c:842
+#: builtin/fetch.c:602 builtin/fetch.c:843
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "не удалось открыть %s: %s\n"
 
-#: builtin/fetch.c:609
+#: builtin/fetch.c:611
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s не отправил все необходимые объекты\n"
 
-#: builtin/fetch.c:627
+#: builtin/fetch.c:629
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr "%s отклонено из-за того, что частичные корни не разрешено обновлять"
 
-#: builtin/fetch.c:715 builtin/fetch.c:807
+#: builtin/fetch.c:716 builtin/fetch.c:808
 #, c-format
 msgid "From %.*s\n"
 msgstr "Из %.*s\n"
 
-#: builtin/fetch.c:726
+#: builtin/fetch.c:727
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
 " 'git remote prune %s' to remove any old, conflicting branches"
 msgstr "не удалось обновить некоторые локальные ссылки; попробуйте запустить «git remote prune %s», чтобы почистить старые, конфликтующие ветки"
 
-#: builtin/fetch.c:778
+#: builtin/fetch.c:779
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s будет висящей веткой)"
 
-#: builtin/fetch.c:779
+#: builtin/fetch.c:780
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s стала висящей веткой)"
 
-#: builtin/fetch.c:811
+#: builtin/fetch.c:812
 msgid "[deleted]"
 msgstr "[удалено]"
 
-#: builtin/fetch.c:812 builtin/remote.c:1034
+#: builtin/fetch.c:813 builtin/remote.c:1040
 msgid "(none)"
 msgstr "(нет)"
 
-#: builtin/fetch.c:832
+#: builtin/fetch.c:833
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "Отказ получения в текущую ветку %s не голого репозитория"
 
-#: builtin/fetch.c:851
+#: builtin/fetch.c:852
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Неправильное значение «%2$s» для параметра «%1$s» для %3$s"
 
-#: builtin/fetch.c:854
+#: builtin/fetch.c:855
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Параметр «%s» игнорируется для %s\n"
 
-#: builtin/fetch.c:910
+#: builtin/fetch.c:911
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Не знаю как извлечь с %s"
 
-#: builtin/fetch.c:1071
+#: builtin/fetch.c:1072
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Извлечение из %s\n"
 
-#: builtin/fetch.c:1073 builtin/remote.c:90
+#: builtin/fetch.c:1074 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Не удалось извлечь %s"
 
-#: builtin/fetch.c:1091
+#: builtin/fetch.c:1092
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
 msgstr "Не указан внешний репозиторий. Укажите URL или имя внешнего репозитория из которого должны извлекаться новые редакции."
 
-#: builtin/fetch.c:1114
+#: builtin/fetch.c:1115
 msgid "You need to specify a tag name."
 msgstr "Вам нужно указать имя метки."
 
-#: builtin/fetch.c:1156
+#: builtin/fetch.c:1157
 msgid "--depth and --unshallow cannot be used together"
 msgstr "нельзя использовать одновременно --depth и --unshallow"
 
-#: builtin/fetch.c:1158
+#: builtin/fetch.c:1159
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow не имеет смысла на полном репозитории"
 
-#: builtin/fetch.c:1181
+#: builtin/fetch.c:1179
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all не принимает имя репозитория как аргумент"
 
-#: builtin/fetch.c:1183
+#: builtin/fetch.c:1181
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all не имеет смысла при указании спецификаций ссылок"
 
-#: builtin/fetch.c:1194
+#: builtin/fetch.c:1192
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Нет такого внешнего репозитория или группы: %s"
 
-#: builtin/fetch.c:1202
+#: builtin/fetch.c:1200
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Получение группы и указание спецификаций ссылок не имеет смысла"
 
@@ -5761,23 +5813,23 @@
 "git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
 msgstr "git fmt-merge-msg [-m <сообщение>] [--log[=<n>] | --no-log] [--file <файл>]"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:667
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "отправить в журнал <n> записей из короткого журнала"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:670
 msgid "alias for --log (deprecated)"
 msgstr "сокращение для --log (устаревшее)"
 
-#: builtin/fmt-merge-msg.c:676
+#: builtin/fmt-merge-msg.c:673
 msgid "text"
 msgstr "текст"
 
-#: builtin/fmt-merge-msg.c:677
+#: builtin/fmt-merge-msg.c:674
 msgid "use <text> as start of message"
 msgstr "использовать <текст> как начальное сообщение"
 
-#: builtin/fmt-merge-msg.c:678
+#: builtin/fmt-merge-msg.c:675
 msgid "file to read from"
 msgstr "файл для чтения"
 
@@ -5785,95 +5837,115 @@
 msgid "git for-each-ref [<options>] [<pattern>]"
 msgstr "git for-each-ref [<опции>] [<шаблон>]"
 
-#: builtin/for-each-ref.c:24
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
+msgstr "git for-each-ref [--points-at <объект>]"
+
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<объект>]]"
+
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
+msgstr "git for-each-ref [--contains [<объект>]]"
+
+#: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
 msgstr "выводить указатели места заполнения в подходящем формате для командного процессора"
 
-#: builtin/for-each-ref.c:26
+#: builtin/for-each-ref.c:29
 msgid "quote placeholders suitably for perl"
 msgstr "выводить указатели места заполнения в подходящем формате для perl"
 
-#: builtin/for-each-ref.c:28
+#: builtin/for-each-ref.c:31
 msgid "quote placeholders suitably for python"
 msgstr "выводить указатели места заполнения в подходящем формате для python"
 
-#: builtin/for-each-ref.c:30
+#: builtin/for-each-ref.c:33
 msgid "quote placeholders suitably for Tcl"
 msgstr "выводить указатели места заполнения в подходящем формате для Tcl"
 
-#: builtin/for-each-ref.c:33
+#: builtin/for-each-ref.c:36
 msgid "show only <n> matched refs"
 msgstr "показать только <n> совпадающих ссылок"
 
-#: builtin/for-each-ref.c:34
+#: builtin/for-each-ref.c:37 builtin/tag.c:372
 msgid "format to use for the output"
 msgstr "использовать формат для вывода"
 
-#: builtin/for-each-ref.c:35
-msgid "key"
-msgstr "ключ"
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
+msgstr "вывод только ссылок, которые указывают на переданный объект"
 
-#: builtin/for-each-ref.c:36
-msgid "field name to sort on"
-msgstr "имя поля, по которому выполнить сортировку"
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
+msgstr "вывод только слитых ссылок"
 
-#: builtin/fsck.c:163 builtin/prune.c:137
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr "вывод только не слитых ссылок"
+
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
+msgstr "вывод только ссылок, которые содержат коммит"
+
+#: builtin/fsck.c:156 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr "Проверка соединения"
 
-#: builtin/fsck.c:568
+#: builtin/fsck.c:486
 msgid "Checking object directories"
 msgstr "Проверка каталогов объектов"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:553
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<опции>] [<объект>…]"
 
-#: builtin/fsck.c:637
+#: builtin/fsck.c:559
 msgid "show unreachable objects"
 msgstr "показать недоступные объекты"
 
-#: builtin/fsck.c:638
+#: builtin/fsck.c:560
 msgid "show dangling objects"
 msgstr "показать объекты, на которые нет ссылок"
 
-#: builtin/fsck.c:639
+#: builtin/fsck.c:561
 msgid "report tags"
 msgstr "вывести отчет по меткам"
 
-#: builtin/fsck.c:640
+#: builtin/fsck.c:562
 msgid "report root nodes"
 msgstr "вывести отчет по корневым узлам"
 
-#: builtin/fsck.c:641
+#: builtin/fsck.c:563
 msgid "make index objects head nodes"
 msgstr "воспринимать объекты в индексе как корневые узлы"
 
-#: builtin/fsck.c:642
+#: builtin/fsck.c:564
 msgid "make reflogs head nodes (default)"
 msgstr "создать корневые узлы журналов ссылок (по умолчанию)"
 
-#: builtin/fsck.c:643
+#: builtin/fsck.c:565
 msgid "also consider packs and alternate objects"
 msgstr "также проверять пакеты и альтернативные объекты"
 
-#: builtin/fsck.c:644
+#: builtin/fsck.c:566
 msgid "check only connectivity"
 msgstr "только проверить соединение"
 
-#: builtin/fsck.c:645
+#: builtin/fsck.c:567
 msgid "enable more strict checking"
 msgstr "использовать более строгую проверку"
 
-#: builtin/fsck.c:647
+#: builtin/fsck.c:569
 msgid "write dangling objects in .git/lost-found"
 msgstr "записать объекты на которые нет ссылок в .git/lost-found"
 
-#: builtin/fsck.c:648 builtin/prune.c:107
+#: builtin/fsck.c:570 builtin/prune.c:107
 msgid "show progress"
 msgstr "показать прогресс выполнения"
 
-#: builtin/fsck.c:707
+#: builtin/fsck.c:631
 msgid "Checking objects"
 msgstr "Проверка объектов"
 
@@ -5881,54 +5953,64 @@
 msgid "git gc [<options>]"
 msgstr "git gc [<опции>]"
 
-#: builtin/gc.c:55
+#: builtin/gc.c:72
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "Недействительный %s: «%s»"
 
-#: builtin/gc.c:100
+#: builtin/gc.c:139
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "слишком длинный путь к каталогу объекта %.*s"
 
-#: builtin/gc.c:269
+#: builtin/gc.c:290
+#, c-format
+msgid ""
+"The last gc run reported the following. Please correct the root cause\n"
+"and remove %s.\n"
+"Automatic cleanup will not be performed until the file is removed.\n"
+"\n"
+"%s"
+msgstr "Последний запуск gc сообщил следующее. Пожалуйста, исправьте ошибку и удалите %s.\nАвтоматическая очистка репозитория не будет производиться, пока этот файл не удалён.\n\n%s"
+
+#: builtin/gc.c:327
 msgid "prune unreferenced objects"
 msgstr "почистить объекты, на которые нет ссылок"
 
-#: builtin/gc.c:271
+#: builtin/gc.c:329
 msgid "be more thorough (increased runtime)"
 msgstr "проверять более внимательно (занимает больше времени)"
 
-#: builtin/gc.c:272
+#: builtin/gc.c:330
 msgid "enable auto-gc mode"
 msgstr "включить режим auto-gc"
 
-#: builtin/gc.c:273
+#: builtin/gc.c:331
 msgid "force running gc even if there may be another gc running"
 msgstr "принудительно запустить gc, даже есть другая копия gc уже запущена"
 
-#: builtin/gc.c:315
+#: builtin/gc.c:373
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr "Автоматическая упаковка репозитория в фоне, для оптимальной производительности.\n"
 
-#: builtin/gc.c:317
+#: builtin/gc.c:375
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "Автоматическая упаковка репозитория, для оптимальной производительности.\n"
 
-#: builtin/gc.c:318
+#: builtin/gc.c:376
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "Смотрите «git help gc» руководства по ручной очистке.\n"
 
-#: builtin/gc.c:336
+#: builtin/gc.c:397
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
 msgstr "gc уже запущен на этом компьютере «%s» pid %<PRIuMAX> (если нет, используйте --force)"
 
-#: builtin/gc.c:364
+#: builtin/gc.c:441
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove "
 "them."
@@ -5963,199 +6045,195 @@
 msgid "cannot open '%s'"
 msgstr "не удалось открыть «%s»"
 
-#: builtin/grep.c:638
+#: builtin/grep.c:633
 msgid "search in index instead of in the work tree"
 msgstr "искать в индексе, а не в рабочем каталоге"
 
-#: builtin/grep.c:640
+#: builtin/grep.c:635
 msgid "find in contents not managed by git"
 msgstr "искать в содержимом не управляемым git"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:637
 msgid "search in both tracked and untracked files"
 msgstr "искать и в отслеживаемых, и в неотслеживаемых файлах"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:639
 msgid "ignore files specified via '.gitignore'"
 msgstr "игнорировать файлы указанные в «.gitignore»"
 
-#: builtin/grep.c:647
+#: builtin/grep.c:642
 msgid "show non-matching lines"
 msgstr "искать в несовпадающих строках"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:644
 msgid "case insensitive matching"
 msgstr "без учета регистра"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:646
 msgid "match patterns only at word boundaries"
 msgstr "искать совпадения шаблона только на границах слов"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:648
 msgid "process binary files as text"
 msgstr "обработка двоичных файлов как текста"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:650
 msgid "don't match patterns in binary files"
 msgstr "не искать совпадения шаблона в двоичных файлах"
 
-#: builtin/grep.c:658
+#: builtin/grep.c:653
 msgid "process binary files with textconv filters"
 msgstr "обрабатываться двоичные файлы с помощью фильтров textconv"
 
-#: builtin/grep.c:660
+#: builtin/grep.c:655
 msgid "descend at most <depth> levels"
 msgstr "на глубине максиму <глубина> уровней"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:659
 msgid "use extended POSIX regular expressions"
 msgstr "использовать расширенные регулярные выражения POSIX"
 
-#: builtin/grep.c:667
+#: builtin/grep.c:662
 msgid "use basic POSIX regular expressions (default)"
 msgstr "использовать базовые регулярные выражения POSIX (по умолчанию)"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:665
 msgid "interpret patterns as fixed strings"
 msgstr "интерпретировать шаблоны как фиксированные строки"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:668
 msgid "use Perl-compatible regular expressions"
 msgstr "использовать Perl-совместимые регулярные выражения"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:671
 msgid "show line numbers"
 msgstr "вывести номера строк"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:672
 msgid "don't show filenames"
 msgstr "не выводить имена файлов"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:673
 msgid "show filenames"
 msgstr "выводить имена файлов"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:675
 msgid "show filenames relative to top directory"
 msgstr "выводить имена файлов относительно каталога репозитория"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:677
 msgid "show only filenames instead of matching lines"
 msgstr "выводить только имена файлов, а не совпадающие строки"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:679
 msgid "synonym for --files-with-matches"
 msgstr "синоним для --files-with-matches"
 
-#: builtin/grep.c:687
+#: builtin/grep.c:682
 msgid "show only the names of files without match"
 msgstr "выводить только несовпадающие имена файлов"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:684
 msgid "print NUL after filenames"
 msgstr "выводить двоичный НОЛЬ после списка имен файлов"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:686
 msgid "show the number of matches instead of matching lines"
 msgstr "выводить количество совпадений, а не совпадающие строки"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:687
 msgid "highlight matches"
 msgstr "подсвечивать совпадения"
 
-#: builtin/grep.c:694
+#: builtin/grep.c:689
 msgid "print empty line between matches from different files"
 msgstr "выводить пустую строку после совпадений из разных файлов"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:691
 msgid "show filename only once above matches from same file"
 msgstr "выводить имя файла только раз на несколько совпадений в одном файле"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:694
 msgid "show <n> context lines before and after matches"
 msgstr "показать <n> строк контекста перед и после совпадения"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:697
 msgid "show <n> context lines before matches"
 msgstr "показать <n> строк контекста перед совпадением"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:699
 msgid "show <n> context lines after matches"
 msgstr "показать <n> строк контекста после совпадения"
 
-#: builtin/grep.c:705
+#: builtin/grep.c:700
 msgid "shortcut for -C NUM"
 msgstr "тоже, что и -C КОЛИЧЕСТВО"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:703
 msgid "show a line with the function name before matches"
 msgstr "показать строку с именем функции перед совпадением"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:705
 msgid "show the surrounding function"
 msgstr "показать окружающую функцию"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:708
 msgid "read patterns from file"
 msgstr "прочитать шаблоны из файла"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:710
 msgid "match <pattern>"
 msgstr "поиск соответствий с <шаблоном>"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:712
 msgid "combine patterns specified with -e"
 msgstr "объединить шаблоны указанные с помощью -e"
 
-#: builtin/grep.c:729
+#: builtin/grep.c:724
 msgid "indicate hit with exit status without output"
 msgstr "ничего не выводить, указать на совпадение с помощью кода выхода"
 
-#: builtin/grep.c:731
+#: builtin/grep.c:726
 msgid "show only matches from files that match all patterns"
 msgstr "показать только совпадения из файлов в которых совпадают все шаблоны"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:728
 msgid "show parse tree for grep expression"
 msgstr "показать дерево разбора для выражения поиска"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "pager"
 msgstr "пейджер"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "show matching files in the pager"
 msgstr "показать совпадающие файлы с помощью программы-пейджера"
 
-#: builtin/grep.c:740
+#: builtin/grep.c:735
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "разрешить вызов grep(1) (игнорируется в этой сборке)"
 
-#: builtin/grep.c:741 builtin/show-ref.c:189
-msgid "show usage"
-msgstr "показать использование"
-
-#: builtin/grep.c:808
+#: builtin/grep.c:793
 msgid "no pattern given."
 msgstr "не задан шаблон."
 
-#: builtin/grep.c:866
+#: builtin/grep.c:851
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager работает только в рабочем каталоге"
 
-#: builtin/grep.c:892
+#: builtin/grep.c:877
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached или --untracked нельзя использовать одновременно с --no-index."
 
-#: builtin/grep.c:897
+#: builtin/grep.c:882
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index или --untracked нельзя использовать одновременно с указанием ревизии."
 
-#: builtin/grep.c:900
+#: builtin/grep.c:885
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard не может использоваться для отслеживаемого содержимого."
 
-#: builtin/grep.c:908
+#: builtin/grep.c:893
 msgid "both --cached and trees are given."
 msgstr "указано одновременно --cached и дерево."
 
@@ -6166,10 +6244,10 @@
 msgstr "git hash-object [-t <тип>] [-w] [--path=<файл> | --no-filters] [--stdin] [--] <файл>…"
 
 #: builtin/hash-object.c:81
-msgid "git hash-object  --stdin-paths < <list-of-paths>"
-msgstr "git hash-object  --stdin-paths < <список-путей>"
+msgid "git hash-object  --stdin-paths"
+msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:92 builtin/tag.c:614
+#: builtin/hash-object.c:92
 msgid "type"
 msgstr "тип"
 
@@ -6240,80 +6318,80 @@
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "версия emacsclient «%d» слишком старая (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
+#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "сбой при запуске «%s»: %s"
 
-#: builtin/help.c:215
+#: builtin/help.c:208
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
 "Please consider using 'man.<tool>.cmd' instead."
 msgstr "«%s»: путь для неподдерживаемой программы просмотра man.\nВместо этого используйте «man.<программа>.cmd»."
 
-#: builtin/help.c:227
+#: builtin/help.c:220
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
 "Please consider using 'man.<tool>.path' instead."
 msgstr "«%s»: команда для неподдерживаемой программы просмотра man.\nВместо этого используйте «man.<программа>.path»."
 
-#: builtin/help.c:354
+#: builtin/help.c:337
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "«%s»: неизвестная программа просмотра man."
 
-#: builtin/help.c:371
+#: builtin/help.c:354
 msgid "no man viewer handled the request"
 msgstr "программа просмотра man не обработала запрос"
 
-#: builtin/help.c:379
+#: builtin/help.c:362
 msgid "no info viewer handled the request"
 msgstr "программа просмотра info не обработала запрос"
 
-#: builtin/help.c:428
+#: builtin/help.c:411
 msgid "Defining attributes per path"
 msgstr "Определение атрибутов для путей файлов или каталогов"
 
-#: builtin/help.c:429
+#: builtin/help.c:412
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Повседневный Git с 20 командами или около того"
 
-#: builtin/help.c:430
+#: builtin/help.c:413
 msgid "A Git glossary"
 msgstr "Глоссарий Git"
 
-#: builtin/help.c:431
+#: builtin/help.c:414
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Указание специально игнорируемых файлов"
 
-#: builtin/help.c:432
+#: builtin/help.c:415
 msgid "Defining submodule properties"
 msgstr "Определение свойств подмодулей"
 
-#: builtin/help.c:433
+#: builtin/help.c:416
 msgid "Specifying revisions and ranges for Git"
 msgstr "Указание редакций и диапазонов для Git"
 
-#: builtin/help.c:434
+#: builtin/help.c:417
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Учебное введение в Git (для версии 1.5.1 или новее)"
 
-#: builtin/help.c:435
+#: builtin/help.c:418
 msgid "An overview of recommended workflows with Git"
 msgstr "Обзор рекомендуемых последовательностей выполняемых действий с Git"
 
-#: builtin/help.c:447
+#: builtin/help.c:430
 msgid "The common Git guides are:\n"
 msgstr "Основные руководства Git:\n"
 
-#: builtin/help.c:468 builtin/help.c:485
+#: builtin/help.c:451 builtin/help.c:468
 #, c-format
 msgid "usage: %s%s"
 msgstr "использование: %s%s"
 
-#: builtin/help.c:501
+#: builtin/help.c:484
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "«git %s» — это сокращение для «%s»"
@@ -6616,87 +6694,62 @@
 msgid "--verify with no packfile name given"
 msgstr "--verify без указания имени файла пакета"
 
-#: builtin/init-db.c:36
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr "Не удалось предоставить доступ к %s на запись"
-
-#: builtin/init-db.c:63
-#, c-format
-msgid "insanely long template name %s"
-msgstr "слишком длинное имя шаблона %s"
-
-#: builtin/init-db.c:68
+#: builtin/init-db.c:55
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "не удалось выполнить stat для «%s»"
 
-#: builtin/init-db.c:74
+#: builtin/init-db.c:61
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "не удалось выполнить stat для шаблона «%s»"
 
-#: builtin/init-db.c:81
+#: builtin/init-db.c:66
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "не удалось выполнить opendir для «%s»"
 
-#: builtin/init-db.c:98
+#: builtin/init-db.c:77
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "не удалось выполнить readlink для «%s»"
 
-#: builtin/init-db.c:100
-#, c-format
-msgid "insanely long symlink %s"
-msgstr "слишком длинная символьная ссылка %s"
-
-#: builtin/init-db.c:103
+#: builtin/init-db.c:79
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "не удалось создать символьную ссылку «%s» на «%s»"
 
-#: builtin/init-db.c:107
+#: builtin/init-db.c:85
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "не удалось скопировать файл «%s» в «%s»"
 
-#: builtin/init-db.c:111
+#: builtin/init-db.c:89
 #, c-format
 msgid "ignoring template %s"
 msgstr "игнорирование шаблона %s"
 
-#: builtin/init-db.c:137
-#, c-format
-msgid "insanely long template path %s"
-msgstr "слишком длинный путь шаблона %s"
-
-#: builtin/init-db.c:145
+#: builtin/init-db.c:118
 #, c-format
 msgid "templates not found %s"
 msgstr "шаблоны не найдены %s"
 
-#: builtin/init-db.c:158
+#: builtin/init-db.c:131
 #, c-format
 msgid "not copying templates of a wrong format version %d from '%s'"
 msgstr "не копирую шаблоны в неправильной версии формата %d из «%s»"
 
-#: builtin/init-db.c:212
-#, c-format
-msgid "insane git directory %s"
-msgstr "слишком длинный путь к каталогу git %s"
-
-#: builtin/init-db.c:344 builtin/init-db.c:347
+#: builtin/init-db.c:309 builtin/init-db.c:312
 #, c-format
 msgid "%s already exists"
 msgstr "%s уже существует"
 
-#: builtin/init-db.c:375
+#: builtin/init-db.c:340
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "не удается обработать файл типа %d"
 
-#: builtin/init-db.c:378
+#: builtin/init-db.c:343
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "не удается переместить файл %s в %s"
@@ -6704,55 +6757,55 @@
 #. TRANSLATORS: The first '%s' is either "Reinitialized
 #. existing" or "Initialized empty", the second " shared" or
 #. "", and the last '%s%s' is the verbatim directory name.
-#: builtin/init-db.c:434
+#: builtin/init-db.c:399
 #, c-format
 msgid "%s%s Git repository in %s%s\n"
 msgstr "%s%s репозиторий Git в %s%s\n"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Reinitialized existing"
 msgstr "Реинициализация существующего"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Initialized empty"
 msgstr "Инициализирован пустой"
 
-#: builtin/init-db.c:436
+#: builtin/init-db.c:401
 msgid " shared"
 msgstr " общий"
 
-#: builtin/init-db.c:483
+#: builtin/init-db.c:448
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] "
 "[--shared[=<permissions>]] [<directory>]"
 msgstr "git init [-q | --quiet] [--bare] [--template=<каталог-шаблонов>] [--shared[=<права-доступа>]] [<каталог>]"
 
-#: builtin/init-db.c:506
+#: builtin/init-db.c:471
 msgid "permissions"
 msgstr "права-доступа"
 
-#: builtin/init-db.c:507
+#: builtin/init-db.c:472
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "укажите, если репозиторий git будет использоваться несколькими пользователями"
 
-#: builtin/init-db.c:541 builtin/init-db.c:546
+#: builtin/init-db.c:506 builtin/init-db.c:511
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "не удалось выполнить mkdir %s"
 
-#: builtin/init-db.c:550
+#: builtin/init-db.c:515
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "не удалось выполнить chdir в %s"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:536
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
 "dir=<directory>)"
 msgstr "%s (или --work-tree=<каталог>) нельзя использовать без указания %s (или --git-dir=<каталог>)"
 
-#: builtin/init-db.c:599
+#: builtin/init-db.c:564
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Не удалось получить доступ к рабочему каталогу «%s»"
@@ -6836,33 +6889,33 @@
 msgid "name of output directory is too long"
 msgstr "слишком длинное имя выходного каталога"
 
-#: builtin/log.c:814
+#: builtin/log.c:813
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Ну удалось открыть файл изменений %s"
 
-#: builtin/log.c:828
+#: builtin/log.c:827
 msgid "Need exactly one range."
 msgstr "Нужен только один диапазон."
 
-#: builtin/log.c:838
+#: builtin/log.c:837
 msgid "Not a range."
 msgstr "Не является диапазоном."
 
-#: builtin/log.c:944
+#: builtin/log.c:943
 msgid "Cover letter needs email format"
 msgstr "Сопроводительное письмо должно быть в формате электронной почты"
 
-#: builtin/log.c:1023
+#: builtin/log.c:1022
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "ошибка в поле in-reply-to: %s"
 
-#: builtin/log.c:1051
+#: builtin/log.c:1050
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<опции>] [<начиная-с> | <диапазон-редакций>]"
 
-#: builtin/log.c:1096
+#: builtin/log.c:1095
 msgid "Two output directories?"
 msgstr "Два выходных каталога?"
 
@@ -6919,135 +6972,139 @@
 msgstr "не выводить двоичные различия"
 
 #: builtin/log.c:1241
+msgid "output all-zero hash in From header"
+msgstr "выводить пустую хеш-сумму в поле Отправитель"
+
+#: builtin/log.c:1243
 msgid "don't include a patch matching a commit upstream"
 msgstr "не включать патч, если коммит уже есть в вышестоящей ветке"
 
-#: builtin/log.c:1243
+#: builtin/log.c:1245
 msgid "show patch format instead of default (patch + stat)"
 msgstr "выводить в формате патча, а не в стандартном (патч + статистика)"
 
-#: builtin/log.c:1245
+#: builtin/log.c:1247
 msgid "Messaging"
 msgstr "Передача сообщений"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1248
 msgid "header"
 msgstr "заголовок"
 
-#: builtin/log.c:1247
+#: builtin/log.c:1249
 msgid "add email header"
 msgstr "добавить заголовок сообщения"
 
-#: builtin/log.c:1248 builtin/log.c:1250
+#: builtin/log.c:1250 builtin/log.c:1252
 msgid "email"
 msgstr "почта"
 
-#: builtin/log.c:1248
+#: builtin/log.c:1250
 msgid "add To: header"
 msgstr "добавить заголовок To:"
 
-#: builtin/log.c:1250
+#: builtin/log.c:1252
 msgid "add Cc: header"
 msgstr "добавить заголовок Cc:"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1254
 msgid "ident"
 msgstr "идентификатор"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1255
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr "установить адрес отправителя на <идентификатор> (или на идентификатор коммитера, если отсутствует)"
 
-#: builtin/log.c:1255
+#: builtin/log.c:1257
 msgid "message-id"
 msgstr "идентификатор-сообщения"
 
-#: builtin/log.c:1256
+#: builtin/log.c:1258
 msgid "make first mail a reply to <message-id>"
 msgstr "сделать первое письмо ответом на <идентификатор-сообщения>"
 
-#: builtin/log.c:1257 builtin/log.c:1260
+#: builtin/log.c:1259 builtin/log.c:1262
 msgid "boundary"
 msgstr "вложение"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1260
 msgid "attach the patch"
 msgstr "приложить патч"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1263
 msgid "inline the patch"
 msgstr "включить патч в текст письма"
 
-#: builtin/log.c:1265
+#: builtin/log.c:1267
 msgid "enable message threading, styles: shallow, deep"
 msgstr "включить в письмах иерархичность, стили: shallow (частичную), deep (глубокую)"
 
-#: builtin/log.c:1267
+#: builtin/log.c:1269
 msgid "signature"
 msgstr "подпись"
 
-#: builtin/log.c:1268
+#: builtin/log.c:1270
 msgid "add a signature"
 msgstr "добавить подпись"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1272
 msgid "add a signature from a file"
 msgstr "добавить подпись из файла"
 
-#: builtin/log.c:1271
+#: builtin/log.c:1273
 msgid "don't print the patch filenames"
 msgstr "не выводить имена файлов патчей"
 
-#: builtin/log.c:1360
+#: builtin/log.c:1362
 msgid "-n and -k are mutually exclusive."
 msgstr "-n и -k нельзя использовать одновременно"
 
-#: builtin/log.c:1362
+#: builtin/log.c:1364
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix и -k нельзя использовать одновременно."
 
-#: builtin/log.c:1370
+#: builtin/log.c:1372
 msgid "--name-only does not make sense"
 msgstr "--name-only не имеет смысла"
 
-#: builtin/log.c:1372
+#: builtin/log.c:1374
 msgid "--name-status does not make sense"
 msgstr "--name-status не имеет смысла"
 
-#: builtin/log.c:1374
+#: builtin/log.c:1376
 msgid "--check does not make sense"
 msgstr "--check не имеет смысла"
 
-#: builtin/log.c:1397
+#: builtin/log.c:1401
 msgid "standard output, or directory, which one?"
 msgstr "стандартный вывод или каталог?"
 
-#: builtin/log.c:1399
+#: builtin/log.c:1403
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Не удалось создать каталог «%s»"
 
-#: builtin/log.c:1496
+#: builtin/log.c:1500
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "не удалось прочитать файл подписи «%s»"
 
-#: builtin/log.c:1559
+#: builtin/log.c:1563
 msgid "Failed to create output files"
 msgstr "Сбой при создании выходных файлов"
 
-#: builtin/log.c:1607
+#: builtin/log.c:1611
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<вышестоящая-ветка> [<голова> [<ограничение>]]]"
 
-#: builtin/log.c:1661
+#: builtin/log.c:1665
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> "
 "manually.\n"
 msgstr "Не удалось найти отслеживаемую внешнюю ветку, укажите <вышестоящую-ветку> вручную.\n"
 
-#: builtin/log.c:1672 builtin/log.c:1674 builtin/log.c:1686
+#: builtin/log.c:1676 builtin/log.c:1678 builtin/log.c:1690
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Неизвестный коммит %s"
@@ -7148,35 +7205,35 @@
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<опции>] <указатель-дерева> [<путь>…]"
 
-#: builtin/ls-tree.c:127
+#: builtin/ls-tree.c:128
 msgid "only show trees"
 msgstr "выводить только деревья"
 
-#: builtin/ls-tree.c:129
+#: builtin/ls-tree.c:130
 msgid "recurse into subtrees"
 msgstr "проходить рекурсивно в поддеревья"
 
-#: builtin/ls-tree.c:131
+#: builtin/ls-tree.c:132
 msgid "show trees when recursing"
 msgstr "выводить деревья при рекурсивном проходе"
 
-#: builtin/ls-tree.c:134
+#: builtin/ls-tree.c:135
 msgid "terminate entries with NUL byte"
 msgstr "разделять записи с помощью НУЛЕВОГО байта"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:136
 msgid "include object size"
 msgstr "включить размер объекта"
 
-#: builtin/ls-tree.c:137 builtin/ls-tree.c:139
+#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
 msgid "list only filenames"
 msgstr "выводить только имена файлов"
 
-#: builtin/ls-tree.c:142
+#: builtin/ls-tree.c:143
 msgid "use full path names"
 msgstr "использовать полные пути"
 
-#: builtin/ls-tree.c:144
+#: builtin/ls-tree.c:145
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr "вывести полное дерево; не только текущий каталог (включает в себя --full-name)"
 
@@ -7401,72 +7458,72 @@
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Не указана внешняя отслеживаемая ветка для %s на %s"
 
-#: builtin/merge.c:1081
+#: builtin/merge.c:1079
 #, c-format
 msgid "could not close '%s'"
 msgstr "не удалось закрыть «%s»"
 
-#: builtin/merge.c:1208
+#: builtin/merge.c:1206
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Нет слияния, которое можно отменить (отсутствует файл MERGE_HEAD)."
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1222
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
 msgstr "Вы не завершили слияние (присутствует файл MERGE_HEAD).\nВыполните коммит ваших изменений, перед слиянием."
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1229
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
 msgstr "Вы не завершили отбор лучшего (присутствует файл CHERRY_PICK_HEAD).\nПожалуйста, выполните коммит ваших изменений, перед слиянием."
 
-#: builtin/merge.c:1234
+#: builtin/merge.c:1232
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "Вы не завершили отбор лучшего (присутствует файл CHERRY_PICK_HEAD)."
 
-#: builtin/merge.c:1243
+#: builtin/merge.c:1241
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Нельзя использовать одновременно --squash и --no-ff."
 
-#: builtin/merge.c:1251
+#: builtin/merge.c:1249
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Коммит не указан и параметр merge.defaultToUpstream не установлен."
 
-#: builtin/merge.c:1268
+#: builtin/merge.c:1266
 msgid "Squash commit into empty head not supported yet"
 msgstr "Уплотнение коммита в пустой HEAD еще не поддерживается"
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1268
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "Коммит, не являющийся перемоткой вперед, нет смысла делать в пустой HEAD."
 
-#: builtin/merge.c:1276
+#: builtin/merge.c:1274
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s не является тем, что можно слить"
 
-#: builtin/merge.c:1278
+#: builtin/merge.c:1276
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Можно слить строго один коммит в пустой HEAD."
 
-#: builtin/merge.c:1333
+#: builtin/merge.c:1331
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "Коммит %s содержит не доверенную GPG подпись, предположительно от %s."
 
-#: builtin/merge.c:1336
+#: builtin/merge.c:1334
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "Коммит %s содержит плохую GPG подпись, предположительно от %s."
 
-#: builtin/merge.c:1339
+#: builtin/merge.c:1337
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Коммит %s не содержит GPG подпись."
 
-#: builtin/merge.c:1342
+#: builtin/merge.c:1340
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Коммит %s содержит действительную GPG подпись, от %s.\n"
@@ -7476,46 +7533,46 @@
 msgid "Updating %s..%s\n"
 msgstr "Обновление %s..%s\n"
 
-#: builtin/merge.c:1462
+#: builtin/merge.c:1460
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Попытка тривиального слияния в индексе…\n"
 
-#: builtin/merge.c:1469
+#: builtin/merge.c:1467
 #, c-format
 msgid "Nope.\n"
 msgstr "Не вышло.\n"
 
-#: builtin/merge.c:1501
+#: builtin/merge.c:1499
 msgid "Not possible to fast-forward, aborting."
 msgstr "Перемотка вперед не возможна, отмена."
 
-#: builtin/merge.c:1524 builtin/merge.c:1603
+#: builtin/merge.c:1522 builtin/merge.c:1601
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Перемотка дерева к исходному состоянию…\n"
 
-#: builtin/merge.c:1528
+#: builtin/merge.c:1526
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Попытка слияния с помощью стратегии %s…\n"
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1592
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Ни одна стратегия слияния не обработала слияние.\n"
 
-#: builtin/merge.c:1596
+#: builtin/merge.c:1594
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Сбой при слиянии с помощью стратегии %s.\n"
 
-#: builtin/merge.c:1605
+#: builtin/merge.c:1603
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Использую %s для подготовки ручного разрешения конфликтов.\n"
 
-#: builtin/merge.c:1617
+#: builtin/merge.c:1615
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr "Автоматическое слияние прошло успешно; как и запрашивали, остановлено перед выполнением коммита\n"
@@ -7701,48 +7758,48 @@
 msgid "Renaming %s to %s\n"
 msgstr "Переименование %s в %s\n"
 
-#: builtin/mv.c:256 builtin/remote.c:722 builtin/repack.c:362
+#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "сбой при переименовании «%s»"
 
-#: builtin/name-rev.c:255
+#: builtin/name-rev.c:251
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<опции>] <коммит>…"
 
-#: builtin/name-rev.c:256
+#: builtin/name-rev.c:252
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<опции>] --all"
 
-#: builtin/name-rev.c:257
+#: builtin/name-rev.c:253
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<опции>] --stdin"
 
-#: builtin/name-rev.c:309
+#: builtin/name-rev.c:305
 msgid "print only names (no SHA-1)"
 msgstr "выводить только имена (без SHA-1)"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:306
 msgid "only use tags to name the commits"
 msgstr "использовать только метки для именования коммитов"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:308
 msgid "only use refs matching <pattern>"
 msgstr "использовать только ссылки, соответствующие <шаблону> "
 
-#: builtin/name-rev.c:314
+#: builtin/name-rev.c:310
 msgid "list all commits reachable from all refs"
 msgstr "вывести список всех коммитов, достижимых со всех ссылок"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:311
 msgid "read from stdin"
 msgstr "прочитать из стандартного ввода"
 
-#: builtin/name-rev.c:316
+#: builtin/name-rev.c:312
 msgid "allow to print `undefined` names (default)"
 msgstr "разрешить вывод «undefined», если не найдено (по умолчанию)"
 
-#: builtin/name-rev.c:322
+#: builtin/name-rev.c:318
 msgid "dereference tags in the input (internal use)"
 msgstr "разыменовывать введенные метки (для внутреннего использования)"
 
@@ -7865,7 +7922,7 @@
 msgid "failed to finish 'show' for object '%s'"
 msgstr "не удалось завершить «show» для объекта «%s»"
 
-#: builtin/notes.c:174 builtin/tag.c:477
+#: builtin/notes.c:174 builtin/tag.c:248
 #, c-format
 msgid "could not create file '%s'"
 msgstr "не удалось создать файл «%s»"
@@ -7883,12 +7940,12 @@
 msgid "The note contents have been left in %s"
 msgstr "Содержимое заметки осталось в %s"
 
-#: builtin/notes.c:232 builtin/tag.c:695
+#: builtin/notes.c:232 builtin/tag.c:440
 #, c-format
 msgid "cannot read '%s'"
 msgstr "не удалось прочитать «%s»"
 
-#: builtin/notes.c:234 builtin/tag.c:698
+#: builtin/notes.c:234 builtin/tag.c:443
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "не удалось открыть или прочитать «%s»"
@@ -7896,7 +7953,7 @@
 #: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306
 #: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507
 #: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653
-#: builtin/notes.c:877 builtin/tag.c:711
+#: builtin/notes.c:877 builtin/tag.c:456
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Не удалось разрешить «%s» как ссылку."
@@ -7930,11 +7987,6 @@
 msgid "note contents in a file"
 msgstr "содержимое заметки в файле"
 
-#: builtin/notes.c:398 builtin/notes.c:401 builtin/notes.c:561
-#: builtin/notes.c:564 builtin/tag.c:630
-msgid "object"
-msgstr "объект"
-
 #: builtin/notes.c:399 builtin/notes.c:562
 msgid "reuse and edit specified note object"
 msgstr "использовать и отредактировать указанный объект заметки"
@@ -8055,7 +8107,7 @@
 msgid "use notes from <notes-ref>"
 msgstr "использовать заметку из <ссылка-на-заметку>"
 
-#: builtin/notes.c:1012 builtin/remote.c:1588
+#: builtin/notes.c:1012 builtin/remote.c:1647
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Неизвестная подкоманда: %s"
@@ -8261,21 +8313,25 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <время>] [--] [<имя-ветки>…]"
 
-#: builtin/prune.c:105 builtin/worktree.c:121
+#: builtin/prune.c:105 builtin/worktree.c:124
 msgid "do not remove, show only"
 msgstr "не удалять, только показать список"
 
-#: builtin/prune.c:106 builtin/worktree.c:122
+#: builtin/prune.c:106 builtin/worktree.c:125
 msgid "report pruned objects"
 msgstr "вывести список удаленных объектов"
 
-#: builtin/prune.c:109 builtin/worktree.c:124
+#: builtin/prune.c:109 builtin/worktree.c:127
 msgid "expire objects older than <time>"
 msgstr "удалить объекты старее чем <дата-окончания>"
 
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
+msgstr "нельзя почистить неиспользуемые объекты в precious-objects репозитории"
+
 #: builtin/pull.c:69
-msgid "git pull [options] [<repository> [<refspec>...]]"
-msgstr "git pull [опции] [<репозиторий> [<спецификация-ссылки>…]]"
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
+msgstr "git pull [<опции>] [<репозиторий> [<спецификация-ссылки>…]]"
 
 #: builtin/pull.c:113
 msgid "Options related to merging"
@@ -8405,25 +8461,25 @@
 msgid "Cannot rebase onto multiple branches."
 msgstr "Невозможно переместить над несколькими ветками."
 
-#: builtin/push.c:15
+#: builtin/push.c:16
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [<опции>] [<репозиторий> [<спецификация-ссылки>…]]"
 
-#: builtin/push.c:86
+#: builtin/push.c:88
 msgid "tag shorthand without <tag>"
 msgstr "указано сокращение tag, но не указана сама <метка>"
 
-#: builtin/push.c:96
+#: builtin/push.c:98
 msgid "--delete only accepts plain target ref names"
 msgstr "опция --delete принимает только простые целевые имена ссылок"
 
-#: builtin/push.c:140
+#: builtin/push.c:142
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
 msgstr "\nЧтобы выбрать любую из опций на постоянной основе, смотрите push.default в «git help config»."
 
-#: builtin/push.c:143
+#: builtin/push.c:145
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -8438,7 +8494,7 @@
 "%s"
 msgstr "Имя вышестоящей ветки и вашей текущей ветки различаются. Чтобы отправить изменения в вышестоящую ветку на внешнем репозитории, используйте:\n\n    git push %s HEAD:%s\n\nЧтобы отправить изменения в ветку с таким же именем на внешнем репозитории, используйте:\n\n    git push %s %s\n%s"
 
-#: builtin/push.c:158
+#: builtin/push.c:160
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -8448,7 +8504,7 @@
 "    git push %s HEAD:<name-of-remote-branch>\n"
 msgstr "Вы сейчас не находитесь ни на одной из веток.\nЧтобы отправить историю, ведущую к текущему (отделенный HEAD) состоянию, используйте\n\n    git push %s HEAD:<имя-внешней-ветки>\n"
 
-#: builtin/push.c:172
+#: builtin/push.c:174
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -8457,13 +8513,13 @@
 "    git push --set-upstream %s %s\n"
 msgstr "Текущая ветка %s не имеет вышестоящей ветки.\nЧтобы отправить текущую ветку и установить внешнюю ветку как вышестоящую для этой ветки, используйте\n\n    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:180
+#: builtin/push.c:182
 #, c-format
 msgid ""
 "The current branch %s has multiple upstream branches, refusing to push."
 msgstr "Ваша текущая ветка %s имеет несколько вышестоящих веток, отказ в отправке изменений."
 
-#: builtin/push.c:183
+#: builtin/push.c:185
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -8471,7 +8527,7 @@
 "to update which remote branch."
 msgstr "Вы сейчас отправляете изменения на внешний репозиторий «%s», который не является вышестоящим для вашей текущей ветки «%s», без указания того, что отправлять и в какую внешнюю ветку."
 
-#: builtin/push.c:206
+#: builtin/push.c:208
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -8495,11 +8551,11 @@
 "'current' instead of 'simple' if you sometimes use older versions of Git)"
 msgstr "push.default не установлен; его неявное значение было изменено в Git версии 2.0 с «matching» на «simple». Чтобы прекратить вывод этого сообщения и сохранить старое поведение, используйте:\n\n  git config --global push.default matching\n\nЧтобы прекратить вывод этого сообщения и использовать новое поведение, используйте:\n\n  git config --global push.default simple\n\nКогда push.default установлено в «matching», git будет отправлять изменения локальных веток в существующие внешние ветки с таким же именем.\n\nНачиная с Git версии 2.0, по умолчанию используется более консервативное поведение «simple», которое отправляет изменения текущей ветки в соответствующую внешнюю ветку, из которой «git pull» забирает изменения.\n\nСмотрите «git help config» и ищите «push.default» для дополнительной информации.\n(режим «simple» появился в Git версии 1.7.11. Используйте похожий режим «current» вместо «simple», если вы иногда используете старые версии Git)"
 
-#: builtin/push.c:273
+#: builtin/push.c:275
 msgid "You didn't specify any refspecs to push, and push.default is \"nothing\"."
-msgstr "Вы не указали спецификацию ссылки для отправки, а push.default указан как \"nothing\"."
+msgstr "Вы не указали спецификацию ссылки для отправки, а push.default указан как «nothing»."
 
-#: builtin/push.c:280
+#: builtin/push.c:282
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -8507,7 +8563,7 @@
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr "Обновления были отклонены, так как верхушка вашей текущей ветки\nпозади ее внешней части. Заберите и слейте внешние изменения \n(например, с помощью «git pull …») перед повторной попыткой отправки\nизменений.\nДля дополнительной информации смотрите «Note about fast-forwards»\nв «git push --help»."
 
-#: builtin/push.c:286
+#: builtin/push.c:288
 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"
@@ -8515,7 +8571,7 @@
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr "Обновления были отклонены, так как верхушка отправляемой ветки\nпозади ее внешней части. Переключитесь на ветку и заберите внешние\nизменения (например, с помощью «git pull …») перед повторной\nпопыткой отправки изменений.\nДля дополнительной информации смотрите «Note about fast-forwards»\nв «git push --help»."
 
-#: builtin/push.c:292
+#: builtin/push.c:294
 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"
@@ -8524,33 +8580,33 @@
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr "Обновления были отклонены, так как внешний репозиторий содержит\nизменения, которых у вас нет в вашем локальном репозитории.\nОбычно, это связанно с тем, что кто-то уже отправил изменения в \nто же место. Перед повторной отправкой ваших изменений, вам нужно\nзабрать и слить изменения из внешнего репозитория себе\n(например, с помощью «git pull …»).\nДля дополнительной информации смотрите «Note about fast-forwards»\nв «git push --help»."
 
-#: builtin/push.c:299
+#: builtin/push.c:301
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr "Обновления были отклонены, так как метка уже существует во внешнем репозитории."
 
-#: builtin/push.c:302
+#: builtin/push.c:304
 msgid ""
 "You cannot update a remote ref that points at a non-commit object,\n"
 "or update a remote ref to make it point at a non-commit object,\n"
 "without using the '--force' option.\n"
 msgstr "Вы не можете обновить внешнюю ссылку, которая указывает на объект, не являющийся коммитом или обновить внешнюю ссылку так, чтобы она указывала на объект, не являющийся коммитом, без указания опции «--force».\n"
 
-#: builtin/push.c:361
+#: builtin/push.c:363
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Отправка в %s\n"
 
-#: builtin/push.c:365
+#: builtin/push.c:367
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "не удалось отправить некоторые ссылки в «%s»"
 
-#: builtin/push.c:395
+#: builtin/push.c:397
 #, c-format
 msgid "bad repository '%s'"
 msgstr "плохой репозитория «%s»"
 
-#: builtin/push.c:396
+#: builtin/push.c:398
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote repository using\n"
@@ -8562,100 +8618,104 @@
 "    git push <name>\n"
 msgstr "Не настроена точка назначения для отправки.\nЛибо укажите URL с помощью коммандной строки, либо настройте внешний репозиторий с помощью\n\n    git remote add <имя> <адрес>\n\nа затем отправьте изменения с помощью имени внешнего репозитория\n\n    git push <имя>\n"
 
-#: builtin/push.c:411
+#: builtin/push.c:413
 msgid "--all and --tags are incompatible"
 msgstr "--all и --tags нельзя использовать одновременно"
 
-#: builtin/push.c:412
+#: builtin/push.c:414
 msgid "--all can't be combined with refspecs"
 msgstr "--all нельзя использовать вместе со спецификациями ссылок"
 
-#: builtin/push.c:417
+#: builtin/push.c:419
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror и --tags нельзя использовать одновременно"
 
-#: builtin/push.c:418
+#: builtin/push.c:420
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror нельзя использовать вместе со спецификациями ссылок"
 
-#: builtin/push.c:423
+#: builtin/push.c:425
 msgid "--all and --mirror are incompatible"
 msgstr "--all и --mirror нельзя использовать одновременно"
 
-#: builtin/push.c:539
+#: builtin/push.c:537
 msgid "repository"
 msgstr "репозиторий"
 
-#: builtin/push.c:540 builtin/send-pack.c:161
+#: builtin/push.c:538 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "отправить все ссылки"
 
-#: builtin/push.c:541 builtin/send-pack.c:163
+#: builtin/push.c:539 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "сделать зеркало всех ссылок"
 
-#: builtin/push.c:543
+#: builtin/push.c:541
 msgid "delete refs"
 msgstr "удалить ссылки"
 
-#: builtin/push.c:544
+#: builtin/push.c:542
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "отправить метки (нельзя использовать вместе с --all или --mirror)"
 
-#: builtin/push.c:547 builtin/send-pack.c:164
+#: builtin/push.c:545 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "принудительное обновление"
 
-#: builtin/push.c:549 builtin/send-pack.c:175
+#: builtin/push.c:547 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "имя-ссылки>:<ожидается"
 
-#: builtin/push.c:550 builtin/send-pack.c:176
+#: builtin/push.c:548 builtin/send-pack.c:176
 msgid "require old value of ref to be at this value"
 msgstr "требовать, чтобы старое значение ссылки было ожидаемым"
 
-#: builtin/push.c:553
+#: builtin/push.c:550
+msgid "check|on-demand|no"
+msgstr "check|on-demand|no"
+
+#: builtin/push.c:551
 msgid "control recursive pushing of submodules"
 msgstr "управление рекурсивной отправкой подмодулей"
 
-#: builtin/push.c:555 builtin/send-pack.c:169
+#: builtin/push.c:553 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "использовать тонкие пакеты"
 
-#: builtin/push.c:556 builtin/push.c:557 builtin/send-pack.c:158
+#: builtin/push.c:554 builtin/push.c:555 builtin/send-pack.c:158
 #: builtin/send-pack.c:159
 msgid "receive pack program"
 msgstr "путь к программе упаковки на сервере"
 
-#: builtin/push.c:558
+#: builtin/push.c:556
 msgid "set upstream for git pull/status"
 msgstr "установить вышестоящую ветку для git pull/status"
 
-#: builtin/push.c:561
+#: builtin/push.c:559
 msgid "prune locally removed refs"
 msgstr "почистить локально удаленные ссылки"
 
-#: builtin/push.c:563
+#: builtin/push.c:561
 msgid "bypass pre-push hook"
 msgstr "пропустить перехватчик перед-отправкой"
 
-#: builtin/push.c:564
+#: builtin/push.c:562
 msgid "push missing but relevant tags"
 msgstr "отправить пропущенные, но нужные метки"
 
-#: builtin/push.c:567 builtin/send-pack.c:166
+#: builtin/push.c:565 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "подписать отправку с помощью GPG"
 
-#: builtin/push.c:569 builtin/send-pack.c:170
+#: builtin/push.c:567 builtin/send-pack.c:170
 msgid "request atomic transaction on remote side"
 msgstr "запросить выполнение атомарной транзакции на внешней стороне"
 
-#: builtin/push.c:579
+#: builtin/push.c:577
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete несовместимо с  --all, --mirror и --tags"
 
-#: builtin/push.c:581
+#: builtin/push.c:579
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete не имеет смысла без указания ссылок"
 
@@ -8730,12 +8790,12 @@
 msgid "debug unpack-trees"
 msgstr "отладка unpack-trees"
 
-#: builtin/reflog.c:432
+#: builtin/reflog.c:428
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
 msgstr "«%s» для «%s» не является допустимой меткой даты/времени"
 
-#: builtin/reflog.c:549 builtin/reflog.c:554
+#: builtin/reflog.c:545 builtin/reflog.c:550
 #, c-format
 msgid "'%s' is not a valid timestamp"
 msgstr "«%s» не является допустимой меткой даты/времени"
@@ -8750,15 +8810,15 @@
 "[--mirror=<fetch|push>] <name> <url>"
 msgstr "git remote add [-t <ветка>] [-m <мастер-ветка>] [-f] [--tags | --no-tags] [--mirror=<fetch|push>] <имя> <адрес>"
 
-#: builtin/remote.c:14 builtin/remote.c:33
+#: builtin/remote.c:14 builtin/remote.c:34
 msgid "git remote rename <old> <new>"
 msgstr "git remote rename <старое-название> <новое-название>"
 
-#: builtin/remote.c:15 builtin/remote.c:38
+#: builtin/remote.c:15 builtin/remote.c:39
 msgid "git remote remove <name>"
 msgstr "git remote remove <имя>"
 
-#: builtin/remote.c:16 builtin/remote.c:43
+#: builtin/remote.c:16 builtin/remote.c:44
 msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
 msgstr "git remote set-head <имя> (-a | --auto | -d | --delete | <ветка>)"
 
@@ -8779,143 +8839,147 @@
 msgid "git remote set-branches [--add] <name> <branch>..."
 msgstr "git remote set-branches [--add] <имя> <ветка>…"
 
-#: builtin/remote.c:21 builtin/remote.c:69
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr "git remote get-url [--push] [--all] <имя>"
+
+#: builtin/remote.c:22 builtin/remote.c:75
 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
 msgstr "git remote set-url [--push] <имя> <новый-url> [<старый-url>]"
 
-#: builtin/remote.c:22 builtin/remote.c:70
+#: builtin/remote.c:23 builtin/remote.c:76
 msgid "git remote set-url --add <name> <newurl>"
 msgstr "git remote set-url --add <имя> <новый-url>"
 
-#: builtin/remote.c:23 builtin/remote.c:71
+#: builtin/remote.c:24 builtin/remote.c:77
 msgid "git remote set-url --delete <name> <url>"
 msgstr "git remote set-url --delete <имя> <url>"
 
-#: builtin/remote.c:28
+#: builtin/remote.c:29
 msgid "git remote add [<options>] <name> <url>"
 msgstr "git remote add [<опции>] <имя> <url>"
 
-#: builtin/remote.c:48
+#: builtin/remote.c:49
 msgid "git remote set-branches <name> <branch>..."
 msgstr "git remote set-branches <имя> <ветка>…"
 
-#: builtin/remote.c:49
+#: builtin/remote.c:50
 msgid "git remote set-branches --add <name> <branch>..."
 msgstr "git remote set-branches --add <имя> <ветка>…"
 
-#: builtin/remote.c:54
+#: builtin/remote.c:55
 msgid "git remote show [<options>] <name>"
 msgstr "git remote show [<опции>] <имя>"
 
-#: builtin/remote.c:59
+#: builtin/remote.c:60
 msgid "git remote prune [<options>] <name>"
 msgstr "git remote prune [<опции>] <имя>"
 
-#: builtin/remote.c:64
+#: builtin/remote.c:65
 msgid "git remote update [<options>] [<group> | <remote>]..."
 msgstr "git remote update [<опции>] [<группа> | <имя-внешнего-репозитория>]…"
 
-#: builtin/remote.c:88
+#: builtin/remote.c:94
 #, c-format
 msgid "Updating %s"
 msgstr "Обновление %s"
 
-#: builtin/remote.c:120
+#: builtin/remote.c:126
 msgid ""
 "--mirror is dangerous and deprecated; please\n"
 "\t use --mirror=fetch or --mirror=push instead"
 msgstr "ключ --mirror небезопасен и не рекомендуется к использованию;\nиспользуйте вместо него --mirror=fetch или --mirror=push"
 
-#: builtin/remote.c:137
+#: builtin/remote.c:143
 #, c-format
 msgid "unknown mirror argument: %s"
 msgstr "неизвестный аргумент для mirror: %s"
 
-#: builtin/remote.c:153
+#: builtin/remote.c:159
 msgid "fetch the remote branches"
 msgstr "извлечь внешние ветки"
 
-#: builtin/remote.c:155
+#: builtin/remote.c:161
 msgid "import all tags and associated objects when fetching"
 msgstr "импортировать все метки и ассоциированные объекты при извлечении"
 
-#: builtin/remote.c:158
+#: builtin/remote.c:164
 msgid "or do not fetch any tag at all (--no-tags)"
 msgstr "или не извлекать метки вообще (--no-tags)"
 
-#: builtin/remote.c:160
+#: builtin/remote.c:166
 msgid "branch(es) to track"
 msgstr "отслеживаемые ветки"
 
-#: builtin/remote.c:161
+#: builtin/remote.c:167
 msgid "master branch"
 msgstr "мастер ветка"
 
-#: builtin/remote.c:162
+#: builtin/remote.c:168
 msgid "push|fetch"
 msgstr "push|fetch"
 
-#: builtin/remote.c:163
+#: builtin/remote.c:169
 msgid "set up remote as a mirror to push to or fetch from"
 msgstr "настроить внешний репозиторий как зеркало для отправки или извлечения изменений"
 
-#: builtin/remote.c:175
+#: builtin/remote.c:181
 msgid "specifying a master branch makes no sense with --mirror"
 msgstr "указание мастер ветки не имеет смысла с параметром --mirror"
 
-#: builtin/remote.c:177
+#: builtin/remote.c:183
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr "указание отслеживаемых веток имеет смысл только при зеркальном извлечении"
 
-#: builtin/remote.c:187 builtin/remote.c:637
+#: builtin/remote.c:193 builtin/remote.c:643
 #, c-format
 msgid "remote %s already exists."
 msgstr "внешний репозиторий %s уже существует"
 
-#: builtin/remote.c:191 builtin/remote.c:641
+#: builtin/remote.c:197 builtin/remote.c:647
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "«%s» не является допустимым именем внешнего репозитория."
 
-#: builtin/remote.c:235
+#: builtin/remote.c:241
 #, c-format
 msgid "Could not setup master '%s'"
 msgstr "Не удалось настроить мастер ветку «%s»"
 
-#: builtin/remote.c:335
+#: builtin/remote.c:341
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr "Не удалось извлечь карту для спецификации ссылки %s"
 
-#: builtin/remote.c:436 builtin/remote.c:444
+#: builtin/remote.c:442 builtin/remote.c:450
 msgid "(matching)"
 msgstr "(соответствующая)"
 
-#: builtin/remote.c:448
+#: builtin/remote.c:454
 msgid "(delete)"
 msgstr "(удаленная)"
 
-#: builtin/remote.c:588 builtin/remote.c:594 builtin/remote.c:600
+#: builtin/remote.c:594 builtin/remote.c:600 builtin/remote.c:606
 #, c-format
 msgid "Could not append '%s' to '%s'"
 msgstr "Не удалось добавить «%s» к «%s»"
 
-#: builtin/remote.c:630 builtin/remote.c:769 builtin/remote.c:869
+#: builtin/remote.c:636 builtin/remote.c:775 builtin/remote.c:875
 #, c-format
 msgid "No such remote: %s"
 msgstr "Нет такого внешнего репозитория: %s"
 
-#: builtin/remote.c:647
+#: builtin/remote.c:653
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Не удалось переименовать секцию конфигурации с «%s» на «%s»"
 
-#: builtin/remote.c:653 builtin/remote.c:821
+#: builtin/remote.c:659 builtin/remote.c:827
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Не удалось удалить секцию файла конфигурации «%s»"
 
-#: builtin/remote.c:668
+#: builtin/remote.c:674
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -8923,27 +8987,27 @@
 "\tPlease update the configuration manually if necessary."
 msgstr "Не обновляю нестандартную спецификацию ссылки для извлечения\n\t%s\n\tПожалуйста, если требуется, обновите конфигурацию вручную."
 
-#: builtin/remote.c:674
+#: builtin/remote.c:680
 #, c-format
 msgid "Could not append '%s'"
 msgstr "Не удалось добавить «%s»"
 
-#: builtin/remote.c:685
+#: builtin/remote.c:691
 #, c-format
 msgid "Could not set '%s'"
 msgstr "Не удалось установить «%s»"
 
-#: builtin/remote.c:707
+#: builtin/remote.c:713
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "не удалось удалить «%s»"
 
-#: builtin/remote.c:741
+#: builtin/remote.c:747
 #, c-format
 msgid "creating '%s' failed"
 msgstr "не удалось создать «%s»"
 
-#: builtin/remote.c:807
+#: builtin/remote.c:813
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -8955,125 +9019,125 @@
 msgstr[2] "Примечание: Некоторые ветки вне иерархии refs/remotes/ не будут удалены;\nчтобы удалить их, используйте:"
 msgstr[3] "Примечание: Некоторые ветки вне иерархии refs/remotes/ не будут удалены;\nчтобы удалить их, используйте:"
 
-#: builtin/remote.c:922
+#: builtin/remote.c:928
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " новая (следующее извлечение сохранит ее в remotes/%s)"
 
-#: builtin/remote.c:925
+#: builtin/remote.c:931
 msgid " tracked"
 msgstr " отслеживается"
 
-#: builtin/remote.c:927
+#: builtin/remote.c:933
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " недействительна (используйте «git remote prune», чтобы удалить)"
 
-#: builtin/remote.c:929
+#: builtin/remote.c:935
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:976
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "неправильный параметр конфигурации branch.%s.merge; невозможно переместить более чем над 1 веткой"
 
-#: builtin/remote.c:977
+#: builtin/remote.c:983
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "будет перемещена над внешней веткой %s"
 
-#: builtin/remote.c:980
+#: builtin/remote.c:986
 #, c-format
 msgid " merges with remote %s"
 msgstr " будет слита с внешней веткой %s"
 
-#: builtin/remote.c:981
+#: builtin/remote.c:987
 msgid "    and with remote"
 msgstr "    и с внешней веткой"
 
-#: builtin/remote.c:983
+#: builtin/remote.c:989
 #, c-format
 msgid "merges with remote %s"
 msgstr "будет слита с внешней веткой %s"
 
-#: builtin/remote.c:984
+#: builtin/remote.c:990
 msgid "   and with remote"
 msgstr "   и с внешней веткой"
 
-#: builtin/remote.c:1030
+#: builtin/remote.c:1036
 msgid "create"
 msgstr "создана"
 
-#: builtin/remote.c:1033
+#: builtin/remote.c:1039
 msgid "delete"
 msgstr "удалена"
 
-#: builtin/remote.c:1037
+#: builtin/remote.c:1043
 msgid "up to date"
 msgstr "уже актуальна"
 
-#: builtin/remote.c:1040
+#: builtin/remote.c:1046
 msgid "fast-forwardable"
 msgstr "возможна перемотка вперед"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1049
 msgid "local out of date"
 msgstr "локальная ветка устарела"
 
-#: builtin/remote.c:1050
+#: builtin/remote.c:1056
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s будет принудительно отправлена в %-*s (%s)"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1059
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s будет отправлена в %-*s (%s)"
 
-#: builtin/remote.c:1057
+#: builtin/remote.c:1063
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s будет принудительно отправлена в %s"
 
-#: builtin/remote.c:1060
+#: builtin/remote.c:1066
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s будет отправлена в %s"
 
-#: builtin/remote.c:1128
+#: builtin/remote.c:1134
 msgid "do not query remotes"
 msgstr "не опрашивать внешние репозитории"
 
-#: builtin/remote.c:1155
+#: builtin/remote.c:1161
 #, c-format
 msgid "* remote %s"
 msgstr "* внешний репозиторий %s"
 
-#: builtin/remote.c:1156
+#: builtin/remote.c:1162
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL для извлечения: %s"
 
-#: builtin/remote.c:1157 builtin/remote.c:1308
+#: builtin/remote.c:1163 builtin/remote.c:1314
 msgid "(no URL)"
 msgstr "(нет URL)"
 
-#: builtin/remote.c:1166 builtin/remote.c:1168
+#: builtin/remote.c:1172 builtin/remote.c:1174
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL для отправки: %s"
 
-#: builtin/remote.c:1170 builtin/remote.c:1172 builtin/remote.c:1174
+#: builtin/remote.c:1176 builtin/remote.c:1178 builtin/remote.c:1180
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  HEAD ветка: %s"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1182
 #, c-format
 msgid "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr "  HEAD ветка (HEAD внешнего репозитория неоднозначный, может быть одним из):\n"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1194
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
@@ -9082,11 +9146,11 @@
 msgstr[2] "    Внешние ветки:%s"
 msgstr[3] "    Внешние ветки:%s"
 
-#: builtin/remote.c:1191 builtin/remote.c:1218
+#: builtin/remote.c:1197 builtin/remote.c:1224
 msgid " (status not queried)"
 msgstr " (статус не запрошен)"
 
-#: builtin/remote.c:1200
+#: builtin/remote.c:1206
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Локальная ветка, настроенная для «git pull»:"
@@ -9094,11 +9158,11 @@
 msgstr[2] "  Локальные ветки, настроенные для «git pull»:"
 msgstr[3] "  Локальные ветки, настроенные для «git pull»:"
 
-#: builtin/remote.c:1208
+#: builtin/remote.c:1214
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr " Локальные ссылки, зеркалируемые с помощью «git push»"
 
-#: builtin/remote.c:1215
+#: builtin/remote.c:1221
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
@@ -9107,115 +9171,128 @@
 msgstr[2] "  Локальные ссылки, настроенные для «git push»%s:"
 msgstr[3] "  Локальные ссылки, настроенные для «git push»%s:"
 
-#: builtin/remote.c:1236
+#: builtin/remote.c:1242
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "установить refs/remotes/<имя>/HEAD в зависимости от внешнего репозитория"
 
-#: builtin/remote.c:1238
+#: builtin/remote.c:1244
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "удалить refs/remotes/<имя>/HEAD"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1259
 msgid "Cannot determine remote HEAD"
 msgstr "Не удалось определить внешний HEAD"
 
-#: builtin/remote.c:1255
+#: builtin/remote.c:1261
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "Несколько внешних HEAD веток. Укажите явно одну из них:"
 
-#: builtin/remote.c:1265
+#: builtin/remote.c:1271
 #, c-format
 msgid "Could not delete %s"
 msgstr "Не удалось удалить %s"
 
-#: builtin/remote.c:1273
+#: builtin/remote.c:1279
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Неправильная ссылка: %s"
 
-#: builtin/remote.c:1275
+#: builtin/remote.c:1281
 #, c-format
 msgid "Could not setup %s"
 msgstr "Не удалось настроить %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1299
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s будет висящей веткой!"
 
-#: builtin/remote.c:1294
+#: builtin/remote.c:1300
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s стала висящей веткой!"
 
-#: builtin/remote.c:1304
+#: builtin/remote.c:1310
 #, c-format
 msgid "Pruning %s"
 msgstr "Удаление %s"
 
-#: builtin/remote.c:1305
+#: builtin/remote.c:1311
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1321
+#: builtin/remote.c:1327
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [будет удалена] %s"
 
-#: builtin/remote.c:1324
+#: builtin/remote.c:1330
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [удалена] %s"
 
-#: builtin/remote.c:1369
+#: builtin/remote.c:1375
 msgid "prune remotes after fetching"
 msgstr "почистить внешние репозитории после извлечения"
 
-#: builtin/remote.c:1435 builtin/remote.c:1509
+#: builtin/remote.c:1441 builtin/remote.c:1498 builtin/remote.c:1566
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Нет такого внешнего репозитория «%s»"
 
-#: builtin/remote.c:1455
+#: builtin/remote.c:1461
 msgid "add branch"
 msgstr "добавить ветку"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1468
 msgid "no remote specified"
 msgstr "не указан внешний репозиторий"
 
-#: builtin/remote.c:1484
+#: builtin/remote.c:1485
+msgid "query push URLs rather than fetch URLs"
+msgstr "запросить URL отправки, вместо URL извлечения"
+
+#: builtin/remote.c:1487
+msgid "return all URLs"
+msgstr "вернуть все URL"
+
+#: builtin/remote.c:1515
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr "URL не настроены для внешнего репозитория «%s»"
+
+#: builtin/remote.c:1541
 msgid "manipulate push URLs"
 msgstr "управление URL отправки"
 
-#: builtin/remote.c:1486
+#: builtin/remote.c:1543
 msgid "add URL"
 msgstr "добавить URL"
 
-#: builtin/remote.c:1488
+#: builtin/remote.c:1545
 msgid "delete URLs"
 msgstr "удалить URL"
 
-#: builtin/remote.c:1495
+#: builtin/remote.c:1552
 msgid "--add --delete doesn't make sense"
 msgstr "--add нельзя использовать одновременно с --delete"
 
-#: builtin/remote.c:1535
+#: builtin/remote.c:1592
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Неправильный шаблон старого URL: %s"
 
-#: builtin/remote.c:1543
+#: builtin/remote.c:1600
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Не найдены совпадения URL: %s"
 
-#: builtin/remote.c:1545
+#: builtin/remote.c:1602
 msgid "Will not delete all non-push URLs"
 msgstr "Нельзя удалить все URL не-отправки"
 
-#: builtin/remote.c:1559
+#: builtin/remote.c:1616
 msgid "be verbose; must be placed before a subcommand"
 msgstr "быть многословнее; должно стоять перед подкомандой"
 
@@ -9287,7 +9364,11 @@
 msgid "repack objects in packs marked with .keep"
 msgstr "переупаковать объекты в пакеты, помеченные файлом .keep"
 
-#: builtin/repack.c:378
+#: builtin/repack.c:197
+msgid "cannot delete packs in a precious-objects repo"
+msgstr "нельзя удалять пакеты в precious-objects репозитории"
+
+#: builtin/repack.c:381
 #, c-format
 msgid "removing '%s' failed"
 msgstr "не удалось удалить «%s»"
@@ -9380,7 +9461,7 @@
 msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
 msgstr "git rerere [clear | forget <путь>… | status | remaining | diff | gc]"
 
-#: builtin/rerere.c:57
+#: builtin/rerere.c:58
 msgid "register clean resolutions in index"
 msgstr "записать чистые разрешения конфликтов в индекс"
 
@@ -9513,23 +9594,23 @@
 msgid "rev-list does not support display of notes"
 msgstr "rev-list не поддерживает отображение заметок"
 
-#: builtin/rev-parse.c:361
+#: builtin/rev-parse.c:358
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<опции>] -- [<аргументы>…]"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:363
 msgid "keep the `--` passed as an arg"
 msgstr "передавать далее «--» как аргумент"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:365
 msgid "stop parsing after the first non-option argument"
 msgstr "остановить разбор после первого аргумента не являющегося опцией"
 
-#: builtin/rev-parse.c:371
+#: builtin/rev-parse.c:368
 msgid "output in stuck long form"
 msgstr "выводить аргументы в длинном формате"
 
-#: builtin/rev-parse.c:502
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -9770,79 +9851,79 @@
 msgid "Linewrap output"
 msgstr "Перенос строк на выводе"
 
-#: builtin/show-branch.c:9
+#: builtin/show-branch.c:10
 msgid ""
 "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
 "\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
 "\t\t[--more=<n> | --list | --independent | --merge-base]\n"
 "\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]"
-msgstr "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n\t\t[--current] [--color[=<когда>] | --no-color] [--sparse]\n\t\t[--more=<n> | --list | --independent | --merge-base]\n\t\t[--no-name | --sha1-name] [--topics] [(<редакция> | <шаблон>)...]"
+msgstr "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n\t\t[--current] [--color[=<когда>] | --no-color] [--sparse]\n\t\t[--more=<n> | --list | --independent | --merge-base]\n\t\t[--no-name | --sha1-name] [--topics] [(<редакция> | <шаблон>)…]"
 
-#: builtin/show-branch.c:13
+#: builtin/show-branch.c:14
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<база>]] [--list] [<ссылка>]"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:640
 msgid "show remote-tracking and local branches"
 msgstr "показать список и отслеживаемых внешних и локальных веток"
 
-#: builtin/show-branch.c:661
+#: builtin/show-branch.c:642
 msgid "show remote-tracking branches"
 msgstr "показать список отслеживаемых внешних веток"
 
-#: builtin/show-branch.c:663
+#: builtin/show-branch.c:644
 msgid "color '*!+-' corresponding to the branch"
 msgstr "окрашивать «*!+-» в соответствии с веткой"
 
-#: builtin/show-branch.c:665
+#: builtin/show-branch.c:646
 msgid "show <n> more commits after the common ancestor"
 msgstr "показать <n> коммитов после общего предка"
 
-#: builtin/show-branch.c:667
+#: builtin/show-branch.c:648
 msgid "synonym to more=-1"
 msgstr "синоним для more=-1"
 
-#: builtin/show-branch.c:668
+#: builtin/show-branch.c:649
 msgid "suppress naming strings"
 msgstr "не выводить именованые строки"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:651
 msgid "include the current branch"
 msgstr "включить в вывод текущую ветку"
 
-#: builtin/show-branch.c:672
+#: builtin/show-branch.c:653
 msgid "name commits with their object names"
 msgstr "именовать коммиты их именами объектов"
 
-#: builtin/show-branch.c:674
+#: builtin/show-branch.c:655
 msgid "show possible merge bases"
 msgstr "вывести возможные базы слияния"
 
-#: builtin/show-branch.c:676
+#: builtin/show-branch.c:657
 msgid "show refs unreachable from any other ref"
 msgstr "вывести ссылки, недоступные из любых других ссылок"
 
-#: builtin/show-branch.c:678
+#: builtin/show-branch.c:659
 msgid "show commits in topological order"
 msgstr "вывести коммиты в топологическом порядке"
 
-#: builtin/show-branch.c:681
+#: builtin/show-branch.c:662
 msgid "show only commits not on the first branch"
 msgstr "вывести только коммиты, отсуцтвующие в первой ветке"
 
-#: builtin/show-branch.c:683
+#: builtin/show-branch.c:664
 msgid "show merges reachable from only one tip"
 msgstr "вывести слияния, достижимые только из одной из верхушек"
 
-#: builtin/show-branch.c:685
+#: builtin/show-branch.c:666
 msgid "topologically sort, maintaining date order where possible"
 msgstr "топологическая сортировка, с сохранением порядка дат, если возможно"
 
-#: builtin/show-branch.c:688
+#: builtin/show-branch.c:669
 msgid "<n>[,<base>]"
 msgstr "<n>[,<база>]"
 
-#: builtin/show-branch.c:689
+#: builtin/show-branch.c:670
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "показать <n> последних записей в журнале ссылок, начиная с базы"
 
@@ -9853,41 +9934,132 @@
 msgstr "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<шаблон>…]"
 
 #: builtin/show-ref.c:11
-msgid "git show-ref --exclude-existing[=<pattern>] < <ref-list>"
-msgstr "git show-ref --exclude-existing[=<шаблон>] < <список-ссылок>"
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr "git show-ref --exclude-existing[=<шаблон>]"
 
-#: builtin/show-ref.c:170
+#: builtin/show-ref.c:165
 msgid "only show tags (can be combined with heads)"
 msgstr "вывести только метки (можно использовать одновременно с --heads)"
 
-#: builtin/show-ref.c:171
+#: builtin/show-ref.c:166
 msgid "only show heads (can be combined with tags)"
 msgstr "вывести только головы (можно использовать одновременно с --tags)"
 
-#: builtin/show-ref.c:172
+#: builtin/show-ref.c:167
 msgid "stricter reference checking, requires exact ref path"
 msgstr "более строгая проверка ссылок, требует точный путь ссылки"
 
-#: builtin/show-ref.c:175 builtin/show-ref.c:177
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "вывести ссылку HEAD, даже если она будет отфильтрована"
 
-#: builtin/show-ref.c:179
+#: builtin/show-ref.c:174
 msgid "dereference tags into object IDs"
 msgstr "разыменовать метки в идентификаторы объектов"
 
-#: builtin/show-ref.c:181
+#: builtin/show-ref.c:176
 msgid "only show SHA1 hash using <n> digits"
 msgstr "использовать <n> цифр для вывода SHA-1"
 
-#: builtin/show-ref.c:185
+#: builtin/show-ref.c:180
 msgid "do not print results to stdout (useful with --verify)"
 msgstr "не печатать результат на стандартный вывод (полезно с опцией «--verify»)"
 
-#: builtin/show-ref.c:187
+#: builtin/show-ref.c:182
 msgid "show refs from stdin that aren't in local repository"
 msgstr "вывести ссылки со стандартного ввода, которых нет в локальном репозитории"
 
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr "git stripspace [-s | --strip-comments]"
+
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr "git stripspace [-c | --comment-lines]"
+
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr "пропустить и удалить все строки, начинающиеся с символа комметария"
+
+#: builtin/stripspace.c:38
+msgid "prepend comment character and blank to each line"
+msgstr "добавить спереди все строк символ комментария и пробел"
+
+#: builtin/submodule--helper.c:79 builtin/submodule--helper.c:167
+msgid "alternative anchor for relative paths"
+msgstr "альтернативный символ для относительных путей"
+
+#: builtin/submodule--helper.c:84
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper list [--prefix=<путь>] [<путь>…]"
+
+#: builtin/submodule--helper.c:114
+msgid "git submodule--helper name <path>"
+msgstr "git submodule--helper name <путь>"
+
+#: builtin/submodule--helper.c:120
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr "не найдено соответствие подмодулей в .gitmodules для пути «%s»"
+
+#: builtin/submodule--helper.c:170
+msgid "where the new submodule will be cloned to"
+msgstr "куда должен быть склонирован новый подмодуль"
+
+#: builtin/submodule--helper.c:173
+msgid "name of the new submodule"
+msgstr "имя нового подмодуля"
+
+#: builtin/submodule--helper.c:176
+msgid "url where to clone the submodule from"
+msgstr "url откуда должен был склонирован новый подмодуль"
+
+#: builtin/submodule--helper.c:182
+msgid "depth for shallow clones"
+msgstr "глубина для частичного клона"
+
+#: builtin/submodule--helper.c:188
+msgid ""
+"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
+"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] "
+"[<path>...]"
+msgstr "git submodule--helper clone [--prefix=<путь>] [--quiet] [--reference <репозиторий>] [--name <имя>] [--url <url>][--depth <глубина>] [--] [<путь>…]"
+
+#: builtin/submodule--helper.c:202 builtin/submodule--helper.c:208
+#: builtin/submodule--helper.c:216
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "не удалось создать каталог «%s»"
+
+#: builtin/submodule--helper.c:204
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr "не удалось клонировать «%s» в подмодуль по пути «%s»"
+
+#: builtin/submodule--helper.c:227
+#, c-format
+msgid "cannot open file '%s'"
+msgstr "не удалось открыть файл «%s»"
+
+#: builtin/submodule--helper.c:232
+#, c-format
+msgid "could not close file %s"
+msgstr "не удалось закрыть файл %s"
+
+#: builtin/submodule--helper.c:247
+#, c-format
+msgid "could not get submodule directory for '%s'"
+msgstr "не удалось получить каталог для подмодуля «%s»"
+
+#: builtin/submodule--helper.c:273
+msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+msgstr "критическая ошибка: подкоманда submodule--helper должна вызываться с указанием подкоманды"
+
+#: builtin/submodule--helper.c:280
+#, c-format
+msgid "fatal: '%s' is not a valid submodule--helper subcommand"
+msgstr "критическая ошибка: «%s» не является подкомандой submodule--helper"
+
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
 msgstr "git symbolic-ref [<опции>] <имя> [<ссылка>]"
@@ -9916,52 +10088,47 @@
 msgid "reason of the update"
 msgstr "причина обновления"
 
-#: builtin/tag.c:22
+#: builtin/tag.c:23
 msgid ""
 "git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
 "[<head>]"
 msgstr "git tag [-a | -s | -u <идентификатор-ключа>] [-f] [-m <сообщение> | -F <файл>] <имя-метки> [<редакция>]"
 
-#: builtin/tag.c:23
+#: builtin/tag.c:24
 msgid "git tag -d <tagname>..."
 msgstr "git tag -d <имя-метки>…"
 
-#: builtin/tag.c:24
+#: builtin/tag.c:25
 msgid ""
 "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
-"\t\t[<pattern>...]"
-msgstr "git tag -l [-n[<количество>]] [--contains <коммит>] [--points-at <объект>]\n\t\t[<шаблон>…]"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
+msgstr "git tag -l [-n[<количество>]] [--contains <коммит>] [--points-at <объект>]\n\t\t[--format=<формат>] [--[no-]merged [<коммит>]] [<шаблон>…]"
 
-#: builtin/tag.c:26
+#: builtin/tag.c:27
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <имя-метки>…"
 
-#: builtin/tag.c:69
-#, c-format
-msgid "malformed object at '%s'"
-msgstr "Поврежденный объект «%s»"
-
-#: builtin/tag.c:301
+#: builtin/tag.c:80
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "слишком длинное имя метки: %.*s…"
 
-#: builtin/tag.c:306
+#: builtin/tag.c:85
 #, c-format
 msgid "tag '%s' not found."
 msgstr "метка  «%s» не найдена."
 
-#: builtin/tag.c:321
+#: builtin/tag.c:100
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Метка «%s» удалена (была %s)\n"
 
-#: builtin/tag.c:333
+#: builtin/tag.c:112
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "не удалось проверить метку «%s»"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:122
 #, c-format
 msgid ""
 "\n"
@@ -9970,7 +10137,7 @@
 "Lines starting with '%c' will be ignored.\n"
 msgstr "\nВведите сообщение для метки:\n  %s\nСтроки, начинающиеся с «%c» будут проигнорированы.\n"
 
-#: builtin/tag.c:347
+#: builtin/tag.c:126
 #, c-format
 msgid ""
 "\n"
@@ -9979,153 +10146,138 @@
 "Lines starting with '%c' will be kept; you may remove them yourself if you want to.\n"
 msgstr "\nВведите сообщение для метки:\n  %s\nСтроки, начинающиеся с «%c» будут оставлены; вы можете удалить их вручную, если хотите.\n"
 
-#: builtin/tag.c:371
-#, c-format
-msgid "unsupported sort specification '%s'"
-msgstr "неподдерживаемый способ сортировки «%s»"
-
-#: builtin/tag.c:373
-#, c-format
-msgid "unsupported sort specification '%s' in variable '%s'"
-msgstr "неподдерживаемый способ сортировки «%s» в переменной «%s»"
-
-#: builtin/tag.c:428
+#: builtin/tag.c:199
 msgid "unable to sign the tag"
 msgstr "не удалось подписать метку"
 
-#: builtin/tag.c:430
+#: builtin/tag.c:201
 msgid "unable to write tag file"
 msgstr "не удалось записать файл метки"
 
-#: builtin/tag.c:455
+#: builtin/tag.c:226
 msgid "bad object type."
 msgstr "неправильный тип объекта"
 
-#: builtin/tag.c:468
+#: builtin/tag.c:239
 msgid "tag header too big."
 msgstr "заголовок метки слишком большой."
 
-#: builtin/tag.c:504
+#: builtin/tag.c:275
 msgid "no tag message?"
 msgstr "нет описания метки?"
 
-#: builtin/tag.c:510
+#: builtin/tag.c:281
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Сообщение метки было оставлено в %s\n"
 
-#: builtin/tag.c:559
-msgid "switch 'points-at' requires an object"
-msgstr "при указании параметра «points-at» требуется указать объект"
-
-#: builtin/tag.c:561
-#, c-format
-msgid "malformed object name '%s'"
-msgstr "Поврежденное имя объекта «%s»"
-
-#: builtin/tag.c:590
+#: builtin/tag.c:339
 msgid "list tag names"
 msgstr "список названий меток"
 
-#: builtin/tag.c:592
+#: builtin/tag.c:341
 msgid "print <n> lines of each tag message"
 msgstr "печатать <n> строк описания от каждой метки"
 
-#: builtin/tag.c:594
+#: builtin/tag.c:343
 msgid "delete tags"
 msgstr "удалить метки"
 
-#: builtin/tag.c:595
+#: builtin/tag.c:344
 msgid "verify tags"
 msgstr "проверить метки"
 
-#: builtin/tag.c:597
+#: builtin/tag.c:346
 msgid "Tag creation options"
 msgstr "Настройки создания метки"
 
-#: builtin/tag.c:599
+#: builtin/tag.c:348
 msgid "annotated tag, needs a message"
 msgstr "для аннотированной метки нужно сообщение"
 
-#: builtin/tag.c:601
+#: builtin/tag.c:350
 msgid "tag message"
 msgstr "описание метки"
 
-#: builtin/tag.c:603
+#: builtin/tag.c:352
 msgid "annotated and GPG-signed tag"
 msgstr "аннотированная и подписанная с помощью GPG метка"
 
-#: builtin/tag.c:607
+#: builtin/tag.c:356
 msgid "use another key to sign the tag"
 msgstr "использовать другой ключ для подписания метки"
 
-#: builtin/tag.c:608
+#: builtin/tag.c:357
 msgid "replace the tag if exists"
 msgstr "замена метки, если она существует"
 
-#: builtin/tag.c:609 builtin/update-ref.c:368
+#: builtin/tag.c:358 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "создать журнал ссылок"
 
-#: builtin/tag.c:611
+#: builtin/tag.c:360
 msgid "Tag listing options"
 msgstr "Настройки вывода списка меток"
 
-#: builtin/tag.c:612
+#: builtin/tag.c:361
 msgid "show tag list in columns"
 msgstr "показать список меток по столбцам"
 
-#: builtin/tag.c:614
-msgid "sort tags"
-msgstr "отсортировать метки"
-
-#: builtin/tag.c:619 builtin/tag.c:625
+#: builtin/tag.c:362 builtin/tag.c:363
 msgid "print only tags that contain the commit"
 msgstr "вывод только меток, которые содержат коммит"
 
-#: builtin/tag.c:631
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
+msgstr "вывод только слитых меток"
+
+#: builtin/tag.c:365
+msgid "print only tags that are not merged"
+msgstr "вывод только не слитых меток"
+
+#: builtin/tag.c:370
 msgid "print only tags of the object"
 msgstr "вывод только меток, определенного объекта"
 
-#: builtin/tag.c:657
+#: builtin/tag.c:399
 msgid "--column and -n are incompatible"
 msgstr "--column и -n нельзя использовать одновременно"
 
-#: builtin/tag.c:669
-msgid "--sort and -n are incompatible"
-msgstr "--sort и -n нельзя использовать одновременно"
-
-#: builtin/tag.c:676
+#: builtin/tag.c:419
 msgid "-n option is only allowed with -l."
 msgstr "опцию -n можно использовать только вместе с -l."
 
-#: builtin/tag.c:678
+#: builtin/tag.c:421
 msgid "--contains option is only allowed with -l."
 msgstr "опцию --contains можно использовать только вместе с -l."
 
-#: builtin/tag.c:680
+#: builtin/tag.c:423
 msgid "--points-at option is only allowed with -l."
 msgstr "опцию --points-at можно использовать только вместе с -l."
 
-#: builtin/tag.c:688
+#: builtin/tag.c:425
+msgid "--merged and --no-merged option are only allowed with -l"
+msgstr "опции --merged и --no-merged можно использовать только вместе с -l."
+
+#: builtin/tag.c:433
 msgid "only one -F or -m option is allowed."
 msgstr "-F и -m нельзя использовать одновременно."
 
-#: builtin/tag.c:708
+#: builtin/tag.c:453
 msgid "too many params"
 msgstr "передано слишком много параметров"
 
-#: builtin/tag.c:714
+#: builtin/tag.c:459
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "«%s» не является допустимым именем метки."
 
-#: builtin/tag.c:719
+#: builtin/tag.c:464
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "метка «%s» уже существует"
 
-#: builtin/tag.c:744
+#: builtin/tag.c:489
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Метка «%s» обновлена (была %s)\n"
@@ -10246,7 +10398,7 @@
 
 #: builtin/update-index.c:951
 msgid "mark files as \"not changing\""
-msgstr "пометить файлы как \"не измененные\""
+msgstr "пометить файлы как «не измененные»"
 
 #: builtin/update-index.c:954
 msgid "clear assumed-unchanged bit"
@@ -10254,7 +10406,7 @@
 
 #: builtin/update-index.c:957
 msgid "mark files as \"index-only\""
-msgstr "пометить файлы как \"только в индексе\""
+msgstr "пометить файлы как «только в индексе»"
 
 #: builtin/update-index.c:960
 msgid "clear skip-worktree bit"
@@ -10384,76 +10536,80 @@
 msgid "print tag contents"
 msgstr "вывести содержимое метки"
 
-#: builtin/worktree.c:13
-msgid "git worktree add [<options>] <path> <branch>"
-msgstr "git worktree add [<опции>] <путь> <ветка>"
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr "git worktree add [<опции>] <путь> [<ветка>]"
 
-#: builtin/worktree.c:14
+#: builtin/worktree.c:16
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<опции>]"
 
-#: builtin/worktree.c:36
+#: builtin/worktree.c:17
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<опции>]"
+
+#: builtin/worktree.c:39
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Удаление рабочих каталогов/%s: не является каталогом"
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:45
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Удаление рабочих каталогов/%s: файл gitdir не существует"
 
-#: builtin/worktree.c:47
+#: builtin/worktree.c:50
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "Удаление рабочих каталогов/%s: не удалось прочитать файл gitdir (%s)"
 
-#: builtin/worktree.c:58
+#: builtin/worktree.c:61
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Удаление рабочих каталогов/%s: недействительный файл gitdir"
 
-#: builtin/worktree.c:74
+#: builtin/worktree.c:77
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "Удаление рабочих каталогов/%s: gitdir указывает на несуществующее расположение"
 
-#: builtin/worktree.c:109
+#: builtin/worktree.c:112
 #, c-format
 msgid "failed to remove: %s"
 msgstr "не удалось удалить: %s"
 
-#: builtin/worktree.c:198
+#: builtin/worktree.c:201
 #, c-format
 msgid "'%s' already exists"
 msgstr "«%s» уже существует"
 
-#: builtin/worktree.c:232
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "не удалось создать каталог «%s»"
 
-#: builtin/worktree.c:268
+#: builtin/worktree.c:271
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Подготовка %s (идентификатор %s)"
 
-#: builtin/worktree.c:316
+#: builtin/worktree.c:319
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr "перейти на <ветка> даже если она уже активна в другом рабочесм каталоге"
 
-#: builtin/worktree.c:318
+#: builtin/worktree.c:321
 msgid "create a new branch"
 msgstr "создать новую ветку"
 
-#: builtin/worktree.c:320
+#: builtin/worktree.c:323
 msgid "create or reset a branch"
 msgstr "создать или перейти на ветку"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:324
 msgid "detach HEAD at named commit"
 msgstr "отсоединить HEAD на указанном коммите"
 
-#: builtin/worktree.c:328
+#: builtin/worktree.c:331
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B и --detach нельзя использовать одновременно"
 
@@ -10596,86 +10752,86 @@
 msgid "no-op (backward compatibility)"
 msgstr "ничего не делает (оставлено для обратной совместимости)"
 
-#: parse-options.h:236
+#: parse-options.h:237
 msgid "be more verbose"
 msgstr "быть многословнее"
 
-#: parse-options.h:238
+#: parse-options.h:239
 msgid "be more quiet"
 msgstr "тихий режим"
 
-#: parse-options.h:244
+#: parse-options.h:245
 msgid "use <n> digits to display SHA-1s"
 msgstr "использовать <n> цифр для вывода SHA-1"
 
-#: rerere.h:28
+#: rerere.h:38
 msgid "update the index with reused conflict resolution if possible"
 msgstr "обновить индекс с помощью переиспользования разрешения конфликта, если возможно"
 
-#: git-bisect.sh:50
+#: git-bisect.sh:55
 msgid "You need to start by \"git bisect start\""
 msgstr "Вам нужно начать с помощью «git bisect start»"
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:56
+#: git-bisect.sh:61
 msgid "Do you want me to do it for you [Y/n]? "
 msgstr "Вы уверены, что хотите, чтобы я сделал это [Y - да/n - нет]? "
 
-#: git-bisect.sh:99
+#: git-bisect.sh:122
 #, sh-format
 msgid "unrecognised option: '$arg'"
 msgstr "неопознанная опция: «$arg»"
 
-#: git-bisect.sh:103
+#: git-bisect.sh:126
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr "«$arg» не похоже на действительную редакцию"
 
-#: git-bisect.sh:132
+#: git-bisect.sh:155
 msgid "Bad HEAD - I need a HEAD"
 msgstr "Плохой указатель HEAD — Необходим указатель HEAD"
 
-#: git-bisect.sh:145
+#: git-bisect.sh:168
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
 msgstr "Сбой перехода на «$start_head». Попробуйте выполнить «git bisect reset <существующая-ветка>»."
 
-#: git-bisect.sh:155
+#: git-bisect.sh:178
 msgid "won't bisect on cg-seek'ed tree"
 msgstr "нельзя выполнить двоичный поиск на дереве после cg-seek"
 
-#: git-bisect.sh:159
+#: git-bisect.sh:182
 msgid "Bad HEAD - strange symbolic ref"
 msgstr "Плохой указатель HEAD — странная символьная ссылка"
 
-#: git-bisect.sh:211
+#: git-bisect.sh:234
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr "Плохой аргумент bisect_write: $state"
 
-#: git-bisect.sh:240
+#: git-bisect.sh:263
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr "Плохой ввод номера редакции: $arg"
 
-#: git-bisect.sh:255
+#: git-bisect.sh:278
 msgid "Please call 'bisect_state' with at least one argument."
 msgstr "Пожалуйста, вызывайте «bisect_state» как минимум с одним аргументом."
 
-#: git-bisect.sh:267
+#: git-bisect.sh:290
 #, sh-format
 msgid "Bad rev input: $rev"
 msgstr "Плохой ввод номера редакции: $rev"
 
-#: git-bisect.sh:276
+#: git-bisect.sh:299
 #, sh-format
 msgid "'git bisect $TERM_BAD' can take only one argument."
 msgstr "«git bisect $TERM_BAD» может принимать только один аргумент."
 
-#: git-bisect.sh:299
+#: git-bisect.sh:322
 #, sh-format
 msgid "Warning: bisecting only with a $TERM_BAD commit."
 msgstr "Предупреждение: попытка двоичного поиска с указанием только $TERM_BAD коммита."
@@ -10683,18 +10839,18 @@
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:305
+#: git-bisect.sh:328
 msgid "Are you sure [Y/n]? "
 msgstr "Вы уверены [Y - да/n - нет]? "
 
-#: git-bisect.sh:317
+#: git-bisect.sh:340
 #, sh-format
 msgid ""
 "You need to give me at least one $bad_syn and one $good_syn revision.\n"
 "(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
 msgstr "Вам нужно передать мне как минимум одну $bad_syn и одну $good_syn редакцию.\n(Для этого вы можете использовать команды «git bisect $bad_syn» и «git bisect $good_syn».)"
 
-#: git-bisect.sh:320
+#: git-bisect.sh:343
 #, sh-format
 msgid ""
 "You need to start by \"git bisect start\".\n"
@@ -10702,67 +10858,97 @@
 "(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
 msgstr "Для начала нужно запустить «git bisect start».\nПосле этого, вам нужно передать мне как минимум одну $good_syn и одну $bad_syn редакцию.\n(Для этого вы можете использовать команды «git bisect $good_syn» и «git bisect $good_syn».)"
 
-#: git-bisect.sh:391 git-bisect.sh:521
+#: git-bisect.sh:414 git-bisect.sh:546
 msgid "We are not bisecting."
 msgstr "Вы сейчас не в процессе бинарного поиска."
 
-#: git-bisect.sh:398
+#: git-bisect.sh:421
 #, sh-format
 msgid "'$invalid' is not a valid commit"
 msgstr "«$invalid» не является действительным коммитом"
 
-#: git-bisect.sh:407
+#: git-bisect.sh:430
 #, sh-format
 msgid ""
 "Could not check out original HEAD '$branch'.\n"
 "Try 'git bisect reset <commit>'."
 msgstr "Не удалось перейти на оригинальную ветку HEAD «$branch».\nПопробуйте запустить «git bisect reset <коммит>»."
 
-#: git-bisect.sh:435
+#: git-bisect.sh:458
 msgid "No logfile given"
 msgstr "Не передан файл журнала"
 
-#: git-bisect.sh:436
+#: git-bisect.sh:459
 #, sh-format
 msgid "cannot read $file for replaying"
 msgstr "не удалось прочитать $file для повтора изменений"
 
-#: git-bisect.sh:455
+#: git-bisect.sh:480
 msgid "?? what are you talking about?"
 msgstr "?? вы о чем?"
 
-#: git-bisect.sh:467
+#: git-bisect.sh:492
 #, sh-format
 msgid "running $command"
 msgstr "запускаю $command"
 
-#: git-bisect.sh:474
+#: git-bisect.sh:499
 #, sh-format
 msgid ""
 "bisect run failed:\n"
 "exit code $res from '$command' is < 0 or >= 128"
 msgstr "не удалось выполнить двоичный поиск:\nкод завершения $res от «$command» оказался < 0 или >= 128"
 
-#: git-bisect.sh:500
+#: git-bisect.sh:525
 msgid "bisect run cannot continue any more"
 msgstr "bisect run больше не может продолжать"
 
-#: git-bisect.sh:506
+#: git-bisect.sh:531
 #, sh-format
 msgid ""
 "bisect run failed:\n"
 "'bisect_state $state' exited with error code $res"
 msgstr "не удалось выполнить двоичный поиск:\n«bisect_state $state» завершился с кодом ошибки $res"
 
-#: git-bisect.sh:513
+#: git-bisect.sh:538
 msgid "bisect run success"
 msgstr "bisect run выполнен успешно"
 
-#: git-bisect.sh:548
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr "используйте два разных определения"
+
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr "«$term» не является допустимым определением"
+
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr "нельзя использовать встроенную команду «$term» как определение"
+
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr "нельзя изменить значение определения «$term»"
+
+#: git-bisect.sh:606
 #, sh-format
 msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
 msgstr "Недопустимая команда: вы сейчас находитесь на $TERM_BAD/$TERM_GOOD двоичном поиске."
 
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "определения не заданы"
+
+#: git-bisect.sh:653
+#, sh-format
+msgid ""
+"invalid argument $arg for 'git bisect terms'.\n"
+"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+msgstr "недопустимый аргумент $arg для «git bisect terms».\nПоддерживаемые параметры: --term-good|--term-old и --term-bad|--term-new."
+
 #: git-rebase.sh:57
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
@@ -10794,34 +10980,34 @@
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "Похоже, git-am выполняется. Перемещение невозможно."
 
-#: git-rebase.sh:351
+#: git-rebase.sh:354
 msgid "The --exec option must be used with the --interactive option"
 msgstr "Опция --exec должна использоваться вместе с опцией --interactive"
 
-#: git-rebase.sh:356
+#: git-rebase.sh:359
 msgid "No rebase in progress?"
 msgstr "Нет перемещения в процессе?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:370
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "Действие --edit-todo может использоваться только при интерактивном перемещении."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:377
 msgid "Cannot read HEAD"
 msgstr "Не удалось прочитать HEAD"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:380
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
 msgstr "Вы должны отредактировать все\nконфликты слияния, а потом пометить\nих как разрешенные с помощью git add"
 
-#: git-rebase.sh:395
+#: git-rebase.sh:398
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Не удалось перейти назад на $head_name"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:417
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -10834,64 +11020,64 @@
 "valuable there."
 msgstr "Похоже, каталог $state_dir_base уже существует и я предполагаю, что вы в процессе другого перемещения.  Если это так, попробуйте\n\t$cmd_live_rebase\nЕсли нет\n\t$cmd_clear_stale_rebase\nи запустите меня снова.  Я останавливаюсь, чтобы вы не потеряли что-то важное."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:468
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "недействительная вышестоящая ветка $upstream_name"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:492
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: имеется больше одной базы слияния"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:495 git-rebase.sh:499
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: нет базы слияния"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:504
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Не указаывает на действительный коммит: $onto_name"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:527
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "критическая ошибка: нет такой ветки: $branch_name"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:560
 msgid "Cannot autostash"
 msgstr "Не удалось выполнить автоматическое прятанье"
 
-#: git-rebase.sh:562
+#: git-rebase.sh:565
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Изменения автоматически спрятаны: $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:569
 msgid "Please commit or stash them."
 msgstr "Сделайте коммит или спрячьте их."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:589
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Текущая ветка $branch_name уже свежая."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:593
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "Текущая ветка $branch_name уже свежая, принудительное перемещение."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:604
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Изменения от $mb до $onto:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:613
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr "Сначала перематываем указатель текущего коммита, чтобы применить ваши изменения поверх него…"
 
-#: git-rebase.sh:620
+#: git-rebase.sh:623
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "Перемотана вперед $branch_name до $onto_name."
@@ -10961,112 +11147,97 @@
 msgid "Cannot remove worktree changes"
 msgstr "Не удалось удалить изменения рабочего каталога"
 
-#: git-stash.sh:387
+#: git-stash.sh:405
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "неизвестная опция: $opt"
 
-#: git-stash.sh:397
+#: git-stash.sh:415
 msgid "No stash found."
 msgstr "Не найдены спрятанные изменения."
 
-#: git-stash.sh:404
+#: git-stash.sh:422
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Передано слишком много редакций: $REV"
 
-#: git-stash.sh:410
+#: git-stash.sh:428
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference не является действительной ссылкой"
 
-#: git-stash.sh:438
+#: git-stash.sh:456
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "«$args» не похоже на коммит со спрятанными изменениями"
 
-#: git-stash.sh:449
+#: git-stash.sh:467
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "«$args» не является ссылкой на спрятанные изменения"
 
-#: git-stash.sh:457
+#: git-stash.sh:475
 msgid "unable to refresh index"
 msgstr "не удалось обновить индекс"
 
-#: git-stash.sh:461
+#: git-stash.sh:479
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Нельзя применить спрятанные изменения во время выполнения слияния"
 
-#: git-stash.sh:469
+#: git-stash.sh:487
 msgid "Conflicts in index. Try without --index."
 msgstr "Конфликты в индексе. Попробуйте без --index."
 
-#: git-stash.sh:471
+#: git-stash.sh:489
 msgid "Could not save index tree"
 msgstr "Не удалось сохранить дерево индекса"
 
-#: git-stash.sh:505
+#: git-stash.sh:523
 msgid "Cannot unstage modified files"
 msgstr "Невозможно убрать из индекса измененные файлы"
 
-#: git-stash.sh:520
+#: git-stash.sh:538
 msgid "Index was not unstashed."
 msgstr "Индекс не был достат из спрятанных изменений."
 
-#: git-stash.sh:543
+#: git-stash.sh:561
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Отброшено ${REV} ($s)"
 
-#: git-stash.sh:544
+#: git-stash.sh:562
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Не удалось отбросить запись из спрятанных изменений"
 
-#: git-stash.sh:552
+#: git-stash.sh:570
 msgid "No branch name specified"
 msgstr "Не указано имя ветки"
 
-#: git-stash.sh:624
+#: git-stash.sh:642
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Чтобы восстановить их, наберите «git stash apply»)"
 
-#: git-submodule.sh:95
+#: git-submodule.sh:104
 #, sh-format
 msgid "cannot strip one component off url '$remoteurl'"
 msgstr "не удалось отрезать один компонент адреса «$remoteurl»"
 
-#: git-submodule.sh:237
-#, sh-format
-msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
-msgstr "Не найдено соответствие подмодулей в .gitmodules для пути «$sm_path»"
-
-#: git-submodule.sh:287
-#, sh-format
-msgid "Clone of '$url' into submodule path '$sm_path' failed"
-msgstr "Не удалось клонировать «$url» в подмодуль по пути «$sm_path»"
-
-#: git-submodule.sh:296
-#, sh-format
-msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-msgstr "Каталог Git «$a» является частью пути подмодуля «$b» или наоборот"
-
-#: git-submodule.sh:406
+#: git-submodule.sh:281
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr "Относительный путь можно использовать только находясь на вершине рабочего каталога"
 
-#: git-submodule.sh:416
+#: git-submodule.sh:291
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "URL репозитория: «$repo» должен быть абсолютным или начинаться с ./|../"
 
-#: git-submodule.sh:433
+#: git-submodule.sh:308
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "«$sm_path» уже содержится в индексе"
 
-#: git-submodule.sh:437
+#: git-submodule.sh:312
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -11074,235 +11245,235 @@
 "Use -f if you really want to add it."
 msgstr "Следующие пути игнорируются одним из ваших файлов .gitignore:\n$sm_path\nИспользуйте опцию -f, если вы действительно хотите его добавить."
 
-#: git-submodule.sh:455
+#: git-submodule.sh:330
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Добавляю существующий репозиторий из «$sm_path» в индекс"
 
-#: git-submodule.sh:457
+#: git-submodule.sh:332
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "«$sm_path» уже существует и не является действительным репозиторием git"
 
-#: git-submodule.sh:465
+#: git-submodule.sh:340
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr "Каталог git для «$sm_name» найден локально на внешних репозиториях:"
 
-#: git-submodule.sh:467
+#: git-submodule.sh:342
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
 msgstr "Если вы хотите переиспользовать локальный каталог git вместо повторного клонирования из"
 
-#: git-submodule.sh:469
+#: git-submodule.sh:344
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
 msgstr ", то используйте опцию «--force». Если локальный каталог git не является действительным репозиторием"
 
-#: git-submodule.sh:470
+#: git-submodule.sh:345
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
 "option."
 msgstr "или если вы не поняли, что это значит, то просто используйте другое имя с помощью опции «--name»."
 
-#: git-submodule.sh:472
+#: git-submodule.sh:347
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Восстановление локального каталога git для подмодуля «$sm_name»."
 
-#: git-submodule.sh:484
+#: git-submodule.sh:359
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Не удалось перейти на состояние у подмодуля «$sm_path»"
 
-#: git-submodule.sh:489
+#: git-submodule.sh:364
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Сбой добавления подмодуля «$sm_path»"
 
-#: git-submodule.sh:498
+#: git-submodule.sh:373
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Не удалось зарегистрировать подмодуль «$sm_path»"
 
-#: git-submodule.sh:542
+#: git-submodule.sh:417
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Заходим в «$prefix$displaypath»"
 
-#: git-submodule.sh:562
+#: git-submodule.sh:437
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr "Останавливаемся на «$prefix$displaypath»; сценарий вернул не нулевой код возврата."
 
-#: git-submodule.sh:608
+#: git-submodule.sh:483
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr "Адрес для пути подмодуля «$displaypath» не найден в .gitmodules"
 
-#: git-submodule.sh:617
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr "Сбой регистрации адресе для пути подмодуля «$displaypath»"
 
-#: git-submodule.sh:619
+#: git-submodule.sh:494
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr "Подмодуль «$name» ($url) зарегистрирован для пути «$displaypath»"
 
-#: git-submodule.sh:636
+#: git-submodule.sh:511
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr "Сбой регистрации режима обновления для пути подмодуля «$displaypath»"
 
-#: git-submodule.sh:674
+#: git-submodule.sh:549
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr "Используйте «.», если вы действительно хотите деинициализировать все подмодули"
 
-#: git-submodule.sh:691
+#: git-submodule.sh:566
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr "Рабочий каталог подмодуля «$displaypath» содержит каталог .git"
 
-#: git-submodule.sh:692
+#: git-submodule.sh:567
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr "(используйте «rm -rf», если вы действительно хотите удалить его, включая всю его историю)"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:573
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to"
 " discard them"
 msgstr "Рабочий каталог подмодуля «$displaypath» содержит локальные изменения; используйте «-f», чтобы отменить их"
 
-#: git-submodule.sh:701
+#: git-submodule.sh:576
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Очищен каталог «$displaypath»"
 
-#: git-submodule.sh:702
+#: git-submodule.sh:577
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "Не удалось удалить рабочий каталог подмодуля «$displaypath»"
 
-#: git-submodule.sh:705
+#: git-submodule.sh:580
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "Не удалось создать пустой каталог подмодуля «$displaypath»"
 
-#: git-submodule.sh:714
+#: git-submodule.sh:589
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "Подмодуль «$name» ($url) был снят с регистрации по пути «$displaypath»"
 
-#: git-submodule.sh:830
+#: git-submodule.sh:705
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
 "Maybe you want to use 'update --init'?"
 msgstr "Подмодуль по пути «$displaypath» не инициализирован\nВозможно, вам нужно использовать «update --init»?"
 
-#: git-submodule.sh:843
+#: git-submodule.sh:718
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "Не удалось найти текущую редакцию для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:852
+#: git-submodule.sh:727
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Не удалось выполнить извлечение для подмодуля по пути «$sm_path»"
 
-#: git-submodule.sh:876
+#: git-submodule.sh:751
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Не удалось выполнить извлечение для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:765
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Не удалось выполнить переход на состояние «$sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:891
+#: git-submodule.sh:766
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Подмодуль по пути «$displaypath»: забрано состояние «$sha1»"
 
-#: git-submodule.sh:895
+#: git-submodule.sh:770
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "Не удалось переместить «$sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:896
+#: git-submodule.sh:771
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Подмодуль по пути «$displaypath»: перемещен над «$sha1»"
 
-#: git-submodule.sh:901
+#: git-submodule.sh:776
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "Не удалось выполнить слияние с «$sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:902
+#: git-submodule.sh:777
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Подмодуль по пути «$displaypath»: слито с «$sha1»"
 
-#: git-submodule.sh:907
+#: git-submodule.sh:782
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
 msgstr "Сбой выполнения «$command $sha1» для подмодуля по пути «$prefix$sm_path»"
 
-#: git-submodule.sh:908
+#: git-submodule.sh:783
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "Подмодуль по пути «$prefix$sm_path»: «$command $sha1»"
 
-#: git-submodule.sh:938
+#: git-submodule.sh:813
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Не удалось выполнить рекурсивно для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:1046
+#: git-submodule.sh:921
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Опцию --cached нельзя использовать одновременно с опцией --files"
 
-#: git-submodule.sh:1098
+#: git-submodule.sh:973
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "неизвестный режим $mod_dst"
 
-#: git-submodule.sh:1118
+#: git-submodule.sh:993
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Предупреждение: $display_name не содержит коммит $sha1_src"
 
-#: git-submodule.sh:1121
+#: git-submodule.sh:996
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Предупреждение: $display_name не содержит коммит $sha1_dst"
 
-#: git-submodule.sh:1124
+#: git-submodule.sh:999
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr "  Предупреждение: $display_name не содержит коммиты $sha1_src и $sha1_dst"
 
-#: git-submodule.sh:1149
+#: git-submodule.sh:1024
 msgid "blob"
 msgstr "двоичный объект"
 
-#: git-submodule.sh:1267
+#: git-submodule.sh:1142
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Не удалось выполнить рекурсивно для подмодуля по пути «$sm_path»"
 
-#: git-submodule.sh:1331
+#: git-submodule.sh:1206
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Синхронизация url для подмодуля «$displaypath»"
diff --git a/po/sv.po b/po/sv.po
index 587d296..940c5c5 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,8 +7,8 @@
 msgstr ""
 "Project-Id-Version: git 2.6.0\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2015-09-05 09:16+0800\n"
-"PO-Revision-Date: 2015-09-09 21:45+0100\n"
+"POT-Creation-Date: 2015-12-22 22:50+0800\n"
+"PO-Revision-Date: 2015-12-26 12:25+0100\n"
 "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 "Language: sv\n"
@@ -31,13 +31,13 @@
 "Rätta dem i din arbetskatalog och använd sedan \"git add/rm <fil>\"\n"
 "som lämpligt för att ange lösning och checka in."
 
-#: advice.c:101 builtin/merge.c:1227
+#: advice.c:101 builtin/merge.c:1225
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Du har inte avslutat sammanslagningen (MERGE_HEAD finns)."
 
 #: advice.c:103
-msgid "Please, commit your changes before you can merge."
-msgstr "Ange ett incheckningsmeddelande för dina ändringar."
+msgid "Please, commit your changes before merging."
+msgstr "Checka in dina ändringar innan du utför sammanslagningen."
 
 #: advice.c:104
 msgid "Exiting because of unfinished merge."
@@ -62,76 +62,76 @@
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <arkiv> [--exec <kmd>] --list"
 
-#: archive.c:343 builtin/add.c:137 builtin/add.c:426 builtin/rm.c:327
+#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "sökvägsangivelsen \"%s\" motsvarade inte några filer"
 
-#: archive.c:428
+#: archive.c:429
 msgid "fmt"
 msgstr "fmt"
 
-#: archive.c:428
+#: archive.c:429
 msgid "archive format"
 msgstr "arkivformat"
 
-#: archive.c:429 builtin/log.c:1229
+#: archive.c:430 builtin/log.c:1229
 msgid "prefix"
 msgstr "prefix"
 
-#: archive.c:430
+#: archive.c:431
 msgid "prepend prefix to each pathname in the archive"
 msgstr "lägg till prefix till varje sökväg i arkivet"
 
-#: archive.c:431 builtin/archive.c:88 builtin/blame.c:2516
-#: builtin/blame.c:2517 builtin/config.c:58 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:712 builtin/hash-object.c:99
+#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535
+#: builtin/blame.c:2536 builtin/config.c:58 builtin/fast-export.c:987
+#: builtin/fast-export.c:989 builtin/grep.c:707 builtin/hash-object.c:99
 #: builtin/ls-files.c:446 builtin/ls-files.c:449 builtin/notes.c:395
 #: builtin/notes.c:558 builtin/read-tree.c:109 parse-options.h:153
 msgid "file"
 msgstr "fil"
 
-#: archive.c:432 builtin/archive.c:89
+#: archive.c:433 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "skriv arkivet till filen"
 
-#: archive.c:434
+#: archive.c:435
 msgid "read .gitattributes in working directory"
 msgstr "läs .gitattributes i arbetskatalogen"
 
-#: archive.c:435
+#: archive.c:436
 msgid "report archived files on stderr"
 msgstr "rapportera arkiverade filer på standard fel"
 
-#: archive.c:436
+#: archive.c:437
 msgid "store only"
 msgstr "endast spara"
 
-#: archive.c:437
+#: archive.c:438
 msgid "compress faster"
 msgstr "komprimera snabbare"
 
-#: archive.c:445
+#: archive.c:446
 msgid "compress better"
 msgstr "komprimera bättre"
 
-#: archive.c:448
+#: archive.c:449
 msgid "list supported archive formats"
 msgstr "visa understödda arkivformat"
 
-#: archive.c:450 builtin/archive.c:90 builtin/clone.c:77
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77
 msgid "repo"
 msgstr "arkiv"
 
-#: archive.c:451 builtin/archive.c:91
+#: archive.c:452 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "hämta arkivet från fjärrarkivet <arkiv>"
 
-#: archive.c:452 builtin/archive.c:92 builtin/notes.c:479
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479
 msgid "command"
 msgstr "kommando"
 
-#: archive.c:453 builtin/archive.c:93
+#: archive.c:454 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "sökväg till kommandot git-upload-archive på fjärren"
 
@@ -143,83 +143,83 @@
 "Negativa mönster ignoreras i git-attribut\n"
 "Använd '\\!' för att inleda med ett utropstecken."
 
-#: branch.c:60
+#: branch.c:61
 #, c-format
 msgid "Not setting branch %s as its own upstream."
 msgstr "Ställer inte in grenen %s som sin egen uppströmsgren."
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
 "Grenen %s ställdes in att spåra fjärrgrenen %s från %s genom ombasering."
 
-#: branch.c:84
+#: branch.c:85
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr "Grenen %s ställdes in att spåra fjärrgrenen %s från %s."
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr "Grenen %s ställdes in att spåra den lokala grenen %s genom ombasering."
 
-#: branch.c:89
+#: branch.c:90
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "Grenen %s ställdes in att spåra den lokala grenen %s."
 
-#: branch.c:94
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr "Grenen %s ställdes in att spåra fjärreferensen %s genom ombasering."
 
-#: branch.c:95
+#: branch.c:96
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "Grenen %s ställdes in att spåra fjärreferensen %s."
 
-#: branch.c:99
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
 "Grenen %s ställdes in att spåra den lokala referensen %s genom ombasering."
 
-#: branch.c:100
+#: branch.c:101
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "Grenen %s ställdes in att spåra den lokala referensen %s."
 
-#: branch.c:133
+#: branch.c:134
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "Spårar inte: tvetydig information för referensen %s"
 
-#: branch.c:162
+#: branch.c:163
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "\"%s\" är inte ett giltigt grennamn."
 
-#: branch.c:167
+#: branch.c:168
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Det finns redan en gren som heter \"%s\""
 
-#: branch.c:175
+#: branch.c:176
 msgid "Cannot force update the current branch."
 msgstr "Kan inte tvinga uppdatering av aktuell gren."
 
-#: branch.c:195
+#: branch.c:196
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr "Kan inte ställa in spårning; startpunkten \"%s\" är inte en gren."
 
-#: branch.c:197
+#: branch.c:198
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "den efterfrågade uppströmsgrenen \"%s\" finns inte"
 
-#: branch.c:199
+#: branch.c:200
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -239,22 +239,22 @@
 "spåra dess fjärrmotsvarighet kan du använda \"git push -u\"\n"
 "för att ställa in uppströmskonfigurationen när du sänder in."
 
-#: branch.c:243
+#: branch.c:244
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Objektnamnet är inte giltigt: \"%s\"."
 
-#: branch.c:263
+#: branch.c:264
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Objektnamnet är tvetydigt: \"%s\"."
 
-#: branch.c:268
+#: branch.c:269
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Avgreningspunkten är inte giltig: \"%s\""
 
-#: branch.c:399
+#: branch.c:322
 #, c-format
 msgid "'%s' is already checked out at '%s'"
 msgstr "\"%s\" är redan utcheckad på \"%s\""
@@ -269,7 +269,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr "okänt huvud: %s%s (%d)"
 
-#: bundle.c:87 builtin/commit.c:765
+#: bundle.c:87 builtin/commit.c:766
 #, c-format
 msgid "could not open '%s'"
 msgstr "kunde inte öppna \"%s\""
@@ -278,9 +278,9 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Arkivet saknar dessa nödvändiga incheckningar:"
 
-#: bundle.c:163 sequencer.c:636 sequencer.c:1083 builtin/blame.c:2708
-#: builtin/branch.c:652 builtin/commit.c:1044 builtin/log.c:334
-#: builtin/log.c:850 builtin/log.c:1457 builtin/log.c:1690 builtin/merge.c:358
+#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083
+#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334
+#: builtin/log.c:849 builtin/log.c:1461 builtin/log.c:1694 builtin/merge.c:358
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "misslyckades skapa revisionstraversering"
@@ -320,7 +320,7 @@
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "referensen \"%s\" exkluderas av argumenten till rev-list"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1367 builtin/shortlog.c:261
+#: bundle.c:443 builtin/log.c:157 builtin/log.c:1369 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "okänt argument: %s"
@@ -338,13 +338,13 @@
 msgid "index-pack died"
 msgstr "index-pack dog"
 
-#: color.c:260
+#: color.c:275
 #, c-format
 msgid "invalid color value: %.*s"
 msgstr "felaktigt färgvärde: %.*s"
 
-#: commit.c:40 builtin/am.c:451 builtin/am.c:487 builtin/am.c:1489
-#: builtin/am.c:2101
+#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520
+#: builtin/am.c:2149
 #, c-format
 msgid "could not parse %s"
 msgstr "kunde inte tolka %s"
@@ -502,22 +502,22 @@
 msgid "Performing inexact rename detection"
 msgstr "Utför onöjaktig namnbytesdetektering"
 
-#: diff.c:116
+#: diff.c:115
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr "  Misslyckades tolka dirstat-avskärningsprocentandel \"%s\"\n"
 
-#: diff.c:121
+#: diff.c:120
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Okänd dirstat-parameter \"%s\"\n"
 
-#: diff.c:216
+#: diff.c:215
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Okänt värde för konfigurationsvariabeln \"diff.submodule\": \"%s\""
 
-#: diff.c:268
+#: diff.c:267
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -526,16 +526,16 @@
 "Hittade fel i konfigurationsvariabeln \"diff.dirstat\":\n"
 "%s"
 
-#: diff.c:2998
+#: diff.c:3000
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "extern diff dog, stannar vid %s"
 
-#: diff.c:3394
+#: diff.c:3396
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow kräver exakt en sökvägsangivelse"
 
-#: diff.c:3557
+#: diff.c:3559
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -544,16 +544,16 @@
 "Misslyckades tolka argument till flaggan --dirstat/-X;\n"
 "%s"
 
-#: diff.c:3571
+#: diff.c:3573
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Misslyckades tolka argument till flaggan --submodule: \"%s\""
 
-#: dir.c:1853
+#: dir.c:1915
 msgid "failed to get kernel name and information"
 msgstr "misslyckades hämta kärnans namn och information"
 
-#: dir.c:1936
+#: dir.c:1998
 msgid "Untracked cache is disabled on this system."
 msgstr "Ospårad cache är inaktiverad på detta system."
 
@@ -662,8 +662,8 @@
 msgid "failed to read the cache"
 msgstr "misslyckades läsa cachen"
 
-#: merge.c:94 builtin/am.c:1974 builtin/am.c:2009 builtin/checkout.c:375
-#: builtin/checkout.c:586 builtin/clone.c:715
+#: merge.c:94 builtin/am.c:2022 builtin/am.c:2057 builtin/checkout.c:376
+#: builtin/checkout.c:587 builtin/clone.c:722
 msgid "unable to write new index file"
 msgstr "kunde inte skriva ny indexfil"
 
@@ -681,64 +681,64 @@
 msgid "error building trees"
 msgstr "fel vid byggande av träd"
 
-#: merge-recursive.c:687
+#: merge-recursive.c:686
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "misslyckades skapa sökvägen \"%s\"%s"
 
-#: merge-recursive.c:698
+#: merge-recursive.c:697
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Tar bort %s för att göra plats för underkatalog\n"
 
-#: merge-recursive.c:712 merge-recursive.c:733
+#: merge-recursive.c:711 merge-recursive.c:732
 msgid ": perhaps a D/F conflict?"
 msgstr ": kanske en K/F-konflikt?"
 
-#: merge-recursive.c:723
+#: merge-recursive.c:722
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "vägrar förlora ospårad fil vid \"%s\""
 
-#: merge-recursive.c:763
+#: merge-recursive.c:762
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "kan inte läsa objektet %s: \"%s\""
 
-#: merge-recursive.c:765
+#: merge-recursive.c:764
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "blob förväntades för %s \"%s\""
 
-#: merge-recursive.c:788 builtin/clone.c:364
+#: merge-recursive.c:787 builtin/clone.c:369
 #, c-format
 msgid "failed to open '%s'"
 msgstr "misslyckades öppna \"%s\""
 
-#: merge-recursive.c:796
+#: merge-recursive.c:795
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "misslyckades skapa symboliska länken \"%s\""
 
-#: merge-recursive.c:799
+#: merge-recursive.c:798
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "vet inte hur %06o %s \"%s\" skall hanteras"
 
-#: merge-recursive.c:937
+#: merge-recursive.c:936
 msgid "Failed to execute internal merge"
 msgstr "Misslyckades exekvera intern sammanslagning"
 
-#: merge-recursive.c:941
+#: merge-recursive.c:940
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Kunde inte lägga till %s till databasen"
 
-#: merge-recursive.c:957
+#: merge-recursive.c:956
 msgid "unsupported object type in the tree"
 msgstr "objekttyp som ej stöds upptäcktes i trädet"
 
-#: merge-recursive.c:1032 merge-recursive.c:1046
+#: merge-recursive.c:1031 merge-recursive.c:1045
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -747,7 +747,7 @@
 "KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
 "i trädet."
 
-#: merge-recursive.c:1038 merge-recursive.c:1051
+#: merge-recursive.c:1037 merge-recursive.c:1050
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -756,20 +756,20 @@
 "KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
 "i trädet vid %s."
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "rename"
 msgstr "namnbyte"
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "renamed"
 msgstr "namnbytt"
 
-#: merge-recursive.c:1148
+#: merge-recursive.c:1147
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s är en katalog i %s lägger till som %s istället"
 
-#: merge-recursive.c:1170
+#: merge-recursive.c:1169
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -778,144 +778,144 @@
 "KONFLIKT (namnbyte/namnbyte): Namnbyte \"%s\"->\"%s\" på grenen \"%s\" "
 "namnbyte \"%s\"->\"%s\" i \"%s\"%s"
 
-#: merge-recursive.c:1175
+#: merge-recursive.c:1174
 msgid " (left unresolved)"
 msgstr " (lämnad olöst)"
 
-#: merge-recursive.c:1229
+#: merge-recursive.c:1228
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 "KONFLIKT (namnbyte/namnbyte): Namnbyte %s->%s i %s. Namnbyte %s->%s i %s"
 
-#: merge-recursive.c:1259
+#: merge-recursive.c:1258
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Byter namn på %s till %s och %s till %s istället"
 
-#: merge-recursive.c:1458
+#: merge-recursive.c:1457
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr "KONFLIKT (namnbyte/tillägg): Namnbyte %s->%s i %s. %s tillagd i %s"
 
-#: merge-recursive.c:1468
+#: merge-recursive.c:1467
 #, c-format
 msgid "Adding merged %s"
 msgstr "Lägger till sammanslagen %s"
 
-#: merge-recursive.c:1473 merge-recursive.c:1671
+#: merge-recursive.c:1472 merge-recursive.c:1674
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Lägger till som %s istället"
 
-#: merge-recursive.c:1524
+#: merge-recursive.c:1523
 #, c-format
 msgid "cannot read object %s"
 msgstr "kan inte läsa objektet %s"
 
-#: merge-recursive.c:1527
+#: merge-recursive.c:1526
 #, c-format
 msgid "object %s is not a blob"
 msgstr "objektet %s är inte en blob"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modify"
 msgstr "ändra"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modified"
 msgstr "ändrad"
 
-#: merge-recursive.c:1585
+#: merge-recursive.c:1588
 msgid "content"
 msgstr "innehåll"
 
-#: merge-recursive.c:1592
+#: merge-recursive.c:1595
 msgid "add/add"
 msgstr "tillägg/tillägg"
 
-#: merge-recursive.c:1626
+#: merge-recursive.c:1629
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Hoppade över %s (sammanslagen samma som befintlig)"
 
-#: merge-recursive.c:1640
+#: merge-recursive.c:1643
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Slår ihop %s automatiskt"
 
-#: merge-recursive.c:1644 git-submodule.sh:1150
+#: merge-recursive.c:1647 git-submodule.sh:1025
 msgid "submodule"
 msgstr "undermodul"
 
-#: merge-recursive.c:1645
+#: merge-recursive.c:1648
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "KONFLIKT (%s): Sammanslagningskonflikt i %s"
 
-#: merge-recursive.c:1731
+#: merge-recursive.c:1734
 #, c-format
 msgid "Removing %s"
 msgstr "Tar bort %s"
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1759
 msgid "file/directory"
 msgstr "fil/katalog"
 
-#: merge-recursive.c:1762
+#: merge-recursive.c:1765
 msgid "directory/file"
 msgstr "katalog/fil"
 
-#: merge-recursive.c:1767
+#: merge-recursive.c:1770
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 "KONFLIKT (%s): Det finns en katalog med namnet %s i %s. Lägger till %s som %s"
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1780
 #, c-format
 msgid "Adding %s"
 msgstr "Lägger till %s"
 
-#: merge-recursive.c:1794
+#: merge-recursive.c:1797
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Ödesdigert sammanslagningsfel, borde inte inträffa."
 
-#: merge-recursive.c:1813
+#: merge-recursive.c:1816
 msgid "Already up-to-date!"
 msgstr "Redan à jour!"
 
-#: merge-recursive.c:1822
+#: merge-recursive.c:1825
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "sammanslagning av träden %s och %s misslyckades"
 
-#: merge-recursive.c:1852
+#: merge-recursive.c:1855
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "Obehandlad sökväg??? %s"
 
-#: merge-recursive.c:1900
+#: merge-recursive.c:1903
 msgid "Merging:"
 msgstr "Slår ihop:"
 
-#: merge-recursive.c:1913
+#: merge-recursive.c:1916
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "hittade %u gemensam förfader:"
 msgstr[1] "hittade %u gemensamma förfäder:"
 
-#: merge-recursive.c:1950
+#: merge-recursive.c:1953
 msgid "merge returned no commit"
 msgstr "sammanslagningen returnerade ingen incheckning"
 
-#: merge-recursive.c:2007
+#: merge-recursive.c:2010
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Kunde inte tolka objektet \"%s\""
 
-#: merge-recursive.c:2018 builtin/merge.c:645
+#: merge-recursive.c:2021 builtin/merge.c:645
 msgid "Unable to write index."
 msgstr "Kunde inte skriva indexet."
 
@@ -945,31 +945,41 @@
 msgid "unable to parse object: %s"
 msgstr "kunde inte tolka objektet: %s"
 
-#: parse-options.c:563
+#: parse-options.c:570
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:581
+#: parse-options.c:588
 #, c-format
 msgid "usage: %s"
 msgstr "användning: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:585
+#: parse-options.c:592
 #, c-format
 msgid "   or: %s"
 msgstr "     eller: %s"
 
-#: parse-options.c:588
+#: parse-options.c:595
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:622
+#: parse-options.c:629
 msgid "-NUM"
 msgstr "-TAL"
 
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "felformat objektnamn \"%s\""
+
+#: path.c:752
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "Kunde inte göra %s skrivbar för gruppen"
+
 #: pathspec.c:133
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
@@ -1039,11 +1049,11 @@
 msgid "unable to parse --pretty format"
 msgstr "kunde inte tolka format för --pretty"
 
-#: progress.c:236
+#: progress.c:235
 msgid "done"
 msgstr "klart"
 
-#: read-cache.c:1296
+#: read-cache.c:1281
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -1052,7 +1062,7 @@
 "index.version satt, men värdet är ogiltigt.\n"
 "Använder version %i"
 
-#: read-cache.c:1306
+#: read-cache.c:1291
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1061,118 +1071,163 @@
 "GIT_INDEX_VERSION satt, men värdet är ogiltigt.\n"
 "Använder version %i"
 
-#: refs.c:2941 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
+#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
 #: builtin/merge.c:983
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Kunde inte öppna \"%s\" för skrivning"
 
-#: refs.c:3001
+#: refs/files-backend.c:2359
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "kunde inte ta bort referensen %s: %s"
 
-#: refs.c:3004
+#: refs/files-backend.c:2362
 #, c-format
 msgid "could not delete references: %s"
 msgstr "kunde inte ta bort referenser: %s"
 
-#: refs.c:3013
+#: refs/files-backend.c:2371
 #, c-format
 msgid "could not remove reference %s"
 msgstr "kunde inte ta bort referensen %s"
 
-#: ref-filter.c:660
+#: ref-filter.c:245
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "format: atomen %%(end) använd utan motsvarande atom"
+
+#: ref-filter.c:704
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "positivt värde förväntat contents:lines=%s"
+
+#: ref-filter.c:833
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "förväntat format: %%(color:<color>)"
+
+#: ref-filter.c:835
 msgid "unable to parse format"
 msgstr "kan inte tolka formatet"
 
-#: remote.c:792
+#: ref-filter.c:870
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "förväntat format: %%(align:<bredd>,<position>)"
+
+#: ref-filter.c:893
+#, c-format
+msgid "improper format entered align:%s"
+msgstr "felaktigt format angivet align:%s"
+
+#: ref-filter.c:898
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "positiv bredd förväntad med atomen %%(align)"
+
+#: ref-filter.c:1219
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "felformat objekt vid \"%s\""
+
+#: ref-filter.c:1561
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "format: atomen %%(end) saknas"
+
+#: ref-filter.c:1615
+#, c-format
+msgid "malformed object name %s"
+msgstr "felformat objektnamn %s"
+
+#: remote.c:756
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "Kan inte hämta både %s och %s till %s"
 
-#: remote.c:796
+#: remote.c:760
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s spårar vanligtvis %s, inte %s"
 
-#: remote.c:800
+#: remote.c:764
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s spårar både %s och %s"
 
-#: remote.c:808
+#: remote.c:772
 msgid "Internal error"
 msgstr "Internt fel"
 
-#: remote.c:1723 remote.c:1766
+#: remote.c:1687 remote.c:1730
 msgid "HEAD does not point to a branch"
 msgstr "HEAD pekar inte på en gren"
 
-#: remote.c:1732
+#: remote.c:1696
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "okänd gren: \"%s\""
 
-#: remote.c:1735
+#: remote.c:1699
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "ingen standarduppström angiven för grenen \"%s\""
 
-#: remote.c:1741
+#: remote.c:1705
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "uppströmsgrenen \"%s\" är inte lagrad som en fjärrspårande gren"
 
-#: remote.c:1756
+#: remote.c:1720
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr "push-målet \"%s\" på fjärren \"%s\" har ingen lokalt spårande gren"
 
-#: remote.c:1771
+#: remote.c:1735
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "grenen \"%s\" har ingen fjärr för \"push\""
 
-#: remote.c:1782
+#: remote.c:1746
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "\"push\"-referensspecifikation för \"%s\" innehåller inte \"%s\""
 
-#: remote.c:1795
+#: remote.c:1759
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "\"push\" har inget mål (push.default är \"ingenting\")"
 
-#: remote.c:1817
+#: remote.c:1781
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "\"enkel push\" motsvarar flera olika mål"
 
-#: remote.c:2124
+#: remote.c:2083
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "Din gren är baserad på \"%s\", men den har försvunnit uppströms.\n"
 
-#: remote.c:2128
+#: remote.c:2087
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (använd \"git branch --unset-upstream\" för att rätta)\n"
 
-#: remote.c:2131
+#: remote.c:2090
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "Din gren är à jour med \"%s\".\n"
 
-#: remote.c:2135
+#: remote.c:2094
 #, c-format
 msgid "Your branch is ahead of '%s' by %d commit.\n"
 msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
 msgstr[0] "Din gren ligger före \"%s\" med %d incheckning.\n"
 msgstr[1] "Din gren ligger före \"%s\" med %d incheckningar.\n"
 
-#: remote.c:2141
+#: remote.c:2100
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (använd \"git push\" för att publicera dina lokala incheckningar)\n"
 
-#: remote.c:2144
+#: remote.c:2103
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1182,11 +1237,11 @@
 msgstr[1] ""
 "Din gren ligger efter \"%s\" med %d incheckningar, och kan snabbspolas.\n"
 
-#: remote.c:2152
+#: remote.c:2111
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (använd \"git pull\" för att uppdatera din lokala gren)\n"
 
-#: remote.c:2155
+#: remote.c:2114
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1201,28 +1256,28 @@
 "Din gren och \"%s\" har divergerat,\n"
 "och har %d respektive %d olika incheckningar.\n"
 
-#: remote.c:2165
+#: remote.c:2124
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (använd \"git pull\" för att slå ihop fjärrgrenen med din egen)\n"
 
-#: revision.c:2198
+#: revision.c:2193
 msgid "your current branch appears to be broken"
 msgstr "din nuvarande gren verkar vara trasig"
 
-#: revision.c:2201
+#: revision.c:2196
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "din nuvarande gren \"%s\" innehåller ännu inte några incheckningar"
 
-#: revision.c:2395
+#: revision.c:2390
 msgid "--first-parent is incompatible with --bisect"
 msgstr "--first-parent är inkompatibelt med --bisect"
 
-#: run-command.c:83
+#: run-command.c:90
 msgid "open /dev/null failed"
 msgstr "misslyckades öppna /dev/null"
 
-#: run-command.c:85
+#: run-command.c:92
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) misslyckades"
@@ -1440,7 +1495,7 @@
 msgid "cannot abort from a branch yet to be born"
 msgstr "kan inte avbryta från en gren som ännu inte är född"
 
-#: sequencer.c:887 builtin/apply.c:4291
+#: sequencer.c:887 builtin/apply.c:4287
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "kan inte öppna %s: %s"
@@ -1482,12 +1537,12 @@
 msgid "Can't cherry-pick into empty head"
 msgstr "Kan inte göra \"cherry-pick\" i ett tomt huvud"
 
-#: setup.c:243
+#: setup.c:248
 #, c-format
 msgid "failed to read %s"
 msgstr "misslyckades läsa %s"
 
-#: sha1_name.c:453
+#: sha1_name.c:463
 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"
@@ -1534,7 +1589,7 @@
 msgid "staging updated .gitmodules failed"
 msgstr "misslyckades köa uppdaterad .gitmodules"
 
-#: submodule.c:1045
+#: submodule.c:1040
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Kunde inte sätta core.worktree i %s"
@@ -1545,7 +1600,7 @@
 msgid "unknown value '%s' for key '%s'"
 msgstr "okänt värde \"%s\" för nyckeln \"%s\""
 
-#: trailer.c:543 trailer.c:548 builtin/remote.c:290
+#: trailer.c:543 trailer.c:548 builtin/remote.c:296
 #, c-format
 msgid "more than one %s"
 msgstr "mer än en %s"
@@ -1612,8 +1667,8 @@
 msgid "could not open '%s' for writing"
 msgstr "kunde inte öppna \"%s\" för skrivning"
 
-#: wrapper.c:223 wrapper.c:366 builtin/am.c:337 builtin/commit.c:1688
-#: builtin/merge.c:1076 builtin/pull.c:380
+#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691
+#: builtin/merge.c:1074 builtin/pull.c:380
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "kunde inte öppna \"%s\" för läsning"
@@ -1628,30 +1683,21 @@
 msgid "unable to access '%s'"
 msgstr "kan inte komma åt \"%s\""
 
-#: wrapper.c:611
-#, c-format
-msgid "unable to look up current user in the passwd file: %s"
-msgstr "kan inte slå upp aktuell användare i passwd-filen: %s"
-
-#: wrapper.c:612
-msgid "no such user"
-msgstr "okänd användare"
-
-#: wrapper.c:620
+#: wrapper.c:608
 msgid "unable to get current working directory"
 msgstr "kan inte hämta aktuell arbetskatalog"
 
-#: wrapper.c:631
+#: wrapper.c:635
 #, c-format
 msgid "could not open %s for writing"
 msgstr "kunde inte öppna %s för skrivning"
 
-#: wrapper.c:642 builtin/am.c:424
+#: wrapper.c:646 builtin/am.c:425
 #, c-format
 msgid "could not write to %s"
 msgstr "kunde inte skriva till %s"
 
-#: wrapper.c:648
+#: wrapper.c:652
 #, c-format
 msgid "could not close %s"
 msgstr "kunde inte stänga %s"
@@ -1994,27 +2040,27 @@
 msgstr ""
 "  (använd \"git bisect reset\" för att komma tillbaka till ursprungsgrenen)"
 
-#: wt-status.c:1437
+#: wt-status.c:1438
 msgid "On branch "
 msgstr "På grenen "
 
-#: wt-status.c:1445
+#: wt-status.c:1444
 msgid "interactive rebase in progress; onto "
 msgstr "interaktiv ombasering pågår; ovanpå"
 
-#: wt-status.c:1447
+#: wt-status.c:1446
 msgid "rebase in progress; onto "
 msgstr "ombasering pågår; ovanpå"
 
-#: wt-status.c:1452
+#: wt-status.c:1451
 msgid "HEAD detached at "
 msgstr "HEAD frånkopplad vid "
 
-#: wt-status.c:1454
+#: wt-status.c:1453
 msgid "HEAD detached from "
 msgstr "HEAD frånkopplad från "
 
-#: wt-status.c:1457
+#: wt-status.c:1456
 msgid "Not currently on any branch."
 msgstr "Inte på någon gren för närvarande."
 
@@ -2101,23 +2147,23 @@
 msgid "nothing to commit, working directory clean\n"
 msgstr "inget att checka in, arbetskatalogen ren\n"
 
-#: wt-status.c:1644
-msgid "HEAD (no branch)"
-msgstr "HEAD (ingen gren)"
-
-#: wt-status.c:1650
+#: wt-status.c:1642
 msgid "Initial commit on "
 msgstr "Första incheckning på "
 
-#: wt-status.c:1677
+#: wt-status.c:1646
+msgid "HEAD (no branch)"
+msgstr "HEAD (ingen gren)"
+
+#: wt-status.c:1675
 msgid "gone"
 msgstr "försvunnen"
 
-#: wt-status.c:1679 wt-status.c:1687
+#: wt-status.c:1677 wt-status.c:1685
 msgid "behind "
 msgstr "efter "
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:403
+#: compat/precompose_utf8.c:56 builtin/clone.c:408
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "misslyckades ta bort länken \"%s\""
@@ -2131,7 +2177,7 @@
 msgid "unexpected diff status %c"
 msgstr "diff-status %c förväntades inte"
 
-#: builtin/add.c:70 builtin/commit.c:277
+#: builtin/add.c:70 builtin/commit.c:278
 msgid "updating files failed"
 msgstr "misslyckades uppdatera filer"
 
@@ -2142,9 +2188,9 @@
 
 #: builtin/add.c:134
 msgid "Unstaged changes after refreshing the index:"
-msgstr "Ospårade ändringar efter att ha uppdaterat indexet:"
+msgstr "Oköade ändringar efter att ha uppdaterat indexet:"
 
-#: builtin/add.c:194 builtin/rev-parse.c:799
+#: builtin/add.c:194 builtin/rev-parse.c:796
 msgid "Could not read the index"
 msgstr "Kunde inte läsa indexet"
 
@@ -2179,15 +2225,15 @@
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr "Följande sökvägar ignoreras av en av dina .gitignore-filer:\n"
 
-#: builtin/add.c:249 builtin/clean.c:896 builtin/fetch.c:108 builtin/mv.c:110
-#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:545
-#: builtin/remote.c:1339 builtin/rm.c:268 builtin/send-pack.c:162
+#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:543
+#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162
 msgid "dry run"
 msgstr "testkörning"
 
-#: builtin/add.c:250 builtin/apply.c:4580 builtin/check-ignore.c:19
-#: builtin/commit.c:1321 builtin/count-objects.c:63 builtin/fsck.c:636
-#: builtin/log.c:1641 builtin/mv.c:109 builtin/read-tree.c:114
+#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19
+#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
+#: builtin/log.c:1645 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr "var pratsam"
 
@@ -2195,7 +2241,7 @@
 msgid "interactive picking"
 msgstr "plocka interaktivt"
 
-#: builtin/add.c:253 builtin/checkout.c:1152 builtin/reset.c:286
+#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "välj stycken interaktivt"
 
@@ -2252,148 +2298,148 @@
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "Flaggan --ignore-missing kan endast användas tillsammans med --dry-run"
 
-#: builtin/add.c:358
+#: builtin/add.c:352
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Inget angivet, inget tillagt.\n"
 
-#: builtin/add.c:359
+#: builtin/add.c:353
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Kanske menade du att skriva \"git add .\"?\n"
 
-#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:940
-#: builtin/commit.c:336 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938
+#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:40
 msgid "index file corrupt"
 msgstr "indexfilen trasig"
 
-#: builtin/add.c:445 builtin/apply.c:4678 builtin/mv.c:279 builtin/rm.c:430
+#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430
 msgid "Unable to write new index file"
 msgstr "Kunde inte skriva ny indexfil"
 
-#: builtin/am.c:41
+#: builtin/am.c:42
 #, c-format
 msgid "could not stat %s"
 msgstr "kunde inte ta status på %s"
 
-#: builtin/am.c:270 builtin/am.c:1318 builtin/commit.c:737
-#: builtin/merge.c:1079
+#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077
 #, c-format
 msgid "could not read '%s'"
 msgstr "kunde inte läsa \"%s\""
 
-#: builtin/am.c:444
+#: builtin/am.c:445
 msgid "could not parse author script"
 msgstr "kunde inte tolka författarskript"
 
-#: builtin/am.c:521
+#: builtin/am.c:522
 #, c-format
 msgid "'%s' was deleted by the applypatch-msg hook"
 msgstr "\"%s\" togs bort av kroken applypatch-msg"
 
-#: builtin/am.c:562 builtin/notes.c:300
+#: builtin/am.c:563 builtin/notes.c:300
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Felaktig indatarad: \"%s\"."
 
-#: builtin/am.c:599 builtin/notes.c:315
+#: builtin/am.c:600 builtin/notes.c:315
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "Misslyckades kopiera anteckningar från \"%s\" till \"%s\""
 
-#: builtin/am.c:625
+#: builtin/am.c:626
 msgid "fseek failed"
 msgstr "\"fseek\" misslyckades"
 
-#: builtin/am.c:786 builtin/am.c:874
+#: builtin/am.c:787 builtin/am.c:875
 #, c-format
 msgid "could not open '%s' for reading: %s"
 msgstr "kunde inte öppna \"%s\" för läsning: %s"
 
-#: builtin/am.c:793
+#: builtin/am.c:794
 #, c-format
 msgid "could not open '%s' for writing: %s"
 msgstr "Kunde inte öppna \"%s\" för skrivning: %s"
 
-#: builtin/am.c:802
+#: builtin/am.c:803
 #, c-format
 msgid "could not parse patch '%s'"
 msgstr "kunde inte tolka patchen \"%s\""
 
-#: builtin/am.c:867
+#: builtin/am.c:868
 msgid "Only one StGIT patch series can be applied at once"
 msgstr "Endast en StGIT-patchserie kan tillämpas åt gången"
 
-#: builtin/am.c:915
+#: builtin/am.c:916
 msgid "invalid timestamp"
 msgstr "ogiltig tidsstämpel"
 
-#: builtin/am.c:918 builtin/am.c:926
+#: builtin/am.c:919 builtin/am.c:927
 msgid "invalid Date line"
 msgstr "ogiltig \"Date\"-rad"
 
-#: builtin/am.c:923
+#: builtin/am.c:924
 msgid "invalid timezone offset"
 msgstr "ogiltig tidszons-offset"
 
-#: builtin/am.c:1010
+#: builtin/am.c:1011
 msgid "Patch format detection failed."
 msgstr "Misslyckades detektera patchformat."
 
-#: builtin/am.c:1015 builtin/clone.c:368
+#: builtin/am.c:1016 builtin/clone.c:373
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "misslyckades skapa katalogen \"%s\""
 
-#: builtin/am.c:1019
+#: builtin/am.c:1020
 msgid "Failed to split patches."
 msgstr "Misslyckades dela patchar."
 
-#: builtin/am.c:1151 builtin/commit.c:362
+#: builtin/am.c:1152 builtin/commit.c:363
 msgid "unable to write index file"
 msgstr "kan inte skriva indexfil"
 
-#: builtin/am.c:1202
+#: builtin/am.c:1203
 #, c-format
 msgid "When you have resolved this problem, run \"%s --continue\"."
 msgstr "När du har löst problemet, kör \"%s --continue\"."
 
-#: builtin/am.c:1203
+#: builtin/am.c:1204
 #, c-format
 msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
 msgstr "Om du hellre vill hoppa över patchen, kör \"%s --skip\" i stället."
 
-#: builtin/am.c:1204
+#: builtin/am.c:1205
 #, c-format
 msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr ""
 "För att återgå till ursprunglig gren och sluta patcha, kör \"%s --abort\"."
 
-#: builtin/am.c:1312
+#: builtin/am.c:1343
 msgid "Patch is empty. Was it split wrong?"
 msgstr "Patchen är tom. Delades den upp felaktigt?"
 
-#: builtin/am.c:1386 builtin/log.c:1345
+#: builtin/am.c:1417 builtin/log.c:1347
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "ogiltig ident-rad: %s"
 
-#: builtin/am.c:1413
+#: builtin/am.c:1444
 #, c-format
 msgid "unable to parse commit %s"
 msgstr "kunde inte tolka incheckningen %s"
 
-#: builtin/am.c:1587
+#: builtin/am.c:1646
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 "Arkivet saknar objekt som behövs för att falla tillbaka på 3-"
 "vägssammanslagning."
 
-#: builtin/am.c:1589
+#: builtin/am.c:1648
 msgid "Using index info to reconstruct a base tree..."
 msgstr "Använder indexinfo för att återskapa ett basträd..."
 
-#: builtin/am.c:1608
+#: builtin/am.c:1667
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
@@ -2401,39 +2447,39 @@
 "Har du handredigerat din patch?\n"
 "Den kan inte tillämpas på blobbar som antecknats i dess index."
 
-#: builtin/am.c:1614
+#: builtin/am.c:1673
 msgid "Falling back to patching base and 3-way merge..."
 msgstr ""
 "Faller tillbaka på att patcha grundversionen och trevägssammanslagning..."
 
-#: builtin/am.c:1639
+#: builtin/am.c:1688
 msgid "Failed to merge in the changes."
 msgstr "Misslyckades slå ihop ändringarna."
 
-#: builtin/am.c:1664 builtin/merge.c:632
+#: builtin/am.c:1712 builtin/merge.c:632
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree misslyckades skriva ett träd"
 
-#: builtin/am.c:1671
+#: builtin/am.c:1719
 msgid "applying to an empty history"
 msgstr "tillämpar på en tom historik"
 
-#: builtin/am.c:1684 builtin/commit.c:1752 builtin/merge.c:829
+#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829
 #: builtin/merge.c:854
 msgid "failed to write commit object"
 msgstr "kunde inte skriva incheckningsobjekt"
 
-#: builtin/am.c:1716 builtin/am.c:1720
+#: builtin/am.c:1764 builtin/am.c:1768
 #, c-format
 msgid "cannot resume: %s does not exist."
 msgstr "kan inte återuppta: %s finns inte."
 
-#: builtin/am.c:1736
+#: builtin/am.c:1784
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 "kan inte vara interaktiv om standard in inte är ansluten till en terminal."
 
-#: builtin/am.c:1741
+#: builtin/am.c:1789
 msgid "Commit Body is:"
 msgstr "Incheckningskroppen är:"
 
@@ -2441,35 +2487,35 @@
 #. in your translation. The program will only accept English
 #. input at this point.
 #.
-#: builtin/am.c:1751
+#: builtin/am.c:1799
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 msgstr "Tillämpa? Y=ja/N=nej/E=redigera/V=visa patch/A=godta alla: "
 
-#: builtin/am.c:1801
+#: builtin/am.c:1849
 #, c-format
 msgid "Dirty index: cannot apply patches (dirty: %s)"
 msgstr "Smutsigt index: kan inte tillämpa patchar (smutsiga: %s)"
 
-#: builtin/am.c:1836 builtin/am.c:1907
+#: builtin/am.c:1884 builtin/am.c:1955
 #, c-format
 msgid "Applying: %.*s"
 msgstr "Tillämpar: %.*s"
 
-#: builtin/am.c:1852
+#: builtin/am.c:1900
 msgid "No changes -- Patch already applied."
 msgstr "Inga ändringar -- Patchen har redan tillämpats."
 
-#: builtin/am.c:1860
+#: builtin/am.c:1908
 #, c-format
 msgid "Patch failed at %s %.*s"
 msgstr "Patch misslyckades på %s %.*s"
 
-#: builtin/am.c:1866
+#: builtin/am.c:1914
 #, c-format
 msgid "The copy of the patch that failed is found in: %s"
 msgstr "En kopia av patchen som misslyckades finns i: %s"
 
-#: builtin/am.c:1910
+#: builtin/am.c:1958
 msgid ""
 "No changes - did you forget to use 'git add'?\n"
 "If there is nothing left to stage, chances are that something else\n"
@@ -2479,7 +2525,7 @@
 "Om det inte är något kvar att köa kan det hända att något annat redan\n"
 "introducerat samma ändringar; kanske du bör hoppa över patchen."
 
-#: builtin/am.c:1917
+#: builtin/am.c:1965
 msgid ""
 "You still have unmerged paths in your index.\n"
 "Did you forget to use 'git add'?"
@@ -2487,17 +2533,17 @@
 "Du har fortfarande sökvägar som inte slagits samman i ditt index.\n"
 "Glömde du använda \"git add\"?"
 
-#: builtin/am.c:2025 builtin/am.c:2029 builtin/am.c:2041 builtin/reset.c:308
+#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308
 #: builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "Kan inte tolka objektet \"%s\""
 
-#: builtin/am.c:2077
+#: builtin/am.c:2125
 msgid "failed to clean index"
 msgstr "misslyckades städa upp indexet"
 
-#: builtin/am.c:2111
+#: builtin/am.c:2159
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
@@ -2505,150 +2551,152 @@
 "Du verkar ha flyttat HEAD sedan \"am\" sist misslyckades.\n"
 "Återställer inte till ORIG_HEAD"
 
-#: builtin/am.c:2172
+#: builtin/am.c:2220
 #, c-format
 msgid "Invalid value for --patch-format: %s"
 msgstr "Felaktigt värde för --patch-format: %s"
 
-#: builtin/am.c:2194
-msgid "git am [options] [(<mbox>|<Maildir>)...]"
-msgstr "git am [flaggor] [(<mbox>|<Maildir>)...]"
+#: builtin/am.c:2253
+msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
+msgstr "git am [<flaggor>] [(<mbox>|<Maildir>)...]"
 
-#: builtin/am.c:2195
-msgid "git am [options] (--continue | --skip | --abort)"
-msgstr "git am [flaggor] (--continue | --skip | --abort)"
+#: builtin/am.c:2254
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<flaggor>] (--continue | --skip | --abort)"
 
-#: builtin/am.c:2201
+#: builtin/am.c:2260
 msgid "run interactively"
 msgstr "kör interaktivt"
 
-#: builtin/am.c:2203
+#: builtin/am.c:2262
 msgid "historical option -- no-op"
 msgstr "historisk flagga -- no-op"
 
-#: builtin/am.c:2205
+#: builtin/am.c:2264
 msgid "allow fall back on 3way merging if needed"
 msgstr "tillåt falla tillbaka på trevägssammanslagning om nödvändigt"
 
-#: builtin/am.c:2206 builtin/init-db.c:509 builtin/prune-packed.c:57
+#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57
 #: builtin/repack.c:171
 msgid "be quiet"
 msgstr "var tyst"
 
-#: builtin/am.c:2208
+#: builtin/am.c:2267
 msgid "add a Signed-off-by line to the commit message"
 msgstr "lägg till \"Signed-off-by\"-rad i incheckningsmeddelandet"
 
-#: builtin/am.c:2211
+#: builtin/am.c:2270
 msgid "recode into utf8 (default)"
 msgstr "koda om till utf8 (standard)"
 
-#: builtin/am.c:2213
+#: builtin/am.c:2272
 msgid "pass -k flag to git-mailinfo"
 msgstr "sänd flaggan -k till git-mailinfo"
 
-#: builtin/am.c:2215
+#: builtin/am.c:2274
 msgid "pass -b flag to git-mailinfo"
 msgstr "sänd flaggan -b till git-mailinfo"
 
-#: builtin/am.c:2217
+#: builtin/am.c:2276
 msgid "pass -m flag to git-mailinfo"
 msgstr "sänd flaggan -m till git-mailinfo"
 
-#: builtin/am.c:2219
+#: builtin/am.c:2278
 msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr "sänd flaggan --keep-cr till git-mailsplit för mbox-formatet"
 
-#: builtin/am.c:2222
+#: builtin/am.c:2281
 msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr "sänd inte flaggan --keep-cr till git-mailsplit oberoende av am.keepcr"
 
-#: builtin/am.c:2225
+#: builtin/am.c:2284
 msgid "strip everything before a scissors line"
 msgstr "ta bort allting före en saxlinje"
 
-#: builtin/am.c:2226 builtin/apply.c:4563
+#: builtin/am.c:2285 builtin/apply.c:4554
 msgid "action"
 msgstr "åtgärd"
 
-#: builtin/am.c:2227 builtin/am.c:2230 builtin/am.c:2233 builtin/am.c:2236
-#: builtin/am.c:2239 builtin/am.c:2242 builtin/am.c:2245 builtin/am.c:2248
-#: builtin/am.c:2254
+#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295
+#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307
+#: builtin/am.c:2313
 msgid "pass it through git-apply"
 msgstr "sänd det genom git-apply"
 
-#: builtin/am.c:2235 builtin/apply.c:4587
+#: builtin/am.c:2294 builtin/apply.c:4578
 msgid "root"
 msgstr "rot"
 
-#: builtin/am.c:2238 builtin/am.c:2241 builtin/apply.c:4525
-#: builtin/apply.c:4528 builtin/clone.c:85 builtin/fetch.c:93
-#: builtin/pull.c:167
+#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516
+#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93
+#: builtin/pull.c:167 builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
 msgid "path"
 msgstr "sökväg"
 
-#: builtin/am.c:2244 builtin/fmt-merge-msg.c:669 builtin/fmt-merge-msg.c:672
-#: builtin/grep.c:698 builtin/merge.c:198 builtin/pull.c:127
-#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:664
-#: builtin/show-ref.c:180 builtin/tag.c:591 parse-options.h:132
-#: parse-options.h:134 parse-options.h:243
+#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
+#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127
+#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645
+#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
+#: parse-options.h:134 parse-options.h:244
 msgid "n"
 msgstr "n"
 
-#: builtin/am.c:2247 builtin/apply.c:4531
+#: builtin/am.c:2306 builtin/apply.c:4522
 msgid "num"
 msgstr "antal"
 
-#: builtin/am.c:2250 builtin/for-each-ref.c:34 builtin/replace.c:438
+#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
 msgid "format"
 msgstr "format"
 
-#: builtin/am.c:2251
+#: builtin/am.c:2310
 msgid "format the patch(es) are in"
 msgstr "format för patch(ar)"
 
-#: builtin/am.c:2257
+#: builtin/am.c:2316
 msgid "override error message when patch failure occurs"
 msgstr "överstyr felmeddelanden när patchfel uppstår"
 
-#: builtin/am.c:2259
+#: builtin/am.c:2318
 msgid "continue applying patches after resolving a conflict"
 msgstr "fortsätt applicera patchar efter att ha löst en konflikt"
 
-#: builtin/am.c:2262
+#: builtin/am.c:2321
 msgid "synonyms for --continue"
 msgstr "synonymer till --continue"
 
-#: builtin/am.c:2265
+#: builtin/am.c:2324
 msgid "skip the current patch"
 msgstr "hoppa över den aktuella grenen"
 
-#: builtin/am.c:2268
+#: builtin/am.c:2327
 msgid "restore the original branch and abort the patching operation."
 msgstr "återställ originalgrenen och avbryt patchningen."
 
-#: builtin/am.c:2272
+#: builtin/am.c:2331
 msgid "lie about committer date"
 msgstr "ljug om incheckningsdatum"
 
-#: builtin/am.c:2274
+#: builtin/am.c:2333
 msgid "use current timestamp for author date"
 msgstr "använd nuvarande tidsstämpel för författardatum"
 
-#: builtin/am.c:2276 builtin/commit.c:1590 builtin/merge.c:225
-#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:606
+#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225
+#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355
 msgid "key-id"
 msgstr "nyckel-id"
 
-#: builtin/am.c:2277
+#: builtin/am.c:2336
 msgid "GPG-sign commits"
 msgstr "GPG-signera incheckningar"
 
-#: builtin/am.c:2280
+#: builtin/am.c:2339
 msgid "(internal use for git-rebase)"
 msgstr "(används internt av git-rebase)"
 
-#: builtin/am.c:2295
+#: builtin/am.c:2354
 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."
@@ -2656,16 +2704,16 @@
 "Flaggan -b/--binary har varit utan funktion länge, och\n"
 "kommer tas bort. Vi ber dig att inte använda den längre."
 
-#: builtin/am.c:2302
+#: builtin/am.c:2361
 msgid "failed to read the index"
 msgstr "misslyckades läsa indexet"
 
-#: builtin/am.c:2317
+#: builtin/am.c:2376
 #, c-format
 msgid "previous rebase directory %s still exists but mbox given."
 msgstr "tidigare rebase-katalog %s finns fortfarande, men mbox angavs."
 
-#: builtin/am.c:2341
+#: builtin/am.c:2400
 #, c-format
 msgid ""
 "Stray %s directory found.\n"
@@ -2674,7 +2722,7 @@
 "Kvarbliven katalog %s hittades.\n"
 "Använd \"git am --abort\" för att ta bort den."
 
-#: builtin/am.c:2347
+#: builtin/am.c:2406
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr "Lösningsoperation pågår inte, vi återupptar inte."
 
@@ -2682,62 +2730,62 @@
 msgid "git apply [<options>] [<patch>...]"
 msgstr "git apply [<flaggor>] [<patch>...]"
 
-#: builtin/apply.c:112
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
 msgstr "okänt alternativ för whitespace: \"%s\""
 
-#: builtin/apply.c:127
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "okänt alternativ för ignore-whitespace: \"%s\""
 
-#: builtin/apply.c:822
+#: builtin/apply.c:818
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "Kan inte förbereda reguljärt uttryck för tidsstämpeln %s"
 
-#: builtin/apply.c:831
+#: builtin/apply.c:827
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "regexec returnerade %d för indata: %s"
 
-#: builtin/apply.c:912
+#: builtin/apply.c:908
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "kan inte hitta filnamn i patchen på rad %d"
 
-#: builtin/apply.c:944
+#: builtin/apply.c:940
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr "git apply: dålig git-diff - förväntade /dev/null, fick %s på rad %d"
 
-#: builtin/apply.c:948
+#: builtin/apply.c:944
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr "git apply: dålig git-diff - motsägande nytt filnamn på rad %d"
 
-#: builtin/apply.c:949
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr "git apply: dålig git-diff - motsägande gammalt filnamn på rad %d"
 
-#: builtin/apply.c:956
+#: builtin/apply.c:952
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr "git apply: dålig git-diff - förväntade /dev/null på rad %d"
 
-#: builtin/apply.c:1419
+#: builtin/apply.c:1415
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "recount: förväntade rad: %.*s"
 
-#: builtin/apply.c:1476
+#: builtin/apply.c:1472
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "patch-fragment utan huvud på rad %d: %.*s"
 
-#: builtin/apply.c:1493
+#: builtin/apply.c:1489
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2753,77 +2801,77 @@
 "sökvägskomponenter\n"
 "tas bort (rad %d)"
 
-#: builtin/apply.c:1659
+#: builtin/apply.c:1655
 msgid "new file depends on old contents"
 msgstr "ny fil beror på gammalt innehåll"
 
-#: builtin/apply.c:1661
+#: builtin/apply.c:1657
 msgid "deleted file still has contents"
 msgstr "borttagen fil har fortfarande innehåll"
 
-#: builtin/apply.c:1687
+#: builtin/apply.c:1683
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "trasig patch på rad %d"
 
-#: builtin/apply.c:1723
+#: builtin/apply.c:1719
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "nya filen %s beror på gammalt innehåll"
 
-#: builtin/apply.c:1725
+#: builtin/apply.c:1721
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "borttagna filen %s har fortfarande innehåll"
 
-#: builtin/apply.c:1728
+#: builtin/apply.c:1724
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "** varning: filen %s blir tom men har inte tagits bort"
 
-#: builtin/apply.c:1874
+#: builtin/apply.c:1870
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "trasig binärpatch på rad %d: %.*s"
 
-#: builtin/apply.c:1903
+#: builtin/apply.c:1899
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "binärpatchen på rad %d känns inte igen"
 
-#: builtin/apply.c:2054
+#: builtin/apply.c:2050
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "patch med bara skräp på rad %d"
 
-#: builtin/apply.c:2144
+#: builtin/apply.c:2140
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "kunde inte läsa symboliska länken %s"
 
-#: builtin/apply.c:2148
+#: builtin/apply.c:2144
 #, c-format
 msgid "unable to open or read %s"
 msgstr "kunde inte öppna eller läsa %s"
 
-#: builtin/apply.c:2781
+#: builtin/apply.c:2777
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "felaktig inledning på rad: \"%c\""
 
-#: builtin/apply.c:2900
+#: builtin/apply.c:2896
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
 msgstr[0] "Stycke %d lyckades på %d (offset %d rad)."
 msgstr[1] "Stycke %d lyckades på %d (offset %d rader)."
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2908
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr "Sammanhang reducerat till (%ld/%ld) för att tillämpa fragment vid %d"
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2914
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -2832,319 +2880,319 @@
 "vid sökning efter:\n"
 "%.*s"
 
-#: builtin/apply.c:2938
+#: builtin/apply.c:2934
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "saknar binära patchdata för \"%s\""
 
-#: builtin/apply.c:3039
+#: builtin/apply.c:3035
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "binärpatchen kan inte tillämpas på \"%s\""
 
-#: builtin/apply.c:3045
+#: builtin/apply.c:3041
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr "binärpatchen på \"%s\" ger felaktigt resultat (förväntade %s, fick %s)"
 
-#: builtin/apply.c:3066
+#: builtin/apply.c:3062
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "patch misslyckades: %s:%ld"
 
-#: builtin/apply.c:3190
+#: builtin/apply.c:3186
 #, c-format
 msgid "cannot checkout %s"
 msgstr "kan inte checka ut %s"
 
-#: builtin/apply.c:3235 builtin/apply.c:3246 builtin/apply.c:3291
+#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
 #, c-format
 msgid "read of %s failed"
 msgstr "misslyckades läsa %s"
 
-#: builtin/apply.c:3243
+#: builtin/apply.c:3239
 #, c-format
 msgid "reading from '%s' beyond a symbolic link"
 msgstr "läser från \"%s\" som är på andra sidan av en symbolisk länk"
 
-#: builtin/apply.c:3271 builtin/apply.c:3493
+#: builtin/apply.c:3267 builtin/apply.c:3489
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "sökvägen %s har ändrat namn/tagits bort"
 
-#: builtin/apply.c:3352 builtin/apply.c:3507
+#: builtin/apply.c:3348 builtin/apply.c:3503
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s: finns inte i indexet"
 
-#: builtin/apply.c:3356 builtin/apply.c:3499 builtin/apply.c:3521
+#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: builtin/apply.c:3361 builtin/apply.c:3515
+#: builtin/apply.c:3357 builtin/apply.c:3511
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s: motsvarar inte indexet"
 
-#: builtin/apply.c:3463
+#: builtin/apply.c:3459
 msgid "removal patch leaves file contents"
 msgstr "patch för borttagning lämnar kvar filinnehåll"
 
-#: builtin/apply.c:3532
+#: builtin/apply.c:3528
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s: fel typ"
 
-#: builtin/apply.c:3534
+#: builtin/apply.c:3530
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s har typen %o, förväntade %o"
 
-#: builtin/apply.c:3693 builtin/apply.c:3695
+#: builtin/apply.c:3689 builtin/apply.c:3691
 #, c-format
 msgid "invalid path '%s'"
 msgstr "ogiltig sökväg: %s"
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3746
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s: finns redan i indexet"
 
-#: builtin/apply.c:3753
+#: builtin/apply.c:3749
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s: finns redan i arbetskatalogen"
 
-#: builtin/apply.c:3773
+#: builtin/apply.c:3769
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "nytt läge (%o) för %s motsvarar inte gammalt läge (%o)"
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3774
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr "nytt läge (%o) för %s motsvarar inte gammalt läge (%o) för %s"
 
-#: builtin/apply.c:3798
+#: builtin/apply.c:3794
 #, c-format
 msgid "affected file '%s' is beyond a symbolic link"
 msgstr "den berörda filen \"%s\" är på andra sidan av en symbolisk länk"
 
-#: builtin/apply.c:3802
+#: builtin/apply.c:3798
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s: patchen kan inte tillämpas"
 
-#: builtin/apply.c:3816
+#: builtin/apply.c:3812
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Kontrollerar patchen %s..."
 
-#: builtin/apply.c:3909 builtin/checkout.c:232 builtin/reset.c:135
+#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "make_cache_entry misslyckades för sökvägen \"%s\""
 
-#: builtin/apply.c:4052
+#: builtin/apply.c:4048
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "kan inte ta bort %s från indexet"
 
-#: builtin/apply.c:4081
+#: builtin/apply.c:4077
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "trasig patch för undermodulen %s"
 
-#: builtin/apply.c:4085
+#: builtin/apply.c:4081
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "kan inte ta status på nyligen skapade filen \"%s\""
 
-#: builtin/apply.c:4090
+#: builtin/apply.c:4086
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr "kan inte skapa säkerhetsminne för nyligen skapade filen %s"
 
-#: builtin/apply.c:4093 builtin/apply.c:4201
+#: builtin/apply.c:4089 builtin/apply.c:4197
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "kan inte lägga till cachepost för %s"
 
-#: builtin/apply.c:4126
+#: builtin/apply.c:4122
 #, c-format
 msgid "closing file '%s'"
 msgstr "stänger filen \"%s\""
 
-#: builtin/apply.c:4175
+#: builtin/apply.c:4171
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "kan inte skriva filen \"%s\" läge %o"
 
-#: builtin/apply.c:4262
+#: builtin/apply.c:4258
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Tillämpade patchen %s rent."
 
-#: builtin/apply.c:4270
+#: builtin/apply.c:4266
 msgid "internal error"
 msgstr "internt fel"
 
-#: builtin/apply.c:4273
+#: builtin/apply.c:4269
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] "Tillämpade patchen %%s med %d refuserad..."
 msgstr[1] "Tillämpade patchen %%s med %d refuserade..."
 
-#: builtin/apply.c:4283
+#: builtin/apply.c:4279
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "trunkerar .rej-filnamnet till %.*s.rej"
 
-#: builtin/apply.c:4304
+#: builtin/apply.c:4300
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "Stycke %d tillämpades rent."
 
-#: builtin/apply.c:4307
+#: builtin/apply.c:4303
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "Refuserar stycke %d."
 
-#: builtin/apply.c:4397
+#: builtin/apply.c:4393
 msgid "unrecognized input"
 msgstr "indata känns inte igen"
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4404
 msgid "unable to read index file"
 msgstr "kan inte läsa indexfilen"
 
-#: builtin/apply.c:4526
+#: builtin/apply.c:4517
 msgid "don't apply changes matching the given path"
 msgstr "tillämpa inte ändringar som motsvarar given sökväg"
 
-#: builtin/apply.c:4529
+#: builtin/apply.c:4520
 msgid "apply changes matching the given path"
 msgstr "tillämpa ändringar som motsvarar given sökväg"
 
-#: builtin/apply.c:4532
+#: builtin/apply.c:4523
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "ta bort <antal> inledande snedstreck från traditionella diff-sökvägar"
 
-#: builtin/apply.c:4535
+#: builtin/apply.c:4526
 msgid "ignore additions made by the patch"
 msgstr "ignorera tillägg gjorda av patchen"
 
-#: builtin/apply.c:4537
+#: builtin/apply.c:4528
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr "istället för att tillämpa patchen, skriv ut diffstat för indata"
 
-#: builtin/apply.c:4541
+#: builtin/apply.c:4532
 msgid "show number of added and deleted lines in decimal notation"
 msgstr "visa antal tillagda och borttagna rader decimalt"
 
-#: builtin/apply.c:4543
+#: builtin/apply.c:4534
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "istället för att tillämpa patchen, skriv ut en summering av indata"
 
-#: builtin/apply.c:4545
+#: builtin/apply.c:4536
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "istället för att tillämpa patchen, se om patchen kan tillämpas"
 
-#: builtin/apply.c:4547
+#: builtin/apply.c:4538
 msgid "make sure the patch is applicable to the current index"
 msgstr "se till att patchen kan tillämpas på aktuellt index"
 
-#: builtin/apply.c:4549
+#: builtin/apply.c:4540
 msgid "apply a patch without touching the working tree"
 msgstr "tillämpa en patch utan att röra arbetskatalogen"
 
-#: builtin/apply.c:4551
+#: builtin/apply.c:4542
 msgid "accept a patch that touches outside the working area"
 msgstr "godta en patch som rör filer utanför arbetskatalogen"
 
-#: builtin/apply.c:4553
+#: builtin/apply.c:4544
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr "tillämpa också patchen (använd med --stat/--summary/--check)"
 
-#: builtin/apply.c:4555
+#: builtin/apply.c:4546
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "försök en trevägssammanslagning om patchen inte kan tillämpas"
 
-#: builtin/apply.c:4557
+#: builtin/apply.c:4548
 msgid "build a temporary index based on embedded index information"
 msgstr "bygg ett temporärt index baserat på inbyggd indexinformation"
 
-#: builtin/apply.c:4559 builtin/checkout-index.c:198 builtin/ls-files.c:412
+#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412
 msgid "paths are separated with NUL character"
 msgstr "sökvägar avdelas med NUL-tecken"
 
-#: builtin/apply.c:4562
+#: builtin/apply.c:4553
 msgid "ensure at least <n> lines of context match"
 msgstr "se till att åtminstone <n> rader sammanhang är lika"
 
-#: builtin/apply.c:4564
+#: builtin/apply.c:4555
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "detektera nya eller ändrade rader som har fel i blanktecken"
 
-#: builtin/apply.c:4567 builtin/apply.c:4570
+#: builtin/apply.c:4558 builtin/apply.c:4561
 msgid "ignore changes in whitespace when finding context"
 msgstr "ignorera ändringar i blanktecken för sammanhang"
 
-#: builtin/apply.c:4573
+#: builtin/apply.c:4564
 msgid "apply the patch in reverse"
 msgstr "tillämpa patchen baklänges"
 
-#: builtin/apply.c:4575
+#: builtin/apply.c:4566
 msgid "don't expect at least one line of context"
 msgstr "förvänta inte minst en rad sammanhang"
 
-#: builtin/apply.c:4577
+#: builtin/apply.c:4568
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "lämna refuserade stycken i motsvarande *.rej-filer"
 
-#: builtin/apply.c:4579
+#: builtin/apply.c:4570
 msgid "allow overlapping hunks"
 msgstr "tillåt överlappande stycken"
 
-#: builtin/apply.c:4582
+#: builtin/apply.c:4573
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr "tolerera felaktigt detekterade saknade nyradstecken vid filslut"
 
-#: builtin/apply.c:4585
+#: builtin/apply.c:4576
 msgid "do not trust the line counts in the hunk headers"
 msgstr "lite inte på antalet linjer i styckehuvuden"
 
-#: builtin/apply.c:4588
+#: builtin/apply.c:4579
 msgid "prepend <root> to all filenames"
 msgstr "lägg till <rot> i alla filnamn"
 
-#: builtin/apply.c:4610
+#: builtin/apply.c:4601
 msgid "--3way outside a repository"
 msgstr "--3way utanför arkiv"
 
-#: builtin/apply.c:4618
+#: builtin/apply.c:4609
 msgid "--index outside a repository"
 msgstr "--index utanför arkiv"
 
-#: builtin/apply.c:4621
+#: builtin/apply.c:4612
 msgid "--cached outside a repository"
 msgstr "--cached utanför arkiv"
 
-#: builtin/apply.c:4640
+#: builtin/apply.c:4631
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "kan inte öppna patchen \"%s\""
 
-#: builtin/apply.c:4654
+#: builtin/apply.c:4645
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "undertryckte %d fel i blanksteg"
 msgstr[1] "undertryckte %d fel i blanksteg"
 
-#: builtin/apply.c:4660 builtin/apply.c:4670
+#: builtin/apply.c:4651 builtin/apply.c:4661
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -3206,95 +3254,95 @@
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<rev-flaggor> dokumenteras i git-rev-list(1)"
 
-#: builtin/blame.c:2500
+#: builtin/blame.c:2519
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Visa klandringsposter när vi hittar dem, interaktivt"
 
-#: builtin/blame.c:2501
+#: builtin/blame.c:2520
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "Visa blank SHA-1 för gränsincheckningar (Standard: av)"
 
-#: builtin/blame.c:2502
+#: builtin/blame.c:2521
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Behandla inte rotincheckningar som gränser (Standard: av)"
 
-#: builtin/blame.c:2503
+#: builtin/blame.c:2522
 msgid "Show work cost statistics"
 msgstr "Visa statistik över arbetskostnad"
 
-#: builtin/blame.c:2504
+#: builtin/blame.c:2523
 msgid "Show output score for blame entries"
 msgstr "Visa utdatapoäng för klandringsposter"
 
-#: builtin/blame.c:2505
+#: builtin/blame.c:2524
 msgid "Show original filename (Default: auto)"
 msgstr "Visa originalfilnamn (Standard: auto)"
 
-#: builtin/blame.c:2506
+#: builtin/blame.c:2525
 msgid "Show original linenumber (Default: off)"
 msgstr "Visa ursprungligt radnummer (Standard: av)"
 
-#: builtin/blame.c:2507
+#: builtin/blame.c:2526
 msgid "Show in a format designed for machine consumption"
 msgstr "Visa i ett format avsett för maskinkonsumtion"
 
-#: builtin/blame.c:2508
+#: builtin/blame.c:2527
 msgid "Show porcelain format with per-line commit information"
 msgstr "Visa porslinsformat med per-rad-incheckningsinformation"
 
-#: builtin/blame.c:2509
+#: builtin/blame.c:2528
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Använd samma utdataläge som git-annotate (Standard: av)"
 
-#: builtin/blame.c:2510
+#: builtin/blame.c:2529
 msgid "Show raw timestamp (Default: off)"
 msgstr "Visa rå tidsstämpel (Standard: av)"
 
-#: builtin/blame.c:2511
+#: builtin/blame.c:2530
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Visa lång inchecknings-SHA1 (Standard: av)"
 
-#: builtin/blame.c:2512
+#: builtin/blame.c:2531
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Undertryck författarnamn och tidsstämpel (Standard: av)"
 
-#: builtin/blame.c:2513
+#: builtin/blame.c:2532
 msgid "Show author email instead of name (Default: off)"
 msgstr "Visa författarens e-post istället för namn (Standard: av)"
 
-#: builtin/blame.c:2514
+#: builtin/blame.c:2533
 msgid "Ignore whitespace differences"
 msgstr "Ignorera ändringar i blanksteg"
 
-#: builtin/blame.c:2515
+#: builtin/blame.c:2534
 msgid "Spend extra cycles to find better match"
 msgstr "Slösa extra cykler med att hitta bättre träff"
 
-#: builtin/blame.c:2516
+#: builtin/blame.c:2535
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Använd revisioner från <fil> istället för att anropa git-rev-list"
 
-#: builtin/blame.c:2517
+#: builtin/blame.c:2536
 msgid "Use <file>'s contents as the final image"
 msgstr "Använd <fil>s innehåll som slutgiltig bild"
 
-#: builtin/blame.c:2518 builtin/blame.c:2519
+#: builtin/blame.c:2537 builtin/blame.c:2538
 msgid "score"
 msgstr "poäng"
 
-#: builtin/blame.c:2518
+#: builtin/blame.c:2537
 msgid "Find line copies within and across files"
 msgstr "Hitta kopierade rader inuti och mellan filer"
 
-#: builtin/blame.c:2519
+#: builtin/blame.c:2538
 msgid "Find line movements within and across files"
 msgstr "Hitta flyttade rader inuti och mellan filer"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "Process only line range n,m, counting from 1"
 msgstr "Behandla endast radintervallet n,m, med början på 1"
 
@@ -3304,27 +3352,31 @@
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2601
+#: builtin/blame.c:2620
 msgid "4 years, 11 months ago"
 msgstr "4 år, 11 månader sedan"
 
-#: builtin/branch.c:24
+#: builtin/branch.c:25
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<flaggor>] [-r | -a] [--merged | --no-merged]"
 
-#: builtin/branch.c:25
+#: builtin/branch.c:26
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<flaggor>] [-l] [-f] <grennamn> [<startpunkt>]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<flaggor>] [-r] (-d | -D) <grennamn>..."
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [<flaggor>] (-m | -M) [<gammal_gren>] <ny_gren>"
 
-#: builtin/branch.c:150
+#: builtin/branch.c:29
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr "git branch [<flaggor>] [-r | -a] [--points-at]"
+
+#: builtin/branch.c:142
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -3333,7 +3385,7 @@
 "tar bort grenen \"%s\" som har slagits ihop med\n"
 "         \"%s\", men ännu inte slagits ihop med HEAD."
 
-#: builtin/branch.c:154
+#: builtin/branch.c:146
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -3342,12 +3394,12 @@
 "tar inte bort grenen \"%s\" som inte har slagits ihop med\n"
 "         \"%s\", trots att den har slagits ihop med HEAD."
 
-#: builtin/branch.c:168
+#: builtin/branch.c:160
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Kunde inte slå upp incheckningsobjekt för \"%s\""
 
-#: builtin/branch.c:172
+#: builtin/branch.c:164
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -3356,348 +3408,340 @@
 "Grenen \"%s\" har inte slagits samman i sin helhet.\n"
 "Om du är säker på att du vill ta bort den, kör \"git branch -D %s\"."
 
-#: builtin/branch.c:185
+#: builtin/branch.c:177
 msgid "Update of config-file failed"
 msgstr "Misslyckades uppdatera konfigurationsfil"
 
-#: builtin/branch.c:213
+#: builtin/branch.c:205
 msgid "cannot use -a with -d"
 msgstr "kan inte ange -a med -d"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:211
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Kunde inte slå upp incheckningsobjekt för HEAD"
 
-#: builtin/branch.c:227
+#: builtin/branch.c:219
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr "Kan inte ta bort grenen \"%s\" som du befinner dig på för närvarande."
 
-#: builtin/branch.c:243
+#: builtin/branch.c:235
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "fjärrspårande grenen \"%s\" hittades inte."
 
-#: builtin/branch.c:244
+#: builtin/branch.c:236
 #, c-format
 msgid "branch '%s' not found."
 msgstr "grenen \"%s\" hittades inte."
 
-#: builtin/branch.c:259
+#: builtin/branch.c:251
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Fel vid borttagning av fjärrspårande grenen \"%s\""
 
-#: builtin/branch.c:260
+#: builtin/branch.c:252
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Fel vid borttagning av grenen \"%s\""
 
-#: builtin/branch.c:267
+#: builtin/branch.c:259
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Tog bort fjärrspårande grenen %s (var %s).\n"
 
-#: builtin/branch.c:268
+#: builtin/branch.c:260
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Tog bort grenen %s (var %s).\n"
 
-#: builtin/branch.c:369
-#, c-format
-msgid "branch '%s' does not point at a commit"
-msgstr "grenen \"%s\" pekar inte på en incheckning"
-
-#: builtin/branch.c:452
+#: builtin/branch.c:303
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: försvunnen]"
 
-#: builtin/branch.c:457
+#: builtin/branch.c:308
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:462
+#: builtin/branch.c:313
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: bakom %d] "
 
-#: builtin/branch.c:464
+#: builtin/branch.c:315
 #, c-format
 msgid "[behind %d]"
 msgstr "[bakom %d] "
 
-#: builtin/branch.c:468
+#: builtin/branch.c:319
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: före %d] "
 
-#: builtin/branch.c:470
+#: builtin/branch.c:321
 #, c-format
 msgid "[ahead %d]"
 msgstr "[före %d] "
 
-#: builtin/branch.c:473
+#: builtin/branch.c:324
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: före %d, bakom %d] "
 
-#: builtin/branch.c:476
+#: builtin/branch.c:327
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[före %d, bakom %d] "
 
-#: builtin/branch.c:489
+#: builtin/branch.c:340
 msgid " **** invalid ref ****"
 msgstr " **** ogiltig ref ****"
 
-#: builtin/branch.c:580
+#: builtin/branch.c:366
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(ingen gren, ombaserar %s)"
 
-#: builtin/branch.c:583
+#: builtin/branch.c:369
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(ingen gren, \"bisect\" startad på %s)"
 
-#: builtin/branch.c:589
+#: builtin/branch.c:375
 #, c-format
 msgid "(HEAD detached at %s)"
 msgstr "(HEAD frånkopplat vid %s)"
 
-#: builtin/branch.c:592
+#: builtin/branch.c:378
 #, c-format
 msgid "(HEAD detached from %s)"
 msgstr "(HEAD frånkopplat från %s)"
 
-#: builtin/branch.c:596
+#: builtin/branch.c:382
 msgid "(no branch)"
 msgstr "(ingen gren)"
 
-#: builtin/branch.c:643
-#, c-format
-msgid "object '%s' does not point to a commit"
-msgstr "objektet \"%s\" pekar på en incheckning"
-
-#: builtin/branch.c:691
-msgid "some refs could not be read"
-msgstr "vissa referenser kunde inte läsas"
-
-#: builtin/branch.c:704
+#: builtin/branch.c:524
 msgid "cannot rename the current branch while not on any."
 msgstr ""
 "kunde inte byta namn på aktuell gren när du inte befinner dig på någon."
 
-#: builtin/branch.c:714
+#: builtin/branch.c:534
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Felaktigt namn på gren: \"%s\""
 
-#: builtin/branch.c:729
+#: builtin/branch.c:549
 msgid "Branch rename failed"
 msgstr "Misslyckades byta namn på gren"
 
-#: builtin/branch.c:733
+#: builtin/branch.c:553
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Bytte bort namn på en felaktigt namngiven gren \"%s\""
 
-#: builtin/branch.c:737
+#: builtin/branch.c:557
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Grenen namnbytt till %s, men HEAD har inte uppdaterats!"
 
-#: builtin/branch.c:744
+#: builtin/branch.c:564
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "Grenen namnbytt, men misslyckades uppdatera konfigurationsfilen"
 
-#: builtin/branch.c:759
-#, c-format
-msgid "malformed object name %s"
-msgstr "felformat objektnamn %s"
-
-#: builtin/branch.c:781
+#: builtin/branch.c:587
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr "kunde inte skriva grenbeskrivningsmall: %s"
 
-#: builtin/branch.c:811
+#: builtin/branch.c:616
 msgid "Generic options"
 msgstr "Allmänna flaggor"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:618
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "visa hash och ärenderad, ange två gånger för uppströmsgren"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:619
 msgid "suppress informational messages"
 msgstr "undertryck informationsmeddelanden"
 
-#: builtin/branch.c:815
+#: builtin/branch.c:620
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "ställ in spårningsläge (se git-pull(1))"
 
-#: builtin/branch.c:817
+#: builtin/branch.c:622
 msgid "change upstream info"
 msgstr "ändra uppströmsinformation"
 
-#: builtin/branch.c:821
+#: builtin/branch.c:626
 msgid "use colored output"
 msgstr "använd färgad utdata"
 
-#: builtin/branch.c:822
+#: builtin/branch.c:627
 msgid "act on remote-tracking branches"
 msgstr "arbeta på fjärrspårande grenar"
 
-#: builtin/branch.c:825 builtin/branch.c:831 builtin/branch.c:852
-#: builtin/branch.c:858 builtin/commit.c:1580 builtin/commit.c:1581
-#: builtin/commit.c:1582 builtin/commit.c:1583 builtin/tag.c:618
-#: builtin/tag.c:624
-msgid "commit"
-msgstr "incheckning"
-
-#: builtin/branch.c:826 builtin/branch.c:832
+#: builtin/branch.c:629 builtin/branch.c:630
 msgid "print only branches that contain the commit"
 msgstr "visa endast grenar som innehåller incheckningen"
 
-#: builtin/branch.c:838
+#: builtin/branch.c:633
 msgid "Specific git-branch actions:"
 msgstr "Specifika git-branch-åtgärder:"
 
-#: builtin/branch.c:839
+#: builtin/branch.c:634
 msgid "list both remote-tracking and local branches"
 msgstr "visa både fjärrspårande och lokala grenar"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:636
 msgid "delete fully merged branch"
 msgstr "ta bort helt sammanslagen gren"
 
-#: builtin/branch.c:842
+#: builtin/branch.c:637
 msgid "delete branch (even if not merged)"
 msgstr "ta bort gren (även om inte helt sammanslagen)"
 
-#: builtin/branch.c:843
+#: builtin/branch.c:638
 msgid "move/rename a branch and its reflog"
 msgstr "flytta/ta bort en gren och dess reflogg"
 
-#: builtin/branch.c:844
+#: builtin/branch.c:639
 msgid "move/rename a branch, even if target exists"
 msgstr "flytta/ta bort en gren, även om målet finns"
 
-#: builtin/branch.c:845
+#: builtin/branch.c:640
 msgid "list branch names"
 msgstr "lista namn på grenar"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:641
 msgid "create the branch's reflog"
 msgstr "skapa grenens reflogg"
 
-#: builtin/branch.c:848
+#: builtin/branch.c:643
 msgid "edit the description for the branch"
 msgstr "redigera beskrivning för grenen"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:644
 msgid "force creation, move/rename, deletion"
 msgstr "tvinga skapande, flytt/namnändring, borttagande"
 
-#: builtin/branch.c:852
-msgid "print only not merged branches"
-msgstr "visa endast ej sammanslagna grenar"
-
-#: builtin/branch.c:858
-msgid "print only merged branches"
+#: builtin/branch.c:645
+msgid "print only branches that are merged"
 msgstr "visa endast sammanslagna grenar"
 
-#: builtin/branch.c:862
+#: builtin/branch.c:646
+msgid "print only branches that are not merged"
+msgstr "visa endast ej sammanslagna grenar"
+
+#: builtin/branch.c:647
 msgid "list branches in columns"
 msgstr "visa grenar i spalter"
 
-#: builtin/branch.c:875
+#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
+msgstr "nyckel"
+
+#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
+msgstr "fältnamn att sortera på"
+
+#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398
+#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564
+#: builtin/tag.c:369
+msgid "object"
+msgstr "objekt"
+
+#: builtin/branch.c:652
+msgid "print only branches of the object"
+msgstr "visa endast grenar för objektet"
+
+#: builtin/branch.c:670
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Misslyckades slå upp HEAD som giltig referens"
 
-#: builtin/branch.c:879 builtin/clone.c:690
+#: builtin/branch.c:674 builtin/clone.c:697
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD hittades inte under refs/heads!"
 
-#: builtin/branch.c:901
+#: builtin/branch.c:694
 msgid "--column and --verbose are incompatible"
 msgstr "--column och --verbose är inkompatibla"
 
-#: builtin/branch.c:912 builtin/branch.c:951
+#: builtin/branch.c:705 builtin/branch.c:747
 msgid "branch name required"
 msgstr "grennamn krävs"
 
-#: builtin/branch.c:927
+#: builtin/branch.c:723
 msgid "Cannot give description to detached HEAD"
 msgstr "Kan inte beskriva frånkopplad HEAD"
 
-#: builtin/branch.c:932
+#: builtin/branch.c:728
 msgid "cannot edit description of more than one branch"
 msgstr "kan inte redigera beskrivning för mer än en gren"
 
-#: builtin/branch.c:939
+#: builtin/branch.c:735
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Inga incheckningar på grenen \"%s\" ännu"
 
-#: builtin/branch.c:942
+#: builtin/branch.c:738
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Ingen gren vid namnet \"%s\"."
 
-#: builtin/branch.c:957
+#: builtin/branch.c:753
 msgid "too many branches for a rename operation"
 msgstr "för många grenar för namnbyte"
 
-#: builtin/branch.c:962
+#: builtin/branch.c:758
 msgid "too many branches to set new upstream"
 msgstr "för många grenar för att byta uppström"
 
-#: builtin/branch.c:966
+#: builtin/branch.c:762
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr ""
 "kunde inte sätta uppström för HEAD till %s när det inte pekar mot någon gren."
 
-#: builtin/branch.c:969 builtin/branch.c:991 builtin/branch.c:1012
+#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808
 #, c-format
 msgid "no such branch '%s'"
 msgstr "okänd gren \"%s\""
 
-#: builtin/branch.c:973
+#: builtin/branch.c:769
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "grenen \"%s\" finns inte"
 
-#: builtin/branch.c:985
+#: builtin/branch.c:781
 msgid "too many branches to unset upstream"
 msgstr "för många grenar för att ta bort uppström"
 
-#: builtin/branch.c:989
+#: builtin/branch.c:785
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "kunde inte ta bort uppström för HEAD när det inte pekar mot någon gren."
 
-#: builtin/branch.c:995
+#: builtin/branch.c:791
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Grenen \"%s\" har ingen uppströmsinformation"
 
-#: builtin/branch.c:1009
+#: builtin/branch.c:805
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "kan inte skapa \"HEAD\" manuellt"
 
-#: builtin/branch.c:1015
+#: builtin/branch.c:811
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "flaggorna -a och -r på \"git branch\" kan inte anges tillsammans med ett "
 "grennamn"
 
-#: builtin/branch.c:1018
+#: builtin/branch.c:814
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3706,7 +3750,7 @@
 "Flaggan --set-upstream rekommenderas ej och kommer tas bort. Använd --track "
 "eller --set-upstream-to\n"
 
-#: builtin/branch.c:1035
+#: builtin/branch.c:831
 #, c-format
 msgid ""
 "\n"
@@ -3717,12 +3761,12 @@
 "Om du vill göra så att \"%s\" spårar \"%s\" gör du så här:\n"
 "\n"
 
-#: builtin/branch.c:1036
+#: builtin/branch.c:832
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr "    git branch -d %s\n"
 
-#: builtin/branch.c:1037
+#: builtin/branch.c:833
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr "    git branch --set-upstream-to %s\n"
@@ -3749,11 +3793,8 @@
 "<typ>|--textconv) <objekt>"
 
 #: builtin/cat-file.c:429
-msgid ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <list-of-"
-"objects>"
-msgstr ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <objektlista>"
+msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
 
 #: builtin/cat-file.c:466
 msgid "<type> can be one of: blob, tree, commit, tag"
@@ -3809,8 +3850,8 @@
 msgstr "git check-attr [-a | --all | <attr>...] [--] <sökväg>..."
 
 #: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...] < <list-of-paths>"
-msgstr "git check-attr --stdin [-z] [-a | --all | <attr>...] < <sökvägslista>"
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+msgstr "git check-attr --stdin [-z] [-a | --all | <attr>...]"
 
 #: builtin/check-attr.c:19
 msgid "report all attributes set on file"
@@ -3828,7 +3869,7 @@
 msgid "terminate input and output records by a NUL character"
 msgstr "avsluta in- och utdataposter med NUL-tecken"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1133 builtin/gc.c:267
+#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "undertryck förloppsrapportering"
 
@@ -3914,6 +3955,8 @@
 msgstr "skriv innehåll till temporära filer"
 
 #: builtin/checkout-index.c:204 builtin/column.c:30
+#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181
 msgid "string"
 msgstr "sträng"
 
@@ -3933,105 +3976,105 @@
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<flaggor>] [<gren>] -- <fil>..."
 
-#: builtin/checkout.c:133 builtin/checkout.c:166
+#: builtin/checkout.c:134 builtin/checkout.c:167
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "sökvägen \"%s\" har inte vår version"
 
-#: builtin/checkout.c:135 builtin/checkout.c:168
+#: builtin/checkout.c:136 builtin/checkout.c:169
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "sökvägen \"%s\" har inte deras version"
 
-#: builtin/checkout.c:151
+#: builtin/checkout.c:152
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "sökvägen \"%s\" innehåller inte alla nödvändiga versioner"
 
-#: builtin/checkout.c:195
+#: builtin/checkout.c:196
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "sökvägen \"%s\" innehåller inte nödvändiga versioner"
 
-#: builtin/checkout.c:212
+#: builtin/checkout.c:213
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "sökväg \"%s\": kan inte slå ihop"
 
-#: builtin/checkout.c:229
+#: builtin/checkout.c:230
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "Kunde inte lägga till sammanslagningsresultat för \"%s\""
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
+#: builtin/checkout.c:260
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "\"%s\" kan inte användas vid uppdatering av sökvägar"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:263 builtin/checkout.c:266
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "\"%s\" kan inte användas med %s"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:269
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr "Kan inte uppdatera sökvägar och växla till grenen \"%s\" samtidigt."
 
-#: builtin/checkout.c:279 builtin/checkout.c:473
+#: builtin/checkout.c:280 builtin/checkout.c:474
 msgid "corrupt index file"
 msgstr "indexfilen är trasig"
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:340 builtin/checkout.c:347
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "sökvägen \"%s\" har inte slagits ihop"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:496
 msgid "you need to resolve your current index first"
 msgstr "du måste lösa ditt befintliga index först"
 
-#: builtin/checkout.c:622
+#: builtin/checkout.c:623
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Kan inte skapa referenslogg för \"%s\": %s\n"
 
-#: builtin/checkout.c:660
+#: builtin/checkout.c:661
 msgid "HEAD is now at"
 msgstr "HEAD är nu på"
 
-#: builtin/checkout.c:667
+#: builtin/checkout.c:668
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Återställ gren \"%s\"\n"
 
-#: builtin/checkout.c:670
+#: builtin/checkout.c:671
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Redan på \"%s\"\n"
 
-#: builtin/checkout.c:674
+#: builtin/checkout.c:675
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Växlade till och nollställde grenen \"%s\"\n"
 
-#: builtin/checkout.c:676 builtin/checkout.c:1065
+#: builtin/checkout.c:677 builtin/checkout.c:1066
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Växlade till en ny gren \"%s\"\n"
 
-#: builtin/checkout.c:678
+#: builtin/checkout.c:679
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Växlade till grenen \"%s\"\n"
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:731
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... och %d till.\n"
 
-#: builtin/checkout.c:736
+#: builtin/checkout.c:737
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4054,7 +4097,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:755
+#: builtin/checkout.c:756
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -4081,145 +4124,151 @@
 " git branch <nytt_grennamn> %s\n"
 "\n"
 
-#: builtin/checkout.c:791
+#: builtin/checkout.c:792
 msgid "internal error in revision walk"
 msgstr "internt fel vid genomgång av revisioner (revision walk)"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:796
 msgid "Previous HEAD position was"
 msgstr "Tidigare position för HEAD var"
 
-#: builtin/checkout.c:822 builtin/checkout.c:1060
+#: builtin/checkout.c:823 builtin/checkout.c:1061
 msgid "You are on a branch yet to be born"
 msgstr "Du är på en gren som ännu inte är född"
 
-#: builtin/checkout.c:967
+#: builtin/checkout.c:968
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "endast en referens förväntades, %d gavs."
 
-#: builtin/checkout.c:1006 builtin/worktree.c:210
+#: builtin/checkout.c:1007 builtin/worktree.c:213
 #, c-format
 msgid "invalid reference: %s"
 msgstr "felaktig referens: %s"
 
-#: builtin/checkout.c:1035
+#: builtin/checkout.c:1036
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "referensen är inte ett träd: %s"
 
-#: builtin/checkout.c:1074
+#: builtin/checkout.c:1075
 msgid "paths cannot be used with switching branches"
 msgstr "sökvägar kan inte användas vid byte av gren"
 
-#: builtin/checkout.c:1077 builtin/checkout.c:1081
+#: builtin/checkout.c:1078 builtin/checkout.c:1082
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "\"%s\" kan inte användas vid byte av gren"
 
-#: builtin/checkout.c:1085 builtin/checkout.c:1088 builtin/checkout.c:1093
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094
+#: builtin/checkout.c:1097
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "\"%s\" kan inte användas med \"%s\""
 
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1102
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Kan inte växla gren till icke-incheckningen \"%s\""
 
-#: builtin/checkout.c:1134 builtin/checkout.c:1136 builtin/clone.c:83
-#: builtin/remote.c:159 builtin/remote.c:161 builtin/worktree.c:317
-#: builtin/worktree.c:319
+#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320
+#: builtin/worktree.c:322
 msgid "branch"
 msgstr "gren"
 
-#: builtin/checkout.c:1135
+#: builtin/checkout.c:1136
 msgid "create and checkout a new branch"
 msgstr "skapa och checka ut en ny gren"
 
-#: builtin/checkout.c:1137
+#: builtin/checkout.c:1138
 msgid "create/reset and checkout a branch"
 msgstr "skapa/nollställ och checka ut en gren"
 
-#: builtin/checkout.c:1138
+#: builtin/checkout.c:1139
 msgid "create reflog for new branch"
 msgstr "skapa reflogg för ny gren"
 
-#: builtin/checkout.c:1139
+#: builtin/checkout.c:1140
 msgid "detach the HEAD at named commit"
 msgstr "koppla från HEAD vid namngiven incheckning"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "set upstream info for new branch"
 msgstr "sätt uppströmsinformation för ny gren"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new-branch"
 msgstr "ny-gren"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new unparented branch"
 msgstr "ny gren utan förälder"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "checkout our version for unmerged files"
 msgstr "checka ut vår version för ej sammanslagna filer"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "checkout their version for unmerged files"
 msgstr "checka ut deras version för ej sammanslagna filer"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1148
 msgid "force checkout (throw away local modifications)"
 msgstr "tvinga utcheckning (kasta bort lokala ändringar)"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "perform a 3-way merge with the new branch"
 msgstr "utför en 3-vägssammanslagning för den nya grenen"
 
-#: builtin/checkout.c:1149 builtin/merge.c:227
+#: builtin/checkout.c:1150 builtin/merge.c:227
 msgid "update ignored files (default)"
 msgstr "uppdatera ignorerade filer (standard)"
 
-#: builtin/checkout.c:1150 builtin/log.c:1264 parse-options.h:249
+#: builtin/checkout.c:1151 builtin/log.c:1266 parse-options.h:250
 msgid "style"
 msgstr "stil"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "conflict style (merge or diff3)"
 msgstr "konfliktstil (merge eller diff3)"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "begränsa inte sökvägar till endast glesa poster"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1157
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "förutspå \"git checkout <gren-saknas>\""
 
-#: builtin/checkout.c:1158
+#: builtin/checkout.c:1159
 msgid "do not check if another worktree is holding the given ref"
 msgstr ""
 "kontrollera inte om en annan arbetskatalog håller den angivna referensen"
 
-#: builtin/checkout.c:1181
+#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112
+#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:558
+#: builtin/send-pack.c:168
+msgid "force progress reporting"
+msgstr "tvinga förloppsrapportering"
+
+#: builtin/checkout.c:1191
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B och --orphan är ömsesidigt uteslutande"
 
-#: builtin/checkout.c:1198
+#: builtin/checkout.c:1208
 msgid "--track needs a branch name"
 msgstr "--track behöver ett namn på en gren"
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1213
 msgid "Missing branch name; try -b"
 msgstr "Grennamn saknas; försök med -b"
 
-#: builtin/checkout.c:1239
+#: builtin/checkout.c:1249
 msgid "invalid path specification"
 msgstr "felaktig sökvägsangivelse"
 
-#: builtin/checkout.c:1246
+#: builtin/checkout.c:1256
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4228,12 +4277,12 @@
 "Kan inte uppdatera sökvägar och växla till grenen \"%s\" samtidigt.\n"
 "Ville du checka ut \"%s\" som inte kan lösas som en utcheckning?"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1261
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach tar inte en sökväg som argument \"%s\""
 
-#: builtin/checkout.c:1255
+#: builtin/checkout.c:1265
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4273,7 +4322,7 @@
 msgid "failed to remove %s"
 msgstr "misslyckades ta bort %s"
 
-#: builtin/clean.c:317
+#: builtin/clean.c:315
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -4285,7 +4334,7 @@
 "foo        - markera post baserad på unikt prefix\n"
 "           - (tomt) markera ingenting"
 
-#: builtin/clean.c:321
+#: builtin/clean.c:319
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -4305,36 +4354,36 @@
 "*          - välj alla poster\n"
 "           - (tomt) avsluta markering"
 
-#: builtin/clean.c:537
+#: builtin/clean.c:535
 #, c-format
 msgid "Huh (%s)?"
 msgstr "Vadå (%s)?"
 
-#: builtin/clean.c:679
+#: builtin/clean.c:677
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Ange ignoreringsmönster>>"
 
-#: builtin/clean.c:716
+#: builtin/clean.c:714
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "VARNING: Hittar inte poster som motsvarar: %s"
 
-#: builtin/clean.c:737
+#: builtin/clean.c:735
 msgid "Select items to delete"
 msgstr "Välj poster att ta bort"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:778
+#: builtin/clean.c:776
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "Ta bort %s [Y=ja / N=nej]?"
 
-#: builtin/clean.c:803
+#: builtin/clean.c:801
 msgid "Bye."
 msgstr "Hej då."
 
-#: builtin/clean.c:811
+#: builtin/clean.c:809
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -4352,62 +4401,62 @@
 "help                - denna skärm\n"
 "?                   - hjälp för kommandoval"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:836
 msgid "*** Commands ***"
 msgstr "*** Kommandon ***"
 
-#: builtin/clean.c:839
+#: builtin/clean.c:837
 msgid "What now"
 msgstr "Vad nu"
 
-#: builtin/clean.c:847
+#: builtin/clean.c:845
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Skulle ta bort följande post:"
 msgstr[1] "Skulle ta bort följande poster:"
 
-#: builtin/clean.c:864
+#: builtin/clean.c:862
 msgid "No more files to clean, exiting."
 msgstr "Inga fler filer att städa, avslutar."
 
-#: builtin/clean.c:895
+#: builtin/clean.c:893
 msgid "do not print names of files removed"
 msgstr "skriv inte ut namn på borttagna filer"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:895
 msgid "force"
 msgstr "tvinga"
 
-#: builtin/clean.c:898
+#: builtin/clean.c:896
 msgid "interactive cleaning"
 msgstr "städa interaktivt"
 
-#: builtin/clean.c:900
+#: builtin/clean.c:898
 msgid "remove whole directories"
 msgstr "ta bort hela kataloger"
 
-#: builtin/clean.c:901 builtin/describe.c:407 builtin/grep.c:714
-#: builtin/ls-files.c:443 builtin/name-rev.c:311 builtin/show-ref.c:187
+#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709
+#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182
 msgid "pattern"
 msgstr "mönster"
 
-#: builtin/clean.c:902
+#: builtin/clean.c:900
 msgid "add <pattern> to ignore rules"
 msgstr "lägg till <mönster> till ignoreringsregler"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:901
 msgid "remove ignored files, too"
 msgstr "ta även bort ignorerade filer"
 
-#: builtin/clean.c:905
+#: builtin/clean.c:903
 msgid "remove only ignored files"
 msgstr "ta endast bort ignorerade filer"
 
-#: builtin/clean.c:923
+#: builtin/clean.c:921
 msgid "-x and -X cannot be used together"
 msgstr "-x och -X kan inte användas samtidigt"
 
-#: builtin/clean.c:927
+#: builtin/clean.c:925
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -4415,7 +4464,7 @@
 "clean.requireForce satt till true, men varken -i, -n eller -f angavs; vägrar "
 "städa"
 
-#: builtin/clean.c:930
+#: builtin/clean.c:928
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -4427,16 +4476,11 @@
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<flaggor>] [--] <arkiv> [<kat>]"
 
-#: builtin/clone.c:57 builtin/fetch.c:112 builtin/merge.c:224
-#: builtin/pull.c:109 builtin/push.c:560 builtin/send-pack.c:168
-msgid "force progress reporting"
-msgstr "tvinga förloppsrapportering"
-
 #: builtin/clone.c:59
 msgid "don't create a checkout"
 msgstr "skapa inte någon utcheckning"
 
-#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:504
+#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469
 msgid "create a bare repository"
 msgstr "skapa ett naket (\"bare\") arkiv"
 
@@ -4460,15 +4504,15 @@
 msgid "initialize submodules in the clone"
 msgstr "initiera undermoduler i klonen"
 
-#: builtin/clone.c:75 builtin/init-db.c:501
+#: builtin/clone.c:75 builtin/init-db.c:466
 msgid "template-directory"
 msgstr "mallkatalog"
 
-#: builtin/clone.c:76 builtin/init-db.c:502
+#: builtin/clone.c:76 builtin/init-db.c:467
 msgid "directory from which templates will be used"
 msgstr "katalog att använda mallar från"
 
-#: builtin/clone.c:78
+#: builtin/clone.c:78 builtin/submodule--helper.c:179
 msgid "reference repository"
 msgstr "referensarkiv"
 
@@ -4492,7 +4536,7 @@
 msgid "path to git-upload-pack on the remote"
 msgstr "sökväg till git-upload-pack på fjärren"
 
-#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:659
+#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654
 #: builtin/pull.c:186
 msgid "depth"
 msgstr "djup"
@@ -4505,11 +4549,11 @@
 msgid "clone only one branch, HEAD or --branch"
 msgstr "klona endast en gren, HEAD eller --branch"
 
-#: builtin/clone.c:91 builtin/init-db.c:510
+#: builtin/clone.c:91 builtin/init-db.c:475
 msgid "gitdir"
 msgstr "gitkat"
 
-#: builtin/clone.c:92 builtin/init-db.c:511
+#: builtin/clone.c:92 builtin/init-db.c:476
 msgid "separate git dir from working tree"
 msgstr "separera gitkatalogen från arbetskatalogen"
 
@@ -4521,52 +4565,57 @@
 msgid "set config inside the new repository"
 msgstr "ställ in konfiguration i det nya arkivet"
 
-#: builtin/clone.c:298
+#: builtin/clone.c:300
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "referensarkivet \"%s\" som en länkad utcheckning stöds inte ännu."
+
+#: builtin/clone.c:302
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr "referensarkivet \"%s\" är inte ett lokalt arkiv."
 
-#: builtin/clone.c:302
+#: builtin/clone.c:307
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "referensarkivet \"%s\" är grunt"
 
-#: builtin/clone.c:305
+#: builtin/clone.c:310
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "referensarkivet \"%s\" är ympat"
 
-#: builtin/clone.c:370 builtin/diff.c:84
+#: builtin/clone.c:375 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "misslyckades ta status på \"%s\""
 
-#: builtin/clone.c:372
+#: builtin/clone.c:377
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s finns och är ingen katalog"
 
-#: builtin/clone.c:386
+#: builtin/clone.c:391
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "misslyckades ta status på %s\n"
 
-#: builtin/clone.c:408
+#: builtin/clone.c:413
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "misslyckades skapa länken \"%s\""
 
-#: builtin/clone.c:412
+#: builtin/clone.c:417
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "misslyckades kopiera filen till \"%s\""
 
-#: builtin/clone.c:435 builtin/clone.c:619
+#: builtin/clone.c:442 builtin/clone.c:626
 #, c-format
 msgid "done.\n"
 msgstr "klart.\n"
 
-#: builtin/clone.c:447
+#: builtin/clone.c:454
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -4576,124 +4625,120 @@
 "Du kan inspektera det som checkades ut med \"git status\"\n"
 "och försöka checka ut igen med \"git checkout -f HEAD\"\n"
 
-#: builtin/clone.c:524
+#: builtin/clone.c:531
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Kunde inte hitta fjärrgrenen %s för att klona."
 
 # Vague original, not networking-related, but rather related to the actual
 # objects downloaded.
-#: builtin/clone.c:614
+#: builtin/clone.c:621
 #, c-format
 msgid "Checking connectivity... "
 msgstr "Kontrollerar om vi fick alla objekt..."
 
-#: builtin/clone.c:617
+#: builtin/clone.c:624
 msgid "remote did not send all necessary objects"
 msgstr "fjärren sände inte alla nödvändiga objekt"
 
-#: builtin/clone.c:681
+#: builtin/clone.c:688
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "HEAD hos fjärren pekar på en obefintlig referens, kan inte checka ut.\n"
 
-#: builtin/clone.c:712
+#: builtin/clone.c:719
 msgid "unable to checkout working tree"
 msgstr "kunde inte checka ut arbetskatalogen"
 
-#: builtin/clone.c:799
+#: builtin/clone.c:808
 msgid "cannot repack to clean up"
 msgstr "kan inte packa om för att städa upp"
 
-#: builtin/clone.c:801
+#: builtin/clone.c:810
 msgid "cannot unlink temporary alternates file"
 msgstr "kunde inte ta bort temporär \"alternates\"-fil"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:842
 msgid "Too many arguments."
 msgstr "För många argument."
 
-#: builtin/clone.c:835
+#: builtin/clone.c:846
 msgid "You must specify a repository to clone."
 msgstr "Du måste ange ett arkiv att klona."
 
-#: builtin/clone.c:846
+#: builtin/clone.c:857
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "flaggorna --bare och --origin %s är inkompatibla."
 
-#: builtin/clone.c:849
+#: builtin/clone.c:860
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "flaggorna --bare och --separate-git-dir är inkompatibla."
 
-#: builtin/clone.c:862
+#: builtin/clone.c:873
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "arkivet \"%s\" finns inte"
 
-#: builtin/clone.c:868 builtin/fetch.c:1168
+#: builtin/clone.c:879 builtin/fetch.c:1166
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "djupet %s är inte ett positivt tal"
 
-#: builtin/clone.c:878
+#: builtin/clone.c:889
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "destinationssökvägen \"%s\" finns redan och är inte en tom katalog."
 
-#: builtin/clone.c:888
+#: builtin/clone.c:899
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "arbetsträdet \"%s\" finns redan."
 
-#: builtin/clone.c:903 builtin/clone.c:914 builtin/worktree.c:218
-#: builtin/worktree.c:245
+#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224
+#: builtin/worktree.c:221 builtin/worktree.c:248
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "kunde inte skapa inledande kataloger för \"%s\""
 
-#: builtin/clone.c:906
+#: builtin/clone.c:917
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "kunde inte skapa arbetskatalogen \"%s\""
 
-#: builtin/clone.c:924
+#: builtin/clone.c:935
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Klonar till ett naket arkiv \"%s\"...\n"
 
-#: builtin/clone.c:926
+#: builtin/clone.c:937
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Klonar till \"%s\"...\n"
 
-#: builtin/clone.c:951
-msgid "--dissociate given, but there is no --reference"
-msgstr "--dissociate angavs, men --reference har inte angivits"
-
-#: builtin/clone.c:968
+#: builtin/clone.c:975
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth ignoreras i lokala kloningar; använd file:// istället"
 
-#: builtin/clone.c:971
+#: builtin/clone.c:978
 msgid "source repository is shallow, ignoring --local"
 msgstr "källarkivet är grunt, ignorerar --local"
 
-#: builtin/clone.c:976
+#: builtin/clone.c:983
 msgid "--local is ignored"
 msgstr "--local ignoreras"
 
-#: builtin/clone.c:980
+#: builtin/clone.c:987
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Vet inte hur man klonar %s"
 
-#: builtin/clone.c:1029 builtin/clone.c:1037
+#: builtin/clone.c:1036 builtin/clone.c:1044
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Fjärrgrenen %s hittades inte i uppströmsarkivet %s"
 
-#: builtin/clone.c:1040
+#: builtin/clone.c:1047
 msgid "You appear to have cloned an empty repository."
 msgstr "Du verkar ha klonat ett tomt arkiv."
 
@@ -4729,15 +4774,15 @@
 msgid "--command must be the first argument"
 msgstr "--command måste vara första argument"
 
-#: builtin/commit.c:37
+#: builtin/commit.c:38
 msgid "git commit [<options>] [--] <pathspec>..."
 msgstr "git commit [<flaggor>] [--] <sökväg>..."
 
-#: builtin/commit.c:42
+#: builtin/commit.c:43
 msgid "git status [<options>] [--] <pathspec>..."
 msgstr "git status [<flaggor>] [--] <sökväg>..."
 
-#: builtin/commit.c:47
+#: builtin/commit.c:48
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4764,7 +4809,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:60
+#: builtin/commit.c:61
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4789,7 +4834,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:72
+#: builtin/commit.c:73
 msgid ""
 "You asked to amend the most recent commit, but doing so would make\n"
 "it empty. You can repeat your command with --allow-empty, or you can\n"
@@ -4799,7 +4844,7 @@
 "blir den tom. Du kan köra kommandot på nytt med --allow-empty, eller\n"
 "så kan du ta bort incheckningen helt med \"git reset HEAD^\".\n"
 
-#: builtin/commit.c:77
+#: builtin/commit.c:78
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4813,11 +4858,11 @@
 "    git commit --allow-empty\n"
 "\n"
 
-#: builtin/commit.c:84
+#: builtin/commit.c:85
 msgid "Otherwise, please use 'git reset'\n"
 msgstr "Använd annars \"git reset\"\n"
 
-#: builtin/commit.c:87
+#: builtin/commit.c:88
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4833,66 +4878,66 @@
 "\"git cherry-pick --continue\" kommer därefter att återuppta\n"
 "cherry-pick för återstående incheckningar.\n"
 
-#: builtin/commit.c:304
+#: builtin/commit.c:305
 msgid "failed to unpack HEAD tree object"
 msgstr "misslyckades packa upp HEAD:s trädobjekt"
 
-#: builtin/commit.c:345
+#: builtin/commit.c:346
 msgid "unable to create temporary index"
 msgstr "kunde inte skapa temporär indexfil"
 
-#: builtin/commit.c:351
+#: builtin/commit.c:352
 msgid "interactive add failed"
 msgstr "interaktiv tilläggning misslyckades"
 
-#: builtin/commit.c:364
+#: builtin/commit.c:365
 msgid "unable to update temporary index"
 msgstr "kan inte uppdatera temporärt index"
 
-#: builtin/commit.c:366
+#: builtin/commit.c:367
 msgid "Failed to update main cache tree"
 msgstr "Misslyckades uppdatera huvud-cacheträdet"
 
-#: builtin/commit.c:390 builtin/commit.c:413 builtin/commit.c:462
+#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
 msgid "unable to write new_index file"
 msgstr "kunde inte skriva filen new_index"
 
-#: builtin/commit.c:444
+#: builtin/commit.c:445
 msgid "cannot do a partial commit during a merge."
 msgstr "kan inte utföra en delvis incheckning under en sammanslagning."
 
-#: builtin/commit.c:446
+#: builtin/commit.c:447
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "kan inte utföra en delvis incheckning under en cherry-pick."
 
-#: builtin/commit.c:455
+#: builtin/commit.c:456
 msgid "cannot read the index"
 msgstr "kan inte läsa indexet"
 
-#: builtin/commit.c:474
+#: builtin/commit.c:475
 msgid "unable to write temporary index file"
 msgstr "kunde inte skriva temporär indexfil"
 
-#: builtin/commit.c:579
+#: builtin/commit.c:580
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "incheckningen \"%s\" saknar författarhuvud"
 
-#: builtin/commit.c:581
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "incheckningen \"%s\" har felformaterat författarhuvud"
 
-#: builtin/commit.c:600
+#: builtin/commit.c:601
 msgid "malformed --author parameter"
 msgstr "felformad \"--author\"-flagga"
 
-#: builtin/commit.c:608
+#: builtin/commit.c:609
 #, c-format
 msgid "invalid date format: %s"
 msgstr "felaktigt datumformat: %s"
 
-#: builtin/commit.c:652
+#: builtin/commit.c:653
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -4900,38 +4945,38 @@
 "kunde inte välja ett kommentarstecken som inte använts\n"
 "i det befintliga incheckningsmeddelandet"
 
-#: builtin/commit.c:689 builtin/commit.c:722 builtin/commit.c:1079
+#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "kunde inte slå upp incheckningen %s"
 
-#: builtin/commit.c:701 builtin/shortlog.c:273
+#: builtin/commit.c:702 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(läser loggmeddelande från standard in)\n"
 
-#: builtin/commit.c:703
+#: builtin/commit.c:704
 msgid "could not read log from standard input"
 msgstr "kunde inte läsa logg från standard in"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:708
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "kunde inte läsa loggfilen \"%s\""
 
-#: builtin/commit.c:729
+#: builtin/commit.c:730
 msgid "could not read MERGE_MSG"
 msgstr "kunde inte läsa MERGE_MSG"
 
-#: builtin/commit.c:733
+#: builtin/commit.c:734
 msgid "could not read SQUASH_MSG"
 msgstr "kunde inte läsa SQUASH_MSG"
 
-#: builtin/commit.c:784
+#: builtin/commit.c:785
 msgid "could not write commit template"
 msgstr "kunde inte skriva incheckningsmall"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:803
 #, c-format
 msgid ""
 "\n"
@@ -4946,7 +4991,7 @@
 "\t%s\n"
 "och försöker igen.\n"
 
-#: builtin/commit.c:807
+#: builtin/commit.c:808
 #, c-format
 msgid ""
 "\n"
@@ -4961,7 +5006,7 @@
 "\t%s\n"
 "och försöker igen.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:821
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4971,7 +5016,7 @@
 "med \"%c\" kommer ignoreras, och ett tomt meddelande avbryter "
 "incheckningen.\n"
 
-#: builtin/commit.c:827
+#: builtin/commit.c:828
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4982,145 +5027,146 @@
 "med \"%c\" kommer behållas; du kan själv ta bort dem om du vill.\n"
 "Ett tomt meddelande avbryter incheckningen.\n"
 
-#: builtin/commit.c:847
+#: builtin/commit.c:848
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sFörfattare: %.*s <%.*s>"
 
-#: builtin/commit.c:855
+#: builtin/commit.c:856
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sDatum:      %s"
 
-#: builtin/commit.c:862
+#: builtin/commit.c:863
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sIncheckare: %.*s <%.*s>"
 
-#: builtin/commit.c:880
+#: builtin/commit.c:881
 msgid "Cannot read index"
 msgstr "Kan inte läsa indexet"
 
-#: builtin/commit.c:937
+#: builtin/commit.c:938
 msgid "Error building trees"
 msgstr "Fel vid byggande av träd"
 
-#: builtin/commit.c:952 builtin/tag.c:495
+#: builtin/commit.c:953 builtin/tag.c:266
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Ange meddelandet en av flaggorna -m eller -F.\n"
 
-#: builtin/commit.c:1054
+#: builtin/commit.c:1055
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' är inte 'Namn <epost>' och matchar ingen befintlig författare"
 
-#: builtin/commit.c:1069 builtin/commit.c:1309
+#: builtin/commit.c:1070 builtin/commit.c:1310
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Ogiltigt läge för ospårade filer: \"%s\""
 
-#: builtin/commit.c:1106
+#: builtin/commit.c:1107
 msgid "--long and -z are incompatible"
 msgstr "--long och -z är inkompatibla"
 
-#: builtin/commit.c:1136
+#: builtin/commit.c:1137
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Kan inte använda både --reset-author och --author"
 
-#: builtin/commit.c:1145
+#: builtin/commit.c:1146
 msgid "You have nothing to amend."
 msgstr "Du har inget att utöka."
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1149
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Du är i mitten av en sammanslagning -- kan inte utöka."
 
-#: builtin/commit.c:1150
+#: builtin/commit.c:1151
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "Du är i mitten av en cherry-pick -- kan inte utöka."
 
-#: builtin/commit.c:1153
+#: builtin/commit.c:1154
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Flaggorna --squash och --fixup kan inte användas samtidigt"
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1164
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Endast en av -c/-C/-F/--fixup kan användas."
 
-#: builtin/commit.c:1165
+#: builtin/commit.c:1166
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Flaggan -m kan inte kombineras med -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1173
+#: builtin/commit.c:1174
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author kan endast användas med -C, -c eller --amend."
 
-#: builtin/commit.c:1190
+#: builtin/commit.c:1191
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Endast en av --include/--only/--all/--interactive/--patch kan användas."
 
-#: builtin/commit.c:1192
+#: builtin/commit.c:1193
 msgid "No paths with --include/--only does not make sense."
 msgstr "Du måste ange sökvägar tillsammans med --include/--only."
 
-#: builtin/commit.c:1194
+#: builtin/commit.c:1195
 msgid "Clever... amending the last one with dirty index."
 msgstr "Smart... utöka den senaste med smutsigt index."
 
-#: builtin/commit.c:1196
+#: builtin/commit.c:1197
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "Explicita sökvägar angavs utan -i eller -o; antar --only sökvägar..."
 
-#: builtin/commit.c:1208 builtin/tag.c:730
+#: builtin/commit.c:1209 builtin/tag.c:475
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Felaktigt städningsläge %s"
 
-#: builtin/commit.c:1213
+#: builtin/commit.c:1214
 msgid "Paths with -a does not make sense."
 msgstr "Kan inte ange sökvägar med -a."
 
-#: builtin/commit.c:1323 builtin/commit.c:1602
+#: builtin/commit.c:1324 builtin/commit.c:1605
 msgid "show status concisely"
 msgstr "visa koncis status"
 
-#: builtin/commit.c:1325 builtin/commit.c:1604
+#: builtin/commit.c:1326 builtin/commit.c:1607
 msgid "show branch information"
 msgstr "visa information om gren"
 
-#: builtin/commit.c:1327 builtin/commit.c:1606 builtin/push.c:546
+#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:544
+#: builtin/worktree.c:423
 msgid "machine-readable output"
 msgstr "maskinläsbar utdata"
 
-#: builtin/commit.c:1330 builtin/commit.c:1608
+#: builtin/commit.c:1331 builtin/commit.c:1611
 msgid "show status in long format (default)"
 msgstr "visa status i långt format (standard)"
 
-#: builtin/commit.c:1333 builtin/commit.c:1611
+#: builtin/commit.c:1334 builtin/commit.c:1614
 msgid "terminate entries with NUL"
 msgstr "terminera poster med NUL"
 
-#: builtin/commit.c:1335 builtin/commit.c:1614 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:604
+#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:353
 msgid "mode"
 msgstr "läge"
 
-#: builtin/commit.c:1336 builtin/commit.c:1614
+#: builtin/commit.c:1337 builtin/commit.c:1617
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr "visa ospårade filer, valfria lägen: alla, normal, no. (Standard: all)"
 
-#: builtin/commit.c:1339
+#: builtin/commit.c:1340
 msgid "show ignored files"
 msgstr "visa ignorerade filer"
 
-#: builtin/commit.c:1340 parse-options.h:155
+#: builtin/commit.c:1341 parse-options.h:155
 msgid "when"
 msgstr "när"
 
-#: builtin/commit.c:1341
+#: builtin/commit.c:1342
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -5128,196 +5174,201 @@
 "ignorera ändringar i undermoduler, valfritt när: all, dirty, untracked. "
 "(Default: all)"
 
-#: builtin/commit.c:1343
+#: builtin/commit.c:1344
 msgid "list untracked files in columns"
 msgstr "visa ospårade filer i spalter"
 
-#: builtin/commit.c:1429
+#: builtin/commit.c:1430
 msgid "couldn't look up newly created commit"
 msgstr "kunde inte slå upp en precis skapad incheckning"
 
-#: builtin/commit.c:1431
+#: builtin/commit.c:1432
 msgid "could not parse newly created commit"
 msgstr "kunde inte tolka en precis skapad incheckning"
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1477
 msgid "detached HEAD"
 msgstr "frånkopplad HEAD"
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1480
 msgid " (root-commit)"
 msgstr " (rotincheckning)"
 
-#: builtin/commit.c:1572
+#: builtin/commit.c:1575
 msgid "suppress summary after successful commit"
 msgstr "undertryck sammanfattning efter framgångsrik incheckning"
 
-#: builtin/commit.c:1573
+#: builtin/commit.c:1576
 msgid "show diff in commit message template"
 msgstr "visa diff i mallen för incheckningsmeddelandet"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1578
 msgid "Commit message options"
 msgstr "Alternativ för incheckningsmeddelande"
 
-#: builtin/commit.c:1576 builtin/tag.c:602
+#: builtin/commit.c:1579 builtin/tag.c:351
 msgid "read message from file"
 msgstr "läs meddelande från fil"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "author"
 msgstr "författare"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "override author for commit"
 msgstr "överstyr författare för incheckningen"
 
-#: builtin/commit.c:1578 builtin/gc.c:268
+#: builtin/commit.c:1581 builtin/gc.c:326
 msgid "date"
 msgstr "datum"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1581
 msgid "override date for commit"
 msgstr "överstyr datum för incheckningen"
 
-#: builtin/commit.c:1579 builtin/merge.c:218 builtin/notes.c:392
-#: builtin/notes.c:555 builtin/tag.c:600
+#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392
+#: builtin/notes.c:555 builtin/tag.c:349
 msgid "message"
 msgstr "meddelande"
 
-#: builtin/commit.c:1579
+#: builtin/commit.c:1582
 msgid "commit message"
 msgstr "incheckningsmeddelande"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
+#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
+msgid "commit"
+msgstr "incheckning"
+
+#: builtin/commit.c:1583
 msgid "reuse and edit message from specified commit"
 msgstr "återanvänd och redigera meddelande från angiven incheckning"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1584
 msgid "reuse message from specified commit"
 msgstr "återanvänd meddelande från angiven incheckning"
 
-#: builtin/commit.c:1582
+#: builtin/commit.c:1585
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "använd autosquash-formaterat meddelande för att fixa angiven incheckning"
 
-#: builtin/commit.c:1583
+#: builtin/commit.c:1586
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "använd autosquash-formaterat meddelande för att slå ihop med angiven "
 "incheckning"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1587
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "jag är nu författare av incheckningen (används med -C/-c/--amend)"
 
-#: builtin/commit.c:1585 builtin/log.c:1216 builtin/revert.c:86
+#: builtin/commit.c:1588 builtin/log.c:1216 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "lägg till Signed-off-by:"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1589
 msgid "use specified template file"
 msgstr "använd angiven mallfil"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1590
 msgid "force edit of commit"
 msgstr "tvinga redigering av incheckning"
 
-#: builtin/commit.c:1588
+#: builtin/commit.c:1591
 msgid "default"
 msgstr "standard"
 
-#: builtin/commit.c:1588 builtin/tag.c:605
+#: builtin/commit.c:1591 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "hur blanksteg och #kommentarer skall tas bort från meddelande"
 
-#: builtin/commit.c:1589
+#: builtin/commit.c:1592
 msgid "include status in commit message template"
 msgstr "inkludera status i mallen för incheckningsmeddelandet"
 
-#: builtin/commit.c:1591 builtin/merge.c:226 builtin/pull.c:156
+#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "GPG-signera incheckning"
 
-#: builtin/commit.c:1594
+#: builtin/commit.c:1597
 msgid "Commit contents options"
 msgstr "Alternativ för incheckningens innehåll"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1598
 msgid "commit all changed files"
 msgstr "checka in alla ändrade filer"
 
-#: builtin/commit.c:1596
+#: builtin/commit.c:1599
 msgid "add specified files to index for commit"
 msgstr "lägg till angivna filer till indexet för incheckning"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1600
 msgid "interactively add files"
 msgstr "lägg till filer interaktivt"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1601
 msgid "interactively add changes"
 msgstr "lägg till ändringar interaktivt"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1602
 msgid "commit only specified files"
 msgstr "checka endast in angivna filer"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1603
 msgid "bypass pre-commit hook"
 msgstr "förbigå pre-commit-krok"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1604
 msgid "show what would be committed"
 msgstr "visa vad som skulle checkas in"
 
-#: builtin/commit.c:1612
+#: builtin/commit.c:1615
 msgid "amend previous commit"
 msgstr "lägg till föregående incheckning"
 
-#: builtin/commit.c:1613
+#: builtin/commit.c:1616
 msgid "bypass post-rewrite hook"
 msgstr "förbigå post-rewrite-krok"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1621
 msgid "ok to record an empty change"
 msgstr "ok att registrera en tom ändring"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1623
 msgid "ok to record a change with an empty message"
 msgstr "ok att registrera en ändring med tomt meddelande"
 
-#: builtin/commit.c:1649
+#: builtin/commit.c:1652
 msgid "could not parse HEAD commit"
 msgstr "kunde inte tolka HEAD:s incheckning"
 
-#: builtin/commit.c:1695
+#: builtin/commit.c:1698
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Trasig MERGE_HEAD-fil (%s)"
 
-#: builtin/commit.c:1702
+#: builtin/commit.c:1705
 msgid "could not read MERGE_MODE"
 msgstr "kunde inte läsa MERGE_MODE"
 
-#: builtin/commit.c:1721
+#: builtin/commit.c:1724
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "kunde inte läsa incheckningsmeddelande: %s"
 
-#: builtin/commit.c:1732
+#: builtin/commit.c:1735
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Avbryter incheckning; meddelandet inte redigerat.\n"
 
-#: builtin/commit.c:1737
+#: builtin/commit.c:1740
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Avbryter på grund av tomt incheckningsmeddelande.\n"
 
-#: builtin/commit.c:1785
+#: builtin/commit.c:1788
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -5456,11 +5507,11 @@
 msgid "respect include directives on lookup"
 msgstr "respektera inkluderingsdirektiv vid uppslag"
 
-#: builtin/config.c:311
+#: builtin/config.c:303
 msgid "unable to parse default color value"
 msgstr "kan inte tolka standardfärgvärde"
 
-#: builtin/config.c:449
+#: builtin/config.c:441
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5475,16 +5526,16 @@
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:583
+#: builtin/config.c:575
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "kan inte skapa konfigurationsfilen \"%s\""
 
-#: builtin/count-objects.c:55
+#: builtin/count-objects.c:77
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:65
+#: builtin/count-objects.c:87
 msgid "print sizes in human readable format"
 msgstr "skriv storlekar i människoläsbart format"
 
@@ -5604,7 +5655,7 @@
 msgid "only consider tags matching <pattern>"
 msgstr "överväg endast taggar som motsvarar <mönster>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:318
+#: builtin/describe.c:410 builtin/name-rev.c:314
 msgid "show abbreviated commit object as fallback"
 msgstr "visa förkortade incheckningsobjekt som standard"
 
@@ -5823,7 +5874,7 @@
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s -> %s  (kan inte hämta i aktuell gren)"
 
-#: builtin/fetch.c:478 builtin/fetch.c:564
+#: builtin/fetch.c:478 builtin/fetch.c:566
 msgid "[rejected]"
 msgstr "[refuserad]"
 
@@ -5847,39 +5898,39 @@
 msgid "[new ref]"
 msgstr "[ny ref]"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "unable to update local ref"
 msgstr "kunde inte uppdatera lokal ref"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "forced update"
 msgstr "tvingad uppdatering"
 
-#: builtin/fetch.c:566
+#: builtin/fetch.c:568
 msgid "(non-fast-forward)"
 msgstr "(ej snabbspolad)"
 
-#: builtin/fetch.c:600 builtin/fetch.c:842
+#: builtin/fetch.c:602 builtin/fetch.c:843
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "kan inte öppna %s: %s\n"
 
-#: builtin/fetch.c:609
+#: builtin/fetch.c:611
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s sände inte alla nödvändiga objekt\n"
 
-#: builtin/fetch.c:627
+#: builtin/fetch.c:629
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr "avvisa %s då grunda rötter inte kan uppdateras"
 
-#: builtin/fetch.c:715 builtin/fetch.c:807
+#: builtin/fetch.c:716 builtin/fetch.c:808
 #, c-format
 msgid "From %.*s\n"
 msgstr "Från %.*s\n"
 
-#: builtin/fetch.c:726
+#: builtin/fetch.c:727
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -5888,55 +5939,55 @@
 "vissa lokala referenser kunde inte uppdateras; testa att köra\n"
 " \"git remote prune %s\" för att ta bort gamla grenar som står i konflikt"
 
-#: builtin/fetch.c:778
+#: builtin/fetch.c:779
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s kommer bli dinglande)"
 
-#: builtin/fetch.c:779
+#: builtin/fetch.c:780
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s har blivit dinglande)"
 
-#: builtin/fetch.c:811
+#: builtin/fetch.c:812
 msgid "[deleted]"
 msgstr "[borttagen]"
 
-#: builtin/fetch.c:812 builtin/remote.c:1034
+#: builtin/fetch.c:813 builtin/remote.c:1040
 msgid "(none)"
 msgstr "(ingen)"
 
-#: builtin/fetch.c:832
+#: builtin/fetch.c:833
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "Vägrar hämta till aktuell gren %s i ett icke-naket arkiv"
 
-#: builtin/fetch.c:851
+#: builtin/fetch.c:852
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Flaggan \"%s\" och värdet \"%s\" är inte giltigt för %s"
 
-#: builtin/fetch.c:854
+#: builtin/fetch.c:855
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Flaggan \"%s\" ignoreras för %s\n"
 
-#: builtin/fetch.c:910
+#: builtin/fetch.c:911
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Vet inte hur man hämtar från %s"
 
-#: builtin/fetch.c:1071
+#: builtin/fetch.c:1072
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Hämtar %s\n"
 
-#: builtin/fetch.c:1073 builtin/remote.c:90
+#: builtin/fetch.c:1074 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Kunde inte hämta %s"
 
-#: builtin/fetch.c:1091
+#: builtin/fetch.c:1092
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -5944,32 +5995,32 @@
 "Inget fjärrarkiv angavs. Ange antingen en URL eller namnet på ett\n"
 "fjärrarkiv som nya incheckningar skall hämtas från."
 
-#: builtin/fetch.c:1114
+#: builtin/fetch.c:1115
 msgid "You need to specify a tag name."
 msgstr "Du måste ange namnet på en tagg."
 
-#: builtin/fetch.c:1156
+#: builtin/fetch.c:1157
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth och --unshallow kan inte användas samtidigt"
 
-#: builtin/fetch.c:1158
+#: builtin/fetch.c:1159
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow kan inte användas på ett komplett arkiv"
 
-#: builtin/fetch.c:1181
+#: builtin/fetch.c:1179
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all tar inte namnet på ett arkiv som argument"
 
-#: builtin/fetch.c:1183
+#: builtin/fetch.c:1181
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all kan inte anges med referensspecifikationer"
 
-#: builtin/fetch.c:1194
+#: builtin/fetch.c:1192
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Fjärren eller fjärrgruppen finns inte: %s"
 
-#: builtin/fetch.c:1202
+#: builtin/fetch.c:1200
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Kan inte hämta från grupp och ange referensspecifikationer"
 
@@ -5979,23 +6030,23 @@
 msgstr ""
 "git fmt-merge-msg [-m <meddelande>] [--log[=<n>] | --no-log] [--file <fil>]"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:667
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "fyll i loggen med som mest <n> poster från shortlog"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:670
 msgid "alias for --log (deprecated)"
 msgstr "alias för --log (avråds)"
 
-#: builtin/fmt-merge-msg.c:676
+#: builtin/fmt-merge-msg.c:673
 msgid "text"
 msgstr "text"
 
-#: builtin/fmt-merge-msg.c:677
+#: builtin/fmt-merge-msg.c:674
 msgid "use <text> as start of message"
 msgstr "inled meddelande med <text>"
 
-#: builtin/fmt-merge-msg.c:678
+#: builtin/fmt-merge-msg.c:675
 msgid "file to read from"
 msgstr "fil att läsa från"
 
@@ -6003,99 +6054,119 @@
 msgid "git for-each-ref [<options>] [<pattern>]"
 msgstr "git for-each-ref [<flaggor>] [<mönster>]"
 
-#: builtin/for-each-ref.c:24
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
+msgstr "git for-each-ref [--points-at <objekt>]"
+
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<objekt>]]"
+
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
+msgstr "git for-each-ref [--contains [<objekt>]]"
+
+#: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
 msgstr "citera platshållare passande för skal"
 
-#: builtin/for-each-ref.c:26
+#: builtin/for-each-ref.c:29
 msgid "quote placeholders suitably for perl"
 msgstr "citera platshållare passande för perl"
 
-#: builtin/for-each-ref.c:28
+#: builtin/for-each-ref.c:31
 msgid "quote placeholders suitably for python"
 msgstr "citera platshållare passande för python"
 
-#: builtin/for-each-ref.c:30
+#: builtin/for-each-ref.c:33
 msgid "quote placeholders suitably for Tcl"
 msgstr "citera platshållare passande för Tcl"
 
-#: builtin/for-each-ref.c:33
+#: builtin/for-each-ref.c:36
 msgid "show only <n> matched refs"
 msgstr "visa endast <n> träffade refs"
 
-#: builtin/for-each-ref.c:34
+#: builtin/for-each-ref.c:37 builtin/tag.c:372
 msgid "format to use for the output"
 msgstr "format att använda för utdata"
 
-#: builtin/for-each-ref.c:35
-msgid "key"
-msgstr "nyckel"
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
+msgstr "visa endast referenser som pekar på objektet"
 
-#: builtin/for-each-ref.c:36
-msgid "field name to sort on"
-msgstr "fältnamn att sortera på"
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
+msgstr "visa endast referenser som slagits samman"
+
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr "visa endast referenser som ej slagits samman"
+
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
+msgstr "visa endast referenser som innehåller incheckningen"
 
 # Vague original, not networking-related, but rather related to the actual
 # objects in the database.
-#: builtin/fsck.c:163 builtin/prune.c:137
+#: builtin/fsck.c:156 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr "Kontrollerar konnektivitet"
 
-#: builtin/fsck.c:568
+#: builtin/fsck.c:486
 msgid "Checking object directories"
 msgstr "Kontrollerar objektkataloger"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:553
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<flaggor>] [<objekt>...]"
 
-#: builtin/fsck.c:637
+#: builtin/fsck.c:559
 msgid "show unreachable objects"
 msgstr "visa onåbara objekt"
 
-#: builtin/fsck.c:638
+#: builtin/fsck.c:560
 msgid "show dangling objects"
 msgstr "visa dinglande objekt"
 
-#: builtin/fsck.c:639
+#: builtin/fsck.c:561
 msgid "report tags"
 msgstr "rapportera taggar"
 
-#: builtin/fsck.c:640
+#: builtin/fsck.c:562
 msgid "report root nodes"
 msgstr "rapportera rotnoder"
 
-#: builtin/fsck.c:641
+#: builtin/fsck.c:563
 msgid "make index objects head nodes"
 msgstr "gör indexojekt till huvudnoder"
 
-#: builtin/fsck.c:642
+#: builtin/fsck.c:564
 msgid "make reflogs head nodes (default)"
 msgstr "gör refloggar till huvudnoder (standard)"
 
-#: builtin/fsck.c:643
+#: builtin/fsck.c:565
 msgid "also consider packs and alternate objects"
 msgstr "ta även hänsyn till paket och alternativa objekt"
 
 # Vague original, not networking-related, but rather related to the actual
 # objects in the database.
-#: builtin/fsck.c:644
+#: builtin/fsck.c:566
 msgid "check only connectivity"
 msgstr "kontrollera endast konnektivitet"
 
-#: builtin/fsck.c:645
+#: builtin/fsck.c:567
 msgid "enable more strict checking"
 msgstr "aktivera striktare kontroll"
 
-#: builtin/fsck.c:647
+#: builtin/fsck.c:569
 msgid "write dangling objects in .git/lost-found"
 msgstr "skriv dinglande objekt i .git/lost-found"
 
-#: builtin/fsck.c:648 builtin/prune.c:107
+#: builtin/fsck.c:570 builtin/prune.c:107
 msgid "show progress"
 msgstr "visa förlopp"
 
-#: builtin/fsck.c:707
+#: builtin/fsck.c:631
 msgid "Checking objects"
 msgstr "Kontrollerar objekt"
 
@@ -6103,48 +6174,63 @@
 msgid "git gc [<options>]"
 msgstr "git gc [<flaggor>]"
 
-#: builtin/gc.c:55
+#: builtin/gc.c:72
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "Felaktigt %s: \"%s\""
 
-#: builtin/gc.c:100
+#: builtin/gc.c:139
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "tokigt lång objektkatalog %.*s"
 
-#: builtin/gc.c:269
+#: builtin/gc.c:290
+#, c-format
+msgid ""
+"The last gc run reported the following. Please correct the root cause\n"
+"and remove %s.\n"
+"Automatic cleanup will not be performed until the file is removed.\n"
+"\n"
+"%s"
+msgstr ""
+"Senaste körningen av git gc rapporterade följande. Fixa grundproblemet\n"
+"och ta bort %s.\n"
+"Automatisk städning kommer inte utföras förrän filen tas bort.\n"
+"\n"
+"%s"
+
+#: builtin/gc.c:327
 msgid "prune unreferenced objects"
 msgstr "rensa ej refererade objekt"
 
-#: builtin/gc.c:271
+#: builtin/gc.c:329
 msgid "be more thorough (increased runtime)"
 msgstr "var mer grundlig (ökar körtiden)"
 
-#: builtin/gc.c:272
+#: builtin/gc.c:330
 msgid "enable auto-gc mode"
 msgstr "aktivera auto-gc-läge"
 
-#: builtin/gc.c:273
+#: builtin/gc.c:331
 msgid "force running gc even if there may be another gc running"
 msgstr "tvinga gc-körning även om en annan gc kanske körs"
 
-#: builtin/gc.c:315
+#: builtin/gc.c:373
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr "Packar arkivet automatiskt i bakgrunden för optimal prestanda.\n"
 
-#: builtin/gc.c:317
+#: builtin/gc.c:375
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "Packar arkivet automatiskt för optimal prestanda.\n"
 
-#: builtin/gc.c:318
+#: builtin/gc.c:376
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "Se \"git help gc\" för manuell hushållning.\n"
 
-#: builtin/gc.c:336
+#: builtin/gc.c:397
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -6152,7 +6238,7 @@
 "gc körs redan på maskinen \"%s\" pid %<PRIuMAX> (använd --force om så inte "
 "är fallet)"
 
-#: builtin/gc.c:364
+#: builtin/gc.c:441
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -6188,199 +6274,195 @@
 msgid "cannot open '%s'"
 msgstr "kan inte öppna \"%s\""
 
-#: builtin/grep.c:638
+#: builtin/grep.c:633
 msgid "search in index instead of in the work tree"
 msgstr "sök i indexet istället för i arbetskatalogen"
 
-#: builtin/grep.c:640
+#: builtin/grep.c:635
 msgid "find in contents not managed by git"
 msgstr "sök i innehåll som inte hanteras av git"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:637
 msgid "search in both tracked and untracked files"
 msgstr "sök i både spårade och ospårade filer"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:639
 msgid "ignore files specified via '.gitignore'"
 msgstr "ignorera filer angivna i \".gitignore\""
 
-#: builtin/grep.c:647
+#: builtin/grep.c:642
 msgid "show non-matching lines"
 msgstr "visa rader som inte träffas"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:644
 msgid "case insensitive matching"
 msgstr "skiftlägesokänslig sökning"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:646
 msgid "match patterns only at word boundaries"
 msgstr "matcha endast mönster vid ordgränser"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:648
 msgid "process binary files as text"
 msgstr "hantera binärfiler som text"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:650
 msgid "don't match patterns in binary files"
 msgstr "träffa inte mönster i binärfiler"
 
-#: builtin/grep.c:658
+#: builtin/grep.c:653
 msgid "process binary files with textconv filters"
 msgstr "hantera binärfiler med textconv-filter"
 
-#: builtin/grep.c:660
+#: builtin/grep.c:655
 msgid "descend at most <depth> levels"
 msgstr "gå som mest ned <djup> nivåer"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:659
 msgid "use extended POSIX regular expressions"
 msgstr "använd utökade POSIX-reguljära uttryck"
 
-#: builtin/grep.c:667
+#: builtin/grep.c:662
 msgid "use basic POSIX regular expressions (default)"
 msgstr "använd grundläggande POSIX-reguljära uttryck (standard)"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:665
 msgid "interpret patterns as fixed strings"
 msgstr "tolka mönster som fixerade strängar"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:668
 msgid "use Perl-compatible regular expressions"
 msgstr "använd Perlkompatibla reguljära uttryck"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:671
 msgid "show line numbers"
 msgstr "visa radnummer"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:672
 msgid "don't show filenames"
 msgstr "visa inte filnamn"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:673
 msgid "show filenames"
 msgstr "visa filnamn"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:675
 msgid "show filenames relative to top directory"
 msgstr "visa filnamn relativa till toppkatalogen"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:677
 msgid "show only filenames instead of matching lines"
 msgstr "visa endast filnamn istället för träffade rader"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:679
 msgid "synonym for --files-with-matches"
 msgstr "synonym för --files-with-matches"
 
-#: builtin/grep.c:687
+#: builtin/grep.c:682
 msgid "show only the names of files without match"
 msgstr "visa endast namn på filer utan träffar"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:684
 msgid "print NUL after filenames"
 msgstr "skriv NUL efter filnamn"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:686
 msgid "show the number of matches instead of matching lines"
 msgstr "visa antal träffar istället för träffade rader"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:687
 msgid "highlight matches"
 msgstr "ljusmarkera träffar"
 
-#: builtin/grep.c:694
+#: builtin/grep.c:689
 msgid "print empty line between matches from different files"
 msgstr "skriv tomma rader mellan träffar från olika filer"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:691
 msgid "show filename only once above matches from same file"
 msgstr "visa filnamn endast en gång ovanför träffar från samma fil"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:694
 msgid "show <n> context lines before and after matches"
 msgstr "visa <n> rader sammanhang före och efter träffar"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:697
 msgid "show <n> context lines before matches"
 msgstr "visa <n> rader sammanhang före träffar"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:699
 msgid "show <n> context lines after matches"
 msgstr "visa <n> rader sammanhang efter träffar"
 
-#: builtin/grep.c:705
+#: builtin/grep.c:700
 msgid "shortcut for -C NUM"
 msgstr "genväg för -C NUM"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:703
 msgid "show a line with the function name before matches"
 msgstr "visa en rad med funktionsnamnet före träffen"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:705
 msgid "show the surrounding function"
 msgstr "visa den omkringliggande funktionen"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:708
 msgid "read patterns from file"
 msgstr "läs mönster från fil"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:710
 msgid "match <pattern>"
 msgstr "träffa <mönster>"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:712
 msgid "combine patterns specified with -e"
 msgstr "kombinera mönster som anges med -e"
 
-#: builtin/grep.c:729
+#: builtin/grep.c:724
 msgid "indicate hit with exit status without output"
 msgstr "ange träff med slutstatuskod utan utdata"
 
-#: builtin/grep.c:731
+#: builtin/grep.c:726
 msgid "show only matches from files that match all patterns"
 msgstr "visa endast träffar från filer som träffar alla mönster"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:728
 msgid "show parse tree for grep expression"
 msgstr "visa analysträd för grep-uttryck"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "pager"
 msgstr "bläddrare"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "show matching files in the pager"
 msgstr "visa träffade filer i filbläddraren"
 
-#: builtin/grep.c:740
+#: builtin/grep.c:735
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "tillåt anropa grep(1) (ignoreras av detta bygge)"
 
-#: builtin/grep.c:741 builtin/show-ref.c:189
-msgid "show usage"
-msgstr "visa användning"
-
-#: builtin/grep.c:808
+#: builtin/grep.c:793
 msgid "no pattern given."
 msgstr "inget mönster angavs."
 
-#: builtin/grep.c:866
+#: builtin/grep.c:851
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager fungerar endast i arbetskatalogen"
 
-#: builtin/grep.c:892
+#: builtin/grep.c:877
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached och --untracked kan inte användas med --no-index."
 
-#: builtin/grep.c:897
+#: builtin/grep.c:882
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index och --untracked kan inte användas med revisioner."
 
-#: builtin/grep.c:900
+#: builtin/grep.c:885
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard kan inte användas för spårat innehåll."
 
-#: builtin/grep.c:908
+#: builtin/grep.c:893
 msgid "both --cached and trees are given."
 msgstr "både --cached och träd angavs."
 
@@ -6393,10 +6475,10 @@
 "<fil>..."
 
 #: builtin/hash-object.c:81
-msgid "git hash-object  --stdin-paths < <list-of-paths>"
-msgstr "git hash-object  --stdin-paths < <sökvägslista>"
+msgid "git hash-object  --stdin-paths"
+msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:92 builtin/tag.c:614
+#: builtin/hash-object.c:92
 msgid "type"
 msgstr "typ"
 
@@ -6468,12 +6550,12 @@
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "emacsclient version \"%d\" för gammal (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
+#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "exec misslyckades för \"%s\": %s"
 
-#: builtin/help.c:215
+#: builtin/help.c:208
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -6482,7 +6564,7 @@
 "\"%s\": sökväg för man-visare som ej stöds.\n"
 "Använd \"man.<verktyg>.cmd\" istället."
 
-#: builtin/help.c:227
+#: builtin/help.c:220
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -6491,61 +6573,61 @@
 "\"%s\": kommando för man-visare som stöds.\n"
 "Använd \"man.<verktyg>.path\" istället."
 
-#: builtin/help.c:354
+#: builtin/help.c:337
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "\"%s\": okänd man-visare."
 
-#: builtin/help.c:371
+#: builtin/help.c:354
 msgid "no man viewer handled the request"
 msgstr "ingen man-visare hanterade förfrågan"
 
-#: builtin/help.c:379
+#: builtin/help.c:362
 msgid "no info viewer handled the request"
 msgstr "ingen info-visare hanterade förfrågan"
 
-#: builtin/help.c:428
+#: builtin/help.c:411
 msgid "Defining attributes per path"
 msgstr "Definierar attribut per sökväg"
 
-#: builtin/help.c:429
+#: builtin/help.c:412
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Git för dagligt bruk i ungefär 20 kommandon"
 
-#: builtin/help.c:430
+#: builtin/help.c:413
 msgid "A Git glossary"
 msgstr "En Git-ordlista"
 
-#: builtin/help.c:431
+#: builtin/help.c:414
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Ange avsiktligen ospårade filer att ignorera"
 
-#: builtin/help.c:432
+#: builtin/help.c:415
 msgid "Defining submodule properties"
 msgstr "Ange egenskaper för undermoduler"
 
-#: builtin/help.c:433
+#: builtin/help.c:416
 msgid "Specifying revisions and ranges for Git"
 msgstr "Ange versioner och intervall i Git"
 
-#: builtin/help.c:434
+#: builtin/help.c:417
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Introduktion till Git (för version 1.5.1 och senare)"
 
-#: builtin/help.c:435
+#: builtin/help.c:418
 msgid "An overview of recommended workflows with Git"
 msgstr "Översikt över rekommenderade arbetsflöden med Git"
 
-#: builtin/help.c:447
+#: builtin/help.c:430
 msgid "The common Git guides are:\n"
 msgstr "De vanliga Git-vägledningarna är:\n"
 
-#: builtin/help.c:468 builtin/help.c:485
+#: builtin/help.c:451 builtin/help.c:468
 #, c-format
 msgid "usage: %s%s"
 msgstr "användning: %s%s"
 
-#: builtin/help.c:501
+#: builtin/help.c:484
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "\"git %s\" är ett alias för \"%s\""
@@ -6838,87 +6920,62 @@
 msgid "--verify with no packfile name given"
 msgstr "--verify angavs utan paketfilnamn"
 
-#: builtin/init-db.c:36
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr "Kunde inte göra %s skrivbar för gruppen"
-
-#: builtin/init-db.c:63
-#, c-format
-msgid "insanely long template name %s"
-msgstr "tokigt långt namn på mallen %s"
-
-#: builtin/init-db.c:68
+#: builtin/init-db.c:55
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "kan inte ta status på \"%s\""
 
-#: builtin/init-db.c:74
+#: builtin/init-db.c:61
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "kan inte ta status på mallen \"%s\""
 
-#: builtin/init-db.c:81
+#: builtin/init-db.c:66
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "kan inte öppna katalogen (opendir) \"%s\""
 
-#: builtin/init-db.c:98
+#: builtin/init-db.c:77
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "kan inte läsa länk (readlink) \"%s\""
 
-#: builtin/init-db.c:100
-#, c-format
-msgid "insanely long symlink %s"
-msgstr "tokigt lång symbolisk länk %s"
-
-#: builtin/init-db.c:103
+#: builtin/init-db.c:79
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "kan inte skapa symbolisk länk \"%s\" \"%s\""
 
-#: builtin/init-db.c:107
+#: builtin/init-db.c:85
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "kan inte kopiera \"%s\" till \"%s\""
 
-#: builtin/init-db.c:111
+#: builtin/init-db.c:89
 #, c-format
 msgid "ignoring template %s"
 msgstr "ignorerar mallen %s"
 
-#: builtin/init-db.c:137
-#, c-format
-msgid "insanely long template path %s"
-msgstr "tokigt lång mallsökväg %s"
-
-#: builtin/init-db.c:145
+#: builtin/init-db.c:118
 #, c-format
 msgid "templates not found %s"
 msgstr "mallarna hittades inte %s"
 
-#: builtin/init-db.c:158
+#: builtin/init-db.c:131
 #, c-format
 msgid "not copying templates of a wrong format version %d from '%s'"
 msgstr "kopierade inte mallar från felaktig formatversion %d från \"%s\""
 
-#: builtin/init-db.c:212
-#, c-format
-msgid "insane git directory %s"
-msgstr "tokig git-katalog %s"
-
-#: builtin/init-db.c:344 builtin/init-db.c:347
+#: builtin/init-db.c:309 builtin/init-db.c:312
 #, c-format
 msgid "%s already exists"
 msgstr "%s finns redan"
 
-#: builtin/init-db.c:375
+#: builtin/init-db.c:340
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "kan inte hantera filtyp %d"
 
-#: builtin/init-db.c:378
+#: builtin/init-db.c:343
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "kan inte flytta %s till %s"
@@ -6926,24 +6983,24 @@
 #. TRANSLATORS: The first '%s' is either "Reinitialized
 #. existing" or "Initialized empty", the second " shared" or
 #. "", and the last '%s%s' is the verbatim directory name.
-#: builtin/init-db.c:434
+#: builtin/init-db.c:399
 #, c-format
 msgid "%s%s Git repository in %s%s\n"
 msgstr "%s%s Git-arkiv i %s%s\n"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Reinitialized existing"
 msgstr "Ominitierade befintligt"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Initialized empty"
 msgstr "Initierade tomt"
 
-#: builtin/init-db.c:436
+#: builtin/init-db.c:401
 msgid " shared"
 msgstr " delat"
 
-#: builtin/init-db.c:483
+#: builtin/init-db.c:448
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -6951,25 +7008,25 @@
 "git init [-q | --quiet] [--bare] [--template=<mallkatalog>] [--"
 "shared[=<behörigheter>]] [<katalog>]"
 
-#: builtin/init-db.c:506
+#: builtin/init-db.c:471
 msgid "permissions"
 msgstr "behörigheter"
 
-#: builtin/init-db.c:507
+#: builtin/init-db.c:472
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "ange att git-arkivet skall delas bland flera användare"
 
-#: builtin/init-db.c:541 builtin/init-db.c:546
+#: builtin/init-db.c:506 builtin/init-db.c:511
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "kan inte skapa katalogen (mkdir) %s"
 
-#: builtin/init-db.c:550
+#: builtin/init-db.c:515
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "kan inte byta katalog (chdir) till %s"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:536
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6978,7 +7035,7 @@
 "%s (eller --work-tree=<katalog>) inte tillåtet utan att ange %s (eller --git-"
 "dir=<katalog>)"
 
-#: builtin/init-db.c:599
+#: builtin/init-db.c:564
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Kan inte komma åt arbetskatalogen \"%s\""
@@ -7064,33 +7121,33 @@
 msgid "name of output directory is too long"
 msgstr "namnet på utdatakatalogen är för långt"
 
-#: builtin/log.c:814
+#: builtin/log.c:813
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Kan inte öppna patchfilen %s"
 
-#: builtin/log.c:828
+#: builtin/log.c:827
 msgid "Need exactly one range."
 msgstr "Behöver precis ett intervall."
 
-#: builtin/log.c:838
+#: builtin/log.c:837
 msgid "Not a range."
 msgstr "Inte ett intervall."
 
-#: builtin/log.c:944
+#: builtin/log.c:943
 msgid "Cover letter needs email format"
 msgstr "Omslagsbrevet behöver e-postformat"
 
-#: builtin/log.c:1023
+#: builtin/log.c:1022
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "tokigt in-reply-to: %s"
 
-#: builtin/log.c:1051
+#: builtin/log.c:1050
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<flaggor>] [<sedan> | <revisionsintervall>]"
 
-#: builtin/log.c:1096
+#: builtin/log.c:1095
 msgid "Two output directories?"
 msgstr "Två utdatakataloger?"
 
@@ -7147,134 +7204,138 @@
 msgstr "skriv inte binära diffar"
 
 #: builtin/log.c:1241
+msgid "output all-zero hash in From header"
+msgstr "använd hashvärde med nollor i From-huvud"
+
+#: builtin/log.c:1243
 msgid "don't include a patch matching a commit upstream"
 msgstr "ta inte med patchar som motsvarar en uppströmsincheckning"
 
-#: builtin/log.c:1243
+#: builtin/log.c:1245
 msgid "show patch format instead of default (patch + stat)"
 msgstr "visa patchformat istället för standard (patch + stat)"
 
-#: builtin/log.c:1245
+#: builtin/log.c:1247
 msgid "Messaging"
 msgstr "E-post"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1248
 msgid "header"
 msgstr "huvud"
 
-#: builtin/log.c:1247
+#: builtin/log.c:1249
 msgid "add email header"
 msgstr "lägg till e-posthuvud"
 
-#: builtin/log.c:1248 builtin/log.c:1250
+#: builtin/log.c:1250 builtin/log.c:1252
 msgid "email"
 msgstr "epost"
 
-#: builtin/log.c:1248
+#: builtin/log.c:1250
 msgid "add To: header"
 msgstr "Lägg till mottagarhuvud (\"To:\")"
 
-#: builtin/log.c:1250
+#: builtin/log.c:1252
 msgid "add Cc: header"
 msgstr "Lägg till kopiehuvud (\"Cc:\")"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1254
 msgid "ident"
 msgstr "ident"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1255
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr "sätt Från-adress till <ident> (eller incheckare om ident saknas)"
 
-#: builtin/log.c:1255
+#: builtin/log.c:1257
 msgid "message-id"
 msgstr "meddelande-id"
 
-#: builtin/log.c:1256
+#: builtin/log.c:1258
 msgid "make first mail a reply to <message-id>"
 msgstr "Gör det första brevet ett svar till <meddelande-id>"
 
-#: builtin/log.c:1257 builtin/log.c:1260
+#: builtin/log.c:1259 builtin/log.c:1262
 msgid "boundary"
 msgstr "gräns"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1260
 msgid "attach the patch"
 msgstr "bifoga patchen"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1263
 msgid "inline the patch"
 msgstr "gör patchen ett inline-objekt"
 
-#: builtin/log.c:1265
+#: builtin/log.c:1267
 msgid "enable message threading, styles: shallow, deep"
 msgstr "aktivera brevtrådning, typer: shallow, deep"
 
-#: builtin/log.c:1267
+#: builtin/log.c:1269
 msgid "signature"
 msgstr "signatur"
 
-#: builtin/log.c:1268
+#: builtin/log.c:1270
 msgid "add a signature"
 msgstr "lägg till signatur"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1272
 msgid "add a signature from a file"
 msgstr "lägg till signatur från fil"
 
-#: builtin/log.c:1271
+#: builtin/log.c:1273
 msgid "don't print the patch filenames"
 msgstr "visa inte filnamn för patchar"
 
-#: builtin/log.c:1360
+#: builtin/log.c:1362
 msgid "-n and -k are mutually exclusive."
 msgstr "-n och -k kan inte användas samtidigt."
 
-#: builtin/log.c:1362
+#: builtin/log.c:1364
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix och -k kan inte användas samtidigt."
 
-#: builtin/log.c:1370
+#: builtin/log.c:1372
 msgid "--name-only does not make sense"
 msgstr "kan inte använda --name-only"
 
-#: builtin/log.c:1372
+#: builtin/log.c:1374
 msgid "--name-status does not make sense"
 msgstr "kan inte använda --name-status"
 
-#: builtin/log.c:1374
+#: builtin/log.c:1376
 msgid "--check does not make sense"
 msgstr "kan inte använda --check"
 
-#: builtin/log.c:1397
+#: builtin/log.c:1401
 msgid "standard output, or directory, which one?"
 msgstr "standard ut, eller katalog, vilken skall det vara?"
 
-#: builtin/log.c:1399
+#: builtin/log.c:1403
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Kunde inte skapa katalogen \"%s\""
 
-#: builtin/log.c:1496
+#: builtin/log.c:1500
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "kunde inte läsa signaturfil \"%s\""
 
-#: builtin/log.c:1559
+#: builtin/log.c:1563
 msgid "Failed to create output files"
 msgstr "Misslyckades skapa utdatafiler"
 
-#: builtin/log.c:1607
+#: builtin/log.c:1611
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<uppström> [<huvud> [<gräns>]]]"
 
-#: builtin/log.c:1661
+#: builtin/log.c:1665
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr "Kunde inte hitta en spårad fjärrgren, ange <uppström> manuellt.\n"
 
-#: builtin/log.c:1672 builtin/log.c:1674 builtin/log.c:1686
+#: builtin/log.c:1676 builtin/log.c:1678 builtin/log.c:1690
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Okänd incheckning %s"
@@ -7375,35 +7436,35 @@
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<flaggor>] <träd-igt> [<sökväg>...]"
 
-#: builtin/ls-tree.c:127
+#: builtin/ls-tree.c:128
 msgid "only show trees"
 msgstr "visa endast träd"
 
-#: builtin/ls-tree.c:129
+#: builtin/ls-tree.c:130
 msgid "recurse into subtrees"
 msgstr "rekursera ner i underträd"
 
-#: builtin/ls-tree.c:131
+#: builtin/ls-tree.c:132
 msgid "show trees when recursing"
 msgstr "visa träd medan rekursering"
 
-#: builtin/ls-tree.c:134
+#: builtin/ls-tree.c:135
 msgid "terminate entries with NUL byte"
 msgstr "terminera poster med NUL-byte"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:136
 msgid "include object size"
 msgstr "inkludera objektstorlek"
 
-#: builtin/ls-tree.c:137 builtin/ls-tree.c:139
+#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
 msgid "list only filenames"
 msgstr "visa endast filnamn"
 
-#: builtin/ls-tree.c:142
+#: builtin/ls-tree.c:143
 msgid "use full path names"
 msgstr "använd fullständiga sökvägsnamn"
 
-#: builtin/ls-tree.c:144
+#: builtin/ls-tree.c:145
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr "visa hela trädet; inte bara aktuell katalog (implicerar --full-name)"
 
@@ -7638,16 +7699,16 @@
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Ingen fjärrspårande gren för %s från %s"
 
-#: builtin/merge.c:1081
+#: builtin/merge.c:1079
 #, c-format
 msgid "could not close '%s'"
 msgstr "kunde inte stänga \"%s\""
 
-#: builtin/merge.c:1208
+#: builtin/merge.c:1206
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Det finns ingen sammanslagning att avbryta (MERGE_HEAD saknas)."
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1222
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7655,7 +7716,7 @@
 "Du har inte avslutat sammanslagningen (MERGE_HEAD finns).\n"
 "Checka in dina ändringar innan du slår ihop."
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1229
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7663,53 +7724,53 @@
 "Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns).\n"
 "Checka in dina ändringar innan du slår ihop."
 
-#: builtin/merge.c:1234
+#: builtin/merge.c:1232
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns)."
 
-#: builtin/merge.c:1243
+#: builtin/merge.c:1241
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Du kan inte kombinera --squash med --no-ff."
 
-#: builtin/merge.c:1251
+#: builtin/merge.c:1249
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Ingen incheckning angiven och merge.defaultToUpstream är ej satt."
 
-#: builtin/merge.c:1268
+#: builtin/merge.c:1266
 msgid "Squash commit into empty head not supported yet"
 msgstr "Stöder inte en tillplattningsincheckning på ett tomt huvud ännu"
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1268
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "Icke-snabbspolad incheckning kan inte användas med ett tomt huvud"
 
-#: builtin/merge.c:1276
+#: builtin/merge.c:1274
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - inte något vi kan slå ihop"
 
-#: builtin/merge.c:1278
+#: builtin/merge.c:1276
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Kan endast slå ihop en enda incheckning i ett tomt huvud."
 
-#: builtin/merge.c:1333
+#: builtin/merge.c:1331
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 "Incheckningen %s har en obetrodd GPG-signatur som påstås vara gjord av %s."
 
-#: builtin/merge.c:1336
+#: builtin/merge.c:1334
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
 "Incheckningen %s har en felaktig GPG-signatur som påstås vara gjord av %s."
 
-#: builtin/merge.c:1339
+#: builtin/merge.c:1337
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Incheckning %s har inte någon GPG-signatur."
 
-#: builtin/merge.c:1342
+#: builtin/merge.c:1340
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Incheckningen %s har en korrekt GPG-signatur av %s\n"
@@ -7719,46 +7780,46 @@
 msgid "Updating %s..%s\n"
 msgstr "Uppdaterar %s..%s\n"
 
-#: builtin/merge.c:1462
+#: builtin/merge.c:1460
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Försöker riktigt enkel sammanslagning i indexet...\n"
 
-#: builtin/merge.c:1469
+#: builtin/merge.c:1467
 #, c-format
 msgid "Nope.\n"
 msgstr "Nej.\n"
 
-#: builtin/merge.c:1501
+#: builtin/merge.c:1499
 msgid "Not possible to fast-forward, aborting."
 msgstr "Kan inte snabbspola, avbryter."
 
-#: builtin/merge.c:1524 builtin/merge.c:1603
+#: builtin/merge.c:1522 builtin/merge.c:1601
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Återspolar trädet till orört...\n"
 
-#: builtin/merge.c:1528
+#: builtin/merge.c:1526
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Försöker sammanslagningsstrategin %s...\n"
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1592
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Ingen sammanslagningsstrategi hanterade sammanslagningen.\n"
 
-#: builtin/merge.c:1596
+#: builtin/merge.c:1594
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Sammanslagning med strategin %s misslyckades.\n"
 
-#: builtin/merge.c:1605
+#: builtin/merge.c:1603
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Använder %s för att förbereda lösning för hand.\n"
 
-#: builtin/merge.c:1617
+#: builtin/merge.c:1615
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -7948,48 +8009,48 @@
 msgid "Renaming %s to %s\n"
 msgstr "Byter namn på %s till %s\n"
 
-#: builtin/mv.c:256 builtin/remote.c:722 builtin/repack.c:362
+#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "misslyckades byta namn på \"%s\""
 
-#: builtin/name-rev.c:255
+#: builtin/name-rev.c:251
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<flaggor>] <incheckning>..."
 
-#: builtin/name-rev.c:256
+#: builtin/name-rev.c:252
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<flaggor>] --all"
 
-#: builtin/name-rev.c:257
+#: builtin/name-rev.c:253
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<flaggor>] --stdin"
 
-#: builtin/name-rev.c:309
+#: builtin/name-rev.c:305
 msgid "print only names (no SHA-1)"
 msgstr "skriv endast namn (ingen SHA-1)"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:306
 msgid "only use tags to name the commits"
 msgstr "använd endast taggar för att namnge incheckningar"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:308
 msgid "only use refs matching <pattern>"
 msgstr "använd endast referenser som motsvarar <mönster>"
 
-#: builtin/name-rev.c:314
+#: builtin/name-rev.c:310
 msgid "list all commits reachable from all refs"
 msgstr "lista alla incheckningar som kan nås alla referenser"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:311
 msgid "read from stdin"
 msgstr "läs från standard in"
 
-#: builtin/name-rev.c:316
+#: builtin/name-rev.c:312
 msgid "allow to print `undefined` names (default)"
 msgstr "tillåt att skriva \"odefinierade\" namn (standard)"
 
-#: builtin/name-rev.c:322
+#: builtin/name-rev.c:318
 msgid "dereference tags in the input (internal use)"
 msgstr "avreferera taggar i indata (används internt)"
 
@@ -8119,7 +8180,7 @@
 msgid "failed to finish 'show' for object '%s'"
 msgstr "kunde inte avsluta \"show\" för objektet \"%s\""
 
-#: builtin/notes.c:174 builtin/tag.c:477
+#: builtin/notes.c:174 builtin/tag.c:248
 #, c-format
 msgid "could not create file '%s'"
 msgstr "kunde inte skapa filen \"%s\""
@@ -8137,12 +8198,12 @@
 msgid "The note contents have been left in %s"
 msgstr "Anteckningens innehåll har lämnats kvar i %s"
 
-#: builtin/notes.c:232 builtin/tag.c:695
+#: builtin/notes.c:232 builtin/tag.c:440
 #, c-format
 msgid "cannot read '%s'"
 msgstr "kunde inte läsa \"%s\""
 
-#: builtin/notes.c:234 builtin/tag.c:698
+#: builtin/notes.c:234 builtin/tag.c:443
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "kunde inte öppna eller läsa \"%s\""
@@ -8150,7 +8211,7 @@
 #: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306
 #: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507
 #: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653
-#: builtin/notes.c:877 builtin/tag.c:711
+#: builtin/notes.c:877 builtin/tag.c:456
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Kunde inte slå upp \"%s\" som en giltig referens."
@@ -8184,11 +8245,6 @@
 msgid "note contents in a file"
 msgstr "anteckningsinnehåll i en fil"
 
-#: builtin/notes.c:398 builtin/notes.c:401 builtin/notes.c:561
-#: builtin/notes.c:564 builtin/tag.c:630
-msgid "object"
-msgstr "objekt"
-
 #: builtin/notes.c:399 builtin/notes.c:562
 msgid "reuse and edit specified note object"
 msgstr "återanvänd och redigera angivet anteckningsobjekt"
@@ -8319,7 +8375,7 @@
 msgid "use notes from <notes-ref>"
 msgstr "använd anteckningar från <anteckningsref>"
 
-#: builtin/notes.c:1012 builtin/remote.c:1588
+#: builtin/notes.c:1012 builtin/remote.c:1647
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Okänt underkommando: %s"
@@ -8527,30 +8583,30 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <tid>] [--] [<huvud>...]"
 
-#: builtin/prune.c:105 builtin/worktree.c:121
+#: builtin/prune.c:105 builtin/worktree.c:124
 msgid "do not remove, show only"
 msgstr "ta inte bort, bara visa"
 
-#: builtin/prune.c:106 builtin/worktree.c:122
+#: builtin/prune.c:106 builtin/worktree.c:125
 msgid "report pruned objects"
 msgstr "rapportera borttagna objekt"
 
-#: builtin/prune.c:109 builtin/worktree.c:124
+#: builtin/prune.c:109 builtin/worktree.c:127
 msgid "expire objects older than <time>"
 msgstr "låt tid gå ut för objekt äldre än <tid>"
 
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
+msgstr "kan inte rensa i ett \"precious-objekt\"-arkiv"
+
 #: builtin/pull.c:69
-msgid "git pull [options] [<repository> [<refspec>...]]"
-msgstr "git pull [flaggor] [<arkiv> [<refspec>...]]"
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
+msgstr "git pull [<flaggor>] [<arkiv> [<refspec>...]]"
 
 #: builtin/pull.c:113
 msgid "Options related to merging"
 msgstr "Alternativ gällande sammanslagning"
 
-#: builtin/pull.c:115
-msgid "false|true|preserve"
-msgstr "false|true|preserve"
-
 #: builtin/pull.c:116
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "inlemma ändringar genom ombasering i stället för sammanslagning"
@@ -8699,19 +8755,19 @@
 msgid "Cannot rebase onto multiple branches."
 msgstr "Kan inte ombasera ovanpå flera grenar."
 
-#: builtin/push.c:15
+#: builtin/push.c:16
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [<flaggor>] [<arkiv> [<refspec>...]]"
 
-#: builtin/push.c:86
+#: builtin/push.c:88
 msgid "tag shorthand without <tag>"
 msgstr "taggförkortning utan <tagg>"
 
-#: builtin/push.c:96
+#: builtin/push.c:98
 msgid "--delete only accepts plain target ref names"
 msgstr "--delete godtar endast enkla målreferensnamn"
 
-#: builtin/push.c:140
+#: builtin/push.c:142
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -8720,7 +8776,7 @@
 "För att välja ett av alternativen permanent, se push.default i \"git help "
 "config\"."
 
-#: builtin/push.c:143
+#: builtin/push.c:145
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -8745,7 +8801,7 @@
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:158
+#: builtin/push.c:160
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -8760,7 +8816,7 @@
 "\n"
 "    git push %s HEAD:<namn-på-fjärrgren>\n"
 
-#: builtin/push.c:172
+#: builtin/push.c:174
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -8773,12 +8829,12 @@
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:180
+#: builtin/push.c:182
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr "Den aktuella grenen %s har flera uppströmsgrenar, vägrar sända."
 
-#: builtin/push.c:183
+#: builtin/push.c:185
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -8789,7 +8845,7 @@
 "aktuella grenen \"%s\", utan att tala om för mig vad som\n"
 "skall sändas för att uppdatera fjärrgrenen."
 
-#: builtin/push.c:206
+#: builtin/push.c:208
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -8837,14 +8893,14 @@
 "liknande läget \"current\" istället för \"simple\" om du ibland använder\n"
 "äldre versioner av Git.)"
 
-#: builtin/push.c:273
+#: builtin/push.c:275
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "Du angav inga referensspecifikationer att sända, och push.default är "
 "\"nothing\"."
 
-#: builtin/push.c:280
+#: builtin/push.c:282
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -8856,7 +8912,7 @@
 "\"git pull ....\") innan du sänder igen.\n"
 "Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer."
 
-#: builtin/push.c:286
+#: builtin/push.c:288
 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"
@@ -8868,7 +8924,7 @@
 "\"git pull ...\") innan du sänder igen.\n"
 "Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer."
 
-#: builtin/push.c:292
+#: builtin/push.c:294
 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"
@@ -8882,11 +8938,11 @@
 "(t.ex. \"git pull ...\") innan du sänder igen.\n"
 "Se avsnittet \"Note about fast-forwards\" i \"git push --help\" för detaljer."
 
-#: builtin/push.c:299
+#: builtin/push.c:301
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr "Uppdateringarna avvisades eftersom taggen redan finns på fjärren."
 
-#: builtin/push.c:302
+#: builtin/push.c:304
 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"
@@ -8897,22 +8953,22 @@
 "pekar på något som inte är en incheckning, utan att använda flaggan\n"
 "\"--force\".\n"
 
-#: builtin/push.c:361
+#: builtin/push.c:363
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Sänder till %s\n"
 
-#: builtin/push.c:365
+#: builtin/push.c:367
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "misslyckades sända vissa referenser till \"%s\""
 
-#: builtin/push.c:395
+#: builtin/push.c:397
 #, c-format
 msgid "bad repository '%s'"
 msgstr "felaktigt arkiv \"%s\""
 
-#: builtin/push.c:396
+#: builtin/push.c:398
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -8933,100 +8989,104 @@
 "\n"
 "    git push <namn>\n"
 
-#: builtin/push.c:411
+#: builtin/push.c:413
 msgid "--all and --tags are incompatible"
 msgstr "--all och --tags är inkompatibla"
 
-#: builtin/push.c:412
+#: builtin/push.c:414
 msgid "--all can't be combined with refspecs"
 msgstr "--all kan inte kombineras med referensspecifikationer"
 
-#: builtin/push.c:417
+#: builtin/push.c:419
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror och --tags är inkompatibla"
 
-#: builtin/push.c:418
+#: builtin/push.c:420
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror kan inte kombineras med referensspecifikationer"
 
-#: builtin/push.c:423
+#: builtin/push.c:425
 msgid "--all and --mirror are incompatible"
 msgstr "--all och --mirror är inkompatibla"
 
-#: builtin/push.c:539
+#: builtin/push.c:537
 msgid "repository"
 msgstr "arkiv"
 
-#: builtin/push.c:540 builtin/send-pack.c:161
+#: builtin/push.c:538 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "sänd alla referenser"
 
-#: builtin/push.c:541 builtin/send-pack.c:163
+#: builtin/push.c:539 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "spegla alla referenser"
 
-#: builtin/push.c:543
+#: builtin/push.c:541
 msgid "delete refs"
 msgstr "ta bort referenser"
 
-#: builtin/push.c:544
+#: builtin/push.c:542
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "sänd taggar (kan inte användas med --all eller --mirror)"
 
-#: builtin/push.c:547 builtin/send-pack.c:164
+#: builtin/push.c:545 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "tvinga uppdateringar"
 
-#: builtin/push.c:549 builtin/send-pack.c:175
+#: builtin/push.c:547 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "refnamn>:<förvänta"
 
-#: builtin/push.c:550 builtin/send-pack.c:176
+#: builtin/push.c:548 builtin/send-pack.c:176
 msgid "require old value of ref to be at this value"
 msgstr "kräv att ref:s tidigare värde är detta"
 
-#: builtin/push.c:553
+#: builtin/push.c:550
+msgid "check|on-demand|no"
+msgstr "check|on-demand|no"
+
+#: builtin/push.c:551
 msgid "control recursive pushing of submodules"
 msgstr "styr rekursiv insändning av undermoduler"
 
-#: builtin/push.c:555 builtin/send-pack.c:169
+#: builtin/push.c:553 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "använd tunna paket"
 
-#: builtin/push.c:556 builtin/push.c:557 builtin/send-pack.c:158
+#: builtin/push.c:554 builtin/push.c:555 builtin/send-pack.c:158
 #: builtin/send-pack.c:159
 msgid "receive pack program"
 msgstr "program för att ta emot paket"
 
-#: builtin/push.c:558
+#: builtin/push.c:556
 msgid "set upstream for git pull/status"
 msgstr "ställ in uppström för git pull/status"
 
-#: builtin/push.c:561
+#: builtin/push.c:559
 msgid "prune locally removed refs"
 msgstr "ta bort lokalt borttagna referenser"
 
-#: builtin/push.c:563
+#: builtin/push.c:561
 msgid "bypass pre-push hook"
 msgstr "förbigå pre-push-krok"
 
-#: builtin/push.c:564
+#: builtin/push.c:562
 msgid "push missing but relevant tags"
 msgstr "sänd in saknade men relevanta taggar"
 
-#: builtin/push.c:567 builtin/send-pack.c:166
+#: builtin/push.c:565 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "GPG-signera insändningen"
 
-#: builtin/push.c:569 builtin/send-pack.c:170
+#: builtin/push.c:567 builtin/send-pack.c:170
 msgid "request atomic transaction on remote side"
 msgstr "begär atomiska transaktioner på fjärrsidan"
 
-#: builtin/push.c:579
+#: builtin/push.c:577
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete är inkompatibel med --all, --mirror och --tags"
 
-#: builtin/push.c:581
+#: builtin/push.c:579
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete kan inte användas utan referenser"
 
@@ -9104,12 +9164,12 @@
 msgid "debug unpack-trees"
 msgstr "felsök unpack-trees"
 
-#: builtin/reflog.c:432
+#: builtin/reflog.c:428
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
 msgstr "\"%s\" för \"%s\" är inte en giltig tidsstämpel"
 
-#: builtin/reflog.c:549 builtin/reflog.c:554
+#: builtin/reflog.c:545 builtin/reflog.c:550
 #, c-format
 msgid "'%s' is not a valid timestamp"
 msgstr "\"%s\" är inte en giltig tidsstämpel"
@@ -9126,15 +9186,15 @@
 "git remote add [-t <gren>] [-m <master>] [-f] [--tags | --no-tags] [--"
 "mirror=<fetch|push>] <namn> <url>"
 
-#: builtin/remote.c:14 builtin/remote.c:33
+#: builtin/remote.c:14 builtin/remote.c:34
 msgid "git remote rename <old> <new>"
 msgstr "git remote rename <gammal> <ny>"
 
-#: builtin/remote.c:15 builtin/remote.c:38
+#: builtin/remote.c:15 builtin/remote.c:39
 msgid "git remote remove <name>"
 msgstr "git remote remove <namn>"
 
-#: builtin/remote.c:16 builtin/remote.c:43
+#: builtin/remote.c:16 builtin/remote.c:44
 msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
 msgstr "git remote set-head <namn> (-a | --auto | -d | --delete | <gren>)"
 
@@ -9156,48 +9216,52 @@
 msgid "git remote set-branches [--add] <name> <branch>..."
 msgstr "git remote set-branches [--add] <namn> <gren>..."
 
-#: builtin/remote.c:21 builtin/remote.c:69
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr "git remote get-url [--push] [--all] <namn>"
+
+#: builtin/remote.c:22 builtin/remote.c:75
 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
 msgstr "git remote set-url [--push] <namn> <nyurl> [<gammalurl>]"
 
-#: builtin/remote.c:22 builtin/remote.c:70
+#: builtin/remote.c:23 builtin/remote.c:76
 msgid "git remote set-url --add <name> <newurl>"
 msgstr "git remote set-url --add <namn> <nyurl>"
 
-#: builtin/remote.c:23 builtin/remote.c:71
+#: builtin/remote.c:24 builtin/remote.c:77
 msgid "git remote set-url --delete <name> <url>"
 msgstr "git remote set-url --delete <namn> <url>"
 
-#: builtin/remote.c:28
+#: builtin/remote.c:29
 msgid "git remote add [<options>] <name> <url>"
 msgstr "git remote add [<flaggor>] <namn> <url>"
 
-#: builtin/remote.c:48
+#: builtin/remote.c:49
 msgid "git remote set-branches <name> <branch>..."
 msgstr "git remote set-branches <namn> <gren>..."
 
-#: builtin/remote.c:49
+#: builtin/remote.c:50
 msgid "git remote set-branches --add <name> <branch>..."
 msgstr "git remote set-branches --add <namn> <gren>..."
 
-#: builtin/remote.c:54
+#: builtin/remote.c:55
 msgid "git remote show [<options>] <name>"
 msgstr "git remote show [<flaggor>] <namn>"
 
-#: builtin/remote.c:59
+#: builtin/remote.c:60
 msgid "git remote prune [<options>] <name>"
 msgstr "git remote prune [<flaggor>] <namn>"
 
-#: builtin/remote.c:64
+#: builtin/remote.c:65
 msgid "git remote update [<options>] [<group> | <remote>]..."
 msgstr "git remote update [<flaggor>] [<grupp> | <fjärr>]..."
 
-#: builtin/remote.c:88
+#: builtin/remote.c:94
 #, c-format
 msgid "Updating %s"
 msgstr "Uppdaterar %s"
 
-#: builtin/remote.c:120
+#: builtin/remote.c:126
 msgid ""
 "--mirror is dangerous and deprecated; please\n"
 "\t use --mirror=fetch or --mirror=push instead"
@@ -9205,96 +9269,96 @@
 "--mirror är farlig och föråldrad; använd\n"
 "\t --mirror=fetch eller --mirror=push istället"
 
-#: builtin/remote.c:137
+#: builtin/remote.c:143
 #, c-format
 msgid "unknown mirror argument: %s"
 msgstr "okänt argument till mirror: %s"
 
-#: builtin/remote.c:153
+#: builtin/remote.c:159
 msgid "fetch the remote branches"
 msgstr "hämta fjärrgrenarna"
 
-#: builtin/remote.c:155
+#: builtin/remote.c:161
 msgid "import all tags and associated objects when fetching"
 msgstr "importera alla taggar och associerade objekt vid hämtning"
 
-#: builtin/remote.c:158
+#: builtin/remote.c:164
 msgid "or do not fetch any tag at all (--no-tags)"
 msgstr "eller hämta inte några taggar alls (--no-tags)"
 
-#: builtin/remote.c:160
+#: builtin/remote.c:166
 msgid "branch(es) to track"
 msgstr "gren(ar) att spåra"
 
-#: builtin/remote.c:161
+#: builtin/remote.c:167
 msgid "master branch"
 msgstr "huvudgren"
 
-#: builtin/remote.c:162
+#: builtin/remote.c:168
 msgid "push|fetch"
 msgstr "push|fetch"
 
-#: builtin/remote.c:163
+#: builtin/remote.c:169
 msgid "set up remote as a mirror to push to or fetch from"
 msgstr "ställ in arkiv som spegel att sända eller ta emot från"
 
-#: builtin/remote.c:175
+#: builtin/remote.c:181
 msgid "specifying a master branch makes no sense with --mirror"
 msgstr "att ange en master-gren ger ingen mening med --mirror"
 
-#: builtin/remote.c:177
+#: builtin/remote.c:183
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr "att ange grenar att spåra ger mening bara med hämtningsspeglar"
 
-#: builtin/remote.c:187 builtin/remote.c:637
+#: builtin/remote.c:193 builtin/remote.c:643
 #, c-format
 msgid "remote %s already exists."
 msgstr "fjärrarkivet %s finns redan."
 
-#: builtin/remote.c:191 builtin/remote.c:641
+#: builtin/remote.c:197 builtin/remote.c:647
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "\"%s\" är inte ett giltigt namn på fjärrarkiv"
 
-#: builtin/remote.c:235
+#: builtin/remote.c:241
 #, c-format
 msgid "Could not setup master '%s'"
 msgstr "Kunde inte skapa master \"%s\""
 
-#: builtin/remote.c:335
+#: builtin/remote.c:341
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr "Kunde inte hämta mappning för referensspecifikation %s"
 
-#: builtin/remote.c:436 builtin/remote.c:444
+#: builtin/remote.c:442 builtin/remote.c:450
 msgid "(matching)"
 msgstr "(matchande)"
 
-#: builtin/remote.c:448
+#: builtin/remote.c:454
 msgid "(delete)"
 msgstr "(ta bort)"
 
-#: builtin/remote.c:588 builtin/remote.c:594 builtin/remote.c:600
+#: builtin/remote.c:594 builtin/remote.c:600 builtin/remote.c:606
 #, c-format
 msgid "Could not append '%s' to '%s'"
 msgstr "Kunde inte tillämpa \"%s\" på \"%s\""
 
-#: builtin/remote.c:630 builtin/remote.c:769 builtin/remote.c:869
+#: builtin/remote.c:636 builtin/remote.c:775 builtin/remote.c:875
 #, c-format
 msgid "No such remote: %s"
 msgstr "Inget sådant fjärrarkiv: %s"
 
-#: builtin/remote.c:647
+#: builtin/remote.c:653
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Kunde inte byta namn på konfigurationssektionen \"%s\" till \"%s\""
 
-#: builtin/remote.c:653 builtin/remote.c:821
+#: builtin/remote.c:659 builtin/remote.c:827
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Kunde inte ta bort konfigurationssektionen \"%s\""
 
-#: builtin/remote.c:668
+#: builtin/remote.c:674
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -9305,27 +9369,27 @@
 "\t%s\n"
 "\tUppdatera konfigurationen manuellt om nödvändigt."
 
-#: builtin/remote.c:674
+#: builtin/remote.c:680
 #, c-format
 msgid "Could not append '%s'"
 msgstr "Kunde inte lägga till på \"%s\""
 
-#: builtin/remote.c:685
+#: builtin/remote.c:691
 #, c-format
 msgid "Could not set '%s'"
 msgstr "Kunde inte sätta \"%s\""
 
-#: builtin/remote.c:707
+#: builtin/remote.c:713
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "misslyckades ta bort \"%s\""
 
-#: builtin/remote.c:741
+#: builtin/remote.c:747
 #, c-format
 msgid "creating '%s' failed"
 msgstr "misslyckades skapa \"%s\""
 
-#: builtin/remote.c:807
+#: builtin/remote.c:813
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -9339,262 +9403,275 @@
 "Observera: Några grenar utanför hierarkin refs/remotes/ togs inte bort;\n"
 "för att ta bort dem, använd:"
 
-#: builtin/remote.c:922
+#: builtin/remote.c:928
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " ny (nästa hämtning sparar i remotes/%s)"
 
-#: builtin/remote.c:925
+#: builtin/remote.c:931
 msgid " tracked"
 msgstr " spårad"
 
-#: builtin/remote.c:927
+#: builtin/remote.c:933
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " förlegad (använd \"git remote prune\" för att ta bort)"
 
-#: builtin/remote.c:929
+#: builtin/remote.c:935
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:976
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "ogiltig branch.%s.merge; kan inte ombasera över > 1 gren"
 
-#: builtin/remote.c:977
+#: builtin/remote.c:983
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "ombaseras på fjärren %s"
 
-#: builtin/remote.c:980
+#: builtin/remote.c:986
 #, c-format
 msgid " merges with remote %s"
 msgstr " sammanslås med fjärren %s"
 
-#: builtin/remote.c:981
+#: builtin/remote.c:987
 msgid "    and with remote"
 msgstr "    och med fjärren"
 
-#: builtin/remote.c:983
+#: builtin/remote.c:989
 #, c-format
 msgid "merges with remote %s"
 msgstr "sammanslås med fjärren %s"
 
-#: builtin/remote.c:984
+#: builtin/remote.c:990
 msgid "   and with remote"
 msgstr "   och med fjärren"
 
-#: builtin/remote.c:1030
+#: builtin/remote.c:1036
 msgid "create"
 msgstr "skapa"
 
-#: builtin/remote.c:1033
+#: builtin/remote.c:1039
 msgid "delete"
 msgstr "ta bort"
 
-#: builtin/remote.c:1037
+#: builtin/remote.c:1043
 msgid "up to date"
 msgstr "àjour"
 
-#: builtin/remote.c:1040
+#: builtin/remote.c:1046
 msgid "fast-forwardable"
 msgstr "kan snabbspolas"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1049
 msgid "local out of date"
 msgstr "lokal föråldrad"
 
-#: builtin/remote.c:1050
+#: builtin/remote.c:1056
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s tvingar till %-*s (%s)"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1059
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s sänder till %-*s (%s)"
 
-#: builtin/remote.c:1057
+#: builtin/remote.c:1063
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s tvingar till %s"
 
-#: builtin/remote.c:1060
+#: builtin/remote.c:1066
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s sänder till %s"
 
-#: builtin/remote.c:1128
+#: builtin/remote.c:1134
 msgid "do not query remotes"
 msgstr "fråga inte fjärrar"
 
-#: builtin/remote.c:1155
+#: builtin/remote.c:1161
 #, c-format
 msgid "* remote %s"
 msgstr "* fjärr %s"
 
-#: builtin/remote.c:1156
+#: builtin/remote.c:1162
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  Hämt-URL: %s"
 
-#: builtin/remote.c:1157 builtin/remote.c:1308
+#: builtin/remote.c:1163 builtin/remote.c:1314
 msgid "(no URL)"
 msgstr "(ingen URL)"
 
-#: builtin/remote.c:1166 builtin/remote.c:1168
+#: builtin/remote.c:1172 builtin/remote.c:1174
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  Sänd-URL: %s"
 
-#: builtin/remote.c:1170 builtin/remote.c:1172 builtin/remote.c:1174
+#: builtin/remote.c:1176 builtin/remote.c:1178 builtin/remote.c:1180
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  HEAD-gren: %s"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1182
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr "  HEAD-gren (HEAD på fjärr är tvetydig, kan vara en av följande):\n"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1194
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Fjärrgren:%s"
 msgstr[1] "  Fjärrgrenar:%s"
 
-#: builtin/remote.c:1191 builtin/remote.c:1218
+#: builtin/remote.c:1197 builtin/remote.c:1224
 msgid " (status not queried)"
 msgstr " (status inte förfrågad)"
 
-#: builtin/remote.c:1200
+#: builtin/remote.c:1206
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Lokal gren konfigurerad för \"git pull\":"
 msgstr[1] "  Lokala grenar konfigurerade för \"git pull\":"
 
-#: builtin/remote.c:1208
+#: builtin/remote.c:1214
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Lokala referenser speglas av \"git push\""
 
-#: builtin/remote.c:1215
+#: builtin/remote.c:1221
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Lokal referens konfigurerad för \"git push\"%s:"
 msgstr[1] "  Lokala referenser konfigurerade för \"git push\"%s:"
 
-#: builtin/remote.c:1236
+#: builtin/remote.c:1242
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "sätt refs/remotes/<namn>/HEAD enligt fjärren"
 
-#: builtin/remote.c:1238
+#: builtin/remote.c:1244
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "ta bort refs/remotes/<namn>/HEAD"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1259
 msgid "Cannot determine remote HEAD"
 msgstr "Kan inte bestämma HEAD på fjärren"
 
-#: builtin/remote.c:1255
+#: builtin/remote.c:1261
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "Flera HEAD-grenar på fjärren. Välj en explicit med:"
 
-#: builtin/remote.c:1265
+#: builtin/remote.c:1271
 #, c-format
 msgid "Could not delete %s"
 msgstr "Kunde inte ta bort %s"
 
-#: builtin/remote.c:1273
+#: builtin/remote.c:1279
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Inte en giltig referens: %s"
 
-#: builtin/remote.c:1275
+#: builtin/remote.c:1281
 #, c-format
 msgid "Could not setup %s"
 msgstr "Kunde inte ställa in %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1299
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s kommer bli dinglande!"
 
-#: builtin/remote.c:1294
+#: builtin/remote.c:1300
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s har blivit dinglande!"
 
-#: builtin/remote.c:1304
+#: builtin/remote.c:1310
 #, c-format
 msgid "Pruning %s"
 msgstr "Rensar %s"
 
-#: builtin/remote.c:1305
+#: builtin/remote.c:1311
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1321
+#: builtin/remote.c:1327
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [skulle rensa] %s"
 
-#: builtin/remote.c:1324
+#: builtin/remote.c:1330
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [rensad] %s"
 
-#: builtin/remote.c:1369
+#: builtin/remote.c:1375
 msgid "prune remotes after fetching"
 msgstr "rensa fjärrar efter hämtning"
 
-#: builtin/remote.c:1435 builtin/remote.c:1509
+#: builtin/remote.c:1441 builtin/remote.c:1498 builtin/remote.c:1566
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Ingen sådan fjärr \"%s\""
 
-#: builtin/remote.c:1455
+#: builtin/remote.c:1461
 msgid "add branch"
 msgstr "lägg till gren"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1468
 msgid "no remote specified"
 msgstr "ingen fjärr angavs"
 
-#: builtin/remote.c:1484
+#: builtin/remote.c:1485
+msgid "query push URLs rather than fetch URLs"
+msgstr "fråga sänd-URL:er istället för hämta-URL:er"
+
+#: builtin/remote.c:1487
+msgid "return all URLs"
+msgstr "returnera alla URL:er"
+
+#: builtin/remote.c:1515
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr "ingen URL:er angivna för fjärren \"%s\""
+
+#: builtin/remote.c:1541
 msgid "manipulate push URLs"
 msgstr "manipulera URL:ar för sändning"
 
-#: builtin/remote.c:1486
+#: builtin/remote.c:1543
 msgid "add URL"
 msgstr "lägg till URL"
 
-#: builtin/remote.c:1488
+#: builtin/remote.c:1545
 msgid "delete URLs"
 msgstr "ta bort URL:ar"
 
-#: builtin/remote.c:1495
+#: builtin/remote.c:1552
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete ger ingen mening"
 
-#: builtin/remote.c:1535
+#: builtin/remote.c:1592
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Felaktig gammalt URL-mönster: %s"
 
-#: builtin/remote.c:1543
+#: builtin/remote.c:1600
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Ingen sådan URL hittades: %s"
 
-#: builtin/remote.c:1545
+#: builtin/remote.c:1602
 msgid "Will not delete all non-push URLs"
 msgstr "Kommer inte ta bort alla icke-sänd-URL:er"
 
-#: builtin/remote.c:1559
+#: builtin/remote.c:1616
 msgid "be verbose; must be placed before a subcommand"
 msgstr "var pratsam; måste skrivas före ett underkommando"
 
@@ -9666,7 +9743,11 @@
 msgid "repack objects in packs marked with .keep"
 msgstr "packa om objekt i paket märkta med .keep"
 
-#: builtin/repack.c:378
+#: builtin/repack.c:197
+msgid "cannot delete packs in a precious-objects repo"
+msgstr "kan inte ta bort paket i ett \"precious-objects\"-arkiv"
+
+#: builtin/repack.c:381
 #, c-format
 msgid "removing '%s' failed"
 msgstr "misslyckades ta bort \"%s\""
@@ -9761,7 +9842,7 @@
 msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
 msgstr "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
 
-#: builtin/rerere.c:57
+#: builtin/rerere.c:58
 msgid "register clean resolutions in index"
 msgstr "registrera rena lösningar i indexet"
 
@@ -9896,23 +9977,23 @@
 msgid "rev-list does not support display of notes"
 msgstr "rev-list stöder inte visning av anteckningar"
 
-#: builtin/rev-parse.c:361
+#: builtin/rev-parse.c:358
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<options>] -- [<argument>...]"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:363
 msgid "keep the `--` passed as an arg"
 msgstr "behåll \"--\" sänt som argument"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:365
 msgid "stop parsing after the first non-option argument"
 msgstr "sluta tolka efter första argument som inte är flagga"
 
-#: builtin/rev-parse.c:371
+#: builtin/rev-parse.c:368
 msgid "output in stuck long form"
 msgstr "utdata fast i lång form"
 
-#: builtin/rev-parse.c:502
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -10170,7 +10251,7 @@
 msgid "Linewrap output"
 msgstr "Radbryt utdata"
 
-#: builtin/show-branch.c:9
+#: builtin/show-branch.c:10
 msgid ""
 "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
 "\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
@@ -10182,71 +10263,71 @@
 "\t\t[--more=<n> | --list | --independent | --merge-base]\n"
 "\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <mönster>)...]"
 
-#: builtin/show-branch.c:13
+#: builtin/show-branch.c:14
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<bas>]] [--list] [<ref>]"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:640
 msgid "show remote-tracking and local branches"
 msgstr "visa fjärrspårande och lokala grenar"
 
-#: builtin/show-branch.c:661
+#: builtin/show-branch.c:642
 msgid "show remote-tracking branches"
 msgstr "visa fjärrspårande grenar"
 
-#: builtin/show-branch.c:663
+#: builtin/show-branch.c:644
 msgid "color '*!+-' corresponding to the branch"
 msgstr "färga \"*!+-\" enligt grenen"
 
-#: builtin/show-branch.c:665
+#: builtin/show-branch.c:646
 msgid "show <n> more commits after the common ancestor"
 msgstr "visa <n> ytterligare incheckningar efter gemensam anfader"
 
-#: builtin/show-branch.c:667
+#: builtin/show-branch.c:648
 msgid "synonym to more=-1"
 msgstr "synonym till more=-1"
 
-#: builtin/show-branch.c:668
+#: builtin/show-branch.c:649
 msgid "suppress naming strings"
 msgstr "undertyck namnsträngar"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:651
 msgid "include the current branch"
 msgstr "inkludera aktuell gren"
 
-#: builtin/show-branch.c:672
+#: builtin/show-branch.c:653
 msgid "name commits with their object names"
 msgstr "namnge incheckningar med deras objektnamn"
 
-#: builtin/show-branch.c:674
+#: builtin/show-branch.c:655
 msgid "show possible merge bases"
 msgstr "visa möjliga sammanslagningsbaser"
 
-#: builtin/show-branch.c:676
+#: builtin/show-branch.c:657
 msgid "show refs unreachable from any other ref"
 msgstr "visa referenser som inte kan nås från någon annan referens"
 
-#: builtin/show-branch.c:678
+#: builtin/show-branch.c:659
 msgid "show commits in topological order"
 msgstr "visa incheckningar i topologisk ordning"
 
-#: builtin/show-branch.c:681
+#: builtin/show-branch.c:662
 msgid "show only commits not on the first branch"
 msgstr "visa endast incheckningar inte på den första grenen"
 
-#: builtin/show-branch.c:683
+#: builtin/show-branch.c:664
 msgid "show merges reachable from only one tip"
 msgstr "visa sammanslagningar som endast kan nås från en spets"
 
-#: builtin/show-branch.c:685
+#: builtin/show-branch.c:666
 msgid "topologically sort, maintaining date order where possible"
 msgstr "sortera topologiskt, behåll datumordning när möjligt"
 
-#: builtin/show-branch.c:688
+#: builtin/show-branch.c:669
 msgid "<n>[,<base>]"
 msgstr "<n>[,<bas>]"
 
-#: builtin/show-branch.c:689
+#: builtin/show-branch.c:670
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "visa <n> nyaste refloggposter med början på bas"
 
@@ -10259,41 +10340,136 @@
 "hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<mönster>...]"
 
 #: builtin/show-ref.c:11
-msgid "git show-ref --exclude-existing[=pattern] < ref-list"
-msgstr "git show-ref --exclude-existing[=mönster] < reflista"
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr "git show-ref --exclude-existing[=<mönster>]"
 
-#: builtin/show-ref.c:170
+#: builtin/show-ref.c:165
 msgid "only show tags (can be combined with heads)"
 msgstr "visa endast taggar (kan kombineras med huvuden)"
 
-#: builtin/show-ref.c:171
+#: builtin/show-ref.c:166
 msgid "only show heads (can be combined with tags)"
 msgstr "visa endast huvuden (kan kombineras med taggar)"
 
-#: builtin/show-ref.c:172
+#: builtin/show-ref.c:167
 msgid "stricter reference checking, requires exact ref path"
 msgstr "striktare referenskontroll, kräver exakt referenssökväg"
 
-#: builtin/show-ref.c:175 builtin/show-ref.c:177
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "visa HEAD-refrens, även när den skulle filtreras ut"
 
-#: builtin/show-ref.c:179
+#: builtin/show-ref.c:174
 msgid "dereference tags into object IDs"
 msgstr "avreferera taggar till objekt-id"
 
-#: builtin/show-ref.c:181
+#: builtin/show-ref.c:176
 msgid "only show SHA1 hash using <n> digits"
 msgstr "visa SHA1-hash endast med <n> siffror"
 
-#: builtin/show-ref.c:185
+#: builtin/show-ref.c:180
 msgid "do not print results to stdout (useful with --verify)"
 msgstr "visa inte resultat på standard ut (användbart med --verify)"
 
-#: builtin/show-ref.c:187
+#: builtin/show-ref.c:182
 msgid "show refs from stdin that aren't in local repository"
 msgstr "visa referenser från standard in som inte finns i lokalt arkiv"
 
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr "git stripspace [-s | --strip-comments]"
+
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr "git stripspace [-c | --comment-lines]"
+
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr "hoppa över och ta bort alla rader som inleds med kommentarstecken"
+
+#: builtin/stripspace.c:38
+msgid "prepend comment character and blank to each line"
+msgstr "lägg in kommentarstecken och blanksteg först på varje rad"
+
+#: builtin/submodule--helper.c:79 builtin/submodule--helper.c:167
+msgid "alternative anchor for relative paths"
+msgstr "alternativa ankare för relativa sökvägar"
+
+#: builtin/submodule--helper.c:84
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper list [--prefix=<sökväg>] [<sökväg>...]"
+
+#: builtin/submodule--helper.c:114
+msgid "git submodule--helper name <path>"
+msgstr "git submodule--helper name <sökväg>"
+
+#: builtin/submodule--helper.c:120
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr "hittade ingen undermodulmappning i .gitmodules för sökvägen \"%s\""
+
+#: builtin/submodule--helper.c:170
+msgid "where the new submodule will be cloned to"
+msgstr "var den nya undermodulen skall klonas till"
+
+#: builtin/submodule--helper.c:173
+msgid "name of the new submodule"
+msgstr "namn på den nya undermodulen"
+
+#: builtin/submodule--helper.c:176
+msgid "url where to clone the submodule from"
+msgstr "URL att klona undermodulen från"
+
+#: builtin/submodule--helper.c:182
+msgid "depth for shallow clones"
+msgstr "djup för grunda kloner"
+
+#: builtin/submodule--helper.c:188
+msgid ""
+"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
+"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+msgstr ""
+"git submodule--helper clone [--prefix=<sökväg>] [--quiet] [--reference "
+"<arkvi>] [--name <namn>] [--url <url>][--depth <djup>] [--] [<sökväg>...]"
+
+#: builtin/submodule--helper.c:202 builtin/submodule--helper.c:208
+#: builtin/submodule--helper.c:216
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "kunde inte skapa katalogen \"%s\""
+
+#: builtin/submodule--helper.c:204
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr "misslyckades klona \"%s\" till undermodulsökvägen \"%s\""
+
+#: builtin/submodule--helper.c:227
+#, c-format
+msgid "cannot open file '%s'"
+msgstr "kan inte öppna filen \"%s\""
+
+#: builtin/submodule--helper.c:232
+#, c-format
+msgid "could not close file %s"
+msgstr "kunde inte stänga filen %s"
+
+#: builtin/submodule--helper.c:247
+#, c-format
+msgid "could not get submodule directory for '%s'"
+msgstr "kunde inte få tag i undermodulkatalog för \"%s\""
+
+#: builtin/submodule--helper.c:273
+msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+msgstr ""
+"ödesdigert: underkommandot submodule--helper måste anropas med ett "
+"underkommando"
+
+#: builtin/submodule--helper.c:280
+#, c-format
+msgid "fatal: '%s' is not a valid submodule--helper subcommand"
+msgstr ""
+"ödesdigert: \"%s\" är inte ett giltigt underkommando till submodule--helper"
+
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
 msgstr "git symbolic-ref [<flaggor>] <namn> [<ref>]"
@@ -10323,7 +10499,7 @@
 msgid "reason of the update"
 msgstr "skäl till uppdateringen"
 
-#: builtin/tag.c:22
+#: builtin/tag.c:23
 msgid ""
 "git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
 "[<head>]"
@@ -10331,48 +10507,43 @@
 "git tag [-a | -s | -u <nyckel-id>] [-f] [-m <medd> | -F <fil>] <taggnamn> "
 "[<huvud>]"
 
-#: builtin/tag.c:23
+#: builtin/tag.c:24
 msgid "git tag -d <tagname>..."
 msgstr "git tag -d <taggnamn>..."
 
-#: builtin/tag.c:24
+#: builtin/tag.c:25
 msgid ""
 "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
-"\t\t[<pattern>...]"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
 "git tag -l [-n[<antal>]] [--contains <incheckning>] [--points-at <objekt>]\n"
-"\t\t[<mönster>...]"
+"\t\t[--format=<format>] [--[no-]merged [<incheckning>]] [<mönster>...]"
 
-#: builtin/tag.c:26
+#: builtin/tag.c:27
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <taggnamn>..."
 
-#: builtin/tag.c:69
-#, c-format
-msgid "malformed object at '%s'"
-msgstr "felformat objekt vid \"%s\""
-
-#: builtin/tag.c:301
+#: builtin/tag.c:80
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "taggnamnet för långt: %.*s..."
 
-#: builtin/tag.c:306
+#: builtin/tag.c:85
 #, c-format
 msgid "tag '%s' not found."
 msgstr "taggen \"%s\" hittades inte."
 
-#: builtin/tag.c:321
+#: builtin/tag.c:100
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Tog bort tagg \"%s\" (var %s)\n"
 
-#: builtin/tag.c:333
+#: builtin/tag.c:112
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "kunde inte bekräfta taggen \"%s\""
 
-#: builtin/tag.c:343
+#: builtin/tag.c:122
 #, c-format
 msgid ""
 "\n"
@@ -10385,7 +10556,7 @@
 "  %s\n"
 "Rader som inleds med \"%c\" ignoreras.\n"
 
-#: builtin/tag.c:347
+#: builtin/tag.c:126
 #, c-format
 msgid ""
 "\n"
@@ -10400,153 +10571,138 @@
 "Rader som inleds med \"%c\" kommer behållas; du kan själv ta bort dem om\n"
 "du vill.\n"
 
-#: builtin/tag.c:371
-#, c-format
-msgid "unsupported sort specification '%s'"
-msgstr "sorteringsangivelsen \"%s\" stöds ej"
-
-#: builtin/tag.c:373
-#, c-format
-msgid "unsupported sort specification '%s' in variable '%s'"
-msgstr "sorteringsangivelsen \"%s\" i variabeln \"%s\" stöds ej"
-
-#: builtin/tag.c:428
+#: builtin/tag.c:199
 msgid "unable to sign the tag"
 msgstr "kunde inte signera taggen"
 
-#: builtin/tag.c:430
+#: builtin/tag.c:201
 msgid "unable to write tag file"
 msgstr "kunde inte skriva tagg-filen"
 
-#: builtin/tag.c:455
+#: builtin/tag.c:226
 msgid "bad object type."
 msgstr "felaktig objekttyp"
 
-#: builtin/tag.c:468
+#: builtin/tag.c:239
 msgid "tag header too big."
 msgstr "tagghuvud för stort."
 
-#: builtin/tag.c:504
+#: builtin/tag.c:275
 msgid "no tag message?"
 msgstr "inget taggmeddelande?"
 
-#: builtin/tag.c:510
+#: builtin/tag.c:281
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Taggmeddelandet har lämnats i %s\n"
 
-#: builtin/tag.c:559
-msgid "switch 'points-at' requires an object"
-msgstr "flaggan \"points-at\" behöver ett objekt"
-
-#: builtin/tag.c:561
-#, c-format
-msgid "malformed object name '%s'"
-msgstr "felformat objektnamn \"%s\""
-
-#: builtin/tag.c:590
+#: builtin/tag.c:339
 msgid "list tag names"
 msgstr "lista taggnamn"
 
-#: builtin/tag.c:592
+#: builtin/tag.c:341
 msgid "print <n> lines of each tag message"
 msgstr "visa <n> rader från varje taggmeddelande"
 
-#: builtin/tag.c:594
+#: builtin/tag.c:343
 msgid "delete tags"
 msgstr "ta bort taggar"
 
-#: builtin/tag.c:595
+#: builtin/tag.c:344
 msgid "verify tags"
 msgstr "verifiera taggar"
 
-#: builtin/tag.c:597
+#: builtin/tag.c:346
 msgid "Tag creation options"
 msgstr "Alternativ för att skapa taggar"
 
-#: builtin/tag.c:599
+#: builtin/tag.c:348
 msgid "annotated tag, needs a message"
 msgstr "annoterad tagg, behöver meddelande"
 
-#: builtin/tag.c:601
+#: builtin/tag.c:350
 msgid "tag message"
 msgstr "taggmeddelande"
 
-#: builtin/tag.c:603
+#: builtin/tag.c:352
 msgid "annotated and GPG-signed tag"
 msgstr "annoterad och GPG-signerad tagg"
 
-#: builtin/tag.c:607
+#: builtin/tag.c:356
 msgid "use another key to sign the tag"
 msgstr "använd annan nyckel för att signera taggen"
 
-#: builtin/tag.c:608
+#: builtin/tag.c:357
 msgid "replace the tag if exists"
 msgstr "ersätt taggen om den finns"
 
-#: builtin/tag.c:609 builtin/update-ref.c:368
-msgid "create_reflog"
-msgstr "create_reflog"
+#: builtin/tag.c:358 builtin/update-ref.c:368
+msgid "create a reflog"
+msgstr "skapa en reflog"
 
-#: builtin/tag.c:611
+#: builtin/tag.c:360
 msgid "Tag listing options"
 msgstr "Alternativ för listning av taggar"
 
-#: builtin/tag.c:612
+#: builtin/tag.c:361
 msgid "show tag list in columns"
 msgstr "lista taggar i spalter"
 
-#: builtin/tag.c:614
-msgid "sort tags"
-msgstr "sortera taggar"
-
-#: builtin/tag.c:619 builtin/tag.c:625
+#: builtin/tag.c:362 builtin/tag.c:363
 msgid "print only tags that contain the commit"
 msgstr "visa endast taggar som innehåller incheckningen"
 
-#: builtin/tag.c:631
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
+msgstr "visa endast taggar som slagits samman"
+
+#: builtin/tag.c:365
+msgid "print only tags that are not merged"
+msgstr "visa endast taggar som ej slagits samman"
+
+#: builtin/tag.c:370
 msgid "print only tags of the object"
 msgstr "visa endast taggar för objektet"
 
-#: builtin/tag.c:657
+#: builtin/tag.c:399
 msgid "--column and -n are incompatible"
 msgstr "--column och -n är inkompatibla"
 
-#: builtin/tag.c:669
-msgid "--sort and -n are incompatible"
-msgstr "--sort och -n är inkompatibla"
-
-#: builtin/tag.c:676
+#: builtin/tag.c:419
 msgid "-n option is only allowed with -l."
 msgstr "Flaggan -n är endast tillåten tillsammans med -l."
 
-#: builtin/tag.c:678
+#: builtin/tag.c:421
 msgid "--contains option is only allowed with -l."
 msgstr "Flaggan --contains är endast tillåten tillsammans med -l"
 
-#: builtin/tag.c:680
+#: builtin/tag.c:423
 msgid "--points-at option is only allowed with -l."
 msgstr "Flaggan --points-at är endast tillåten tillsammans med -l."
 
-#: builtin/tag.c:688
+#: builtin/tag.c:425
+msgid "--merged and --no-merged option are only allowed with -l"
+msgstr "flaggorna --merged och --no-merged tillåts endast tillsammans med -l"
+
+#: builtin/tag.c:433
 msgid "only one -F or -m option is allowed."
 msgstr "endast en av flaggorna -F eller -m tillåts."
 
-#: builtin/tag.c:708
+#: builtin/tag.c:453
 msgid "too many params"
 msgstr "för många parametrar"
 
-#: builtin/tag.c:714
+#: builtin/tag.c:459
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "\"%s\" är inte ett giltigt taggnamn."
 
-#: builtin/tag.c:719
+#: builtin/tag.c:464
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "taggen \"%s\" finns redan"
 
-#: builtin/tag.c:744
+#: builtin/tag.c:489
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Uppdaterad tagg \"%s\" (var %s)\n"
@@ -10808,77 +10964,81 @@
 msgid "print tag contents"
 msgstr "visa innehåll för tag"
 
-#: builtin/worktree.c:13
-msgid "git worktree add [<options>] <path> <branch>"
-msgstr "git worktree add [<flaggor>] <sökväg> <gren>"
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr "git worktree add [<flaggor>] <sökväg> [<gren>]"
 
-#: builtin/worktree.c:14
+#: builtin/worktree.c:16
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<flaggor>]"
 
-#: builtin/worktree.c:36
+#: builtin/worktree.c:17
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<flaggor>]"
+
+#: builtin/worktree.c:39
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Tar bort worktrees/%s: inte en giltig katalog"
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:45
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Tar bort worktrees/%s: gitdir-filen existerar inte"
 
-#: builtin/worktree.c:47
+#: builtin/worktree.c:50
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "Tar bort worktrees/%s: kan inte läsa gitdir-filen (%s)"
 
-#: builtin/worktree.c:58
+#: builtin/worktree.c:61
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Tar bort worktrees/%s: felaktig gitdir-fil"
 
-#: builtin/worktree.c:74
+#: builtin/worktree.c:77
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "Tar bort worktrees/%s: gitdir-filen pekar på en ickeexisterande plats"
 
-#: builtin/worktree.c:109
+#: builtin/worktree.c:112
 #, c-format
 msgid "failed to remove: %s"
 msgstr "misslyckades ta bort: %s"
 
-#: builtin/worktree.c:198
+#: builtin/worktree.c:201
 #, c-format
 msgid "'%s' already exists"
 msgstr "\"%s\" finns redan"
 
-#: builtin/worktree.c:232
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "kunde inte skapa katalogen \"%s\""
 
-#: builtin/worktree.c:268
+#: builtin/worktree.c:271
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Förbereder %s (identifieraren %s)"
 
-#: builtin/worktree.c:316
+#: builtin/worktree.c:319
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr ""
 "checka ut <gren> även om den redan är utcheckad i en annan arbetskatalog"
 
-#: builtin/worktree.c:318
+#: builtin/worktree.c:321
 msgid "create a new branch"
 msgstr "skapa en ny gren"
 
-#: builtin/worktree.c:320
+#: builtin/worktree.c:323
 msgid "create or reset a branch"
 msgstr "skapa eller återställ en gren"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:324
 msgid "detach HEAD at named commit"
 msgstr "koppla från HEAD vid namngiven incheckning"
 
-#: builtin/worktree.c:328
+#: builtin/worktree.c:331
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B och --detach är ömsesidigt uteslutande"
 
@@ -11024,48 +11184,48 @@
 msgid "no-op (backward compatibility)"
 msgstr "ingen funktion (bakåtkompatibilitet)"
 
-#: parse-options.h:236
+#: parse-options.h:237
 msgid "be more verbose"
 msgstr "var mer pratsam"
 
-#: parse-options.h:238
+#: parse-options.h:239
 msgid "be more quiet"
 msgstr "var mer tyst"
 
-#: parse-options.h:244
+#: parse-options.h:245
 msgid "use <n> digits to display SHA-1s"
 msgstr "använd <n> siffror för att visa SHA-1:or"
 
-#: rerere.h:28
+#: rerere.h:38
 msgid "update the index with reused conflict resolution if possible"
 msgstr "uppdatera indexet med återanvänd konfliktlösning om möjligt"
 
-#: git-bisect.sh:50
+#: git-bisect.sh:55
 msgid "You need to start by \"git bisect start\""
 msgstr "Du måste starta med \"git bisect start\""
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:56
+#: git-bisect.sh:61
 msgid "Do you want me to do it for you [Y/n]? "
 msgstr "Vill du att jag ska göra det åt dig [Y=ja/N=nej]?"
 
-#: git-bisect.sh:99
+#: git-bisect.sh:122
 #, sh-format
 msgid "unrecognised option: '$arg'"
 msgstr "flaggan känns inte igen: \"$arg\""
 
-#: git-bisect.sh:103
+#: git-bisect.sh:126
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr "\"$arg\" verkar inte vara en giltig revision"
 
-#: git-bisect.sh:132
+#: git-bisect.sh:155
 msgid "Bad HEAD - I need a HEAD"
 msgstr "Felaktigt HEAD - Jag behöver ett HEAD"
 
-#: git-bisect.sh:145
+#: git-bisect.sh:168
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
@@ -11074,39 +11234,39 @@
 "<giltig_gren>\""
 
 # cogito-relaterat
-#: git-bisect.sh:155
+#: git-bisect.sh:178
 msgid "won't bisect on cg-seek'ed tree"
 msgstr "kör inte \"bisect\" på träd där \"cg-seek\" använts"
 
-#: git-bisect.sh:159
+#: git-bisect.sh:182
 msgid "Bad HEAD - strange symbolic ref"
 msgstr "Felaktigt HEAD - konstig symbolisk referens"
 
-#: git-bisect.sh:211
+#: git-bisect.sh:234
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr "Felaktigt argument till bisect_write: $state"
 
-#: git-bisect.sh:240
+#: git-bisect.sh:263
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr "Felaktig rev-indata: $arg"
 
-#: git-bisect.sh:255
+#: git-bisect.sh:278
 msgid "Please call 'bisect_state' with at least one argument."
 msgstr "Anropa \"bisect_state\" med minst ett argument."
 
-#: git-bisect.sh:267
+#: git-bisect.sh:290
 #, sh-format
 msgid "Bad rev input: $rev"
 msgstr "Felaktig rev-indata: $rev"
 
-#: git-bisect.sh:276
+#: git-bisect.sh:299
 #, sh-format
 msgid "'git bisect $TERM_BAD' can take only one argument."
 msgstr "\"git bisect $TERM_BAD\" kan bara ta ett argument."
 
-#: git-bisect.sh:299
+#: git-bisect.sh:322
 #, sh-format
 msgid "Warning: bisecting only with a $TERM_BAD commit."
 msgstr ""
@@ -11115,11 +11275,11 @@
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:305
+#: git-bisect.sh:328
 msgid "Are you sure [Y/n]? "
 msgstr "Är du säker [Y=ja/N=nej]? "
 
-#: git-bisect.sh:317
+#: git-bisect.sh:340
 #, sh-format
 msgid ""
 "You need to give me at least one $bad_syn and one $good_syn revision.\n"
@@ -11130,7 +11290,7 @@
 "(Du kan använda \"git bisect $bad_syn\" och \"git bisect $good_syn\" för "
 "detta.)"
 
-#: git-bisect.sh:320
+#: git-bisect.sh:343
 #, sh-format
 msgid ""
 "You need to start by \"git bisect start\".\n"
@@ -11143,16 +11303,16 @@
 "(Du kan använda \"git bisect $bad_syn\" och \"git bisect $good_syn\" för "
 "detta.)"
 
-#: git-bisect.sh:391 git-bisect.sh:521
+#: git-bisect.sh:414 git-bisect.sh:546
 msgid "We are not bisecting."
 msgstr "Vi utför ingen bisect för tillfället."
 
-#: git-bisect.sh:398
+#: git-bisect.sh:421
 #, sh-format
 msgid "'$invalid' is not a valid commit"
 msgstr "\"$invalid\" är inte en giltig incheckning"
 
-#: git-bisect.sh:407
+#: git-bisect.sh:430
 #, sh-format
 msgid ""
 "Could not check out original HEAD '$branch'.\n"
@@ -11161,25 +11321,25 @@
 "Kunde inte checka ut original-HEAD \"$branch\".\n"
 "Försök \"git bisect reset <incheckning>\"."
 
-#: git-bisect.sh:435
+#: git-bisect.sh:458
 msgid "No logfile given"
 msgstr "Ingen loggfil angiven"
 
-#: git-bisect.sh:436
+#: git-bisect.sh:459
 #, sh-format
 msgid "cannot read $file for replaying"
 msgstr "kan inte läsa $file för uppspelning"
 
-#: git-bisect.sh:455
+#: git-bisect.sh:480
 msgid "?? what are you talking about?"
 msgstr "?? vad menar du?"
 
-#: git-bisect.sh:467
+#: git-bisect.sh:492
 #, sh-format
 msgid "running $command"
 msgstr "kör $command"
 
-#: git-bisect.sh:474
+#: git-bisect.sh:499
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -11188,11 +11348,11 @@
 "\"bisect\"-körningen misslyckades:\n"
 "felkod $res från \"$command\" är < 0 eller >= 128"
 
-#: git-bisect.sh:500
+#: git-bisect.sh:525
 msgid "bisect run cannot continue any more"
 msgstr "\"bisect\"-körningen kan inte fortsätta längre"
 
-#: git-bisect.sh:506
+#: git-bisect.sh:531
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -11201,16 +11361,48 @@
 "\"bisect\"-körningen misslyckades:\n"
 "\"bisect_state $state\" avslutades med felkoden $res"
 
-#: git-bisect.sh:513
+#: git-bisect.sh:538
 msgid "bisect run success"
 msgstr "\"bisect\"-körningen lyckades"
 
-#: git-bisect.sh:548
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr "termerna måste vara olika"
+
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr "\"$term\" är inte en giltig term"
+
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr "kan inte använda det inbyggda kommandot \"$term\" som term"
+
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr "kan inte ändra betydelsen av termen \"$term\""
+
+#: git-bisect.sh:606
 #, sh-format
 msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
 msgstr ""
 "Ogiltigt kommando: du utför just nu en \"bisect\" med $TERM_BAD/$TERM_GOOD."
 
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "inga termer angivna"
+
+#: git-bisect.sh:653
+#, sh-format
+msgid ""
+"invalid argument $arg for 'git bisect terms'.\n"
+"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+msgstr ""
+"ogiltigt argument $arg för \"git bisect terms\".\n"
+"Flaggor som stöds är: --term-good|--term-old och --term-bad|--term-new."
+
 #: git-rebase.sh:57
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
@@ -11249,23 +11441,23 @@
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "Det verkar som en git-am körs. Kan inte ombasera."
 
-#: git-rebase.sh:351
+#: git-rebase.sh:354
 msgid "The --exec option must be used with the --interactive option"
 msgstr "Flaggan --exec måste användas tillsammans med flaggan --interactive"
 
-#: git-rebase.sh:356
+#: git-rebase.sh:359
 msgid "No rebase in progress?"
 msgstr "Ingen ombasering pågår?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:370
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "Åtgärden --edit-todo kan endast användas under interaktiv ombasering."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:377
 msgid "Cannot read HEAD"
 msgstr "Kan inte läsa HEAD"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:380
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -11273,12 +11465,12 @@
 "Du måste redigera alla sammanslagningskonflikter och\n"
 "därefter markera dem som lösta med git add"
 
-#: git-rebase.sh:395
+#: git-rebase.sh:398
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Kunde inte flytta tillbaka till $head_name"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:417
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11299,65 +11491,65 @@
 "och kör programmet igen. Jag avslutar ifall du fortfarande har\n"
 "något av värde där."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:468
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "ogiltig uppström $upstream_name"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:492
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: mer än en sammanslagningsbas finns"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:495 git-rebase.sh:499
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: ingen sammanslagningsbas finns"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:504
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Peka på en giltig incheckning: $onto_name"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:527
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "ödesdigert: ingen sådan gren: $branch_name"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:560
 msgid "Cannot autostash"
 msgstr "Kan inte utföra \"autostash\""
 
-#: git-rebase.sh:562
+#: git-rebase.sh:565
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Skapade autostash: $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:569
 msgid "Please commit or stash them."
 msgstr "Checka in eller använd \"stash\" på dem."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:589
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Aktuell gren $branch_name är à jour."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:593
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "Aktuell gren $branch_name är à jour, ombasering framtvingad."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:604
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Ändringar från $mb till $onto:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:613
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Först, spolar tillbaka huvudet för att spela av ditt arbete ovanpå det..."
 
-#: git-rebase.sh:620
+#: git-rebase.sh:623
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "Snabbspolade $branch_name till $onto_name."
@@ -11430,113 +11622,97 @@
 msgid "Cannot remove worktree changes"
 msgstr "Kan inte ta bort ändringar i arbetskatalogen"
 
-#: git-stash.sh:387
+#: git-stash.sh:405
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "okänd flagga: $opt"
 
-#: git-stash.sh:397
+#: git-stash.sh:415
 msgid "No stash found."
 msgstr "Ingen \"stash\" hittades."
 
-#: git-stash.sh:404
+#: git-stash.sh:422
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "För många revisioner angivna: $REV"
 
-#: git-stash.sh:410
+#: git-stash.sh:428
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference är inte en giltig referens"
 
-#: git-stash.sh:438
+#: git-stash.sh:456
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "\"$args\" är inte en \"stash\"-liknande incheckning"
 
-#: git-stash.sh:449
+#: git-stash.sh:467
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "\"$args\" är inte en \"stash\"-referens"
 
-#: git-stash.sh:457
+#: git-stash.sh:475
 msgid "unable to refresh index"
 msgstr "kan inte uppdatera indexet"
 
-#: git-stash.sh:461
+#: git-stash.sh:479
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Kan inte tillämpa en \"stash\" mitt i en sammanslagning"
 
-#: git-stash.sh:469
+#: git-stash.sh:487
 msgid "Conflicts in index. Try without --index."
 msgstr "Konflikter i indexet. Testa utan --index."
 
-#: git-stash.sh:471
+#: git-stash.sh:489
 msgid "Could not save index tree"
 msgstr "Kunde inte spara indexträd"
 
-#: git-stash.sh:505
+#: git-stash.sh:523
 msgid "Cannot unstage modified files"
 msgstr "Kan inte ta bort ändrade filer ur kön"
 
-#: git-stash.sh:520
+#: git-stash.sh:538
 msgid "Index was not unstashed."
 msgstr "Indexet har inte tagits ur kön."
 
-#: git-stash.sh:543
+#: git-stash.sh:561
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Kastade ${REV} ($s)"
 
-#: git-stash.sh:544
+#: git-stash.sh:562
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Kunde inte kasta \"stash\"-post"
 
-#: git-stash.sh:552
+#: git-stash.sh:570
 msgid "No branch name specified"
 msgstr "Inget grennamn angavs"
 
-#: git-stash.sh:624
+#: git-stash.sh:642
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(För att återställa dem, skriv \"git stash apply\")"
 
-#: git-submodule.sh:95
+#: git-submodule.sh:104
 #, sh-format
 msgid "cannot strip one component off url '$remoteurl'"
 msgstr "kan inte ta bort en komponent från url:en \"$remoteurl\""
 
-#: git-submodule.sh:237
-#, sh-format
-msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
-msgstr ""
-"Hittade ingen undermodulmappning i .gitmodules för sökvägen \"$sm_path\""
-
-#: git-submodule.sh:287
-#, sh-format
-msgid "Clone of '$url' into submodule path '$sm_path' failed"
-msgstr "Misslyckades klona \"$url\" till undermodulsökvägen \"$sm_path\""
-
-#: git-submodule.sh:296
-#, sh-format
-msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-msgstr "Gitkatalog \"$a\" ingår i undermodulsökvägen \"$b\" eller omvänt"
-
-#: git-submodule.sh:406
+#: git-submodule.sh:281
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr "Relativ sökväg kan endast användas från arbetskatalogens toppnivå"
 
-#: git-submodule.sh:416
+#: git-submodule.sh:291
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "arkiv-URL: \"$repo\" måste vara absolut eller börja med ./|../"
 
-#: git-submodule.sh:433
+#: git-submodule.sh:308
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "\"$sm_path\" finns redan i indexet"
 
-#: git-submodule.sh:437
+#: git-submodule.sh:312
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -11547,22 +11723,22 @@
 "$sm_path\n"
 "Använd -f om du verkligen vill lägga till den"
 
-#: git-submodule.sh:455
+#: git-submodule.sh:330
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Lägger till befintligt arkiv i \"$sm_path\" i indexet"
 
-#: git-submodule.sh:457
+#: git-submodule.sh:332
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "\"$sm_path\" finns redan och är inte ett giltigt git-arkiv"
 
-#: git-submodule.sh:465
+#: git-submodule.sh:340
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr "En git-katalog för \"$sm_name\" hittades lokalt med fjärr(ar):"
 
-#: git-submodule.sh:467
+#: git-submodule.sh:342
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
@@ -11570,14 +11746,14 @@
 "För att återanvända den lokala git-katalogen istället för att på nytt klona "
 "från"
 
-#: git-submodule.sh:469
+#: git-submodule.sh:344
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
 msgstr ""
 "använd flaggan \"--force\". Om den lokala git-katalogen inte är riktigt arkiv"
 
-#: git-submodule.sh:470
+#: git-submodule.sh:345
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -11586,81 +11762,81 @@
 "eller om du är osäker på vad det innebär, välj nytt namn med flaggan \"--name"
 "\"."
 
-#: git-submodule.sh:472
+#: git-submodule.sh:347
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Aktiverar lokal git-katalog för undermodulen \"$sm_name\" på nytt."
 
-#: git-submodule.sh:484
+#: git-submodule.sh:359
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Kan inte checka ut undermodulen \"$sm_path\""
 
-#: git-submodule.sh:489
+#: git-submodule.sh:364
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Misslyckades lägga till undermodulen \"$sm_path\""
 
-#: git-submodule.sh:498
+#: git-submodule.sh:373
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Misslyckades registrera undermodulen \"$sm_path\""
 
-#: git-submodule.sh:542
+#: git-submodule.sh:417
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Går in i \"$prefix$displaypath\""
 
-#: git-submodule.sh:562
+#: git-submodule.sh:437
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr ""
 "Stoppar på \"$prefix$displaypath\"; skriptet returnerade en status skild "
 "från noll."
 
-#: git-submodule.sh:608
+#: git-submodule.sh:483
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr ""
 "Hittade ingen url för undermodulsökvägen \"$displaypath\" i .gitmodules"
 
-#: git-submodule.sh:617
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr "Misslyckades registrera url för undermodulsökväg \"$displaypath\""
 
-#: git-submodule.sh:619
+#: git-submodule.sh:494
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr ""
 "Undermodulen \"$name\" ($url) registrerad för sökvägen \"$displaypath\""
 
-#: git-submodule.sh:636
+#: git-submodule.sh:511
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr ""
 "Misslyckades registrera uppdateringsläge för undermodulsökväg \"$displaypath"
 "\""
 
-#: git-submodule.sh:674
+#: git-submodule.sh:549
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr "Använd \".\" om du verkligen vill avinitiera alla undermoduler"
 
-#: git-submodule.sh:691
+#: git-submodule.sh:566
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr ""
 "Undermodulens arbetskatalog \"$displaypath\" innehåller katalogen \".git\""
 
-#: git-submodule.sh:692
+#: git-submodule.sh:567
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
 "(använd \"rm -rf\" om du verkligen vill ta bort den och all dess historik)"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:573
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -11669,28 +11845,28 @@
 "Undermodulens arbetskatalog \"$displaypath\" har lokala ändringar; \"-f\" "
 "kastar bort dem"
 
-#: git-submodule.sh:701
+#: git-submodule.sh:576
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Rensade katalogen \"$displaypath\""
 
-#: git-submodule.sh:702
+#: git-submodule.sh:577
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "Kunde inte ta bort undermodulens arbetskatalog \"$displaypath\""
 
-#: git-submodule.sh:705
+#: git-submodule.sh:580
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "Kunde inte skapa tom undermodulskatalog \"$displaypath\""
 
-#: git-submodule.sh:714
+#: git-submodule.sh:589
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 "Undermodulen \"$name\" ($url) avregistrerad för sökvägen \"$displaypath\""
 
-#: git-submodule.sh:830
+#: git-submodule.sh:705
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -11699,108 +11875,165 @@
 "Undermodulen \"$displaypath\" har inte initierats\n"
 "Kanske du vill köra \"update --init\"?"
 
-#: git-submodule.sh:843
+#: git-submodule.sh:718
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "Kan inte hitta aktuell revision i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:852
+#: git-submodule.sh:727
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Kan inte hämta i undermodulsökväg \"$sm_path\""
 
-#: git-submodule.sh:876
+#: git-submodule.sh:751
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Kan inte hämta i undermodulsökväg \"$displaypath\""
 
-#: git-submodule.sh:890
+#: git-submodule.sh:765
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Kan inte checka ut \"$sha1\" i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:891
+#: git-submodule.sh:766
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Undermodulsökvägen \"$displaypath\": checkade ut \"$sha1\""
 
-#: git-submodule.sh:895
+#: git-submodule.sh:770
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "Kan inte ombasera \"$sha1\" i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:896
+#: git-submodule.sh:771
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Undermodulsökvägen \"$displaypath\": ombaserade in i \"$sha1\""
 
-#: git-submodule.sh:901
+#: git-submodule.sh:776
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "Kan inte slå ihop \"$sha1\" i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:902
+#: git-submodule.sh:777
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Undermodulsökvägen \"$displaypath\": sammanslagen i \"$sha1\""
 
-#: git-submodule.sh:907
+#: git-submodule.sh:782
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
 msgstr ""
 "Misslyckades köra \"$command $sha1\" i undermodulsökvägen \"$prefix$sm_path\""
 
-#: git-submodule.sh:908
+#: git-submodule.sh:783
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "Undermodulsökvägen \"$prefix$sm_path\": \"$command $sha1\""
 
-#: git-submodule.sh:938
+#: git-submodule.sh:813
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Misslyckades rekursera in i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:1046
+#: git-submodule.sh:921
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Flaggan --cached kan inte användas med flaggan --files"
 
-#: git-submodule.sh:1098
+#: git-submodule.sh:973
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "oväntat läge $mod_dst"
 
-#: git-submodule.sh:1118
+#: git-submodule.sh:993
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Varning: $display_name innehåller inte incheckningen $sha1_src"
 
-#: git-submodule.sh:1121
+#: git-submodule.sh:996
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Varning: $display_name innehåller inte incheckningen $sha1_dst"
 
-#: git-submodule.sh:1124
+#: git-submodule.sh:999
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 "  Varning: $display_name innehåller inte incheckningarna $sha1_src och "
 "$sha1_dst"
 
-#: git-submodule.sh:1149
+#: git-submodule.sh:1024
 msgid "blob"
 msgstr "blob"
 
-#: git-submodule.sh:1267
+#: git-submodule.sh:1142
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Misslyckades rekursera in i undermodulsökvägen \"$sm_path\""
 
-#: git-submodule.sh:1331
+#: git-submodule.sh:1206
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 
+#~ msgid "unable to look up current user in the passwd file: %s"
+#~ msgstr "kan inte slå upp aktuell användare i passwd-filen: %s"
+
+#~ msgid "no such user"
+#~ msgstr "okänd användare"
+
+#~ msgid "branch '%s' does not point at a commit"
+#~ msgstr "grenen \"%s\" pekar inte på en incheckning"
+
+#~ msgid "object '%s' does not point to a commit"
+#~ msgstr "objektet \"%s\" pekar på en incheckning"
+
+#~ msgid "some refs could not be read"
+#~ msgstr "vissa referenser kunde inte läsas"
+
+#~ msgid "print only merged branches"
+#~ msgstr "visa endast sammanslagna grenar"
+
+#~ msgid "--dissociate given, but there is no --reference"
+#~ msgstr "--dissociate angavs, men --reference har inte angivits"
+
+#~ msgid "show usage"
+#~ msgstr "visa användning"
+
+#~ msgid "insanely long template name %s"
+#~ msgstr "tokigt långt namn på mallen %s"
+
+#~ msgid "insanely long symlink %s"
+#~ msgstr "tokigt lång symbolisk länk %s"
+
+#~ msgid "insanely long template path %s"
+#~ msgstr "tokigt lång mallsökväg %s"
+
+#~ msgid "insane git directory %s"
+#~ msgstr "tokig git-katalog %s"
+
+#~ msgid "false|true|preserve"
+#~ msgstr "false|true|preserve"
+
+#~ msgid "unsupported sort specification '%s'"
+#~ msgstr "sorteringsangivelsen \"%s\" stöds ej"
+
+#~ msgid "unsupported sort specification '%s' in variable '%s'"
+#~ msgstr "sorteringsangivelsen \"%s\" i variabeln \"%s\" stöds ej"
+
+#~ msgid "switch 'points-at' requires an object"
+#~ msgstr "flaggan \"points-at\" behöver ett objekt"
+
+#~ msgid "sort tags"
+#~ msgstr "sortera taggar"
+
+#~ msgid "--sort and -n are incompatible"
+#~ msgstr "--sort och -n är inkompatibla"
+
+#~ msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
+#~ msgstr "Gitkatalog \"$a\" ingår i undermodulsökvägen \"$b\" eller omvänt"
+
 #~ msgid "BUG: reopen a lockfile that is still open"
 #~ msgstr "FEL: återöppna en låsfil som fortfarande är öppen"
 
diff --git a/po/vi.po b/po/vi.po
index 3231595..f3fee99 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -6,10 +6,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: git v2.6.0-rc2\n"
+"Project-Id-Version: git v2.7.0-rc0\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2015-09-15 06:45+0800\n"
-"PO-Revision-Date: 2015-09-15 07:15+0700\n"
+"POT-Creation-Date: 2015-12-11 23:36+0800\n"
+"PO-Revision-Date: 2015-12-12 14:31+0700\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
 "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
 "Language: vi\n"
@@ -36,13 +36,13 @@
 "và sau đó dùng lệnh “git add/rm <tập-tin>”\n"
 "dành riêng cho việc đánh dấu cần giải quyết và tạo lần chuyển giao."
 
-#: advice.c:101 builtin/merge.c:1227
+#: advice.c:101 builtin/merge.c:1225
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Bạn chưa kết thúc việc hòa trộn (MERGE_HEAD vẫn tồn tại)."
 
 #: advice.c:103
-msgid "Please, commit your changes before you can merge."
-msgstr "Vui lòng chuyển giao các thay đổi trước khi bạn có thể hòa trộn."
+msgid "Please, commit your changes before merging."
+msgstr "Vui lòng chuyển giao các thay đổi trước khi hòa trộn."
 
 #: advice.c:104
 msgid "Exiting because of unfinished merge."
@@ -67,76 +67,76 @@
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <kho> [--exec <lệnh>] --list"
 
-#: archive.c:343 builtin/add.c:137 builtin/add.c:426 builtin/rm.c:327
+#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "đặc tả đường dẫn “%s” không khớp với bất kỳ tập tin nào"
 
-#: archive.c:428
+#: archive.c:429
 msgid "fmt"
 msgstr "định_dạng"
 
-#: archive.c:428
+#: archive.c:429
 msgid "archive format"
 msgstr "định dạng lưu trữ"
 
-#: archive.c:429 builtin/log.c:1229
+#: archive.c:430 builtin/log.c:1228
 msgid "prefix"
 msgstr "tiền_tố"
 
-#: archive.c:430
+#: archive.c:431
 msgid "prepend prefix to each pathname in the archive"
 msgstr "nối thêm tiền tố vào từng đường dẫn tập tin trong kho lưu"
 
-#: archive.c:431 builtin/archive.c:88 builtin/blame.c:2516 builtin/blame.c:2517
+#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535 builtin/blame.c:2536
 #: builtin/config.c:58 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:712 builtin/hash-object.c:99 builtin/ls-files.c:446
+#: builtin/grep.c:707 builtin/hash-object.c:99 builtin/ls-files.c:446
 #: builtin/ls-files.c:449 builtin/notes.c:395 builtin/notes.c:558
 #: builtin/read-tree.c:109 parse-options.h:153
 msgid "file"
 msgstr "tập_tin"
 
-#: archive.c:432 builtin/archive.c:89
+#: archive.c:433 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "ghi kho lưu vào tập tin này"
 
-#: archive.c:434
+#: archive.c:435
 msgid "read .gitattributes in working directory"
 msgstr "đọc .gitattributes trong thư mục làm việc"
 
-#: archive.c:435
+#: archive.c:436
 msgid "report archived files on stderr"
 msgstr "liệt kê các tập tin được lưu trữ vào stderr (đầu ra lỗi tiêu chuẩn)"
 
-#: archive.c:436
+#: archive.c:437
 msgid "store only"
 msgstr "chỉ lưu (không nén)"
 
-#: archive.c:437
+#: archive.c:438
 msgid "compress faster"
 msgstr "nén nhanh hơn"
 
-#: archive.c:445
+#: archive.c:446
 msgid "compress better"
 msgstr "nén nhỏ hơn"
 
-#: archive.c:448
+#: archive.c:449
 msgid "list supported archive formats"
 msgstr "liệt kê các kiểu nén được hỗ trợ"
 
-#: archive.c:450 builtin/archive.c:90 builtin/clone.c:77
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77
 msgid "repo"
 msgstr "kho"
 
-#: archive.c:451 builtin/archive.c:91
+#: archive.c:452 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "nhận kho nén từ kho chứa <kho> trên máy chủ"
 
-#: archive.c:452 builtin/archive.c:92 builtin/notes.c:479
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479
 msgid "command"
 msgstr "lệnh"
 
-#: archive.c:453 builtin/archive.c:93
+#: archive.c:454 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "đường dẫn đến lệnh git-upload-pack trên máy chủ"
 
@@ -148,84 +148,84 @@
 "Các mẫu dạng phủ định bị cấm dùng cho các thuộc tính của git\n"
 "Dùng “\\!” cho các chuỗi văn bản có dấu chấm than dẫn đầu."
 
-#: branch.c:60
+#: branch.c:61
 #, c-format
 msgid "Not setting branch %s as its own upstream."
 msgstr "Chưa cài đặt nhánh %s như là thượng nguồn của nó."
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s từ %s bằng cách rebase."
 
-#: branch.c:84
+#: branch.c:85
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s từ %s."
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr "Nhánh %s cài đặt để theo dõi nhánh nội bộ %s bằng cách rebase."
 
-#: branch.c:89
+#: branch.c:90
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "Nhánh %s cài đặt để theo dõi nhánh nội bộ %s."
 
-#: branch.c:94
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s bằng cách rebase."
 
-#: branch.c:95
+#: branch.c:96
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "Nhánh %s cài đặt để theo dõi tham chiếu máy chủ %s."
 
-#: branch.c:99
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
 "Nhánh %s cài đặt để theo dõi vết tham chiếu nội bộ %s bằng cách rebase."
 
-#: branch.c:100
+#: branch.c:101
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "Nhánh %s cài đặt để theo dõi tham chiếu nội bộ %s."
 
-#: branch.c:133
+#: branch.c:134
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "Không theo dõi: thông tin chưa rõ ràng cho tham chiếu %s"
 
-#: branch.c:162
+#: branch.c:163
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "“%s” không phải là một tên nhánh hợp lệ."
 
-#: branch.c:167
+#: branch.c:168
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Đã có nhánh mang tên “%s”."
 
-#: branch.c:175
+#: branch.c:176
 msgid "Cannot force update the current branch."
 msgstr "Không thể ép buộc cập nhật nhánh hiện hành."
 
-#: branch.c:195
+#: branch.c:196
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr ""
 "Không thể cài đặt thông tin theo dõi; điểm bắt đầu “%s” không phải là một "
 "nhánh."
 
-#: branch.c:197
+#: branch.c:198
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "nhánh thượng nguồn đã yêu cầu “%s” không tồn tại"
 
-#: branch.c:199
+#: branch.c:200
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -245,22 +245,22 @@
 "sẽ theo dõi bản đối chiếu máy chủ của nó, bạn cần dùng lệnh\n"
 "\"git push -u\" để đặt cấu hình thượng nguồn bạn muốn push."
 
-#: branch.c:243
+#: branch.c:244
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Không phải tên đối tượng hợp lệ: “%s”."
 
-#: branch.c:263
+#: branch.c:264
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Tên đối tượng chưa rõ ràng: “%s”."
 
-#: branch.c:268
+#: branch.c:269
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Nhánh không hợp lệ: “%s”."
 
-#: branch.c:399
+#: branch.c:322
 #, c-format
 msgid "'%s' is already checked out at '%s'"
 msgstr "“%s” đã sẵn được lấy ra tại “%s”"
@@ -275,7 +275,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr "phần đầu không được thừa nhận: %s%s (%d)"
 
-#: bundle.c:87 builtin/commit.c:765
+#: bundle.c:87 builtin/commit.c:766
 #, c-format
 msgid "could not open '%s'"
 msgstr "không thể mở “%s”"
@@ -284,9 +284,9 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Kho chứa thiếu những lần chuyển giao tiên quyết này:"
 
-#: bundle.c:163 sequencer.c:636 sequencer.c:1083 builtin/blame.c:2708
-#: builtin/branch.c:652 builtin/commit.c:1044 builtin/log.c:334
-#: builtin/log.c:850 builtin/log.c:1457 builtin/log.c:1690 builtin/merge.c:358
+#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083
+#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334
+#: builtin/log.c:849 builtin/log.c:1456 builtin/log.c:1689 builtin/merge.c:358
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "cài đặt việc di chuyển qua các điểm xét duyệt gặp lỗi"
@@ -295,7 +295,7 @@
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "Bundle chứa %d tham chiếu:"
+msgstr[0] "Bó dữ liệu chứa %d tham chiếu:"
 
 #: bundle.c:192
 msgid "The bundle records a complete history."
@@ -324,14 +324,14 @@
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "th.chiếu “%s” bị loại trừ bởi các tùy chọn rev-list"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1367 builtin/shortlog.c:261
+#: bundle.c:443 builtin/log.c:157 builtin/log.c:1366 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "đối số không được thừa nhận: %s"
 
 #: bundle.c:449
 msgid "Refusing to create empty bundle."
-msgstr "Từ chối tạo một bundle trống rỗng."
+msgstr "Từ chối tạo một bó dữ liệu trống rỗng."
 
 #: bundle.c:459
 #, c-format
@@ -342,13 +342,13 @@
 msgid "index-pack died"
 msgstr "mục lục gói đã chết"
 
-#: color.c:260
+#: color.c:275
 #, c-format
 msgid "invalid color value: %.*s"
 msgstr "giá trị màu không hợp lệ: %.*s"
 
-#: commit.c:40 builtin/am.c:451 builtin/am.c:487 builtin/am.c:1516
-#: builtin/am.c:2128
+#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520
+#: builtin/am.c:2149
 #, c-format
 msgid "could not parse %s"
 msgstr "không thể phân tích cú pháp %s"
@@ -497,22 +497,22 @@
 msgid "Performing inexact rename detection"
 msgstr "Đang thực hiện dò tìm đổi tên không chính xác"
 
-#: diff.c:116
+#: diff.c:115
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr "  Gặp lỗi khi phân tích dirstat cắt bỏ phần trăm “%s”\n"
 
-#: diff.c:121
+#: diff.c:120
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Không hiểu đối số dirstat “%s”\n"
 
-#: diff.c:216
+#: diff.c:215
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Không hiểu giá trị cho biến cấu hình “diff.submodule”: “%s”"
 
-#: diff.c:268
+#: diff.c:267
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -521,16 +521,16 @@
 "Tìm thấy các lỗi trong biến cấu hình “diff.dirstat”:\n"
 "%s"
 
-#: diff.c:2998
+#: diff.c:3000
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "phần mềm diff ở bên ngoài đã chết, dừng tại %s"
 
-#: diff.c:3394
+#: diff.c:3396
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow cần chính xác một đặc tả đường dẫn"
 
-#: diff.c:3557
+#: diff.c:3559
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -539,16 +539,16 @@
 "Gặp lỗi khi phân tích đối số tùy chọn --dirstat/-X:\n"
 "%s"
 
-#: diff.c:3571
+#: diff.c:3573
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Gặp lỗi khi phân tích đối số tùy chọn --submodule: “%s”"
 
-#: dir.c:1853
+#: dir.c:1915
 msgid "failed to get kernel name and information"
 msgstr "gặp lỗi khi lấy tên và thông tin của nhân"
 
-#: dir.c:1936
+#: dir.c:1998
 msgid "Untracked cache is disabled on this system."
 msgstr "Bộ nhớ tạm không theo vết bị tắt trên hệ thống này."
 
@@ -654,8 +654,8 @@
 msgid "failed to read the cache"
 msgstr "gặp lỗi khi đọc bộ nhớ đệm"
 
-#: merge.c:94 builtin/am.c:2001 builtin/am.c:2036 builtin/checkout.c:375
-#: builtin/checkout.c:586 builtin/clone.c:715
+#: merge.c:94 builtin/am.c:2022 builtin/am.c:2057 builtin/checkout.c:376
+#: builtin/checkout.c:587 builtin/clone.c:722
 msgid "unable to write new index file"
 msgstr "không thể ghi tập tin lưu bảng mục lục mới"
 
@@ -673,64 +673,64 @@
 msgid "error building trees"
 msgstr "gặp lỗi khi xây dựng cây"
 
-#: merge-recursive.c:687
+#: merge-recursive.c:686
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "gặp lỗi khi tạo đường dẫn “%s”%s"
 
-#: merge-recursive.c:698
+#: merge-recursive.c:697
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Gỡ bỏ %s để tạo chỗ (room) cho thư mục con\n"
 
-#: merge-recursive.c:712 merge-recursive.c:733
+#: merge-recursive.c:711 merge-recursive.c:732
 msgid ": perhaps a D/F conflict?"
 msgstr ": có lẽ là một xung đột D/F?"
 
-#: merge-recursive.c:723
+#: merge-recursive.c:722
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "từ chối đóng tập tin không được theo dõi tại “%s”"
 
-#: merge-recursive.c:763
+#: merge-recursive.c:762
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "không thể đọc đối tượng %s “%s”"
 
-#: merge-recursive.c:765
+#: merge-recursive.c:764
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "đối tượng blob được mong đợi cho %s “%s”"
 
-#: merge-recursive.c:788 builtin/clone.c:364
+#: merge-recursive.c:787 builtin/clone.c:369
 #, c-format
 msgid "failed to open '%s'"
 msgstr "gặp lỗi khi mở “%s”"
 
-#: merge-recursive.c:796
+#: merge-recursive.c:795
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "gặp lỗi khi tạo liên kết mềm (symlink) “%s”"
 
-#: merge-recursive.c:799
+#: merge-recursive.c:798
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "không hiểu phải làm gì với %06o %s “%s”"
 
-#: merge-recursive.c:937
+#: merge-recursive.c:936
 msgid "Failed to execute internal merge"
 msgstr "Gặp lỗi khi thực hiện trộn nội bộ"
 
-#: merge-recursive.c:941
+#: merge-recursive.c:940
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Không thể thêm %s vào cơ sở dữ liệu"
 
-#: merge-recursive.c:957
+#: merge-recursive.c:956
 msgid "unsupported object type in the tree"
 msgstr "kiểu đối tượng không được hỗ trợ trong cây (tree)"
 
-#: merge-recursive.c:1032 merge-recursive.c:1046
+#: merge-recursive.c:1031 merge-recursive.c:1045
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -739,7 +739,7 @@
 "XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s "
 "còn lại trong cây (tree)."
 
-#: merge-recursive.c:1038 merge-recursive.c:1051
+#: merge-recursive.c:1037 merge-recursive.c:1050
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -748,20 +748,20 @@
 "XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s "
 "còn lại trong cây (tree) tại %s."
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "rename"
 msgstr "đổi tên"
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "renamed"
 msgstr "đã đổi tên"
 
-#: merge-recursive.c:1148
+#: merge-recursive.c:1147
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s là một thư mục trong %s thay vào đó thêm vào như là %s"
 
-#: merge-recursive.c:1170
+#: merge-recursive.c:1169
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -770,145 +770,145 @@
 "XUNG ĐỘT (đổi-tên/đổi-tên): Đổi tên \"%s\"->\"%s\" trong nhánh \"%s\" đổi "
 "tên \"%s\"->\"%s\" trong \"%s\"%s"
 
-#: merge-recursive.c:1175
+#: merge-recursive.c:1174
 msgid " (left unresolved)"
 msgstr " (cần giải quyết)"
 
-#: merge-recursive.c:1229
+#: merge-recursive.c:1228
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 "XUNG ĐỘT (đổi-tên/đổi-tên): Đổi tên %s->%s trong %s. Đổi tên %s->%s trong %s"
 
-#: merge-recursive.c:1259
+#: merge-recursive.c:1258
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Đang đổi tên %s thành %s thay vì %s thành %s"
 
-#: merge-recursive.c:1458
+#: merge-recursive.c:1457
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 "XUNG ĐỘT (đổi-tên/thêm): Đổi tên %s->%s trong %s. %s được thêm vào trong %s"
 
-#: merge-recursive.c:1468
+#: merge-recursive.c:1467
 #, c-format
 msgid "Adding merged %s"
 msgstr "Thêm hòa trộn %s"
 
-#: merge-recursive.c:1473 merge-recursive.c:1671
+#: merge-recursive.c:1472 merge-recursive.c:1674
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Thay vào đó thêm vào %s"
 
-#: merge-recursive.c:1524
+#: merge-recursive.c:1523
 #, c-format
 msgid "cannot read object %s"
 msgstr "không thể đọc đối tượng %s"
 
-#: merge-recursive.c:1527
+#: merge-recursive.c:1526
 #, c-format
 msgid "object %s is not a blob"
 msgstr "đối tượng %s không phải là một blob"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modify"
 msgstr "sửa đổi"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modified"
 msgstr "đã sửa"
 
-#: merge-recursive.c:1585
+#: merge-recursive.c:1588
 msgid "content"
 msgstr "nội dung"
 
-#: merge-recursive.c:1592
+#: merge-recursive.c:1595
 msgid "add/add"
 msgstr "thêm/thêm"
 
-#: merge-recursive.c:1626
+#: merge-recursive.c:1629
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Đã bỏ qua %s (đã có sẵn lần hòa trộn này)"
 
-#: merge-recursive.c:1640
+#: merge-recursive.c:1643
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Tự-động-hòa-trộn %s"
 
-#: merge-recursive.c:1644 git-submodule.sh:1150
+#: merge-recursive.c:1647 git-submodule.sh:1025
 msgid "submodule"
 msgstr "mô-đun-con"
 
-#: merge-recursive.c:1645
+#: merge-recursive.c:1648
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "XUNG ĐỘT (%s): Xung đột hòa trộn trong %s"
 
-#: merge-recursive.c:1731
+#: merge-recursive.c:1734
 #, c-format
 msgid "Removing %s"
 msgstr "Đang xóa %s"
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1759
 msgid "file/directory"
 msgstr "tập-tin/thư-mục"
 
-#: merge-recursive.c:1762
+#: merge-recursive.c:1765
 msgid "directory/file"
 msgstr "thư-mục/tập-tin"
 
-#: merge-recursive.c:1767
+#: merge-recursive.c:1770
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 "XUNG ĐỘT (%s): Ở đây không có thư mục nào có tên %s trong %s. Thêm %s như là "
 "%s"
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1780
 #, c-format
 msgid "Adding %s"
 msgstr "Thêm \"%s\""
 
-#: merge-recursive.c:1794
+#: merge-recursive.c:1797
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Việc hòa trộn hỏng nghiêm trọng, không nên để xảy ra."
 
-#: merge-recursive.c:1813
+#: merge-recursive.c:1816
 msgid "Already up-to-date!"
 msgstr "Đã cập nhật rồi!"
 
-#: merge-recursive.c:1822
+#: merge-recursive.c:1825
 #, c-format
 msgid "merging of trees %s and %s failed"
-msgstr "hòa trộn cây (tree) %s và %s gặp lỗi"
+msgstr "hòa trộn các cây %s và %s gặp lỗi"
 
-#: merge-recursive.c:1852
+#: merge-recursive.c:1855
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "Đường dẫn chưa được xử lý??? %s"
 
-#: merge-recursive.c:1900
+#: merge-recursive.c:1903
 msgid "Merging:"
 msgstr "Đang trộn:"
 
-#: merge-recursive.c:1913
+#: merge-recursive.c:1916
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "tìm thấy %u tổ tiên chung:"
 
-#: merge-recursive.c:1950
+#: merge-recursive.c:1953
 msgid "merge returned no commit"
 msgstr "hòa trộn không trả về lần chuyển giao nào"
 
-#: merge-recursive.c:2007
+#: merge-recursive.c:2010
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Không thể phân tích đối tượng “%s”"
 
-#: merge-recursive.c:2018 builtin/merge.c:645
+#: merge-recursive.c:2021 builtin/merge.c:645
 msgid "Unable to write index."
 msgstr "Không thể ghi bảng mục lục"
 
@@ -940,31 +940,41 @@
 msgid "unable to parse object: %s"
 msgstr "không thể phân tích đối tượng: “%s”"
 
-#: parse-options.c:563
+#: parse-options.c:570
 msgid "..."
 msgstr "…"
 
-#: parse-options.c:581
+#: parse-options.c:588
 #, c-format
 msgid "usage: %s"
 msgstr "cách dùng: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:585
+#: parse-options.c:592
 #, c-format
 msgid "   or: %s"
 msgstr "     hoặc: %s"
 
-#: parse-options.c:588
+#: parse-options.c:595
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:622
+#: parse-options.c:629
 msgid "-NUM"
 msgstr "-SỐ"
 
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "tên đối tượng dị hình “%s”"
+
+#: path.c:752
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "Không thể làm %s được ghi bởi nhóm"
+
 #: pathspec.c:133
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
@@ -1034,11 +1044,11 @@
 msgid "unable to parse --pretty format"
 msgstr "không thể phân tích định dạng --pretty"
 
-#: progress.c:236
+#: progress.c:235
 msgid "done"
 msgstr "xong"
 
-#: read-cache.c:1296
+#: read-cache.c:1281
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -1047,7 +1057,7 @@
 "index.version được đặt, nhưng giá trị của nó lại không hợp lệ.\n"
 "Dùng phiên bản %i"
 
-#: read-cache.c:1306
+#: read-cache.c:1291
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1056,119 +1066,164 @@
 "GIT_INDEX_VERSION được đặt, nhưng giá trị của nó lại không hợp lệ.\n"
 "Dùng phiên bản %i"
 
-#: refs.c:2941 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
+#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
 #: builtin/merge.c:983
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Không thể mở “%s” để ghi"
 
-#: refs.c:3001
+#: refs/files-backend.c:2359
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "không thể xóa bỏ tham chiếu %s: %s"
 
-#: refs.c:3004
+#: refs/files-backend.c:2362
 #, c-format
 msgid "could not delete references: %s"
 msgstr "không thể xóa bỏ tham chiếu: %s"
 
-#: refs.c:3013
+#: refs/files-backend.c:2371
 #, c-format
 msgid "could not remove reference %s"
 msgstr "không thể gỡ bỏ tham chiếu: %s"
 
-#: ref-filter.c:660
+#: ref-filter.c:245
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "định dạng: nguyên tử %%(end) được dùng mà không có nguyên tử tương ứng"
+
+#: ref-filter.c:704
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "cần nội dung mang giá trị dương:lines=%s"
+
+#: ref-filter.c:833
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "cần định dạng: %%(color:<color>)"
+
+#: ref-filter.c:835
 msgid "unable to parse format"
 msgstr "không thể phân tích định dạng"
 
-#: remote.c:792
+#: ref-filter.c:870
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "cần định dạng: %%(align:<width>,<position>)"
+
+#: ref-filter.c:893
+#, c-format
+msgid "improper format entered align:%s"
+msgstr "định dạng không đúng chỗ căn chỉnh:%s"
+
+#: ref-filter.c:898
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "cần giá trị độ rộng dương với nguyên tử %%(align)"
+
+#: ref-filter.c:1219
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "đối tượng dị hình tại “%s”"
+
+#: ref-filter.c:1561
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "định dạng: thiếu nguyên tử %%(end)"
+
+#: ref-filter.c:1615
+#, c-format
+msgid "malformed object name %s"
+msgstr "tên đối tượng dị hình %s"
+
+#: remote.c:756
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "Không thể lấy về cả %s và %s cho %s"
 
-#: remote.c:796
+#: remote.c:760
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s thường theo dõi %s, không phải %s"
 
-#: remote.c:800
+#: remote.c:764
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s theo dõi cả %s và %s"
 
-#: remote.c:808
+#: remote.c:772
 msgid "Internal error"
 msgstr "Lỗi nội bộ"
 
-#: remote.c:1723 remote.c:1766
+#: remote.c:1687 remote.c:1730
 msgid "HEAD does not point to a branch"
 msgstr "HEAD không chỉ đến một nhánh nào cả"
 
-#: remote.c:1732
+#: remote.c:1696
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "không có nhánh nào như thế: “%s”"
 
-#: remote.c:1735
+#: remote.c:1699
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "không có thượng nguồn được cấu hình cho nhánh “%s”"
 
-#: remote.c:1741
+#: remote.c:1705
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr ""
 "nhánh thượng nguồn “%s” không được lưu lại như là một nhánh theo dõi máy chủ"
 
-#: remote.c:1756
+#: remote.c:1720
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr "đẩy lên đích “%s” trên máy chủ “%s” không có nhánh theo dõi nội bộ"
 
-#: remote.c:1771
+#: remote.c:1735
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "nhánh “%s” không có máy chủ để đẩy lên"
 
-#: remote.c:1782
+#: remote.c:1746
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "đẩy refspecs cho “%s” không bao gồm “%s”"
 
-#: remote.c:1795
+#: remote.c:1759
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "đẩy lên mà không có đích (push.default là “nothing”)"
 
-#: remote.c:1817
+#: remote.c:1781
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "không thể phân giải đẩy “đơn giản” đến một đích đơn"
 
-#: remote.c:2124
+#: remote.c:2083
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr ""
 "Nhánh của bạn dựa trên cơ sở là “%s”, nhưng trên thượng nguồn không còn.\n"
 
-#: remote.c:2128
+#: remote.c:2087
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "   (dùng \" git branch --unset-upstream\" để sửa)\n"
 
-#: remote.c:2131
+#: remote.c:2090
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "Nhánh của bạn đã cập nhật với “%s”.\n"
 
-#: remote.c:2135
+#: remote.c:2094
 #, c-format
 msgid "Your branch is ahead of '%s' by %d commit.\n"
 msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
 msgstr[0] "Nhánh của bạn đứng trước “%s” %d lần chuyển giao.\n"
 
-#: remote.c:2141
+#: remote.c:2100
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (dùng \"git push\" để xuất bản các lần chuyển giao nội bộ của bạn)\n"
 
-#: remote.c:2144
+#: remote.c:2103
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1177,11 +1232,11 @@
 "Nhánh của bạn đứng đằng sau “%s” %d lần chuyển giao, và có thể được chuyển-"
 "tiếp-nhanh.\n"
 
-#: remote.c:2152
+#: remote.c:2111
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (dùng \"git pull\" để cập nhật nhánh nội bộ của bạn)\n"
 
-#: remote.c:2155
+#: remote.c:2114
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1194,30 +1249,30 @@
 "và có %d và %d lần chuyển giao khác nhau cho từng cái,\n"
 "tương ứng với mỗi lần.\n"
 
-#: remote.c:2165
+#: remote.c:2124
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
 "  (dùng \"git pull\" để hòa trộn nhánh trên máy chủ vào trong nhánh của "
 "bạn)\n"
 
-#: revision.c:2198
+#: revision.c:2191
 msgid "your current branch appears to be broken"
 msgstr "nhánh hiện tại của bạn có vẻ như bị hỏng"
 
-#: revision.c:2201
+#: revision.c:2194
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "nhánh hiện tại của bạn “%s” không có một lần chuyển giao nào cả"
 
-#: revision.c:2395
+#: revision.c:2388
 msgid "--first-parent is incompatible with --bisect"
 msgstr "--first-parent xung khắc với --bisect"
 
-#: run-command.c:83
+#: run-command.c:90
 msgid "open /dev/null failed"
 msgstr "gặp lỗi khi mở “/dev/null”"
 
-#: run-command.c:85
+#: run-command.c:92
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) gặp lỗi"
@@ -1290,7 +1345,7 @@
 
 #: sequencer.c:327
 msgid "Could not resolve HEAD commit\n"
-msgstr "Không thể phân giải commit (lần chuyển giao) HEAD\n"
+msgstr "Không thể phân giải lần chuyển giao HEAD\n"
 
 #: sequencer.c:347
 msgid "Unable to update cache tree\n"
@@ -1437,7 +1492,7 @@
 msgid "cannot abort from a branch yet to be born"
 msgstr "không thể hủy bỏ từ một nhánh mà nó còn chưa được tạo ra"
 
-#: sequencer.c:887 builtin/apply.c:4291
+#: sequencer.c:887 builtin/apply.c:4287
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "không thể mở %s: %s"
@@ -1479,12 +1534,12 @@
 msgid "Can't cherry-pick into empty head"
 msgstr "Không thể cherry-pick vào một đầu (head) trống rỗng"
 
-#: setup.c:243
+#: setup.c:248
 #, c-format
 msgid "failed to read %s"
 msgstr "gặp lỗi khi đọc %s"
 
-#: sha1_name.c:453
+#: sha1_name.c:463
 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"
@@ -1533,7 +1588,7 @@
 msgid "staging updated .gitmodules failed"
 msgstr "gặp lỗi khi tổ chức .gitmodules đã cập nhật"
 
-#: submodule.c:1045
+#: submodule.c:1040
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Không thể đặt “core.worktree” trong “%s”."
@@ -1544,7 +1599,7 @@
 msgid "unknown value '%s' for key '%s'"
 msgstr "không hiểu giá trị “%s” cho khóa “%s”"
 
-#: trailer.c:543 trailer.c:548 builtin/remote.c:290
+#: trailer.c:543 trailer.c:548 builtin/remote.c:296
 #, c-format
 msgid "more than one %s"
 msgstr "nhiều hơn một %s"
@@ -1611,8 +1666,8 @@
 msgid "could not open '%s' for writing"
 msgstr "không thể mở “%s” để ghi"
 
-#: wrapper.c:223 wrapper.c:366 builtin/am.c:337 builtin/commit.c:1688
-#: builtin/merge.c:1076 builtin/pull.c:380
+#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691
+#: builtin/merge.c:1074 builtin/pull.c:380
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "không thể mở “%s” để đọc"
@@ -1640,17 +1695,17 @@
 msgid "unable to get current working directory"
 msgstr "Không thể lấy thư mục làm việc hiện hành"
 
-#: wrapper.c:631
+#: wrapper.c:647
 #, c-format
 msgid "could not open %s for writing"
 msgstr "không thể mở %s để ghi"
 
-#: wrapper.c:642 builtin/am.c:424
+#: wrapper.c:658 builtin/am.c:425
 #, c-format
 msgid "could not write to %s"
 msgstr "không thể ghi vào %s"
 
-#: wrapper.c:648
+#: wrapper.c:664
 #, c-format
 msgid "could not close %s"
 msgstr "không thể đóng %s"
@@ -2005,27 +2060,27 @@
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr "  (dùng \"git bisect reset\" để quay trở lại nhánh nguyên thủy)"
 
-#: wt-status.c:1437
+#: wt-status.c:1438
 msgid "On branch "
 msgstr "Trên nhánh "
 
-#: wt-status.c:1445
+#: wt-status.c:1444
 msgid "interactive rebase in progress; onto "
 msgstr "rebase ở chế độ tương tác đang được thực hiện; lên trên "
 
-#: wt-status.c:1447
+#: wt-status.c:1446
 msgid "rebase in progress; onto "
 msgstr "rebase đang được thực hiện: lên trên "
 
-#: wt-status.c:1452
+#: wt-status.c:1451
 msgid "HEAD detached at "
 msgstr "HEAD được tách rời tại "
 
-#: wt-status.c:1454
+#: wt-status.c:1453
 msgid "HEAD detached from "
 msgstr "HEAD được tách rời từ "
 
-#: wt-status.c:1457
+#: wt-status.c:1456
 msgid "Not currently on any branch."
 msgstr "Hiện tại chẳng ở nhánh nào cả."
 
@@ -2117,23 +2172,23 @@
 msgid "nothing to commit, working directory clean\n"
 msgstr "không có gì để chuyển giao, thư mục làm việc sạch sẽ\n"
 
-#: wt-status.c:1644
-msgid "HEAD (no branch)"
-msgstr "HEAD (không nhánh)"
-
-#: wt-status.c:1650
+#: wt-status.c:1642
 msgid "Initial commit on "
 msgstr "Lần chuyển giao khởi tạo trên "
 
-#: wt-status.c:1677
+#: wt-status.c:1646
+msgid "HEAD (no branch)"
+msgstr "HEAD (không nhánh)"
+
+#: wt-status.c:1675
 msgid "gone"
 msgstr "đã ra đi"
 
-#: wt-status.c:1679 wt-status.c:1687
+#: wt-status.c:1677 wt-status.c:1685
 msgid "behind "
 msgstr "đằng sau "
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:403
+#: compat/precompose_utf8.c:56 builtin/clone.c:408
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "gặp lỗi khi bỏ liên kết (unlink) “%s”"
@@ -2147,7 +2202,7 @@
 msgid "unexpected diff status %c"
 msgstr "trạng thái lệnh diff không như mong đợi %c"
 
-#: builtin/add.c:70 builtin/commit.c:277
+#: builtin/add.c:70 builtin/commit.c:278
 msgid "updating files failed"
 msgstr "Cập nhật tập tin gặp lỗi"
 
@@ -2161,7 +2216,7 @@
 msgstr ""
 "Đưa ra khỏi bệ phóng các thay đổi sau khi làm tươi mới lại bảng mục lục:"
 
-#: builtin/add.c:194 builtin/rev-parse.c:799
+#: builtin/add.c:194 builtin/rev-parse.c:796
 msgid "Could not read the index"
 msgstr "Không thể đọc bảng mục lục"
 
@@ -2198,15 +2253,15 @@
 "Các đường dẫn theo sau đây sẽ bị lờ đi bởi một trong các tập tin .gitignore "
 "của bạn:\n"
 
-#: builtin/add.c:249 builtin/clean.c:896 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110
 #: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:545
-#: builtin/remote.c:1339 builtin/rm.c:268 builtin/send-pack.c:162
+#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162
 msgid "dry run"
 msgstr "chạy thử"
 
-#: builtin/add.c:250 builtin/apply.c:4580 builtin/check-ignore.c:19
-#: builtin/commit.c:1321 builtin/count-objects.c:63 builtin/fsck.c:636
-#: builtin/log.c:1641 builtin/mv.c:109 builtin/read-tree.c:114
+#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19
+#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
+#: builtin/log.c:1640 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr "chi tiết"
 
@@ -2214,7 +2269,7 @@
 msgid "interactive picking"
 msgstr "sửa bằng cách tương tác"
 
-#: builtin/add.c:253 builtin/checkout.c:1152 builtin/reset.c:286
+#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "chọn “hunks” theo kiểu tương tác"
 
@@ -2275,146 +2330,147 @@
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "Tùy chọn --ignore-missing chỉ có thể được dùng cùng với --dry-run"
 
-#: builtin/add.c:358
+#: builtin/add.c:352
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Không có gì được chỉ ra, không có gì được thêm vào.\n"
 
-#: builtin/add.c:359
+#: builtin/add.c:353
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Có lẽ ý bạn là “git add .” phải không?\n"
 
-#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:940
-#: builtin/commit.c:336 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938
+#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:40
 msgid "index file corrupt"
 msgstr "tập tin ghi bảng mục lục bị hỏng"
 
-#: builtin/add.c:445 builtin/apply.c:4678 builtin/mv.c:279 builtin/rm.c:430
+#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430
 msgid "Unable to write new index file"
 msgstr "Không thể ghi tập tin lưu bảng mục lục mới"
 
-#: builtin/am.c:41
+#: builtin/am.c:42
 #, c-format
 msgid "could not stat %s"
 msgstr "không thể lấy thông tin thống kê về %s"
 
-#: builtin/am.c:270 builtin/am.c:1345 builtin/commit.c:737 builtin/merge.c:1079
+#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077
 #, c-format
 msgid "could not read '%s'"
 msgstr "Không thể đọc “%s”."
 
-#: builtin/am.c:444
+#: builtin/am.c:445
 msgid "could not parse author script"
 msgstr "không thể phân tích cú pháp văn lệnh tác giả"
 
-#: builtin/am.c:521
+#: builtin/am.c:522
 #, c-format
 msgid "'%s' was deleted by the applypatch-msg hook"
 msgstr "“%s” bị xóa bởi móc applypatch-msg"
 
-#: builtin/am.c:562 builtin/notes.c:300
+#: builtin/am.c:563 builtin/notes.c:300
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Dòng đầu vào dị hình: “%s”."
 
-#: builtin/am.c:599 builtin/notes.c:315
+#: builtin/am.c:600 builtin/notes.c:315
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "Gặp lỗi khi sao chép ghi chú (note) từ “%s” tới “%s”"
 
-#: builtin/am.c:625
+#: builtin/am.c:626
 msgid "fseek failed"
 msgstr "fseek gặp lỗi"
 
-#: builtin/am.c:786 builtin/am.c:874
+#: builtin/am.c:787 builtin/am.c:875
 #, c-format
 msgid "could not open '%s' for reading: %s"
 msgstr "không thể mở “%s” để đọc: %s"
 
-#: builtin/am.c:793
+#: builtin/am.c:794
 #, c-format
 msgid "could not open '%s' for writing: %s"
 msgstr "Không thể mở “%s” để ghi: %s"
 
-#: builtin/am.c:802
+#: builtin/am.c:803
 #, c-format
 msgid "could not parse patch '%s'"
 msgstr "không thể phân tích cú pháp “%s”"
 
-#: builtin/am.c:867
+#: builtin/am.c:868
 msgid "Only one StGIT patch series can be applied at once"
 msgstr "Chỉ có một sê-ri miếng vá StGIT được áp dụng một lúc"
 
-#: builtin/am.c:915
+#: builtin/am.c:916
 msgid "invalid timestamp"
 msgstr "dấu thời gian không hợp lệ"
 
-#: builtin/am.c:918 builtin/am.c:926
+#: builtin/am.c:919 builtin/am.c:927
 msgid "invalid Date line"
 msgstr "dòng Ngày tháng không hợp lệ"
 
-#: builtin/am.c:923
+#: builtin/am.c:924
 msgid "invalid timezone offset"
 msgstr "độ lệch múi giờ không hợp lệ"
 
-#: builtin/am.c:1010
+#: builtin/am.c:1011
 msgid "Patch format detection failed."
 msgstr "Dò tìm định dạng miếng vá gặp lỗi."
 
-#: builtin/am.c:1015 builtin/clone.c:368
+#: builtin/am.c:1016 builtin/clone.c:373
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "tạo thư mục \"%s\" gặp lỗi"
 
-#: builtin/am.c:1019
+#: builtin/am.c:1020
 msgid "Failed to split patches."
 msgstr "Gặp lỗi khi chia nhỏ các miếng vá."
 
-#: builtin/am.c:1151 builtin/commit.c:362
+#: builtin/am.c:1152 builtin/commit.c:363
 msgid "unable to write index file"
 msgstr "không thể ghi tập tin lưu mục lục"
 
-#: builtin/am.c:1202
+#: builtin/am.c:1203
 #, c-format
 msgid "When you have resolved this problem, run \"%s --continue\"."
 msgstr "Khi bạn đã phân giải xong trục trặc này, hãy chạy \"%s --continue\"."
 
-#: builtin/am.c:1203
+#: builtin/am.c:1204
 #, c-format
 msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
 msgstr ""
 "Nếu bạn muốn bỏ qua miếng vá này, hãy chạy lệnh \"%s --skip\" để thay thế."
 
-#: builtin/am.c:1204
+#: builtin/am.c:1205
 #, c-format
 msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr "Để phục hồi lại nhánh gốc và dừng vá, hãy chạy \"%s --abort\"."
 
-#: builtin/am.c:1339
+#: builtin/am.c:1343
 msgid "Patch is empty. Was it split wrong?"
 msgstr "Miếng vá trống rỗng. Quá trình chia nhỏ miếng vá có lỗi?"
 
-#: builtin/am.c:1413 builtin/log.c:1345
+#: builtin/am.c:1417 builtin/log.c:1344
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "dòng thụt lề không hợp lệ: %s"
 
-#: builtin/am.c:1440
+#: builtin/am.c:1444
 #, c-format
 msgid "unable to parse commit %s"
 msgstr "không thể phân tích lần chuyển giao “%s”"
 
-#: builtin/am.c:1614
+#: builtin/am.c:1646
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr "Kho thiếu đối tượng blob cần thiết để trở về trên “3-way merge”."
 
-#: builtin/am.c:1616
+#: builtin/am.c:1648
 msgid "Using index info to reconstruct a base tree..."
 msgstr ""
 "Sử dụng thông tin trong bảng mục lục để cấu trúc lại một cây (tree) cơ sở…"
 
-#: builtin/am.c:1635
+#: builtin/am.c:1667
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
@@ -2422,38 +2478,38 @@
 "Bạn đã sửa miếng vá của mình bằng cách thủ công à?\n"
 "Nó không thể áp dụng các blob đã được ghi lại trong bảng mục lục của nó."
 
-#: builtin/am.c:1641
+#: builtin/am.c:1673
 msgid "Falling back to patching base and 3-way merge..."
 msgstr "Đang trở lại để vá cơ sở và “hòa trộn 3-đường”…"
 
-#: builtin/am.c:1666
+#: builtin/am.c:1688
 msgid "Failed to merge in the changes."
 msgstr "Gặp lỗi khi trộn vào các thay đổi."
 
-#: builtin/am.c:1691 builtin/merge.c:632
+#: builtin/am.c:1712 builtin/merge.c:632
 msgid "git write-tree failed to write a tree"
 msgstr "lệnh git write-tree gặp lỗi khi ghi một cây"
 
-#: builtin/am.c:1698
+#: builtin/am.c:1719
 msgid "applying to an empty history"
 msgstr "áp dụng vào một lịch sử trống rỗng"
 
-#: builtin/am.c:1711 builtin/commit.c:1752 builtin/merge.c:829
+#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829
 #: builtin/merge.c:854
 msgid "failed to write commit object"
 msgstr "gặp lỗi khi ghi đối tượng chuyển giao"
 
-#: builtin/am.c:1743 builtin/am.c:1747
+#: builtin/am.c:1764 builtin/am.c:1768
 #, c-format
 msgid "cannot resume: %s does not exist."
 msgstr "không thể phục hồi: %s không tồn tại."
 
-#: builtin/am.c:1763
+#: builtin/am.c:1784
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 "không thể được tương tác mà không có stdin kết nối với một thiết bị cuối"
 
-#: builtin/am.c:1768
+#: builtin/am.c:1789
 msgid "Commit Body is:"
 msgstr "Thân của lần chuyển giao là:"
 
@@ -2461,37 +2517,37 @@
 #. in your translation. The program will only accept English
 #. input at this point.
 #.
-#: builtin/am.c:1778
+#: builtin/am.c:1799
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 msgstr ""
-"Áp dụng? đồng ý [y]/khô[n]g/chỉnh sửa [e]/hiển thị miếng [v]á/đồng ý tất cả "
-"[a]: "
+"Áp dụng? đồng ý [y]/khô[n]g/chỉnh sửa [e]/hiển thị miếng [v]á/chấp nhận tất "
+"cả [a]: "
 
-#: builtin/am.c:1828
+#: builtin/am.c:1849
 #, c-format
 msgid "Dirty index: cannot apply patches (dirty: %s)"
 msgstr "Bảng mục lục bẩn: không thể áp dụng các miếng vá (bẩn: %s)"
 
-#: builtin/am.c:1863 builtin/am.c:1934
+#: builtin/am.c:1884 builtin/am.c:1955
 #, c-format
 msgid "Applying: %.*s"
 msgstr "Áp dụng: %.*s"
 
-#: builtin/am.c:1879
+#: builtin/am.c:1900
 msgid "No changes -- Patch already applied."
 msgstr "Không thay đổi gì cả -- Miếng vá đã được áp dụng rồi."
 
-#: builtin/am.c:1887
+#: builtin/am.c:1908
 #, c-format
 msgid "Patch failed at %s %.*s"
 msgstr "Gặp lỗi khi vá tại %s %.*s"
 
-#: builtin/am.c:1893
+#: builtin/am.c:1914
 #, c-format
 msgid "The copy of the patch that failed is found in: %s"
 msgstr "Bản sao chép của miếng vá mà nó gặp lỗi thì được tìm thấy trong: %s"
 
-#: builtin/am.c:1937
+#: builtin/am.c:1958
 msgid ""
 "No changes - did you forget to use 'git add'?\n"
 "If there is nothing left to stage, chances are that something else\n"
@@ -2502,7 +2558,7 @@
 "đã sẵn được đưa vào với cùng nội dung thay đổi; bạn có lẽ muốn bỏ qua miếng "
 "vá này."
 
-#: builtin/am.c:1944
+#: builtin/am.c:1965
 msgid ""
 "You still have unmerged paths in your index.\n"
 "Did you forget to use 'git add'?"
@@ -2510,17 +2566,17 @@
 "Bạn vẫn có những đường dẫn chưa được hòa trộn trong bảng mục lục của mình.\n"
 "Bạn đã quên sử dụng lệnh “git add” à?"
 
-#: builtin/am.c:2052 builtin/am.c:2056 builtin/am.c:2068 builtin/reset.c:308
+#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308
 #: builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "không thể phân tích đối tượng “%s”."
 
-#: builtin/am.c:2104
+#: builtin/am.c:2125
 msgid "failed to clean index"
 msgstr "gặp lỗi khi dọn bảng mục lục"
 
-#: builtin/am.c:2138
+#: builtin/am.c:2159
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
@@ -2528,151 +2584,153 @@
 "Bạn có lẽ đã có HEAD đã bị di chuyển đi kể từ lần “am” thất bại cuối cùng.\n"
 "Không thể chuyển tới ORIG_HEAD"
 
-#: builtin/am.c:2199
+#: builtin/am.c:2220
 #, c-format
 msgid "Invalid value for --patch-format: %s"
 msgstr "Giá trị không hợp lệ cho --patch-format: %s"
 
-#: builtin/am.c:2221
-msgid "git am [options] [(<mbox>|<Maildir>)...]"
-msgstr "git am [các-tùy-chọn] [(<mbox>|<Maildir>)…]"
+#: builtin/am.c:2253
+msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
+msgstr "git am [<các-tùy-chọn>] [(<mbox>|<Maildir>)…]"
 
-#: builtin/am.c:2222
-msgid "git am [options] (--continue | --skip | --abort)"
-msgstr "git am [các-tùy-chọn] (--continue | --skip | --abort)"
+#: builtin/am.c:2254
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<các-tùy-chọn>] (--continue | --skip | --abort)"
 
-#: builtin/am.c:2228
+#: builtin/am.c:2260
 msgid "run interactively"
 msgstr "chạy kiểu tương tác"
 
-#: builtin/am.c:2230
+#: builtin/am.c:2262
 msgid "historical option -- no-op"
 msgstr "tùy chọn lịch sử -- không-toán-tử"
 
-#: builtin/am.c:2232
+#: builtin/am.c:2264
 msgid "allow fall back on 3way merging if needed"
 msgstr "cho phép quay trở lại để hòa trộn kiểu “3way” nếu cần"
 
-#: builtin/am.c:2233 builtin/init-db.c:509 builtin/prune-packed.c:57
+#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57
 #: builtin/repack.c:171
 msgid "be quiet"
 msgstr "im lặng"
 
-#: builtin/am.c:2235
+#: builtin/am.c:2267
 msgid "add a Signed-off-by line to the commit message"
 msgstr "Thêm dòng Signed-off-by cho ghi chú của lần chuyển giao"
 
-#: builtin/am.c:2238
+#: builtin/am.c:2270
 msgid "recode into utf8 (default)"
 msgstr "chuyển mã thành utf8 (mặc định)"
 
-#: builtin/am.c:2240
+#: builtin/am.c:2272
 msgid "pass -k flag to git-mailinfo"
 msgstr "chuyển cờ -k cho git-mailinfo"
 
-#: builtin/am.c:2242
+#: builtin/am.c:2274
 msgid "pass -b flag to git-mailinfo"
 msgstr "chuyển cờ -b cho git-mailinfo"
 
-#: builtin/am.c:2244
+#: builtin/am.c:2276
 msgid "pass -m flag to git-mailinfo"
-msgstr "chuyển cờ -b cho git-mailinfo"
+msgstr "chuyển cờ -m cho git-mailinfo"
 
-#: builtin/am.c:2246
+#: builtin/am.c:2278
 msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr "chuyển cờ --keep-cr cho git-mailsplit với định dạng mbox"
 
-#: builtin/am.c:2249
+#: builtin/am.c:2281
 msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr ""
 "đừng chuyển cờ --keep-cr cho git-mailsplit không phụ thuộc vào am.keepcr"
 
-#: builtin/am.c:2252
+#: builtin/am.c:2284
 msgid "strip everything before a scissors line"
 msgstr "cắt mọi thứ trước dòng scissors"
 
-#: builtin/am.c:2253 builtin/apply.c:4563
+#: builtin/am.c:2285 builtin/apply.c:4554
 msgid "action"
 msgstr "hành động"
 
-#: builtin/am.c:2254 builtin/am.c:2257 builtin/am.c:2260 builtin/am.c:2263
-#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
-#: builtin/am.c:2281
+#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295
+#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307
+#: builtin/am.c:2313
 msgid "pass it through git-apply"
 msgstr "chuyển nó qua git-apply"
 
-#: builtin/am.c:2262 builtin/apply.c:4587
+#: builtin/am.c:2294 builtin/apply.c:4578
 msgid "root"
-msgstr "root"
+msgstr "gốc"
 
-#: builtin/am.c:2265 builtin/am.c:2268 builtin/apply.c:4525
-#: builtin/apply.c:4528 builtin/clone.c:85 builtin/fetch.c:93
-#: builtin/pull.c:167
+#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516
+#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93
+#: builtin/pull.c:167 builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
 msgid "path"
 msgstr "đường-dẫn"
 
-#: builtin/am.c:2271 builtin/fmt-merge-msg.c:669 builtin/fmt-merge-msg.c:672
-#: builtin/grep.c:698 builtin/merge.c:198 builtin/pull.c:127
-#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:664
-#: builtin/show-ref.c:180 builtin/tag.c:591 parse-options.h:132
-#: parse-options.h:134 parse-options.h:243
+#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
+#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127
+#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645
+#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
+#: parse-options.h:134 parse-options.h:244
 msgid "n"
 msgstr "n"
 
-#: builtin/am.c:2274 builtin/apply.c:4531
+#: builtin/am.c:2306 builtin/apply.c:4522
 msgid "num"
 msgstr "số"
 
-#: builtin/am.c:2277 builtin/for-each-ref.c:34 builtin/replace.c:438
+#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
 msgid "format"
 msgstr "định dạng"
 
-#: builtin/am.c:2278
+#: builtin/am.c:2310
 msgid "format the patch(es) are in"
 msgstr "định dạng (các) miếng vá theo"
 
-#: builtin/am.c:2284
+#: builtin/am.c:2316
 msgid "override error message when patch failure occurs"
 msgstr "đè lên các lời nhắn lỗi khi xảy ra lỗi vá nghiêm trọng"
 
-#: builtin/am.c:2286
+#: builtin/am.c:2318
 msgid "continue applying patches after resolving a conflict"
 msgstr "tiếp tục áp dụng các miếng vá sau khi giải quyết xung đột"
 
-#: builtin/am.c:2289
+#: builtin/am.c:2321
 msgid "synonyms for --continue"
 msgstr "đồng nghĩa với --continue"
 
-#: builtin/am.c:2292
+#: builtin/am.c:2324
 msgid "skip the current patch"
 msgstr "bỏ qua miếng vá hiện hành"
 
-#: builtin/am.c:2295
+#: builtin/am.c:2327
 msgid "restore the original branch and abort the patching operation."
 msgstr "phục hồi lại nhánh gốc và loại bỏ thao tác vá."
 
-#: builtin/am.c:2299
+#: builtin/am.c:2331
 msgid "lie about committer date"
 msgstr "nói dối về ngày chuyển giao"
 
-#: builtin/am.c:2301
+#: builtin/am.c:2333
 msgid "use current timestamp for author date"
 msgstr "dùng dấu thời gian hiện tại cho ngày tác giả"
 
-#: builtin/am.c:2303 builtin/commit.c:1590 builtin/merge.c:225
-#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:606
+#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225
+#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355
 msgid "key-id"
 msgstr "mã-số-khóa"
 
-#: builtin/am.c:2304
+#: builtin/am.c:2336
 msgid "GPG-sign commits"
 msgstr "lần chuyển giao ký-GPG"
 
-#: builtin/am.c:2307
+#: builtin/am.c:2339
 msgid "(internal use for git-rebase)"
 msgstr "(dùng nội bộ cho git-rebase)"
 
-#: builtin/am.c:2322
+#: builtin/am.c:2354
 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."
@@ -2680,16 +2738,16 @@
 "Tùy chọn -b/--binary đã không dùng từ lâu rồi, và\n"
 "nó sẽ được bỏ đi. Xin đừng sử dụng nó thêm nữa."
 
-#: builtin/am.c:2329
+#: builtin/am.c:2361
 msgid "failed to read the index"
 msgstr "gặp lỗi đọc bảng mục lục"
 
-#: builtin/am.c:2344
+#: builtin/am.c:2376
 #, c-format
 msgid "previous rebase directory %s still exists but mbox given."
 msgstr "thư mục rebase trước %s không sẵn có nhưng mbox lại đưa ra."
 
-#: builtin/am.c:2368
+#: builtin/am.c:2400
 #, c-format
 msgid ""
 "Stray %s directory found.\n"
@@ -2698,7 +2756,7 @@
 "Tìm thấy thư mục lạc %s.\n"
 "Dùng \"git am --abort\" để loại bỏ nó đi."
 
-#: builtin/am.c:2374
+#: builtin/am.c:2406
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr "Thao tác phân giải không được tiến hành, chúng ta không phục hồi lại."
 
@@ -2706,65 +2764,65 @@
 msgid "git apply [<options>] [<patch>...]"
 msgstr "git apply [<các-tùy-chọn>] [<miếng-vá>…]"
 
-#: builtin/apply.c:112
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
 msgstr "không nhận ra tùy chọn về khoảng trắng “%s”"
 
-#: builtin/apply.c:127
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "không nhận ra tùy chọn bỏ qua khoảng trắng “%s”"
 
-#: builtin/apply.c:822
+#: builtin/apply.c:818
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr ""
 "Không thể chuẩn bị biểu thức chính qui dấu vết thời gian (timestamp regexp) "
 "%s"
 
-#: builtin/apply.c:831
+#: builtin/apply.c:827
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "thi hành biểu thức chính quy trả về %d cho đầu vào: %s"
 
-#: builtin/apply.c:912
+#: builtin/apply.c:908
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "không thể tìm thấy tên tập tin trong miếng vá tại dòng %d"
 
-#: builtin/apply.c:944
+#: builtin/apply.c:940
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
 "git apply: git-diff sai - cần /dev/null, nhưng lại nhận được %s trên dòng %d"
 
-#: builtin/apply.c:948
+#: builtin/apply.c:944
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr "git apply: git-diff sai - tên tập tin mới không nhất quán trên dòng %d"
 
-#: builtin/apply.c:949
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr "git apply: git-diff sai - tên tập tin cũ không nhất quán trên dòng %d"
 
-#: builtin/apply.c:956
+#: builtin/apply.c:952
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr "git apply: git-diff sai - cần “/dev/null” trên dòng %d"
 
-#: builtin/apply.c:1419
+#: builtin/apply.c:1415
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "chi tiết: dòng không cần: %.*s"
 
-#: builtin/apply.c:1476
+#: builtin/apply.c:1472
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "miếng vá phân mảnh mà không có phần đầu tại dòng %d: %.*s"
 
-#: builtin/apply.c:1493
+#: builtin/apply.c:1489
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2776,76 +2834,76 @@
 "phần đầu diff cho git  thiếu thông tin tên tập tin khi gỡ bỏ đi %d trong "
 "thành phần dẫn đầu tên của đường dẫn (dòng %d)"
 
-#: builtin/apply.c:1659
+#: builtin/apply.c:1655
 msgid "new file depends on old contents"
 msgstr "tập tin mới phụ thuộc vào nội dung cũ"
 
-#: builtin/apply.c:1661
+#: builtin/apply.c:1657
 msgid "deleted file still has contents"
 msgstr "tập tin đã xóa vẫn còn nội dung"
 
-#: builtin/apply.c:1687
+#: builtin/apply.c:1683
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "miếng vá hỏng tại dòng %d"
 
-#: builtin/apply.c:1723
+#: builtin/apply.c:1719
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "tập tin mới %s phụ thuộc vào nội dung cũ"
 
-#: builtin/apply.c:1725
+#: builtin/apply.c:1721
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "tập tin đã xóa %s vẫn còn nội dung"
 
-#: builtin/apply.c:1728
+#: builtin/apply.c:1724
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "** cảnh báo: tập tin %s trở nên trống rỗng nhưng không bị xóa"
 
-#: builtin/apply.c:1874
+#: builtin/apply.c:1870
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "miếng vá định dạng nhị phân sai hỏng tại dòng %d: %.*s"
 
-#: builtin/apply.c:1903
+#: builtin/apply.c:1899
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "miếng vá định dạng nhị phân không được nhận ra tại dòng %d"
 
-#: builtin/apply.c:2054
+#: builtin/apply.c:2050
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "vá chỉ với “rác” tại dòng %d"
 
-#: builtin/apply.c:2144
+#: builtin/apply.c:2140
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "không thể đọc liên kết mềm %s"
 
-#: builtin/apply.c:2148
+#: builtin/apply.c:2144
 #, c-format
 msgid "unable to open or read %s"
 msgstr "không thể mở hay đọc %s"
 
-#: builtin/apply.c:2781
+#: builtin/apply.c:2777
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "sai khởi đầu dòng: “%c”"
 
-#: builtin/apply.c:2900
+#: builtin/apply.c:2896
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
 msgstr[0] "Khối dữ liệu #%d thành công tại %d (offset %d dòng)."
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2908
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr "Nội dung bị giảm xuống còn (%ld/%ld) để áp dụng mảnh dữ liệu tại %d"
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2914
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -2854,324 +2912,324 @@
 "trong khi đang tìm kiếm cho:\n"
 "%.*s"
 
-#: builtin/apply.c:2938
+#: builtin/apply.c:2934
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "thiếu dữ liệu của miếng vá định dạng nhị phân cho “%s”"
 
-#: builtin/apply.c:3039
+#: builtin/apply.c:3035
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "miếng vá định dạng nhị phân không được áp dụng cho “%s”"
 
-#: builtin/apply.c:3045
+#: builtin/apply.c:3041
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
 "vá nhị phân cho “%s” tạo ra kết quả không chính xác (mong chờ %s, lại nhận "
 "%s)"
 
-#: builtin/apply.c:3066
+#: builtin/apply.c:3062
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "gặp lỗi khi vá: %s:%ld"
 
-#: builtin/apply.c:3190
+#: builtin/apply.c:3186
 #, c-format
 msgid "cannot checkout %s"
 msgstr "không thể lấy ra %s"
 
-#: builtin/apply.c:3235 builtin/apply.c:3246 builtin/apply.c:3291
+#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
 #, c-format
 msgid "read of %s failed"
 msgstr "đọc %s gặp lỗi"
 
-#: builtin/apply.c:3243
+#: builtin/apply.c:3239
 #, c-format
 msgid "reading from '%s' beyond a symbolic link"
 msgstr "đọc từ “%s” vượt ra ngoài liên kết mềm"
 
-#: builtin/apply.c:3271 builtin/apply.c:3493
+#: builtin/apply.c:3267 builtin/apply.c:3489
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "đường dẫn %s đã bị xóa hoặc đổi tên"
 
-#: builtin/apply.c:3352 builtin/apply.c:3507
+#: builtin/apply.c:3348 builtin/apply.c:3503
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s: không tồn tại trong bảng mục lục"
 
-#: builtin/apply.c:3356 builtin/apply.c:3499 builtin/apply.c:3521
+#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: builtin/apply.c:3361 builtin/apply.c:3515
+#: builtin/apply.c:3357 builtin/apply.c:3511
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s: không khớp trong mục lục"
 
-#: builtin/apply.c:3463
+#: builtin/apply.c:3459
 msgid "removal patch leaves file contents"
 msgstr "loại bỏ miếng vá để lại nội dung tập tin"
 
-#: builtin/apply.c:3532
+#: builtin/apply.c:3528
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s: sai kiểu"
 
-#: builtin/apply.c:3534
+#: builtin/apply.c:3530
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s có kiểu %o, cần %o"
 
-#: builtin/apply.c:3693 builtin/apply.c:3695
+#: builtin/apply.c:3689 builtin/apply.c:3691
 #, c-format
 msgid "invalid path '%s'"
 msgstr "đường dẫn không hợp lệ “%s”"
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3746
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s: đã có từ trước trong bảng mục lục"
 
-#: builtin/apply.c:3753
+#: builtin/apply.c:3749
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s: đã sẵn có trong thư mục đang làm việc"
 
-#: builtin/apply.c:3773
+#: builtin/apply.c:3769
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "chế độ mới (%o) của %s không khớp với chế độ cũ (%o)"
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3774
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr "chế độ mới (%o) của %s không khớp với chế độ cũ (%o) của %s"
 
-#: builtin/apply.c:3798
+#: builtin/apply.c:3794
 #, c-format
 msgid "affected file '%s' is beyond a symbolic link"
 msgstr "tập tin chịu tác động “%s” vượt ra ngoài liên kết mềm"
 
-#: builtin/apply.c:3802
+#: builtin/apply.c:3798
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s: miếng vá không được áp dụng"
 
-#: builtin/apply.c:3816
+#: builtin/apply.c:3812
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Đang kiểm tra miếng vá %s…"
 
-#: builtin/apply.c:3909 builtin/checkout.c:232 builtin/reset.c:135
+#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "make_cache_entry gặp lỗi đối với đường dẫn “%s”"
 
-#: builtin/apply.c:4052
+#: builtin/apply.c:4048
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "không thể gỡ bỏ %s từ mục lục"
 
-#: builtin/apply.c:4081
+#: builtin/apply.c:4077
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "miếng vá sai hỏng cho mô-đun-con %s"
 
-#: builtin/apply.c:4085
+#: builtin/apply.c:4081
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "không thể lấy thống kề về tập tin %s mới hơn đã được tạo"
 
-#: builtin/apply.c:4090
+#: builtin/apply.c:4086
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr "không thể tạo “kho lưu đằng sau” cho tập tin được tạo mới hơn %s"
 
-#: builtin/apply.c:4093 builtin/apply.c:4201
+#: builtin/apply.c:4089 builtin/apply.c:4197
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "không thể thêm mục nhớ đệm cho %s"
 
-#: builtin/apply.c:4126
+#: builtin/apply.c:4122
 #, c-format
 msgid "closing file '%s'"
 msgstr "đang đóng tập tin “%s”"
 
-#: builtin/apply.c:4175
+#: builtin/apply.c:4171
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "không thể ghi vào tập tin “%s” chế độ %o"
 
-#: builtin/apply.c:4262
+#: builtin/apply.c:4258
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Đã áp dụng miếng vá %s một cách sạch sẽ."
 
-#: builtin/apply.c:4270
+#: builtin/apply.c:4266
 msgid "internal error"
 msgstr "lỗi nội bộ"
 
-#: builtin/apply.c:4273
+#: builtin/apply.c:4269
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] "Đang áp dụng miếng vá %%s với %d lần từ chối…"
 
-#: builtin/apply.c:4283
+#: builtin/apply.c:4279
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "đang cắt ngắn tên tập tin .rej thành %.*s.rej"
 
-#: builtin/apply.c:4304
+#: builtin/apply.c:4300
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "Khối nhớ #%d được áp dụng gọn gàng."
 
-#: builtin/apply.c:4307
+#: builtin/apply.c:4303
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "đoạn dữ liệu #%d bị từ chối."
 
-#: builtin/apply.c:4397
+#: builtin/apply.c:4393
 msgid "unrecognized input"
 msgstr "không thừa nhận đầu vào"
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4404
 msgid "unable to read index file"
 msgstr "không thể đọc tập tin lưu bảng mục lục"
 
-#: builtin/apply.c:4526
+#: builtin/apply.c:4517
 msgid "don't apply changes matching the given path"
 msgstr "không áp dụng các thay đổi khớp với đường dẫn đã cho"
 
-#: builtin/apply.c:4529
+#: builtin/apply.c:4520
 msgid "apply changes matching the given path"
 msgstr "áp dụng các thay đổi khớp với đường dẫn đã cho"
 
-#: builtin/apply.c:4532
+#: builtin/apply.c:4523
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "gỡ bỏ <số> dấu gạch chéo dẫn đầu từ đường dẫn diff cổ điển"
 
-#: builtin/apply.c:4535
+#: builtin/apply.c:4526
 msgid "ignore additions made by the patch"
 msgstr "lờ đi phần bổ xung được tạo ra bởi miếng vá"
 
-#: builtin/apply.c:4537
+#: builtin/apply.c:4528
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr ""
 "thay vì áp dụng một miếng vá, kết xuất kết quả từ lệnh diffstat cho đầu ra"
 
-#: builtin/apply.c:4541
+#: builtin/apply.c:4532
 msgid "show number of added and deleted lines in decimal notation"
 msgstr ""
 "hiển thị số lượng các dòng được thêm vào và xóa đi theo ký hiệu thập phân"
 
-#: builtin/apply.c:4543
+#: builtin/apply.c:4534
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "thay vì áp dụng một miếng vá, kết xuất kết quả cho đầu vào"
 
-#: builtin/apply.c:4545
+#: builtin/apply.c:4536
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "thay vì áp dụng miếng vá, hãy xem xem miếng vá có thích hợp không"
 
-#: builtin/apply.c:4547
+#: builtin/apply.c:4538
 msgid "make sure the patch is applicable to the current index"
 msgstr "hãy chắc chắn là miếng vá thích hợp với bảng mục lục hiện hành"
 
-#: builtin/apply.c:4549
+#: builtin/apply.c:4540
 msgid "apply a patch without touching the working tree"
 msgstr "áp dụng một miếng vá mà không động chạm đến cây làm việc"
 
-#: builtin/apply.c:4551
+#: builtin/apply.c:4542
 msgid "accept a patch that touches outside the working area"
 msgstr "chấp nhận một miếng vá mà không động chạm đến cây làm việc"
 
-#: builtin/apply.c:4553
+#: builtin/apply.c:4544
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr ""
 "đồng thời áp dụng miếng vá (dùng với tùy chọn --stat/--summary/--check)"
 
-#: builtin/apply.c:4555
+#: builtin/apply.c:4546
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "thử hòa trộn kiểu three-way nếu việc vá không thể thực hiện được"
 
-#: builtin/apply.c:4557
+#: builtin/apply.c:4548
 msgid "build a temporary index based on embedded index information"
 msgstr ""
 "xây dựng bảng mục lục tạm thời trên cơ sở thông tin bảng mục lục được nhúng"
 
-#: builtin/apply.c:4559 builtin/checkout-index.c:198 builtin/ls-files.c:412
+#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412
 msgid "paths are separated with NUL character"
 msgstr "các đường dẫn bị ngăn cách bởi ký tự NULL"
 
-#: builtin/apply.c:4562
+#: builtin/apply.c:4553
 msgid "ensure at least <n> lines of context match"
 msgstr "đảm bảo rằng có ít nhất <n> dòng nội dung khớp"
 
-#: builtin/apply.c:4564
+#: builtin/apply.c:4555
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "tìm thấy một dòng mới hoặc bị sửa đổi mà nó có lỗi do khoảng trắng"
 
-#: builtin/apply.c:4567 builtin/apply.c:4570
+#: builtin/apply.c:4558 builtin/apply.c:4561
 msgid "ignore changes in whitespace when finding context"
 msgstr "lờ đi sự thay đổi do khoảng trắng gây ra khi quét nội dung"
 
-#: builtin/apply.c:4573
+#: builtin/apply.c:4564
 msgid "apply the patch in reverse"
 msgstr "áp dụng miếng vá theo chiều ngược"
 
-#: builtin/apply.c:4575
+#: builtin/apply.c:4566
 msgid "don't expect at least one line of context"
 msgstr "đừng hy vọng có ít nhất một dòng nội dung"
 
-#: builtin/apply.c:4577
+#: builtin/apply.c:4568
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "để lại khối dữ liệu bị từ chối trong các tập tin *.rej tương ứng"
 
-#: builtin/apply.c:4579
+#: builtin/apply.c:4570
 msgid "allow overlapping hunks"
 msgstr "cho phép chồng khối nhớ"
 
-#: builtin/apply.c:4582
+#: builtin/apply.c:4573
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr ""
 "đã dò tìm thấy dung sai không chính xác thiếu dòng mới tại cuối tập tin"
 
-#: builtin/apply.c:4585
+#: builtin/apply.c:4576
 msgid "do not trust the line counts in the hunk headers"
 msgstr "không tin số lượng dòng trong phần đầu khối dữ liệu"
 
-#: builtin/apply.c:4588
+#: builtin/apply.c:4579
 msgid "prepend <root> to all filenames"
 msgstr "treo thêm <root> vào tất cả các tên tập tin"
 
-#: builtin/apply.c:4610
+#: builtin/apply.c:4601
 msgid "--3way outside a repository"
 msgstr "--3way ở ngoài một kho chứa"
 
-#: builtin/apply.c:4618
+#: builtin/apply.c:4609
 msgid "--index outside a repository"
 msgstr "--index ở ngoài một kho chứa"
 
-#: builtin/apply.c:4621
+#: builtin/apply.c:4612
 msgid "--cached outside a repository"
 msgstr "--cached ở ngoài một kho chứa"
 
-#: builtin/apply.c:4640
+#: builtin/apply.c:4631
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "không thể mở miếng vá “%s”"
 
-#: builtin/apply.c:4654
+#: builtin/apply.c:4645
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "đã chấm dứt %d lỗi khoảng trắng"
 
-#: builtin/apply.c:4660 builtin/apply.c:4670
+#: builtin/apply.c:4651 builtin/apply.c:4661
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -3233,97 +3291,97 @@
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<rev-opts> được mô tả trong tài liệu git-rev-list(1)"
 
-#: builtin/blame.c:2500
+#: builtin/blame.c:2519
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Hiển thị các mục “blame” như là chúng ta thấy chúng, tăng dần"
 
-#: builtin/blame.c:2501
+#: builtin/blame.c:2520
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
 "Hiển thị SHA-1 trắng cho những lần chuyển giao biên giới (Mặc định: off)"
 
-#: builtin/blame.c:2502
+#: builtin/blame.c:2521
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Không coi các lần chuyển giao gốc là giới hạn (Mặc định: off)"
 
-#: builtin/blame.c:2503
+#: builtin/blame.c:2522
 msgid "Show work cost statistics"
 msgstr "Hiển thị thống kê công sức làm việc"
 
-#: builtin/blame.c:2504
+#: builtin/blame.c:2523
 msgid "Show output score for blame entries"
 msgstr "Hiển thị kết xuất điểm số có các mục tin “blame”"
 
-#: builtin/blame.c:2505
+#: builtin/blame.c:2524
 msgid "Show original filename (Default: auto)"
 msgstr "Hiển thị tên tập tin gốc (Mặc định: auto)"
 
-#: builtin/blame.c:2506
+#: builtin/blame.c:2525
 msgid "Show original linenumber (Default: off)"
 msgstr "Hiển thị số dòng gốc (Mặc định: off)"
 
-#: builtin/blame.c:2507
+#: builtin/blame.c:2526
 msgid "Show in a format designed for machine consumption"
 msgstr "Hiển thị ở định dạng đã thiết kế cho sự tiêu dùng bằng máy"
 
-#: builtin/blame.c:2508
+#: builtin/blame.c:2527
 msgid "Show porcelain format with per-line commit information"
 msgstr "Hiển thị định dạng “porcelain” với thông tin chuyển giao mỗi dòng"
 
-#: builtin/blame.c:2509
+#: builtin/blame.c:2528
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Dùng cùng chế độ xuất ra với git-annotate (Mặc định: off)"
 
-#: builtin/blame.c:2510
+#: builtin/blame.c:2529
 msgid "Show raw timestamp (Default: off)"
 msgstr "Hiển thị dấu vết thời gian dạng thô (Mặc định: off)"
 
-#: builtin/blame.c:2511
+#: builtin/blame.c:2530
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Hiển thị SHA1 của lần chuyển giao dạng dài (Mặc định: off)"
 
-#: builtin/blame.c:2512
+#: builtin/blame.c:2531
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Không hiển thị tên tác giả và dấu vết thời gian (Mặc định: off)"
 
-#: builtin/blame.c:2513
+#: builtin/blame.c:2532
 msgid "Show author email instead of name (Default: off)"
 msgstr "Hiển thị thư điện tử của tác giả thay vì tên (Mặc định: off)"
 
-#: builtin/blame.c:2514
+#: builtin/blame.c:2533
 msgid "Ignore whitespace differences"
 msgstr "Bỏ qua các khác biệt do khoảng trắng gây ra"
 
-#: builtin/blame.c:2515
+#: builtin/blame.c:2534
 msgid "Spend extra cycles to find better match"
 msgstr "Tiêu thụ thêm năng tài nguyên máy móc để tìm kiếm tốt hơn nữa"
 
-#: builtin/blame.c:2516
+#: builtin/blame.c:2535
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr ""
 "Sử dụng điểm xét duyệt (revision) từ <tập tin> thay vì gọi “git-rev-list”"
 
-#: builtin/blame.c:2517
+#: builtin/blame.c:2536
 msgid "Use <file>'s contents as the final image"
 msgstr "Sử dụng nội dung của <tập tin> như là ảnh cuối cùng"
 
-#: builtin/blame.c:2518 builtin/blame.c:2519
+#: builtin/blame.c:2537 builtin/blame.c:2538
 msgid "score"
 msgstr "điểm số"
 
-#: builtin/blame.c:2518
+#: builtin/blame.c:2537
 msgid "Find line copies within and across files"
 msgstr "Tìm các bản sao chép dòng trong và ngang qua tập tin"
 
-#: builtin/blame.c:2519
+#: builtin/blame.c:2538
 msgid "Find line movements within and across files"
 msgstr "Tìm các di chuyển dòng trong và ngang qua tập tin"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "Process only line range n,m, counting from 1"
 msgstr "Xử lý chỉ dòng vùng n,m, tính từ 1"
 
@@ -3333,27 +3391,31 @@
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2601
+#: builtin/blame.c:2620
 msgid "4 years, 11 months ago"
 msgstr "4 năm, 11 tháng trước"
 
-#: builtin/branch.c:24
+#: builtin/branch.c:25
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<các-tùy-chọn>] [-r | -a] [--merged | --no-merged]"
 
-#: builtin/branch.c:25
+#: builtin/branch.c:26
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<các-tùy-chọn>] [-l] [-f] <tên-nhánh> [<điểm-đầu>]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<các-tùy-chọn>] [-r] (-d | -D) <tên-nhánh> …"
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [<các-tùy-chọn>] (-m | -M) [<nhánh-cũ>] <nhánh-mới>"
 
-#: builtin/branch.c:150
+#: builtin/branch.c:29
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr "git branch [<các-tùy-chọn>] [-r | -a] [--points-at]"
+
+#: builtin/branch.c:142
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -3362,7 +3424,7 @@
 "đang xóa nhánh “%s” mà nó lại đã được hòa trộn vào\n"
 "         “%s”, nhưng vẫn chưa được hòa trộn vào HEAD."
 
-#: builtin/branch.c:154
+#: builtin/branch.c:146
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -3371,12 +3433,12 @@
 "không xóa nhánh “%s” cái mà chưa được hòa trộn vào\n"
 "         “%s”, cho dù là nó đã được hòa trộn vào HEAD."
 
-#: builtin/branch.c:168
+#: builtin/branch.c:160
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Không thể tìm kiếm đối tượng chuyển giao cho “%s”"
 
-#: builtin/branch.c:172
+#: builtin/branch.c:164
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -3385,306 +3447,298 @@
 "Nhánh “%s” không được trộn một cách đầy đủ.\n"
 "Nếu bạn thực sự muốn xóa nó, thì chạy lệnh “git branch -D %s”."
 
-#: builtin/branch.c:185
+#: builtin/branch.c:177
 msgid "Update of config-file failed"
 msgstr "Cập nhật tập tin cấu hình gặp lỗi"
 
-#: builtin/branch.c:213
+#: builtin/branch.c:205
 msgid "cannot use -a with -d"
 msgstr "không thể dùng tùy chọn -a với -d"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:211
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Không thể tìm kiếm đối tượng chuyển giao cho HEAD"
 
-#: builtin/branch.c:227
+#: builtin/branch.c:219
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr "Không thể xóa nhánh “%s” cái mà bạn hiện nay đang ở."
 
-#: builtin/branch.c:243
+#: builtin/branch.c:235
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "không tìm thấy nhánh theo dõi máy chủ “%s”."
 
-#: builtin/branch.c:244
+#: builtin/branch.c:236
 #, c-format
 msgid "branch '%s' not found."
 msgstr "không tìm thấy nhánh “%s”."
 
-#: builtin/branch.c:259
+#: builtin/branch.c:251
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Gặp lỗi khi đang xóa nhánh theo dõi máy chủ “%s”"
 
-#: builtin/branch.c:260
+#: builtin/branch.c:252
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Gặp lỗi khi xóa bỏ nhánh “%s”"
 
-#: builtin/branch.c:267
+#: builtin/branch.c:259
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Đã xóa nhánh theo dõi máy chủ \"%s\" (từng là %s).\n"
 
-#: builtin/branch.c:268
+#: builtin/branch.c:260
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Nhánh “%s” đã bị xóa (từng là %s)\n"
 
-#: builtin/branch.c:369
-#, c-format
-msgid "branch '%s' does not point at a commit"
-msgstr "nhánh “%s” không chỉ đến một lần chuyển giao nào cả"
-
-#: builtin/branch.c:452
+#: builtin/branch.c:303
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: đã ra đi]"
 
-#: builtin/branch.c:457
+#: builtin/branch.c:308
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:462
+#: builtin/branch.c:313
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: đứng sau %d]"
 
-#: builtin/branch.c:464
+#: builtin/branch.c:315
 #, c-format
 msgid "[behind %d]"
 msgstr "[đằng sau %d]"
 
-#: builtin/branch.c:468
+#: builtin/branch.c:319
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: phía trước %d]"
 
-#: builtin/branch.c:470
+#: builtin/branch.c:321
 #, c-format
 msgid "[ahead %d]"
 msgstr "[phía trước %d]"
 
-#: builtin/branch.c:473
+#: builtin/branch.c:324
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: trước %d, sau %d]"
 
-#: builtin/branch.c:476
+#: builtin/branch.c:327
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[trước %d, sau %d]"
 
-#: builtin/branch.c:489
+#: builtin/branch.c:340
 msgid " **** invalid ref ****"
 msgstr " **** tham chiếu không hợp lệ ****"
 
-#: builtin/branch.c:580
+#: builtin/branch.c:366
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(không nhánh, đang cải tổ %s)"
 
-#: builtin/branch.c:583
+#: builtin/branch.c:369
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(không nhánh, di chuyển nửa bước được bắt đầu tại %s)"
 
-#: builtin/branch.c:589
+#: builtin/branch.c:375
 #, c-format
 msgid "(HEAD detached at %s)"
 msgstr "(HEAD được tách rời tại %s)"
 
-#: builtin/branch.c:592
+#: builtin/branch.c:378
 #, c-format
 msgid "(HEAD detached from %s)"
 msgstr "(HEAD được tách rời từ %s)"
 
-#: builtin/branch.c:596
+#: builtin/branch.c:382
 msgid "(no branch)"
 msgstr "(không nhánh)"
 
-#: builtin/branch.c:643
-#, c-format
-msgid "object '%s' does not point to a commit"
-msgstr "đối tượng “%s” không chỉ đến một lần chuyển giao nào cả"
-
-#: builtin/branch.c:691
-msgid "some refs could not be read"
-msgstr "một số tham chiếu đã không thể đọc được"
-
-#: builtin/branch.c:704
+#: builtin/branch.c:524
 msgid "cannot rename the current branch while not on any."
 msgstr "không thể đổi tên nhánh hiện hành trong khi nó chẳng ở đâu cả."
 
-#: builtin/branch.c:714
+#: builtin/branch.c:534
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Tên nhánh không hợp lệ: “%s”"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:549
 msgid "Branch rename failed"
 msgstr "Gặp lỗi khi đổi tên nhánh"
 
-#: builtin/branch.c:733
+#: builtin/branch.c:553
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Đã đổi tên nhánh khuyết danh “%s” đi"
 
-#: builtin/branch.c:737
+#: builtin/branch.c:557
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Nhánh bị đổi tên thành %s, nhưng HEAD lại không được cập nhật!"
 
-#: builtin/branch.c:744
+#: builtin/branch.c:564
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "Nhánh bị đổi tên, nhưng cập nhật tập tin cấu hình gặp lỗi"
 
-#: builtin/branch.c:759
-#, c-format
-msgid "malformed object name %s"
-msgstr "tên đối tượng dị hình %s"
-
-#: builtin/branch.c:781
+#: builtin/branch.c:587
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr "không thể ghi vào mẫu mô tả nhánh: %s"
 
-#: builtin/branch.c:811
+#: builtin/branch.c:616
 msgid "Generic options"
 msgstr "Tùy chọn chung"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:618
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "hiển thị mã băm và chủ đề, đưa ra hai lần cho nhánh thượng nguồn"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:619
 msgid "suppress informational messages"
 msgstr "không xuất các thông tin"
 
-#: builtin/branch.c:815
+#: builtin/branch.c:620
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "cài đặt chế độ theo dõi (xem git-pull(1))"
 
-#: builtin/branch.c:817
+#: builtin/branch.c:622
 msgid "change upstream info"
 msgstr "thay đổi thông tin thượng nguồn"
 
-#: builtin/branch.c:821
+#: builtin/branch.c:626
 msgid "use colored output"
 msgstr "tô màu kết xuất"
 
-#: builtin/branch.c:822
+#: builtin/branch.c:627
 msgid "act on remote-tracking branches"
 msgstr "thao tác trên nhánh “remote-tracking”"
 
-#: builtin/branch.c:825 builtin/branch.c:831 builtin/branch.c:852
-#: builtin/branch.c:858 builtin/commit.c:1580 builtin/commit.c:1581
-#: builtin/commit.c:1582 builtin/commit.c:1583 builtin/tag.c:618
-#: builtin/tag.c:624
-msgid "commit"
-msgstr "lần_chuyển_giao"
-
-#: builtin/branch.c:826 builtin/branch.c:832
+#: builtin/branch.c:629 builtin/branch.c:630
 msgid "print only branches that contain the commit"
 msgstr "chỉ hiển thị những nhánh mà nó chứa lần chuyển giao"
 
-#: builtin/branch.c:838
+#: builtin/branch.c:633
 msgid "Specific git-branch actions:"
 msgstr "Hành động git-branch:"
 
-#: builtin/branch.c:839
+#: builtin/branch.c:634
 msgid "list both remote-tracking and local branches"
 msgstr "liệt kê cả nhánh “remote-tracking” và nội bộ"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:636
 msgid "delete fully merged branch"
 msgstr "xóa một toàn bộ nhánh đã hòa trộn"
 
-#: builtin/branch.c:842
+#: builtin/branch.c:637
 msgid "delete branch (even if not merged)"
 msgstr "xóa nhánh (cho dù là chưa được hòa trộn)"
 
-#: builtin/branch.c:843
+#: builtin/branch.c:638
 msgid "move/rename a branch and its reflog"
 msgstr "di chuyển hay đổi tên một nhánh và reflog của nó"
 
-#: builtin/branch.c:844
+#: builtin/branch.c:639
 msgid "move/rename a branch, even if target exists"
 msgstr "di chuyển hoặc đổi tên một nhánh ngay cả khi đích đã có sẵn"
 
-#: builtin/branch.c:845
+#: builtin/branch.c:640
 msgid "list branch names"
 msgstr "liệt kê các tên nhánh"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:641
 msgid "create the branch's reflog"
 msgstr "tạo reflog của nhánh"
 
-#: builtin/branch.c:848
+#: builtin/branch.c:643
 msgid "edit the description for the branch"
 msgstr "sửa mô tả cho nhánh"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:644
 msgid "force creation, move/rename, deletion"
 msgstr "buộc tạo, di chuyển/đổi tên, xóa"
 
-#: builtin/branch.c:852
-msgid "print only not merged branches"
-msgstr "chỉ hiển thị các nhánh chưa được hòa trộn"
+#: builtin/branch.c:645
+msgid "print only branches that are merged"
+msgstr "chỉ hiển thị những nhánh mà nó được hòa trộn"
 
-#: builtin/branch.c:858
-msgid "print only merged branches"
-msgstr "chỉ hiển thị các nhánh đã hòa trộn"
+#: builtin/branch.c:646
+msgid "print only branches that are not merged"
+msgstr "chỉ hiển thị những nhánh mà nó không được hòa trộn"
 
-#: builtin/branch.c:862
+#: builtin/branch.c:647
 msgid "list branches in columns"
 msgstr "liệt kê các nhánh trong các cột"
 
-#: builtin/branch.c:875
+#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
+msgstr "khóa"
+
+#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
+msgstr "tên trường cần sắp xếp"
+
+#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398
+#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564
+#: builtin/tag.c:369
+msgid "object"
+msgstr "đối tượng"
+
+#: builtin/branch.c:652
+msgid "print only branches of the object"
+msgstr "chỉ hiển thị các nhánh của đối tượng"
+
+#: builtin/branch.c:670
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Gặp lỗi khi phân giải HEAD như là một tham chiếu hợp lệ."
 
-#: builtin/branch.c:879 builtin/clone.c:690
+#: builtin/branch.c:674 builtin/clone.c:697
 msgid "HEAD not found below refs/heads!"
 msgstr "không tìm thấy HEAD ở dưới refs/heads!"
 
-#: builtin/branch.c:901
+#: builtin/branch.c:694
 msgid "--column and --verbose are incompatible"
 msgstr "tùy chọn --column và --verbose xung khắc nhau"
 
-#: builtin/branch.c:912 builtin/branch.c:951
+#: builtin/branch.c:705 builtin/branch.c:747
 msgid "branch name required"
 msgstr "cần chỉ ra tên nhánh"
 
-#: builtin/branch.c:927
+#: builtin/branch.c:723
 msgid "Cannot give description to detached HEAD"
 msgstr "Không thể đưa ra mô tả HEAD đã tách rời"
 
-#: builtin/branch.c:932
+#: builtin/branch.c:728
 msgid "cannot edit description of more than one branch"
 msgstr "không thể sửa mô tả cho nhiều hơn một nhánh"
 
-#: builtin/branch.c:939
+#: builtin/branch.c:735
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Vẫn chưa chuyển giao trên nhánh “%s”."
 
-#: builtin/branch.c:942
+#: builtin/branch.c:738
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Không có nhánh nào có tên “%s”."
 
-#: builtin/branch.c:957
+#: builtin/branch.c:753
 msgid "too many branches for a rename operation"
 msgstr "quá nhiều nhánh dành cho thao tác đổi tên"
 
-#: builtin/branch.c:962
+#: builtin/branch.c:758
 msgid "too many branches to set new upstream"
 msgstr "quá nhiều nhánh được đặt cho thượng nguồn mới"
 
-#: builtin/branch.c:966
+#: builtin/branch.c:762
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -3692,40 +3746,40 @@
 "không thể đặt thượng nguồn của HEAD thành %s khi mà nó chẳng chỉ đến nhánh "
 "nào cả."
 
-#: builtin/branch.c:969 builtin/branch.c:991 builtin/branch.c:1012
+#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808
 #, c-format
 msgid "no such branch '%s'"
 msgstr "không có nhánh nào như thế “%s”"
 
-#: builtin/branch.c:973
+#: builtin/branch.c:769
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "chưa có nhánh “%s”"
 
-#: builtin/branch.c:985
+#: builtin/branch.c:781
 msgid "too many branches to unset upstream"
 msgstr "quá nhiều nhánh để bỏ đặt thượng nguồn"
 
-#: builtin/branch.c:989
+#: builtin/branch.c:785
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr "không thể bỏ đặt thượng nguồn của HEAD không chỉ đến một nhánh nào cả."
 
-#: builtin/branch.c:995
+#: builtin/branch.c:791
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Nhánh “%s” không có thông tin thượng nguồn"
 
-#: builtin/branch.c:1009
+#: builtin/branch.c:805
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "không hợp lý khi tạo “HEAD” thủ công"
 
-#: builtin/branch.c:1015
+#: builtin/branch.c:811
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "hai tùy chọn -a và -r áp dụng cho lệnh “git branch” không hợp lý đối với tên "
 "nhánh"
 
-#: builtin/branch.c:1018
+#: builtin/branch.c:814
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3734,7 +3788,7 @@
 "Cờ --set-upstream đã lạc hậu và sẽ bị xóa bỏ. Nên dùng --track hoặc --set-"
 "upstream-to\n"
 
-#: builtin/branch.c:1035
+#: builtin/branch.c:831
 #, c-format
 msgid ""
 "\n"
@@ -3745,12 +3799,12 @@
 "Nếu bạn muốn “%s” theo dõi “%s”, thực hiện lệnh sau:\n"
 "\n"
 
-#: builtin/branch.c:1036
+#: builtin/branch.c:832
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr "    git branch -d %s\n"
 
-#: builtin/branch.c:1037
+#: builtin/branch.c:833
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr "    git branch --set-upstream-to %s\n"
@@ -3777,12 +3831,8 @@
 "<kiểu>|--textconv) <đối_tượng>"
 
 #: builtin/cat-file.c:429
-msgid ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <list-of-"
-"objects>"
-msgstr ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <danh-sách-đối-"
-"tượng>"
+msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
 
 #: builtin/cat-file.c:466
 msgid "<type> can be one of: blob, tree, commit, tag"
@@ -3838,9 +3888,8 @@
 msgstr "git check-attr [-a | --all | <attr>…] [--] tên-đường-dẫn…"
 
 #: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...] < <list-of-paths>"
-msgstr ""
-"git check-attr --stdin [-z] [-a | --all | <attr>…] < <danh-sách-đường-dẫn>"
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+msgstr "git check-attr --stdin [-z] [-a | --all | <attr>…]"
 
 #: builtin/check-attr.c:19
 msgid "report all attributes set on file"
@@ -3858,7 +3907,7 @@
 msgid "terminate input and output records by a NUL character"
 msgstr "chấm dứt các bản ghi vào và ra bằng ký tự NULL"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1133 builtin/gc.c:267
+#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "chặn các báo cáo tiến trình hoạt động"
 
@@ -3945,6 +3994,8 @@
 msgstr "ghi nội dung vào tập tin tạm"
 
 #: builtin/checkout-index.c:204 builtin/column.c:30
+#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181
 msgid "string"
 msgstr "chuỗi"
 
@@ -3964,106 +4015,106 @@
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<các-tùy-chọn>] [<nhánh>] -- <tập-tin>…"
 
-#: builtin/checkout.c:133 builtin/checkout.c:166
+#: builtin/checkout.c:134 builtin/checkout.c:167
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "đường dẫn “%s” không có các phiên bản của chúng ta"
 
-#: builtin/checkout.c:135 builtin/checkout.c:168
+#: builtin/checkout.c:136 builtin/checkout.c:169
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "đường dẫn “%s” không có các phiên bản của chúng"
 
-#: builtin/checkout.c:151
+#: builtin/checkout.c:152
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "đường dẫn “%s” không có tất cả các phiên bản cần thiết"
 
-#: builtin/checkout.c:195
+#: builtin/checkout.c:196
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "đường dẫn “%s” không có các phiên bản cần thiết"
 
-#: builtin/checkout.c:212
+#: builtin/checkout.c:213
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "đường dẫn “%s”: không thể hòa trộn"
 
-#: builtin/checkout.c:229
+#: builtin/checkout.c:230
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "Không thể thêm kết quả hòa trộn cho “%s”"
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
+#: builtin/checkout.c:260
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "không được dùng “%s” với các đường dẫn cập nhật"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:263 builtin/checkout.c:266
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "không được dùng “%s” với %s"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:269
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 "Không thể cập nhật các đường dẫn và chuyển đến nhánh “%s” cùng một lúc."
 
-#: builtin/checkout.c:279 builtin/checkout.c:473
+#: builtin/checkout.c:280 builtin/checkout.c:474
 msgid "corrupt index file"
 msgstr "tập tin ghi bảng mục lục bị hỏng"
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:340 builtin/checkout.c:347
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "đường dẫn “%s” không được hòa trộn"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:496
 msgid "you need to resolve your current index first"
 msgstr "bạn cần phải giải quyết bảng mục lục hiện tại của bạn trước đã"
 
-#: builtin/checkout.c:622
+#: builtin/checkout.c:623
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Không thể thực hiện reflog cho “%s”: %s\n"
 
-#: builtin/checkout.c:660
+#: builtin/checkout.c:661
 msgid "HEAD is now at"
 msgstr "HEAD hiện giờ tại"
 
-#: builtin/checkout.c:667
+#: builtin/checkout.c:668
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Đặt lại nhánh “%s”\n"
 
-#: builtin/checkout.c:670
+#: builtin/checkout.c:671
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Đã sẵn sàng trên “%s”\n"
 
-#: builtin/checkout.c:674
+#: builtin/checkout.c:675
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Đã chuyển tới và đặt lại nhánh “%s”\n"
 
-#: builtin/checkout.c:676 builtin/checkout.c:1065
+#: builtin/checkout.c:677 builtin/checkout.c:1066
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Đã chuyển đến nhánh mới “%s”\n"
 
-#: builtin/checkout.c:678
+#: builtin/checkout.c:679
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Đã chuyển đến nhánh “%s”\n"
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:731
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " … và nhiều hơn %d.\n"
 
-#: builtin/checkout.c:736
+#: builtin/checkout.c:737
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4082,7 +4133,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:755
+#: builtin/checkout.c:756
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -4103,146 +4154,152 @@
 " git branch <tên_nhánh_mới> %s\n"
 "\n"
 
-#: builtin/checkout.c:791
+#: builtin/checkout.c:792
 msgid "internal error in revision walk"
 msgstr "lỗi nội bộ trong khi di chuyển qua các điểm xét duyệt"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:796
 msgid "Previous HEAD position was"
 msgstr "Vị trí trước kia của HEAD là"
 
-#: builtin/checkout.c:822 builtin/checkout.c:1060
+#: builtin/checkout.c:823 builtin/checkout.c:1061
 msgid "You are on a branch yet to be born"
 msgstr "Bạn tại nhánh mà nó chưa hề được sinh ra"
 
-#: builtin/checkout.c:967
+#: builtin/checkout.c:968
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "chỉ cần một tham chiếu, nhưng lại đưa ra %d."
 
-#: builtin/checkout.c:1006 builtin/worktree.c:210
+#: builtin/checkout.c:1007 builtin/worktree.c:213
 #, c-format
 msgid "invalid reference: %s"
 msgstr "tham chiếu không hợp lệ: %s"
 
-#: builtin/checkout.c:1035
+#: builtin/checkout.c:1036
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "tham chiếu không phải là một cây:%s"
 
-#: builtin/checkout.c:1074
+#: builtin/checkout.c:1075
 msgid "paths cannot be used with switching branches"
 msgstr "các đường dẫn không thể dùng cùng với các nhánh chuyển"
 
-#: builtin/checkout.c:1077 builtin/checkout.c:1081
+#: builtin/checkout.c:1078 builtin/checkout.c:1082
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "“%s” không thể được sử dụng với các nhánh chuyển"
 
-#: builtin/checkout.c:1085 builtin/checkout.c:1088 builtin/checkout.c:1093
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094
+#: builtin/checkout.c:1097
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "“%s” không thể được dùng với “%s”"
 
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1102
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Không thể chuyển nhánh đến một thứ không phải là lần chuyển giao “%s”"
 
-#: builtin/checkout.c:1134 builtin/checkout.c:1136 builtin/clone.c:83
-#: builtin/remote.c:159 builtin/remote.c:161 builtin/worktree.c:317
-#: builtin/worktree.c:319
+#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320
+#: builtin/worktree.c:322
 msgid "branch"
 msgstr "nhánh"
 
-#: builtin/checkout.c:1135
+#: builtin/checkout.c:1136
 msgid "create and checkout a new branch"
 msgstr "tạo và checkout một nhánh mới"
 
-#: builtin/checkout.c:1137
+#: builtin/checkout.c:1138
 msgid "create/reset and checkout a branch"
 msgstr "tạo/đặt_lại và checkout một nhánh"
 
-#: builtin/checkout.c:1138
+#: builtin/checkout.c:1139
 msgid "create reflog for new branch"
 msgstr "tạo reflog cho nhánh mới"
 
-#: builtin/checkout.c:1139
+#: builtin/checkout.c:1140
 msgid "detach the HEAD at named commit"
 msgstr "rời bỏ HEAD tại lần chuyển giao danh nghĩa"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "set upstream info for new branch"
 msgstr "đặt thông tin thượng nguồn cho nhánh mới"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new-branch"
 msgstr "nhánh-mới"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new unparented branch"
 msgstr "nhánh không cha mới"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "checkout our version for unmerged files"
 msgstr ""
 "lấy ra (checkout) phiên bản của chúng ta cho các tập tin chưa được hòa trộn"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "checkout their version for unmerged files"
 msgstr ""
 "lấy ra (checkout) phiên bản của chúng họ cho các tập tin chưa được hòa trộn"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1148
 msgid "force checkout (throw away local modifications)"
 msgstr "ép buộc lấy ra (bỏ đi những thay đổi nội bộ)"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "perform a 3-way merge with the new branch"
 msgstr "thực hiện hòa trộn kiểu 3-way với nhánh mới"
 
-#: builtin/checkout.c:1149 builtin/merge.c:227
+#: builtin/checkout.c:1150 builtin/merge.c:227
 msgid "update ignored files (default)"
 msgstr "cập nhật các tập tin bị bỏ qua (mặc định)"
 
-#: builtin/checkout.c:1150 builtin/log.c:1264 parse-options.h:249
+#: builtin/checkout.c:1151 builtin/log.c:1263 parse-options.h:250
 msgid "style"
 msgstr "kiểu"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "conflict style (merge or diff3)"
 msgstr "xung đột kiểu (hòa trộn hoặc diff3)"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "không giới hạn đặc tả đường dẫn thành chỉ các mục thưa thớt"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1157
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "gợi ý thứ hai \"git checkout <không-nhánh-nào-như-vậy>\""
 
-#: builtin/checkout.c:1158
+#: builtin/checkout.c:1159
 msgid "do not check if another worktree is holding the given ref"
 msgstr "không kiểm tra nếu cây làm việc khác đang giữ tham chiếu đã cho"
 
-#: builtin/checkout.c:1181
+#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112
+#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:560
+#: builtin/send-pack.c:168
+msgid "force progress reporting"
+msgstr "ép buộc báo cáo tiến triển công việc"
+
+#: builtin/checkout.c:1191
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "Các tùy chọn -b, -B và --orphan loại từ lẫn nhau"
 
-#: builtin/checkout.c:1198
+#: builtin/checkout.c:1208
 msgid "--track needs a branch name"
 msgstr "--track cần tên một nhánh"
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1213
 msgid "Missing branch name; try -b"
 msgstr "Thiếu tên nhánh; hãy thử -b"
 
-#: builtin/checkout.c:1239
+#: builtin/checkout.c:1249
 msgid "invalid path specification"
 msgstr "đường dẫn đã cho không hợp lệ"
 
-#: builtin/checkout.c:1246
+#: builtin/checkout.c:1256
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4252,12 +4309,12 @@
 "Bạn đã có ý định checkout “%s” cái mà không thể được phân giải như là lần "
 "chuyển giao?"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1261
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach không nhận một đối số đường dẫn “%s”"
 
-#: builtin/checkout.c:1255
+#: builtin/checkout.c:1265
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4296,7 +4353,7 @@
 msgid "failed to remove %s"
 msgstr "gặp lỗi khi gỡ bỏ %s"
 
-#: builtin/clean.c:317
+#: builtin/clean.c:315
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -4308,7 +4365,7 @@
 "foo        - chọn mục trên cơ sở tiền tố duy nhất\n"
 "           - (để trống) không chọn gì cả"
 
-#: builtin/clean.c:321
+#: builtin/clean.c:319
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -4328,36 +4385,36 @@
 "*          - chọn tất\n"
 "           - (để trống) kết thúc việc chọn"
 
-#: builtin/clean.c:537
+#: builtin/clean.c:535
 #, c-format
 msgid "Huh (%s)?"
 msgstr "Hả (%s)?"
 
-#: builtin/clean.c:679
+#: builtin/clean.c:677
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Mẫu để lọc các tập tin đầu vào cần lờ đi>> "
 
-#: builtin/clean.c:716
+#: builtin/clean.c:714
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "CẢNH BÁO: Không tìm thấy các mục được khớp bởi: %s"
 
-#: builtin/clean.c:737
+#: builtin/clean.c:735
 msgid "Select items to delete"
 msgstr "Chọn mục muốn xóa"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:778
+#: builtin/clean.c:776
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "Xóa bỏ “%s” [y/N]? "
 
-#: builtin/clean.c:803
+#: builtin/clean.c:801
 msgid "Bye."
 msgstr "Tạm biệt."
 
-#: builtin/clean.c:811
+#: builtin/clean.c:809
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -4375,61 +4432,61 @@
 "help                - hiển thị chính trợ giúp này\n"
 "?                   - trợ giúp dành cho chọn bằng cách nhắc"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:836
 msgid "*** Commands ***"
 msgstr "*** Lệnh ***"
 
-#: builtin/clean.c:839
+#: builtin/clean.c:837
 msgid "What now"
 msgstr "Giờ thì sao"
 
-#: builtin/clean.c:847
+#: builtin/clean.c:845
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Có muốn gỡ bỏ (các) mục sau đây không:"
 
-#: builtin/clean.c:864
+#: builtin/clean.c:862
 msgid "No more files to clean, exiting."
 msgstr "Không còn tập-tin nào để dọn dẹp, đang thoát ra."
 
-#: builtin/clean.c:895
+#: builtin/clean.c:893
 msgid "do not print names of files removed"
 msgstr "không hiển thị tên của các tập tin đã gỡ bỏ"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:895
 msgid "force"
 msgstr "ép buộc"
 
-#: builtin/clean.c:898
+#: builtin/clean.c:896
 msgid "interactive cleaning"
 msgstr "dọn bằng kiểu tương tác"
 
-#: builtin/clean.c:900
+#: builtin/clean.c:898
 msgid "remove whole directories"
 msgstr "gỡ bỏ toàn bộ thư mục"
 
-#: builtin/clean.c:901 builtin/describe.c:407 builtin/grep.c:714
-#: builtin/ls-files.c:443 builtin/name-rev.c:311 builtin/show-ref.c:187
+#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709
+#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182
 msgid "pattern"
 msgstr "mẫu"
 
-#: builtin/clean.c:902
+#: builtin/clean.c:900
 msgid "add <pattern> to ignore rules"
 msgstr "thêm <mẫu> vào trong qui tắc bỏ qua"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:901
 msgid "remove ignored files, too"
 msgstr "đồng thời gỡ bỏ cả các tập tin bị bỏ qua"
 
-#: builtin/clean.c:905
+#: builtin/clean.c:903
 msgid "remove only ignored files"
 msgstr "chỉ gỡ bỏ những tập tin bị bỏ qua"
 
-#: builtin/clean.c:923
+#: builtin/clean.c:921
 msgid "-x and -X cannot be used together"
 msgstr "-x và -X không thể dùng cùng nhau"
 
-#: builtin/clean.c:927
+#: builtin/clean.c:925
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -4437,7 +4494,7 @@
 "clean.requireForce được đặt thành true và không đưa ra tùy chọn -i, -n mà "
 "cũng không -f; từ chối lệnh dọn dẹp (clean)"
 
-#: builtin/clean.c:930
+#: builtin/clean.c:928
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -4449,16 +4506,11 @@
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<các-tùy-chọn>] [--] <kho> [<t.mục>]"
 
-#: builtin/clone.c:57 builtin/fetch.c:112 builtin/merge.c:224
-#: builtin/pull.c:109 builtin/push.c:560 builtin/send-pack.c:168
-msgid "force progress reporting"
-msgstr "ép buộc báo cáo tiến triển công việc"
-
 #: builtin/clone.c:59
 msgid "don't create a checkout"
 msgstr "không tạo một checkout"
 
-#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:504
+#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469
 msgid "create a bare repository"
 msgstr "tạo kho thuần"
 
@@ -4482,15 +4534,15 @@
 msgid "initialize submodules in the clone"
 msgstr "khởi tạo mô-đun-con trong bản sao"
 
-#: builtin/clone.c:75 builtin/init-db.c:501
+#: builtin/clone.c:75 builtin/init-db.c:466
 msgid "template-directory"
 msgstr "thư-mục-mẫu"
 
-#: builtin/clone.c:76 builtin/init-db.c:502
+#: builtin/clone.c:76 builtin/init-db.c:467
 msgid "directory from which templates will be used"
 msgstr "thư mục mà tại đó các mẫu sẽ được dùng"
 
-#: builtin/clone.c:78
+#: builtin/clone.c:78 builtin/submodule--helper.c:179
 msgid "reference repository"
 msgstr "kho tham chiếu"
 
@@ -4514,7 +4566,7 @@
 msgid "path to git-upload-pack on the remote"
 msgstr "đường dẫn đến git-upload-pack trên máy chủ"
 
-#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:659 builtin/pull.c:186
+#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654 builtin/pull.c:186
 msgid "depth"
 msgstr "độ-sâu"
 
@@ -4526,11 +4578,11 @@
 msgid "clone only one branch, HEAD or --branch"
 msgstr "chỉ nhân bản một nhánh, HEAD hoặc --branch"
 
-#: builtin/clone.c:91 builtin/init-db.c:510
+#: builtin/clone.c:91 builtin/init-db.c:475
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:92 builtin/init-db.c:511
+#: builtin/clone.c:92 builtin/init-db.c:476
 msgid "separate git dir from working tree"
 msgstr "không dùng chung thư mục dành riêng cho git và thư mục làm việc"
 
@@ -4542,52 +4594,57 @@
 msgid "set config inside the new repository"
 msgstr "đặt cấu hình bên trong một kho chứa mới"
 
-#: builtin/clone.c:298
+#: builtin/clone.c:300
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "kho tham chiếu “%s” như là lấy ra liên kết vẫn chưa được hỗ trợ."
+
+#: builtin/clone.c:302
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr "kho tham chiếu “%s” không phải là một kho nội bộ."
 
-#: builtin/clone.c:302
+#: builtin/clone.c:307
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "kho tham chiếu “%s” là nông"
 
-#: builtin/clone.c:305
+#: builtin/clone.c:310
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "kho tham chiếu “%s” bị cấy ghép"
 
-#: builtin/clone.c:370 builtin/diff.c:84
+#: builtin/clone.c:375 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "gặp lỗi khi lấy thống kê về “%s”"
 
-#: builtin/clone.c:372
+#: builtin/clone.c:377
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s có tồn tại nhưng lại không phải là một thư mục"
 
-#: builtin/clone.c:386
+#: builtin/clone.c:391
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "gặp lỗi khi lấy thông tin thống kê về %s\n"
 
-#: builtin/clone.c:408
+#: builtin/clone.c:413
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "gặp lỗi khi tạo được liên kết mềm %s"
 
-#: builtin/clone.c:412
+#: builtin/clone.c:417
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "gặp lỗi khi sao chép tập tin và “%s”"
 
-#: builtin/clone.c:435 builtin/clone.c:619
+#: builtin/clone.c:442 builtin/clone.c:626
 #, c-format
 msgid "done.\n"
 msgstr "hoàn tất.\n"
 
-#: builtin/clone.c:447
+#: builtin/clone.c:454
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -4597,121 +4654,117 @@
 "Bạn kiểm tra kỹ xem cái gì được lấy ra bằng lệnh “git status”\n"
 "và thử lấy ra với lệnh “git checkout -f HEAD”\n"
 
-#: builtin/clone.c:524
+#: builtin/clone.c:531
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Không tìm thấy nhánh máy chủ %s để nhân bản (clone)."
 
-#: builtin/clone.c:614
+#: builtin/clone.c:621
 #, c-format
 msgid "Checking connectivity... "
 msgstr "Đang kiểm tra kết nối… "
 
-#: builtin/clone.c:617
+#: builtin/clone.c:624
 msgid "remote did not send all necessary objects"
 msgstr "máy chủ đã không gửi tất cả các đối tượng cần thiết"
 
-#: builtin/clone.c:681
+#: builtin/clone.c:688
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr "refers HEAD máy chủ  chỉ đến ref không tồn tại, không thể lấy ra.\n"
 
-#: builtin/clone.c:712
+#: builtin/clone.c:719
 msgid "unable to checkout working tree"
 msgstr "không thể lấy ra (checkout) cây làm việc"
 
-#: builtin/clone.c:799
+#: builtin/clone.c:808
 msgid "cannot repack to clean up"
 msgstr "không thể đóng gói để dọn dẹp"
 
-#: builtin/clone.c:801
+#: builtin/clone.c:810
 msgid "cannot unlink temporary alternates file"
 msgstr "không thể bỏ liên kết tập tin thay thế tạm thời"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:842
 msgid "Too many arguments."
 msgstr "Có quá nhiều đối số."
 
-#: builtin/clone.c:835
+#: builtin/clone.c:846
 msgid "You must specify a repository to clone."
 msgstr "Bạn phải chỉ định một kho để mà nhân bản (clone)."
 
-#: builtin/clone.c:846
+#: builtin/clone.c:857
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "tùy chọn --bare và --origin %s xung khắc nhau."
 
-#: builtin/clone.c:849
+#: builtin/clone.c:860
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "tùy chọn --bare và --separate-git-dir xung khắc nhau."
 
-#: builtin/clone.c:862
+#: builtin/clone.c:873
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "kho chứa “%s” chưa tồn tại"
 
-#: builtin/clone.c:868 builtin/fetch.c:1168
+#: builtin/clone.c:879 builtin/fetch.c:1166
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "độ sâu %s không phải là một số nguyên dương"
 
-#: builtin/clone.c:878
+#: builtin/clone.c:889
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "đường dẫn đích “%s” đã có từ trước và không phải là một thư mục rỗng."
 
-#: builtin/clone.c:888
+#: builtin/clone.c:899
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "cây làm việc “%s” đã sẵn tồn tại rồi."
 
-#: builtin/clone.c:903 builtin/clone.c:914 builtin/worktree.c:218
-#: builtin/worktree.c:245
+#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224
+#: builtin/worktree.c:221 builtin/worktree.c:248
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "không thể tạo các thư mục dẫn đầu của “%s”"
 
-#: builtin/clone.c:906
+#: builtin/clone.c:917
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "không thể tạo cây thư mục làm việc dir “%s”"
 
-#: builtin/clone.c:924
+#: builtin/clone.c:935
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Đang nhân bản thành kho chứa bare “%s”…\n"
 
-#: builtin/clone.c:926
+#: builtin/clone.c:937
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Đang nhân bản thành “%s”…\n"
 
-#: builtin/clone.c:951
-msgid "--dissociate given, but there is no --reference"
-msgstr "đã đưa ra --dissociate, nhưng ở đây lại không có --reference"
-
-#: builtin/clone.c:968
+#: builtin/clone.c:975
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth bị lờ đi khi nhân bản nội bộ; hãy sử dụng file:// để thay thế."
 
-#: builtin/clone.c:971
+#: builtin/clone.c:978
 msgid "source repository is shallow, ignoring --local"
 msgstr "kho nguồn là nông, nên bỏ qua --local"
 
-#: builtin/clone.c:976
+#: builtin/clone.c:983
 msgid "--local is ignored"
 msgstr "--local bị lờ đi"
 
-#: builtin/clone.c:980
+#: builtin/clone.c:987
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Không biết làm cách nào để nhân bản (clone) %s"
 
-#: builtin/clone.c:1029 builtin/clone.c:1037
+#: builtin/clone.c:1036 builtin/clone.c:1044
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Nhánh máy chủ %s không tìm thấy trong thượng nguồn %s"
 
-#: builtin/clone.c:1040
+#: builtin/clone.c:1047
 msgid "You appear to have cloned an empty repository."
 msgstr "Bạn hình như là đã nhân bản một kho trống rỗng."
 
@@ -4747,15 +4800,15 @@
 msgid "--command must be the first argument"
 msgstr "--command phải là đối số đầu tiên"
 
-#: builtin/commit.c:37
+#: builtin/commit.c:38
 msgid "git commit [<options>] [--] <pathspec>..."
 msgstr "git commit [<các-tùy-chọn>] [--] <pathspec>…"
 
-#: builtin/commit.c:42
+#: builtin/commit.c:43
 msgid "git status [<options>] [--] <pathspec>..."
 msgstr "git status [<các-tùy-chọn>] [--] <pathspec>…"
 
-#: builtin/commit.c:47
+#: builtin/commit.c:48
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4786,7 +4839,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:60
+#: builtin/commit.c:61
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4814,7 +4867,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:72
+#: builtin/commit.c:73
 msgid ""
 "You asked to amend the most recent commit, but doing so would make\n"
 "it empty. You can repeat your command with --allow-empty, or you can\n"
@@ -4827,7 +4880,7 @@
 "hoặc là bạn gỡ bỏ các lần chuyển giao một cách hoàn toàn bằng lệnh:\n"
 "\"git reset HEAD^\".\n"
 
-#: builtin/commit.c:77
+#: builtin/commit.c:78
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4842,11 +4895,11 @@
 "    git commit --allow-empty\n"
 "\n"
 
-#: builtin/commit.c:84
+#: builtin/commit.c:85
 msgid "Otherwise, please use 'git reset'\n"
 msgstr "Nếu không được thì dùng lệnh \"git reset\"\n"
 
-#: builtin/commit.c:87
+#: builtin/commit.c:88
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4862,68 +4915,68 @@
 "Thế thì \"git cherry-pick --continue\" sẽ phục hồi lại việc cherry-pick\n"
 "những lần chuyển giao còn lại.\n"
 
-#: builtin/commit.c:304
+#: builtin/commit.c:305
 msgid "failed to unpack HEAD tree object"
 msgstr "gặp lỗi khi tháo dỡ HEAD đối tượng cây"
 
-#: builtin/commit.c:345
+#: builtin/commit.c:346
 msgid "unable to create temporary index"
 msgstr "không thể tạo bảng mục lục tạm thời"
 
-#: builtin/commit.c:351
+#: builtin/commit.c:352
 msgid "interactive add failed"
 msgstr "gặp lỗi khi thêm bằng cách tương"
 
-#: builtin/commit.c:364
+#: builtin/commit.c:365
 msgid "unable to update temporary index"
 msgstr "không thể cập nhật bảng mục lục tạm thời"
 
-#: builtin/commit.c:366
+#: builtin/commit.c:367
 msgid "Failed to update main cache tree"
 msgstr "Gặp lỗi khi cập nhật cây bộ nhớ đệm"
 
-#: builtin/commit.c:390 builtin/commit.c:413 builtin/commit.c:462
+#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
 msgid "unable to write new_index file"
 msgstr "không thể ghi tập tin lưu bảng mục lục mới (new_index)"
 
-#: builtin/commit.c:444
+#: builtin/commit.c:445
 msgid "cannot do a partial commit during a merge."
 msgstr ""
 "không thể thực hiện việc chuyển giao cục bộ trong khi đang được hòa trộn."
 
-#: builtin/commit.c:446
+#: builtin/commit.c:447
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr ""
 "không thể thực hiện việc chuyển giao bộ phận trong khi đang cherry-pick."
 
-#: builtin/commit.c:455
+#: builtin/commit.c:456
 msgid "cannot read the index"
 msgstr "không đọc được bảng mục lục"
 
-#: builtin/commit.c:474
+#: builtin/commit.c:475
 msgid "unable to write temporary index file"
 msgstr "không thể ghi tập tin lưu bảng mục lục tạm thời"
 
-#: builtin/commit.c:579
+#: builtin/commit.c:580
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "lần chuyển giao “%s” thiếu phần tác giả ở đầu"
 
-#: builtin/commit.c:581
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "lần chuyển giao “%s” có phần tác giả ở đầu dị dạng"
 
-#: builtin/commit.c:600
+#: builtin/commit.c:601
 msgid "malformed --author parameter"
 msgstr "đối số cho --author bị dị hình"
 
-#: builtin/commit.c:608
+#: builtin/commit.c:609
 #, c-format
 msgid "invalid date format: %s"
 msgstr "ngày tháng không hợp lệ: %s"
 
-#: builtin/commit.c:652
+#: builtin/commit.c:653
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -4931,38 +4984,38 @@
 "không thể chọn một ký tự ghi chú cái mà không được dùng\n"
 "trong phần ghi chú hiện tại"
 
-#: builtin/commit.c:689 builtin/commit.c:722 builtin/commit.c:1079
+#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "không thể tìm kiếm commit (lần chuyển giao) %s"
 
-#: builtin/commit.c:701 builtin/shortlog.c:273
+#: builtin/commit.c:702 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(đang đọc thông điệp nhật ký từ đầu vào tiêu chuẩn)\n"
 
-#: builtin/commit.c:703
+#: builtin/commit.c:704
 msgid "could not read log from standard input"
 msgstr "không thể đọc nhật ký từ đầu vào tiêu chuẩn"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:708
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "không đọc được tệp nhật ký “%s”"
 
-#: builtin/commit.c:729
+#: builtin/commit.c:730
 msgid "could not read MERGE_MSG"
 msgstr "không thể đọc MERGE_MSG"
 
-#: builtin/commit.c:733
+#: builtin/commit.c:734
 msgid "could not read SQUASH_MSG"
 msgstr "không thể đọc SQUASH_MSG"
 
-#: builtin/commit.c:784
+#: builtin/commit.c:785
 msgid "could not write commit template"
 msgstr "không thể ghi mẫu chuyển giao"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:803
 #, c-format
 msgid ""
 "\n"
@@ -4977,7 +5030,7 @@
 "\t%s\n"
 "và thử lại.\n"
 
-#: builtin/commit.c:807
+#: builtin/commit.c:808
 #, c-format
 msgid ""
 "\n"
@@ -4992,7 +5045,7 @@
 "\t%s\n"
 "và thử lại.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:821
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5003,7 +5056,7 @@
 "bắt đầu bằng “%c” sẽ được bỏ qua, nếu phần chú thích rỗng sẽ hủy bỏ lần "
 "chuyển giao.\n"
 
-#: builtin/commit.c:827
+#: builtin/commit.c:828
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5015,156 +5068,157 @@
 "bắt đầu bằng “%c” sẽ được bỏ qua; bạn có thể xóa chúng đi nếu muốn thế.\n"
 "Phần chú thích này nếu trống rỗng sẽ hủy bỏ lần chuyển giao.\n"
 
-#: builtin/commit.c:847
+#: builtin/commit.c:848
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sTác giả:           %.*s <%.*s>"
 
-#: builtin/commit.c:855
+#: builtin/commit.c:856
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sNgày tháng:        %s"
 
-#: builtin/commit.c:862
+#: builtin/commit.c:863
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sNgười chuyển giao: %.*s <%.*s>"
 
-#: builtin/commit.c:880
+#: builtin/commit.c:881
 msgid "Cannot read index"
 msgstr "Không đọc được bảng mục lục"
 
-#: builtin/commit.c:937
+#: builtin/commit.c:938
 msgid "Error building trees"
 msgstr "Gặp lỗi khi xây dựng cây"
 
-#: builtin/commit.c:952 builtin/tag.c:495
+#: builtin/commit.c:953 builtin/tag.c:266
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Xin hãy cung cấp lời chú giải hoặc là dùng tùy chọn -m hoặc là -F.\n"
 
-#: builtin/commit.c:1054
+#: builtin/commit.c:1055
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author “%s” không phải là “Họ và tên <thư điện tửl>” và không khớp bất kỳ "
 "tác giả nào sẵn có"
 
-#: builtin/commit.c:1069 builtin/commit.c:1309
+#: builtin/commit.c:1070 builtin/commit.c:1310
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Chế độ cho các tập tin chưa được theo dõi không hợp lệ “%s”"
 
-#: builtin/commit.c:1106
+#: builtin/commit.c:1107
 msgid "--long and -z are incompatible"
 msgstr "hai tùy chọn -long và -z không tương thích với nhau"
 
-#: builtin/commit.c:1136
+#: builtin/commit.c:1137
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Sử dụng cả hai tùy chọn --reset-author và --author không hợp lý"
 
-#: builtin/commit.c:1145
+#: builtin/commit.c:1146
 msgid "You have nothing to amend."
 msgstr "Không có gì để mà “tu bổ” cả."
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1149
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr ""
 "Bạn đang ở giữa của quá trình hòa trộn -- không thể thực hiện việc “tu bổ”."
 
-#: builtin/commit.c:1150
+#: builtin/commit.c:1151
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr ""
 "Bạn đang ở giữa của quá trình cherry-pick -- không thể thực hiện việc “tu "
 "bổ”."
 
-#: builtin/commit.c:1153
+#: builtin/commit.c:1154
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Các tùy chọn --squash và --fixup không thể sử dụng cùng với nhau"
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1164
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr ""
 "Chỉ được dùng một trong số tùy chọn trong số các tùy chọn -c/-C/-F/--fixup"
 
-#: builtin/commit.c:1165
+#: builtin/commit.c:1166
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Tùy chọn -m không thể được tổ hợp cùng với -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1173
+#: builtin/commit.c:1174
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr ""
 "--reset-author chỉ có thể được sử dụng với tùy chọn -C, -c hay --amend."
 
-#: builtin/commit.c:1190
+#: builtin/commit.c:1191
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Chỉ một trong các tùy chọn --include/--only/--all/--interactive/--patch được "
 "sử dụng."
 
-#: builtin/commit.c:1192
+#: builtin/commit.c:1193
 msgid "No paths with --include/--only does not make sense."
 msgstr "Không đường dẫn với các tùy chọn --include/--only không hợp lý."
 
-#: builtin/commit.c:1194
+#: builtin/commit.c:1195
 msgid "Clever... amending the last one with dirty index."
 msgstr "Giỏi…  “tu bổ” cái cuối với bảng mục lục bẩn."
 
-#: builtin/commit.c:1196
+#: builtin/commit.c:1197
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
 "Những đường dẫn rõ ràng được chỉ ra không có tùy chọn -i cũng không -o; coi "
 "là --only những đường dẫn"
 
-#: builtin/commit.c:1208 builtin/tag.c:730
+#: builtin/commit.c:1209 builtin/tag.c:475
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Chế độ dọn dẹp không hợp lệ %s"
 
-#: builtin/commit.c:1213
+#: builtin/commit.c:1214
 msgid "Paths with -a does not make sense."
 msgstr "Các đường dẫn với tùy chọn -a không hợp lý."
 
-#: builtin/commit.c:1323 builtin/commit.c:1602
+#: builtin/commit.c:1324 builtin/commit.c:1605
 msgid "show status concisely"
 msgstr "hiển thị trạng thái ở dạng súc tích"
 
-#: builtin/commit.c:1325 builtin/commit.c:1604
+#: builtin/commit.c:1326 builtin/commit.c:1607
 msgid "show branch information"
 msgstr "hiển thị thông tin nhánh"
 
-#: builtin/commit.c:1327 builtin/commit.c:1606 builtin/push.c:546
+#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:546
+#: builtin/worktree.c:423
 msgid "machine-readable output"
 msgstr "kết xuất dạng máy-có-thể-đọc"
 
-#: builtin/commit.c:1330 builtin/commit.c:1608
+#: builtin/commit.c:1331 builtin/commit.c:1611
 msgid "show status in long format (default)"
 msgstr "hiển thị trạng thái ở định dạng dài (mặc định)"
 
-#: builtin/commit.c:1333 builtin/commit.c:1611
+#: builtin/commit.c:1334 builtin/commit.c:1614
 msgid "terminate entries with NUL"
 msgstr "chấm dứt các mục bằng NUL"
 
-#: builtin/commit.c:1335 builtin/commit.c:1614 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:604
+#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:353
 msgid "mode"
 msgstr "chế độ"
 
-#: builtin/commit.c:1336 builtin/commit.c:1614
+#: builtin/commit.c:1337 builtin/commit.c:1617
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "hiển thị các tập tin chưa được theo dõi  dấu vết, các chế độ tùy chọn:  all, "
 "normal, no. (Mặc định: all)"
 
-#: builtin/commit.c:1339
+#: builtin/commit.c:1340
 msgid "show ignored files"
 msgstr "hiển thị các tập tin ẩn"
 
-#: builtin/commit.c:1340 parse-options.h:155
+#: builtin/commit.c:1341 parse-options.h:155
 msgid "when"
 msgstr "khi"
 
-#: builtin/commit.c:1341
+#: builtin/commit.c:1342
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -5172,200 +5226,205 @@
 "bỏ qua các thay đổi trong mô-đun-con, tùy chọn khi: all, dirty, untracked. "
 "(Mặc định: all)"
 
-#: builtin/commit.c:1343
+#: builtin/commit.c:1344
 msgid "list untracked files in columns"
 msgstr "hiển thị danh sách các tập-tin chưa được theo dõi trong các cột"
 
-#: builtin/commit.c:1429
+#: builtin/commit.c:1430
 msgid "couldn't look up newly created commit"
 msgstr "không thể tìm thấy lần chuyển giao mới hơn đã được tạo"
 
-#: builtin/commit.c:1431
+#: builtin/commit.c:1432
 msgid "could not parse newly created commit"
 msgstr ""
 "không thể phân tích cú pháp của đối tượng chuyển giao mới hơn đã được tạo"
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1477
 msgid "detached HEAD"
 msgstr "đã rời khỏi HEAD"
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1480
 msgid " (root-commit)"
 msgstr " (root-commit)"
 
-#: builtin/commit.c:1572
+#: builtin/commit.c:1575
 msgid "suppress summary after successful commit"
 msgstr "không hiển thị tổng kết sau khi chuyển giao thành công"
 
-#: builtin/commit.c:1573
+#: builtin/commit.c:1576
 msgid "show diff in commit message template"
 msgstr "hiển thị sự khác biệt trong mẫu tin nhắn chuyển giao"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1578
 msgid "Commit message options"
 msgstr "Các tùy chọn ghi chú commit"
 
-#: builtin/commit.c:1576 builtin/tag.c:602
+#: builtin/commit.c:1579 builtin/tag.c:351
 msgid "read message from file"
 msgstr "đọc chú thích từ tập tin"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "author"
 msgstr "tác giả"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "override author for commit"
 msgstr "ghi đè tác giả cho commit"
 
-#: builtin/commit.c:1578 builtin/gc.c:268
+#: builtin/commit.c:1581 builtin/gc.c:326
 msgid "date"
 msgstr "ngày tháng"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1581
 msgid "override date for commit"
 msgstr "ghi đè ngày tháng cho lần chuyển giao"
 
-#: builtin/commit.c:1579 builtin/merge.c:218 builtin/notes.c:392
-#: builtin/notes.c:555 builtin/tag.c:600
+#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392
+#: builtin/notes.c:555 builtin/tag.c:349
 msgid "message"
 msgstr "chú thích"
 
-#: builtin/commit.c:1579
+#: builtin/commit.c:1582
 msgid "commit message"
 msgstr "chú thích của lần chuyển giao"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
+#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
+msgid "commit"
+msgstr "lần_chuyển_giao"
+
+#: builtin/commit.c:1583
 msgid "reuse and edit message from specified commit"
 msgstr "dùng lại các ghi chú từ lần chuyển giao đã cho nhưng có cho sửa chữa"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1584
 msgid "reuse message from specified commit"
 msgstr "dùng lại các ghi chú từ lần chuyển giao đã cho"
 
-#: builtin/commit.c:1582
+#: builtin/commit.c:1585
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "dùng ghi chú có định dạng autosquash để sửa chữa lần chuyển giao đã chỉ ra"
 
-#: builtin/commit.c:1583
+#: builtin/commit.c:1586
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "dùng lời nhắn có định dạng tự động nén để nén lại các lần chuyển giao đã chỉ "
 "ra"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1587
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
 "lần chuyển giao nhận tôi là tác giả (được dùng với tùy chọn -C/-c/--amend)"
 
-#: builtin/commit.c:1585 builtin/log.c:1216 builtin/revert.c:86
+#: builtin/commit.c:1588 builtin/log.c:1215 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "(nên dùng) thêm dòng Signed-off-by:"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1589
 msgid "use specified template file"
 msgstr "sử dụng tập tin mẫu đã cho"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1590
 msgid "force edit of commit"
 msgstr "ép buộc sửa lần commit"
 
-#: builtin/commit.c:1588
+#: builtin/commit.c:1591
 msgid "default"
 msgstr "mặc định"
 
-#: builtin/commit.c:1588 builtin/tag.c:605
+#: builtin/commit.c:1591 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "làm thế nào để cắt bỏ khoảng trắng và #ghichú từ mẩu tin nhắn"
 
-#: builtin/commit.c:1589
+#: builtin/commit.c:1592
 msgid "include status in commit message template"
 msgstr "bao gồm các trạng thái trong mẫu ghi chú chuyển giao"
 
-#: builtin/commit.c:1591 builtin/merge.c:226 builtin/pull.c:156
+#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "ký lần chuyển giao dùng GPG"
 
-#: builtin/commit.c:1594
+#: builtin/commit.c:1597
 msgid "Commit contents options"
 msgstr "Các tùy nội dung ghi chú commit"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1598
 msgid "commit all changed files"
 msgstr "chuyển giao tất cả các tập tin có thay đổi"
 
-#: builtin/commit.c:1596
+#: builtin/commit.c:1599
 msgid "add specified files to index for commit"
 msgstr "thêm các tập tin đã chỉ ra vào bảng mục lục để chuyển giao"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1600
 msgid "interactively add files"
 msgstr "thêm các tập-tin bằng tương tác"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1601
 msgid "interactively add changes"
 msgstr "thêm các thay đổi bằng tương tác"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1602
 msgid "commit only specified files"
 msgstr "chỉ chuyển giao các tập tin đã chỉ ra"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1603
 msgid "bypass pre-commit hook"
 msgstr "vòng qua móc (hook) pre-commit"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1604
 msgid "show what would be committed"
 msgstr "hiển thị xem cái gì có thể được chuyển giao"
 
-#: builtin/commit.c:1612
+#: builtin/commit.c:1615
 msgid "amend previous commit"
 msgstr "“tu bổ” (amend) lần commit trước"
 
-#: builtin/commit.c:1613
+#: builtin/commit.c:1616
 msgid "bypass post-rewrite hook"
 msgstr "vòng qua móc (hook) post-rewrite"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1621
 msgid "ok to record an empty change"
 msgstr "ok để ghi lại một thay đổi trống rỗng"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1623
 msgid "ok to record a change with an empty message"
 msgstr "ok để ghi các thay đổi với lời nhắn trống rỗng"
 
-#: builtin/commit.c:1649
+#: builtin/commit.c:1652
 msgid "could not parse HEAD commit"
 msgstr "không thể phân tích commit (lần chuyển giao) HEAD"
 
-#: builtin/commit.c:1695
+#: builtin/commit.c:1698
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Tập tin MERGE_HEAD sai hỏng (%s)"
 
-#: builtin/commit.c:1702
+#: builtin/commit.c:1705
 msgid "could not read MERGE_MODE"
 msgstr "không thể đọc MERGE_MODE"
 
-#: builtin/commit.c:1721
+#: builtin/commit.c:1724
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "không thể đọc phần chú thích (message) của llần chuyển giao: %s"
 
-#: builtin/commit.c:1732
+#: builtin/commit.c:1735
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr ""
 "Đang bỏ qua việc chuyển giao; bạn đã không biên soạn phần chú thích "
 "(message).\n"
 
-#: builtin/commit.c:1737
+#: builtin/commit.c:1740
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Bãi bỏ việc chuyển giao bởi vì phần chú thích của nó trống rỗng.\n"
 
-#: builtin/commit.c:1785
+#: builtin/commit.c:1788
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -5504,11 +5563,11 @@
 msgid "respect include directives on lookup"
 msgstr "tôn trọng kể cà các hướng trong tìm kiếm"
 
-#: builtin/config.c:311
+#: builtin/config.c:303
 msgid "unable to parse default color value"
 msgstr "không thể phân tích giá trị màu mặc định"
 
-#: builtin/config.c:449
+#: builtin/config.c:441
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5523,16 +5582,16 @@
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:583
+#: builtin/config.c:575
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "không thể tạo tập tin cấu hình “%s”"
 
-#: builtin/count-objects.c:55
+#: builtin/count-objects.c:77
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:65
+#: builtin/count-objects.c:87
 msgid "print sizes in human readable format"
 msgstr "hiển thị kích cỡ theo định dạng dành cho người đọc"
 
@@ -5652,7 +5711,7 @@
 msgid "only consider tags matching <pattern>"
 msgstr "chỉ cân nhắc đến những thẻ khớp với <mẫu>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:318
+#: builtin/describe.c:410 builtin/name-rev.c:314
 msgid "show abbreviated commit object as fallback"
 msgstr "hiển thị đối tượng chuyển giao vắn tắt như là fallback"
 
@@ -5831,7 +5890,7 @@
 msgid "convert to a complete repository"
 msgstr "chuyển đổi hoàn toàn sang kho git"
 
-#: builtin/fetch.c:118 builtin/log.c:1233
+#: builtin/fetch.c:118 builtin/log.c:1232
 msgid "dir"
 msgstr "tmục"
 
@@ -5873,7 +5932,7 @@
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s -> %s  (không thể fetch (lấy) về nhánh hiện hành)"
 
-#: builtin/fetch.c:478 builtin/fetch.c:564
+#: builtin/fetch.c:478 builtin/fetch.c:566
 msgid "[rejected]"
 msgstr "[Bị từ chối]"
 
@@ -5897,39 +5956,39 @@
 msgid "[new ref]"
 msgstr "[ref (tham chiếu) mới]"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "unable to update local ref"
 msgstr "không thể cập nhật tham chiếu nội bộ"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "forced update"
 msgstr "cưỡng bức cập nhật"
 
-#: builtin/fetch.c:566
+#: builtin/fetch.c:568
 msgid "(non-fast-forward)"
 msgstr "(không-chuyển-tiếp-nhanh)"
 
-#: builtin/fetch.c:600 builtin/fetch.c:842
+#: builtin/fetch.c:602 builtin/fetch.c:843
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "không thể mở %s: %s\n"
 
-#: builtin/fetch.c:609
+#: builtin/fetch.c:611
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s đã không gửi tất cả các đối tượng cần thiết\n"
 
-#: builtin/fetch.c:627
+#: builtin/fetch.c:629
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr "từ chối %s bởi vì các gốc nông thì không được phép cập nhật"
 
-#: builtin/fetch.c:715 builtin/fetch.c:807
+#: builtin/fetch.c:716 builtin/fetch.c:808
 #, c-format
 msgid "From %.*s\n"
 msgstr "Từ %.*s\n"
 
-#: builtin/fetch.c:726
+#: builtin/fetch.c:727
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -5938,57 +5997,57 @@
 "một số tham chiếu nội bộ không thể được cập nhật; hãy thử chạy\n"
 " “git remote prune %s” để bỏ đi những nhánh cũ, hay bị xung đột"
 
-#: builtin/fetch.c:778
+#: builtin/fetch.c:779
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s sẽ trở thành không đầu (không được quản lý))"
 
-#: builtin/fetch.c:779
+#: builtin/fetch.c:780
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s đã trở thành không đầu (không được quản lý))"
 
-#: builtin/fetch.c:811
+#: builtin/fetch.c:812
 msgid "[deleted]"
 msgstr "[đã xóa]"
 
-#: builtin/fetch.c:812 builtin/remote.c:1034
+#: builtin/fetch.c:813 builtin/remote.c:1040
 msgid "(none)"
 msgstr "(không)"
 
-#: builtin/fetch.c:832
+#: builtin/fetch.c:833
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr ""
 "Từ chối việc lấy vào trong nhánh hiện tại %s của một kho chứa không phải kho "
 "trần (bare)"
 
-#: builtin/fetch.c:851
+#: builtin/fetch.c:852
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Tùy chọn \"%s\" có giá trị \"%s\" là không hợp lệ cho %s"
 
-#: builtin/fetch.c:854
+#: builtin/fetch.c:855
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Tùy chọn \"%s\" bị bỏ qua với %s\n"
 
-#: builtin/fetch.c:910
+#: builtin/fetch.c:911
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Không biết làm cách nào để lấy về từ %s"
 
-#: builtin/fetch.c:1071
+#: builtin/fetch.c:1072
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Đang lấy “%s” về\n"
 
-#: builtin/fetch.c:1073 builtin/remote.c:90
+#: builtin/fetch.c:1074 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "không thể “%s” về"
 
-#: builtin/fetch.c:1091
+#: builtin/fetch.c:1092
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -5996,32 +6055,32 @@
 "Chưa chỉ ra kho chứa máy chủ.  Xin hãy chỉ định hoặc là URL hoặc\n"
 "tên máy chủ từ cái mà những điểm xét duyệt mới có thể được fetch (lấy về)."
 
-#: builtin/fetch.c:1114
+#: builtin/fetch.c:1115
 msgid "You need to specify a tag name."
 msgstr "Bạn phải định rõ tên thẻ."
 
-#: builtin/fetch.c:1156
+#: builtin/fetch.c:1157
 msgid "--depth and --unshallow cannot be used together"
 msgstr "tùy chọn --depth và --unshallow không thể sử dụng cùng với nhau"
 
-#: builtin/fetch.c:1158
+#: builtin/fetch.c:1159
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow trên kho hoàn chỉnh là không hợp lý"
 
-#: builtin/fetch.c:1181
+#: builtin/fetch.c:1179
 msgid "fetch --all does not take a repository argument"
 msgstr "lệnh lấy về \"fetch --all\" không lấy đối số kho chứa"
 
-#: builtin/fetch.c:1183
+#: builtin/fetch.c:1181
 msgid "fetch --all does not make sense with refspecs"
 msgstr "lệnh lấy về \"fetch --all\" không hợp lý với refspecs"
 
-#: builtin/fetch.c:1194
+#: builtin/fetch.c:1192
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "không có nhóm máy chủ hay máy chủ như thế: %s"
 
-#: builtin/fetch.c:1202
+#: builtin/fetch.c:1200
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Việc lấy về cả một nhóm và chỉ định refspecs không hợp lý"
 
@@ -6032,23 +6091,23 @@
 "git fmt-merge-msg [-m <chú_thích>] [--log[=<n>] | --no-log] [--file <tập-"
 "tin>]"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:667
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "gắn nhật ký với ít nhất <n> mục từ lệnh “shortlog”"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:670
 msgid "alias for --log (deprecated)"
 msgstr "bí danh cho --log (không được dùng)"
 
-#: builtin/fmt-merge-msg.c:676
+#: builtin/fmt-merge-msg.c:673
 msgid "text"
 msgstr "văn bản"
 
-#: builtin/fmt-merge-msg.c:677
+#: builtin/fmt-merge-msg.c:674
 msgid "use <text> as start of message"
 msgstr "dùng <văn bản thường> để bắt đầu ghi chú"
 
-#: builtin/fmt-merge-msg.c:678
+#: builtin/fmt-merge-msg.c:675
 msgid "file to read from"
 msgstr "tập tin để đọc dữ liệu từ đó"
 
@@ -6056,95 +6115,115 @@
 msgid "git for-each-ref [<options>] [<pattern>]"
 msgstr "git for-each-ref [<các-tùy-chọn>] [<mẫu>]"
 
-#: builtin/for-each-ref.c:24
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
+msgstr "git for-each-ref [--points-at <đối tượng>]"
+
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+msgstr "git branch ([--merged | --no-merged) [<đối_tượng>]"
+
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
+msgstr "git for-each-ref [--contains [<đối_tượng>]]"
+
+#: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
 msgstr "trích dẫn để phù hợp cho hệ vỏ (shell)"
 
-#: builtin/for-each-ref.c:26
+#: builtin/for-each-ref.c:29
 msgid "quote placeholders suitably for perl"
 msgstr "trích dẫn để phù hợp cho perl"
 
-#: builtin/for-each-ref.c:28
+#: builtin/for-each-ref.c:31
 msgid "quote placeholders suitably for python"
 msgstr "trích dẫn để phù hợp cho python"
 
-#: builtin/for-each-ref.c:30
+#: builtin/for-each-ref.c:33
 msgid "quote placeholders suitably for Tcl"
 msgstr "trích dẫn để phù hợp cho Tcl"
 
-#: builtin/for-each-ref.c:33
+#: builtin/for-each-ref.c:36
 msgid "show only <n> matched refs"
 msgstr "hiển thị chỉ <n> tham chiếu khớp"
 
-#: builtin/for-each-ref.c:34
+#: builtin/for-each-ref.c:37 builtin/tag.c:372
 msgid "format to use for the output"
 msgstr "định dạng sẽ dùng cho đầu ra"
 
-#: builtin/for-each-ref.c:35
-msgid "key"
-msgstr "khóa"
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
+msgstr "chỉ hiển thị các tham chiếu mà nó chỉ đến đối tượng đã cho"
 
-#: builtin/for-each-ref.c:36
-msgid "field name to sort on"
-msgstr "tên trường cần sắp xếp"
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
+msgstr "chỉ hiển thị những tham chiếu mà nó được hòa trộn"
 
-#: builtin/fsck.c:163 builtin/prune.c:137
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr "chỉ hiển thị những tham chiếu mà nó không được hòa trộn"
+
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
+msgstr "chỉ hiển thị những tham chiếu mà nó chứa lần chuyển giao"
+
+#: builtin/fsck.c:156 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr "Đang kiểm tra kết nối"
 
-#: builtin/fsck.c:568
+#: builtin/fsck.c:486
 msgid "Checking object directories"
 msgstr "Đang kiểm tra các thư mục đối tượng"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:553
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<các-tùy-chọn>] [<đối-tượng>…]"
 
-#: builtin/fsck.c:637
+#: builtin/fsck.c:559
 msgid "show unreachable objects"
 msgstr "hiển thị các đối tượng không thể đọc được"
 
-#: builtin/fsck.c:638
+#: builtin/fsck.c:560
 msgid "show dangling objects"
 msgstr "hiển thị các đối tượng không được quản lý"
 
-#: builtin/fsck.c:639
+#: builtin/fsck.c:561
 msgid "report tags"
 msgstr "báo cáo các thẻ"
 
-#: builtin/fsck.c:640
+#: builtin/fsck.c:562
 msgid "report root nodes"
 msgstr "báo cáo node gốc"
 
-#: builtin/fsck.c:641
+#: builtin/fsck.c:563
 msgid "make index objects head nodes"
 msgstr "tạo “index objects head nodes”"
 
-#: builtin/fsck.c:642
+#: builtin/fsck.c:564
 msgid "make reflogs head nodes (default)"
 msgstr "tạo “reflogs head nodes” (mặc định)"
 
-#: builtin/fsck.c:643
+#: builtin/fsck.c:565
 msgid "also consider packs and alternate objects"
 msgstr "cũng cân nhắc đến các đối tượng gói và thay thế"
 
-#: builtin/fsck.c:644
+#: builtin/fsck.c:566
 msgid "check only connectivity"
 msgstr "chỉ kiểm tra kết nối"
 
-#: builtin/fsck.c:645
+#: builtin/fsck.c:567
 msgid "enable more strict checking"
 msgstr "cho phép kiểm tra hạn chế hơn"
 
-#: builtin/fsck.c:647
+#: builtin/fsck.c:569
 msgid "write dangling objects in .git/lost-found"
 msgstr "ghi các đối tượng không được quản lý trong .git/lost-found"
 
-#: builtin/fsck.c:648 builtin/prune.c:107
+#: builtin/fsck.c:570 builtin/prune.c:107
 msgid "show progress"
 msgstr "hiển thị quá trình"
 
-#: builtin/fsck.c:707
+#: builtin/fsck.c:631
 msgid "Checking objects"
 msgstr "Đang kiểm tra các đối tượng"
 
@@ -6152,50 +6231,65 @@
 msgid "git gc [<options>]"
 msgstr "git gc [<các-tùy-chọn>]"
 
-#: builtin/gc.c:55
+#: builtin/gc.c:72
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "%s không hợp lệ: “%s”"
 
-#: builtin/gc.c:100
+#: builtin/gc.c:139
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "thư mục đối tượng dài một cách điên rồ %.*s"
 
-#: builtin/gc.c:269
+#: builtin/gc.c:290
+#, c-format
+msgid ""
+"The last gc run reported the following. Please correct the root cause\n"
+"and remove %s.\n"
+"Automatic cleanup will not be performed until the file is removed.\n"
+"\n"
+"%s"
+msgstr ""
+"Lần chạy gc cuối đã báo cáo các vấn đề sau đây. Vui lòng sửa nguyên nhân\n"
+"tận gốc và xóa bỏ %s.\n"
+"Việc tự động dọn dẹp sẽ không thực thi cho đến khi tập tin được xóa bỏ.\n"
+"\n"
+"%s"
+
+#: builtin/gc.c:327
 msgid "prune unreferenced objects"
 msgstr "xóa bỏ các đối tượng không được tham chiếu"
 
-#: builtin/gc.c:271
+#: builtin/gc.c:329
 msgid "be more thorough (increased runtime)"
 msgstr "cẩn thận hơn nữa (tăng thời gian chạy)"
 
-#: builtin/gc.c:272
+#: builtin/gc.c:330
 msgid "enable auto-gc mode"
 msgstr "bật chế độ auto-gc"
 
-#: builtin/gc.c:273
+#: builtin/gc.c:331
 msgid "force running gc even if there may be another gc running"
 msgstr "buộc gc chạy ngay cả khi có tiến trình gc khác đang chạy"
 
-#: builtin/gc.c:315
+#: builtin/gc.c:373
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 "Tự động đóng gói kho chứa trên nền hệ thống để tối ưu hóa hiệu suất làm "
 "việc.\n"
 
-#: builtin/gc.c:317
+#: builtin/gc.c:375
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "Tự động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n"
 
-#: builtin/gc.c:318
+#: builtin/gc.c:376
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "Xem \"git help gc\" để có hướng dẫn cụ thể về cách dọn dẹp kho git.\n"
 
-#: builtin/gc.c:336
+#: builtin/gc.c:397
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -6203,7 +6297,7 @@
 "gc đang được thực hiện trên máy “%s” pid %<PRIuMAX> (dùng --force nếu không "
 "phải thế)"
 
-#: builtin/gc.c:364
+#: builtin/gc.c:441
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -6239,202 +6333,198 @@
 msgid "cannot open '%s'"
 msgstr "không mở được “%s”"
 
-#: builtin/grep.c:638
+#: builtin/grep.c:633
 msgid "search in index instead of in the work tree"
 msgstr "tìm trong bảng mục lục thay vì trong cây làm việc"
 
-#: builtin/grep.c:640
+#: builtin/grep.c:635
 msgid "find in contents not managed by git"
 msgstr "tìm trong nội dung không được quản lý bởi git"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:637
 msgid "search in both tracked and untracked files"
 msgstr "tìm kiếm các tập tin được và chưa được theo dõi dấu vết"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:639
 msgid "ignore files specified via '.gitignore'"
 msgstr "các tập tin bị bỏ qua được chỉ định thông qua “.gitignore”"
 
-#: builtin/grep.c:647
+#: builtin/grep.c:642
 msgid "show non-matching lines"
 msgstr "hiển thị những dòng không khớp với mẫu"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:644
 msgid "case insensitive matching"
 msgstr "phân biệt HOA/thường"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:646
 msgid "match patterns only at word boundaries"
 msgstr "chỉ khớp mẫu tại đường ranh giới từ"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:648
 msgid "process binary files as text"
 msgstr "xử lý tập tin nhị phân như là dạng văn bản thường"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:650
 msgid "don't match patterns in binary files"
 msgstr "không khớp mẫu trong các tập tin nhị phân"
 
-#: builtin/grep.c:658
+#: builtin/grep.c:653
 msgid "process binary files with textconv filters"
 msgstr "xử lý tập tin nhị phân với các bộ lọc “textconv”"
 
-#: builtin/grep.c:660
+#: builtin/grep.c:655
 msgid "descend at most <depth> levels"
-msgstr "giảm xuống ít nhất mức <sâu>"
+msgstr "hạ xuống ít nhất là mức <sâu>"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:659
 msgid "use extended POSIX regular expressions"
 msgstr "dùng biểu thức chính qui POSIX có mở rộng"
 
-#: builtin/grep.c:667
+#: builtin/grep.c:662
 msgid "use basic POSIX regular expressions (default)"
 msgstr "sử dụng biểu thức chính quy kiểu POSIX (mặc định)"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:665
 msgid "interpret patterns as fixed strings"
 msgstr "diễn dịch các mẫu như là chuỗi cố định"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:668
 msgid "use Perl-compatible regular expressions"
 msgstr "sử dụng biểu thức chính quy tương thích Perl"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:671
 msgid "show line numbers"
 msgstr "hiển thị số của dòng"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:672
 msgid "don't show filenames"
 msgstr "không hiển thị tên tập tin"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:673
 msgid "show filenames"
 msgstr "hiển thị các tên tập tin"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:675
 msgid "show filenames relative to top directory"
 msgstr "hiển thị tên tập tin tương đối với thư mục đỉnh (top)"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:677
 msgid "show only filenames instead of matching lines"
 msgstr "chỉ hiển thị tên tập tin thay vì những dòng khớp với mẫu"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:679
 msgid "synonym for --files-with-matches"
 msgstr "đồng nghĩa với --files-with-matches"
 
-#: builtin/grep.c:687
+#: builtin/grep.c:682
 msgid "show only the names of files without match"
 msgstr "chỉ hiển thị tên cho những tập tin không khớp với mẫu"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:684
 msgid "print NUL after filenames"
 msgstr "thêm NUL vào sau tên tập tin"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:686
 msgid "show the number of matches instead of matching lines"
 msgstr "hiển thị số lượng khớp thay vì những dòng khớp với mẫu"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:687
 msgid "highlight matches"
 msgstr "tô sáng phần khớp mẫu"
 
-#: builtin/grep.c:694
+#: builtin/grep.c:689
 msgid "print empty line between matches from different files"
 msgstr "hiển thị dòng trống giữa các lần khớp từ các tập tin khác biệt"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:691
 msgid "show filename only once above matches from same file"
 msgstr ""
 "hiển thị tên tập tin một lần phía trên các lần khớp từ cùng một tập tin"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:694
 msgid "show <n> context lines before and after matches"
 msgstr "hiển thị <n> dòng nội dung phía trước và sau các lần khớp"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:697
 msgid "show <n> context lines before matches"
 msgstr "hiển thị <n> dòng nội dung trước khớp"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:699
 msgid "show <n> context lines after matches"
 msgstr "hiển thị <n> dòng nội dung sau khớp"
 
-#: builtin/grep.c:705
+#: builtin/grep.c:700
 msgid "shortcut for -C NUM"
 msgstr "dạng viết tắt của -C SỐ"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:703
 msgid "show a line with the function name before matches"
 msgstr "hiển thị dòng vói tên hàm trước các lần khớp"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:705
 msgid "show the surrounding function"
 msgstr "hiển thị hàm bao quanh"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:708
 msgid "read patterns from file"
 msgstr "đọc mẫu từ tập-tin"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:710
 msgid "match <pattern>"
 msgstr "match <mẫu>"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:712
 msgid "combine patterns specified with -e"
 msgstr "tổ hợp mẫu được chỉ ra với tùy chọn -e"
 
-#: builtin/grep.c:729
+#: builtin/grep.c:724
 msgid "indicate hit with exit status without output"
 msgstr "đưa ra gợi ý với trạng thái thoát mà không có kết xuất"
 
-#: builtin/grep.c:731
+#: builtin/grep.c:726
 msgid "show only matches from files that match all patterns"
 msgstr "chỉ hiển thị những cái khớp từ tập tin mà nó khớp toàn bộ các mẫu"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:728
 msgid "show parse tree for grep expression"
 msgstr "hiển thị cây phân tích cú pháp cho biểu thức “grep” (tìm kiếm)"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "pager"
 msgstr "dàn trang"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "show matching files in the pager"
 msgstr "hiển thị các tập tin khớp trong trang giấy"
 
-#: builtin/grep.c:740
+#: builtin/grep.c:735
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "cho phép gọi grep(1) (bị bỏ qua bởi lần dịch này)"
 
-#: builtin/grep.c:741 builtin/show-ref.c:189
-msgid "show usage"
-msgstr "hiển thị cách dùng"
-
-#: builtin/grep.c:808
+#: builtin/grep.c:793
 msgid "no pattern given."
 msgstr "chưa chỉ ra mẫu."
 
-#: builtin/grep.c:866
+#: builtin/grep.c:851
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager chỉ làm việc trên cây-làm-việc"
 
-#: builtin/grep.c:892
+#: builtin/grep.c:877
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached hay --untracked không được sử dụng với --no-index."
 
-#: builtin/grep.c:897
+#: builtin/grep.c:882
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr ""
 "--no-index hay --untracked không được sử dụng cùng với các tùy chọn liên "
 "quan đến revs."
 
-#: builtin/grep.c:900
+#: builtin/grep.c:885
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard không thể sử dụng cho nội dung lưu dấu vết."
 
-#: builtin/grep.c:908
+#: builtin/grep.c:893
 msgid "both --cached and trees are given."
 msgstr "cả hai --cached và các cây phải được chỉ ra."
 
@@ -6447,10 +6537,10 @@
 "[--] <tập-tin>…"
 
 #: builtin/hash-object.c:81
-msgid "git hash-object  --stdin-paths < <list-of-paths>"
-msgstr "git hash-object  --stdin-paths < <danh-sách-đường-dẫn>"
+msgid "git hash-object  --stdin-paths"
+msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:92 builtin/tag.c:614
+#: builtin/hash-object.c:92
 msgid "type"
 msgstr "kiểu"
 
@@ -6521,12 +6611,12 @@
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "phiên bản của emacsclient “%d” quá cũ (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
+#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "gặp lỗi khi thực thi “%s”: %s"
 
-#: builtin/help.c:215
+#: builtin/help.c:208
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -6535,7 +6625,7 @@
 "“%s”: đường dẫn không hỗ trợ bộ trình chiếu man.\n"
 "Hãy cân nhắc đến việc sử dụng “man.<tool>.cmd” để thay thế."
 
-#: builtin/help.c:227
+#: builtin/help.c:220
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -6544,61 +6634,61 @@
 "“%s”: cmd (lệnh) hỗ trợ bộ trình chiếu man.\n"
 "Hãy cân nhắc đến việc sử dụng “man.<tool>.path” để thay thế."
 
-#: builtin/help.c:354
+#: builtin/help.c:337
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "“%s”: không rõ chương trình xem man."
 
-#: builtin/help.c:371
+#: builtin/help.c:354
 msgid "no man viewer handled the request"
 msgstr "không có trình xem trợ giúp dạng manpage tiếp hợp với yêu cầu"
 
-#: builtin/help.c:379
+#: builtin/help.c:362
 msgid "no info viewer handled the request"
 msgstr "không có trình xem trợ giúp dạng info tiếp hợp với yêu cầu"
 
-#: builtin/help.c:428
+#: builtin/help.c:411
 msgid "Defining attributes per path"
 msgstr "Định nghĩa các thuộc tính cho mỗi đường dẫn"
 
-#: builtin/help.c:429
+#: builtin/help.c:412
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Mỗi ngày học 20 lệnh Git hay hơn"
 
-#: builtin/help.c:430
+#: builtin/help.c:413
 msgid "A Git glossary"
 msgstr "Thuật ngữ chuyên môn Git"
 
-#: builtin/help.c:431
+#: builtin/help.c:414
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Chỉ định các tập tin không cần theo dõi"
 
-#: builtin/help.c:432
+#: builtin/help.c:415
 msgid "Defining submodule properties"
 msgstr "Định nghĩa thuộc tính mô-đun-con"
 
-#: builtin/help.c:433
+#: builtin/help.c:416
 msgid "Specifying revisions and ranges for Git"
 msgstr "Chỉ định điểm xét duyệt và vùng cho Git"
 
-#: builtin/help.c:434
+#: builtin/help.c:417
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Hướng dẫn cách dùng Git ở mức cơ bản (bản 1.5.1 hay mới hơn)"
 
-#: builtin/help.c:435
+#: builtin/help.c:418
 msgid "An overview of recommended workflows with Git"
 msgstr "Tổng quan về luồng công việc khuyến nghị nên dùng với Git."
 
-#: builtin/help.c:447
+#: builtin/help.c:430
 msgid "The common Git guides are:\n"
 msgstr "Các chỉ dẫn chung về cách dùng Git là:\n"
 
-#: builtin/help.c:468 builtin/help.c:485
+#: builtin/help.c:451 builtin/help.c:468
 #, c-format
 msgid "usage: %s%s"
 msgstr "cách dùng: %s%s"
 
-#: builtin/help.c:501
+#: builtin/help.c:484
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "“git %s” được đặt bí danh thành “%s”"
@@ -6886,87 +6976,62 @@
 msgid "--verify with no packfile name given"
 msgstr "dùng tùy chọn --verify mà không đưa ra tên packfile"
 
-#: builtin/init-db.c:36
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr "Không thể làm %s được ghi bởi nhóm"
-
-#: builtin/init-db.c:63
-#, c-format
-msgid "insanely long template name %s"
-msgstr "tên mẫu dài một cách điên rồ %s"
-
-#: builtin/init-db.c:68
+#: builtin/init-db.c:55
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "không thể lấy thông tin thống kê về “%s”"
 
-#: builtin/init-db.c:74
+#: builtin/init-db.c:61
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "không thể lấy thông tin thống kê về mẫu “%s”"
 
-#: builtin/init-db.c:81
+#: builtin/init-db.c:66
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "không thể opendir() “%s”"
 
-#: builtin/init-db.c:98
+#: builtin/init-db.c:77
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "không thể readlink “%s”"
 
-#: builtin/init-db.c:100
-#, c-format
-msgid "insanely long symlink %s"
-msgstr "liên kết mềm dài một cách điên rồ %s"
-
-#: builtin/init-db.c:103
+#: builtin/init-db.c:79
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "không thể tạo liên kết mềm (symlink) “%s” “%s”"
 
-#: builtin/init-db.c:107
+#: builtin/init-db.c:85
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "không thể sao chép “%s” sang “%s”"
 
-#: builtin/init-db.c:111
+#: builtin/init-db.c:89
 #, c-format
 msgid "ignoring template %s"
 msgstr "đang lờ đi mẫu “%s”"
 
-#: builtin/init-db.c:137
-#, c-format
-msgid "insanely long template path %s"
-msgstr "đường dẫn mẫu “%s” dài một cách điên rồ"
-
-#: builtin/init-db.c:145
+#: builtin/init-db.c:118
 #, c-format
 msgid "templates not found %s"
 msgstr "các mẫu không được tìm thấy %s"
 
-#: builtin/init-db.c:158
+#: builtin/init-db.c:131
 #, c-format
 msgid "not copying templates of a wrong format version %d from '%s'"
 msgstr "không sao chép các mẫu của phiên bản sai định dạng %d từ “%s”"
 
-#: builtin/init-db.c:212
-#, c-format
-msgid "insane git directory %s"
-msgstr "thư mục git điên rồ %s"
-
-#: builtin/init-db.c:344 builtin/init-db.c:347
+#: builtin/init-db.c:309 builtin/init-db.c:312
 #, c-format
 msgid "%s already exists"
 msgstr "%s đã có từ trước rồi"
 
-#: builtin/init-db.c:375
+#: builtin/init-db.c:340
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "không thể xử lý (handle) tập tin kiểu %d"
 
-#: builtin/init-db.c:378
+#: builtin/init-db.c:343
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "không di chuyển được %s vào %s"
@@ -6974,24 +7039,24 @@
 #. TRANSLATORS: The first '%s' is either "Reinitialized
 #. existing" or "Initialized empty", the second " shared" or
 #. "", and the last '%s%s' is the verbatim directory name.
-#: builtin/init-db.c:434
+#: builtin/init-db.c:399
 #, c-format
 msgid "%s%s Git repository in %s%s\n"
 msgstr "%s%s kho Git trong %s%s\n"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Reinitialized existing"
 msgstr "Khởi tạo lại đã sẵn có rồi"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Initialized empty"
 msgstr "Khởi tạo trống rỗng"
 
-#: builtin/init-db.c:436
+#: builtin/init-db.c:401
 msgid " shared"
 msgstr " đã chia sẻ"
 
-#: builtin/init-db.c:483
+#: builtin/init-db.c:448
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -6999,25 +7064,25 @@
 "git init [-q | --quiet] [--bare] [--template=<thư-mục-tạm>] [--shared[=<các-"
 "quyền>]] [thư-mục]"
 
-#: builtin/init-db.c:506
+#: builtin/init-db.c:471
 msgid "permissions"
 msgstr "các quyền"
 
-#: builtin/init-db.c:507
+#: builtin/init-db.c:472
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "chỉ ra cái mà kho git được chia sẻ giữa nhiều người dùng"
 
-#: builtin/init-db.c:541 builtin/init-db.c:546
+#: builtin/init-db.c:506 builtin/init-db.c:511
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "không thể mkdir (tạo thư mục): %s"
 
-#: builtin/init-db.c:550
+#: builtin/init-db.c:515
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "không thể chdir (chuyển đổi thư mục) sang %s"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:536
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7026,7 +7091,7 @@
 "%s (hoặc --work-tree=<thư-mục>) không cho phép không chỉ định %s (hoặc --git-"
 "dir=<thư-mục>)"
 
-#: builtin/init-db.c:599
+#: builtin/init-db.c:564
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "không thể truy cập cây (tree) làm việc “%s”"
@@ -7112,212 +7177,212 @@
 msgid "name of output directory is too long"
 msgstr "tên của thư mục kết xuất quá dài"
 
-#: builtin/log.c:814
+#: builtin/log.c:813
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Không thể mở tập tin miếng vá: %s"
 
-#: builtin/log.c:828
+#: builtin/log.c:827
 msgid "Need exactly one range."
 msgstr "Cần chính xác một vùng."
 
-#: builtin/log.c:838
+#: builtin/log.c:837
 msgid "Not a range."
 msgstr "Không phải là một vùng."
 
-#: builtin/log.c:944
+#: builtin/log.c:943
 msgid "Cover letter needs email format"
 msgstr "“Cover letter” cần cho định dạng thư"
 
-#: builtin/log.c:1023
+#: builtin/log.c:1022
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to điên rồ: %s"
 
-#: builtin/log.c:1051
+#: builtin/log.c:1050
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<các-tùy-chọn>] [<kể-từ> | <vùng-xem-xét>]"
 
-#: builtin/log.c:1096
+#: builtin/log.c:1095
 msgid "Two output directories?"
 msgstr "Hai thư mục kết xuất?"
 
-#: builtin/log.c:1211
+#: builtin/log.c:1210
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "dùng [PATCH n/m] ngay cả với miếng vá đơn"
 
-#: builtin/log.c:1214
+#: builtin/log.c:1213
 msgid "use [PATCH] even with multiple patches"
 msgstr "dùng [VÁ] ngay cả với các miếng vá phức tạp"
 
-#: builtin/log.c:1218
+#: builtin/log.c:1217
 msgid "print patches to standard out"
 msgstr "hiển thị miếng vá ra đầu ra chuẩn"
 
-#: builtin/log.c:1220
+#: builtin/log.c:1219
 msgid "generate a cover letter"
 msgstr "tạo bì thư"
 
-#: builtin/log.c:1222
+#: builtin/log.c:1221
 msgid "use simple number sequence for output file names"
 msgstr "sử dụng chỗi dãy số dạng đơn giản cho tên tập-tin xuất ra"
 
-#: builtin/log.c:1223
+#: builtin/log.c:1222
 msgid "sfx"
 msgstr "sfx"
 
-#: builtin/log.c:1224
+#: builtin/log.c:1223
 msgid "use <sfx> instead of '.patch'"
 msgstr "sử dụng <sfx> thay cho “.patch”"
 
-#: builtin/log.c:1226
+#: builtin/log.c:1225
 msgid "start numbering patches at <n> instead of 1"
 msgstr "bắt đầu đánh số miếng vá từ <n> thay vì 1"
 
-#: builtin/log.c:1228
+#: builtin/log.c:1227
 msgid "mark the series as Nth re-roll"
 msgstr "đánh dấu chuỗi nối tiếp dạng thứ-N re-roll"
 
-#: builtin/log.c:1230
+#: builtin/log.c:1229
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "Dùng [<tiền-tố>] thay cho [VÁ]"
 
-#: builtin/log.c:1233
+#: builtin/log.c:1232
 msgid "store resulting files in <dir>"
 msgstr "lưu các tập tin kết quả trong <t.mục>"
 
-#: builtin/log.c:1236
+#: builtin/log.c:1235
 msgid "don't strip/add [PATCH]"
 msgstr "không strip/add [VÁ]"
 
-#: builtin/log.c:1239
+#: builtin/log.c:1238
 msgid "don't output binary diffs"
 msgstr "không kết xuất diff (những khác biệt) nhị phân"
 
-#: builtin/log.c:1241
+#: builtin/log.c:1240
 msgid "don't include a patch matching a commit upstream"
 msgstr "không bao gồm miếng vá khớp với một lần chuyển giao thượng nguồn"
 
-#: builtin/log.c:1243
+#: builtin/log.c:1242
 msgid "show patch format instead of default (patch + stat)"
 msgstr "hiển thị định dạng miếng vá thay vì mặc định (miếng vá + thống kê)"
 
-#: builtin/log.c:1245
+#: builtin/log.c:1244
 msgid "Messaging"
 msgstr "Lời nhắn"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1245
 msgid "header"
 msgstr "đầu đề thư"
 
-#: builtin/log.c:1247
+#: builtin/log.c:1246
 msgid "add email header"
 msgstr "thêm đầu đề thư"
 
-#: builtin/log.c:1248 builtin/log.c:1250
+#: builtin/log.c:1247 builtin/log.c:1249
 msgid "email"
 msgstr "thư điện tử"
 
-#: builtin/log.c:1248
+#: builtin/log.c:1247
 msgid "add To: header"
 msgstr "thêm To: đầu đề thư"
 
-#: builtin/log.c:1250
+#: builtin/log.c:1249
 msgid "add Cc: header"
 msgstr "thêm Cc: đầu đề thư"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1251
 msgid "ident"
 msgstr "thụt lề"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1252
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "đặt “Địa chỉ gửi” thành <thụ lề> (hoặc thụt lề người commit nếu bỏ quên)"
 
-#: builtin/log.c:1255
+#: builtin/log.c:1254
 msgid "message-id"
 msgstr "message-id"
 
-#: builtin/log.c:1256
+#: builtin/log.c:1255
 msgid "make first mail a reply to <message-id>"
 msgstr "dùng thư đầu tiên để trả lời <message-id>"
 
-#: builtin/log.c:1257 builtin/log.c:1260
+#: builtin/log.c:1256 builtin/log.c:1259
 msgid "boundary"
 msgstr "ranh giới"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1257
 msgid "attach the patch"
 msgstr "đính kèm miếng vá"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1260
 msgid "inline the patch"
 msgstr "dùng miếng vá làm nội dung"
 
-#: builtin/log.c:1265
+#: builtin/log.c:1264
 msgid "enable message threading, styles: shallow, deep"
 msgstr "cho phép luồng lời nhắn, kiểu: “shallow”, “deep”"
 
-#: builtin/log.c:1267
+#: builtin/log.c:1266
 msgid "signature"
 msgstr "chữ ký"
 
-#: builtin/log.c:1268
+#: builtin/log.c:1267
 msgid "add a signature"
 msgstr "thêm chữ ký"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1269
 msgid "add a signature from a file"
 msgstr "thêm chữ ký từ một tập tin"
 
-#: builtin/log.c:1271
+#: builtin/log.c:1270
 msgid "don't print the patch filenames"
 msgstr "không hiển thị các tên tập tin của miếng vá"
 
-#: builtin/log.c:1360
+#: builtin/log.c:1359
 msgid "-n and -k are mutually exclusive."
 msgstr "-n và  -k loại từ lẫn nhau."
 
-#: builtin/log.c:1362
+#: builtin/log.c:1361
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix và -k xung khắc nhau."
 
-#: builtin/log.c:1370
+#: builtin/log.c:1369
 msgid "--name-only does not make sense"
 msgstr "--name-only không hợp lý"
 
-#: builtin/log.c:1372
+#: builtin/log.c:1371
 msgid "--name-status does not make sense"
 msgstr "--name-status không hợp lý"
 
-#: builtin/log.c:1374
+#: builtin/log.c:1373
 msgid "--check does not make sense"
 msgstr "--check không hợp lý"
 
-#: builtin/log.c:1397
+#: builtin/log.c:1396
 msgid "standard output, or directory, which one?"
 msgstr "đầu ra chuẩn, hay thư mục, chọn cái nào?"
 
-#: builtin/log.c:1399
+#: builtin/log.c:1398
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Không thể tạo thư mục “%s”"
 
-#: builtin/log.c:1496
+#: builtin/log.c:1495
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "không thể đọc tập tin chữ ký “%s”"
 
-#: builtin/log.c:1559
+#: builtin/log.c:1558
 msgid "Failed to create output files"
 msgstr "Gặp lỗi khi tạo các tập tin kết xuất"
 
-#: builtin/log.c:1607
+#: builtin/log.c:1606
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<thượng-nguồn> [<đầu> [<giới-hạn>]]]"
 
-#: builtin/log.c:1661
+#: builtin/log.c:1660
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -7325,7 +7390,7 @@
 "Không tìm thấy nhánh mạng được theo dõi, hãy chỉ định <thượng-nguồn> một "
 "cách thủ công.\n"
 
-#: builtin/log.c:1672 builtin/log.c:1674 builtin/log.c:1686
+#: builtin/log.c:1671 builtin/log.c:1673 builtin/log.c:1685
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Không hiểu lần chuyển giao %s"
@@ -7429,35 +7494,35 @@
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<các-tùy-chọn>] <tree-ish> [<đường-dẫn>…]"
 
-#: builtin/ls-tree.c:127
+#: builtin/ls-tree.c:128
 msgid "only show trees"
 msgstr "chỉ hiển thị các tree"
 
-#: builtin/ls-tree.c:129
+#: builtin/ls-tree.c:130
 msgid "recurse into subtrees"
 msgstr "đệ quy vào các thư mục con"
 
-#: builtin/ls-tree.c:131
+#: builtin/ls-tree.c:132
 msgid "show trees when recursing"
 msgstr "hiển thị cây khi đệ quy"
 
-#: builtin/ls-tree.c:134
+#: builtin/ls-tree.c:135
 msgid "terminate entries with NUL byte"
 msgstr "chấm dứt mục tin với byte NUL"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:136
 msgid "include object size"
 msgstr "gồm cả kích thước đối tượng"
 
-#: builtin/ls-tree.c:137 builtin/ls-tree.c:139
+#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
 msgid "list only filenames"
 msgstr "chỉ liệt kê tên tập tin"
 
-#: builtin/ls-tree.c:142
+#: builtin/ls-tree.c:143
 msgid "use full path names"
 msgstr "dùng tên đường dẫn đầy đủ"
 
-#: builtin/ls-tree.c:144
+#: builtin/ls-tree.c:145
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr "liệt kê cây mục tin; không chỉ thư mục hiện hành (ngụ ý --full-name)"
 
@@ -7565,7 +7630,7 @@
 
 #: builtin/merge.c:256
 msgid "stash failed"
-msgstr "stash gặp lỗi"
+msgstr "lệnh tạm cất gặp lỗi"
 
 #: builtin/merge.c:261
 #, c-format
@@ -7665,7 +7730,7 @@
 #: builtin/merge.c:823
 #, c-format
 msgid "Wonderful.\n"
-msgstr "Thần kỳ.\n"
+msgstr "Tuyệt vời.\n"
 
 #: builtin/merge.c:878
 #, c-format
@@ -7696,17 +7761,17 @@
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Không nhánh mạng theo dõi cho %s từ %s"
 
-#: builtin/merge.c:1081
+#: builtin/merge.c:1079
 #, c-format
 msgid "could not close '%s'"
 msgstr "không thể đóng “%s”"
 
-#: builtin/merge.c:1208
+#: builtin/merge.c:1206
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr ""
 "Ở đây không có lần hòa trộn nào được hủy bỏ giữa chừng cả (thiếu MERGE_HEAD)."
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1222
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7714,7 +7779,7 @@
 "Bạn chưa kết thúc việc hòa trộn (MERGE_HEAD vẫn tồn tại).\n"
 "Hãy chuyển giao các thay đổi trước khi bạn có thể hòa trộn."
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1229
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7722,54 +7787,54 @@
 "Bạn chưa kết thúc việc cherry-pick (CHERRY_PICK_HEAD vẫn tồn tại).\n"
 "Hãy chuyển giao các thay đổi trước khi bạn có thể hòa trộn."
 
-#: builtin/merge.c:1234
+#: builtin/merge.c:1232
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "Bạn chưa kết thúc việc cherry-pick (CHERRY_PICK_HEAD vẫn tồn tại)."
 
-#: builtin/merge.c:1243
+#: builtin/merge.c:1241
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Bạn không thể kết hợp --squash với --no-ff."
 
-#: builtin/merge.c:1251
+#: builtin/merge.c:1249
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Không chỉ ra lần chuyển giao và merge.defaultToUpstream chưa được đặt."
 
-#: builtin/merge.c:1268
+#: builtin/merge.c:1266
 msgid "Squash commit into empty head not supported yet"
 msgstr "Squash commit vào một head trống rỗng vẫn chưa được hỗ trợ"
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1268
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 "Chuyển giao không-chuyển-tiếp-nhanh không hợp lý ở trong một head trống rỗng"
 
-#: builtin/merge.c:1276
+#: builtin/merge.c:1274
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - không phải là một số thứ chúng tôi có thể hòa trộn"
 
-#: builtin/merge.c:1278
+#: builtin/merge.c:1276
 msgid "Can merge only exactly one commit into empty head"
 msgstr ""
 "Không thể hòa trộn một cách đúng đắn một lần chuyển giao vào một head rỗng"
 
-#: builtin/merge.c:1333
+#: builtin/merge.c:1331
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 "Lần chuyển giao %s có một chữ ký GPG không đáng tin, được cho là bởi %s."
 
-#: builtin/merge.c:1336
+#: builtin/merge.c:1334
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "Lần chuyển giao %s có một chữ ký GPG sai, được cho là bởi %s."
 
-#: builtin/merge.c:1339
+#: builtin/merge.c:1337
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Lần chuyển giao %s không có chữ ký GPG."
 
-#: builtin/merge.c:1342
+#: builtin/merge.c:1340
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Lần chuyển giao %s có một chữ ký GPG tốt bởi %s\n"
@@ -7779,46 +7844,46 @@
 msgid "Updating %s..%s\n"
 msgstr "Đang cập nhật %s..%s\n"
 
-#: builtin/merge.c:1462
+#: builtin/merge.c:1460
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Đang thử hòa trộn kiểu “trivial in-index”…\n"
 
-#: builtin/merge.c:1469
+#: builtin/merge.c:1467
 #, c-format
 msgid "Nope.\n"
 msgstr "Không.\n"
 
-#: builtin/merge.c:1501
+#: builtin/merge.c:1499
 msgid "Not possible to fast-forward, aborting."
 msgstr "Thực hiện lệnh chuyển-tiếp-nhanh là không thể được, đang bỏ qua."
 
-#: builtin/merge.c:1524 builtin/merge.c:1603
+#: builtin/merge.c:1522 builtin/merge.c:1601
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Đang tua lại cây thành thời xa xưa…\n"
 
-#: builtin/merge.c:1528
+#: builtin/merge.c:1526
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Đang thử chiến lược hòa trộn %s…\n"
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1592
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Không có chiến lược hòa trộn nào được nắm giữ (handle) sự hòa trộn.\n"
 
-#: builtin/merge.c:1596
+#: builtin/merge.c:1594
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Hòa trộn với chiến lược %s gặp lỗi.\n"
 
-#: builtin/merge.c:1605
+#: builtin/merge.c:1603
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Sử dụng %s để chuẩn bị giải quyết bằng tay.\n"
 
-#: builtin/merge.c:1617
+#: builtin/merge.c:1615
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -8009,49 +8074,49 @@
 msgid "Renaming %s to %s\n"
 msgstr "Đổi tên %s thành %s\n"
 
-#: builtin/mv.c:256 builtin/remote.c:722 builtin/repack.c:362
+#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "gặp lỗi khi đổi tên “%s”"
 
-#: builtin/name-rev.c:255
+#: builtin/name-rev.c:251
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<các-tùy-chọn>] <commit>…"
 
-#: builtin/name-rev.c:256
+#: builtin/name-rev.c:252
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<các-tùy-chọn>] --all"
 
-#: builtin/name-rev.c:257
+#: builtin/name-rev.c:253
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<các-tùy-chọn>] --stdin"
 
-#: builtin/name-rev.c:309
+#: builtin/name-rev.c:305
 msgid "print only names (no SHA-1)"
 msgstr "chỉ hiển thị tên (không SHA-1)"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:306
 msgid "only use tags to name the commits"
 msgstr "chỉ dùng các thẻ để đặt tên cho các lần chuyển giao"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:308
 msgid "only use refs matching <pattern>"
 msgstr "chỉ sử dụng các tham chiếu khớp với <mẫu>"
 
-#: builtin/name-rev.c:314
+#: builtin/name-rev.c:310
 msgid "list all commits reachable from all refs"
 msgstr ""
 "liệt kê tất cả các lần chuyển giao có thể đọc được từ tất cả các tham chiếu"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:311
 msgid "read from stdin"
 msgstr "đọc từ đầu vào tiêu chuẩn"
 
-#: builtin/name-rev.c:316
+#: builtin/name-rev.c:312
 msgid "allow to print `undefined` names (default)"
 msgstr "cho phép in các tên “chưa định nghĩa” (mặc định)"
 
-#: builtin/name-rev.c:322
+#: builtin/name-rev.c:318
 msgid "dereference tags in the input (internal use)"
 msgstr "bãi bỏ tham chiếu các thẻ trong đầu vào (dùng nội bộ)"
 
@@ -8179,7 +8244,7 @@
 msgid "failed to finish 'show' for object '%s'"
 msgstr "gặp lỗi khi hoàn thành “show” cho đối tượng “%s”"
 
-#: builtin/notes.c:174 builtin/tag.c:477
+#: builtin/notes.c:174 builtin/tag.c:248
 #, c-format
 msgid "could not create file '%s'"
 msgstr "không thể tạo tập tin “%s”"
@@ -8198,12 +8263,12 @@
 msgid "The note contents have been left in %s"
 msgstr "Nội dung ghi chú còn lại %s"
 
-#: builtin/notes.c:232 builtin/tag.c:695
+#: builtin/notes.c:232 builtin/tag.c:440
 #, c-format
 msgid "cannot read '%s'"
 msgstr "không thể đọc “%s”"
 
-#: builtin/notes.c:234 builtin/tag.c:698
+#: builtin/notes.c:234 builtin/tag.c:443
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "không thể mở hay đọc “%s”"
@@ -8211,7 +8276,7 @@
 #: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306
 #: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507
 #: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653
-#: builtin/notes.c:877 builtin/tag.c:711
+#: builtin/notes.c:877 builtin/tag.c:456
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Gặp lỗi khi phân giải “%s” như là một tham chiếu hợp lệ."
@@ -8245,11 +8310,6 @@
 msgid "note contents in a file"
 msgstr "nội dung ghi chú (note) nằm trong một tập tin"
 
-#: builtin/notes.c:398 builtin/notes.c:401 builtin/notes.c:561
-#: builtin/notes.c:564 builtin/tag.c:630
-msgid "object"
-msgstr "đối tượng"
-
 #: builtin/notes.c:399 builtin/notes.c:562
 msgid "reuse and edit specified note object"
 msgstr "dùng lại nhưng có sửa chữa đối tượng note đã chỉ ra"
@@ -8380,7 +8440,7 @@
 msgid "use notes from <notes-ref>"
 msgstr "dùng “notes” từ <notes-ref>"
 
-#: builtin/notes.c:1012 builtin/remote.c:1588
+#: builtin/notes.c:1012 builtin/remote.c:1647
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Không hiểu câu lệnh con: %s"
@@ -8591,21 +8651,25 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <thời-gian>] [--] [<head>…]"
 
-#: builtin/prune.c:105 builtin/worktree.c:121
+#: builtin/prune.c:105 builtin/worktree.c:124
 msgid "do not remove, show only"
 msgstr "không gỡ bỏ, chỉ hiển thị"
 
-#: builtin/prune.c:106 builtin/worktree.c:122
+#: builtin/prune.c:106 builtin/worktree.c:125
 msgid "report pruned objects"
 msgstr "báo cáo các đối tượng đã prune"
 
-#: builtin/prune.c:109 builtin/worktree.c:124
+#: builtin/prune.c:109 builtin/worktree.c:127
 msgid "expire objects older than <time>"
 msgstr "các đối tượng hết hạn cũ hơn khoảng <thời gian>"
 
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
+msgstr "không thể tỉa bớt trong một kho đối_tượng_vĩ_đại"
+
 #: builtin/pull.c:69
-msgid "git pull [options] [<repository> [<refspec>...]]"
-msgstr "git push [các-tùy-chọn] [<kho-chứa> [<refspec>…]]"
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
+msgstr "git pull [<các-tùy-chọn>] [<kho-chứa> [<refspec>…]]"
 
 #: builtin/pull.c:113
 msgid "Options related to merging"
@@ -9179,12 +9243,12 @@
 msgid "debug unpack-trees"
 msgstr "gỡ lỗi “unpack-trees”"
 
-#: builtin/reflog.c:432
+#: builtin/reflog.c:428
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
 msgstr "“%s” dành cho “%s” không phải là dấu vết thời gian hợp lệ"
 
-#: builtin/reflog.c:549 builtin/reflog.c:554
+#: builtin/reflog.c:545 builtin/reflog.c:550
 #, c-format
 msgid "'%s' is not a valid timestamp"
 msgstr "“%s” không phải là dấu thời gian hợp lệ"
@@ -9201,15 +9265,15 @@
 "git remote add [-t <nhánh>] [-m <master>] [-f] [--tags|--no-tags] [--"
 "mirror=<fetch|push>] <tên> <url>"
 
-#: builtin/remote.c:14 builtin/remote.c:33
+#: builtin/remote.c:14 builtin/remote.c:34
 msgid "git remote rename <old> <new>"
 msgstr "git remote rename <tên-cũ> <tên-mới>"
 
-#: builtin/remote.c:15 builtin/remote.c:38
+#: builtin/remote.c:15 builtin/remote.c:39
 msgid "git remote remove <name>"
 msgstr "git remote remove <tên>"
 
-#: builtin/remote.c:16 builtin/remote.c:43
+#: builtin/remote.c:16 builtin/remote.c:44
 msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
 msgstr "git remote set-head <tên> (-a | --auto | -d | --delete | <nhánh>)"
 
@@ -9231,48 +9295,52 @@
 msgid "git remote set-branches [--add] <name> <branch>..."
 msgstr "git remote set-branches [--add] <tên> <nhánh>…"
 
-#: builtin/remote.c:21 builtin/remote.c:69
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr "git remote set-url [--push] [--all] <tên>"
+
+#: builtin/remote.c:22 builtin/remote.c:75
 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
 msgstr "git remote set-url [--push] <tên> <url-mới> [<url-cũ>]"
 
-#: builtin/remote.c:22 builtin/remote.c:70
+#: builtin/remote.c:23 builtin/remote.c:76
 msgid "git remote set-url --add <name> <newurl>"
 msgstr "git remote set-url --add <tên> <url-mới>"
 
-#: builtin/remote.c:23 builtin/remote.c:71
+#: builtin/remote.c:24 builtin/remote.c:77
 msgid "git remote set-url --delete <name> <url>"
 msgstr "git remote set-url --delete <tên> <url>"
 
-#: builtin/remote.c:28
+#: builtin/remote.c:29
 msgid "git remote add [<options>] <name> <url>"
 msgstr "git remote add [<các-tùy-chọn>] <tên> <url>"
 
-#: builtin/remote.c:48
+#: builtin/remote.c:49
 msgid "git remote set-branches <name> <branch>..."
 msgstr "git remote set-branches <tên> <nhánh>…"
 
-#: builtin/remote.c:49
+#: builtin/remote.c:50
 msgid "git remote set-branches --add <name> <branch>..."
 msgstr "git remote set-branches --add <tên> <nhánh>…"
 
-#: builtin/remote.c:54
+#: builtin/remote.c:55
 msgid "git remote show [<options>] <name>"
 msgstr "git remote show [<các-tùy-chọn>] <tên>"
 
-#: builtin/remote.c:59
+#: builtin/remote.c:60
 msgid "git remote prune [<options>] <name>"
 msgstr "git remote prune [<các-tùy-chọn>] <tên>"
 
-#: builtin/remote.c:64
+#: builtin/remote.c:65
 msgid "git remote update [<options>] [<group> | <remote>]..."
 msgstr "git remote update [<các-tùy-chọn>] [<nhóm> | <máy-chủ>]…"
 
-#: builtin/remote.c:88
+#: builtin/remote.c:94
 #, c-format
 msgid "Updating %s"
 msgstr "Đang cập nhật %s"
 
-#: builtin/remote.c:120
+#: builtin/remote.c:126
 msgid ""
 "--mirror is dangerous and deprecated; please\n"
 "\t use --mirror=fetch or --mirror=push instead"
@@ -9280,96 +9348,96 @@
 "--mirror nguy hiểm và không dùng nữa; xin hãy\n"
 "\t sử dụng tùy chọn --mirror=fetch hoặc --mirror=push để thay thế"
 
-#: builtin/remote.c:137
+#: builtin/remote.c:143
 #, c-format
 msgid "unknown mirror argument: %s"
 msgstr "không hiểu tham số máy bản sao (mirror): %s"
 
-#: builtin/remote.c:153
+#: builtin/remote.c:159
 msgid "fetch the remote branches"
 msgstr "lấy về các nhánh từ máy chủ"
 
-#: builtin/remote.c:155
+#: builtin/remote.c:161
 msgid "import all tags and associated objects when fetching"
 msgstr "nhập vào tất cả các đối tượng thẻ và thành phần liên quan khi lấy về"
 
-#: builtin/remote.c:158
+#: builtin/remote.c:164
 msgid "or do not fetch any tag at all (--no-tags)"
 msgstr "hoặc không lấy về bất kỳ thẻ nào (--no-tags)"
 
-#: builtin/remote.c:160
+#: builtin/remote.c:166
 msgid "branch(es) to track"
 msgstr "các nhánh để theo dõi"
 
-#: builtin/remote.c:161
+#: builtin/remote.c:167
 msgid "master branch"
 msgstr "nhánh master"
 
-#: builtin/remote.c:162
+#: builtin/remote.c:168
 msgid "push|fetch"
 msgstr "push|fetch"
 
-#: builtin/remote.c:163
+#: builtin/remote.c:169
 msgid "set up remote as a mirror to push to or fetch from"
 msgstr "đặt máy chủ (remote) như là một máy bản sao để push hay fetch từ đó"
 
-#: builtin/remote.c:175
+#: builtin/remote.c:181
 msgid "specifying a master branch makes no sense with --mirror"
 msgstr "đang chỉ định một nhánh master không hợp lý với tùy chọn --mirror"
 
-#: builtin/remote.c:177
+#: builtin/remote.c:183
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr "chỉ định những nhánh để theo dõi chỉ hợp lý với các “fetch mirror”"
 
-#: builtin/remote.c:187 builtin/remote.c:637
+#: builtin/remote.c:193 builtin/remote.c:643
 #, c-format
 msgid "remote %s already exists."
 msgstr "máy chủ %s đã tồn tại rồi."
 
-#: builtin/remote.c:191 builtin/remote.c:641
+#: builtin/remote.c:197 builtin/remote.c:647
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "“%s” không phải tên máy chủ hợp lệ"
 
-#: builtin/remote.c:235
+#: builtin/remote.c:241
 #, c-format
 msgid "Could not setup master '%s'"
 msgstr "Không thể cài đặt nhánh master “%s”"
 
-#: builtin/remote.c:335
+#: builtin/remote.c:341
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr "Không thể lấy ánh xạ (map) fetch cho đặc tả tham chiếu %s"
 
-#: builtin/remote.c:436 builtin/remote.c:444
+#: builtin/remote.c:442 builtin/remote.c:450
 msgid "(matching)"
 msgstr "(khớp)"
 
-#: builtin/remote.c:448
+#: builtin/remote.c:454
 msgid "(delete)"
 msgstr "(xóa)"
 
-#: builtin/remote.c:588 builtin/remote.c:594 builtin/remote.c:600
+#: builtin/remote.c:594 builtin/remote.c:600 builtin/remote.c:606
 #, c-format
 msgid "Could not append '%s' to '%s'"
 msgstr "Không thể nối thêm “%s” vào “%s”"
 
-#: builtin/remote.c:630 builtin/remote.c:769 builtin/remote.c:869
+#: builtin/remote.c:636 builtin/remote.c:775 builtin/remote.c:875
 #, c-format
 msgid "No such remote: %s"
 msgstr "Không có máy chủ nào như thế: %s"
 
-#: builtin/remote.c:647
+#: builtin/remote.c:653
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Không thể đổi tên phần của cấu hình từ “%s” thành “%s”"
 
-#: builtin/remote.c:653 builtin/remote.c:821
+#: builtin/remote.c:659 builtin/remote.c:827
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Không thể gỡ bỏ phần cấu hình “%s”"
 
-#: builtin/remote.c:668
+#: builtin/remote.c:674
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -9380,27 +9448,27 @@
 "\t%s\n"
 "\tXin hãy cập nhật phần cấu hình một cách thủ công nếu thấy cần thiết."
 
-#: builtin/remote.c:674
+#: builtin/remote.c:680
 #, c-format
 msgid "Could not append '%s'"
 msgstr "Không thể nối thêm “%s”"
 
-#: builtin/remote.c:685
+#: builtin/remote.c:691
 #, c-format
 msgid "Could not set '%s'"
 msgstr "Không thể đặt “%s”"
 
-#: builtin/remote.c:707
+#: builtin/remote.c:713
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "gặp lỗi khi xóa “%s”"
 
-#: builtin/remote.c:741
+#: builtin/remote.c:747
 #, c-format
 msgid "creating '%s' failed"
 msgstr "gặp lỗi khi tạo “%s”"
 
-#: builtin/remote.c:807
+#: builtin/remote.c:813
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -9412,259 +9480,272 @@
 "đi;\n"
 "để xóa đi, sử dụng:"
 
-#: builtin/remote.c:922
+#: builtin/remote.c:928
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " mới (lần lấy về tiếp theo sẽ lưu trong remotes/%s)"
 
-#: builtin/remote.c:925
+#: builtin/remote.c:931
 msgid " tracked"
 msgstr " được theo dõi"
 
-#: builtin/remote.c:927
+#: builtin/remote.c:933
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " cũ rích (dùng “git remote prune” để gỡ bỏ)"
 
-#: builtin/remote.c:929
+#: builtin/remote.c:935
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:976
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "branch.%s.merge không hợp lệ; không thể cải tổ về phía > 1 nhánh"
 
-#: builtin/remote.c:977
+#: builtin/remote.c:983
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "thực hiện rebase trên máy chủ %s"
 
-#: builtin/remote.c:980
+#: builtin/remote.c:986
 #, c-format
 msgid " merges with remote %s"
 msgstr " hòa trộn với máy chủ %s"
 
-#: builtin/remote.c:981
+#: builtin/remote.c:987
 msgid "    and with remote"
 msgstr "    và với máy chủ"
 
-#: builtin/remote.c:983
+#: builtin/remote.c:989
 #, c-format
 msgid "merges with remote %s"
 msgstr "hòa trộn với máy chủ %s"
 
-#: builtin/remote.c:984
+#: builtin/remote.c:990
 msgid "   and with remote"
 msgstr "   và với máy chủ"
 
-#: builtin/remote.c:1030
+#: builtin/remote.c:1036
 msgid "create"
 msgstr "tạo"
 
-#: builtin/remote.c:1033
+#: builtin/remote.c:1039
 msgid "delete"
 msgstr "xóa"
 
-#: builtin/remote.c:1037
+#: builtin/remote.c:1043
 msgid "up to date"
 msgstr "đã cập nhật"
 
-#: builtin/remote.c:1040
+#: builtin/remote.c:1046
 msgid "fast-forwardable"
 msgstr "có-thể-chuyển-tiếp-nhanh"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1049
 msgid "local out of date"
 msgstr "dữ liệu nội bộ đã cũ"
 
-#: builtin/remote.c:1050
+#: builtin/remote.c:1056
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s ép buộc thành %-*s (%s)"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1059
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s đẩy lên thành %-*s (%s)"
 
-#: builtin/remote.c:1057
+#: builtin/remote.c:1063
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s ép buộc thành %s"
 
-#: builtin/remote.c:1060
+#: builtin/remote.c:1066
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s đẩy lên thành %s"
 
-#: builtin/remote.c:1128
+#: builtin/remote.c:1134
 msgid "do not query remotes"
 msgstr "không truy vấn các máy chủ"
 
-#: builtin/remote.c:1155
+#: builtin/remote.c:1161
 #, c-format
 msgid "* remote %s"
 msgstr "* máy chủ %s"
 
-#: builtin/remote.c:1156
+#: builtin/remote.c:1162
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL để lấy về: %s"
 
-#: builtin/remote.c:1157 builtin/remote.c:1308
+#: builtin/remote.c:1163 builtin/remote.c:1314
 msgid "(no URL)"
 msgstr "(không có URL)"
 
-#: builtin/remote.c:1166 builtin/remote.c:1168
+#: builtin/remote.c:1172 builtin/remote.c:1174
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL để đẩy lên: %s"
 
-#: builtin/remote.c:1170 builtin/remote.c:1172 builtin/remote.c:1174
+#: builtin/remote.c:1176 builtin/remote.c:1178 builtin/remote.c:1180
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Nhánh HEAD: %s"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1182
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr "  nhánh HEAD (HEAD máy chủ chưa rõ ràng, có lẽ là một trong số sau):\n"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1194
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Những nhánh trên máy chủ:%s"
 
-#: builtin/remote.c:1191 builtin/remote.c:1218
+#: builtin/remote.c:1197 builtin/remote.c:1224
 msgid " (status not queried)"
 msgstr " (trạng thái không được yêu cầu)"
 
-#: builtin/remote.c:1200
+#: builtin/remote.c:1206
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Những nhánh nội bộ đã được cấu hình cho lệnh “git pull”:"
 
-#: builtin/remote.c:1208
+#: builtin/remote.c:1214
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  refs nội bộ sẽ được phản chiếu bởi lệnh “git push”"
 
-#: builtin/remote.c:1215
+#: builtin/remote.c:1221
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Những tham chiếu nội bộ được cấu hình cho lệnh “git push”%s:"
 
-#: builtin/remote.c:1236
+#: builtin/remote.c:1242
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "đặt refs/remotes/<tên>/HEAD cho phù hợp với máy chủ"
 
-#: builtin/remote.c:1238
+#: builtin/remote.c:1244
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "xóa refs/remotes/<tên>/HEAD"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1259
 msgid "Cannot determine remote HEAD"
 msgstr "Không thể xác định được HEAD máy chủ"
 
-#: builtin/remote.c:1255
+#: builtin/remote.c:1261
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "Nhiều nhánh HEAD máy chủ. Hãy chọn rõ ràng một:"
 
-#: builtin/remote.c:1265
+#: builtin/remote.c:1271
 #, c-format
 msgid "Could not delete %s"
 msgstr "Không thể xóa bỏ %s"
 
-#: builtin/remote.c:1273
+#: builtin/remote.c:1279
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Không phải là tham chiếu hợp lệ: %s"
 
-#: builtin/remote.c:1275
+#: builtin/remote.c:1281
 #, c-format
 msgid "Could not setup %s"
 msgstr "Không thể cài đặt %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1299
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s sẽ trở thành không đầu (không được quản lý)!"
 
-#: builtin/remote.c:1294
+#: builtin/remote.c:1300
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s đã trở thành không đầu (không được quản lý)!"
 
-#: builtin/remote.c:1304
+#: builtin/remote.c:1310
 #, c-format
 msgid "Pruning %s"
 msgstr "Đang xén bớt %s"
 
-#: builtin/remote.c:1305
+#: builtin/remote.c:1311
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1321
+#: builtin/remote.c:1327
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [nên xén bớt] %s"
 
-#: builtin/remote.c:1324
+#: builtin/remote.c:1330
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [đã bị xén] %s"
 
-#: builtin/remote.c:1369
+#: builtin/remote.c:1375
 msgid "prune remotes after fetching"
 msgstr "cắt máy chủ sau khi lấy về"
 
-#: builtin/remote.c:1435 builtin/remote.c:1509
+#: builtin/remote.c:1441 builtin/remote.c:1498 builtin/remote.c:1566
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Không có máy chủ nào có tên “%s”"
 
-#: builtin/remote.c:1455
+#: builtin/remote.c:1461
 msgid "add branch"
 msgstr "thêm nhánh"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1468
 msgid "no remote specified"
 msgstr "chưa chỉ ra máy chủ nào"
 
-#: builtin/remote.c:1484
+#: builtin/remote.c:1485
+msgid "query push URLs rather than fetch URLs"
+msgstr "truy vấn đẩy URL thay vì lấy"
+
+#: builtin/remote.c:1487
+msgid "return all URLs"
+msgstr "trả về mọi URL"
+
+#: builtin/remote.c:1515
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr "không có URL nào được cấu hình cho nhánh “%s”"
+
+#: builtin/remote.c:1541
 msgid "manipulate push URLs"
 msgstr "đẩy các “URL” bằng tay"
 
-#: builtin/remote.c:1486
+#: builtin/remote.c:1543
 msgid "add URL"
 msgstr "thêm URL"
 
-#: builtin/remote.c:1488
+#: builtin/remote.c:1545
 msgid "delete URLs"
 msgstr "xóa URLs"
 
-#: builtin/remote.c:1495
+#: builtin/remote.c:1552
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete không hợp lý"
 
-#: builtin/remote.c:1535
+#: builtin/remote.c:1592
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Kiểu mẫu URL cũ không hợp lệ: %s"
 
-#: builtin/remote.c:1543
+#: builtin/remote.c:1600
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Không tìm thấy URL như vậy: %s"
 
-#: builtin/remote.c:1545
+#: builtin/remote.c:1602
 msgid "Will not delete all non-push URLs"
 msgstr "Sẽ không xóa những địa chỉ URL không-push"
 
-#: builtin/remote.c:1559
+#: builtin/remote.c:1616
 msgid "be verbose; must be placed before a subcommand"
 msgstr "chi tiết; phải được đặt trước một lệnh-con"
 
@@ -9736,7 +9817,11 @@
 msgid "repack objects in packs marked with .keep"
 msgstr "đóng gói lại các đối tượng trong các gói đã đánh dấu bằng .keep"
 
-#: builtin/repack.c:378
+#: builtin/repack.c:197
+msgid "cannot delete packs in a precious-objects repo"
+msgstr "không thể xóa các gói trong một kho đối_tượng_vĩ_đại"
+
+#: builtin/repack.c:381
 #, c-format
 msgid "removing '%s' failed"
 msgstr "gặp lỗi khi xóa bỏ “%s”"
@@ -9832,7 +9917,7 @@
 msgstr ""
 "git rerere [clear | forget <đường dẫn>… | status | remaining | diff | gc]"
 
-#: builtin/rerere.c:57
+#: builtin/rerere.c:58
 msgid "register clean resolutions in index"
 msgstr "sổ ghi dọn sạch các phân giải trong bản mục lục"
 
@@ -9968,23 +10053,23 @@
 msgid "rev-list does not support display of notes"
 msgstr "rev-list không hỗ trợ hiển thị các ghi chú"
 
-#: builtin/rev-parse.c:361
+#: builtin/rev-parse.c:358
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<các-tùy-chọn>] -- [<các tham số>…]"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:363
 msgid "keep the `--` passed as an arg"
 msgstr "giữ lại “--” chuyển sang làm tham số"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:365
 msgid "stop parsing after the first non-option argument"
 msgstr "dừng phân tích sau đối số đầu tiên không có tùy chọn"
 
-#: builtin/rev-parse.c:371
+#: builtin/rev-parse.c:368
 msgid "output in stuck long form"
 msgstr "kết xuất trong định dạng gậy dài"
 
-#: builtin/rev-parse.c:502
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -10237,7 +10322,7 @@
 msgid "Linewrap output"
 msgstr "Ngắt dòng khi quá dài"
 
-#: builtin/show-branch.c:9
+#: builtin/show-branch.c:10
 msgid ""
 "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
 "\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
@@ -10249,71 +10334,71 @@
 "\t\t[--more=<n> | --list | --independent | --merge-base]\n"
 "\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <glob>)…]"
 
-#: builtin/show-branch.c:13
+#: builtin/show-branch.c:14
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<nền>]] [--list] [<ref>]"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:640
 msgid "show remote-tracking and local branches"
 msgstr "hiển thị các nhánh remote-tracking và nội bộ"
 
-#: builtin/show-branch.c:661
+#: builtin/show-branch.c:642
 msgid "show remote-tracking branches"
 msgstr "hiển thị các nhánh remote-tracking"
 
-#: builtin/show-branch.c:663
+#: builtin/show-branch.c:644
 msgid "color '*!+-' corresponding to the branch"
 msgstr "màu “*!+-” tương ứng với nhánh"
 
-#: builtin/show-branch.c:665
+#: builtin/show-branch.c:646
 msgid "show <n> more commits after the common ancestor"
 msgstr "hiển thị thêm <n> lần chuyển giao sau cha mẹ chung"
 
-#: builtin/show-branch.c:667
+#: builtin/show-branch.c:648
 msgid "synonym to more=-1"
 msgstr "đồng nghĩa với more=-1"
 
-#: builtin/show-branch.c:668
+#: builtin/show-branch.c:649
 msgid "suppress naming strings"
 msgstr "chặn các chuỗi đặt tên"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:651
 msgid "include the current branch"
 msgstr "bao gồm nhánh hiện hành"
 
-#: builtin/show-branch.c:672
+#: builtin/show-branch.c:653
 msgid "name commits with their object names"
 msgstr "đặt tên các lần chuyển giao bằng các tên của đối tượng của chúng"
 
-#: builtin/show-branch.c:674
+#: builtin/show-branch.c:655
 msgid "show possible merge bases"
 msgstr "hiển thị mọi cơ sở có thể dùng để hòa trộn"
 
-#: builtin/show-branch.c:676
+#: builtin/show-branch.c:657
 msgid "show refs unreachable from any other ref"
 msgstr "hiển thị các tham chiếu không thể được đọc bởi bất kỳ tham chiếu khác"
 
-#: builtin/show-branch.c:678
+#: builtin/show-branch.c:659
 msgid "show commits in topological order"
 msgstr "hiển thị các lần chuyển giao theo thứ tự tôpô"
 
-#: builtin/show-branch.c:681
+#: builtin/show-branch.c:662
 msgid "show only commits not on the first branch"
 msgstr "chỉ hiển thị các lần chuyển giao không nằm trên nhánh đầu tiên"
 
-#: builtin/show-branch.c:683
+#: builtin/show-branch.c:664
 msgid "show merges reachable from only one tip"
 msgstr "hiển thị các lần hòa trộn có thể đọc được chỉ từ một đầu mút"
 
-#: builtin/show-branch.c:685
+#: builtin/show-branch.c:666
 msgid "topologically sort, maintaining date order where possible"
 msgstr "sắp xếp hình thái học, bảo trì thứ tự ngày nếu có thể"
 
-#: builtin/show-branch.c:688
+#: builtin/show-branch.c:669
 msgid "<n>[,<base>]"
 msgstr "<n>[,<cơ_sở>]"
 
-#: builtin/show-branch.c:689
+#: builtin/show-branch.c:670
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "hiển thị <n> các mục “ref-log” gần nhất kể từ nền (base)"
 
@@ -10326,45 +10411,140 @@
 "hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<mẫu>…] "
 
 #: builtin/show-ref.c:11
-msgid "git show-ref --exclude-existing[=<pattern>] < <ref-list>"
-msgstr "git show-ref --exclude-existing[=<mẫu>] < <ref-list>"
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr "git show-ref --exclude-existing[=<mẫu>]"
 
-#: builtin/show-ref.c:170
+#: builtin/show-ref.c:165
 msgid "only show tags (can be combined with heads)"
 msgstr "chỉ hiển thị thẻ (có thể tổ hợp cùng với đầu)"
 
-#: builtin/show-ref.c:171
+#: builtin/show-ref.c:166
 msgid "only show heads (can be combined with tags)"
 msgstr "chỉ hiển thị đầu (có thể tổ hợp cùng với thẻ)"
 
-#: builtin/show-ref.c:172
+#: builtin/show-ref.c:167
 msgid "stricter reference checking, requires exact ref path"
 msgstr ""
 "việc kiểm tra tham chiếu chính xác, đòi hỏi chính xác đường dẫn tham chiếu"
 
-#: builtin/show-ref.c:175 builtin/show-ref.c:177
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "hiển thị tham chiếu HEAD, ngay cả khi nó đã được lọc ra"
 
-#: builtin/show-ref.c:179
+#: builtin/show-ref.c:174
 msgid "dereference tags into object IDs"
 msgstr "bãi bỏ tham chiếu các thẻ thành ra các ID đối tượng"
 
-#: builtin/show-ref.c:181
+#: builtin/show-ref.c:176
 msgid "only show SHA1 hash using <n> digits"
 msgstr "chỉ hiển thị mã băm SHA1 sử dụng <n> chữ số"
 
-#: builtin/show-ref.c:185
+#: builtin/show-ref.c:180
 msgid "do not print results to stdout (useful with --verify)"
 msgstr ""
 "không hiển thị kết quả ra đầu ra chuẩn (stdout) (chỉ hữu dụng với --verify)"
 
-#: builtin/show-ref.c:187
+#: builtin/show-ref.c:182
 msgid "show refs from stdin that aren't in local repository"
 msgstr ""
 "hiển thị các tham chiếu từ đầu vào tiêu chuẩn (stdin) cái mà không ở kho nội "
 "bộ"
 
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr "git stripspace [-s | --strip-comments]"
+
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr "git stripspace [-c | --comment-lines]"
+
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr "giữ và xóa bỏ mọi dòng bắt đầu bằng ký tự ghi chú"
+
+#: builtin/stripspace.c:38
+msgid "prepend comment character and blank to each line"
+msgstr "treo trước ký tự ghi chú và để trắng cho từng dòng"
+
+#: builtin/submodule--helper.c:79 builtin/submodule--helper.c:167
+msgid "alternative anchor for relative paths"
+msgstr "điểm neo thay thế cho các đường dẫn tương đối"
+
+#: builtin/submodule--helper.c:84
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper list [--prefix=<đường/dẫn>] [<đường/dẫn>…]"
+
+#: builtin/submodule--helper.c:114
+msgid "git submodule--helper name <path>"
+msgstr "git submodule--helper name <đường/dẫn>"
+
+#: builtin/submodule--helper.c:120
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr ""
+"Không tìm thấy ánh xạ (mapping) mô-đun-con trong .gitmodules cho đường dẫn "
+"“%s”"
+
+#: builtin/submodule--helper.c:170
+msgid "where the new submodule will be cloned to"
+msgstr "nhân bản mô-đun-con mới vào chỗ nào"
+
+#: builtin/submodule--helper.c:173
+msgid "name of the new submodule"
+msgstr "tên của mô-đun-con mới"
+
+#: builtin/submodule--helper.c:176
+msgid "url where to clone the submodule from"
+msgstr "url nơi mà nhân bản mô-đun-con từ đó"
+
+#: builtin/submodule--helper.c:182
+msgid "depth for shallow clones"
+msgstr "chiều sâu lịch sử khi tạo bản sao"
+
+#: builtin/submodule--helper.c:188
+msgid ""
+"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
+"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+msgstr ""
+"git submodule--helper clone [--prefix=<đường/dẫn>] [--quiet] [--reference "
+"<kho>] [--name <tên>] [--url <url>][--depth <đường/dẫn>] [--] [<đường/dẫn>…]"
+
+#: builtin/submodule--helper.c:202 builtin/submodule--helper.c:208
+#: builtin/submodule--helper.c:216
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "không thể tạo thư mục “%s”"
+
+#: builtin/submodule--helper.c:204
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr "Nhân bản “%s” vào đường dẫn mô-đun-con “%s” gặp lỗi"
+
+#: builtin/submodule--helper.c:227
+#, c-format
+msgid "cannot open file '%s'"
+msgstr "không thể mở tập tin “%s”"
+
+#: builtin/submodule--helper.c:232
+#, c-format
+msgid "could not close file %s"
+msgstr "không thể đóng tập tin %s"
+
+#: builtin/submodule--helper.c:247
+#, c-format
+msgid "could not get submodule directory for '%s'"
+msgstr "không thể lấy thư mục mô-đun-con cho “%s”"
+
+#: builtin/submodule--helper.c:273
+msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+msgstr ""
+"lỗi nghiêm trọng: lệnh con submodule--helper phải được gói với một lệnh con"
+
+#: builtin/submodule--helper.c:280
+#, c-format
+msgid "fatal: '%s' is not a valid submodule--helper subcommand"
+msgstr "lỗi nghiêm trọng: “%s” không phải là lệnh con submodule--helper hợp lệ"
+
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
 msgstr "git symbolic-ref [<các-tùy-chọn>] <tên> [<t.chiếu>]"
@@ -10393,7 +10573,7 @@
 msgid "reason of the update"
 msgstr "lý do cập nhật"
 
-#: builtin/tag.c:22
+#: builtin/tag.c:23
 msgid ""
 "git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
 "[<head>]"
@@ -10401,49 +10581,44 @@
 "git tag [-a | -s | -u <key-id>] [-f] [-m <msg>|-F <tập-tin>] <tên-thẻ> "
 "[<head>]"
 
-#: builtin/tag.c:23
+#: builtin/tag.c:24
 msgid "git tag -d <tagname>..."
 msgstr "git tag -d <tên-thẻ>…"
 
-#: builtin/tag.c:24
+#: builtin/tag.c:25
 msgid ""
 "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
-"\t\t[<pattern>...]"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
 "git tag -l [-n[<số>]] [--contains <lần_chuyển_giao>] [--points-at <đối-"
 "tượng>]\n"
-"\t\t[<mẫu>…]"
+"\t\t[--format=<định dạng>] [--[no-]merged [<lần_chuyển_giao>]] [<mẫu>…]"
 
-#: builtin/tag.c:26
+#: builtin/tag.c:27
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <tên-thẻ>…"
 
-#: builtin/tag.c:69
-#, c-format
-msgid "malformed object at '%s'"
-msgstr "đối tượng dị hình tại “%s”"
-
-#: builtin/tag.c:301
+#: builtin/tag.c:80
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "tên thẻ quá dài: %.*s…"
 
-#: builtin/tag.c:306
+#: builtin/tag.c:85
 #, c-format
 msgid "tag '%s' not found."
 msgstr "không tìm thấy tìm thấy thẻ “%s”."
 
-#: builtin/tag.c:321
+#: builtin/tag.c:100
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Thẻ đã bị xóa “%s” (từng là %s)\n"
 
-#: builtin/tag.c:333
+#: builtin/tag.c:112
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "không thể thẩm tra thẻ “%s”"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:122
 #, c-format
 msgid ""
 "\n"
@@ -10456,7 +10631,7 @@
 "  %s\n"
 "Những dòng được bắt đầu bằng “%c” sẽ được bỏ qua.\n"
 
-#: builtin/tag.c:347
+#: builtin/tag.c:126
 #, c-format
 msgid ""
 "\n"
@@ -10471,153 +10646,138 @@
 "Những dòng được bắt đầu bằng “%c” sẽ được giữ lại; bạn có thể xóa chúng đi "
 "nếu muốn.\n"
 
-#: builtin/tag.c:371
-#, c-format
-msgid "unsupported sort specification '%s'"
-msgstr "không hỗ trợ đặc tả sắp xếp “%s”"
-
-#: builtin/tag.c:373
-#, c-format
-msgid "unsupported sort specification '%s' in variable '%s'"
-msgstr "không hỗ trợ đặc tả sắp xếp “%s” trong biến “%s”"
-
-#: builtin/tag.c:428
+#: builtin/tag.c:199
 msgid "unable to sign the tag"
 msgstr "không thể ký thẻ"
 
-#: builtin/tag.c:430
+#: builtin/tag.c:201
 msgid "unable to write tag file"
 msgstr "không thể ghi vào tập tin lưu thẻ"
 
-#: builtin/tag.c:455
+#: builtin/tag.c:226
 msgid "bad object type."
 msgstr "kiểu đối tượng sai."
 
-#: builtin/tag.c:468
+#: builtin/tag.c:239
 msgid "tag header too big."
 msgstr "phần đầu thẻ quá lớn."
 
-#: builtin/tag.c:504
+#: builtin/tag.c:275
 msgid "no tag message?"
 msgstr "không có chú thích gì cho cho thẻ à?"
 
-#: builtin/tag.c:510
+#: builtin/tag.c:281
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Nội dung ghi chú còn lại %s\n"
 
-#: builtin/tag.c:559
-msgid "switch 'points-at' requires an object"
-msgstr "chuyển đến “points-at” yêu cần một đối tượng"
-
-#: builtin/tag.c:561
-#, c-format
-msgid "malformed object name '%s'"
-msgstr "tên đối tượng dị hình “%s”"
-
-#: builtin/tag.c:590
+#: builtin/tag.c:339
 msgid "list tag names"
 msgstr "chỉ liệt kê tên các thẻ"
 
-#: builtin/tag.c:592
+#: builtin/tag.c:341
 msgid "print <n> lines of each tag message"
 msgstr "hiển thị <n> dòng cho mỗi ghi chú"
 
-#: builtin/tag.c:594
+#: builtin/tag.c:343
 msgid "delete tags"
 msgstr "xóa thẻ"
 
-#: builtin/tag.c:595
+#: builtin/tag.c:344
 msgid "verify tags"
 msgstr "thẩm tra thẻ"
 
-#: builtin/tag.c:597
+#: builtin/tag.c:346
 msgid "Tag creation options"
 msgstr "Tùy chọn tạo thẻ"
 
-#: builtin/tag.c:599
+#: builtin/tag.c:348
 msgid "annotated tag, needs a message"
 msgstr "để chú giải cho thẻ, cần một lời ghi chú"
 
-#: builtin/tag.c:601
+#: builtin/tag.c:350
 msgid "tag message"
 msgstr "phần chú thích cho thẻ"
 
-#: builtin/tag.c:603
+#: builtin/tag.c:352
 msgid "annotated and GPG-signed tag"
 msgstr "thẻ chú giải và ký kiểu GPG"
 
-#: builtin/tag.c:607
+#: builtin/tag.c:356
 msgid "use another key to sign the tag"
 msgstr "dùng kháo khác để ký thẻ"
 
-#: builtin/tag.c:608
+#: builtin/tag.c:357
 msgid "replace the tag if exists"
 msgstr "thay thế nếu thẻ đó đã có trước"
 
-#: builtin/tag.c:609 builtin/update-ref.c:368
+#: builtin/tag.c:358 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "tạo một reflog"
 
-#: builtin/tag.c:611
+#: builtin/tag.c:360
 msgid "Tag listing options"
 msgstr "Các tùy chọn liệt kê thẻ"
 
-#: builtin/tag.c:612
+#: builtin/tag.c:361
 msgid "show tag list in columns"
 msgstr "hiển thị danh sách thẻ trong các cột"
 
-#: builtin/tag.c:614
-msgid "sort tags"
-msgstr "sắp xếp các thẻ"
-
-#: builtin/tag.c:619 builtin/tag.c:625
+#: builtin/tag.c:362 builtin/tag.c:363
 msgid "print only tags that contain the commit"
 msgstr "chỉ hiển thị những nhánh mà nó chứa lần chuyển giao"
 
-#: builtin/tag.c:631
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
+msgstr "chỉ hiển thị những thẻ mà nó được hòa trộn"
+
+#: builtin/tag.c:365
+msgid "print only tags that are not merged"
+msgstr "chỉ hiển thị những thẻ mà nó không được hòa trộn"
+
+#: builtin/tag.c:370
 msgid "print only tags of the object"
 msgstr "chỉ hiển thị các thẻ của đối tượng"
 
-#: builtin/tag.c:657
+#: builtin/tag.c:399
 msgid "--column and -n are incompatible"
 msgstr "--column và -n xung khắc nhau"
 
-#: builtin/tag.c:669
-msgid "--sort and -n are incompatible"
-msgstr "--sort và -n xung khắc nhau"
-
-#: builtin/tag.c:676
+#: builtin/tag.c:419
 msgid "-n option is only allowed with -l."
 msgstr "tùy chọn -n chỉ cho phép dùng với -l."
 
-#: builtin/tag.c:678
+#: builtin/tag.c:421
 msgid "--contains option is only allowed with -l."
 msgstr "tùy chọn --contains chỉ cho phép dùng với -l."
 
-#: builtin/tag.c:680
+#: builtin/tag.c:423
 msgid "--points-at option is only allowed with -l."
 msgstr "tùy chọn --points-at chỉ cho phép dùng với -l."
 
-#: builtin/tag.c:688
+#: builtin/tag.c:425
+msgid "--merged and --no-merged option are only allowed with -l"
+msgstr "tùy chọn --merged và --no-merged chỉ cho phép dùng với -l."
+
+#: builtin/tag.c:433
 msgid "only one -F or -m option is allowed."
 msgstr "chỉ có một tùy chọn -F hoặc -m là được phép."
 
-#: builtin/tag.c:708
+#: builtin/tag.c:453
 msgid "too many params"
 msgstr "quá nhiều đối số"
 
-#: builtin/tag.c:714
+#: builtin/tag.c:459
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "“%s” không phải thẻ hợp lệ."
 
-#: builtin/tag.c:719
+#: builtin/tag.c:464
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "Thẻ “%s” đã tồn tại rồi"
 
-#: builtin/tag.c:744
+#: builtin/tag.c:489
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Đã cập nhật thẻ “%s” (trước là %s)\n"
@@ -10882,76 +11042,80 @@
 msgid "print tag contents"
 msgstr "hiển thị nội dung của thẻ"
 
-#: builtin/worktree.c:13
-msgid "git worktree add [<options>] <path> <branch>"
-msgstr "git worktree add [<các-tùy-chọn>] <đường-dẫn> <nhánh>"
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr "git worktree add [<các-tùy-chọn>] <đường-dẫn> [<nhánh>]"
 
-#: builtin/worktree.c:14
+#: builtin/worktree.c:16
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<các-tùy-chọn>]"
 
-#: builtin/worktree.c:36
+#: builtin/worktree.c:17
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<các-tùy-chọn>]"
+
+#: builtin/worktree.c:39
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Gỡ bỏ cây làm việc/%s: không phải là thư mục hợp lệ"
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:45
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Gỡ bỏ cây làm việc/%s: không có tập tin gitdir"
 
-#: builtin/worktree.c:47
+#: builtin/worktree.c:50
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "Gỡ bỏ cây làm việc/%s: không thể đọc tập tin gitdir (%s)"
 
-#: builtin/worktree.c:58
+#: builtin/worktree.c:61
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Gỡ bỏ cây làm việc/%s: tập tin gitdir không hợp lệ"
 
-#: builtin/worktree.c:74
+#: builtin/worktree.c:77
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "Gỡ bỏ cây làm việc/%s: tập tin gitdir chỉ đến vị trí không tồn tại"
 
-#: builtin/worktree.c:109
+#: builtin/worktree.c:112
 #, c-format
 msgid "failed to remove: %s"
 msgstr "gặp lỗi khi gỡ bỏ: %s"
 
-#: builtin/worktree.c:198
+#: builtin/worktree.c:201
 #, c-format
 msgid "'%s' already exists"
 msgstr "“%s” đã có từ trước rồi"
 
-#: builtin/worktree.c:232
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "không thể tạo thư mục của “%s”"
 
-#: builtin/worktree.c:268
+#: builtin/worktree.c:271
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Đang chuẩn bị %s (định danh %s)"
 
-#: builtin/worktree.c:316
+#: builtin/worktree.c:319
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr "lấy ra <nhánh> ngay cả khi nó đã được lấy ra ở cây làm việc khác"
 
-#: builtin/worktree.c:318
+#: builtin/worktree.c:321
 msgid "create a new branch"
 msgstr "tạo nhánh mới"
 
-#: builtin/worktree.c:320
+#: builtin/worktree.c:323
 msgid "create or reset a branch"
 msgstr "tạo hay đặt lại một nhánh"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:324
 msgid "detach HEAD at named commit"
 msgstr "rời bỏ HEAD tại lần chuyển giao theo tên"
 
-#: builtin/worktree.c:328
+#: builtin/worktree.c:331
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "Các tùy chọn -b, -B, và --detach loại từ lẫn nhau"
 
@@ -11100,48 +11264,48 @@
 msgid "no-op (backward compatibility)"
 msgstr "no-op (tương thích ngược)"
 
-#: parse-options.h:236
+#: parse-options.h:237
 msgid "be more verbose"
 msgstr "chi tiết hơn nữa"
 
-#: parse-options.h:238
+#: parse-options.h:239
 msgid "be more quiet"
 msgstr "im lặng hơn nữa"
 
-#: parse-options.h:244
+#: parse-options.h:245
 msgid "use <n> digits to display SHA-1s"
 msgstr "sử dụng <n> chữ số để hiển thị SHA-1s"
 
-#: rerere.h:28
+#: rerere.h:38
 msgid "update the index with reused conflict resolution if possible"
 msgstr "cập nhật bảng mục lục với phân giải xung đột dùng lại nếu được"
 
-#: git-bisect.sh:50
+#: git-bisect.sh:55
 msgid "You need to start by \"git bisect start\""
 msgstr "Bạn cần khởi đầu bằng \"git bisect start\""
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:56
+#: git-bisect.sh:61
 msgid "Do you want me to do it for you [Y/n]? "
 msgstr "Bạn có muốn tôi thực hiện điều này cho bạn không [Y/n]? "
 
-#: git-bisect.sh:99
+#: git-bisect.sh:122
 #, sh-format
 msgid "unrecognised option: '$arg'"
 msgstr "không công nhận tùy chọn: “$arg”"
 
-#: git-bisect.sh:103
+#: git-bisect.sh:126
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr "”$arg” không có vẻ như là một điểm xét duyệt hợp lệ"
 
-#: git-bisect.sh:132
+#: git-bisect.sh:155
 msgid "Bad HEAD - I need a HEAD"
 msgstr "HEAD sai - Tôi cần một HEAD"
 
-#: git-bisect.sh:145
+#: git-bisect.sh:168
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
@@ -11149,39 +11313,39 @@
 "Việc lấy “$start_head” ra gặp lỗi. Hãy thử \"git bisect reset <nhánh_hợp_lệ>"
 "\"."
 
-#: git-bisect.sh:155
+#: git-bisect.sh:178
 msgid "won't bisect on cg-seek'ed tree"
 msgstr "sẽ không di chuyển nửa bước trên cây được cg-seek"
 
-#: git-bisect.sh:159
+#: git-bisect.sh:182
 msgid "Bad HEAD - strange symbolic ref"
 msgstr "HEAD sai - tham chiếu mềm kỳ lạ"
 
-#: git-bisect.sh:211
+#: git-bisect.sh:234
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr "Đối số bisect_write sai: $state"
 
-#: git-bisect.sh:240
+#: git-bisect.sh:263
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr "Đầu vào rev sai: $arg"
 
-#: git-bisect.sh:255
+#: git-bisect.sh:278
 msgid "Please call 'bisect_state' with at least one argument."
 msgstr "Hãy gọi lệnhl “bisect_state” với ít nhất một đối số."
 
-#: git-bisect.sh:267
+#: git-bisect.sh:290
 #, sh-format
 msgid "Bad rev input: $rev"
 msgstr "Đầu vào rev sai: $rev"
 
-#: git-bisect.sh:276
+#: git-bisect.sh:299
 #, sh-format
 msgid "'git bisect $TERM_BAD' can take only one argument."
 msgstr "“git bisect $TERM_BAD” có thể lấy chỉ một đối số."
 
-#: git-bisect.sh:299
+#: git-bisect.sh:322
 #, sh-format
 msgid "Warning: bisecting only with a $TERM_BAD commit."
 msgstr "Cảnh báo: chỉ thực hiện việc bisect với một lần chuyển giao $TERM_BAD."
@@ -11189,11 +11353,11 @@
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:305
+#: git-bisect.sh:328
 msgid "Are you sure [Y/n]? "
 msgstr "Bạn có chắc chắn chưa [Y/n]? "
 
-#: git-bisect.sh:317
+#: git-bisect.sh:340
 #, sh-format
 msgid ""
 "You need to give me at least one $bad_syn and one $good_syn revision.\n"
@@ -11203,7 +11367,7 @@
 "(Bạn có thể sử dụng \"git bisect $bad_syn\" và \"git bisect $good_syn\" cho "
 "cái đó.)"
 
-#: git-bisect.sh:320
+#: git-bisect.sh:343
 #, sh-format
 msgid ""
 "You need to start by \"git bisect start\".\n"
@@ -11216,16 +11380,16 @@
 "(Bạn có thể sử dụng \"git bisect $bad_syn\" và \"git bisect $good_syn\" cho "
 "chúng.)"
 
-#: git-bisect.sh:391 git-bisect.sh:521
+#: git-bisect.sh:414 git-bisect.sh:546
 msgid "We are not bisecting."
 msgstr "Chúng tôi không bisect."
 
-#: git-bisect.sh:398
+#: git-bisect.sh:421
 #, sh-format
 msgid "'$invalid' is not a valid commit"
 msgstr "”$invalid” không phải là lần chuyển giao hợp lệ"
 
-#: git-bisect.sh:407
+#: git-bisect.sh:430
 #, sh-format
 msgid ""
 "Could not check out original HEAD '$branch'.\n"
@@ -11234,25 +11398,25 @@
 "Không thể check-out HEAD nguyên thủy của “$branch”.\n"
 "Hãy thử “git bisect reset <lần-chuyển-giao>”."
 
-#: git-bisect.sh:435
+#: git-bisect.sh:458
 msgid "No logfile given"
 msgstr "Chưa chỉ ra tập tin ghi nhật ký"
 
-#: git-bisect.sh:436
+#: git-bisect.sh:459
 #, sh-format
 msgid "cannot read $file for replaying"
 msgstr "không thể đọc $file để thao diễn lại"
 
-#: git-bisect.sh:455
+#: git-bisect.sh:480
 msgid "?? what are you talking about?"
 msgstr "?? bạn đang nói gì thế?"
 
-#: git-bisect.sh:467
+#: git-bisect.sh:492
 #, sh-format
 msgid "running $command"
 msgstr "đang chạy lệnh $command"
 
-#: git-bisect.sh:474
+#: git-bisect.sh:499
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -11261,11 +11425,11 @@
 "chạy bisect gặp lỗi:\n"
 "mã trả về $res từ lệnh “$command” là < 0 hoặc >= 128"
 
-#: git-bisect.sh:500
+#: git-bisect.sh:525
 msgid "bisect run cannot continue any more"
 msgstr "bisect không thể tiếp tục thêm được nữa"
 
-#: git-bisect.sh:506
+#: git-bisect.sh:531
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -11274,15 +11438,47 @@
 "chạy bisect gặp lỗi:\n"
 "”bisect_state $state” đã thoát ra với mã lỗi $res"
 
-#: git-bisect.sh:513
+#: git-bisect.sh:538
 msgid "bisect run success"
 msgstr "bisect chạy thành công"
 
-#: git-bisect.sh:548
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr "vui lòng dùng hai thời kỳ khác nhau"
+
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr "“$term” không phải là thời kỳ hợp lệ"
+
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr "không thể dùng lệnh tích hợp “$term” như là một thời kỳ"
+
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr "không thể thay đổi nghĩa của thời kỳ “$term”"
+
+#: git-bisect.sh:606
 #, sh-format
 msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
 msgstr "Lệnh không hợp lệ: bạn hiện đang ở bisect $TERM_BAD/$TERM_GOOD."
 
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "chưa định nghĩa thời kỳ nào"
+
+#: git-bisect.sh:653
+#, sh-format
+msgid ""
+"invalid argument $arg for 'git bisect terms'.\n"
+"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+msgstr ""
+"tham số không hợp lệ $arg cho “git bisect terms”.\n"
+"Các tùy chọn hỗ trợ là: --term-good|--term-old và --term-bad|--term-new."
+
 #: git-rebase.sh:57
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
@@ -11326,25 +11522,25 @@
 "Hình như đang trong quá trình thực hiện lệnh git-am. Không thể chạy lệnh "
 "rebase."
 
-#: git-rebase.sh:351
+#: git-rebase.sh:354
 msgid "The --exec option must be used with the --interactive option"
 msgstr "Tùy chọn --exec phải được sử dụng cùng với tùy chọn --interactive"
 
-#: git-rebase.sh:356
+#: git-rebase.sh:359
 msgid "No rebase in progress?"
 msgstr "Không có tiến trình rebase nào phải không?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:370
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "Hành động “--edit-todo” chỉ có thể dùng trong quá trình “rebase” (sửa lịch "
 "sử) tương tác."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:377
 msgid "Cannot read HEAD"
 msgstr "Không thể đọc HEAD"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:380
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -11352,12 +11548,12 @@
 "Bạn phải sửa tất cả các lần hòa trộn xung đột và sau\n"
 "đó đánh dấu chúng là cần xử lý sử dụng lệnh git add"
 
-#: git-rebase.sh:395
+#: git-rebase.sh:398
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Không thể quay trở lại $head_name"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:417
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11369,75 +11565,73 @@
 "and run me again.  I am stopping in case you still have something\n"
 "valuable there."
 msgstr ""
-"Hình như là ở đây sẵn có một thư mục $state_dir_base directory, và\n"
+"Hình như là ở đây sẵn có một thư mục $state_dir_base, và\n"
 "Tôi tự hỏi có phải bạn đang ở giữa một lệnh rebase khác. Nếu đúng là\n"
 "như vậy, xin hãy thử\n"
 "\t$cmd_live_rebase\n"
 "Nếu không phải thế, hãy thử\n"
 "\t$cmd_clear_stale_rebase\n"
-"và chạy TÔI lần nữa.  TÔI  dừng lại trong trường hợp bạn vẫn\n"
-"có một số thứ quý giá ở đây.\n"
-"\n"
-"TÔI: là lệnh bạn vừa gọi!"
+"và chạy TÔI lần nữa. TÔI  dừng lại trong trường hợp bạn vẫn\n"
+"có một số thứ quý giá ở đây."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:468
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "thượng nguồn không hợp lệ $upstream_name"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:492
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: ở đây có nhiều hơn một nền móng hòa trộn"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:495 git-rebase.sh:499
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: ở đây không có nền móng hòa trộn nào"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:504
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Không chỉ đến một lần chuyển giao không hợp lệ: $onto_name"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:527
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "nghiêm trọng: không có nhánh như thế: $branch_name"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:560
 msgid "Cannot autostash"
 msgstr "Không thể autostash"
 
-#: git-rebase.sh:562
+#: git-rebase.sh:565
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Đã tạo autostash: $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:569
 msgid "Please commit or stash them."
-msgstr "Xin hãy commit hoặc tạm cất (stash) chúng."
+msgstr "Xin hãy chuyển giao hoặc tạm cất (stash) chúng."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:589
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Nhánh hiện tại $branch_name đã được cập nhật rồi."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:593
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "Nhánh hiện tại $branch_name đã được cập nhật rồi, lệnh rebase ép buộc."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:604
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Thay đổi từ $mb thành $onto:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:613
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr "Trước tiên, di chuyển head để xem lại các công việc trên đỉnh của nó…"
 
-#: git-rebase.sh:620
+#: git-rebase.sh:623
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "Chuyển-tiếp-nhanh $branch_name thành $onto_name."
@@ -11512,118 +11706,100 @@
 msgid "Cannot remove worktree changes"
 msgstr "Không thể gỡ bỏ các thay đổi cây-làm-việc"
 
-#: git-stash.sh:387
+#: git-stash.sh:405
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "không hiểu tùy chọn: $opt"
 
-#: git-stash.sh:397
+#: git-stash.sh:415
 msgid "No stash found."
 msgstr "Không tìm thấy lần chuyển giao cất đi (stash) nào."
 
-#: git-stash.sh:404
+#: git-stash.sh:422
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Chỉ ra quá nhiều điểm xét duyệt: $REV"
 
-#: git-stash.sh:410
+#: git-stash.sh:428
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference không phải là tham chiếu hợp lệ"
 
-#: git-stash.sh:438
+#: git-stash.sh:456
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "“$args” không phải là lần chuyển giao kiểu-stash (cất đi)"
 
-#: git-stash.sh:449
+#: git-stash.sh:467
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "”$args” không phải tham chiếu đến stash"
 
-#: git-stash.sh:457
+#: git-stash.sh:475
 msgid "unable to refresh index"
 msgstr "không thể làm tươi mới bảng mục lục"
 
-#: git-stash.sh:461
+#: git-stash.sh:479
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Không thể áp dụng một stash ở giữa của quá trình hòa trộn"
 
-#: git-stash.sh:469
+#: git-stash.sh:487
 msgid "Conflicts in index. Try without --index."
 msgstr "Xung đột trong bảng mục lục. Hãy thử mà không dùng tùy chọn --index."
 
-#: git-stash.sh:471
+#: git-stash.sh:489
 msgid "Could not save index tree"
 msgstr "Không thể ghi lại cây chỉ mục"
 
-#: git-stash.sh:505
+#: git-stash.sh:523
 msgid "Cannot unstage modified files"
 msgstr "Không thể bỏ ra khỏi bệ phóng các tập tin đã được sửa chữa"
 
-#: git-stash.sh:520
+#: git-stash.sh:538
 msgid "Index was not unstashed."
 msgstr "Bảng mục lục đã không được bỏ stash."
 
-#: git-stash.sh:543
+#: git-stash.sh:561
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Đã xóa ${REV} ($s)"
 
-#: git-stash.sh:544
+#: git-stash.sh:562
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Không thể xóa bỏ mục stash"
 
-#: git-stash.sh:552
+#: git-stash.sh:570
 msgid "No branch name specified"
 msgstr "Chưa chỉ ra tên của nhánh"
 
-#: git-stash.sh:624
+#: git-stash.sh:642
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Để phục hồi lại chúng hãy gõ \"git stash apply\")"
 
-#: git-submodule.sh:95
+#: git-submodule.sh:104
 #, sh-format
 msgid "cannot strip one component off url '$remoteurl'"
 msgstr "không thể tháo bỏ một thành phần ra khỏi “$remoteurl” url"
 
-#: git-submodule.sh:237
-#, sh-format
-msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
-msgstr ""
-"Không tìm thấy ánh xạ (mapping) mô-đun-con trong .gitmodules cho đường dẫn "
-"“$sm_path”"
-
-#: git-submodule.sh:287
-#, sh-format
-msgid "Clone of '$url' into submodule path '$sm_path' failed"
-msgstr "Nhân bản “$url” vào đường dẫn mô-đun-con “$sm_path” gặp lỗi"
-
-#: git-submodule.sh:296
-#, sh-format
-msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-msgstr ""
-"Gitdir “$a” là bộ phận của đường dẫn mô-đun-con “$b” hoặc \"vice versa\""
-
-#: git-submodule.sh:406
+#: git-submodule.sh:281
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 "Đường dẫn tương đối chỉ có thể dùng từ thư mục ở mức cao nhất của cây làm "
 "việc"
 
-#: git-submodule.sh:416
+#: git-submodule.sh:291
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr ""
 "repo URL: “$repo” phải là đường dẫn tuyệt đối hoặc là bắt đầu bằng ./|../"
 
-#: git-submodule.sh:433
+#: git-submodule.sh:308
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "”$sm_path” thực sự đã tồn tại ở bảng mục lục rồi"
 
-#: git-submodule.sh:437
+#: git-submodule.sh:312
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -11635,36 +11811,36 @@
 "$sm_path\n"
 "Sử dụng -f nếu bạn thực sự muốn thêm nó vào."
 
-#: git-submodule.sh:455
+#: git-submodule.sh:330
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Đang thêm repo có sẵn tại “$sm_path” vào bảng mục lục"
 
-#: git-submodule.sh:457
+#: git-submodule.sh:332
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "”$sm_path” đã tồn tại từ trước và không phải là một kho git hợp lệ"
 
-#: git-submodule.sh:465
+#: git-submodule.sh:340
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 "Thư mục git cho “$sm_name” được tìm thấy một cách cục bộ với các máy chủ:"
 
-#: git-submodule.sh:467
+#: git-submodule.sh:342
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
 msgstr "Nếu bạn muốn dùng lại thư mục git nội bộ này thay vì nhân bản từ nó"
 
-#: git-submodule.sh:469
+#: git-submodule.sh:344
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
 msgstr ""
 "dùng tùy chọn “--force”. Nếu thư mục git nội bộ không phải là repo (kho) đúng"
 
-#: git-submodule.sh:470
+#: git-submodule.sh:345
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -11673,71 +11849,71 @@
 "hay bạn không chắc chắn điều đó có nghĩa gì chọn tên khác với tùy chọn “--"
 "name”."
 
-#: git-submodule.sh:472
+#: git-submodule.sh:347
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr ""
 "Phục hồi sự hoạt động của thư mục git nội bộ cho mô-đun-con “$sm_name”."
 
-#: git-submodule.sh:484
+#: git-submodule.sh:359
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Không thể lấy ra mô-đun-con “$sm_path”"
 
-#: git-submodule.sh:489
+#: git-submodule.sh:364
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Gặp lỗi khi thêm mô-đun-con “$sm_path”"
 
-#: git-submodule.sh:498
+#: git-submodule.sh:373
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Gặp lỗi khi đăng ký với hệ thống mô-đun-con “$sm_path”"
 
-#: git-submodule.sh:542
+#: git-submodule.sh:417
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Đang vào “$prefix$displaypath”"
 
-#: git-submodule.sh:562
+#: git-submodule.sh:437
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr ""
 "Dừng lại tại “$prefix$displaypath”; script trả về trạng thái khác không."
 
-#: git-submodule.sh:608
+#: git-submodule.sh:483
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr ""
 "Không tìm thấy url cho đường dẫn mô-đun-con “$displaypath” trong .gitmodules"
 
-#: git-submodule.sh:617
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr "Gặp lỗi khi đăng ký url cho đường dẫn mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:619
+#: git-submodule.sh:494
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr "Mô-đun-con “$name” ($url) được đăng ký cho đường dẫn “$displaypath”"
 
-#: git-submodule.sh:636
+#: git-submodule.sh:511
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr ""
 "Gặp lỗi khi đăng ký chế độ cập nhật cho đường dẫn mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:674
+#: git-submodule.sh:549
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr "Dùng “.” nếu bạn thực sự muốn gỡ bỏ mọi mô-đun-con"
 
-#: git-submodule.sh:691
+#: git-submodule.sh:566
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr "Cây làm việc mô-đun-con “$displaypath” có chứa thư mục .git"
 
-#: git-submodule.sh:692
+#: git-submodule.sh:567
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -11745,7 +11921,7 @@
 "(dùng “rm -rf” nếu bạn thực sự muốn gỡ bỏ nó cùng với tất cả lịch sử của "
 "chúng)"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:573
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -11754,27 +11930,27 @@
 "Cây làm việc mô-đun-con “$displaypath” chứa các thay đổi nội bộ; hãy dùng “-"
 "f” để loại bỏ chúng đi"
 
-#: git-submodule.sh:701
+#: git-submodule.sh:576
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Đã tạo thư mục “$displaypath”"
 
-#: git-submodule.sh:702
+#: git-submodule.sh:577
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "Không thể gỡ bỏ cây làm việc mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:705
+#: git-submodule.sh:580
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "Không thể tạo thư mục mô-đun-con rỗng “$displaypath”"
 
-#: git-submodule.sh:714
+#: git-submodule.sh:589
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "Mô-đun-con “$name” ($url) được bỏ đăng ký cho đường dẫn “$displaypath”"
 
-#: git-submodule.sh:830
+#: git-submodule.sh:705
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -11783,55 +11959,55 @@
 "Đường dẫn mô-đun-con “$displaypath” chưa được khởi tạo.\n"
 "Có lẽ bạn muốn sử dụng lệnh “update --init”?"
 
-#: git-submodule.sh:843
+#: git-submodule.sh:718
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr ""
 "Không tìm thấy điểm xét duyệt hiện hành trong đường dẫn mô-đun-con "
 "“$displaypath”"
 
-#: git-submodule.sh:852
+#: git-submodule.sh:727
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Không thể lấy về trong đường dẫn mô-đun-con “$sm_path”"
 
-#: git-submodule.sh:876
+#: git-submodule.sh:751
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Không thể lấy về trong đường dẫn mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:765
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Không thể lấy ra “$sha1” trong đường dẫn mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:891
+#: git-submodule.sh:766
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Đường dẫn mô-đun-con “$displaypath”: đã checkout “$sha1”"
 
-#: git-submodule.sh:895
+#: git-submodule.sh:770
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "Không thể cải tổ “$sha1” trong đường dẫn mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:896
+#: git-submodule.sh:771
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Đường dẫn mô-đun-con “$displaypath”: được rebase vào trong “$sha1”"
 
-#: git-submodule.sh:901
+#: git-submodule.sh:776
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr ""
 "Không thể hòa trộn (merge) “$sha1” trong đường dẫn mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:902
+#: git-submodule.sh:777
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Đường dẫn mô-đun-con “$displaypath”: được hòa trộn vào “$sha1”"
 
-#: git-submodule.sh:907
+#: git-submodule.sh:782
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
@@ -11839,56 +12015,105 @@
 "Thực hiện không thành công lệnh “$command $sha1” trong đường dẫn mô-đun-con "
 "“$prefix$sm_path”"
 
-#: git-submodule.sh:908
+#: git-submodule.sh:783
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "Đường dẫn mô-đun-con “$prefix$sm_path”: “$command $sha1”"
 
-#: git-submodule.sh:938
+#: git-submodule.sh:813
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Gặp lỗi khi đệ quy vào trong đường dẫn mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:1046
+#: git-submodule.sh:921
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Tùy chọn --cached không thể dùng cùng với tùy chọn --files"
 
-#: git-submodule.sh:1098
+#: git-submodule.sh:973
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "chế độ không như mong chờ $mod_dst"
 
-#: git-submodule.sh:1118
+#: git-submodule.sh:993
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Cảnh báo: $display_name không chứa lần chuyển giao $sha1_src"
 
-#: git-submodule.sh:1121
+#: git-submodule.sh:996
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Cảnh báo: $display_name không chứa lần chuyển giao $sha1_dst"
 
-#: git-submodule.sh:1124
+#: git-submodule.sh:999
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 "  Cảnh báo: $display_name không chứa những lần chuyển giao $sha1_src và "
 "$sha1_dst"
 
-#: git-submodule.sh:1149
+#: git-submodule.sh:1024
 msgid "blob"
 msgstr "blob"
 
-#: git-submodule.sh:1267
+#: git-submodule.sh:1142
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Gặp lỗi khi đệ quy vào trong đường dẫn mô-đun-con “$sm_path”"
 
-#: git-submodule.sh:1331
+#: git-submodule.sh:1206
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 
+#~ msgid "branch '%s' does not point at a commit"
+#~ msgstr "nhánh “%s” không chỉ đến một lần chuyển giao nào cả"
+
+#~ msgid "object '%s' does not point to a commit"
+#~ msgstr "đối tượng “%s” không chỉ đến một lần chuyển giao nào cả"
+
+#~ msgid "some refs could not be read"
+#~ msgstr "một số tham chiếu đã không thể đọc được"
+
+#~ msgid "print only merged branches"
+#~ msgstr "chỉ hiển thị các nhánh đã hòa trộn"
+
+#~ msgid "--dissociate given, but there is no --reference"
+#~ msgstr "đã đưa ra --dissociate, nhưng ở đây lại không có --reference"
+
+#~ msgid "show usage"
+#~ msgstr "hiển thị cách dùng"
+
+#~ msgid "insanely long template name %s"
+#~ msgstr "tên mẫu dài một cách điên rồ %s"
+
+#~ msgid "insanely long symlink %s"
+#~ msgstr "liên kết mềm dài một cách điên rồ %s"
+
+#~ msgid "insanely long template path %s"
+#~ msgstr "đường dẫn mẫu “%s” dài một cách điên rồ"
+
+#~ msgid "insane git directory %s"
+#~ msgstr "thư mục git điên rồ %s"
+
+#~ msgid "unsupported sort specification '%s'"
+#~ msgstr "không hỗ trợ đặc tả sắp xếp “%s”"
+
+#~ msgid "unsupported sort specification '%s' in variable '%s'"
+#~ msgstr "không hỗ trợ đặc tả sắp xếp “%s” trong biến “%s”"
+
+#~ msgid "switch 'points-at' requires an object"
+#~ msgstr "chuyển đến “points-at” yêu cần một đối tượng"
+
+#~ msgid "sort tags"
+#~ msgstr "sắp xếp các thẻ"
+
+#~ msgid "--sort and -n are incompatible"
+#~ msgstr "--sort và -n xung khắc nhau"
+
+#~ msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
+#~ msgstr ""
+#~ "Gitdir “$a” là bộ phận của đường dẫn mô-đun-con “$b” hoặc \"vice versa\""
+
 #~ msgid "false|true|preserve"
 #~ msgstr "false|true|preserve"
 
diff --git a/po/zh_CN.po b/po/zh_CN.po
index fcdaa7e..c7fed46 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -87,6 +87,7 @@
 #   pickaxe                          |  挖掘
 #   plumbing                         |  管件(Git 底层核心命令的别称)
 #   porcelain                        |  瓷件(Git 上层封装命令的别称)
+#   precious-objects repo            |  珍品仓库
 #   prune                            |  清除
 #   pull                             |  拉,拉取
 #   push                             |  推,推送
@@ -134,8 +135,8 @@
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2015-09-15 06:45+0800\n"
-"PO-Revision-Date: 2015-09-15 21:49+0800\n"
+"POT-Creation-Date: 2015-12-22 22:50+0800\n"
+"PO-Revision-Date: 2015-12-22 23:06+0800\n"
 "Last-Translator: Jiang Xin <worldhello.net@gmail.com>\n"
 "Language-Team: GitHub <https://github.com/jiangxin/git/>\n"
 "Language: zh_CN\n"
@@ -157,12 +158,12 @@
 "请在工作区改正文件,然后酌情使用 'git add/rm <文件>' 命令标记\n"
 "解决方案并提交。"
 
-#: advice.c:101 builtin/merge.c:1227
+#: advice.c:101 builtin/merge.c:1225
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "您尚未结束您的合并(存在 MERGE_HEAD)。"
 
 #: advice.c:103
-msgid "Please, commit your changes before you can merge."
+msgid "Please, commit your changes before merging."
 msgstr "请在合并前先提交您的修改。"
 
 #: advice.c:104
@@ -187,76 +188,76 @@
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <仓库> [--exec <命令>] --list"
 
-#: archive.c:343 builtin/add.c:137 builtin/add.c:426 builtin/rm.c:327
+#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "路径规格 '%s' 未匹配任何文件"
 
-#: archive.c:428
+#: archive.c:429
 msgid "fmt"
 msgstr "格式"
 
-#: archive.c:428
+#: archive.c:429
 msgid "archive format"
 msgstr "归档格式"
 
-#: archive.c:429 builtin/log.c:1229
+#: archive.c:430 builtin/log.c:1229
 msgid "prefix"
 msgstr "前缀"
 
-#: archive.c:430
+#: archive.c:431
 msgid "prepend prefix to each pathname in the archive"
 msgstr "为归档中每个路径名加上前缀"
 
-#: archive.c:431 builtin/archive.c:88 builtin/blame.c:2516
-#: builtin/blame.c:2517 builtin/config.c:58 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:712 builtin/hash-object.c:99
+#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535
+#: builtin/blame.c:2536 builtin/config.c:58 builtin/fast-export.c:987
+#: builtin/fast-export.c:989 builtin/grep.c:707 builtin/hash-object.c:99
 #: builtin/ls-files.c:446 builtin/ls-files.c:449 builtin/notes.c:395
 #: builtin/notes.c:558 builtin/read-tree.c:109 parse-options.h:153
 msgid "file"
 msgstr "文件"
 
-#: archive.c:432 builtin/archive.c:89
+#: archive.c:433 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "归档写入此文件"
 
-#: archive.c:434
+#: archive.c:435
 msgid "read .gitattributes in working directory"
 msgstr "读取工作区中的 .gitattributes"
 
-#: archive.c:435
+#: archive.c:436
 msgid "report archived files on stderr"
 msgstr "在标准错误上报告归档文件"
 
-#: archive.c:436
+#: archive.c:437
 msgid "store only"
 msgstr "只存储"
 
-#: archive.c:437
+#: archive.c:438
 msgid "compress faster"
 msgstr "压缩速度更快"
 
-#: archive.c:445
+#: archive.c:446
 msgid "compress better"
 msgstr "压缩效果更好"
 
-#: archive.c:448
+#: archive.c:449
 msgid "list supported archive formats"
 msgstr "列出支持的归档格式"
 
-#: archive.c:450 builtin/archive.c:90 builtin/clone.c:77
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77
 msgid "repo"
 msgstr "仓库"
 
-#: archive.c:451 builtin/archive.c:91
+#: archive.c:452 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "从远程仓库(<仓库>)提取归档文件"
 
-#: archive.c:452 builtin/archive.c:92 builtin/notes.c:479
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479
 msgid "command"
 msgstr "命令"
 
-#: archive.c:453 builtin/archive.c:93
+#: archive.c:454 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "远程 git-upload-archive 命令的路径"
 
@@ -268,81 +269,81 @@
 "负值模版在 git attributes 中被忽略\n"
 "当字符串确实要以感叹号开始时,使用 '\\!'。"
 
-#: branch.c:60
+#: branch.c:61
 #, c-format
 msgid "Not setting branch %s as its own upstream."
 msgstr "未设置分支 %s 作为它自己的上游。"
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr "分支 %1$s 设置为使用变基来跟踪来自 %3$s 的远程分支 %2$s。"
 
-#: branch.c:84
+#: branch.c:85
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr "分支 %1$s 设置为跟踪来自 %3$s 的远程分支 %2$s。"
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr "分支 %s 设置为使用变基来跟踪本地分支 %s。"
 
-#: branch.c:89
+#: branch.c:90
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "分支 %s 设置为跟踪本地分支 %s。"
 
-#: branch.c:94
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr "分支 %s 设置为使用变基来跟踪远程引用 %s。"
 
-#: branch.c:95
+#: branch.c:96
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "分支 %s 设置为跟踪远程引用 %s。"
 
-#: branch.c:99
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr "分支 %s 设置为使用变基来跟踪本地引用 %s。"
 
-#: branch.c:100
+#: branch.c:101
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "分支 %s 设置为跟踪本地引用 %s。"
 
-#: branch.c:133
+#: branch.c:134
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "未跟踪:引用 %s 有歧义"
 
-#: branch.c:162
+#: branch.c:163
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "'%s' 不是一个有效的分支名称。"
 
-#: branch.c:167
+#: branch.c:168
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "一个分支名 '%s' 已经存在。"
 
-#: branch.c:175
+#: branch.c:176
 msgid "Cannot force update the current branch."
 msgstr "无法强制更新当前分支。"
 
-#: branch.c:195
+#: branch.c:196
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr "无法设置跟踪信息;起始点 '%s' 不是一个分支。"
 
-#: branch.c:197
+#: branch.c:198
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "请求的上游分支 '%s' 不存在"
 
-#: branch.c:199
+#: branch.c:200
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -360,22 +361,22 @@
 "如果您正计划推送一个能与对应远程分支建立跟踪的新的本地分支,\n"
 "您可能需要使用 \"git push -u\" 推送分支并配置和上游的关联。"
 
-#: branch.c:243
+#: branch.c:244
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "不是一个有效的对象名:'%s'。"
 
-#: branch.c:263
+#: branch.c:264
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "歧义的对象名:'%s'。"
 
-#: branch.c:268
+#: branch.c:269
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "无效的分支点:'%s'。"
 
-#: branch.c:399
+#: branch.c:322
 #, c-format
 msgid "'%s' is already checked out at '%s'"
 msgstr "'%s' 已经检出到 '%s'"
@@ -390,7 +391,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr "未能识别的包头:%s%s (%d)"
 
-#: bundle.c:87 builtin/commit.c:765
+#: bundle.c:87 builtin/commit.c:766
 #, c-format
 msgid "could not open '%s'"
 msgstr "不能打开 '%s'"
@@ -399,9 +400,9 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr "仓库中缺少这些必备的提交:"
 
-#: bundle.c:163 sequencer.c:636 sequencer.c:1083 builtin/blame.c:2708
-#: builtin/branch.c:652 builtin/commit.c:1044 builtin/log.c:334
-#: builtin/log.c:850 builtin/log.c:1457 builtin/log.c:1690 builtin/merge.c:358
+#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083
+#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334
+#: builtin/log.c:849 builtin/log.c:1461 builtin/log.c:1694 builtin/merge.c:358
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "版本遍历设置失败"
@@ -441,7 +442,7 @@
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "引用 '%s' 被 rev-list 选项排除"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1367 builtin/shortlog.c:261
+#: bundle.c:443 builtin/log.c:157 builtin/log.c:1369 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "未能识别的参数:%s"
@@ -459,13 +460,13 @@
 msgid "index-pack died"
 msgstr "index-pack 终止"
 
-#: color.c:260
+#: color.c:275
 #, c-format
 msgid "invalid color value: %.*s"
 msgstr "无效的颜色值:%.*s"
 
-#: commit.c:40 builtin/am.c:451 builtin/am.c:487 builtin/am.c:1516
-#: builtin/am.c:2128
+#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520
+#: builtin/am.c:2149
 #, c-format
 msgid "could not parse %s"
 msgstr "不能解析 %s"
@@ -624,23 +625,23 @@
 msgstr "正在进行非精确的重命名检测"
 
 #  译者:注意保持前导空格
-#: diff.c:116
+#: diff.c:115
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr "  无法解析 dirstat 截止(cut-off)百分比 '%s'\n"
 
 #  译者:注意保持前导空格
-#: diff.c:121
+#: diff.c:120
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  未知的 dirstat 参数 '%s'\n"
 
-#: diff.c:216
+#: diff.c:215
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "配置变量 'diff.submodule' 未知的取值:'%s'"
 
-#: diff.c:268
+#: diff.c:267
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -649,16 +650,16 @@
 "发现配置变量 'diff.dirstat' 中的错误:\n"
 "%s"
 
-#: diff.c:2998
+#: diff.c:3000
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "外部 diff 退出,停止在 %s"
 
-#: diff.c:3394
+#: diff.c:3396
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow 参数后只跟一个 pathspec"
 
-#: diff.c:3557
+#: diff.c:3559
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -667,16 +668,16 @@
 "无法解析 --dirstat/-X 选项的参数:\n"
 "%s"
 
-#: diff.c:3571
+#: diff.c:3573
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "无法解析 --submodule 选项的参数:'%s'"
 
-#: dir.c:1853
+#: dir.c:1915
 msgid "failed to get kernel name and information"
 msgstr "无法获得内核名称和信息"
 
-#: dir.c:1936
+#: dir.c:1998
 msgid "Untracked cache is disabled on this system."
 msgstr "缓存未跟踪文件在本系统被禁用"
 
@@ -785,8 +786,8 @@
 msgid "failed to read the cache"
 msgstr "无法读取缓存"
 
-#: merge.c:94 builtin/am.c:2001 builtin/am.c:2036 builtin/checkout.c:375
-#: builtin/checkout.c:586 builtin/clone.c:715
+#: merge.c:94 builtin/am.c:2022 builtin/am.c:2057 builtin/checkout.c:376
+#: builtin/checkout.c:587 builtin/clone.c:722
 msgid "unable to write new index file"
 msgstr "无法写新的索引文件"
 
@@ -804,64 +805,64 @@
 msgid "error building trees"
 msgstr "无法创建树"
 
-#: merge-recursive.c:687
+#: merge-recursive.c:686
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "无法创建路径 '%s'%s"
 
-#: merge-recursive.c:698
+#: merge-recursive.c:697
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "删除 %s 以便为子目录留出空间\n"
 
-#: merge-recursive.c:712 merge-recursive.c:733
+#: merge-recursive.c:711 merge-recursive.c:732
 msgid ": perhaps a D/F conflict?"
 msgstr ":可能是一个目录/文件冲突?"
 
-#: merge-recursive.c:723
+#: merge-recursive.c:722
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "拒绝丢弃 '%s' 中的未跟踪文件"
 
-#: merge-recursive.c:763
+#: merge-recursive.c:762
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "不能读取对象 %s '%s'"
 
-#: merge-recursive.c:765
+#: merge-recursive.c:764
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "%s '%s' 应为数据对象"
 
-#: merge-recursive.c:788 builtin/clone.c:364
+#: merge-recursive.c:787 builtin/clone.c:369
 #, c-format
 msgid "failed to open '%s'"
 msgstr "无法打开 '%s'"
 
-#: merge-recursive.c:796
+#: merge-recursive.c:795
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "无法创建符号链接 '%s'"
 
-#: merge-recursive.c:799
+#: merge-recursive.c:798
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "不知道如何处理 %06o %s '%s'"
 
-#: merge-recursive.c:937
+#: merge-recursive.c:936
 msgid "Failed to execute internal merge"
 msgstr "无法执行内部合并"
 
-#: merge-recursive.c:941
+#: merge-recursive.c:940
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "不能添加 %s 至对象库"
 
-#: merge-recursive.c:957
+#: merge-recursive.c:956
 msgid "unsupported object type in the tree"
 msgstr "在树中有不支持的对象类型"
 
-#: merge-recursive.c:1032 merge-recursive.c:1046
+#: merge-recursive.c:1031 merge-recursive.c:1045
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -870,7 +871,7 @@
 "冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
 "的版本被保留。"
 
-#: merge-recursive.c:1038 merge-recursive.c:1051
+#: merge-recursive.c:1037 merge-recursive.c:1050
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -879,20 +880,20 @@
 "冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
 "的版本保留于 %8$s 中。"
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "rename"
 msgstr "重命名"
 
-#: merge-recursive.c:1092
+#: merge-recursive.c:1091
 msgid "renamed"
 msgstr "重命名"
 
-#: merge-recursive.c:1148
+#: merge-recursive.c:1147
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s 是 %s 中的一个目录而以 %s 为名被添加"
 
-#: merge-recursive.c:1170
+#: merge-recursive.c:1169
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -901,144 +902,144 @@
 "冲突(重命名/重命名):在分支 \"%3$s\" 中重命名 \"%1$s\"->\"%2$s\",在分支 "
 "\"%6$s\" 中重命名 \"%4$s\"->\"%5$s\"%7$s"
 
-#: merge-recursive.c:1175
+#: merge-recursive.c:1174
 msgid " (left unresolved)"
 msgstr "(留下未解决)"
 
-#: merge-recursive.c:1229
+#: merge-recursive.c:1228
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 "冲突(重命名/重命名):在 %3$s 中重命名 %1$s->%2$s,在 %6$s 中重命名 %4$s->"
 "%5$s"
 
-#: merge-recursive.c:1259
+#: merge-recursive.c:1258
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "而是重命名 %s 至 %s,以及 %s 至 %s"
 
-#: merge-recursive.c:1458
+#: merge-recursive.c:1457
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr "冲突(重命名/添加):在 %3$s 中重命名 %1$s->%2$s。在 %5$s 中添加 %4$s"
 
-#: merge-recursive.c:1468
+#: merge-recursive.c:1467
 #, c-format
 msgid "Adding merged %s"
 msgstr "添加合并后的 %s"
 
-#: merge-recursive.c:1473 merge-recursive.c:1671
+#: merge-recursive.c:1472 merge-recursive.c:1674
 #, c-format
 msgid "Adding as %s instead"
 msgstr "而是以 %s 为名添加"
 
-#: merge-recursive.c:1524
+#: merge-recursive.c:1523
 #, c-format
 msgid "cannot read object %s"
 msgstr "不能读取对象 %s"
 
-#: merge-recursive.c:1527
+#: merge-recursive.c:1526
 #, c-format
 msgid "object %s is not a blob"
 msgstr "对象 %s 不是一个数据对象"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modify"
 msgstr "修改"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1578
 msgid "modified"
 msgstr "修改"
 
-#: merge-recursive.c:1585
+#: merge-recursive.c:1588
 msgid "content"
 msgstr "内容"
 
-#: merge-recursive.c:1592
+#: merge-recursive.c:1595
 msgid "add/add"
 msgstr "添加/添加"
 
-#: merge-recursive.c:1626
+#: merge-recursive.c:1629
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "略过 %s(已经做过相同合并)"
 
-#: merge-recursive.c:1640
+#: merge-recursive.c:1643
 #, c-format
 msgid "Auto-merging %s"
 msgstr "自动合并 %s"
 
-#: merge-recursive.c:1644 git-submodule.sh:1150
+#: merge-recursive.c:1647 git-submodule.sh:1025
 msgid "submodule"
 msgstr "子模组"
 
-#: merge-recursive.c:1645
+#: merge-recursive.c:1648
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "冲突(%s):合并冲突于 %s"
 
-#: merge-recursive.c:1731
+#: merge-recursive.c:1734
 #, c-format
 msgid "Removing %s"
 msgstr "删除 %s"
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1759
 msgid "file/directory"
 msgstr "文件/目录"
 
-#: merge-recursive.c:1762
+#: merge-recursive.c:1765
 msgid "directory/file"
 msgstr "目录/文件"
 
-#: merge-recursive.c:1767
+#: merge-recursive.c:1770
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr "冲突(%1$s):在 %3$s 中有一个名为 %2$s 的目录。以 %5$s 为名添加 %4$s"
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1780
 #, c-format
 msgid "Adding %s"
 msgstr "添加 %s"
 
-#: merge-recursive.c:1794
+#: merge-recursive.c:1797
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "严重的合并错误,不应发生。"
 
-#: merge-recursive.c:1813
+#: merge-recursive.c:1816
 msgid "Already up-to-date!"
 msgstr "已经是最新的!"
 
-#: merge-recursive.c:1822
+#: merge-recursive.c:1825
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "无法合并树 %s 和 %s"
 
-#: merge-recursive.c:1852
+#: merge-recursive.c:1855
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "未处理的路径??? %s"
 
-#: merge-recursive.c:1900
+#: merge-recursive.c:1903
 msgid "Merging:"
 msgstr "合并:"
 
-#: merge-recursive.c:1913
+#: merge-recursive.c:1916
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "发现 %u 个共同祖先:"
 msgstr[1] "发现 %u 个共同祖先:"
 
-#: merge-recursive.c:1950
+#: merge-recursive.c:1953
 msgid "merge returned no commit"
 msgstr "合并未返回提交"
 
-#: merge-recursive.c:2007
+#: merge-recursive.c:2010
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "不能解析对象 '%s'"
 
-#: merge-recursive.c:2018 builtin/merge.c:645
+#: merge-recursive.c:2021 builtin/merge.c:645
 msgid "Unable to write index."
 msgstr "不能写入索引。"
 
@@ -1068,32 +1069,42 @@
 msgid "unable to parse object: %s"
 msgstr "不能解析对象:%s"
 
-#: parse-options.c:563
+#: parse-options.c:570
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:581
+#: parse-options.c:588
 #, c-format
 msgid "usage: %s"
 msgstr "用法:%s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:585
+#: parse-options.c:592
 #, c-format
 msgid "   or: %s"
 msgstr "  或:%s"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: parse-options.c:588
+#: parse-options.c:595
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:622
+#: parse-options.c:629
 msgid "-NUM"
 msgstr "-数字"
 
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "非法的对象名 '%s'"
+
+#: path.c:752
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "不能设置 %s 为组可写"
+
 #: pathspec.c:133
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr "全局的 'glob' 和 'noglob' 路径规格设置不兼容"
@@ -1160,11 +1171,11 @@
 msgid "unable to parse --pretty format"
 msgstr "不能解析 --pretty 格式"
 
-#: progress.c:236
+#: progress.c:235
 msgid "done"
 msgstr "完成"
 
-#: read-cache.c:1296
+#: read-cache.c:1281
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -1173,7 +1184,7 @@
 "设置了 index.version,但是取值无效。\n"
 "使用版本 %i"
 
-#: read-cache.c:1306
+#: read-cache.c:1291
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1182,118 +1193,163 @@
 "设置了 GIT_INDEX_VERSION,但是取值无效。\n"
 "使用版本 %i"
 
-#: refs.c:2941 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
+#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
 #: builtin/merge.c:983
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "无法打开 '%s' 进行写入"
 
-#: refs.c:3001
+#: refs/files-backend.c:2359
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "无法删除引用 %s:%s"
 
-#: refs.c:3004
+#: refs/files-backend.c:2362
 #, c-format
 msgid "could not delete references: %s"
 msgstr "无法删除引用:%s"
 
-#: refs.c:3013
+#: refs/files-backend.c:2371
 #, c-format
 msgid "could not remove reference %s"
 msgstr "无法删除引用 %s"
 
-#: ref-filter.c:660
+#: ref-filter.c:245
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "格式:使用了 %%(end) 元素却没有它的对应元素"
+
+#: ref-filter.c:704
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "要为 contents:lines=%s 提供一个正数"
+
+#: ref-filter.c:833
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "期望的格式:%%(color:<color>)"
+
+#: ref-filter.c:835
 msgid "unable to parse format"
 msgstr "不能解析格式"
 
-#: remote.c:792
+#: ref-filter.c:870
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "期望的格式:%%(align:<width>,<position>)"
+
+#: ref-filter.c:893
+#, c-format
+msgid "improper format entered align:%s"
+msgstr "输入了不正确的格式 align:%s"
+
+#: ref-filter.c:898
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "元素 %%(align) 需要一个正数的宽度"
+
+#: ref-filter.c:1219
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "非法的对象于 '%s'"
+
+#: ref-filter.c:1561
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "格式:缺少 %%(end) 元素"
+
+#: ref-filter.c:1615
+#, c-format
+msgid "malformed object name %s"
+msgstr "非法的对象名 %s"
+
+#: remote.c:756
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "不能同时获取 %s 和 %s 至 %s"
 
-#: remote.c:796
+#: remote.c:760
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s 通常跟踪 %s,而非 %s"
 
-#: remote.c:800
+#: remote.c:764
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s 同时跟踪 %s 和 %s"
 
-#: remote.c:808
+#: remote.c:772
 msgid "Internal error"
 msgstr "内部错误"
 
-#: remote.c:1723 remote.c:1766
+#: remote.c:1687 remote.c:1730
 msgid "HEAD does not point to a branch"
 msgstr "HEAD 没有指向一个分支"
 
-#: remote.c:1732
+#: remote.c:1696
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "没有此分支:'%s'"
 
-#: remote.c:1735
+#: remote.c:1699
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "尚未给分支 '%s' 设置上游"
 
-#: remote.c:1741
+#: remote.c:1705
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "上游分支 '%s' 没有存储为一个远程跟踪分支"
 
-#: remote.c:1756
+#: remote.c:1720
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr "推送目标 '%s' 至远程 '%s' 没有本地跟踪分支"
 
-#: remote.c:1771
+#: remote.c:1735
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "分支 '%s' 没有设置要推送的远程服务器"
 
-#: remote.c:1782
+#: remote.c:1746
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "向 '%s' 推送引用规格未包含 '%s'"
 
-#: remote.c:1795
+#: remote.c:1759
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "推送无目标(push.default 是 'nothing')"
 
-#: remote.c:1817
+#: remote.c:1781
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "无法解析 'simple' 推送至一个单独的目标"
 
-#: remote.c:2124
+#: remote.c:2083
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "您的分支基于 '%s',但此上游分支已经不存在。\n"
 
-#: remote.c:2128
+#: remote.c:2087
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (使用 \"git branch --unset-upstream\" 来修复)\n"
 
-#: remote.c:2131
+#: remote.c:2090
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "您的分支与上游分支 '%s' 一致。\n"
 
-#: remote.c:2135
+#: remote.c:2094
 #, c-format
 msgid "Your branch is ahead of '%s' by %d commit.\n"
 msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
 msgstr[0] "您的分支领先 '%s' 共 %d 个提交。\n"
 msgstr[1] "您的分支领先 '%s' 共 %d 个提交。\n"
 
-#: remote.c:2141
+#: remote.c:2100
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (使用 \"git push\" 来发布您的本地提交)\n"
 
-#: remote.c:2144
+#: remote.c:2103
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1302,11 +1358,11 @@
 msgstr[1] "您的分支落后 '%s' 共 %d 个提交,并且可以快进。\n"
 
 #  译者:注意保持前导空格
-#: remote.c:2152
+#: remote.c:2111
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (使用 \"git pull\" 来更新您的本地分支)\n"
 
-#: remote.c:2155
+#: remote.c:2114
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1322,28 +1378,28 @@
 "并且分别有 %d 和 %d 处不同的提交。\n"
 
 #  译者:注意保持前导空格
-#: remote.c:2165
+#: remote.c:2124
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (使用 \"git pull\" 来合并远程分支)\n"
 
-#: revision.c:2198
+#: revision.c:2193
 msgid "your current branch appears to be broken"
 msgstr "您的当前分支好像被损坏"
 
-#: revision.c:2201
+#: revision.c:2196
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "您的当前分支 '%s' 尚无任何提交"
 
-#: revision.c:2395
+#: revision.c:2390
 msgid "--first-parent is incompatible with --bisect"
 msgstr "--first-parent 与 --bisect 不兼容"
 
-#: run-command.c:83
+#: run-command.c:90
 msgid "open /dev/null failed"
 msgstr "不能打开 /dev/null"
 
-#: run-command.c:85
+#: run-command.c:92
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "不能调用 dup2(%d,%d)"
@@ -1558,7 +1614,7 @@
 msgid "cannot abort from a branch yet to be born"
 msgstr "不能从尚未建立的分支终止"
 
-#: sequencer.c:887 builtin/apply.c:4291
+#: sequencer.c:887 builtin/apply.c:4287
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "不能打开 %s:%s"
@@ -1600,12 +1656,12 @@
 msgid "Can't cherry-pick into empty head"
 msgstr "不能拣选到空分支"
 
-#: setup.c:243
+#: setup.c:248
 #, c-format
 msgid "failed to read %s"
 msgstr "无法读取 %s"
 
-#: sha1_name.c:453
+#: sha1_name.c:463
 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"
@@ -1649,7 +1705,7 @@
 msgid "staging updated .gitmodules failed"
 msgstr "将更新后 .gitmodules 添加暂存区失败"
 
-#: submodule.c:1045
+#: submodule.c:1040
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "不能在 %s 中设置 core.worktree"
@@ -1660,7 +1716,7 @@
 msgid "unknown value '%s' for key '%s'"
 msgstr "键 '%2$s' 的未知取值 '%1$s'"
 
-#: trailer.c:543 trailer.c:548 builtin/remote.c:290
+#: trailer.c:543 trailer.c:548 builtin/remote.c:296
 #, c-format
 msgid "more than one %s"
 msgstr "多于一个 %s"
@@ -1727,8 +1783,8 @@
 msgid "could not open '%s' for writing"
 msgstr "无法打开 '%s' 进行写入"
 
-#: wrapper.c:223 wrapper.c:366 builtin/am.c:337 builtin/commit.c:1688
-#: builtin/merge.c:1076 builtin/pull.c:380
+#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691
+#: builtin/merge.c:1074 builtin/pull.c:380
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "无法打开 '%s' 进行读取"
@@ -1743,30 +1799,21 @@
 msgid "unable to access '%s'"
 msgstr "不能访问 '%s'"
 
-#: wrapper.c:611
-#, c-format
-msgid "unable to look up current user in the passwd file: %s"
-msgstr "无法在口令文件中查询到当前用户:%s"
-
-#: wrapper.c:612
-msgid "no such user"
-msgstr "无此用户"
-
-#: wrapper.c:620
+#: wrapper.c:608
 msgid "unable to get current working directory"
 msgstr "不能获取当前工作目录"
 
-#: wrapper.c:631
+#: wrapper.c:635
 #, c-format
 msgid "could not open %s for writing"
 msgstr "不能写入 %s"
 
-#: wrapper.c:642 builtin/am.c:424
+#: wrapper.c:646 builtin/am.c:425
 #, c-format
 msgid "could not write to %s"
 msgstr "不能写入 %s"
 
-#: wrapper.c:648
+#: wrapper.c:652
 #, c-format
 msgid "could not close %s"
 msgstr "不能关闭 %s"
@@ -2128,27 +2175,27 @@
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr "  (使用 \"git bisect reset\" 以回到原有分支)"
 
-#: wt-status.c:1437
+#: wt-status.c:1438
 msgid "On branch "
 msgstr "位于分支 "
 
-#: wt-status.c:1445
+#: wt-status.c:1444
 msgid "interactive rebase in progress; onto "
 msgstr "交互式变基操作正在进行中;至 "
 
-#: wt-status.c:1447
+#: wt-status.c:1446
 msgid "rebase in progress; onto "
 msgstr "变基操作正在进行中;至 "
 
-#: wt-status.c:1452
+#: wt-status.c:1451
 msgid "HEAD detached at "
 msgstr "头指针分离于 "
 
-#: wt-status.c:1454
+#: wt-status.c:1453
 msgid "HEAD detached from "
 msgstr "头指针分离自 "
 
-#: wt-status.c:1457
+#: wt-status.c:1456
 msgid "Not currently on any branch."
 msgstr "当前不在任何分支上。"
 
@@ -2233,25 +2280,25 @@
 msgid "nothing to commit, working directory clean\n"
 msgstr "无文件要提交,干净的工作区\n"
 
-#: wt-status.c:1644
-msgid "HEAD (no branch)"
-msgstr "HEAD(非分支)"
-
 #  译者:注意保持句尾空格
-#: wt-status.c:1650
+#: wt-status.c:1642
 msgid "Initial commit on "
 msgstr "初始提交于 "
 
-#: wt-status.c:1677
+#: wt-status.c:1646
+msgid "HEAD (no branch)"
+msgstr "HEAD(非分支)"
+
+#: wt-status.c:1675
 msgid "gone"
 msgstr "丢失"
 
 #  译者:注意保持句尾空格
-#: wt-status.c:1679 wt-status.c:1687
+#: wt-status.c:1677 wt-status.c:1685
 msgid "behind "
 msgstr "落后 "
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:403
+#: compat/precompose_utf8.c:56 builtin/clone.c:408
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "无法删除 '%s'"
@@ -2265,7 +2312,7 @@
 msgid "unexpected diff status %c"
 msgstr "意外的差异状态 %c"
 
-#: builtin/add.c:70 builtin/commit.c:277
+#: builtin/add.c:70 builtin/commit.c:278
 msgid "updating files failed"
 msgstr "更新文件失败"
 
@@ -2278,7 +2325,7 @@
 msgid "Unstaged changes after refreshing the index:"
 msgstr "刷新索引之后尚未被暂存的变更:"
 
-#: builtin/add.c:194 builtin/rev-parse.c:799
+#: builtin/add.c:194 builtin/rev-parse.c:796
 msgid "Could not read the index"
 msgstr "不能读取索引"
 
@@ -2313,15 +2360,15 @@
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr "下列路径根据您的一个 .gitignore 文件而被忽略:\n"
 
-#: builtin/add.c:249 builtin/clean.c:896 builtin/fetch.c:108 builtin/mv.c:110
-#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:545
-#: builtin/remote.c:1339 builtin/rm.c:268 builtin/send-pack.c:162
+#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:543
+#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162
 msgid "dry run"
 msgstr "演习"
 
-#: builtin/add.c:250 builtin/apply.c:4580 builtin/check-ignore.c:19
-#: builtin/commit.c:1321 builtin/count-objects.c:63 builtin/fsck.c:636
-#: builtin/log.c:1641 builtin/mv.c:109 builtin/read-tree.c:114
+#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19
+#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
+#: builtin/log.c:1645 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr "冗长输出"
 
@@ -2329,7 +2376,7 @@
 msgid "interactive picking"
 msgstr "交互式拣选"
 
-#: builtin/add.c:253 builtin/checkout.c:1152 builtin/reset.c:286
+#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "交互式挑选数据块"
 
@@ -2386,145 +2433,145 @@
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "选项 --ignore-missing 只能和 --dry-run 同时使用"
 
-#: builtin/add.c:358
+#: builtin/add.c:352
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "没有指定文件,也没有文件被添加。\n"
 
-#: builtin/add.c:359
+#: builtin/add.c:353
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "也许您想要执行 'git add .'?\n"
 
-#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:940
-#: builtin/commit.c:336 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938
+#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:40
 msgid "index file corrupt"
 msgstr "索引文件损坏"
 
-#: builtin/add.c:445 builtin/apply.c:4678 builtin/mv.c:279 builtin/rm.c:430
+#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430
 msgid "Unable to write new index file"
 msgstr "无法写入新索引文件"
 
-#: builtin/am.c:41
+#: builtin/am.c:42
 #, c-format
 msgid "could not stat %s"
 msgstr "不能获取 %s 的文件状态"
 
-#: builtin/am.c:270 builtin/am.c:1345 builtin/commit.c:737
-#: builtin/merge.c:1079
+#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077
 #, c-format
 msgid "could not read '%s'"
 msgstr "不能读取 '%s'"
 
-#: builtin/am.c:444
+#: builtin/am.c:445
 msgid "could not parse author script"
 msgstr "不能解析作者脚本"
 
-#: builtin/am.c:521
+#: builtin/am.c:522
 #, c-format
 msgid "'%s' was deleted by the applypatch-msg hook"
 msgstr "'%s' 被 applypatch-msg 钩子删除"
 
-#: builtin/am.c:562 builtin/notes.c:300
+#: builtin/am.c:563 builtin/notes.c:300
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "非法的输入行:'%s'。"
 
-#: builtin/am.c:599 builtin/notes.c:315
+#: builtin/am.c:600 builtin/notes.c:315
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "从 '%s' 拷贝注解到 '%s' 时失败"
 
-#: builtin/am.c:625
+#: builtin/am.c:626
 msgid "fseek failed"
 msgstr "fseek 失败"
 
-#: builtin/am.c:786 builtin/am.c:874
+#: builtin/am.c:787 builtin/am.c:875
 #, c-format
 msgid "could not open '%s' for reading: %s"
 msgstr "无法打开 '%s' 进行读取:%s"
 
-#: builtin/am.c:793
+#: builtin/am.c:794
 #, c-format
 msgid "could not open '%s' for writing: %s"
 msgstr "无法打开 '%s' 进行写入:%s"
 
-#: builtin/am.c:802
+#: builtin/am.c:803
 #, c-format
 msgid "could not parse patch '%s'"
 msgstr "无法解析补丁 '%s'"
 
-#: builtin/am.c:867
+#: builtin/am.c:868
 msgid "Only one StGIT patch series can be applied at once"
 msgstr "一次只能有一个 StGIT 补丁队列被应用"
 
-#: builtin/am.c:915
+#: builtin/am.c:916
 msgid "invalid timestamp"
 msgstr "无效的时间戳"
 
-#: builtin/am.c:918 builtin/am.c:926
+#: builtin/am.c:919 builtin/am.c:927
 msgid "invalid Date line"
 msgstr "无效的日期行"
 
-#: builtin/am.c:923
+#: builtin/am.c:924
 msgid "invalid timezone offset"
 msgstr "无效的时区偏移值"
 
-#: builtin/am.c:1010
+#: builtin/am.c:1011
 msgid "Patch format detection failed."
 msgstr "补丁格式检测失败。"
 
-#: builtin/am.c:1015 builtin/clone.c:368
+#: builtin/am.c:1016 builtin/clone.c:373
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "无法创建目录 '%s'"
 
-#: builtin/am.c:1019
+#: builtin/am.c:1020
 msgid "Failed to split patches."
 msgstr "无法拆分补丁。"
 
-#: builtin/am.c:1151 builtin/commit.c:362
+#: builtin/am.c:1152 builtin/commit.c:363
 msgid "unable to write index file"
 msgstr "无法写入索引文件"
 
-#: builtin/am.c:1202
+#: builtin/am.c:1203
 #, c-format
 msgid "When you have resolved this problem, run \"%s --continue\"."
 msgstr "当您解决这一问题,执行 \"%s --continue\"。"
 
-#: builtin/am.c:1203
+#: builtin/am.c:1204
 #, c-format
 msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
 msgstr "如果您想要跳过这一补丁,则执行 \"%s --skip\"。"
 
-#: builtin/am.c:1204
+#: builtin/am.c:1205
 #, c-format
 msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr "若要复原至原始分支并停止补丁操作,执行 \"%s --abort\"。"
 
-#: builtin/am.c:1339
+#: builtin/am.c:1343
 msgid "Patch is empty. Was it split wrong?"
 msgstr "补丁为空。是不是切分错误?"
 
-#: builtin/am.c:1413 builtin/log.c:1345
+#: builtin/am.c:1417 builtin/log.c:1347
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "包含无效的身份标识:%s"
 
-#: builtin/am.c:1440
+#: builtin/am.c:1444
 #, c-format
 msgid "unable to parse commit %s"
 msgstr "不能解析提交 %s"
 
-#: builtin/am.c:1614
+#: builtin/am.c:1646
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr "仓库缺乏必要的数据对象以进行三方合并。"
 
-#: builtin/am.c:1616
+#: builtin/am.c:1648
 msgid "Using index info to reconstruct a base tree..."
 msgstr "使用索引来重建一个(三方合并的)基础目录树..."
 
-#: builtin/am.c:1635
+#: builtin/am.c:1667
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
@@ -2532,37 +2579,37 @@
 "您是否曾手动编辑过您的补丁?\n"
 "无法应用补丁到索引中的数据对象上。"
 
-#: builtin/am.c:1641
+#: builtin/am.c:1673
 msgid "Falling back to patching base and 3-way merge..."
 msgstr "回落到基础版本上打补丁及进行三方合并..."
 
-#: builtin/am.c:1666
+#: builtin/am.c:1688
 msgid "Failed to merge in the changes."
 msgstr "无法合并变更。"
 
-#: builtin/am.c:1691 builtin/merge.c:632
+#: builtin/am.c:1712 builtin/merge.c:632
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree 无法写入一树对象"
 
-#: builtin/am.c:1698
+#: builtin/am.c:1719
 msgid "applying to an empty history"
 msgstr "正应用到一个空历史上"
 
-#: builtin/am.c:1711 builtin/commit.c:1752 builtin/merge.c:829
+#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829
 #: builtin/merge.c:854
 msgid "failed to write commit object"
 msgstr "无法写提交对象"
 
-#: builtin/am.c:1743 builtin/am.c:1747
+#: builtin/am.c:1764 builtin/am.c:1768
 #, c-format
 msgid "cannot resume: %s does not exist."
 msgstr "无法继续:%s 不存在。"
 
-#: builtin/am.c:1763
+#: builtin/am.c:1784
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr "标准输入没有和终端关联,不能进行交互式操作。"
 
-#: builtin/am.c:1768
+#: builtin/am.c:1789
 msgid "Commit Body is:"
 msgstr "提交内容为:"
 
@@ -2571,35 +2618,35 @@
 #. in your translation. The program will only accept English
 #. input at this point.
 #.
-#: builtin/am.c:1778
+#: builtin/am.c:1799
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 msgstr "应用?是[y]/否[n]/编辑[e]/查看补丁[v]/应用所有[a]:"
 
-#: builtin/am.c:1828
+#: builtin/am.c:1849
 #, c-format
 msgid "Dirty index: cannot apply patches (dirty: %s)"
 msgstr "脏索引:不能应用补丁(脏文件:%s)"
 
-#: builtin/am.c:1863 builtin/am.c:1934
+#: builtin/am.c:1884 builtin/am.c:1955
 #, c-format
 msgid "Applying: %.*s"
 msgstr "应用:%.*s"
 
-#: builtin/am.c:1879
+#: builtin/am.c:1900
 msgid "No changes -- Patch already applied."
 msgstr "没有变更 —— 补丁已经应用过。"
 
-#: builtin/am.c:1887
+#: builtin/am.c:1908
 #, c-format
 msgid "Patch failed at %s %.*s"
 msgstr "打补丁失败于 %s %.*s"
 
-#: builtin/am.c:1893
+#: builtin/am.c:1914
 #, c-format
 msgid "The copy of the patch that failed is found in: %s"
 msgstr "失败的补丁文件副本位于:%s"
 
-#: builtin/am.c:1937
+#: builtin/am.c:1958
 msgid ""
 "No changes - did you forget to use 'git add'?\n"
 "If there is nothing left to stage, chances are that something else\n"
@@ -2609,7 +2656,7 @@
 "如果没有什么要添加到暂存区的,则很可能是其它提交已经引入了相同的变更。\n"
 "您也许想要跳过这个补丁。"
 
-#: builtin/am.c:1944
+#: builtin/am.c:1965
 msgid ""
 "You still have unmerged paths in your index.\n"
 "Did you forget to use 'git add'?"
@@ -2617,166 +2664,168 @@
 "您的索引中仍有未合并的路径。\n"
 "您是否忘了执行 'git add'?"
 
-#: builtin/am.c:2052 builtin/am.c:2056 builtin/am.c:2068 builtin/reset.c:308
+#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308
 #: builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "不能解析对象 '%s'。"
 
-#: builtin/am.c:2104
+#: builtin/am.c:2125
 msgid "failed to clean index"
 msgstr "无法清空索引"
 
-#: builtin/am.c:2138
+#: builtin/am.c:2159
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
 msgstr "您好像在上一次 'am' 失败后移动了 HEAD。未回退至 ORIG_HEAD"
 
-#: builtin/am.c:2199
+#: builtin/am.c:2220
 #, c-format
 msgid "Invalid value for --patch-format: %s"
 msgstr "无效的 --patch-format 值:%s"
 
-#: builtin/am.c:2221
-msgid "git am [options] [(<mbox>|<Maildir>)...]"
-msgstr "git am [选项] [(<mbox>|<Maildir>)...]"
+#: builtin/am.c:2253
+msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
+msgstr "git am [<选项>] [(<mbox>|<Maildir>)...]"
 
-#: builtin/am.c:2222
-msgid "git am [options] (--continue | --skip | --abort)"
-msgstr "git am [选项] (--continue | --skip | --abort)"
+#: builtin/am.c:2254
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<选项>] (--continue | --skip | --abort)"
 
-#: builtin/am.c:2228
+#: builtin/am.c:2260
 msgid "run interactively"
 msgstr "以交互式方式运行"
 
-#: builtin/am.c:2230
+#: builtin/am.c:2262
 msgid "historical option -- no-op"
 msgstr "老的参数 —— 无作用"
 
-#: builtin/am.c:2232
+#: builtin/am.c:2264
 msgid "allow fall back on 3way merging if needed"
 msgstr "如果必要,允许使用三方合并。"
 
-#: builtin/am.c:2233 builtin/init-db.c:509 builtin/prune-packed.c:57
+#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57
 #: builtin/repack.c:171
 msgid "be quiet"
 msgstr "静默模式"
 
-#: builtin/am.c:2235
+#: builtin/am.c:2267
 msgid "add a Signed-off-by line to the commit message"
 msgstr "在提交说明中添加一个 Signed-off-by 签名"
 
-#: builtin/am.c:2238
+#: builtin/am.c:2270
 msgid "recode into utf8 (default)"
 msgstr "使用 utf8 字符集(默认)"
 
-#: builtin/am.c:2240
+#: builtin/am.c:2272
 msgid "pass -k flag to git-mailinfo"
 msgstr "向 git-mailinfo 传递 -k 参数"
 
-#: builtin/am.c:2242
+#: builtin/am.c:2274
 msgid "pass -b flag to git-mailinfo"
 msgstr "向 git-mailinfo 传递 -b 参数"
 
-#: builtin/am.c:2244
+#: builtin/am.c:2276
 msgid "pass -m flag to git-mailinfo"
 msgstr "向 git-mailinfo 传递 -m 参数"
 
-#: builtin/am.c:2246
+#: builtin/am.c:2278
 msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr "针对 mbox 格式,向 git-mailsplit 传递 --keep-cr 参数"
 
-#: builtin/am.c:2249
+#: builtin/am.c:2281
 msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr "不向 git-mailsplit 传递 --keep-cr 参数,覆盖 am.keepcr 的设置"
 
-#: builtin/am.c:2252
+#: builtin/am.c:2284
 msgid "strip everything before a scissors line"
 msgstr "丢弃裁切线前的所有内容"
 
-#: builtin/am.c:2253 builtin/apply.c:4563
+#: builtin/am.c:2285 builtin/apply.c:4554
 msgid "action"
 msgstr "动作"
 
-#: builtin/am.c:2254 builtin/am.c:2257 builtin/am.c:2260 builtin/am.c:2263
-#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
-#: builtin/am.c:2281
+#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295
+#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307
+#: builtin/am.c:2313
 msgid "pass it through git-apply"
 msgstr "传递给 git-apply"
 
-#: builtin/am.c:2262 builtin/apply.c:4587
+#: builtin/am.c:2294 builtin/apply.c:4578
 msgid "root"
 msgstr "根目录"
 
-#: builtin/am.c:2265 builtin/am.c:2268 builtin/apply.c:4525
-#: builtin/apply.c:4528 builtin/clone.c:85 builtin/fetch.c:93
-#: builtin/pull.c:167
+#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516
+#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93
+#: builtin/pull.c:167 builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
 msgid "path"
 msgstr "路径"
 
-#: builtin/am.c:2271 builtin/fmt-merge-msg.c:669 builtin/fmt-merge-msg.c:672
-#: builtin/grep.c:698 builtin/merge.c:198 builtin/pull.c:127
-#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:664
-#: builtin/show-ref.c:180 builtin/tag.c:591 parse-options.h:132
-#: parse-options.h:134 parse-options.h:243
+#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
+#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127
+#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645
+#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
+#: parse-options.h:134 parse-options.h:244
 msgid "n"
 msgstr "n"
 
-#: builtin/am.c:2274 builtin/apply.c:4531
+#: builtin/am.c:2306 builtin/apply.c:4522
 msgid "num"
 msgstr "数字"
 
-#: builtin/am.c:2277 builtin/for-each-ref.c:34 builtin/replace.c:438
+#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
 msgid "format"
 msgstr "格式"
 
-#: builtin/am.c:2278
+#: builtin/am.c:2310
 msgid "format the patch(es) are in"
 msgstr "补丁的格式"
 
-#: builtin/am.c:2284
+#: builtin/am.c:2316
 msgid "override error message when patch failure occurs"
 msgstr "打补丁失败时显示的错误信息"
 
-#: builtin/am.c:2286
+#: builtin/am.c:2318
 msgid "continue applying patches after resolving a conflict"
 msgstr "冲突解决后继续应用补丁"
 
-#: builtin/am.c:2289
+#: builtin/am.c:2321
 msgid "synonyms for --continue"
 msgstr "和 --continue 同义"
 
-#: builtin/am.c:2292
+#: builtin/am.c:2324
 msgid "skip the current patch"
 msgstr "跳过当前补丁"
 
-#: builtin/am.c:2295
+#: builtin/am.c:2327
 msgid "restore the original branch and abort the patching operation."
 msgstr "恢复原始分支并终止打补丁操作。"
 
-#: builtin/am.c:2299
+#: builtin/am.c:2331
 msgid "lie about committer date"
 msgstr "将作者日期作为提交日期"
 
-#: builtin/am.c:2301
+#: builtin/am.c:2333
 msgid "use current timestamp for author date"
 msgstr "用当前时间作为作者日期"
 
-#: builtin/am.c:2303 builtin/commit.c:1590 builtin/merge.c:225
-#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:606
+#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225
+#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355
 msgid "key-id"
 msgstr "key-id"
 
-#: builtin/am.c:2304
+#: builtin/am.c:2336
 msgid "GPG-sign commits"
 msgstr "使用 GPG 签名提交"
 
-#: builtin/am.c:2307
+#: builtin/am.c:2339
 msgid "(internal use for git-rebase)"
 msgstr "(内部使用,用于 git-rebase)"
 
-#: builtin/am.c:2322
+#: builtin/am.c:2354
 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."
@@ -2784,16 +2833,16 @@
 "参数 -b/--binary 已经很长时间不做任何实质操作了,并且将被移除。\n"
 "请不要再使用它了。"
 
-#: builtin/am.c:2329
+#: builtin/am.c:2361
 msgid "failed to read the index"
 msgstr "无法读取索引"
 
-#: builtin/am.c:2344
+#: builtin/am.c:2376
 #, c-format
 msgid "previous rebase directory %s still exists but mbox given."
 msgstr "之前的变基目录 %s 仍然存在,但却提供了 mbox。"
 
-#: builtin/am.c:2368
+#: builtin/am.c:2400
 #, c-format
 msgid ""
 "Stray %s directory found.\n"
@@ -2802,7 +2851,7 @@
 "发现了错误的 %s 目录。\n"
 "使用 \"git am --abort\" 删除它。"
 
-#: builtin/am.c:2374
+#: builtin/am.c:2406
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr "解决操作未进行,我们不会继续。"
 
@@ -2810,62 +2859,62 @@
 msgid "git apply [<options>] [<patch>...]"
 msgstr "git apply [<选项>] [<补丁>...]"
 
-#: builtin/apply.c:112
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
 msgstr "未能识别的空白字符选项 '%s'"
 
-#: builtin/apply.c:127
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "未能识别的空白字符忽略选项 '%s'"
 
-#: builtin/apply.c:822
+#: builtin/apply.c:818
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "无法准备时间戳正则表达式 %s"
 
-#: builtin/apply.c:831
+#: builtin/apply.c:827
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "regexec 返回 %d,输入为:%s"
 
-#: builtin/apply.c:912
+#: builtin/apply.c:908
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "不能在补丁的第 %d 行找到文件名"
 
-#: builtin/apply.c:944
+#: builtin/apply.c:940
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr "git apply:错误的 git-diff - 应为 /dev/null,但在第 %2$d 行得到 %1$s"
 
-#: builtin/apply.c:948
+#: builtin/apply.c:944
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr "git apply:错误的 git-diff - 第 %d 行上新文件名不一致"
 
-#: builtin/apply.c:949
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr "git apply:错误的 git-diff - 第 %d 行上旧文件名不一致"
 
-#: builtin/apply.c:956
+#: builtin/apply.c:952
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr "git apply:错误的 git-diff - 第 %d 行处应为 /dev/null"
 
-#: builtin/apply.c:1419
+#: builtin/apply.c:1415
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "recount:意外的行:%.*s"
 
-#: builtin/apply.c:1476
+#: builtin/apply.c:1472
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "第 %d 行的补丁片段没有头信息:%.*s"
 
-#: builtin/apply.c:1493
+#: builtin/apply.c:1489
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2876,77 +2925,77 @@
 msgstr[0] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)"
 msgstr[1] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)"
 
-#: builtin/apply.c:1659
+#: builtin/apply.c:1655
 msgid "new file depends on old contents"
 msgstr "新文件依赖旧内容"
 
-#: builtin/apply.c:1661
+#: builtin/apply.c:1657
 msgid "deleted file still has contents"
 msgstr "删除的文件仍有内容"
 
-#: builtin/apply.c:1687
+#: builtin/apply.c:1683
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "补丁在第 %d 行损坏"
 
-#: builtin/apply.c:1723
+#: builtin/apply.c:1719
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "新文件 %s 依赖旧内容"
 
-#: builtin/apply.c:1725
+#: builtin/apply.c:1721
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "删除的文件 %s 仍有内容"
 
-#: builtin/apply.c:1728
+#: builtin/apply.c:1724
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "** 警告:文件 %s 成为空文件但并未删除"
 
-#: builtin/apply.c:1874
+#: builtin/apply.c:1870
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "二进制补丁在第 %d 行损坏:%.*s"
 
-#: builtin/apply.c:1903
+#: builtin/apply.c:1899
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "未能识别的二进制补丁位于第 %d 行"
 
-#: builtin/apply.c:2054
+#: builtin/apply.c:2050
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "补丁文件的第 %d 行只有垃圾数据"
 
-#: builtin/apply.c:2144
+#: builtin/apply.c:2140
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "无法读取符号链接 %s"
 
-#: builtin/apply.c:2148
+#: builtin/apply.c:2144
 #, c-format
 msgid "unable to open or read %s"
 msgstr "不能打开或读取 %s"
 
-#: builtin/apply.c:2781
+#: builtin/apply.c:2777
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "无效的行首字符:'%c'"
 
-#: builtin/apply.c:2900
+#: builtin/apply.c:2896
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
 msgstr[0] "块 #%d 成功应用于 %d(偏移 %d 行)"
 msgstr[1] "块 #%d 成功应用于 %d(偏移 %d 行)"
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2908
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr "上下文减少到(%ld/%ld)以在第 %d 行应用补丁片段"
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2914
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -2955,319 +3004,319 @@
 "当查询:\n"
 "%.*s"
 
-#: builtin/apply.c:2938
+#: builtin/apply.c:2934
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "缺失 '%s' 的二进制补丁数据"
 
-#: builtin/apply.c:3039
+#: builtin/apply.c:3035
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "二进制补丁未应用到 '%s'"
 
-#: builtin/apply.c:3045
+#: builtin/apply.c:3041
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr "到 '%s' 的二进制补丁产生了不正确的结果(应为 %s,却为 %s)"
 
-#: builtin/apply.c:3066
+#: builtin/apply.c:3062
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "打补丁失败:%s:%ld"
 
-#: builtin/apply.c:3190
+#: builtin/apply.c:3186
 #, c-format
 msgid "cannot checkout %s"
 msgstr "不能检出 %s"
 
-#: builtin/apply.c:3235 builtin/apply.c:3246 builtin/apply.c:3291
+#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
 #, c-format
 msgid "read of %s failed"
 msgstr "读取 %s 失败"
 
-#: builtin/apply.c:3243
+#: builtin/apply.c:3239
 #, c-format
 msgid "reading from '%s' beyond a symbolic link"
 msgstr "读取位于符号链接中的 '%s'"
 
-#: builtin/apply.c:3271 builtin/apply.c:3493
+#: builtin/apply.c:3267 builtin/apply.c:3489
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "路径 %s 已经被重命名/删除"
 
-#: builtin/apply.c:3352 builtin/apply.c:3507
+#: builtin/apply.c:3348 builtin/apply.c:3503
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s:不存在于索引中"
 
-#: builtin/apply.c:3356 builtin/apply.c:3499 builtin/apply.c:3521
+#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
 #, c-format
 msgid "%s: %s"
 msgstr "%s:%s"
 
-#: builtin/apply.c:3361 builtin/apply.c:3515
+#: builtin/apply.c:3357 builtin/apply.c:3511
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s:和索引不匹配"
 
-#: builtin/apply.c:3463
+#: builtin/apply.c:3459
 msgid "removal patch leaves file contents"
 msgstr "移除补丁仍留下了文件内容"
 
-#: builtin/apply.c:3532
+#: builtin/apply.c:3528
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s:错误类型"
 
-#: builtin/apply.c:3534
+#: builtin/apply.c:3530
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s 的类型是 %o,应为 %o"
 
-#: builtin/apply.c:3693 builtin/apply.c:3695
+#: builtin/apply.c:3689 builtin/apply.c:3691
 #, c-format
 msgid "invalid path '%s'"
 msgstr "无效路径 '%s'"
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3746
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s:已经存在于索引中"
 
-#: builtin/apply.c:3753
+#: builtin/apply.c:3749
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s:已经存在于工作区中"
 
-#: builtin/apply.c:3773
+#: builtin/apply.c:3769
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "%2$s 的新模式(%1$o)和旧模式(%3$o)不匹配"
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3774
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr "%2$s 的新模式(%1$o)和 %4$s 的旧模式(%3$o)不匹配"
 
-#: builtin/apply.c:3798
+#: builtin/apply.c:3794
 #, c-format
 msgid "affected file '%s' is beyond a symbolic link"
 msgstr "受影响的文件 '%s' 位于符号链接中"
 
-#: builtin/apply.c:3802
+#: builtin/apply.c:3798
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s:补丁未应用"
 
-#: builtin/apply.c:3816
+#: builtin/apply.c:3812
 #, c-format
 msgid "Checking patch %s..."
 msgstr "检查补丁 %s..."
 
-#: builtin/apply.c:3909 builtin/checkout.c:232 builtin/reset.c:135
+#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "对路径 '%s' 的 make_cache_entry 操作失败"
 
-#: builtin/apply.c:4052
+#: builtin/apply.c:4048
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "不能从索引中移除 %s"
 
-#: builtin/apply.c:4081
+#: builtin/apply.c:4077
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "子模组 %s 损坏的补丁"
 
-#: builtin/apply.c:4085
+#: builtin/apply.c:4081
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "不能枚举新建文件 '%s' 的状态"
 
-#: builtin/apply.c:4090
+#: builtin/apply.c:4086
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr "不能为新建文件 %s 创建后端存储"
 
-#: builtin/apply.c:4093 builtin/apply.c:4201
+#: builtin/apply.c:4089 builtin/apply.c:4197
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "无法为 %s 添加缓存条目"
 
-#: builtin/apply.c:4126
+#: builtin/apply.c:4122
 #, c-format
 msgid "closing file '%s'"
 msgstr "关闭文件 '%s'"
 
-#: builtin/apply.c:4175
+#: builtin/apply.c:4171
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "不能写文件 '%s' 权限 %o"
 
-#: builtin/apply.c:4262
+#: builtin/apply.c:4258
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "成功应用补丁 %s。"
 
-#: builtin/apply.c:4270
+#: builtin/apply.c:4266
 msgid "internal error"
 msgstr "内部错误"
 
-#: builtin/apply.c:4273
+#: builtin/apply.c:4269
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] "应用 %%s 个补丁,其中 %d 个被拒绝..."
 msgstr[1] "应用 %%s 个补丁,其中 %d 个被拒绝..."
 
-#: builtin/apply.c:4283
+#: builtin/apply.c:4279
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "截短 .rej 文件名为 %.*s.rej"
 
-#: builtin/apply.c:4304
+#: builtin/apply.c:4300
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "第 #%d 个片段成功应用。"
 
-#: builtin/apply.c:4307
+#: builtin/apply.c:4303
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "拒绝第 #%d 个片段。"
 
-#: builtin/apply.c:4397
+#: builtin/apply.c:4393
 msgid "unrecognized input"
 msgstr "未能识别的输入"
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4404
 msgid "unable to read index file"
 msgstr "无法读取索引文件"
 
-#: builtin/apply.c:4526
+#: builtin/apply.c:4517
 msgid "don't apply changes matching the given path"
 msgstr "不要应用与给出路径向匹配的变更"
 
-#: builtin/apply.c:4529
+#: builtin/apply.c:4520
 msgid "apply changes matching the given path"
 msgstr "应用与给出路径向匹配的变更"
 
-#: builtin/apply.c:4532
+#: builtin/apply.c:4523
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "从传统的 diff 路径中移除指定数量的前导斜线"
 
-#: builtin/apply.c:4535
+#: builtin/apply.c:4526
 msgid "ignore additions made by the patch"
 msgstr "忽略补丁中的添加的文件"
 
-#: builtin/apply.c:4537
+#: builtin/apply.c:4528
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr "不应用补丁,而是显示输入的差异统计(diffstat)"
 
-#: builtin/apply.c:4541
+#: builtin/apply.c:4532
 msgid "show number of added and deleted lines in decimal notation"
 msgstr "以十进制数显示添加和删除的行数"
 
-#: builtin/apply.c:4543
+#: builtin/apply.c:4534
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "不应用补丁,而是显示输入的概要"
 
-#: builtin/apply.c:4545
+#: builtin/apply.c:4536
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "不应用补丁,而是查看补丁是否可应用"
 
-#: builtin/apply.c:4547
+#: builtin/apply.c:4538
 msgid "make sure the patch is applicable to the current index"
 msgstr "确认补丁可以应用到当前索引"
 
-#: builtin/apply.c:4549
+#: builtin/apply.c:4540
 msgid "apply a patch without touching the working tree"
 msgstr "应用补丁而不修改工作区"
 
-#: builtin/apply.c:4551
+#: builtin/apply.c:4542
 msgid "accept a patch that touches outside the working area"
 msgstr "接受修改工作区之外文件的补丁"
 
-#: builtin/apply.c:4553
+#: builtin/apply.c:4544
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr "还应用此补丁(与 --stat/--summary/--check 选项同时使用)"
 
-#: builtin/apply.c:4555
+#: builtin/apply.c:4546
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "如果一个补丁不能应用则尝试三方合并"
 
-#: builtin/apply.c:4557
+#: builtin/apply.c:4548
 msgid "build a temporary index based on embedded index information"
 msgstr "创建一个临时索引基于嵌入的索引信息"
 
-#: builtin/apply.c:4559 builtin/checkout-index.c:198 builtin/ls-files.c:412
+#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412
 msgid "paths are separated with NUL character"
 msgstr "路径以 NUL 字符分隔"
 
-#: builtin/apply.c:4562
+#: builtin/apply.c:4553
 msgid "ensure at least <n> lines of context match"
 msgstr "确保至少匹配 <n> 行上下文"
 
-#: builtin/apply.c:4564
+#: builtin/apply.c:4555
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "检查新增和修改的行中间的空白字符滥用"
 
-#: builtin/apply.c:4567 builtin/apply.c:4570
+#: builtin/apply.c:4558 builtin/apply.c:4561
 msgid "ignore changes in whitespace when finding context"
 msgstr "查找上下文时忽略空白字符的变更"
 
-#: builtin/apply.c:4573
+#: builtin/apply.c:4564
 msgid "apply the patch in reverse"
 msgstr "反向应用补丁"
 
-#: builtin/apply.c:4575
+#: builtin/apply.c:4566
 msgid "don't expect at least one line of context"
 msgstr "无需至少一行上下文"
 
-#: builtin/apply.c:4577
+#: builtin/apply.c:4568
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "将拒绝的补丁片段保存在对应的 *.rej 文件中"
 
-#: builtin/apply.c:4579
+#: builtin/apply.c:4570
 msgid "allow overlapping hunks"
 msgstr "允许重叠的补丁片段"
 
-#: builtin/apply.c:4582
+#: builtin/apply.c:4573
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr "允许不正确的文件末尾换行符"
 
-#: builtin/apply.c:4585
+#: builtin/apply.c:4576
 msgid "do not trust the line counts in the hunk headers"
 msgstr "不信任补丁片段的头信息中的行号"
 
-#: builtin/apply.c:4588
+#: builtin/apply.c:4579
 msgid "prepend <root> to all filenames"
 msgstr "为所有文件名前添加 <根目录>"
 
-#: builtin/apply.c:4610
+#: builtin/apply.c:4601
 msgid "--3way outside a repository"
 msgstr "--3way 在一个仓库之外"
 
-#: builtin/apply.c:4618
+#: builtin/apply.c:4609
 msgid "--index outside a repository"
 msgstr "--index 在一个仓库之外"
 
-#: builtin/apply.c:4621
+#: builtin/apply.c:4612
 msgid "--cached outside a repository"
 msgstr "--cached 在一个仓库之外"
 
-#: builtin/apply.c:4640
+#: builtin/apply.c:4631
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "不能打开补丁 '%s'"
 
-#: builtin/apply.c:4654
+#: builtin/apply.c:4645
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "抑制下仍有 %d 个空白字符误用"
 msgstr[1] "抑制下仍有 %d 个空白字符误用"
 
-#: builtin/apply.c:4660 builtin/apply.c:4670
+#: builtin/apply.c:4651 builtin/apply.c:4661
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -3329,95 +3378,95 @@
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<版本选项> 的文档记录在 git-rev-list(1) 中"
 
-#: builtin/blame.c:2500
+#: builtin/blame.c:2519
 msgid "Show blame entries as we find them, incrementally"
 msgstr "增量式地显示发现的 blame 条目"
 
-#: builtin/blame.c:2501
+#: builtin/blame.c:2520
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "边界提交显示空的 SHA-1(默认:关闭)"
 
-#: builtin/blame.c:2502
+#: builtin/blame.c:2521
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "不把根提交作为边界(默认:关闭)"
 
-#: builtin/blame.c:2503
+#: builtin/blame.c:2522
 msgid "Show work cost statistics"
 msgstr "显示命令消耗统计"
 
-#: builtin/blame.c:2504
+#: builtin/blame.c:2523
 msgid "Show output score for blame entries"
 msgstr "显示判断 blame 条目位移的得分诊断信息"
 
-#: builtin/blame.c:2505
+#: builtin/blame.c:2524
 msgid "Show original filename (Default: auto)"
 msgstr "显示原始文件名(默认:自动)"
 
-#: builtin/blame.c:2506
+#: builtin/blame.c:2525
 msgid "Show original linenumber (Default: off)"
 msgstr "显示原始的行号(默认:关闭)"
 
-#: builtin/blame.c:2507
+#: builtin/blame.c:2526
 msgid "Show in a format designed for machine consumption"
 msgstr "显示为一个适合机器读取的格式"
 
-#: builtin/blame.c:2508
+#: builtin/blame.c:2527
 msgid "Show porcelain format with per-line commit information"
 msgstr "为每一行显示机器适用的提交信息"
 
-#: builtin/blame.c:2509
+#: builtin/blame.c:2528
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "使用和 git-annotate 相同的输出模式(默认:关闭)"
 
-#: builtin/blame.c:2510
+#: builtin/blame.c:2529
 msgid "Show raw timestamp (Default: off)"
 msgstr "显示原始时间戳(默认:关闭)"
 
-#: builtin/blame.c:2511
+#: builtin/blame.c:2530
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "显示长的 SHA1 提交号(默认:关闭)"
 
-#: builtin/blame.c:2512
+#: builtin/blame.c:2531
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "隐藏作者名字和时间戳(默认:关闭)"
 
-#: builtin/blame.c:2513
+#: builtin/blame.c:2532
 msgid "Show author email instead of name (Default: off)"
 msgstr "显示作者的邮箱而不是名字(默认:关闭)"
 
-#: builtin/blame.c:2514
+#: builtin/blame.c:2533
 msgid "Ignore whitespace differences"
 msgstr "忽略空白差异"
 
-#: builtin/blame.c:2515
+#: builtin/blame.c:2534
 msgid "Spend extra cycles to find better match"
 msgstr "花费额外的循环来找到更好的匹配"
 
-#: builtin/blame.c:2516
+#: builtin/blame.c:2535
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "使用来自 <文件> 的修订集而不是调用 git-rev-list"
 
-#: builtin/blame.c:2517
+#: builtin/blame.c:2536
 msgid "Use <file>'s contents as the final image"
 msgstr "使用 <文件> 的内容作为最终的图片"
 
-#: builtin/blame.c:2518 builtin/blame.c:2519
+#: builtin/blame.c:2537 builtin/blame.c:2538
 msgid "score"
 msgstr "得分"
 
-#: builtin/blame.c:2518
+#: builtin/blame.c:2537
 msgid "Find line copies within and across files"
 msgstr "找到文件内及跨文件的行拷贝"
 
-#: builtin/blame.c:2519
+#: builtin/blame.c:2538
 msgid "Find line movements within and across files"
 msgstr "找到文件内及跨文件的行移动"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2520
+#: builtin/blame.c:2539
 msgid "Process only line range n,m, counting from 1"
 msgstr "只处理行范围在 n 和 m 之间的,从 1 开始"
 
@@ -3427,28 +3476,32 @@
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2601
+#: builtin/blame.c:2620
 msgid "4 years, 11 months ago"
 msgstr "4 年 11 个月前"
 
-#: builtin/branch.c:24
+#: builtin/branch.c:25
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<选项>] [-r | -a] [--merged | --no-merged]"
 
-#: builtin/branch.c:25
+#: builtin/branch.c:26
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<选项>] [-l] [-f] <分支名> [<起始点>]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<选项>] [-r] (-d | -D) <分支名>..."
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [<选项>] (-m | -M) [<旧分支>] <新分支>"
 
+#: builtin/branch.c:29
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr "git branch [<选项>] [-r | -a] [--points-at]"
+
 #  译者:保持原换行格式,在输出时 %s 的替代内容会让字符串变长
-#: builtin/branch.c:150
+#: builtin/branch.c:142
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -3458,7 +3511,7 @@
 "         '%s',但未合并到 HEAD。"
 
 #  译者:保持原换行格式,在输出时 %s 的替代内容会让字符串变长
-#: builtin/branch.c:154
+#: builtin/branch.c:146
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -3467,12 +3520,12 @@
 "并未删除分支 '%s', 虽然它已经合并到 HEAD,\n"
 "         然而却尚未被合并到分支 '%s' 。"
 
-#: builtin/branch.c:168
+#: builtin/branch.c:160
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "无法查询 '%s' 指向的提交对象"
 
-#: builtin/branch.c:172
+#: builtin/branch.c:164
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -3481,343 +3534,335 @@
 "分支 '%s' 没有完全合并。\n"
 "如果您确认要删除它,执行 'git branch -D %s'。"
 
-#: builtin/branch.c:185
+#: builtin/branch.c:177
 msgid "Update of config-file failed"
 msgstr "无法更新 config 文件"
 
-#: builtin/branch.c:213
+#: builtin/branch.c:205
 msgid "cannot use -a with -d"
 msgstr "不能将 -a 和 -d 同时使用"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:211
 msgid "Couldn't look up commit object for HEAD"
 msgstr "无法查询 HEAD 指向的提交对象"
 
-#: builtin/branch.c:227
+#: builtin/branch.c:219
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr "无法删除您当前所在的分支 '%s'。"
 
-#: builtin/branch.c:243
+#: builtin/branch.c:235
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "未能找到远程跟踪分支 '%s'。"
 
-#: builtin/branch.c:244
+#: builtin/branch.c:236
 #, c-format
 msgid "branch '%s' not found."
 msgstr "分支 '%s' 未发现。"
 
-#: builtin/branch.c:259
+#: builtin/branch.c:251
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "无法删除远程跟踪分支 '%s'"
 
-#: builtin/branch.c:260
+#: builtin/branch.c:252
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "无法删除分支 '%s'"
 
-#: builtin/branch.c:267
+#: builtin/branch.c:259
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "已删除远程跟踪分支 %s(曾为 %s)。\n"
 
-#: builtin/branch.c:268
+#: builtin/branch.c:260
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "已删除分支 %s(曾为 %s)。\n"
 
-#: builtin/branch.c:369
-#, c-format
-msgid "branch '%s' does not point at a commit"
-msgstr "分支 '%s' 未指向一个提交"
-
-#: builtin/branch.c:452
+#: builtin/branch.c:303
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: 丢失]"
 
-#: builtin/branch.c:457
+#: builtin/branch.c:308
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:462
+#: builtin/branch.c:313
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s:落后 %d]"
 
-#: builtin/branch.c:464
+#: builtin/branch.c:315
 #, c-format
 msgid "[behind %d]"
 msgstr "[落后 %d]"
 
-#: builtin/branch.c:468
+#: builtin/branch.c:319
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s:领先 %d]"
 
-#: builtin/branch.c:470
+#: builtin/branch.c:321
 #, c-format
 msgid "[ahead %d]"
 msgstr "[领先 %d]"
 
-#: builtin/branch.c:473
+#: builtin/branch.c:324
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s:领先 %d,落后 %d]"
 
-#: builtin/branch.c:476
+#: builtin/branch.c:327
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[领先 %d,落后 %d]"
 
-#: builtin/branch.c:489
+#: builtin/branch.c:340
 msgid " **** invalid ref ****"
 msgstr " **** 无效引用 ****"
 
-#: builtin/branch.c:580
+#: builtin/branch.c:366
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(非分支,正变基 %s)"
 
-#: builtin/branch.c:583
+#: builtin/branch.c:369
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(非分支,二分查找开始于 %s)"
 
-#: builtin/branch.c:589
+#: builtin/branch.c:375
 #, c-format
 msgid "(HEAD detached at %s)"
 msgstr "(头指针分离于 %s)"
 
-#: builtin/branch.c:592
+#: builtin/branch.c:378
 #, c-format
 msgid "(HEAD detached from %s)"
 msgstr "(头指针分离自 %s)"
 
-#: builtin/branch.c:596
+#: builtin/branch.c:382
 msgid "(no branch)"
 msgstr "(非分支)"
 
-#: builtin/branch.c:643
-#, c-format
-msgid "object '%s' does not point to a commit"
-msgstr "对象 '%s' 没有指向一个提交"
-
-#: builtin/branch.c:691
-msgid "some refs could not be read"
-msgstr "一些引用不能读取"
-
-#: builtin/branch.c:704
+#: builtin/branch.c:524
 msgid "cannot rename the current branch while not on any."
 msgstr "无法重命名当前分支因为不处于任何分支上。"
 
-#: builtin/branch.c:714
+#: builtin/branch.c:534
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "无效的分支名:'%s'"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:549
 msgid "Branch rename failed"
 msgstr "分支重命名失败"
 
-#: builtin/branch.c:733
+#: builtin/branch.c:553
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "重命名掉一个错误命名的旧分支 '%s'"
 
-#: builtin/branch.c:737
+#: builtin/branch.c:557
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "分支重命名为 %s,但 HEAD 没有更新!"
 
-#: builtin/branch.c:744
+#: builtin/branch.c:564
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "分支被重命名,但更新 config 文件失败"
 
-#: builtin/branch.c:759
-#, c-format
-msgid "malformed object name %s"
-msgstr "非法的对象名 %s"
-
-#: builtin/branch.c:781
+#: builtin/branch.c:587
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr "不能写分支描述模版:%s"
 
-#: builtin/branch.c:811
+#: builtin/branch.c:616
 msgid "Generic options"
 msgstr "通用选项"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:618
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "显示哈希值和主题,若参数出现两次则显示上游分支"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:619
 msgid "suppress informational messages"
 msgstr "不显示信息"
 
-#: builtin/branch.c:815
+#: builtin/branch.c:620
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "设置跟踪模式(参见 git-pull(1))"
 
-#: builtin/branch.c:817
+#: builtin/branch.c:622
 msgid "change upstream info"
 msgstr "改变上游信息"
 
-#: builtin/branch.c:821
+#: builtin/branch.c:626
 msgid "use colored output"
 msgstr "使用彩色输出"
 
-#: builtin/branch.c:822
+#: builtin/branch.c:627
 msgid "act on remote-tracking branches"
 msgstr "作用于远程跟踪分支"
 
-#: builtin/branch.c:825 builtin/branch.c:831 builtin/branch.c:852
-#: builtin/branch.c:858 builtin/commit.c:1580 builtin/commit.c:1581
-#: builtin/commit.c:1582 builtin/commit.c:1583 builtin/tag.c:618
-#: builtin/tag.c:624
-msgid "commit"
-msgstr "提交"
-
-#: builtin/branch.c:826 builtin/branch.c:832
+#: builtin/branch.c:629 builtin/branch.c:630
 msgid "print only branches that contain the commit"
 msgstr "只打印包含该提交的分支"
 
-#: builtin/branch.c:838
+#: builtin/branch.c:633
 msgid "Specific git-branch actions:"
 msgstr "具体的 git-branch 动作:"
 
-#: builtin/branch.c:839
+#: builtin/branch.c:634
 msgid "list both remote-tracking and local branches"
 msgstr "列出远程跟踪及本地分支"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:636
 msgid "delete fully merged branch"
 msgstr "删除完全合并的分支"
 
-#: builtin/branch.c:842
+#: builtin/branch.c:637
 msgid "delete branch (even if not merged)"
 msgstr "删除分支(即使没有合并)"
 
-#: builtin/branch.c:843
+#: builtin/branch.c:638
 msgid "move/rename a branch and its reflog"
 msgstr "移动/重命名一个分支,以及它的引用日志"
 
-#: builtin/branch.c:844
+#: builtin/branch.c:639
 msgid "move/rename a branch, even if target exists"
 msgstr "移动/重命名一个分支,即使目标已存在"
 
-#: builtin/branch.c:845
+#: builtin/branch.c:640
 msgid "list branch names"
 msgstr "列出分支名"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:641
 msgid "create the branch's reflog"
 msgstr "创建分支的引用日志"
 
-#: builtin/branch.c:848
+#: builtin/branch.c:643
 msgid "edit the description for the branch"
 msgstr "标记分支的描述"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:644
 msgid "force creation, move/rename, deletion"
 msgstr "强制创建、移动/重命名、删除"
 
-#: builtin/branch.c:852
-msgid "print only not merged branches"
-msgstr "只打印没有合并的分支"
+#: builtin/branch.c:645
+msgid "print only branches that are merged"
+msgstr "只打印已经合并的分支"
 
-#: builtin/branch.c:858
-msgid "print only merged branches"
-msgstr "只打印合并的分支"
+#: builtin/branch.c:646
+msgid "print only branches that are not merged"
+msgstr "只打印尚未合并的分支"
 
-#: builtin/branch.c:862
+#: builtin/branch.c:647
 msgid "list branches in columns"
 msgstr "以列的方式显示分支"
 
-#: builtin/branch.c:875
+#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
+msgstr "key"
+
+#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
+msgstr "排序的字段名"
+
+#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398
+#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564
+#: builtin/tag.c:369
+msgid "object"
+msgstr "对象"
+
+#: builtin/branch.c:652
+msgid "print only branches of the object"
+msgstr "只打印指向该对象的分支"
+
+#: builtin/branch.c:670
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "无法将 HEAD 解析为有效引用。"
 
-#: builtin/branch.c:879 builtin/clone.c:690
+#: builtin/branch.c:674 builtin/clone.c:697
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD 没有位于 /refs/heads 之下!"
 
-#: builtin/branch.c:901
+#: builtin/branch.c:694
 msgid "--column and --verbose are incompatible"
 msgstr "--column 和 --verbose 不兼容"
 
-#: builtin/branch.c:912 builtin/branch.c:951
+#: builtin/branch.c:705 builtin/branch.c:747
 msgid "branch name required"
 msgstr "必须提供分支名"
 
-#: builtin/branch.c:927
+#: builtin/branch.c:723
 msgid "Cannot give description to detached HEAD"
 msgstr "不能向分离头指针提供描述"
 
-#: builtin/branch.c:932
+#: builtin/branch.c:728
 msgid "cannot edit description of more than one branch"
 msgstr "不能为一个以上的分支编辑描述"
 
-#: builtin/branch.c:939
+#: builtin/branch.c:735
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "分支 '%s' 尚无提交。"
 
-#: builtin/branch.c:942
+#: builtin/branch.c:738
 #, c-format
 msgid "No branch named '%s'."
 msgstr "没有分支 '%s'。"
 
-#: builtin/branch.c:957
+#: builtin/branch.c:753
 msgid "too many branches for a rename operation"
 msgstr "为重命名操作提供了太多的分支名"
 
-#: builtin/branch.c:962
+#: builtin/branch.c:758
 msgid "too many branches to set new upstream"
 msgstr "为设置新上游提供了太多的分支名"
 
-#: builtin/branch.c:966
+#: builtin/branch.c:762
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr "无法设置 HEAD 的上游为 %s,因为 HEAD 没有指向任何分支。"
 
-#: builtin/branch.c:969 builtin/branch.c:991 builtin/branch.c:1012
+#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808
 #, c-format
 msgid "no such branch '%s'"
 msgstr "没有此分支 '%s'"
 
-#: builtin/branch.c:973
+#: builtin/branch.c:769
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "分支 '%s' 不存在"
 
-#: builtin/branch.c:985
+#: builtin/branch.c:781
 msgid "too many branches to unset upstream"
 msgstr "为取消上游设置操作提供了太多的分支名"
 
-#: builtin/branch.c:989
+#: builtin/branch.c:785
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr "无法取消 HEAD 的上游设置因为它没有指向一个分支"
 
-#: builtin/branch.c:995
+#: builtin/branch.c:791
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "分支 '%s' 没有上游信息"
 
-#: builtin/branch.c:1009
+#: builtin/branch.c:805
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "手工创建 'HEAD' 没有意义"
 
-#: builtin/branch.c:1015
+#: builtin/branch.c:811
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr "'git branch' 的 -a 和 -r 选项带一个分支名参数没有意义"
 
-#: builtin/branch.c:1018
+#: builtin/branch.c:814
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3825,7 +3870,7 @@
 msgstr ""
 "选项 --set-upstream 已弃用并将被移除。考虑使用 --track 或 --set-upstream-to\n"
 
-#: builtin/branch.c:1035
+#: builtin/branch.c:831
 #, c-format
 msgid ""
 "\n"
@@ -3836,12 +3881,12 @@
 "如果你想用 '%s' 跟踪 '%s', 这么做:\n"
 "\n"
 
-#: builtin/branch.c:1036
+#: builtin/branch.c:832
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr "    git branch -d %s\n"
 
-#: builtin/branch.c:1037
+#: builtin/branch.c:833
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr "    git branch --set-upstream-to %s\n"
@@ -3868,11 +3913,8 @@
 ">|--textconv) <对象>"
 
 #: builtin/cat-file.c:429
-msgid ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <list-of-"
-"objects>"
-msgstr ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] < <对象列表>"
+msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
 
 #: builtin/cat-file.c:466
 msgid "<type> can be one of: blob, tree, commit, tag"
@@ -3927,8 +3969,8 @@
 msgstr "git check-attr [-a | --all | <属性>...] [--] <路径名>..."
 
 #: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...] < <list-of-paths>"
-msgstr "git check-attr --stdin [-z] [-a | --all | <属性>...] < <路径列表>"
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+msgstr "git check-attr --stdin [-z] [-a | --all | <属性>...]"
 
 #: builtin/check-attr.c:19
 msgid "report all attributes set on file"
@@ -3946,7 +3988,7 @@
 msgid "terminate input and output records by a NUL character"
 msgstr "输入和输出的记录使用 NUL 字符终结"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1133 builtin/gc.c:267
+#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "不显示进度报告"
 
@@ -4032,6 +4074,8 @@
 msgstr "将内容写入临时文件"
 
 #: builtin/checkout-index.c:204 builtin/column.c:30
+#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181
 msgid "string"
 msgstr "字符串"
 
@@ -4051,106 +4095,106 @@
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<选项>] [<分支>] -- <文件>..."
 
-#: builtin/checkout.c:133 builtin/checkout.c:166
+#: builtin/checkout.c:134 builtin/checkout.c:167
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "路径 '%s' 没有我们的版本"
 
-#: builtin/checkout.c:135 builtin/checkout.c:168
+#: builtin/checkout.c:136 builtin/checkout.c:169
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "路径 '%s' 没有他们的版本"
 
-#: builtin/checkout.c:151
+#: builtin/checkout.c:152
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "路径 '%s' 没有全部必须的版本"
 
-#: builtin/checkout.c:195
+#: builtin/checkout.c:196
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "路径 '%s' 没有必须的版本"
 
-#: builtin/checkout.c:212
+#: builtin/checkout.c:213
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "path '%s':无法合并"
 
-#: builtin/checkout.c:229
+#: builtin/checkout.c:230
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "无法为 '%s' 添加合并结果"
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
+#: builtin/checkout.c:260
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "'%s' 不能在更新路径时使用"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:263 builtin/checkout.c:266
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' 不能和 %s 同时使用"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:269
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr "不能同时更新路径并切换到分支'%s'。"
 
-#: builtin/checkout.c:279 builtin/checkout.c:473
+#: builtin/checkout.c:280 builtin/checkout.c:474
 msgid "corrupt index file"
 msgstr "损坏的索引文件"
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:340 builtin/checkout.c:347
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "路径 '%s' 未合并"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:496
 msgid "you need to resolve your current index first"
 msgstr "您需要先解决当前索引的冲突"
 
-#: builtin/checkout.c:622
+#: builtin/checkout.c:623
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "不能对 '%s' 执行 reflog 操作:%s\n"
 
-#: builtin/checkout.c:660
+#: builtin/checkout.c:661
 msgid "HEAD is now at"
 msgstr "HEAD 目前位于"
 
-#: builtin/checkout.c:667
+#: builtin/checkout.c:668
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "重置分支 '%s'\n"
 
-#: builtin/checkout.c:670
+#: builtin/checkout.c:671
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "已经位于 '%s'\n"
 
-#: builtin/checkout.c:674
+#: builtin/checkout.c:675
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "切换并重置分支 '%s'\n"
 
-#: builtin/checkout.c:676 builtin/checkout.c:1065
+#: builtin/checkout.c:677 builtin/checkout.c:1066
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "切换到一个新分支 '%s'\n"
 
-#: builtin/checkout.c:678
+#: builtin/checkout.c:679
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "切换到分支 '%s'\n"
 
 #  译者:注意保持前导空格
-#: builtin/checkout.c:730
+#: builtin/checkout.c:731
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... 及其它 %d 个。\n"
 
-#: builtin/checkout.c:736
+#: builtin/checkout.c:737
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4171,7 +4215,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:755
+#: builtin/checkout.c:756
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -4198,144 +4242,150 @@
 " git branch <新分支名> %s\n"
 "\n"
 
-#: builtin/checkout.c:791
+#: builtin/checkout.c:792
 msgid "internal error in revision walk"
 msgstr "在版本遍历时遇到内部错误"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:796
 msgid "Previous HEAD position was"
 msgstr "之前的 HEAD 位置是"
 
-#: builtin/checkout.c:822 builtin/checkout.c:1060
+#: builtin/checkout.c:823 builtin/checkout.c:1061
 msgid "You are on a branch yet to be born"
 msgstr "您位于一个尚未初始化的分支"
 
-#: builtin/checkout.c:967
+#: builtin/checkout.c:968
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "只要一个引用,却给出了 %d 个"
 
-#: builtin/checkout.c:1006 builtin/worktree.c:210
+#: builtin/checkout.c:1007 builtin/worktree.c:213
 #, c-format
 msgid "invalid reference: %s"
 msgstr "无效引用:%s"
 
-#: builtin/checkout.c:1035
+#: builtin/checkout.c:1036
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "引用不是一个树:%s"
 
-#: builtin/checkout.c:1074
+#: builtin/checkout.c:1075
 msgid "paths cannot be used with switching branches"
 msgstr "路径不能和切换分支同时使用"
 
-#: builtin/checkout.c:1077 builtin/checkout.c:1081
+#: builtin/checkout.c:1078 builtin/checkout.c:1082
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' 不能和切换分支同时使用"
 
-#: builtin/checkout.c:1085 builtin/checkout.c:1088 builtin/checkout.c:1093
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094
+#: builtin/checkout.c:1097
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' 不能和 '%s' 同时使用"
 
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1102
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "不能切换分支到一个非提交 '%s'"
 
-#: builtin/checkout.c:1134 builtin/checkout.c:1136 builtin/clone.c:83
-#: builtin/remote.c:159 builtin/remote.c:161 builtin/worktree.c:317
-#: builtin/worktree.c:319
+#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320
+#: builtin/worktree.c:322
 msgid "branch"
 msgstr "分支"
 
-#: builtin/checkout.c:1135
+#: builtin/checkout.c:1136
 msgid "create and checkout a new branch"
 msgstr "创建并检出一个新的分支"
 
-#: builtin/checkout.c:1137
+#: builtin/checkout.c:1138
 msgid "create/reset and checkout a branch"
 msgstr "创建/重置并检出一个分支"
 
-#: builtin/checkout.c:1138
+#: builtin/checkout.c:1139
 msgid "create reflog for new branch"
 msgstr "为新的分支创建引用日志"
 
-#: builtin/checkout.c:1139
+#: builtin/checkout.c:1140
 msgid "detach the HEAD at named commit"
 msgstr "成为指向该提交的分离头指针"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "set upstream info for new branch"
 msgstr "为新的分支设置上游信息"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new-branch"
 msgstr "新分支"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1143
 msgid "new unparented branch"
 msgstr "新的没有父提交的分支"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "checkout our version for unmerged files"
 msgstr "对尚未合并的文件检出我们的版本"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "checkout their version for unmerged files"
 msgstr "对尚未合并的文件检出他们的版本"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1148
 msgid "force checkout (throw away local modifications)"
 msgstr "强制检出(丢弃本地修改)"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "perform a 3-way merge with the new branch"
 msgstr "和新的分支执行三方合并"
 
-#: builtin/checkout.c:1149 builtin/merge.c:227
+#: builtin/checkout.c:1150 builtin/merge.c:227
 msgid "update ignored files (default)"
 msgstr "更新忽略的文件(默认)"
 
-#: builtin/checkout.c:1150 builtin/log.c:1264 parse-options.h:249
+#: builtin/checkout.c:1151 builtin/log.c:1266 parse-options.h:250
 msgid "style"
 msgstr "风格"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "conflict style (merge or diff3)"
 msgstr "冲突输出风格(merge 或 diff3)"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "对路径不做稀疏检出的限制"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1157
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "二次猜测'git checkout <无此分支>'"
 
-#: builtin/checkout.c:1158
+#: builtin/checkout.c:1159
 msgid "do not check if another worktree is holding the given ref"
 msgstr "不检查指定的引用是否被其他工作区所占用"
 
-#: builtin/checkout.c:1181
+#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112
+#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:558
+#: builtin/send-pack.c:168
+msgid "force progress reporting"
+msgstr "强制显示进度报告"
+
+#: builtin/checkout.c:1191
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b、-B 和 --orphan 是互斥的"
 
-#: builtin/checkout.c:1198
+#: builtin/checkout.c:1208
 msgid "--track needs a branch name"
 msgstr "--track 需要一个分支名"
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1213
 msgid "Missing branch name; try -b"
 msgstr "缺少分支名;尝试 -b"
 
-#: builtin/checkout.c:1239
+#: builtin/checkout.c:1249
 msgid "invalid path specification"
 msgstr "无效的路径规格"
 
-#: builtin/checkout.c:1246
+#: builtin/checkout.c:1256
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4344,12 +4394,12 @@
 "不能同时更新路径并切换到分支'%s'。\n"
 "您是想要检出 '%s' 但其未能解析为提交么?"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1261
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout:--detach 不能接收路径参数 '%s'"
 
-#: builtin/checkout.c:1255
+#: builtin/checkout.c:1265
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4387,7 +4437,7 @@
 msgid "failed to remove %s"
 msgstr "无法删除 %s"
 
-#: builtin/clean.c:317
+#: builtin/clean.c:315
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -4399,7 +4449,7 @@
 "foo        - 通过标题选择一个选项\n"
 "           - (空)什么也不选择"
 
-#: builtin/clean.c:321
+#: builtin/clean.c:319
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -4419,36 +4469,36 @@
 "*          - 选择所有选项\n"
 "           - (空)结束选择"
 
-#: builtin/clean.c:537
+#: builtin/clean.c:535
 #, c-format
 msgid "Huh (%s)?"
 msgstr "嗯(%s)?"
 
-#: builtin/clean.c:679
+#: builtin/clean.c:677
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "输入模版以排除条目>> "
 
-#: builtin/clean.c:716
+#: builtin/clean.c:714
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "警告:无法找到和 %s 匹配的条目"
 
-#: builtin/clean.c:737
+#: builtin/clean.c:735
 msgid "Select items to delete"
 msgstr "选择要删除的条目"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:778
+#: builtin/clean.c:776
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "删除 %s [y/N]?"
 
-#: builtin/clean.c:803
+#: builtin/clean.c:801
 msgid "Bye."
 msgstr "再见。"
 
-#: builtin/clean.c:811
+#: builtin/clean.c:809
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -4466,69 +4516,69 @@
 "help                - 显示本帮助\n"
 "?                   - 显示如何在提示符下选择的帮助"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:836
 msgid "*** Commands ***"
 msgstr "*** 命令 ***"
 
-#: builtin/clean.c:839
+#: builtin/clean.c:837
 msgid "What now"
 msgstr "请选择"
 
-#: builtin/clean.c:847
+#: builtin/clean.c:845
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "将删除如下条目:"
 msgstr[1] "将删除如下条目:"
 
-#: builtin/clean.c:864
+#: builtin/clean.c:862
 msgid "No more files to clean, exiting."
 msgstr "没有要清理的文件,退出。"
 
-#: builtin/clean.c:895
+#: builtin/clean.c:893
 msgid "do not print names of files removed"
 msgstr "不打印删除文件的名称"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:895
 msgid "force"
 msgstr "强制"
 
-#: builtin/clean.c:898
+#: builtin/clean.c:896
 msgid "interactive cleaning"
 msgstr "交互式清除"
 
-#: builtin/clean.c:900
+#: builtin/clean.c:898
 msgid "remove whole directories"
 msgstr "删除整个目录"
 
-#: builtin/clean.c:901 builtin/describe.c:407 builtin/grep.c:714
-#: builtin/ls-files.c:443 builtin/name-rev.c:311 builtin/show-ref.c:187
+#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709
+#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182
 msgid "pattern"
 msgstr "模式"
 
-#: builtin/clean.c:902
+#: builtin/clean.c:900
 msgid "add <pattern> to ignore rules"
 msgstr "添加 <模式> 到忽略规则"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:901
 msgid "remove ignored files, too"
 msgstr "也删除忽略的文件"
 
-#: builtin/clean.c:905
+#: builtin/clean.c:903
 msgid "remove only ignored files"
 msgstr "只删除忽略的文件"
 
-#: builtin/clean.c:923
+#: builtin/clean.c:921
 msgid "-x and -X cannot be used together"
 msgstr "-x 和 -X 不能同时使用"
 
-#: builtin/clean.c:927
+#: builtin/clean.c:925
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
 msgstr ""
 "clean.requireForce 设置为 true 且未提供 -i、-n 或 -f 选项,拒绝执行清理动作"
 
-#: builtin/clean.c:930
+#: builtin/clean.c:928
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -4539,16 +4589,11 @@
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<选项>] [--] <仓库> [<路径>]"
 
-#: builtin/clone.c:57 builtin/fetch.c:112 builtin/merge.c:224
-#: builtin/pull.c:109 builtin/push.c:560 builtin/send-pack.c:168
-msgid "force progress reporting"
-msgstr "强制显示进度报告"
-
 #: builtin/clone.c:59
 msgid "don't create a checkout"
 msgstr "不创建一个检出"
 
-#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:504
+#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469
 msgid "create a bare repository"
 msgstr "创建一个纯仓库"
 
@@ -4572,15 +4617,15 @@
 msgid "initialize submodules in the clone"
 msgstr "在克隆时初始化子模组"
 
-#: builtin/clone.c:75 builtin/init-db.c:501
+#: builtin/clone.c:75 builtin/init-db.c:466
 msgid "template-directory"
 msgstr "模板目录"
 
-#: builtin/clone.c:76 builtin/init-db.c:502
+#: builtin/clone.c:76 builtin/init-db.c:467
 msgid "directory from which templates will be used"
 msgstr "模板目录将被使用"
 
-#: builtin/clone.c:78
+#: builtin/clone.c:78 builtin/submodule--helper.c:179
 msgid "reference repository"
 msgstr "参考仓库"
 
@@ -4604,7 +4649,7 @@
 msgid "path to git-upload-pack on the remote"
 msgstr "远程 git-upload-pack 路径"
 
-#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:659
+#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654
 #: builtin/pull.c:186
 msgid "depth"
 msgstr "深度"
@@ -4617,11 +4662,11 @@
 msgid "clone only one branch, HEAD or --branch"
 msgstr "只克隆一个分支、HEAD 或 --branch"
 
-#: builtin/clone.c:91 builtin/init-db.c:510
+#: builtin/clone.c:91 builtin/init-db.c:475
 msgid "gitdir"
 msgstr "git目录"
 
-#: builtin/clone.c:92 builtin/init-db.c:511
+#: builtin/clone.c:92 builtin/init-db.c:476
 msgid "separate git dir from working tree"
 msgstr "git目录和工作区分离"
 
@@ -4633,52 +4678,57 @@
 msgid "set config inside the new repository"
 msgstr "在新仓库中设置配置信息"
 
-#: builtin/clone.c:298
+#: builtin/clone.c:300
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "尚不支持将参考仓库 '%s' 作为一个链接检出。"
+
+#: builtin/clone.c:302
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr "参考仓库 '%s' 不是一个本地仓库。"
 
-#: builtin/clone.c:302
+#: builtin/clone.c:307
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "参考仓库 '%s' 是一个浅克隆"
 
-#: builtin/clone.c:305
+#: builtin/clone.c:310
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "参考仓库 '%s' 已被嫁接"
 
-#: builtin/clone.c:370 builtin/diff.c:84
+#: builtin/clone.c:375 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "无法枚举 '%s' 状态"
 
-#: builtin/clone.c:372
+#: builtin/clone.c:377
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s 存在且不是一个目录"
 
-#: builtin/clone.c:386
+#: builtin/clone.c:391
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "无法枚举 %s 状态\n"
 
-#: builtin/clone.c:408
+#: builtin/clone.c:413
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "无法创建链接 '%s'"
 
-#: builtin/clone.c:412
+#: builtin/clone.c:417
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "无法拷贝文件至 '%s'"
 
-#: builtin/clone.c:435 builtin/clone.c:619
+#: builtin/clone.c:442 builtin/clone.c:626
 #, c-format
 msgid "done.\n"
 msgstr "完成。\n"
 
-#: builtin/clone.c:447
+#: builtin/clone.c:454
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -4688,121 +4738,117 @@
 "您可以通过 'git status' 检查哪些已被检出,然后使用命令\n"
 "'git checkout -f HEAD' 重试\n"
 
-#: builtin/clone.c:524
+#: builtin/clone.c:531
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "不能发现要克隆的远程分支 %s。"
 
-#: builtin/clone.c:614
+#: builtin/clone.c:621
 #, c-format
 msgid "Checking connectivity... "
 msgstr "检查连接... "
 
-#: builtin/clone.c:617
+#: builtin/clone.c:624
 msgid "remote did not send all necessary objects"
 msgstr "远程没有发送所有必须的对象"
 
-#: builtin/clone.c:681
+#: builtin/clone.c:688
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr "远程 HEAD 指向一个不存在的引用,无法检出。\n"
 
-#: builtin/clone.c:712
+#: builtin/clone.c:719
 msgid "unable to checkout working tree"
 msgstr "不能检出工作区"
 
-#: builtin/clone.c:799
+#: builtin/clone.c:808
 msgid "cannot repack to clean up"
 msgstr "无法执行 repack 来清理"
 
-#: builtin/clone.c:801
+#: builtin/clone.c:810
 msgid "cannot unlink temporary alternates file"
 msgstr "无法删除临时的 alternates 文件"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:842
 msgid "Too many arguments."
 msgstr "太多参数。"
 
-#: builtin/clone.c:835
+#: builtin/clone.c:846
 msgid "You must specify a repository to clone."
 msgstr "您必须指定一个仓库来克隆。"
 
-#: builtin/clone.c:846
+#: builtin/clone.c:857
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "--bare 和 --origin %s 选项不兼容。"
 
-#: builtin/clone.c:849
+#: builtin/clone.c:860
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare 和 --separate-git-dir 选项不兼容。"
 
-#: builtin/clone.c:862
+#: builtin/clone.c:873
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "仓库 '%s' 不存在"
 
-#: builtin/clone.c:868 builtin/fetch.c:1168
+#: builtin/clone.c:879 builtin/fetch.c:1166
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "深度 %s 不是一个正数"
 
-#: builtin/clone.c:878
+#: builtin/clone.c:889
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "目标路径 '%s' 已经存在,并且不是一个空目录。"
 
-#: builtin/clone.c:888
+#: builtin/clone.c:899
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "工作区 '%s' 已经存在。"
 
-#: builtin/clone.c:903 builtin/clone.c:914 builtin/worktree.c:218
-#: builtin/worktree.c:245
+#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224
+#: builtin/worktree.c:221 builtin/worktree.c:248
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "不能为 '%s' 创建先导目录"
 
-#: builtin/clone.c:906
+#: builtin/clone.c:917
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "不能创建工作区目录 '%s'"
 
-#: builtin/clone.c:924
+#: builtin/clone.c:935
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "克隆到纯仓库 '%s'...\n"
 
-#: builtin/clone.c:926
+#: builtin/clone.c:937
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "正克隆到 '%s'...\n"
 
-#: builtin/clone.c:951
-msgid "--dissociate given, but there is no --reference"
-msgstr "提供了参数 --dissociate,但未提供 --reference"
-
-#: builtin/clone.c:968
+#: builtin/clone.c:975
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth 在本地克隆被忽略,改为 file:// 协议试试。"
 
-#: builtin/clone.c:971
+#: builtin/clone.c:978
 msgid "source repository is shallow, ignoring --local"
 msgstr "源仓库是浅克隆,忽略 --local"
 
-#: builtin/clone.c:976
+#: builtin/clone.c:983
 msgid "--local is ignored"
 msgstr "--local 被忽略"
 
-#: builtin/clone.c:980
+#: builtin/clone.c:987
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "不知道如何克隆 %s"
 
-#: builtin/clone.c:1029 builtin/clone.c:1037
+#: builtin/clone.c:1036 builtin/clone.c:1044
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "远程分支 %s 在上游 %s 未发现"
 
-#: builtin/clone.c:1040
+#: builtin/clone.c:1047
 msgid "You appear to have cloned an empty repository."
 msgstr "您似乎克隆了一个空仓库。"
 
@@ -4838,15 +4884,15 @@
 msgid "--command must be the first argument"
 msgstr "--command 必须是第一个参数"
 
-#: builtin/commit.c:37
+#: builtin/commit.c:38
 msgid "git commit [<options>] [--] <pathspec>..."
 msgstr "git commit [<选项>] [--] <路径规格>..."
 
-#: builtin/commit.c:42
+#: builtin/commit.c:43
 msgid "git status [<options>] [--] <pathspec>..."
 msgstr "git status [<选项>] [--] <路径规格>..."
 
-#: builtin/commit.c:47
+#: builtin/commit.c:48
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4870,7 +4916,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:60
+#: builtin/commit.c:61
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4893,7 +4939,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:72
+#: builtin/commit.c:73
 msgid ""
 "You asked to amend the most recent commit, but doing so would make\n"
 "it empty. You can repeat your command with --allow-empty, or you can\n"
@@ -4902,7 +4948,7 @@
 "您要修补最近的提交,但这么做会让它成为空提交。您可以重复您的命令并带上\n"
 "--allow-empty 选项,或者您可用命令 \"git reset HEAD^\" 整个删除该提交。\n"
 
-#: builtin/commit.c:77
+#: builtin/commit.c:78
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4916,11 +4962,11 @@
 "    git commit --allow-empty\n"
 "\n"
 
-#: builtin/commit.c:84
+#: builtin/commit.c:85
 msgid "Otherwise, please use 'git reset'\n"
 msgstr "否则,请使用命令 'git reset'\n"
 
-#: builtin/commit.c:87
+#: builtin/commit.c:88
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4936,103 +4982,103 @@
 "然后执行 \"git cherry-pick --continue\" 继续对其余提交执行拣选\n"
 "操作。\n"
 
-#: builtin/commit.c:304
+#: builtin/commit.c:305
 msgid "failed to unpack HEAD tree object"
 msgstr "无法解包 HEAD 树对象"
 
-#: builtin/commit.c:345
+#: builtin/commit.c:346
 msgid "unable to create temporary index"
 msgstr "不能创建临时索引"
 
-#: builtin/commit.c:351
+#: builtin/commit.c:352
 msgid "interactive add failed"
 msgstr "交互式添加失败"
 
-#: builtin/commit.c:364
+#: builtin/commit.c:365
 msgid "unable to update temporary index"
 msgstr "无法更新临时索引"
 
-#: builtin/commit.c:366
+#: builtin/commit.c:367
 msgid "Failed to update main cache tree"
 msgstr "不能更新树的主缓存"
 
-#: builtin/commit.c:390 builtin/commit.c:413 builtin/commit.c:462
+#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
 msgid "unable to write new_index file"
 msgstr "无法写 new_index 文件"
 
-#: builtin/commit.c:444
+#: builtin/commit.c:445
 msgid "cannot do a partial commit during a merge."
 msgstr "在合并过程中不能做部分提交。"
 
-#: builtin/commit.c:446
+#: builtin/commit.c:447
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "在拣选过程中不能做部分提交。"
 
-#: builtin/commit.c:455
+#: builtin/commit.c:456
 msgid "cannot read the index"
 msgstr "无法读取索引"
 
-#: builtin/commit.c:474
+#: builtin/commit.c:475
 msgid "unable to write temporary index file"
 msgstr "无法写临时索引文件"
 
-#: builtin/commit.c:579
+#: builtin/commit.c:580
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "提交 '%s' 缺少作者信息"
 
-#: builtin/commit.c:581
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "提交 '%s' 有非法的作者信息"
 
-#: builtin/commit.c:600
+#: builtin/commit.c:601
 msgid "malformed --author parameter"
 msgstr "非法的 --author 参数"
 
-#: builtin/commit.c:608
+#: builtin/commit.c:609
 #, c-format
 msgid "invalid date format: %s"
 msgstr "无效的日期格式:%s"
 
-#: builtin/commit.c:652
+#: builtin/commit.c:653
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
 msgstr "无法选择一个未被当前提交说明使用的注释字符"
 
-#: builtin/commit.c:689 builtin/commit.c:722 builtin/commit.c:1079
+#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "不能查询提交 %s"
 
-#: builtin/commit.c:701 builtin/shortlog.c:273
+#: builtin/commit.c:702 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(正从标准输入中读取日志信息)\n"
 
-#: builtin/commit.c:703
+#: builtin/commit.c:704
 msgid "could not read log from standard input"
 msgstr "不能从标准输入中读取日志信息"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:708
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "不能读取日志文件 '%s'"
 
-#: builtin/commit.c:729
+#: builtin/commit.c:730
 msgid "could not read MERGE_MSG"
 msgstr "不能读取 MERGE_MSG"
 
-#: builtin/commit.c:733
+#: builtin/commit.c:734
 msgid "could not read SQUASH_MSG"
 msgstr "不能读取 SQUASH_MSG"
 
-#: builtin/commit.c:784
+#: builtin/commit.c:785
 msgid "could not write commit template"
 msgstr "不能写提交模版"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:803
 #, c-format
 msgid ""
 "\n"
@@ -5046,7 +5092,7 @@
 "\t%s\n"
 "然后重试。\n"
 
-#: builtin/commit.c:807
+#: builtin/commit.c:808
 #, c-format
 msgid ""
 "\n"
@@ -5060,7 +5106,7 @@
 "\t%s\n"
 "然后重试。\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:821
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5069,7 +5115,7 @@
 "请为您的变更输入提交说明。以 '%c' 开始的行将被忽略,而一个空的提交\n"
 "说明将会终止提交。\n"
 
-#: builtin/commit.c:827
+#: builtin/commit.c:828
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5080,340 +5126,346 @@
 "也可以删除它们。一个空的提交说明将会终止提交。\n"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:847
+#: builtin/commit.c:848
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%s作者:  %.*s <%.*s>"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:855
+#: builtin/commit.c:856
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%s日期:  %s"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:862
+#: builtin/commit.c:863
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%s提交者:%.*s <%.*s>"
 
-#: builtin/commit.c:880
+#: builtin/commit.c:881
 msgid "Cannot read index"
 msgstr "无法读取索引"
 
-#: builtin/commit.c:937
+#: builtin/commit.c:938
 msgid "Error building trees"
 msgstr "无法创建树对象"
 
-#: builtin/commit.c:952 builtin/tag.c:495
+#: builtin/commit.c:953 builtin/tag.c:266
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "请使用 -m 或 -F 选项提供提交说明。\n"
 
-#: builtin/commit.c:1054
+#: builtin/commit.c:1055
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr "--author '%s' 不是 'Name <email>' 格式,且未能在现有作者中找到匹配"
 
-#: builtin/commit.c:1069 builtin/commit.c:1309
+#: builtin/commit.c:1070 builtin/commit.c:1310
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "无效的未追踪文件参数 '%s'"
 
-#: builtin/commit.c:1106
+#: builtin/commit.c:1107
 msgid "--long and -z are incompatible"
 msgstr "--long 和 -z 选项不兼容"
 
-#: builtin/commit.c:1136
+#: builtin/commit.c:1137
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "同时使用 --reset-author 和 --author 没有意义"
 
-#: builtin/commit.c:1145
+#: builtin/commit.c:1146
 msgid "You have nothing to amend."
 msgstr "您没有可修补的提交。"
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1149
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "您正处于一个合并过程中 -- 无法修补提交。"
 
-#: builtin/commit.c:1150
+#: builtin/commit.c:1151
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "您正处于一个拣选过程中 -- 无法修补提交。"
 
-#: builtin/commit.c:1153
+#: builtin/commit.c:1154
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "选项 --squash 和 --fixup 不能同时使用"
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1164
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "只能用一个 -c/-C/-F/--fixup 选项。"
 
-#: builtin/commit.c:1165
+#: builtin/commit.c:1166
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "选项 -m 不能和 -c/-C/-F/--fixup 同时使用。"
 
-#: builtin/commit.c:1173
+#: builtin/commit.c:1174
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author 只能和 -C、-c 或 --amend 同时使用。"
 
-#: builtin/commit.c:1190
+#: builtin/commit.c:1191
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr "只能用一个 --include/--only/--all/--interactive/--patch 选项。"
 
-#: builtin/commit.c:1192
+#: builtin/commit.c:1193
 msgid "No paths with --include/--only does not make sense."
 msgstr "参数 --include/--only 不跟路径没有意义。"
 
-#: builtin/commit.c:1194
+#: builtin/commit.c:1195
 msgid "Clever... amending the last one with dirty index."
 msgstr "聪明... 用脏索引修补最后一个提交。"
 
-#: builtin/commit.c:1196
+#: builtin/commit.c:1197
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "指定了明确的路径而没有使用 -i 或 -o 选项,认为是 --only paths..."
 
-#: builtin/commit.c:1208 builtin/tag.c:730
+#: builtin/commit.c:1209 builtin/tag.c:475
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "无效的清理模式 %s"
 
-#: builtin/commit.c:1213
+#: builtin/commit.c:1214
 msgid "Paths with -a does not make sense."
 msgstr "路径和 -a 选项同时使用没有意义。"
 
-#: builtin/commit.c:1323 builtin/commit.c:1602
+#: builtin/commit.c:1324 builtin/commit.c:1605
 msgid "show status concisely"
 msgstr "以简洁的格式显示状态"
 
-#: builtin/commit.c:1325 builtin/commit.c:1604
+#: builtin/commit.c:1326 builtin/commit.c:1607
 msgid "show branch information"
 msgstr "显示分支信息"
 
-#: builtin/commit.c:1327 builtin/commit.c:1606 builtin/push.c:546
+#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:544
+#: builtin/worktree.c:423
 msgid "machine-readable output"
 msgstr "机器可读的输出"
 
-#: builtin/commit.c:1330 builtin/commit.c:1608
+#: builtin/commit.c:1331 builtin/commit.c:1611
 msgid "show status in long format (default)"
 msgstr "以长格式显示状态(默认)"
 
-#: builtin/commit.c:1333 builtin/commit.c:1611
+#: builtin/commit.c:1334 builtin/commit.c:1614
 msgid "terminate entries with NUL"
 msgstr "条目以 NUL 字符结尾"
 
-#: builtin/commit.c:1335 builtin/commit.c:1614 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:604
+#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:353
 msgid "mode"
 msgstr "模式"
 
-#: builtin/commit.c:1336 builtin/commit.c:1614
+#: builtin/commit.c:1337 builtin/commit.c:1617
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr "显示未跟踪的文件,“模式”的可选参数:all、normal、no。(默认:all)"
 
-#: builtin/commit.c:1339
+#: builtin/commit.c:1340
 msgid "show ignored files"
 msgstr "显示忽略的文件"
 
-#: builtin/commit.c:1340 parse-options.h:155
+#: builtin/commit.c:1341 parse-options.h:155
 msgid "when"
 msgstr "何时"
 
-#: builtin/commit.c:1341
+#: builtin/commit.c:1342
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr ""
 "忽略子模组的更改,“何时”的可选参数:all、dirty、untracked。(默认:all)"
 
-#: builtin/commit.c:1343
+#: builtin/commit.c:1344
 msgid "list untracked files in columns"
 msgstr "以列的方式显示未跟踪的文件"
 
-#: builtin/commit.c:1429
+#: builtin/commit.c:1430
 msgid "couldn't look up newly created commit"
 msgstr "无法找到新创建的提交"
 
-#: builtin/commit.c:1431
+#: builtin/commit.c:1432
 msgid "could not parse newly created commit"
 msgstr "不能解析新创建的提交"
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1477
 msgid "detached HEAD"
 msgstr "分离头指针"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/commit.c:1479
+#: builtin/commit.c:1480
 msgid " (root-commit)"
 msgstr "(根提交)"
 
-#: builtin/commit.c:1572
+#: builtin/commit.c:1575
 msgid "suppress summary after successful commit"
 msgstr "提交成功后不显示概述信息"
 
-#: builtin/commit.c:1573
+#: builtin/commit.c:1576
 msgid "show diff in commit message template"
 msgstr "在提交说明模板里显示差异"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1578
 msgid "Commit message options"
 msgstr "提交说明选项"
 
-#: builtin/commit.c:1576 builtin/tag.c:602
+#: builtin/commit.c:1579 builtin/tag.c:351
 msgid "read message from file"
 msgstr "从文件中读取提交说明"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "author"
 msgstr "作者"
 
-#: builtin/commit.c:1577
+#: builtin/commit.c:1580
 msgid "override author for commit"
 msgstr "提交时覆盖作者"
 
-#: builtin/commit.c:1578 builtin/gc.c:268
+#: builtin/commit.c:1581 builtin/gc.c:326
 msgid "date"
 msgstr "日期"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1581
 msgid "override date for commit"
 msgstr "提交时覆盖日期"
 
-#: builtin/commit.c:1579 builtin/merge.c:218 builtin/notes.c:392
-#: builtin/notes.c:555 builtin/tag.c:600
+#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392
+#: builtin/notes.c:555 builtin/tag.c:349
 msgid "message"
 msgstr "说明"
 
-#: builtin/commit.c:1579
+#: builtin/commit.c:1582
 msgid "commit message"
 msgstr "提交说明"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
+#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
+msgid "commit"
+msgstr "提交"
+
+#: builtin/commit.c:1583
 msgid "reuse and edit message from specified commit"
 msgstr "重用并编辑指定提交的提交说明"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1584
 msgid "reuse message from specified commit"
 msgstr "重用指定提交的提交说明"
 
-#: builtin/commit.c:1582
+#: builtin/commit.c:1585
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr "使用 autosquash 格式的提交说明用以修正指定的提交"
 
-#: builtin/commit.c:1583
+#: builtin/commit.c:1586
 msgid "use autosquash formatted message to squash specified commit"
 msgstr "使用 autosquash 格式的提交说明用以压缩至指定的提交"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1587
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "现在将该提交的作者改为我(和 -C/-c/--amend 参数共用)"
 
-#: builtin/commit.c:1585 builtin/log.c:1216 builtin/revert.c:86
+#: builtin/commit.c:1588 builtin/log.c:1216 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "添加 Signed-off-by: 签名"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1589
 msgid "use specified template file"
 msgstr "使用指定的模板文件"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1590
 msgid "force edit of commit"
 msgstr "强制编辑提交"
 
 #  译者:可选值,不能翻译(或是原文中笔误,应为 mode)
-#: builtin/commit.c:1588
+#: builtin/commit.c:1591
 msgid "default"
 msgstr "default"
 
-#: builtin/commit.c:1588 builtin/tag.c:605
+#: builtin/commit.c:1591 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "设置如何删除提交说明里的空格和#注释"
 
-#: builtin/commit.c:1589
+#: builtin/commit.c:1592
 msgid "include status in commit message template"
 msgstr "在提交说明模板里包含状态信息"
 
-#: builtin/commit.c:1591 builtin/merge.c:226 builtin/pull.c:156
+#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "GPG 提交签名"
 
-#: builtin/commit.c:1594
+#: builtin/commit.c:1597
 msgid "Commit contents options"
 msgstr "提交内容选项"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1598
 msgid "commit all changed files"
 msgstr "提交所有改动的文件"
 
-#: builtin/commit.c:1596
+#: builtin/commit.c:1599
 msgid "add specified files to index for commit"
 msgstr "添加指定的文件到索引区等待提交"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1600
 msgid "interactively add files"
 msgstr "交互式添加文件"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1601
 msgid "interactively add changes"
 msgstr "交互式添加变更"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1602
 msgid "commit only specified files"
 msgstr "只提交指定的文件"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1603
 msgid "bypass pre-commit hook"
 msgstr "绕过 pre-commit 钩子"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1604
 msgid "show what would be committed"
 msgstr "显示将要提交的内容"
 
-#: builtin/commit.c:1612
+#: builtin/commit.c:1615
 msgid "amend previous commit"
 msgstr "修改先前的提交"
 
-#: builtin/commit.c:1613
+#: builtin/commit.c:1616
 msgid "bypass post-rewrite hook"
 msgstr "绕过 post-rewrite 钩子"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1621
 msgid "ok to record an empty change"
 msgstr "允许一个空提交"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1623
 msgid "ok to record a change with an empty message"
 msgstr "允许空的提交说明"
 
-#: builtin/commit.c:1649
+#: builtin/commit.c:1652
 msgid "could not parse HEAD commit"
 msgstr "不能解析 HEAD 提交"
 
-#: builtin/commit.c:1695
+#: builtin/commit.c:1698
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "损坏的 MERGE_HEAD 文件(%s)"
 
-#: builtin/commit.c:1702
+#: builtin/commit.c:1705
 msgid "could not read MERGE_MODE"
 msgstr "不能读取 MERGE_MODE"
 
-#: builtin/commit.c:1721
+#: builtin/commit.c:1724
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "不能读取提交说明:%s"
 
-#: builtin/commit.c:1732
+#: builtin/commit.c:1735
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "终止提交;您未更改来自模版的提交说明。\n"
 
-#: builtin/commit.c:1737
+#: builtin/commit.c:1740
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "终止提交因为提交说明为空。\n"
 
-#: builtin/commit.c:1785
+#: builtin/commit.c:1788
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -5550,11 +5602,11 @@
 msgid "respect include directives on lookup"
 msgstr "查询时参照 include 指令递归查找"
 
-#: builtin/config.c:311
+#: builtin/config.c:303
 msgid "unable to parse default color value"
 msgstr "不能解析默认颜色值"
 
-#: builtin/config.c:449
+#: builtin/config.c:441
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5569,16 +5621,16 @@
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:583
+#: builtin/config.c:575
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "不能创建配置文件 %s"
 
-#: builtin/count-objects.c:55
+#: builtin/count-objects.c:77
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:65
+#: builtin/count-objects.c:87
 msgid "print sizes in human readable format"
 msgstr "以用户可读的格式显示大小"
 
@@ -5698,7 +5750,7 @@
 msgid "only consider tags matching <pattern>"
 msgstr "只考虑匹配 <模式> 的标签"
 
-#: builtin/describe.c:410 builtin/name-rev.c:318
+#: builtin/describe.c:410 builtin/name-rev.c:314
 msgid "show abbreviated commit object as fallback"
 msgstr "显示简写的提交号作为后备"
 
@@ -5918,7 +5970,7 @@
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s -> %s  (在当前分支下不能获取)"
 
-#: builtin/fetch.c:478 builtin/fetch.c:564
+#: builtin/fetch.c:478 builtin/fetch.c:566
 msgid "[rejected]"
 msgstr "[已拒绝]"
 
@@ -5943,39 +5995,39 @@
 msgid "[new ref]"
 msgstr "[新引用]"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "unable to update local ref"
 msgstr "不能更新本地引用"
 
-#: builtin/fetch.c:560
+#: builtin/fetch.c:561
 msgid "forced update"
 msgstr "强制更新"
 
-#: builtin/fetch.c:566
+#: builtin/fetch.c:568
 msgid "(non-fast-forward)"
 msgstr "(非快进式)"
 
-#: builtin/fetch.c:600 builtin/fetch.c:842
+#: builtin/fetch.c:602 builtin/fetch.c:843
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "无法打开 %s:%s\n"
 
-#: builtin/fetch.c:609
+#: builtin/fetch.c:611
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s 未发送所有必须的对象\n"
 
-#: builtin/fetch.c:627
+#: builtin/fetch.c:629
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr "拒绝 %s 因为浅克隆不允许被更新"
 
-#: builtin/fetch.c:715 builtin/fetch.c:807
+#: builtin/fetch.c:716 builtin/fetch.c:808
 #, c-format
 msgid "From %.*s\n"
 msgstr "来自 %.*s\n"
 
-#: builtin/fetch.c:726
+#: builtin/fetch.c:727
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -5985,87 +6037,87 @@
 " 'git remote prune %s' 来删除旧的、有冲突的分支"
 
 #  译者:注意保持前导空格
-#: builtin/fetch.c:778
+#: builtin/fetch.c:779
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s 将成为摇摆状态)"
 
 #  译者:注意保持前导空格
-#: builtin/fetch.c:779
+#: builtin/fetch.c:780
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s 已成为摇摆状态)"
 
-#: builtin/fetch.c:811
+#: builtin/fetch.c:812
 msgid "[deleted]"
 msgstr "[已删除]"
 
-#: builtin/fetch.c:812 builtin/remote.c:1034
+#: builtin/fetch.c:813 builtin/remote.c:1040
 msgid "(none)"
 msgstr "(无)"
 
-#: builtin/fetch.c:832
+#: builtin/fetch.c:833
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "拒绝获取到非纯仓库的当前分支 %s"
 
-#: builtin/fetch.c:851
+#: builtin/fetch.c:852
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "选项 \"%s\" 的值 \"%s\" 对于 %s 是无效的"
 
-#: builtin/fetch.c:854
+#: builtin/fetch.c:855
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "选项 \"%s\" 为 %s 所忽略\n"
 
-#: builtin/fetch.c:910
+#: builtin/fetch.c:911
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "不知道如何从 %s 获取"
 
-#: builtin/fetch.c:1071
+#: builtin/fetch.c:1072
 #, c-format
 msgid "Fetching %s\n"
 msgstr "正在获取 %s\n"
 
-#: builtin/fetch.c:1073 builtin/remote.c:90
+#: builtin/fetch.c:1074 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "不能获取 %s"
 
-#: builtin/fetch.c:1091
+#: builtin/fetch.c:1092
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
 msgstr "未指定远程仓库。请通过一个 URL 或远程仓库名指定,用以获取新提交。"
 
-#: builtin/fetch.c:1114
+#: builtin/fetch.c:1115
 msgid "You need to specify a tag name."
 msgstr "您需要指定一个标签名称。"
 
-#: builtin/fetch.c:1156
+#: builtin/fetch.c:1157
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth 和 --unshallow 不能同时使用"
 
-#: builtin/fetch.c:1158
+#: builtin/fetch.c:1159
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "对于一个完整的仓库,参数 --unshallow 没有意义"
 
-#: builtin/fetch.c:1181
+#: builtin/fetch.c:1179
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all 不能带一个仓库参数"
 
-#: builtin/fetch.c:1183
+#: builtin/fetch.c:1181
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all 带引用规格没有任何意义"
 
-#: builtin/fetch.c:1194
+#: builtin/fetch.c:1192
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "没有这样的远程或远程组:%s"
 
-#: builtin/fetch.c:1202
+#: builtin/fetch.c:1200
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "获取组并指定引用规格没有意义"
 
@@ -6074,23 +6126,23 @@
 "git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
 msgstr "git fmt-merge-msg [-m <说明>] [--log[=<n>] | --no-log] [--file <文件>]"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:667
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "向提交说明中最多复制指定条目(合并而来的提交)的简短说明"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:670
 msgid "alias for --log (deprecated)"
 msgstr "参数 --log 的别名(已弃用)"
 
-#: builtin/fmt-merge-msg.c:676
+#: builtin/fmt-merge-msg.c:673
 msgid "text"
 msgstr "文本"
 
-#: builtin/fmt-merge-msg.c:677
+#: builtin/fmt-merge-msg.c:674
 msgid "use <text> as start of message"
 msgstr "使用 <文本> 作为提交说明的开始"
 
-#: builtin/fmt-merge-msg.c:678
+#: builtin/fmt-merge-msg.c:675
 msgid "file to read from"
 msgstr "从文件中读取"
 
@@ -6098,95 +6150,115 @@
 msgid "git for-each-ref [<options>] [<pattern>]"
 msgstr "git for-each-ref [<选项>] [<模式>]"
 
-#: builtin/for-each-ref.c:24
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
+msgstr "git for-each-ref [--points-at <对象>]"
+
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<对象>]]"
+
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
+msgstr "git for-each-ref [--contains [<对象>]]"
+
+#: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
 msgstr "引用占位符适用于 shells"
 
-#: builtin/for-each-ref.c:26
+#: builtin/for-each-ref.c:29
 msgid "quote placeholders suitably for perl"
 msgstr "引用占位符适用于 perl"
 
-#: builtin/for-each-ref.c:28
+#: builtin/for-each-ref.c:31
 msgid "quote placeholders suitably for python"
 msgstr "引用占位符适用于 python"
 
-#: builtin/for-each-ref.c:30
+#: builtin/for-each-ref.c:33
 msgid "quote placeholders suitably for Tcl"
 msgstr "引用占位符适用于 Tcl"
 
-#: builtin/for-each-ref.c:33
+#: builtin/for-each-ref.c:36
 msgid "show only <n> matched refs"
 msgstr "只显示 <n> 个匹配的引用"
 
-#: builtin/for-each-ref.c:34
+#: builtin/for-each-ref.c:37 builtin/tag.c:372
 msgid "format to use for the output"
 msgstr "输出格式"
 
-#: builtin/for-each-ref.c:35
-msgid "key"
-msgstr "key"
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
+msgstr "只打印指向给定对象的引用"
 
-#: builtin/for-each-ref.c:36
-msgid "field name to sort on"
-msgstr "排序的字段名"
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
+msgstr "只打印已经合并的引用"
 
-#: builtin/fsck.c:163 builtin/prune.c:137
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr "只打印没有合并的引用"
+
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
+msgstr "只打印包含该提交的引用"
+
+#: builtin/fsck.c:156 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr "检查连接中"
 
-#: builtin/fsck.c:568
+#: builtin/fsck.c:486
 msgid "Checking object directories"
 msgstr "检查对象目录中"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:553
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<选项>] [<对象>...]"
 
-#: builtin/fsck.c:637
+#: builtin/fsck.c:559
 msgid "show unreachable objects"
 msgstr "显示不可达的对象"
 
-#: builtin/fsck.c:638
+#: builtin/fsck.c:560
 msgid "show dangling objects"
 msgstr "显示摇摆的对象"
 
-#: builtin/fsck.c:639
+#: builtin/fsck.c:561
 msgid "report tags"
 msgstr "报告标签"
 
-#: builtin/fsck.c:640
+#: builtin/fsck.c:562
 msgid "report root nodes"
 msgstr "报告根节点"
 
-#: builtin/fsck.c:641
+#: builtin/fsck.c:563
 msgid "make index objects head nodes"
 msgstr "将索引亦作为检查的头节点"
 
-#: builtin/fsck.c:642
+#: builtin/fsck.c:564
 msgid "make reflogs head nodes (default)"
 msgstr "将引用日志作为检查的头节点(默认)"
 
-#: builtin/fsck.c:643
+#: builtin/fsck.c:565
 msgid "also consider packs and alternate objects"
 msgstr "也考虑包和备用对象"
 
-#: builtin/fsck.c:644
+#: builtin/fsck.c:566
 msgid "check only connectivity"
 msgstr "仅检查连通性"
 
-#: builtin/fsck.c:645
+#: builtin/fsck.c:567
 msgid "enable more strict checking"
 msgstr "启用更严格的检查"
 
-#: builtin/fsck.c:647
+#: builtin/fsck.c:569
 msgid "write dangling objects in .git/lost-found"
 msgstr "将摇摆对象写入 .git/lost-found 中"
 
-#: builtin/fsck.c:648 builtin/prune.c:107
+#: builtin/fsck.c:570 builtin/prune.c:107
 msgid "show progress"
 msgstr "显示进度"
 
-#: builtin/fsck.c:707
+#: builtin/fsck.c:631
 msgid "Checking objects"
 msgstr "检查对象中"
 
@@ -6194,55 +6266,69 @@
 msgid "git gc [<options>]"
 msgstr "git gc [<选项>]"
 
-#: builtin/gc.c:55
+#: builtin/gc.c:72
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "无效 %s:'%s'"
 
-#: builtin/gc.c:100
+#: builtin/gc.c:139
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "不正常的长对象目录 %.*s"
 
-#: builtin/gc.c:269
+#: builtin/gc.c:290
+#, c-format
+msgid ""
+"The last gc run reported the following. Please correct the root cause\n"
+"and remove %s.\n"
+"Automatic cleanup will not be performed until the file is removed.\n"
+"\n"
+"%s"
+msgstr ""
+"最后一次 gc 操作报告如下信息。请检查原因并删除 %s。\n"
+"在该文件被删除之前,自动清理将不会执行。\n"
+"\n"
+"%s"
+
+#: builtin/gc.c:327
 msgid "prune unreferenced objects"
 msgstr "清除未引用的对象"
 
-#: builtin/gc.c:271
+#: builtin/gc.c:329
 msgid "be more thorough (increased runtime)"
 msgstr "更彻底(增加运行时间)"
 
-#: builtin/gc.c:272
+#: builtin/gc.c:330
 msgid "enable auto-gc mode"
 msgstr "启用自动垃圾回收模式"
 
-#: builtin/gc.c:273
+#: builtin/gc.c:331
 msgid "force running gc even if there may be another gc running"
 msgstr "强制执行 gc 即使另外一个 gc 正在执行"
 
-#: builtin/gc.c:315
+#: builtin/gc.c:373
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr "自动在后台执行仓库打包以求最佳性能。\n"
 
-#: builtin/gc.c:317
+#: builtin/gc.c:375
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "自动打包仓库以求最佳性能。\n"
 
-#: builtin/gc.c:318
+#: builtin/gc.c:376
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "手工维护参见 \"git help gc\"。\n"
 
-#: builtin/gc.c:336
+#: builtin/gc.c:397
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
 msgstr ""
 "已经有一个 gc 正运行在机器 '%s' pid %<PRIuMAX> (如果不是,使用 --force)"
 
-#: builtin/gc.c:364
+#: builtin/gc.c:441
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr "有太多不可达的松散对象,运行 'git prune' 删除它们。"
@@ -6276,200 +6362,196 @@
 msgid "cannot open '%s'"
 msgstr "不能打开 '%s'"
 
-#: builtin/grep.c:638
+#: builtin/grep.c:633
 msgid "search in index instead of in the work tree"
 msgstr "在索引区搜索而不是在工作区"
 
-#: builtin/grep.c:640
+#: builtin/grep.c:635
 msgid "find in contents not managed by git"
 msgstr "在未被 git 管理的内容中查找"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/grep.c:642
+#: builtin/grep.c:637
 msgid "search in both tracked and untracked files"
 msgstr "在跟踪和未跟踪的文件中搜索"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:639
 msgid "ignore files specified via '.gitignore'"
 msgstr "忽略 '.gitignore' 包含的文件"
 
-#: builtin/grep.c:647
+#: builtin/grep.c:642
 msgid "show non-matching lines"
 msgstr "显示未匹配的行"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:644
 msgid "case insensitive matching"
 msgstr "不区分大小写匹配"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:646
 msgid "match patterns only at word boundaries"
 msgstr "只在单词边界匹配模式"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:648
 msgid "process binary files as text"
 msgstr "把二进制文件当做文本处理"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:650
 msgid "don't match patterns in binary files"
 msgstr "不在二进制文件中匹配模式"
 
-#: builtin/grep.c:658
+#: builtin/grep.c:653
 msgid "process binary files with textconv filters"
 msgstr "用 textconv 过滤器处理二进制文件"
 
-#: builtin/grep.c:660
+#: builtin/grep.c:655
 msgid "descend at most <depth> levels"
 msgstr "最多以指定的深度向下寻找"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:659
 msgid "use extended POSIX regular expressions"
 msgstr "使用扩展的 POSIX 正则表达式"
 
-#: builtin/grep.c:667
+#: builtin/grep.c:662
 msgid "use basic POSIX regular expressions (default)"
 msgstr "使用基本的 POSIX 正则表达式(默认)"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:665
 msgid "interpret patterns as fixed strings"
 msgstr "把模式解析为固定的字符串"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:668
 msgid "use Perl-compatible regular expressions"
 msgstr "使用 Perl 兼容的正则表达式"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:671
 msgid "show line numbers"
 msgstr "显示行号"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:672
 msgid "don't show filenames"
 msgstr "不显示文件名"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:673
 msgid "show filenames"
 msgstr "显示文件名"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:675
 msgid "show filenames relative to top directory"
 msgstr "显示相对于顶级目录的文件名"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:677
 msgid "show only filenames instead of matching lines"
 msgstr "只显示文件名而不显示匹配的行"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:679
 msgid "synonym for --files-with-matches"
 msgstr "和 --files-with-matches 同义"
 
-#: builtin/grep.c:687
+#: builtin/grep.c:682
 msgid "show only the names of files without match"
 msgstr "只显示未匹配的文件名"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:684
 msgid "print NUL after filenames"
 msgstr "在文件名后输出 NUL 字符"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:686
 msgid "show the number of matches instead of matching lines"
 msgstr "显示总匹配行数,而不显示匹配的行"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:687
 msgid "highlight matches"
 msgstr "高亮显示匹配项"
 
-#: builtin/grep.c:694
+#: builtin/grep.c:689
 msgid "print empty line between matches from different files"
 msgstr "在不同文件的匹配项之间打印空行"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:691
 msgid "show filename only once above matches from same file"
 msgstr "只在同一文件的匹配项的上面显示一次文件名"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:694
 msgid "show <n> context lines before and after matches"
 msgstr "显示匹配项前后的 <n> 行上下文"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:697
 msgid "show <n> context lines before matches"
 msgstr "显示匹配项前 <n> 行上下文"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:699
 msgid "show <n> context lines after matches"
 msgstr "显示匹配项后 <n> 行上下文"
 
-#: builtin/grep.c:705
+#: builtin/grep.c:700
 msgid "shortcut for -C NUM"
 msgstr "快捷键 -C 数字"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:703
 msgid "show a line with the function name before matches"
 msgstr "在匹配的前面显示一行函数名"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:705
 msgid "show the surrounding function"
 msgstr "显示所在函数的前后内容"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:708
 msgid "read patterns from file"
 msgstr "从文件读取模式"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:710
 msgid "match <pattern>"
 msgstr "匹配 <模式>"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:712
 msgid "combine patterns specified with -e"
 msgstr "组合用 -e 参数设定的模式"
 
-#: builtin/grep.c:729
+#: builtin/grep.c:724
 msgid "indicate hit with exit status without output"
 msgstr "不输出,而用退出码标识命中状态"
 
-#: builtin/grep.c:731
+#: builtin/grep.c:726
 msgid "show only matches from files that match all patterns"
 msgstr "只显示匹配所有模式的文件中的匹配"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:728
 msgid "show parse tree for grep expression"
 msgstr "显示 grep 表达式的解析树"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "pager"
 msgstr "分页"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:732
 msgid "show matching files in the pager"
 msgstr "分页显示匹配的文件"
 
-#: builtin/grep.c:740
+#: builtin/grep.c:735
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "允许调用 grep(1)(本次构建忽略)"
 
-#: builtin/grep.c:741 builtin/show-ref.c:189
-msgid "show usage"
-msgstr "显示用法"
-
-#: builtin/grep.c:808
+#: builtin/grep.c:793
 msgid "no pattern given."
 msgstr "未提供模式匹配。"
 
-#: builtin/grep.c:866
+#: builtin/grep.c:851
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager 仅用于工作区"
 
-#: builtin/grep.c:892
+#: builtin/grep.c:877
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached 或 --untracked 不能与 --no-index 同时使用。"
 
-#: builtin/grep.c:897
+#: builtin/grep.c:882
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index 或 --untracked 不能和版本同时使用。"
 
-#: builtin/grep.c:900
+#: builtin/grep.c:885
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard 不能用于已跟踪内容。"
 
-#: builtin/grep.c:908
+#: builtin/grep.c:893
 msgid "both --cached and trees are given."
 msgstr "同时给出了 --cached 和树对象。"
 
@@ -6482,10 +6564,10 @@
 "[--] <文件>..."
 
 #: builtin/hash-object.c:81
-msgid "git hash-object  --stdin-paths < <list-of-paths>"
-msgstr "git hash-object  --stdin-paths < <路径列表>"
+msgid "git hash-object  --stdin-paths"
+msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:92 builtin/tag.c:614
+#: builtin/hash-object.c:92
 msgid "type"
 msgstr "类型"
 
@@ -6556,12 +6638,12 @@
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "emacsclient 版本 '%d' 太老(< 22)。"
 
-#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
+#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "无法执行 '%s':%s"
 
-#: builtin/help.c:215
+#: builtin/help.c:208
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -6570,7 +6652,7 @@
 "'%s':不支持的 man 手册查看器的路径。\n"
 "请使用 'man.<工具>.cmd'。"
 
-#: builtin/help.c:227
+#: builtin/help.c:220
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -6579,61 +6661,61 @@
 "'%s': 支持的 man 手册查看器命令。\n"
 "请使用 'man.<工具>.path'。"
 
-#: builtin/help.c:354
+#: builtin/help.c:337
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s':未知的 man 查看器。"
 
-#: builtin/help.c:371
+#: builtin/help.c:354
 msgid "no man viewer handled the request"
 msgstr "没有 man 查看器处理此请求"
 
-#: builtin/help.c:379
+#: builtin/help.c:362
 msgid "no info viewer handled the request"
 msgstr "没有 info 查看器处理此请求"
 
-#: builtin/help.c:428
+#: builtin/help.c:411
 msgid "Defining attributes per path"
 msgstr "定义路径的属性"
 
-#: builtin/help.c:429
+#: builtin/help.c:412
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "每一天 Git 常用的约 20 条命令"
 
-#: builtin/help.c:430
+#: builtin/help.c:413
 msgid "A Git glossary"
 msgstr "Git 词汇表"
 
-#: builtin/help.c:431
+#: builtin/help.c:414
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "忽略指定的未跟踪文件"
 
-#: builtin/help.c:432
+#: builtin/help.c:415
 msgid "Defining submodule properties"
 msgstr "定义子模组属性"
 
-#: builtin/help.c:433
+#: builtin/help.c:416
 msgid "Specifying revisions and ranges for Git"
 msgstr "指定 Git 的版本和版本范围"
 
-#: builtin/help.c:434
+#: builtin/help.c:417
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "一个 Git 教程(针对 1.5.1 或更新版本)"
 
-#: builtin/help.c:435
+#: builtin/help.c:418
 msgid "An overview of recommended workflows with Git"
 msgstr "Git 推荐的工作流概览"
 
-#: builtin/help.c:447
+#: builtin/help.c:430
 msgid "The common Git guides are:\n"
 msgstr "最常用的 Git 向导有:\n"
 
-#: builtin/help.c:468 builtin/help.c:485
+#: builtin/help.c:451 builtin/help.c:468
 #, c-format
 msgid "usage: %s%s"
 msgstr "用法:%s%s"
 
-#: builtin/help.c:501
+#: builtin/help.c:484
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "`git %s' 是 `%s' 的别名"
@@ -6926,87 +7008,62 @@
 msgid "--verify with no packfile name given"
 msgstr "--verify 没有提供包文件名参数"
 
-#: builtin/init-db.c:36
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr "不能设置 %s 为组可写"
-
-#: builtin/init-db.c:63
-#, c-format
-msgid "insanely long template name %s"
-msgstr "太长的模版名 %s"
-
-#: builtin/init-db.c:68
+#: builtin/init-db.c:55
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "不能枚举 '%s' 状态"
 
-#: builtin/init-db.c:74
+#: builtin/init-db.c:61
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "不能枚举模版 '%s' 状态"
 
-#: builtin/init-db.c:81
+#: builtin/init-db.c:66
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "不能打开目录 '%s'"
 
-#: builtin/init-db.c:98
+#: builtin/init-db.c:77
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "不能读取链接 '%s'"
 
-#: builtin/init-db.c:100
-#, c-format
-msgid "insanely long symlink %s"
-msgstr "太长的符号链接 %s"
-
-#: builtin/init-db.c:103
+#: builtin/init-db.c:79
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "不能自 '%s' 到 '%s' 创建符号链接"
 
-#: builtin/init-db.c:107
+#: builtin/init-db.c:85
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "不能拷贝 '%s' 至 '%s'"
 
-#: builtin/init-db.c:111
+#: builtin/init-db.c:89
 #, c-format
 msgid "ignoring template %s"
 msgstr "忽略模版 %s"
 
-#: builtin/init-db.c:137
-#, c-format
-msgid "insanely long template path %s"
-msgstr "太长的模版路径 %s"
-
-#: builtin/init-db.c:145
+#: builtin/init-db.c:118
 #, c-format
 msgid "templates not found %s"
 msgstr "模版未找到 %s"
 
-#: builtin/init-db.c:158
+#: builtin/init-db.c:131
 #, c-format
 msgid "not copying templates of a wrong format version %d from '%s'"
 msgstr "没有从 '%2$s' 复制带有错误版本 %1$d 的模版"
 
-#: builtin/init-db.c:212
-#, c-format
-msgid "insane git directory %s"
-msgstr "不正常的 git 目录 %s"
-
-#: builtin/init-db.c:344 builtin/init-db.c:347
+#: builtin/init-db.c:309 builtin/init-db.c:312
 #, c-format
 msgid "%s already exists"
 msgstr "%s 已经存在"
 
-#: builtin/init-db.c:375
+#: builtin/init-db.c:340
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "不能处理 %d 类型的文件"
 
-#: builtin/init-db.c:378
+#: builtin/init-db.c:343
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "不能移动 %s 至 %s"
@@ -7014,25 +7071,25 @@
 #. TRANSLATORS: The first '%s' is either "Reinitialized
 #. existing" or "Initialized empty", the second " shared" or
 #. "", and the last '%s%s' is the verbatim directory name.
-#: builtin/init-db.c:434
+#: builtin/init-db.c:399
 #, c-format
 msgid "%s%s Git repository in %s%s\n"
 msgstr "%s%s Git 仓库于 %s%s\n"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Reinitialized existing"
 msgstr "重新初始化现存的"
 
-#: builtin/init-db.c:435
+#: builtin/init-db.c:400
 msgid "Initialized empty"
 msgstr "初始化空的"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/init-db.c:436
+#: builtin/init-db.c:401
 msgid " shared"
 msgstr "共享"
 
-#: builtin/init-db.c:483
+#: builtin/init-db.c:448
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7040,32 +7097,32 @@
 "git init [-q | --quiet] [--bare] [--template=<模板目录>] [--shared[=<权限>]] "
 "[<目录>]"
 
-#: builtin/init-db.c:506
+#: builtin/init-db.c:471
 msgid "permissions"
 msgstr "权限"
 
-#: builtin/init-db.c:507
+#: builtin/init-db.c:472
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "指定 git 仓库是多个用户之间共享的"
 
-#: builtin/init-db.c:541 builtin/init-db.c:546
+#: builtin/init-db.c:506 builtin/init-db.c:511
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "不能创建目录 %s"
 
-#: builtin/init-db.c:550
+#: builtin/init-db.c:515
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "不能切换目录到 %s"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:536
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
 "dir=<directory>)"
 msgstr "不允许 %s(或 --work-tree=<目录>)而没有指定 %s(或 --git-dir=<目录>)"
 
-#: builtin/init-db.c:599
+#: builtin/init-db.c:564
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "不能访问工作区 '%s'"
@@ -7151,33 +7208,33 @@
 msgid "name of output directory is too long"
 msgstr "输出目录名太长"
 
-#: builtin/log.c:814
+#: builtin/log.c:813
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "无法打开补丁文件 %s"
 
-#: builtin/log.c:828
+#: builtin/log.c:827
 msgid "Need exactly one range."
 msgstr "只需要一个范围。"
 
-#: builtin/log.c:838
+#: builtin/log.c:837
 msgid "Not a range."
 msgstr "不是一个范围。"
 
-#: builtin/log.c:944
+#: builtin/log.c:943
 msgid "Cover letter needs email format"
 msgstr "信封需要邮件地址格式"
 
-#: builtin/log.c:1023
+#: builtin/log.c:1022
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "不正常的 in-reply-to:%s"
 
-#: builtin/log.c:1051
+#: builtin/log.c:1050
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<选项>] [<从> | <版本范围>]"
 
-#: builtin/log.c:1096
+#: builtin/log.c:1095
 msgid "Two output directories?"
 msgstr "两个输出目录?"
 
@@ -7234,134 +7291,138 @@
 msgstr "不输出二进制差异"
 
 #: builtin/log.c:1241
+msgid "output all-zero hash in From header"
+msgstr "在 From 头信息中输出全为零的哈希值"
+
+#: builtin/log.c:1243
 msgid "don't include a patch matching a commit upstream"
 msgstr "不包含已在上游提交中的补丁"
 
-#: builtin/log.c:1243
+#: builtin/log.c:1245
 msgid "show patch format instead of default (patch + stat)"
 msgstr "显示纯补丁格式而非默认的(补丁+状态)"
 
-#: builtin/log.c:1245
+#: builtin/log.c:1247
 msgid "Messaging"
 msgstr "邮件发送"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1248
 msgid "header"
 msgstr "header"
 
-#: builtin/log.c:1247
+#: builtin/log.c:1249
 msgid "add email header"
 msgstr "添加邮件头"
 
-#: builtin/log.c:1248 builtin/log.c:1250
+#: builtin/log.c:1250 builtin/log.c:1252
 msgid "email"
 msgstr "邮件地址"
 
-#: builtin/log.c:1248
+#: builtin/log.c:1250
 msgid "add To: header"
 msgstr "添加收件人"
 
-#: builtin/log.c:1250
+#: builtin/log.c:1252
 msgid "add Cc: header"
 msgstr "添加抄送"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1254
 msgid "ident"
 msgstr "标识"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1255
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr "将 From 地址设置为 <标识>(如若不提供,则用提交者 ID 做为地址)"
 
-#: builtin/log.c:1255
+#: builtin/log.c:1257
 msgid "message-id"
 msgstr "邮件标识"
 
-#: builtin/log.c:1256
+#: builtin/log.c:1258
 msgid "make first mail a reply to <message-id>"
 msgstr "使第一封邮件作为对 <邮件标识> 的回复"
 
-#: builtin/log.c:1257 builtin/log.c:1260
+#: builtin/log.c:1259 builtin/log.c:1262
 msgid "boundary"
 msgstr "边界"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1260
 msgid "attach the patch"
 msgstr "附件方式添加补丁"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1263
 msgid "inline the patch"
 msgstr "内联显示补丁"
 
-#: builtin/log.c:1265
+#: builtin/log.c:1267
 msgid "enable message threading, styles: shallow, deep"
 msgstr "启用邮件线索,风格:浅,深"
 
-#: builtin/log.c:1267
+#: builtin/log.c:1269
 msgid "signature"
 msgstr "签名"
 
-#: builtin/log.c:1268
+#: builtin/log.c:1270
 msgid "add a signature"
 msgstr "添加一个签名"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1272
 msgid "add a signature from a file"
 msgstr "从文件添加一个签名"
 
-#: builtin/log.c:1271
+#: builtin/log.c:1273
 msgid "don't print the patch filenames"
 msgstr "不要打印补丁文件名"
 
-#: builtin/log.c:1360
+#: builtin/log.c:1362
 msgid "-n and -k are mutually exclusive."
 msgstr "-n 和 -k 互斥。"
 
-#: builtin/log.c:1362
+#: builtin/log.c:1364
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix 和 -k 互斥。"
 
-#: builtin/log.c:1370
+#: builtin/log.c:1372
 msgid "--name-only does not make sense"
 msgstr "--name-only 无意义"
 
-#: builtin/log.c:1372
+#: builtin/log.c:1374
 msgid "--name-status does not make sense"
 msgstr "--name-status 无意义"
 
-#: builtin/log.c:1374
+#: builtin/log.c:1376
 msgid "--check does not make sense"
 msgstr "--check 无意义"
 
-#: builtin/log.c:1397
+#: builtin/log.c:1401
 msgid "standard output, or directory, which one?"
 msgstr "标准输出或目录,哪一个?"
 
-#: builtin/log.c:1399
+#: builtin/log.c:1403
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "不能创建目录 '%s'"
 
-#: builtin/log.c:1496
+#: builtin/log.c:1500
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "无法读取签名文件 '%s'"
 
-#: builtin/log.c:1559
+#: builtin/log.c:1563
 msgid "Failed to create output files"
 msgstr "无法创建输出文件"
 
-#: builtin/log.c:1607
+#: builtin/log.c:1611
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<上游> [<头> [<限制>]]]"
 
-#: builtin/log.c:1661
+#: builtin/log.c:1665
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr "不能找到跟踪的远程分支,请手工指定 <上游>。\n"
 
-#: builtin/log.c:1672 builtin/log.c:1674 builtin/log.c:1686
+#: builtin/log.c:1676 builtin/log.c:1678 builtin/log.c:1690
 #, c-format
 msgid "Unknown commit %s"
 msgstr "未知提交 %s"
@@ -7462,35 +7523,35 @@
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<选项>] <树或提交> [<路径>...]"
 
-#: builtin/ls-tree.c:127
+#: builtin/ls-tree.c:128
 msgid "only show trees"
 msgstr "只显示树"
 
-#: builtin/ls-tree.c:129
+#: builtin/ls-tree.c:130
 msgid "recurse into subtrees"
 msgstr "递归到子树"
 
-#: builtin/ls-tree.c:131
+#: builtin/ls-tree.c:132
 msgid "show trees when recursing"
 msgstr "当递归时显示树"
 
-#: builtin/ls-tree.c:134
+#: builtin/ls-tree.c:135
 msgid "terminate entries with NUL byte"
 msgstr "条目以 NUL 字符终止"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:136
 msgid "include object size"
 msgstr "包括对象大小"
 
-#: builtin/ls-tree.c:137 builtin/ls-tree.c:139
+#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
 msgid "list only filenames"
 msgstr "只列出文件名"
 
-#: builtin/ls-tree.c:142
+#: builtin/ls-tree.c:143
 msgid "use full path names"
 msgstr "使用文件的全路径"
 
-#: builtin/ls-tree.c:144
+#: builtin/ls-tree.c:145
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr "列出整个树;不仅仅当前目录(隐含 --full-name)"
 
@@ -7720,16 +7781,16 @@
 msgid "No remote-tracking branch for %s from %s"
 msgstr "对于 %s 没有来自 %s 的远程跟踪分支"
 
-#: builtin/merge.c:1081
+#: builtin/merge.c:1079
 #, c-format
 msgid "could not close '%s'"
 msgstr "不能关闭 '%s'"
 
-#: builtin/merge.c:1208
+#: builtin/merge.c:1206
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "没有要终止的合并(MERGE_HEAD 丢失)。"
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1222
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7737,7 +7798,7 @@
 "您尚未结束您的合并(存在 MERGE_HEAD)。\n"
 "请在合并前先提交您的修改。"
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1229
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7745,51 +7806,51 @@
 "您尚未结束您的拣选(存在 CHERRY_PICK_HEAD)。\n"
 "请在合并前先提交您的修改。"
 
-#: builtin/merge.c:1234
+#: builtin/merge.c:1232
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "您尚未结束您的拣选(存在 CHERRY_PICK_HEAD)。"
 
-#: builtin/merge.c:1243
+#: builtin/merge.c:1241
 msgid "You cannot combine --squash with --no-ff."
 msgstr "您不能将 --squash 与 --no-ff 同时使用。"
 
-#: builtin/merge.c:1251
+#: builtin/merge.c:1249
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "未指定提交并且 merge.defaultToUpstream 未设置。"
 
-#: builtin/merge.c:1268
+#: builtin/merge.c:1266
 msgid "Squash commit into empty head not supported yet"
 msgstr "尚不支持到空分支的压缩提交"
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1268
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "到空分支的非快进式提交没有意义"
 
-#: builtin/merge.c:1276
+#: builtin/merge.c:1274
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - 不能被合并"
 
-#: builtin/merge.c:1278
+#: builtin/merge.c:1276
 msgid "Can merge only exactly one commit into empty head"
 msgstr "只能将一个提交合并到空分支上"
 
-#: builtin/merge.c:1333
+#: builtin/merge.c:1331
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "提交 %s 有一个非可信的声称来自 %s 的 GPG 签名。"
 
-#: builtin/merge.c:1336
+#: builtin/merge.c:1334
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "提交 %s 有一个错误的声称来自 %s 的 GPG 签名。"
 
-#: builtin/merge.c:1339
+#: builtin/merge.c:1337
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "提交 %s 没有一个 GPG 签名。"
 
-#: builtin/merge.c:1342
+#: builtin/merge.c:1340
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "提交 %s 有一个来自 %s 的好的 GPG 签名。\n"
@@ -7799,46 +7860,46 @@
 msgid "Updating %s..%s\n"
 msgstr "更新 %s..%s\n"
 
-#: builtin/merge.c:1462
+#: builtin/merge.c:1460
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "尝试非常小的索引内合并...\n"
 
-#: builtin/merge.c:1469
+#: builtin/merge.c:1467
 #, c-format
 msgid "Nope.\n"
 msgstr "无。\n"
 
-#: builtin/merge.c:1501
+#: builtin/merge.c:1499
 msgid "Not possible to fast-forward, aborting."
 msgstr "无法快进,终止。"
 
-#: builtin/merge.c:1524 builtin/merge.c:1603
+#: builtin/merge.c:1522 builtin/merge.c:1601
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "将树回滚至原始状态...\n"
 
-#: builtin/merge.c:1528
+#: builtin/merge.c:1526
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "尝试合并策略 %s...\n"
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1592
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "没有合并策略处理此合并。\n"
 
-#: builtin/merge.c:1596
+#: builtin/merge.c:1594
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "使用策略 %s 合并失败。\n"
 
-#: builtin/merge.c:1605
+#: builtin/merge.c:1603
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "使用 %s 以准备手工解决。\n"
 
-#: builtin/merge.c:1617
+#: builtin/merge.c:1615
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr "自动合并进展顺利,按要求在提交前停止\n"
@@ -8026,48 +8087,48 @@
 msgid "Renaming %s to %s\n"
 msgstr "重命名 %s 至 %s\n"
 
-#: builtin/mv.c:256 builtin/remote.c:722 builtin/repack.c:362
+#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "重命名 '%s' 失败"
 
-#: builtin/name-rev.c:255
+#: builtin/name-rev.c:251
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<选项>] <提交>..."
 
-#: builtin/name-rev.c:256
+#: builtin/name-rev.c:252
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<选项>] --all"
 
-#: builtin/name-rev.c:257
+#: builtin/name-rev.c:253
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<选项>] --stdin"
 
-#: builtin/name-rev.c:309
+#: builtin/name-rev.c:305
 msgid "print only names (no SHA-1)"
 msgstr "只打印名称(无 SHA-1)"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:306
 msgid "only use tags to name the commits"
 msgstr "只使用标签来命名提交"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:308
 msgid "only use refs matching <pattern>"
 msgstr "只使用和 <模式> 相匹配的引用"
 
-#: builtin/name-rev.c:314
+#: builtin/name-rev.c:310
 msgid "list all commits reachable from all refs"
 msgstr "列出可以从所有引用访问的提交"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:311
 msgid "read from stdin"
 msgstr "从标准输入读取"
 
-#: builtin/name-rev.c:316
+#: builtin/name-rev.c:312
 msgid "allow to print `undefined` names (default)"
 msgstr "允许打印 `未定义` 的名称(默认)"
 
-#: builtin/name-rev.c:322
+#: builtin/name-rev.c:318
 msgid "dereference tags in the input (internal use)"
 msgstr "反向解析输入中的标签(内部使用)"
 
@@ -8194,7 +8255,7 @@
 msgid "failed to finish 'show' for object '%s'"
 msgstr "无法为对象 '%s' 完成 'show'"
 
-#: builtin/notes.c:174 builtin/tag.c:477
+#: builtin/notes.c:174 builtin/tag.c:248
 #, c-format
 msgid "could not create file '%s'"
 msgstr "不能创建文件 '%s'"
@@ -8212,12 +8273,12 @@
 msgid "The note contents have been left in %s"
 msgstr "注解内容被留在 %s 中"
 
-#: builtin/notes.c:232 builtin/tag.c:695
+#: builtin/notes.c:232 builtin/tag.c:440
 #, c-format
 msgid "cannot read '%s'"
 msgstr "不能读取 '%s'"
 
-#: builtin/notes.c:234 builtin/tag.c:698
+#: builtin/notes.c:234 builtin/tag.c:443
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "不能打开或读取 '%s'"
@@ -8225,7 +8286,7 @@
 #: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306
 #: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507
 #: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653
-#: builtin/notes.c:877 builtin/tag.c:711
+#: builtin/notes.c:877 builtin/tag.c:456
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "无法解析 '%s' 为一个有效引用。"
@@ -8259,11 +8320,6 @@
 msgid "note contents in a file"
 msgstr "注解内容到一个文件中"
 
-#: builtin/notes.c:398 builtin/notes.c:401 builtin/notes.c:561
-#: builtin/notes.c:564 builtin/tag.c:630
-msgid "object"
-msgstr "对象"
-
 #: builtin/notes.c:399 builtin/notes.c:562
 msgid "reuse and edit specified note object"
 msgstr "重用和编辑指定的注解对象"
@@ -8386,7 +8442,7 @@
 msgid "use notes from <notes-ref>"
 msgstr "从 <注解引用> 使用注解"
 
-#: builtin/notes.c:1012 builtin/remote.c:1588
+#: builtin/notes.c:1012 builtin/remote.c:1647
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "未知子命令:%s"
@@ -8592,20 +8648,24 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <时间>] [--] [<头>...]"
 
-#: builtin/prune.c:105 builtin/worktree.c:121
+#: builtin/prune.c:105 builtin/worktree.c:124
 msgid "do not remove, show only"
 msgstr "不删除,只显示"
 
-#: builtin/prune.c:106 builtin/worktree.c:122
+#: builtin/prune.c:106 builtin/worktree.c:125
 msgid "report pruned objects"
 msgstr "报告清除的对象"
 
-#: builtin/prune.c:109 builtin/worktree.c:124
+#: builtin/prune.c:109 builtin/worktree.c:127
 msgid "expire objects older than <time>"
 msgstr "使早于给定时间的对象过期"
 
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
+msgstr "不能在珍品仓库中执行清理操作"
+
 #: builtin/pull.c:69
-msgid "git pull [options] [<repository> [<refspec>...]]"
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [<选项>] [<仓库> [<引用规格>...]]"
 
 #: builtin/pull.c:113
@@ -8751,19 +8811,19 @@
 msgid "Cannot rebase onto multiple branches."
 msgstr "无法变基到多个分支。"
 
-#: builtin/push.c:15
+#: builtin/push.c:16
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [<选项>] [<仓库> [<引用规格>...]]"
 
-#: builtin/push.c:86
+#: builtin/push.c:88
 msgid "tag shorthand without <tag>"
 msgstr "标签后面未提供 <标签> 参数"
 
-#: builtin/push.c:96
+#: builtin/push.c:98
 msgid "--delete only accepts plain target ref names"
 msgstr "--delete 只接受简单的目标引用名"
 
-#: builtin/push.c:140
+#: builtin/push.c:142
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -8771,7 +8831,7 @@
 "\n"
 "为了永久地选择任一选项,参见 'git help config' 中的 push.default。"
 
-#: builtin/push.c:143
+#: builtin/push.c:145
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -8795,7 +8855,7 @@
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:158
+#: builtin/push.c:160
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -8809,7 +8869,7 @@
 "\n"
 "    git push %s HEAD:<远程分支名字>\n"
 
-#: builtin/push.c:172
+#: builtin/push.c:174
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -8822,12 +8882,12 @@
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:180
+#: builtin/push.c:182
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr "当前分支 %s 有多个上游分支,拒绝推送。"
 
-#: builtin/push.c:183
+#: builtin/push.c:185
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -8838,7 +8898,7 @@
 "而没有告诉我要推送什么、更新哪个远程分支。"
 
 #  译者:字符串首行行首要添加“warning: ”字串,故此首行要较其余行短
-#: builtin/push.c:206
+#: builtin/push.c:208
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -8881,12 +8941,12 @@
 "('simple' 模式由 Git 1.7.11 版本引入。如果您有时要使用老版本的 Git,\n"
 "为保持兼容,请用 'current' 代替 'simple')"
 
-#: builtin/push.c:273
+#: builtin/push.c:275
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr "您没有为推送指定任何引用规格,并且 push.default 为 \"nothing\"。"
 
-#: builtin/push.c:280
+#: builtin/push.c:282
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -8897,7 +8957,7 @@
 "再次推送前,先与远程变更合并(如 'git pull ...')。详见\n"
 "'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:286
+#: builtin/push.c:288
 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"
@@ -8908,7 +8968,7 @@
 "检出该分支并整合远程变更(如 'git pull ...'),然后再推送。详见\n"
 "'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:292
+#: builtin/push.c:294
 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"
@@ -8921,11 +8981,11 @@
 "(如 'git pull ...')。\n"
 "详见 'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:299
+#: builtin/push.c:301
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr "更新被拒绝,因为该标签在远程已经存在。"
 
-#: builtin/push.c:302
+#: builtin/push.c:304
 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"
@@ -8934,22 +8994,22 @@
 "如果不使用 '--force' 参数,您不能更新一个指向非提交对象的远程引用,\n"
 "也不能更新远程引用让其指向一个非提交对象。\n"
 
-#: builtin/push.c:361
+#: builtin/push.c:363
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "推送到 %s\n"
 
-#: builtin/push.c:365
+#: builtin/push.c:367
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "无法推送一些引用到 '%s'"
 
-#: builtin/push.c:395
+#: builtin/push.c:397
 #, c-format
 msgid "bad repository '%s'"
 msgstr "坏的仓库 '%s'"
 
-#: builtin/push.c:396
+#: builtin/push.c:398
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -8970,100 +9030,105 @@
 "\n"
 "    git push <名称>\n"
 
-#: builtin/push.c:411
+#: builtin/push.c:413
 msgid "--all and --tags are incompatible"
 msgstr "--all 和 --tags 不兼容"
 
-#: builtin/push.c:412
+#: builtin/push.c:414
 msgid "--all can't be combined with refspecs"
 msgstr "--all 不能和引用规格同时使用"
 
-#: builtin/push.c:417
+#: builtin/push.c:419
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror 和 --tags 不兼容"
 
-#: builtin/push.c:418
+#: builtin/push.c:420
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror 不能和引用规格同时使用"
 
-#: builtin/push.c:423
+#: builtin/push.c:425
 msgid "--all and --mirror are incompatible"
 msgstr "--all 和 --mirror 不兼容"
 
-#: builtin/push.c:539
+#: builtin/push.c:537
 msgid "repository"
 msgstr "仓库"
 
-#: builtin/push.c:540 builtin/send-pack.c:161
+#: builtin/push.c:538 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "推送所有引用"
 
-#: builtin/push.c:541 builtin/send-pack.c:163
+#: builtin/push.c:539 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "镜像所有引用"
 
-#: builtin/push.c:543
+#: builtin/push.c:541
 msgid "delete refs"
 msgstr "删除引用"
 
-#: builtin/push.c:544
+#: builtin/push.c:542
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "推送标签(不能使用 --all or --mirror)"
 
-#: builtin/push.c:547 builtin/send-pack.c:164
+#: builtin/push.c:545 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "强制更新"
 
-#: builtin/push.c:549 builtin/send-pack.c:175
+#: builtin/push.c:547 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "引用名>:<期望值"
 
-#: builtin/push.c:550 builtin/send-pack.c:176
+#: builtin/push.c:548 builtin/send-pack.c:176
 msgid "require old value of ref to be at this value"
 msgstr "要求引用旧的取值为设定值"
 
-#: builtin/push.c:553
+#  译者:可选值,不能翻译
+#: builtin/push.c:550
+msgid "check|on-demand|no"
+msgstr "check|on-demand|no"
+
+#: builtin/push.c:551
 msgid "control recursive pushing of submodules"
 msgstr "控制子模组的递归推送"
 
-#: builtin/push.c:555 builtin/send-pack.c:169
+#: builtin/push.c:553 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "使用精简打包"
 
-#: builtin/push.c:556 builtin/push.c:557 builtin/send-pack.c:158
+#: builtin/push.c:554 builtin/push.c:555 builtin/send-pack.c:158
 #: builtin/send-pack.c:159
 msgid "receive pack program"
 msgstr "接收包程序"
 
-#: builtin/push.c:558
+#: builtin/push.c:556
 msgid "set upstream for git pull/status"
 msgstr "设置 git pull/status 的上游"
 
-#: builtin/push.c:561
+#: builtin/push.c:559
 msgid "prune locally removed refs"
 msgstr "清除本地删除的引用"
 
-#: builtin/push.c:563
+#: builtin/push.c:561
 msgid "bypass pre-push hook"
 msgstr "绕过 pre-push 钩子"
 
-#: builtin/push.c:564
+#: builtin/push.c:562
 msgid "push missing but relevant tags"
 msgstr "推送缺失但有关的标签"
 
-#: builtin/push.c:567 builtin/send-pack.c:166
+#: builtin/push.c:565 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "用 GPG 为推送签名"
 
-#: builtin/push.c:569 builtin/send-pack.c:170
+#: builtin/push.c:567 builtin/send-pack.c:170
 msgid "request atomic transaction on remote side"
 msgstr "需要远端支持原子事务"
 
-#: builtin/push.c:579
+#: builtin/push.c:577
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete 与 --all、--mirror 及 --tags 不兼容"
 
-#: builtin/push.c:581
+#: builtin/push.c:579
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete 未接任何引用没有意义"
 
@@ -9141,12 +9206,12 @@
 msgid "debug unpack-trees"
 msgstr "调试 unpack-trees"
 
-#: builtin/reflog.c:432
+#: builtin/reflog.c:428
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
 msgstr "'%2$s' 的值 '%1$s' 不是一个有效的时间戳"
 
-#: builtin/reflog.c:549 builtin/reflog.c:554
+#: builtin/reflog.c:545 builtin/reflog.c:550
 #, c-format
 msgid "'%s' is not a valid timestamp"
 msgstr "'%s' 不是一个有效的时间戳"
@@ -9163,15 +9228,15 @@
 "git remote add [-t <分支>] [-m <master>] [-f] [--tags | --no-tags] [--"
 "mirror=<fetch|push>] <名称> <地址>"
 
-#: builtin/remote.c:14 builtin/remote.c:33
+#: builtin/remote.c:14 builtin/remote.c:34
 msgid "git remote rename <old> <new>"
 msgstr "git remote rename <旧名称> <新名称>"
 
-#: builtin/remote.c:15 builtin/remote.c:38
+#: builtin/remote.c:15 builtin/remote.c:39
 msgid "git remote remove <name>"
 msgstr "git remote remove <名称>"
 
-#: builtin/remote.c:16 builtin/remote.c:43
+#: builtin/remote.c:16 builtin/remote.c:44
 msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
 msgstr "git remote set-head <名称> (-a | --auto | -d | --delete | <分支>)"
 
@@ -9192,48 +9257,52 @@
 msgid "git remote set-branches [--add] <name> <branch>..."
 msgstr "git remote set-branches [--add] <名称> <分支>..."
 
-#: builtin/remote.c:21 builtin/remote.c:69
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr "git remote get-url [--push] [--all] <名称>"
+
+#: builtin/remote.c:22 builtin/remote.c:75
 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
 msgstr "git remote set-url [--push] <名称> <新的地址> [<旧的地址>]"
 
-#: builtin/remote.c:22 builtin/remote.c:70
+#: builtin/remote.c:23 builtin/remote.c:76
 msgid "git remote set-url --add <name> <newurl>"
 msgstr "git remote set-url --add <名称> <新的地址>"
 
-#: builtin/remote.c:23 builtin/remote.c:71
+#: builtin/remote.c:24 builtin/remote.c:77
 msgid "git remote set-url --delete <name> <url>"
 msgstr "git remote set-url --delete <名称> <地址>"
 
-#: builtin/remote.c:28
+#: builtin/remote.c:29
 msgid "git remote add [<options>] <name> <url>"
 msgstr "git remote add [<选项>] <名称> <地址>"
 
-#: builtin/remote.c:48
+#: builtin/remote.c:49
 msgid "git remote set-branches <name> <branch>..."
 msgstr "git remote set-branches <名称> <分支>..."
 
-#: builtin/remote.c:49
+#: builtin/remote.c:50
 msgid "git remote set-branches --add <name> <branch>..."
 msgstr "git remote set-branches --add <名称> <分支>..."
 
-#: builtin/remote.c:54
+#: builtin/remote.c:55
 msgid "git remote show [<options>] <name>"
 msgstr "git remote show [<选项>] <名称>"
 
-#: builtin/remote.c:59
+#: builtin/remote.c:60
 msgid "git remote prune [<options>] <name>"
 msgstr "git remote prune [<选项>] <名称>"
 
-#: builtin/remote.c:64
+#: builtin/remote.c:65
 msgid "git remote update [<options>] [<group> | <remote>]..."
 msgstr "git remote update [<选项>] [<组> | <远程>]..."
 
-#: builtin/remote.c:88
+#: builtin/remote.c:94
 #, c-format
 msgid "Updating %s"
 msgstr "更新 %s 中"
 
-#: builtin/remote.c:120
+#: builtin/remote.c:126
 msgid ""
 "--mirror is dangerous and deprecated; please\n"
 "\t use --mirror=fetch or --mirror=push instead"
@@ -9241,96 +9310,96 @@
 "--mirror 选项危险且过时,请使用 --mirror=fetch\n"
 "\t 或 --mirror=push"
 
-#: builtin/remote.c:137
+#: builtin/remote.c:143
 #, c-format
 msgid "unknown mirror argument: %s"
 msgstr "未知的镜像参数:%s"
 
-#: builtin/remote.c:153
+#: builtin/remote.c:159
 msgid "fetch the remote branches"
 msgstr "抓取远程的分支"
 
-#: builtin/remote.c:155
+#: builtin/remote.c:161
 msgid "import all tags and associated objects when fetching"
 msgstr "抓取时导入所有的标签和关联对象"
 
-#: builtin/remote.c:158
+#: builtin/remote.c:164
 msgid "or do not fetch any tag at all (--no-tags)"
 msgstr "或不抓取任何标签(--no-tags)"
 
-#: builtin/remote.c:160
+#: builtin/remote.c:166
 msgid "branch(es) to track"
 msgstr "跟踪的分支"
 
-#: builtin/remote.c:161
+#: builtin/remote.c:167
 msgid "master branch"
 msgstr "主线分支"
 
-#: builtin/remote.c:162
+#: builtin/remote.c:168
 msgid "push|fetch"
 msgstr "push|fetch"
 
-#: builtin/remote.c:163
+#: builtin/remote.c:169
 msgid "set up remote as a mirror to push to or fetch from"
 msgstr "把远程设置为用以推送或抓取的镜像"
 
-#: builtin/remote.c:175
+#: builtin/remote.c:181
 msgid "specifying a master branch makes no sense with --mirror"
 msgstr "指定一个 master 分支并使用 --mirror 选项没有意义"
 
-#: builtin/remote.c:177
+#: builtin/remote.c:183
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr "指定要跟踪的分支只在与获取镜像同时使用才有意义"
 
-#: builtin/remote.c:187 builtin/remote.c:637
+#: builtin/remote.c:193 builtin/remote.c:643
 #, c-format
 msgid "remote %s already exists."
 msgstr "远程 %s 已经存在。"
 
-#: builtin/remote.c:191 builtin/remote.c:641
+#: builtin/remote.c:197 builtin/remote.c:647
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "'%s' 不是一个有效的远程名称"
 
-#: builtin/remote.c:235
+#: builtin/remote.c:241
 #, c-format
 msgid "Could not setup master '%s'"
 msgstr "无法设置 master '%s'"
 
-#: builtin/remote.c:335
+#: builtin/remote.c:341
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr "无法得到引用规格 %s 的获取列表"
 
-#: builtin/remote.c:436 builtin/remote.c:444
+#: builtin/remote.c:442 builtin/remote.c:450
 msgid "(matching)"
 msgstr "(匹配)"
 
-#: builtin/remote.c:448
+#: builtin/remote.c:454
 msgid "(delete)"
 msgstr "(删除)"
 
-#: builtin/remote.c:588 builtin/remote.c:594 builtin/remote.c:600
+#: builtin/remote.c:594 builtin/remote.c:600 builtin/remote.c:606
 #, c-format
 msgid "Could not append '%s' to '%s'"
 msgstr "不能添加 '%s' 至 '%s'"
 
-#: builtin/remote.c:630 builtin/remote.c:769 builtin/remote.c:869
+#: builtin/remote.c:636 builtin/remote.c:775 builtin/remote.c:875
 #, c-format
 msgid "No such remote: %s"
 msgstr "没有这样的远程:%s"
 
-#: builtin/remote.c:647
+#: builtin/remote.c:653
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "不能重命名配置小节 '%s' 到 '%s'"
 
-#: builtin/remote.c:653 builtin/remote.c:821
+#: builtin/remote.c:659 builtin/remote.c:827
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "不能移除配置小节 '%s'"
 
-#: builtin/remote.c:668
+#: builtin/remote.c:674
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -9341,27 +9410,27 @@
 "\t%s\n"
 "\t如果必要请手动更新配置。"
 
-#: builtin/remote.c:674
+#: builtin/remote.c:680
 #, c-format
 msgid "Could not append '%s'"
 msgstr "不能追加 '%s'"
 
-#: builtin/remote.c:685
+#: builtin/remote.c:691
 #, c-format
 msgid "Could not set '%s'"
 msgstr "不能设置 '%s'"
 
-#: builtin/remote.c:707
+#: builtin/remote.c:713
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "删除 '%s' 失败"
 
-#: builtin/remote.c:741
+#: builtin/remote.c:747
 #, c-format
 msgid "creating '%s' failed"
 msgstr "创建 '%s' 失败"
 
-#: builtin/remote.c:807
+#: builtin/remote.c:813
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -9371,126 +9440,126 @@
 msgstr[0] "注意:ref/remotes 层级之外的一个分支未被移除。要删除它,使用:"
 msgstr[1] "注意:ref/remotes 层级之外的一些分支未被移除。要删除它们,使用:"
 
-#: builtin/remote.c:922
+#: builtin/remote.c:928
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " 新的(下一次获取将存储于 remotes/%s)"
 
-#: builtin/remote.c:925
+#: builtin/remote.c:931
 msgid " tracked"
 msgstr " 已跟踪"
 
-#: builtin/remote.c:927
+#: builtin/remote.c:933
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " 过时(使用 'git remote prune' 来移除)"
 
-#: builtin/remote.c:929
+#: builtin/remote.c:935
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:976
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "无效的 branch.%s.merge,不能变基到一个以上的分支"
 
-#: builtin/remote.c:977
+#: builtin/remote.c:983
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "变基到远程 %s"
 
-#: builtin/remote.c:980
+#: builtin/remote.c:986
 #, c-format
 msgid " merges with remote %s"
 msgstr " 与远程 %s 合并"
 
-#: builtin/remote.c:981
+#: builtin/remote.c:987
 msgid "    and with remote"
 msgstr "    且有远程"
 
-#: builtin/remote.c:983
+#: builtin/remote.c:989
 #, c-format
 msgid "merges with remote %s"
 msgstr "与远程 %s 合并"
 
-#: builtin/remote.c:984
+#: builtin/remote.c:990
 msgid "   and with remote"
 msgstr "   且有远程"
 
-#: builtin/remote.c:1030
+#: builtin/remote.c:1036
 msgid "create"
 msgstr "创建"
 
-#: builtin/remote.c:1033
+#: builtin/remote.c:1039
 msgid "delete"
 msgstr "删除"
 
-#: builtin/remote.c:1037
+#: builtin/remote.c:1043
 msgid "up to date"
 msgstr "最新"
 
-#: builtin/remote.c:1040
+#: builtin/remote.c:1046
 msgid "fast-forwardable"
 msgstr "可快进"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1049
 msgid "local out of date"
 msgstr "本地已过时"
 
-#: builtin/remote.c:1050
+#: builtin/remote.c:1056
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s 强制推送至 %-*s (%s)"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1059
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s 推送至 %-*s (%s)"
 
-#: builtin/remote.c:1057
+#: builtin/remote.c:1063
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s 强制推送至 %s"
 
-#: builtin/remote.c:1060
+#: builtin/remote.c:1066
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s 推送至 %s"
 
-#: builtin/remote.c:1128
+#: builtin/remote.c:1134
 msgid "do not query remotes"
 msgstr "不查询远程"
 
-#: builtin/remote.c:1155
+#: builtin/remote.c:1161
 #, c-format
 msgid "* remote %s"
 msgstr "* 远程 %s"
 
-#: builtin/remote.c:1156
+#: builtin/remote.c:1162
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  获取地址:%s"
 
-#: builtin/remote.c:1157 builtin/remote.c:1308
+#: builtin/remote.c:1163 builtin/remote.c:1314
 msgid "(no URL)"
 msgstr "(无 URL)"
 
-#: builtin/remote.c:1166 builtin/remote.c:1168
+#: builtin/remote.c:1172 builtin/remote.c:1174
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  推送地址:%s"
 
-#: builtin/remote.c:1170 builtin/remote.c:1172 builtin/remote.c:1174
+#: builtin/remote.c:1176 builtin/remote.c:1178 builtin/remote.c:1180
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  HEAD 分支:%s"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1182
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr "  HEAD 分支(远程 HEAD 模糊,可能是下列中的一个):\n"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1194
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
@@ -9498,138 +9567,151 @@
 msgstr[1] "  远程分支:%s"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/remote.c:1191 builtin/remote.c:1218
+#: builtin/remote.c:1197 builtin/remote.c:1224
 msgid " (status not queried)"
 msgstr "(状态未查询)"
 
-#: builtin/remote.c:1200
+#: builtin/remote.c:1206
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  为 'git pull' 配置的本地分支:"
 msgstr[1] "  为 'git pull' 配置的本地分支:"
 
-#: builtin/remote.c:1208
+#: builtin/remote.c:1214
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  本地引用将在 'git push' 时被镜像"
 
-#: builtin/remote.c:1215
+#: builtin/remote.c:1221
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  为 'git push' 配置的本地引用%s:"
 msgstr[1] "  为 'git push' 配置的本地引用%s:"
 
-#: builtin/remote.c:1236
+#: builtin/remote.c:1242
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "根据远程设置 refs/remotes/<名称>/HEAD"
 
-#: builtin/remote.c:1238
+#: builtin/remote.c:1244
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "删除 refs/remotes/<名称>/HEAD"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1259
 msgid "Cannot determine remote HEAD"
 msgstr "无法确定远程 HEAD"
 
-#: builtin/remote.c:1255
+#: builtin/remote.c:1261
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "多个远程 HEAD 分支。请明确地选择一个用命令:"
 
-#: builtin/remote.c:1265
+#: builtin/remote.c:1271
 #, c-format
 msgid "Could not delete %s"
 msgstr "无法删除 %s"
 
-#: builtin/remote.c:1273
+#: builtin/remote.c:1279
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "不是一个有效引用:%s"
 
-#: builtin/remote.c:1275
+#: builtin/remote.c:1281
 #, c-format
 msgid "Could not setup %s"
 msgstr "不能设置 %s"
 
 #  译者:注意保持前导空格
-#: builtin/remote.c:1293
+#: builtin/remote.c:1299
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s 将成为摇摆状态!"
 
 #  译者:注意保持前导空格
-#: builtin/remote.c:1294
+#: builtin/remote.c:1300
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s 已成为摇摆状态!"
 
-#: builtin/remote.c:1304
+#: builtin/remote.c:1310
 #, c-format
 msgid "Pruning %s"
 msgstr "修剪 %s"
 
-#: builtin/remote.c:1305
+#: builtin/remote.c:1311
 #, c-format
 msgid "URL: %s"
 msgstr "URL:%s"
 
-#: builtin/remote.c:1321
+#: builtin/remote.c:1327
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [将删除] %s"
 
-#: builtin/remote.c:1324
+#: builtin/remote.c:1330
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [已删除] %s"
 
-#: builtin/remote.c:1369
+#: builtin/remote.c:1375
 msgid "prune remotes after fetching"
 msgstr "抓取后清除远程"
 
-#: builtin/remote.c:1435 builtin/remote.c:1509
+#: builtin/remote.c:1441 builtin/remote.c:1498 builtin/remote.c:1566
 #, c-format
 msgid "No such remote '%s'"
 msgstr "没有此远程 '%s'"
 
-#: builtin/remote.c:1455
+#: builtin/remote.c:1461
 msgid "add branch"
 msgstr "添加分支"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1468
 msgid "no remote specified"
 msgstr "未指定远程"
 
-#: builtin/remote.c:1484
+#: builtin/remote.c:1485
+msgid "query push URLs rather than fetch URLs"
+msgstr "查询推送 URL 地址,而非获取 URL 地址"
+
+#: builtin/remote.c:1487
+msgid "return all URLs"
+msgstr "返回所有 URL 地址"
+
+#: builtin/remote.c:1515
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr "没有给远程仓库 '%s' 设定 URL"
+
+#: builtin/remote.c:1541
 msgid "manipulate push URLs"
 msgstr "操作推送 URLS"
 
-#: builtin/remote.c:1486
+#: builtin/remote.c:1543
 msgid "add URL"
 msgstr "添加 URL"
 
-#: builtin/remote.c:1488
+#: builtin/remote.c:1545
 msgid "delete URLs"
 msgstr "删除 URLS"
 
-#: builtin/remote.c:1495
+#: builtin/remote.c:1552
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete 无意义"
 
-#: builtin/remote.c:1535
+#: builtin/remote.c:1592
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "无效的旧 URL 匹配模版:%s"
 
-#: builtin/remote.c:1543
+#: builtin/remote.c:1600
 #, c-format
 msgid "No such URL found: %s"
 msgstr "未找到此 URL:%s"
 
-#: builtin/remote.c:1545
+#: builtin/remote.c:1602
 msgid "Will not delete all non-push URLs"
 msgstr "将不会删除所有非推送 URL 地址"
 
-#: builtin/remote.c:1559
+#: builtin/remote.c:1616
 msgid "be verbose; must be placed before a subcommand"
 msgstr "冗长输出;必须置于子命令之前"
 
@@ -9701,7 +9783,11 @@
 msgid "repack objects in packs marked with .keep"
 msgstr "对标记为 .keep 的包中的对象重新打包"
 
-#: builtin/repack.c:378
+#: builtin/repack.c:197
+msgid "cannot delete packs in a precious-objects repo"
+msgstr "不能删除珍品仓库中的打包文件"
+
+#: builtin/repack.c:381
 #, c-format
 msgid "removing '%s' failed"
 msgstr "删除 '%s' 失败"
@@ -9794,7 +9880,7 @@
 msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
 msgstr "git rerere [clear | forget <路径>... | status | remaining | diff | gc]"
 
-#: builtin/rerere.c:57
+#: builtin/rerere.c:58
 msgid "register clean resolutions in index"
 msgstr "在索引中注册干净的解决方案"
 
@@ -9930,23 +10016,23 @@
 msgid "rev-list does not support display of notes"
 msgstr "rev-list 不支持显示注解"
 
-#: builtin/rev-parse.c:361
+#: builtin/rev-parse.c:358
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<选项>] -- [<参数>...]"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:363
 msgid "keep the `--` passed as an arg"
 msgstr "保持 `--` 作为一个参数传递"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:365
 msgid "stop parsing after the first non-option argument"
 msgstr "遇到第一个非选项参数后停止解析"
 
-#: builtin/rev-parse.c:371
+#: builtin/rev-parse.c:368
 msgid "output in stuck long form"
 msgstr "以固定长格式输出"
 
-#: builtin/rev-parse.c:502
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -10195,7 +10281,7 @@
 msgid "Linewrap output"
 msgstr "折行输出"
 
-#: builtin/show-branch.c:9
+#: builtin/show-branch.c:10
 msgid ""
 "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
 "\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
@@ -10207,71 +10293,71 @@
 "\t\t[--more=<n> | --list | --independent | --merge-base]\n"
 "\t\t[--no-name | --sha1-name] [--topics] [(<版本> | <通配符>)...]"
 
-#: builtin/show-branch.c:13
+#: builtin/show-branch.c:14
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<引用>]"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:640
 msgid "show remote-tracking and local branches"
 msgstr "显示远程跟踪的和本地的分支"
 
-#: builtin/show-branch.c:661
+#: builtin/show-branch.c:642
 msgid "show remote-tracking branches"
 msgstr "显示远程跟踪的分支"
 
-#: builtin/show-branch.c:663
+#: builtin/show-branch.c:644
 msgid "color '*!+-' corresponding to the branch"
 msgstr "着色 '*!+-' 到相应的分支"
 
-#: builtin/show-branch.c:665
+#: builtin/show-branch.c:646
 msgid "show <n> more commits after the common ancestor"
 msgstr "显示共同祖先后的 <n> 个提交"
 
-#: builtin/show-branch.c:667
+#: builtin/show-branch.c:648
 msgid "synonym to more=-1"
 msgstr "和 more=-1 同义"
 
-#: builtin/show-branch.c:668
+#: builtin/show-branch.c:649
 msgid "suppress naming strings"
 msgstr "不显示字符串命名"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:651
 msgid "include the current branch"
 msgstr "包括当前分支"
 
-#: builtin/show-branch.c:672
+#: builtin/show-branch.c:653
 msgid "name commits with their object names"
 msgstr "以对象名字命名提交"
 
-#: builtin/show-branch.c:674
+#: builtin/show-branch.c:655
 msgid "show possible merge bases"
 msgstr "显示可能合并的基线"
 
-#: builtin/show-branch.c:676
+#: builtin/show-branch.c:657
 msgid "show refs unreachable from any other ref"
 msgstr "显示没有任何引用的的引用"
 
-#: builtin/show-branch.c:678
+#: builtin/show-branch.c:659
 msgid "show commits in topological order"
 msgstr "以拓扑顺序显示提交"
 
-#: builtin/show-branch.c:681
+#: builtin/show-branch.c:662
 msgid "show only commits not on the first branch"
 msgstr "只显示不在第一个分支上的提交"
 
-#: builtin/show-branch.c:683
+#: builtin/show-branch.c:664
 msgid "show merges reachable from only one tip"
 msgstr "显示仅一个分支可访问的合并提交"
 
-#: builtin/show-branch.c:685
+#: builtin/show-branch.c:666
 msgid "topologically sort, maintaining date order where possible"
 msgstr "拓扑方式排序,并尽可能地保持日期顺序"
 
-#: builtin/show-branch.c:688
+#: builtin/show-branch.c:669
 msgid "<n>[,<base>]"
 msgstr "<n>[,<base>]"
 
-#: builtin/show-branch.c:689
+#: builtin/show-branch.c:670
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "显示从 base 开始的 <n> 条最近的引用日志记录"
 
@@ -10284,41 +10370,133 @@
 "hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<模式>...]"
 
 #: builtin/show-ref.c:11
-msgid "git show-ref --exclude-existing[=<pattern>] < <ref-list>"
-msgstr "git show-ref --exclude-existing[=<模式>] < <引用列表>"
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr "git show-ref --exclude-existing[=<模式>]"
 
-#: builtin/show-ref.c:170
+#: builtin/show-ref.c:165
 msgid "only show tags (can be combined with heads)"
 msgstr "只显示标签(可以和头共用)"
 
-#: builtin/show-ref.c:171
+#: builtin/show-ref.c:166
 msgid "only show heads (can be combined with tags)"
 msgstr "只显示头(可以和标签共用)"
 
-#: builtin/show-ref.c:172
+#: builtin/show-ref.c:167
 msgid "stricter reference checking, requires exact ref path"
 msgstr "更严格的引用检测,需要精确的引用路径"
 
-#: builtin/show-ref.c:175 builtin/show-ref.c:177
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "显示 HEAD 引用,即使被过滤掉"
 
-#: builtin/show-ref.c:179
+#: builtin/show-ref.c:174
 msgid "dereference tags into object IDs"
 msgstr "转换标签到对象 ID"
 
-#: builtin/show-ref.c:181
+#: builtin/show-ref.c:176
 msgid "only show SHA1 hash using <n> digits"
 msgstr "只显示使用 <n> 个数字的 SHA1 哈希"
 
-#: builtin/show-ref.c:185
+#: builtin/show-ref.c:180
 msgid "do not print results to stdout (useful with --verify)"
 msgstr "不打印结果到标准输出(例如与 --verify 参数共用)"
 
-#: builtin/show-ref.c:187
+#: builtin/show-ref.c:182
 msgid "show refs from stdin that aren't in local repository"
 msgstr "显示从标准输入中读入的不在本地仓库中的引用"
 
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr "git stripspace [-s | --strip-comments]"
+
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr "git stripspace [-c | --comment-lines]"
+
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr "跳过和移除所有的注释行"
+
+#: builtin/stripspace.c:38
+msgid "prepend comment character and blank to each line"
+msgstr "为每一行的行首添加注释符和空格"
+
+#: builtin/submodule--helper.c:79 builtin/submodule--helper.c:167
+msgid "alternative anchor for relative paths"
+msgstr "相对路径的替代锚记(anchor)"
+
+#: builtin/submodule--helper.c:84
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper list [--prefix=<路径>] [<路径>...]"
+
+#: builtin/submodule--helper.c:114
+msgid "git submodule--helper name <path>"
+msgstr "git submodule--helper name <路径>"
+
+#: builtin/submodule--helper.c:120
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr "在 .gitmodules 中没有发现路径 '%s' 的子模组映射"
+
+#: builtin/submodule--helper.c:170
+msgid "where the new submodule will be cloned to"
+msgstr "新的子模组将要克隆的路径"
+
+#: builtin/submodule--helper.c:173
+msgid "name of the new submodule"
+msgstr "新子模组的名称"
+
+#: builtin/submodule--helper.c:176
+msgid "url where to clone the submodule from"
+msgstr "克隆子模组的 url 地址"
+
+#: builtin/submodule--helper.c:182
+msgid "depth for shallow clones"
+msgstr "浅克隆的深度"
+
+#: builtin/submodule--helper.c:188
+msgid ""
+"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
+"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+msgstr ""
+"git submodule--helper clone [--prefix=<路径>] [--quiet] [--reference <仓库>] "
+"[--name <名字>] [--url <地址>][--depth <深度>] [--] [<路径>...]"
+
+#: builtin/submodule--helper.c:202 builtin/submodule--helper.c:208
+#: builtin/submodule--helper.c:216
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "不能创建目录 '%s'"
+
+#: builtin/submodule--helper.c:204
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr "无法克隆 '%s' 到子模组路径 '%s'"
+
+#: builtin/submodule--helper.c:227
+#, c-format
+msgid "cannot open file '%s'"
+msgstr "无法打开文件 '%s'"
+
+#: builtin/submodule--helper.c:232
+#, c-format
+msgid "could not close file %s"
+msgstr "无法关闭文件 %s"
+
+#: builtin/submodule--helper.c:247
+#, c-format
+msgid "could not get submodule directory for '%s'"
+msgstr "无法得到 '%s' 的子模组目录"
+
+#: builtin/submodule--helper.c:273
+msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+msgstr "严重错误:submodule-helper 子命令必须由另外的子命令调用"
+
+#: builtin/submodule--helper.c:280
+#, c-format
+msgid "fatal: '%s' is not a valid submodule--helper subcommand"
+msgstr "严重错误:'%s' 不是一个有效的 submodule--helper 子命令"
+
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
 msgstr "git symbolic-ref [<选项>] <名称> [<引用>]"
@@ -10347,54 +10525,50 @@
 msgid "reason of the update"
 msgstr "更新的原因"
 
-#: builtin/tag.c:22
+#: builtin/tag.c:23
 msgid ""
 "git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
 "[<head>]"
 msgstr ""
 "git tag [-a | -s | -u <key-id>] [-f] [-m <说明> | -F <文件>] <标签名> [<头>]"
 
-#: builtin/tag.c:23
+#: builtin/tag.c:24
 msgid "git tag -d <tagname>..."
 msgstr "git tag -d <标签名>..."
 
-#: builtin/tag.c:24
+#: builtin/tag.c:25
 msgid ""
 "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
-"\t\t[<pattern>...]"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
-"git tag -l [-n[<数字>]] [--contains <提交>] [--points-at <对象>] [<模式>...]"
+"git tag -l [-n[<数字>]] [--contains <提交>] [--points-at <对象>]\n"
+"\t\t[--format=<格式>] [--[no-]merged [<提交>]] [<模式>...]"
 
-#: builtin/tag.c:26
+#: builtin/tag.c:27
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <标签名>..."
 
-#: builtin/tag.c:69
-#, c-format
-msgid "malformed object at '%s'"
-msgstr "非法的对象于 '%s'"
-
-#: builtin/tag.c:301
+#: builtin/tag.c:80
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "标签名称太长:%.*s..."
 
-#: builtin/tag.c:306
+#: builtin/tag.c:85
 #, c-format
 msgid "tag '%s' not found."
 msgstr "未发现标签 '%s'。"
 
-#: builtin/tag.c:321
+#: builtin/tag.c:100
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "已删除标签 '%s'(曾为 %s)\n"
 
-#: builtin/tag.c:333
+#: builtin/tag.c:112
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "不能校验该标签 '%s'"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:122
 #, c-format
 msgid ""
 "\n"
@@ -10407,7 +10581,7 @@
 "  %s\n"
 "以 '%c' 开头的行将被忽略。\n"
 
-#: builtin/tag.c:347
+#: builtin/tag.c:126
 #, c-format
 msgid ""
 "\n"
@@ -10421,153 +10595,138 @@
 "  %s\n"
 "以 '%c' 开头的行将被保留,如果您愿意也可以删除它们。\n"
 
-#: builtin/tag.c:371
-#, c-format
-msgid "unsupported sort specification '%s'"
-msgstr "不支持的排序规格 '%s'"
-
-#: builtin/tag.c:373
-#, c-format
-msgid "unsupported sort specification '%s' in variable '%s'"
-msgstr "不支持变量 '%2$s' 的排序规格 '%1$s'"
-
-#: builtin/tag.c:428
+#: builtin/tag.c:199
 msgid "unable to sign the tag"
 msgstr "无法签署标签"
 
-#: builtin/tag.c:430
+#: builtin/tag.c:201
 msgid "unable to write tag file"
 msgstr "无法写标签文件"
 
-#: builtin/tag.c:455
+#: builtin/tag.c:226
 msgid "bad object type."
 msgstr "坏的对象类型。"
 
-#: builtin/tag.c:468
+#: builtin/tag.c:239
 msgid "tag header too big."
 msgstr "标签头信息太大。"
 
-#: builtin/tag.c:504
+#: builtin/tag.c:275
 msgid "no tag message?"
 msgstr "无标签说明?"
 
-#: builtin/tag.c:510
+#: builtin/tag.c:281
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "标签说明被保留在 %s\n"
 
-#: builtin/tag.c:559
-msgid "switch 'points-at' requires an object"
-msgstr "开关 'points-at' 需要一个对象"
-
-#: builtin/tag.c:561
-#, c-format
-msgid "malformed object name '%s'"
-msgstr "非法的对象名 '%s'"
-
-#: builtin/tag.c:590
+#: builtin/tag.c:339
 msgid "list tag names"
 msgstr "列出标签名称"
 
-#: builtin/tag.c:592
+#: builtin/tag.c:341
 msgid "print <n> lines of each tag message"
 msgstr "每个标签信息打印 <n> 行"
 
-#: builtin/tag.c:594
+#: builtin/tag.c:343
 msgid "delete tags"
 msgstr "删除标签"
 
-#: builtin/tag.c:595
+#: builtin/tag.c:344
 msgid "verify tags"
 msgstr "验证标签"
 
-#: builtin/tag.c:597
+#: builtin/tag.c:346
 msgid "Tag creation options"
 msgstr "标签创建选项"
 
-#: builtin/tag.c:599
+#: builtin/tag.c:348
 msgid "annotated tag, needs a message"
 msgstr "附注标签,需要一个说明"
 
-#: builtin/tag.c:601
+#: builtin/tag.c:350
 msgid "tag message"
 msgstr "标签说明"
 
-#: builtin/tag.c:603
+#: builtin/tag.c:352
 msgid "annotated and GPG-signed tag"
 msgstr "附注并附加 GPG 签名的标签"
 
-#: builtin/tag.c:607
+#: builtin/tag.c:356
 msgid "use another key to sign the tag"
 msgstr "使用另外的私钥签名该标签"
 
-#: builtin/tag.c:608
+#: builtin/tag.c:357
 msgid "replace the tag if exists"
 msgstr "如果存在,替换现有的标签"
 
-#: builtin/tag.c:609 builtin/update-ref.c:368
+#: builtin/tag.c:358 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "创建引用日志"
 
-#: builtin/tag.c:611
+#: builtin/tag.c:360
 msgid "Tag listing options"
 msgstr "标签列表选项"
 
-#: builtin/tag.c:612
+#: builtin/tag.c:361
 msgid "show tag list in columns"
 msgstr "以列的方式显示标签列表"
 
-#: builtin/tag.c:614
-msgid "sort tags"
-msgstr "排序标签"
-
-#: builtin/tag.c:619 builtin/tag.c:625
+#: builtin/tag.c:362 builtin/tag.c:363
 msgid "print only tags that contain the commit"
 msgstr "只打印包含提交的标签"
 
-#: builtin/tag.c:631
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
+msgstr "只打印已经合并的标签"
+
+#: builtin/tag.c:365
+msgid "print only tags that are not merged"
+msgstr "只打印尚未合并的标签"
+
+#: builtin/tag.c:370
 msgid "print only tags of the object"
 msgstr "只打印对象的标签"
 
-#: builtin/tag.c:657
+#: builtin/tag.c:399
 msgid "--column and -n are incompatible"
 msgstr "--column 和 -n 不兼容"
 
-#: builtin/tag.c:669
-msgid "--sort and -n are incompatible"
-msgstr "--sort 和 -n 不兼容"
-
-#: builtin/tag.c:676
+#: builtin/tag.c:419
 msgid "-n option is only allowed with -l."
 msgstr "-n 选项只允许和 -l 同时使用。"
 
-#: builtin/tag.c:678
+#: builtin/tag.c:421
 msgid "--contains option is only allowed with -l."
 msgstr "--contains 选项只允许和 -l 同时使用。"
 
-#: builtin/tag.c:680
+#: builtin/tag.c:423
 msgid "--points-at option is only allowed with -l."
 msgstr "--points-at 选项只允许和 -l 同时使用。"
 
-#: builtin/tag.c:688
+#: builtin/tag.c:425
+msgid "--merged and --no-merged option are only allowed with -l"
+msgstr "选项 --merged 和 --no-merged 只能和 -l 共用"
+
+#: builtin/tag.c:433
 msgid "only one -F or -m option is allowed."
 msgstr "只允许一个 -F 或 -m 选项。"
 
-#: builtin/tag.c:708
+#: builtin/tag.c:453
 msgid "too many params"
 msgstr "太多参数"
 
-#: builtin/tag.c:714
+#: builtin/tag.c:459
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' 不是一个有效的标签名称。"
 
-#: builtin/tag.c:719
+#: builtin/tag.c:464
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "标签 '%s' 已存在"
 
-#: builtin/tag.c:744
+#: builtin/tag.c:489
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "已更新标签 '%s'(曾为 %s)\n"
@@ -10826,76 +10985,80 @@
 msgid "print tag contents"
 msgstr "打印标签内容"
 
-#: builtin/worktree.c:13
-msgid "git worktree add [<options>] <path> <branch>"
-msgstr "git worktree add [<选项>] <路径> <分支>"
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr "git worktree add [<选项>] <路径> [<分支>]"
 
-#: builtin/worktree.c:14
+#: builtin/worktree.c:16
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<选项>]"
 
-#: builtin/worktree.c:36
+#: builtin/worktree.c:17
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<选项>]"
+
+#: builtin/worktree.c:39
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "删除工作区/%s:不是一个有效的目录"
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:45
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "删除 worktrees/%s:gitdir 文件不存在"
 
-#: builtin/worktree.c:47
+#: builtin/worktree.c:50
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "删除 worktrees/%s:无法读取 gitdir 文件 (%s)"
 
-#: builtin/worktree.c:58
+#: builtin/worktree.c:61
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "删除 worktrees/%s:无效的 gitdir 文件"
 
-#: builtin/worktree.c:74
+#: builtin/worktree.c:77
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "删除 worktrees/%s:gitdir 文件的指向不存在"
 
-#: builtin/worktree.c:109
+#: builtin/worktree.c:112
 #, c-format
 msgid "failed to remove: %s"
 msgstr "无法删除:%s"
 
-#: builtin/worktree.c:198
+#: builtin/worktree.c:201
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' 已经存在"
 
-#: builtin/worktree.c:232
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "不能创建目录 '%s'"
 
-#: builtin/worktree.c:268
+#: builtin/worktree.c:271
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "准备 %s (标识符 %s)"
 
-#: builtin/worktree.c:316
+#: builtin/worktree.c:319
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr "检出分支 <branch> 即使已经被检出到其它工作区"
 
-#: builtin/worktree.c:318
+#: builtin/worktree.c:321
 msgid "create a new branch"
 msgstr "创建一个新分支"
 
-#: builtin/worktree.c:320
+#: builtin/worktree.c:323
 msgid "create or reset a branch"
 msgstr "创建或重置一个分支"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:324
 msgid "detach HEAD at named commit"
 msgstr "HEAD 从指定的提交分离"
 
-#: builtin/worktree.c:328
+#: builtin/worktree.c:331
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b、-B 和 --detach 是互斥的"
 
@@ -11041,23 +11204,23 @@
 msgid "no-op (backward compatibility)"
 msgstr "空操作(向后兼容)"
 
-#: parse-options.h:236
+#: parse-options.h:237
 msgid "be more verbose"
 msgstr "更加详细"
 
-#: parse-options.h:238
+#: parse-options.h:239
 msgid "be more quiet"
 msgstr "更加安静"
 
-#: parse-options.h:244
+#: parse-options.h:245
 msgid "use <n> digits to display SHA-1s"
 msgstr "用 <n> 位数字显示 SHA-1 哈希值"
 
-#: rerere.h:28
+#: rerere.h:38
 msgid "update the index with reused conflict resolution if possible"
 msgstr "如果可能,重用冲突解决更新索引"
 
-#: git-bisect.sh:50
+#: git-bisect.sh:55
 msgid "You need to start by \"git bisect start\""
 msgstr "您需要执行 \"git bisect start\" 来开始"
 
@@ -11065,63 +11228,63 @@
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:56
+#: git-bisect.sh:61
 msgid "Do you want me to do it for you [Y/n]? "
 msgstr "您想让我为您这样做么[Y/n]? "
 
-#: git-bisect.sh:99
+#: git-bisect.sh:122
 #, sh-format
 msgid "unrecognised option: '$arg'"
 msgstr "未能识别的选项:'$arg'"
 
-#: git-bisect.sh:103
+#: git-bisect.sh:126
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr "'$arg' 看起来不像是一个有效的版本"
 
-#: git-bisect.sh:132
+#: git-bisect.sh:155
 msgid "Bad HEAD - I need a HEAD"
 msgstr "坏的 HEAD - 我需要一个 HEAD"
 
-#: git-bisect.sh:145
+#: git-bisect.sh:168
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
 msgstr "检出 '$start_head' 失败。尝试 'git bisect reset <有效分支>'。"
 
-#: git-bisect.sh:155
+#: git-bisect.sh:178
 msgid "won't bisect on cg-seek'ed tree"
 msgstr "不会在做了 cg-seek 的树上做二分查找"
 
-#: git-bisect.sh:159
+#: git-bisect.sh:182
 msgid "Bad HEAD - strange symbolic ref"
 msgstr "坏的 HEAD - 奇怪的符号引用"
 
-#: git-bisect.sh:211
+#: git-bisect.sh:234
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr "坏的 bisect_write 参数:$state"
 
-#: git-bisect.sh:240
+#: git-bisect.sh:263
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr "输入坏的版本:$arg"
 
-#: git-bisect.sh:255
+#: git-bisect.sh:278
 msgid "Please call 'bisect_state' with at least one argument."
 msgstr "请在调用 'bisect_state' 时跟至少一个参数。"
 
-#: git-bisect.sh:267
+#: git-bisect.sh:290
 #, sh-format
 msgid "Bad rev input: $rev"
 msgstr "输入坏的版本:$rev"
 
-#: git-bisect.sh:276
+#: git-bisect.sh:299
 #, sh-format
 msgid "'git bisect $TERM_BAD' can take only one argument."
 msgstr "'git bisect $TERM_BAD' 只能带一个参数。"
 
-#: git-bisect.sh:299
+#: git-bisect.sh:322
 #, sh-format
 msgid "Warning: bisecting only with a $TERM_BAD commit."
 msgstr "警告:在仅有一个坏($TERM_BAD)提交下进行二分查找。"
@@ -11130,11 +11293,11 @@
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:305
+#: git-bisect.sh:328
 msgid "Are you sure [Y/n]? "
 msgstr "您确认么[Y/n]? "
 
-#: git-bisect.sh:317
+#: git-bisect.sh:340
 #, sh-format
 msgid ""
 "You need to give me at least one $bad_syn and one $good_syn revision.\n"
@@ -11143,7 +11306,7 @@
 "您需要给我至少一个好版本和一个坏版本。\n"
 "(为此您可以用 \"git bisect $bad_syn\" 和 \"git bisect $good_syn\" 命令。)"
 
-#: git-bisect.sh:320
+#: git-bisect.sh:343
 #, sh-format
 msgid ""
 "You need to start by \"git bisect start\".\n"
@@ -11154,16 +11317,16 @@
 "然后需要提供我至少一个好版本和一个坏版本。\n"
 "(为此您可以用 \"git bisect $bad_syn\" 和 \"git bisect $good_syn\" 命令。)"
 
-#: git-bisect.sh:391 git-bisect.sh:521
+#: git-bisect.sh:414 git-bisect.sh:546
 msgid "We are not bisecting."
 msgstr "我们没有在二分查找。"
 
-#: git-bisect.sh:398
+#: git-bisect.sh:421
 #, sh-format
 msgid "'$invalid' is not a valid commit"
 msgstr "'$invalid' 不是一个有效的提交"
 
-#: git-bisect.sh:407
+#: git-bisect.sh:430
 #, sh-format
 msgid ""
 "Could not check out original HEAD '$branch'.\n"
@@ -11172,25 +11335,25 @@
 "不能检出原始 HEAD '$branch'。\n"
 "尝试 'git bisect reset <提交>'。"
 
-#: git-bisect.sh:435
+#: git-bisect.sh:458
 msgid "No logfile given"
 msgstr "未提供日志文件"
 
-#: git-bisect.sh:436
+#: git-bisect.sh:459
 #, sh-format
 msgid "cannot read $file for replaying"
 msgstr "不能读取 $file 来重放"
 
-#: git-bisect.sh:455
+#: git-bisect.sh:480
 msgid "?? what are you talking about?"
 msgstr "?? 您在说什么?"
 
-#: git-bisect.sh:467
+#: git-bisect.sh:492
 #, sh-format
 msgid "running $command"
 msgstr "运行 $command"
 
-#: git-bisect.sh:474
+#: git-bisect.sh:499
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -11199,11 +11362,11 @@
 "二分查找运行失败:\n"
 "命令 '$command' 的退出码 $res 小于 0 或大于等于 128"
 
-#: git-bisect.sh:500
+#: git-bisect.sh:525
 msgid "bisect run cannot continue any more"
 msgstr "二分查找不能继续运行"
 
-#: git-bisect.sh:506
+#: git-bisect.sh:531
 #, sh-format
 msgid ""
 "bisect run failed:\n"
@@ -11212,15 +11375,47 @@
 "二分查找运行失败:\n"
 "'bisect_state $state' 退出码为 $res"
 
-#: git-bisect.sh:513
+#: git-bisect.sh:538
 msgid "bisect run success"
 msgstr "二分查找运行成功"
 
-#: git-bisect.sh:548
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr "请使用两个不同的术语"
+
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr "'$term' 不是一个有效的名称"
+
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr "不能使用内置命令 '$term' 作为术语"
+
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr "不能修改术语 '$term' 的含义"
+
+#: git-bisect.sh:606
 #, sh-format
 msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
 msgstr "无效的命令:您当前正处于一个 $TERM_BAD/$TERM_GOOD 二分查找。"
 
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "未定义术语"
+
+#: git-bisect.sh:653
+#, sh-format
+msgid ""
+"invalid argument $arg for 'git bisect terms'.\n"
+"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+msgstr ""
+"参数 $arg 对命令 'git bisect terms' 无效。\n"
+"支持的选项有:--term-good|--term-old 和 --term-bad|--term-new。"
+
 #: git-rebase.sh:57
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
@@ -11259,23 +11454,23 @@
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "似乎正处于在 git-am 的执行过程中。无法变基。"
 
-#: git-rebase.sh:351
+#: git-rebase.sh:354
 msgid "The --exec option must be used with the --interactive option"
 msgstr "选项 --exec 必须和选项 --interactive 同时使用"
 
-#: git-rebase.sh:356
+#: git-rebase.sh:359
 msgid "No rebase in progress?"
 msgstr "没有正在进行的变基?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:370
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "动作 --edit-todo 只能用在交互式变基过程中。"
 
-#: git-rebase.sh:374
+#: git-rebase.sh:377
 msgid "Cannot read HEAD"
 msgstr "不能读取 HEAD"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:380
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -11283,12 +11478,12 @@
 "您必须编辑所有的合并冲突,然后通过 git add\n"
 "命令将它们标记为已解决"
 
-#: git-rebase.sh:395
+#: git-rebase.sh:398
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "无法移回 $head_name"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:417
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11307,64 +11502,64 @@
 "\t$cmd_clear_stale_rebase\n"
 "然后再重新执行变基操作。 为避免丢失重要数据,我已经停止当前操作。"
 
-#: git-rebase.sh:465
+#: git-rebase.sh:468
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "无效的上游 $upstream_name"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:492
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: 有一个以上的合并基准"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:495 git-rebase.sh:499
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: 没有合并基准"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:504
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "没有指向一个有效的提交:$onto_name"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:527
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "严重错误:无此分支:$branch_name"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:560
 msgid "Cannot autostash"
 msgstr "无法 autostash"
 
-#: git-rebase.sh:562
+#: git-rebase.sh:565
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "创建了 autostash: $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:569
 msgid "Please commit or stash them."
 msgstr "请提交或为它们保存进度。"
 
-#: git-rebase.sh:586
+#: git-rebase.sh:589
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "当前分支 $branch_name 是最新的。"
 
-#: git-rebase.sh:590
+#: git-rebase.sh:593
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "当前分支 $branch_name 是最新的,强制变基。"
 
-#: git-rebase.sh:601
+#: git-rebase.sh:604
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "变更从 $mb 到 $onto:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:613
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr "首先,回退分支以便在上面重放您的工作..."
 
-#: git-rebase.sh:620
+#: git-rebase.sh:623
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "快进 $branch_name 至 $onto_name。"
@@ -11437,112 +11632,97 @@
 msgid "Cannot remove worktree changes"
 msgstr "无法删除工作区变更"
 
-#: git-stash.sh:387
+#: git-stash.sh:405
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "未知选项: $opt"
 
-#: git-stash.sh:397
+#: git-stash.sh:415
 msgid "No stash found."
 msgstr "未发现 stash。"
 
-#: git-stash.sh:404
+#: git-stash.sh:422
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "指定了太多的版本:$REV"
 
-#: git-stash.sh:410
+#: git-stash.sh:428
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference 不是一个有效的引用"
 
-#: git-stash.sh:438
+#: git-stash.sh:456
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' 不是 stash 样提交"
 
-#: git-stash.sh:449
+#: git-stash.sh:467
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' 不是一个 stash 引用"
 
-#: git-stash.sh:457
+#: git-stash.sh:475
 msgid "unable to refresh index"
 msgstr "无法刷新索引"
 
-#: git-stash.sh:461
+#: git-stash.sh:479
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "无法在合并过程中恢复进度"
 
-#: git-stash.sh:469
+#: git-stash.sh:487
 msgid "Conflicts in index. Try without --index."
 msgstr "索引中有冲突。尝试不使用 --index。"
 
-#: git-stash.sh:471
+#: git-stash.sh:489
 msgid "Could not save index tree"
 msgstr "不能保存索引树"
 
-#: git-stash.sh:505
+#: git-stash.sh:523
 msgid "Cannot unstage modified files"
 msgstr "无法将修改的文件取消暂存"
 
-#: git-stash.sh:520
+#: git-stash.sh:538
 msgid "Index was not unstashed."
 msgstr "索引的进度没有被恢复。"
 
-#: git-stash.sh:543
+#: git-stash.sh:561
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "丢弃了 ${REV} ($s)"
 
-#: git-stash.sh:544
+#: git-stash.sh:562
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}:不能丢弃进度条目"
 
-#: git-stash.sh:552
+#: git-stash.sh:570
 msgid "No branch name specified"
 msgstr "未指定分支名"
 
-#: git-stash.sh:624
+#: git-stash.sh:642
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(为恢复数据输入 \"git stash apply\")"
 
-#: git-submodule.sh:95
+#: git-submodule.sh:104
 #, sh-format
 msgid "cannot strip one component off url '$remoteurl'"
 msgstr "无法从 url '$remoteurl' 剥离一个组件"
 
-#: git-submodule.sh:237
-#, sh-format
-msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
-msgstr "未在 .gitmodules 中发现路径 '$sm_path' 的子模组映射"
-
-#: git-submodule.sh:287
-#, sh-format
-msgid "Clone of '$url' into submodule path '$sm_path' failed"
-msgstr "无法克隆 '$url' 到子模组路径 '$sm_path'"
-
-#: git-submodule.sh:296
-#, sh-format
-msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-msgstr "Gitdir '$a' 在子模组路径 '$b' 之下或相反"
-
-#: git-submodule.sh:406
+#: git-submodule.sh:281
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr "只能在工作区的顶级目录中使用相对路径"
 
-#: git-submodule.sh:416
+#: git-submodule.sh:291
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "仓库 URL:'$repo' 必须是绝对路径或以 ./|../ 起始"
 
-#: git-submodule.sh:433
+#: git-submodule.sh:308
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' 已经存在于索引中"
 
-#: git-submodule.sh:437
+#: git-submodule.sh:312
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -11553,134 +11733,134 @@
 "$sm_path\n"
 "如果您确实想添加它,使用 -f 参数。"
 
-#: git-submodule.sh:455
+#: git-submodule.sh:330
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "添加位于 '$sm_path' 的现存仓库到索引"
 
-#: git-submodule.sh:457
+#: git-submodule.sh:332
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' 已存在且不是一个有效的 git 仓库"
 
-#: git-submodule.sh:465
+#: git-submodule.sh:340
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr "本地发现 '$sm_name' 的一个 git 目录,与其对应的远程仓库:"
 
-#: git-submodule.sh:467
+#: git-submodule.sh:342
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
 msgstr "如果您想重用此本地 git 目录而不是重新克隆自"
 
-#: git-submodule.sh:469
+#: git-submodule.sh:344
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
 msgstr "使用 '--force' 参数。如果本地 git 目录不是正确的仓库"
 
-#: git-submodule.sh:470
+#: git-submodule.sh:345
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
 "option."
 msgstr "或者您不确定其中含义使用 '--name' 参数选择另外一个名称。"
 
-#: git-submodule.sh:472
+#: git-submodule.sh:347
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "激活本地 git 目录到子模组 '$sm_name'。"
 
-#: git-submodule.sh:484
+#: git-submodule.sh:359
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "不能检出子模组 '$sm_path'"
 
-#: git-submodule.sh:489
+#: git-submodule.sh:364
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "无法添加子模组 '$sm_path'"
 
-#: git-submodule.sh:498
+#: git-submodule.sh:373
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "无法注册子模组 '$sm_path'"
 
-#: git-submodule.sh:542
+#: git-submodule.sh:417
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "正在进入 '$prefix$displaypath'"
 
-#: git-submodule.sh:562
+#: git-submodule.sh:437
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr "停止于 '$prefix$displaypath',脚本返回非零值。"
 
-#: git-submodule.sh:608
+#: git-submodule.sh:483
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr "在 .gitmodules 中未找到子模组路径 '$displaypath' 的 url"
 
-#: git-submodule.sh:617
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr "无法为子模组路径 '$displaypath' 注册 url"
 
-#: git-submodule.sh:619
+#: git-submodule.sh:494
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr "子模组 '$name' ($url) 未对路径 '$displaypath' 注册"
 
-#: git-submodule.sh:636
+#: git-submodule.sh:511
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr "无法为子模组路径 '$displaypath' 注册更新模式"
 
-#: git-submodule.sh:674
+#: git-submodule.sh:549
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr "使用 '.' 如果您真的想要对所有子模组取消初始化"
 
-#: git-submodule.sh:691
+#: git-submodule.sh:566
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr "子模组工作区 '$displaypath' 包含一个 .git 目录"
 
-#: git-submodule.sh:692
+#: git-submodule.sh:567
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr "(使用 'rm -rf' 命令如果您真的想删除它及其全部历史)"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:573
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
 "discard them"
 msgstr "子模组工作区 '$displaypath' 包含本地修改;使用 '-f' 丢弃它们"
 
-#: git-submodule.sh:701
+#: git-submodule.sh:576
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "已清除目录 '$displaypath'"
 
-#: git-submodule.sh:702
+#: git-submodule.sh:577
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "无法移除子模组工作区 '$displaypath'"
 
-#: git-submodule.sh:705
+#: git-submodule.sh:580
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "不能创建空的子模组目录 '$displaypath'"
 
-#: git-submodule.sh:714
+#: git-submodule.sh:589
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "子模组 '$name' ($url) 未对路径 '$displaypath' 注册"
 
-#: git-submodule.sh:830
+#: git-submodule.sh:705
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -11689,108 +11869,159 @@
 "子模组路径 '$displaypath' 没有初始化\n"
 "也许您想用 'update --init'?"
 
-#: git-submodule.sh:843
+#: git-submodule.sh:718
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中找到当前版本"
 
-#: git-submodule.sh:852
+#: git-submodule.sh:727
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "无法在子模组路径 '$sm_path' 中获取"
 
-#: git-submodule.sh:876
+#: git-submodule.sh:751
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中获取"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:765
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中检出 '$sha1'"
 
-#: git-submodule.sh:891
+#: git-submodule.sh:766
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "子模组路径 '$displaypath':检出 '$sha1'"
 
-#: git-submodule.sh:895
+#: git-submodule.sh:770
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中变基 '$sha1'"
 
-#: git-submodule.sh:896
+#: git-submodule.sh:771
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "子模组路径 '$displaypath':变基至 '$sha1'"
 
-#: git-submodule.sh:901
+#: git-submodule.sh:776
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "无法合并 '$sha1' 到子模组路径 '$displaypath' 中"
 
-#: git-submodule.sh:902
+#: git-submodule.sh:777
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "子模组路径 '$displaypath':已合并入 '$sha1'"
 
-#: git-submodule.sh:907
+#: git-submodule.sh:782
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
 msgstr "在子模组路径 '$prefix$sm_path' 中执行 '$command $sha1' 失败"
 
-#: git-submodule.sh:908
+#: git-submodule.sh:783
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "子模组路径 '$prefix$sm_path': '$command $sha1'"
 
-#: git-submodule.sh:938
+#: git-submodule.sh:813
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "无法递归进子模组路径 '$displaypath'"
 
-#: git-submodule.sh:1046
+#: git-submodule.sh:921
 msgid "The --cached option cannot be used with the --files option"
 msgstr "选项 --cached 不能和选项 --files 同时使用"
 
-#: git-submodule.sh:1098
+#: git-submodule.sh:973
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "意外的模式 $mod_dst"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:1118
+#: git-submodule.sh:993
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  警告:$display_name 未包含提交 $sha1_src"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:1121
+#: git-submodule.sh:996
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  警告:$display_name 未包含提交 $sha1_dst"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:1124
+#: git-submodule.sh:999
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr "  警告:$display_name 未包含提交 $sha1_src 和 $sha1_dst"
 
-#: git-submodule.sh:1149
+#: git-submodule.sh:1024
 msgid "blob"
 msgstr "数据对象"
 
-#: git-submodule.sh:1267
+#: git-submodule.sh:1142
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "无法递归进子模组路径 '$sm_path'"
 
-#: git-submodule.sh:1331
+#: git-submodule.sh:1206
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "为 '$displaypath' 同步子模组 url"
 
+#~ msgid "unable to look up current user in the passwd file: %s"
+#~ msgstr "无法在口令文件中查询到当前用户:%s"
+
+#~ msgid "no such user"
+#~ msgstr "无此用户"
+
+#~ msgid "show usage"
+#~ msgstr "显示用法"
+
+#~ msgid "branch '%s' does not point at a commit"
+#~ msgstr "分支 '%s' 未指向一个提交"
+
+#~ msgid "object '%s' does not point to a commit"
+#~ msgstr "对象 '%s' 没有指向一个提交"
+
+#~ msgid "print only merged branches"
+#~ msgstr "只打印合并的分支"
+
+#~ msgid "--dissociate given, but there is no --reference"
+#~ msgstr "提供了参数 --dissociate,但未提供 --reference"
+
+#~ msgid "insanely long template name %s"
+#~ msgstr "太长的模版名 %s"
+
+#~ msgid "insanely long symlink %s"
+#~ msgstr "太长的符号链接 %s"
+
+#~ msgid "insanely long template path %s"
+#~ msgstr "太长的模版路径 %s"
+
+#~ msgid "insane git directory %s"
+#~ msgstr "不正常的 git 目录 %s"
+
+#~ msgid "unsupported sort specification '%s'"
+#~ msgstr "不支持的排序规格 '%s'"
+
+#~ msgid "unsupported sort specification '%s' in variable '%s'"
+#~ msgstr "不支持变量 '%2$s' 的排序规格 '%1$s'"
+
+#~ msgid "switch 'points-at' requires an object"
+#~ msgstr "开关 'points-at' 需要一个对象"
+
+#~ msgid "sort tags"
+#~ msgstr "排序标签"
+
+#~ msgid "--sort and -n are incompatible"
+#~ msgstr "--sort 和 -n 不兼容"
+
+#~ msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
+#~ msgstr "Gitdir '$a' 在子模组路径 '$b' 之下或相反"
+
 #~ msgid "false|true|preserve"
 #~ msgstr "false|true|preserve"
 
diff --git a/pretty.c b/pretty.c
index 151c2ae..92b2870 100644
--- a/pretty.c
+++ b/pretty.c
@@ -543,9 +543,9 @@
 		struct commit *p = parent->item;
 		const char *hex = NULL;
 		if (pp->abbrev)
-			hex = find_unique_abbrev(p->object.sha1, pp->abbrev);
+			hex = find_unique_abbrev(p->object.oid.hash, pp->abbrev);
 		if (!hex)
-			hex = sha1_to_hex(p->object.sha1);
+			hex = oid_to_hex(&p->object.oid);
 		parent = parent->next;
 
 		strbuf_addf(sb, " %s", hex);
@@ -1119,12 +1119,12 @@
 
 	/* these depend on the commit */
 	if (!commit->object.parsed)
-		parse_object(commit->object.sha1);
+		parse_object(commit->object.oid.hash);
 
 	switch (placeholder[0]) {
 	case 'H':		/* commit hash */
 		strbuf_addstr(sb, diff_get_color(c->auto_color, DIFF_COMMIT));
-		strbuf_addstr(sb, sha1_to_hex(commit->object.sha1));
+		strbuf_addstr(sb, oid_to_hex(&commit->object.oid));
 		strbuf_addstr(sb, diff_get_color(c->auto_color, DIFF_RESET));
 		return 1;
 	case 'h':		/* abbreviated commit hash */
@@ -1133,18 +1133,18 @@
 			strbuf_addstr(sb, diff_get_color(c->auto_color, DIFF_RESET));
 			return 1;
 		}
-		strbuf_addstr(sb, find_unique_abbrev(commit->object.sha1,
+		strbuf_addstr(sb, find_unique_abbrev(commit->object.oid.hash,
 						     c->pretty_ctx->abbrev));
 		strbuf_addstr(sb, diff_get_color(c->auto_color, DIFF_RESET));
 		c->abbrev_commit_hash.len = sb->len - c->abbrev_commit_hash.off;
 		return 1;
 	case 'T':		/* tree hash */
-		strbuf_addstr(sb, sha1_to_hex(commit->tree->object.sha1));
+		strbuf_addstr(sb, oid_to_hex(&commit->tree->object.oid));
 		return 1;
 	case 't':		/* abbreviated tree hash */
 		if (add_again(sb, &c->abbrev_tree_hash))
 			return 1;
-		strbuf_addstr(sb, find_unique_abbrev(commit->tree->object.sha1,
+		strbuf_addstr(sb, find_unique_abbrev(commit->tree->object.oid.hash,
 						     c->pretty_ctx->abbrev));
 		c->abbrev_tree_hash.len = sb->len - c->abbrev_tree_hash.off;
 		return 1;
@@ -1152,7 +1152,7 @@
 		for (p = commit->parents; p; p = p->next) {
 			if (p != commit->parents)
 				strbuf_addch(sb, ' ');
-			strbuf_addstr(sb, sha1_to_hex(p->item->object.sha1));
+			strbuf_addstr(sb, oid_to_hex(&p->item->object.oid));
 		}
 		return 1;
 	case 'p':		/* abbreviated parent hashes */
@@ -1162,7 +1162,7 @@
 			if (p != commit->parents)
 				strbuf_addch(sb, ' ');
 			strbuf_addstr(sb, find_unique_abbrev(
-					p->item->object.sha1,
+					p->item->object.oid.hash,
 					c->pretty_ctx->abbrev));
 		}
 		c->abbrev_parent_hashes.len = sb->len -
diff --git a/progress.c b/progress.c
index 2e31bec..76a88c5 100644
--- a/progress.c
+++ b/progress.c
@@ -25,7 +25,7 @@
 	unsigned int last_bytes[TP_IDX_MAX];
 	unsigned int last_misecs[TP_IDX_MAX];
 	unsigned int idx;
-	char display[32];
+	struct strbuf display;
 };
 
 struct progress {
@@ -98,7 +98,7 @@
 	}
 
 	progress->last_value = n;
-	tp = (progress->throughput) ? progress->throughput->display : "";
+	tp = (progress->throughput) ? progress->throughput->display.buf : "";
 	eol = done ? done : "   \r";
 	if (progress->total) {
 		unsigned percent = n * 100 / progress->total;
@@ -129,6 +129,7 @@
 static void throughput_string(struct strbuf *buf, off_t total,
 			      unsigned int rate)
 {
+	strbuf_reset(buf);
 	strbuf_addstr(buf, ", ");
 	strbuf_humanise_bytes(buf, total);
 	strbuf_addstr(buf, " | ");
@@ -141,7 +142,6 @@
 	struct throughput *tp;
 	uint64_t now_ns;
 	unsigned int misecs, count, rate;
-	struct strbuf buf = STRBUF_INIT;
 
 	if (!progress)
 		return;
@@ -154,6 +154,7 @@
 		if (tp) {
 			tp->prev_total = tp->curr_total = total;
 			tp->prev_ns = now_ns;
+			strbuf_init(&tp->display, 0);
 		}
 		return;
 	}
@@ -193,9 +194,7 @@
 	tp->last_misecs[tp->idx] = misecs;
 	tp->idx = (tp->idx + 1) % TP_IDX_MAX;
 
-	throughput_string(&buf, total, rate);
-	strncpy(tp->display, buf.buf, sizeof(tp->display));
-	strbuf_release(&buf);
+	throughput_string(&tp->display, total, rate);
 	if (progress->last_value != -1 && progress_update)
 		display(progress, progress->last_value, NULL);
 }
@@ -248,22 +247,21 @@
 		size_t len = strlen(msg) + 5;
 		struct throughput *tp = progress->throughput;
 
-		bufp = (len < sizeof(buf)) ? buf : xmalloc(len + 1);
+		bufp = (len < sizeof(buf)) ? buf : xmallocz(len);
 		if (tp) {
-			struct strbuf strbuf = STRBUF_INIT;
 			unsigned int rate = !tp->avg_misecs ? 0 :
 					tp->avg_bytes / tp->avg_misecs;
-			throughput_string(&strbuf, tp->curr_total, rate);
-			strncpy(tp->display, strbuf.buf, sizeof(tp->display));
-			strbuf_release(&strbuf);
+			throughput_string(&tp->display, tp->curr_total, rate);
 		}
 		progress_update = 1;
-		sprintf(bufp, ", %s.\n", msg);
+		xsnprintf(bufp, len + 1, ", %s.\n", msg);
 		display(progress, progress->last_value, bufp);
 		if (buf != bufp)
 			free(bufp);
 	}
 	clear_progress_signal();
+	if (progress->throughput)
+		strbuf_release(&progress->throughput->display);
 	free(progress->throughput);
 	free(progress);
 }
diff --git a/read-cache.c b/read-cache.c
index de22df2..5be7cd1 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -17,7 +17,6 @@
 #include "strbuf.h"
 #include "varint.h"
 #include "split-index.h"
-#include "sigchain.h"
 #include "utf8.h"
 
 static struct cache_entry *refresh_cache_entry(struct cache_entry *ce,
@@ -328,7 +327,7 @@
 	 * by definition never matches what is in the work tree until it
 	 * actually gets added.
 	 */
-	if (ce->ce_flags & CE_INTENT_TO_ADD)
+	if (ce_intent_to_add(ce))
 		return DATA_CHANGED | TYPE_CHANGED | MODE_CHANGED;
 
 	changed = ce_match_stat_basic(ce, st);
@@ -1238,7 +1237,7 @@
 
 			if (cache_errno == ENOENT)
 				fmt = deleted_fmt;
-			else if (ce->ce_flags & CE_INTENT_TO_ADD)
+			else if (ce_intent_to_add(ce))
 				fmt = added_fmt; /* must be before other checks */
 			else if (changed & TYPE_CHANGED)
 				fmt = typechange_fmt;
diff --git a/ref-filter.c b/ref-filter.c
index f38dee4..9ccfc51 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -9,6 +9,10 @@
 #include "tag.h"
 #include "quote.h"
 #include "ref-filter.h"
+#include "revision.h"
+#include "utf8.h"
+#include "git-compat-util.h"
+#include "version.h"
 
 typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type;
 
@@ -43,15 +47,48 @@
 	{ "subject" },
 	{ "body" },
 	{ "contents" },
-	{ "contents:subject" },
-	{ "contents:body" },
-	{ "contents:signature" },
 	{ "upstream" },
 	{ "push" },
 	{ "symref" },
 	{ "flag" },
 	{ "HEAD" },
 	{ "color" },
+	{ "align" },
+	{ "end" },
+};
+
+#define REF_FORMATTING_STATE_INIT  { 0, NULL }
+
+struct align {
+	align_type position;
+	unsigned int width;
+};
+
+struct contents {
+	unsigned int lines;
+	struct object_id oid;
+};
+
+struct ref_formatting_stack {
+	struct ref_formatting_stack *prev;
+	struct strbuf output;
+	void (*at_end)(struct ref_formatting_stack *stack);
+	void *at_end_data;
+};
+
+struct ref_formatting_state {
+	int quote_style;
+	struct ref_formatting_stack *stack;
+};
+
+struct atom_value {
+	const char *s;
+	union {
+		struct align align;
+		struct contents contents;
+	} u;
+	void (*handler)(struct atom_value *atomv, struct ref_formatting_state *state);
+	unsigned long ul; /* used for sorting when not FIELD_STR */
 };
 
 /*
@@ -123,6 +160,120 @@
 	return at;
 }
 
+static void quote_formatting(struct strbuf *s, const char *str, int quote_style)
+{
+	switch (quote_style) {
+	case QUOTE_NONE:
+		strbuf_addstr(s, str);
+		break;
+	case QUOTE_SHELL:
+		sq_quote_buf(s, str);
+		break;
+	case QUOTE_PERL:
+		perl_quote_buf(s, str);
+		break;
+	case QUOTE_PYTHON:
+		python_quote_buf(s, str);
+		break;
+	case QUOTE_TCL:
+		tcl_quote_buf(s, str);
+		break;
+	}
+}
+
+static void append_atom(struct atom_value *v, struct ref_formatting_state *state)
+{
+	/*
+	 * Quote formatting is only done when the stack has a single
+	 * element. Otherwise quote formatting is done on the
+	 * element's entire output strbuf when the %(end) atom is
+	 * encountered.
+	 */
+	if (!state->stack->prev)
+		quote_formatting(&state->stack->output, v->s, state->quote_style);
+	else
+		strbuf_addstr(&state->stack->output, v->s);
+}
+
+static void push_stack_element(struct ref_formatting_stack **stack)
+{
+	struct ref_formatting_stack *s = xcalloc(1, sizeof(struct ref_formatting_stack));
+
+	strbuf_init(&s->output, 0);
+	s->prev = *stack;
+	*stack = s;
+}
+
+static void pop_stack_element(struct ref_formatting_stack **stack)
+{
+	struct ref_formatting_stack *current = *stack;
+	struct ref_formatting_stack *prev = current->prev;
+
+	if (prev)
+		strbuf_addbuf(&prev->output, &current->output);
+	strbuf_release(&current->output);
+	free(current);
+	*stack = prev;
+}
+
+static void end_align_handler(struct ref_formatting_stack *stack)
+{
+	struct align *align = (struct align *)stack->at_end_data;
+	struct strbuf s = STRBUF_INIT;
+
+	strbuf_utf8_align(&s, align->position, align->width, stack->output.buf);
+	strbuf_swap(&stack->output, &s);
+	strbuf_release(&s);
+}
+
+static void align_atom_handler(struct atom_value *atomv, struct ref_formatting_state *state)
+{
+	struct ref_formatting_stack *new;
+
+	push_stack_element(&state->stack);
+	new = state->stack;
+	new->at_end = end_align_handler;
+	new->at_end_data = &atomv->u.align;
+}
+
+static void end_atom_handler(struct atom_value *atomv, struct ref_formatting_state *state)
+{
+	struct ref_formatting_stack *current = state->stack;
+	struct strbuf s = STRBUF_INIT;
+
+	if (!current->at_end)
+		die(_("format: %%(end) atom used without corresponding atom"));
+	current->at_end(current);
+
+	/*
+	 * Perform quote formatting when the stack element is that of
+	 * a supporting atom. If nested then perform quote formatting
+	 * only on the topmost supporting atom.
+	 */
+	if (!state->stack->prev->prev) {
+		quote_formatting(&s, current->output.buf, state->quote_style);
+		strbuf_swap(&current->output, &s);
+	}
+	strbuf_release(&s);
+	pop_stack_element(&state->stack);
+}
+
+static int match_atom_name(const char *name, const char *atom_name, const char **val)
+{
+	const char *body;
+
+	if (!skip_prefix(name, atom_name, &body))
+		return 0; /* doesn't even begin with "atom_name" */
+	if (!body[0]) {
+		*val = NULL; /* %(atom_name) and no customization */
+		return 1;
+	}
+	if (body[0] != ':')
+		return 0; /* "atom_namefoo" is not "atom_name" or "atom_name:..." */
+	*val = body + 1; /* "atom_name:val" */
+	return 1;
+}
+
 /*
  * In a format string, find the next occurrence of %(atom).
  */
@@ -192,9 +343,7 @@
 			    struct atom_value *v)
 {
 	if (!strcmp(name, "objectname")) {
-		char *s = xmalloc(41);
-		strcpy(s, sha1_to_hex(sha1));
-		v->s = s;
+		v->s = xstrdup(sha1_to_hex(sha1));
 		return 1;
 	}
 	if (!strcmp(name, "objectname:short")) {
@@ -219,13 +368,11 @@
 		if (!strcmp(name, "objecttype"))
 			v->s = typename(obj->type);
 		else if (!strcmp(name, "objectsize")) {
-			char *s = xmalloc(40);
-			sprintf(s, "%lu", sz);
 			v->ul = sz;
-			v->s = s;
+			v->s = xstrfmt("%lu", sz);
 		}
 		else if (deref)
-			grab_objectname(name, obj->sha1, v);
+			grab_objectname(name, obj->oid.hash, v);
 	}
 }
 
@@ -246,11 +393,8 @@
 			v->s = tag->tag;
 		else if (!strcmp(name, "type") && tag->tagged)
 			v->s = typename(tag->tagged->type);
-		else if (!strcmp(name, "object") && tag->tagged) {
-			char *s = xmalloc(41);
-			strcpy(s, sha1_to_hex(tag->tagged->sha1));
-			v->s = s;
-		}
+		else if (!strcmp(name, "object") && tag->tagged)
+			v->s = xstrdup(oid_to_hex(&tag->tagged->oid));
 	}
 }
 
@@ -268,32 +412,22 @@
 		if (deref)
 			name++;
 		if (!strcmp(name, "tree")) {
-			char *s = xmalloc(41);
-			strcpy(s, sha1_to_hex(commit->tree->object.sha1));
-			v->s = s;
+			v->s = xstrdup(oid_to_hex(&commit->tree->object.oid));
 		}
-		if (!strcmp(name, "numparent")) {
-			char *s = xmalloc(40);
+		else if (!strcmp(name, "numparent")) {
 			v->ul = commit_list_count(commit->parents);
-			sprintf(s, "%lu", v->ul);
-			v->s = s;
+			v->s = xstrfmt("%lu", v->ul);
 		}
 		else if (!strcmp(name, "parent")) {
-			int num = commit_list_count(commit->parents);
-			int i;
 			struct commit_list *parents;
-			char *s = xmalloc(41 * num + 1);
-			v->s = s;
-			for (i = 0, parents = commit->parents;
-			     parents;
-			     parents = parents->next, i = i + 41) {
+			struct strbuf s = STRBUF_INIT;
+			for (parents = commit->parents; parents; parents = parents->next) {
 				struct commit *parent = parents->item;
-				strcpy(s+i, sha1_to_hex(parent->object.sha1));
-				if (parents->next)
-					s[i+40] = ' ';
+				if (parents != commit->parents)
+					strbuf_addch(&s, ' ');
+				strbuf_addstr(&s, oid_to_hex(&parent->object.oid));
 			}
-			if (!i)
-				*s = '\0';
+			v->s = strbuf_detach(&s, NULL);
 		}
 	}
 }
@@ -497,6 +631,30 @@
 	*nonsiglen = *sig - buf;
 }
 
+/*
+ * If 'lines' is greater than 0, append that many lines from the given
+ * 'buf' of length 'size' to the given strbuf.
+ */
+static void append_lines(struct strbuf *out, const char *buf, unsigned long size, int lines)
+{
+	int i;
+	const char *sp, *eol;
+	size_t len;
+
+	sp = buf;
+
+	for (i = 0; i < lines && sp < buf + size; i++) {
+		if (i)
+			strbuf_addstr(out, "\n    ");
+		eol = memchr(sp, '\n', size - (sp - buf));
+		len = eol ? eol - sp : size - (sp - buf);
+		strbuf_add(out, sp, len);
+		if (!eol)
+			break;
+		sp = eol + 1;
+	}
+}
+
 /* See grab_values */
 static void grab_sub_body_contents(struct atom_value *val, int deref, struct object *obj, void *buf, unsigned long sz)
 {
@@ -507,6 +665,7 @@
 	for (i = 0; i < used_atom_cnt; i++) {
 		const char *name = used_atom[i];
 		struct atom_value *v = &val[i];
+		const char *valp = NULL;
 		if (!!deref != (*name == '*'))
 			continue;
 		if (deref)
@@ -516,7 +675,8 @@
 		    strcmp(name, "contents") &&
 		    strcmp(name, "contents:subject") &&
 		    strcmp(name, "contents:body") &&
-		    strcmp(name, "contents:signature"))
+		    strcmp(name, "contents:signature") &&
+		    !starts_with(name, "contents:lines="))
 			continue;
 		if (!subpos)
 			find_subpos(buf, sz,
@@ -536,6 +696,16 @@
 			v->s = xmemdupz(sigpos, siglen);
 		else if (!strcmp(name, "contents"))
 			v->s = xstrdup(subpos);
+		else if (skip_prefix(name, "contents:lines=", &valp)) {
+			struct strbuf s = STRBUF_INIT;
+			const char *contents_end = bodylen + bodypos - siglen;
+
+			if (strtoul_ui(valp, 10, &v->u.contents.lines))
+				die(_("positive value expected contents:lines=%s"), valp);
+			/*  Size is the length of the message after removing the signature */
+			append_lines(&s, subpos, contents_end - subpos, v->u.contents.lines);
+			v->s = strbuf_detach(&s, NULL);
+		}
 	}
 }
 
@@ -593,6 +763,29 @@
 	return dst;
 }
 
+static const char *strip_ref_components(const char *refname, const char *nr_arg)
+{
+	char *end;
+	long nr = strtol(nr_arg, &end, 10);
+	long remaining = nr;
+	const char *start = refname;
+
+	if (nr < 1 || *end != '\0')
+		die(":strip= requires a positive integer argument");
+
+	while (remaining) {
+		switch (*start++) {
+		case '\0':
+			die("ref '%s' does not have %ld components to :strip",
+			    refname, nr);
+		case '/':
+			remaining--;
+			break;
+		}
+	}
+	return start;
+}
+
 /*
  * Parse the object referred by ref, and grab needed value.
  */
@@ -621,8 +814,11 @@
 		int deref = 0;
 		const char *refname;
 		const char *formatp;
+		const char *valp;
 		struct branch *branch = NULL;
 
+		v->handler = append_atom;
+
 		if (*name == '*') {
 			deref = 1;
 			name++;
@@ -653,10 +849,12 @@
 			refname = branch_get_push(branch, NULL);
 			if (!refname)
 				continue;
-		} else if (starts_with(name, "color:")) {
+		} else if (match_atom_name(name, "color", &valp)) {
 			char color[COLOR_MAXLEN] = "";
 
-			if (color_parse(name + 6, color) < 0)
+			if (!valp)
+				die(_("expected format: %%(color:<color>)"));
+			if (color_parse(valp, color) < 0)
 				die(_("unable to parse format"));
 			v->s = xstrdup(color);
 			continue;
@@ -686,21 +884,65 @@
 			else
 				v->s = " ";
 			continue;
+		} else if (match_atom_name(name, "align", &valp)) {
+			struct align *align = &v->u.align;
+			struct strbuf **s, **to_free;
+			int width = -1;
+
+			if (!valp)
+				die(_("expected format: %%(align:<width>,<position>)"));
+
+			/*
+			 * TODO: Implement a function similar to strbuf_split_str()
+			 * which would omit the separator from the end of each value.
+			 */
+			s = to_free = strbuf_split_str(valp, ',', 0);
+
+			align->position = ALIGN_LEFT;
+
+			while (*s) {
+				/*  Strip trailing comma */
+				if (s[1])
+					strbuf_setlen(s[0], s[0]->len - 1);
+				if (!strtoul_ui(s[0]->buf, 10, (unsigned int *)&width))
+					;
+				else if (!strcmp(s[0]->buf, "left"))
+					align->position = ALIGN_LEFT;
+				else if (!strcmp(s[0]->buf, "right"))
+					align->position = ALIGN_RIGHT;
+				else if (!strcmp(s[0]->buf, "middle"))
+					align->position = ALIGN_MIDDLE;
+				else
+					die(_("improper format entered align:%s"), s[0]->buf);
+				s++;
+			}
+
+			if (width < 0)
+				die(_("positive width expected with the %%(align) atom"));
+			align->width = width;
+			strbuf_list_free(to_free);
+			v->handler = align_atom_handler;
+			continue;
+		} else if (!strcmp(name, "end")) {
+			v->handler = end_atom_handler;
+			continue;
 		} else
 			continue;
 
 		formatp = strchr(name, ':');
 		if (formatp) {
 			int num_ours, num_theirs;
+			const char *arg;
 
 			formatp++;
 			if (!strcmp(formatp, "short"))
 				refname = shorten_unambiguous_ref(refname,
 						      warn_ambiguous_refs);
+			else if (skip_prefix(formatp, "strip=", &arg))
+				refname = strip_ref_components(refname, arg);
 			else if (!strcmp(formatp, "track") &&
 				 (starts_with(name, "upstream") ||
 				  starts_with(name, "push"))) {
-				char buf[40];
 
 				if (stat_tracking_info(branch, &num_ours,
 						       &num_theirs, NULL))
@@ -708,17 +950,13 @@
 
 				if (!num_ours && !num_theirs)
 					v->s = "";
-				else if (!num_ours) {
-					sprintf(buf, "[behind %d]", num_theirs);
-					v->s = xstrdup(buf);
-				} else if (!num_theirs) {
-					sprintf(buf, "[ahead %d]", num_ours);
-					v->s = xstrdup(buf);
-				} else {
-					sprintf(buf, "[ahead %d, behind %d]",
-						num_ours, num_theirs);
-					v->s = xstrdup(buf);
-				}
+				else if (!num_ours)
+					v->s = xstrfmt("[behind %d]", num_theirs);
+				else if (!num_theirs)
+					v->s = xstrfmt("[ahead %d]", num_ours);
+				else
+					v->s = xstrfmt("[ahead %d, behind %d]",
+						       num_ours, num_theirs);
 				continue;
 			} else if (!strcmp(formatp, "trackshort") &&
 				   (starts_with(name, "upstream") ||
@@ -745,12 +983,8 @@
 
 		if (!deref)
 			v->s = refname;
-		else {
-			int len = strlen(refname);
-			char *s = xmalloc(len + 4);
-			sprintf(s, "%s^{}", refname);
-			v->s = s;
-		}
+		else
+			v->s = xstrfmt("%s^{}", refname);
 	}
 
 	for (i = 0; i < used_atom_cnt; i++) {
@@ -784,7 +1018,7 @@
 	 * If it is a tag object, see if we use a value that derefs
 	 * the object, and if we do grab the object it refers to.
 	 */
-	tagged = ((struct tag *)obj)->tagged->sha1;
+	tagged = ((struct tag *)obj)->tagged->oid.hash;
 
 	/*
 	 * NEEDSWORK: This derefs tag only once, which
@@ -817,11 +1051,143 @@
 	*v = &ref->value[atom];
 }
 
+enum contains_result {
+	CONTAINS_UNKNOWN = -1,
+	CONTAINS_NO = 0,
+	CONTAINS_YES = 1
+};
+
+/*
+ * Mimicking the real stack, this stack lives on the heap, avoiding stack
+ * overflows.
+ *
+ * At each recursion step, the stack items points to the commits whose
+ * ancestors are to be inspected.
+ */
+struct contains_stack {
+	int nr, alloc;
+	struct contains_stack_entry {
+		struct commit *commit;
+		struct commit_list *parents;
+	} *contains_stack;
+};
+
+static int in_commit_list(const struct commit_list *want, struct commit *c)
+{
+	for (; want; want = want->next)
+		if (!oidcmp(&want->item->object.oid, &c->object.oid))
+			return 1;
+	return 0;
+}
+
+/*
+ * Test whether the candidate or one of its parents is contained in the list.
+ * Do not recurse to find out, though, but return -1 if inconclusive.
+ */
+static enum contains_result contains_test(struct commit *candidate,
+			    const struct commit_list *want)
+{
+	/* was it previously marked as containing a want commit? */
+	if (candidate->object.flags & TMP_MARK)
+		return 1;
+	/* or marked as not possibly containing a want commit? */
+	if (candidate->object.flags & UNINTERESTING)
+		return 0;
+	/* or are we it? */
+	if (in_commit_list(want, candidate)) {
+		candidate->object.flags |= TMP_MARK;
+		return 1;
+	}
+
+	if (parse_commit(candidate) < 0)
+		return 0;
+
+	return -1;
+}
+
+static void push_to_contains_stack(struct commit *candidate, struct contains_stack *contains_stack)
+{
+	ALLOC_GROW(contains_stack->contains_stack, contains_stack->nr + 1, contains_stack->alloc);
+	contains_stack->contains_stack[contains_stack->nr].commit = candidate;
+	contains_stack->contains_stack[contains_stack->nr++].parents = candidate->parents;
+}
+
+static enum contains_result contains_tag_algo(struct commit *candidate,
+		const struct commit_list *want)
+{
+	struct contains_stack contains_stack = { 0, 0, NULL };
+	int result = contains_test(candidate, want);
+
+	if (result != CONTAINS_UNKNOWN)
+		return result;
+
+	push_to_contains_stack(candidate, &contains_stack);
+	while (contains_stack.nr) {
+		struct contains_stack_entry *entry = &contains_stack.contains_stack[contains_stack.nr - 1];
+		struct commit *commit = entry->commit;
+		struct commit_list *parents = entry->parents;
+
+		if (!parents) {
+			commit->object.flags |= UNINTERESTING;
+			contains_stack.nr--;
+		}
+		/*
+		 * If we just popped the stack, parents->item has been marked,
+		 * therefore contains_test will return a meaningful 0 or 1.
+		 */
+		else switch (contains_test(parents->item, want)) {
+		case CONTAINS_YES:
+			commit->object.flags |= TMP_MARK;
+			contains_stack.nr--;
+			break;
+		case CONTAINS_NO:
+			entry->parents = parents->next;
+			break;
+		case CONTAINS_UNKNOWN:
+			push_to_contains_stack(parents->item, &contains_stack);
+			break;
+		}
+	}
+	free(contains_stack.contains_stack);
+	return contains_test(candidate, want);
+}
+
+static int commit_contains(struct ref_filter *filter, struct commit *commit)
+{
+	if (filter->with_commit_tag_algo)
+		return contains_tag_algo(commit, filter->with_commit);
+	return is_descendant_of(commit, filter->with_commit);
+}
+
+/*
+ * Return 1 if the refname matches one of the patterns, otherwise 0.
+ * A pattern can be a literal prefix (e.g. a refname "refs/heads/master"
+ * matches a pattern "refs/heads/mas") or a wildcard (e.g. the same ref
+ * matches "refs/heads/mas*", too).
+ */
+static int match_pattern(const char **patterns, const char *refname)
+{
+	/*
+	 * When no '--format' option is given we need to skip the prefix
+	 * for matching refs of tags and branches.
+	 */
+	(void)(skip_prefix(refname, "refs/tags/", &refname) ||
+	       skip_prefix(refname, "refs/heads/", &refname) ||
+	       skip_prefix(refname, "refs/remotes/", &refname) ||
+	       skip_prefix(refname, "refs/", &refname));
+
+	for (; *patterns; patterns++) {
+		if (!wildmatch(*patterns, refname, 0, NULL))
+			return 1;
+	}
+	return 0;
+}
+
 /*
  * Return 1 if the refname matches one of the patterns, otherwise 0.
  * A pattern can be path prefix (e.g. a refname "refs/heads/master"
- * matches a pattern "refs/heads/") or a wildcard (e.g. the same ref
- * matches "refs/heads/m*",too).
+ * matches a pattern "refs/heads/" but not "refs/heads/m") or a
+ * wildcard (e.g. the same ref matches "refs/heads/m*", too).
  */
 static int match_name_as_path(const char **pattern, const char *refname)
 {
@@ -842,21 +1208,89 @@
 	return 0;
 }
 
+/* Return 1 if the refname matches one of the patterns, otherwise 0. */
+static int filter_pattern_match(struct ref_filter *filter, const char *refname)
+{
+	if (!*filter->name_patterns)
+		return 1; /* No pattern always matches */
+	if (filter->match_as_path)
+		return match_name_as_path(filter->name_patterns, refname);
+	return match_pattern(filter->name_patterns, refname);
+}
+
+/*
+ * Given a ref (sha1, refname), check if the ref belongs to the array
+ * of sha1s. If the given ref is a tag, check if the given tag points
+ * at one of the sha1s in the given sha1 array.
+ * the given sha1_array.
+ * NEEDSWORK:
+ * 1. Only a single level of inderection is obtained, we might want to
+ * change this to account for multiple levels (e.g. annotated tags
+ * pointing to annotated tags pointing to a commit.)
+ * 2. As the refs are cached we might know what refname peels to without
+ * the need to parse the object via parse_object(). peel_ref() might be a
+ * more efficient alternative to obtain the pointee.
+ */
+static const unsigned char *match_points_at(struct sha1_array *points_at,
+					    const unsigned char *sha1,
+					    const char *refname)
+{
+	const unsigned char *tagged_sha1 = NULL;
+	struct object *obj;
+
+	if (sha1_array_lookup(points_at, sha1) >= 0)
+		return sha1;
+	obj = parse_object(sha1);
+	if (!obj)
+		die(_("malformed object at '%s'"), refname);
+	if (obj->type == OBJ_TAG)
+		tagged_sha1 = ((struct tag *)obj)->tagged->oid.hash;
+	if (tagged_sha1 && sha1_array_lookup(points_at, tagged_sha1) >= 0)
+		return tagged_sha1;
+	return NULL;
+}
+
 /* Allocate space for a new ref_array_item and copy the objectname and flag to it */
 static struct ref_array_item *new_ref_array_item(const char *refname,
 						 const unsigned char *objectname,
 						 int flag)
 {
-	size_t len = strlen(refname);
-	struct ref_array_item *ref = xcalloc(1, sizeof(struct ref_array_item) + len + 1);
-	memcpy(ref->refname, refname, len);
-	ref->refname[len] = '\0';
+	struct ref_array_item *ref;
+	FLEX_ALLOC_STR(ref, refname, refname);
 	hashcpy(ref->objectname, objectname);
 	ref->flag = flag;
 
 	return ref;
 }
 
+static int filter_ref_kind(struct ref_filter *filter, const char *refname)
+{
+	unsigned int i;
+
+	static struct {
+		const char *prefix;
+		unsigned int kind;
+	} ref_kind[] = {
+		{ "refs/heads/" , FILTER_REFS_BRANCHES },
+		{ "refs/remotes/" , FILTER_REFS_REMOTES },
+		{ "refs/tags/", FILTER_REFS_TAGS}
+	};
+
+	if (filter->kind == FILTER_REFS_BRANCHES ||
+	    filter->kind == FILTER_REFS_REMOTES ||
+	    filter->kind == FILTER_REFS_TAGS)
+		return filter->kind;
+	else if (!strcmp(refname, "HEAD"))
+		return FILTER_REFS_DETACHED_HEAD;
+
+	for (i = 0; i < ARRAY_SIZE(ref_kind); i++) {
+		if (starts_with(refname, ref_kind[i].prefix))
+			return ref_kind[i].kind;
+	}
+
+	return FILTER_REFS_OTHERS;
+}
+
 /*
  * A call-back given to for_each_ref().  Filter refs and keep them for
  * later object processing.
@@ -866,6 +1300,8 @@
 	struct ref_filter_cbdata *ref_cbdata = cb_data;
 	struct ref_filter *filter = ref_cbdata->filter;
 	struct ref_array_item *ref;
+	struct commit *commit = NULL;
+	unsigned int kind;
 
 	if (flag & REF_BAD_NAME) {
 		warning("ignoring ref with broken name %s", refname);
@@ -877,18 +1313,43 @@
 		return 0;
 	}
 
-	if (*filter->name_patterns && !match_name_as_path(filter->name_patterns, refname))
+	/* Obtain the current ref kind from filter_ref_kind() and ignore unwanted refs. */
+	kind = filter_ref_kind(filter, refname);
+	if (!(kind & filter->kind))
 		return 0;
 
+	if (!filter_pattern_match(filter, refname))
+		return 0;
+
+	if (filter->points_at.nr && !match_points_at(&filter->points_at, oid->hash, refname))
+		return 0;
+
+	/*
+	 * A merge filter is applied on refs pointing to commits. Hence
+	 * obtain the commit using the 'oid' available and discard all
+	 * non-commits early. The actual filtering is done later.
+	 */
+	if (filter->merge_commit || filter->with_commit || filter->verbose) {
+		commit = lookup_commit_reference_gently(oid->hash, 1);
+		if (!commit)
+			return 0;
+		/* We perform the filtering for the '--contains' option */
+		if (filter->with_commit &&
+		    !commit_contains(filter, commit))
+			return 0;
+	}
+
 	/*
 	 * We do not open the object yet; sort may only need refname
 	 * to do its job and the resulting list may yet to be pruned
 	 * by maxcount logic.
 	 */
 	ref = new_ref_array_item(refname, oid->hash, flag);
+	ref->commit = commit;
 
 	REALLOC_ARRAY(ref_cbdata->array->items, ref_cbdata->array->nr + 1);
 	ref_cbdata->array->items[ref_cbdata->array->nr++] = ref;
+	ref->kind = kind;
 	return 0;
 }
 
@@ -911,6 +1372,50 @@
 	array->nr = array->alloc = 0;
 }
 
+static void do_merge_filter(struct ref_filter_cbdata *ref_cbdata)
+{
+	struct rev_info revs;
+	int i, old_nr;
+	struct ref_filter *filter = ref_cbdata->filter;
+	struct ref_array *array = ref_cbdata->array;
+	struct commit **to_clear = xcalloc(sizeof(struct commit *), array->nr);
+
+	init_revisions(&revs, NULL);
+
+	for (i = 0; i < array->nr; i++) {
+		struct ref_array_item *item = array->items[i];
+		add_pending_object(&revs, &item->commit->object, item->refname);
+		to_clear[i] = item->commit;
+	}
+
+	filter->merge_commit->object.flags |= UNINTERESTING;
+	add_pending_object(&revs, &filter->merge_commit->object, "");
+
+	revs.limited = 1;
+	if (prepare_revision_walk(&revs))
+		die(_("revision walk setup failed"));
+
+	old_nr = array->nr;
+	array->nr = 0;
+
+	for (i = 0; i < old_nr; i++) {
+		struct ref_array_item *item = array->items[i];
+		struct commit *commit = item->commit;
+
+		int is_merged = !!(commit->object.flags & UNINTERESTING);
+
+		if (is_merged == (filter->merge == REF_FILTER_MERGED_INCLUDE))
+			array->items[array->nr++] = array->items[i];
+		else
+			free_array_item(item);
+	}
+
+	for (i = 0; i < old_nr; i++)
+		clear_commit_marks(to_clear[i], ALL_REV_FLAGS);
+	clear_commit_marks(filter->merge_commit, ALL_REV_FLAGS);
+	free(to_clear);
+}
+
 /*
  * API for filtering a set of refs. Based on the type of refs the user
  * has requested, we iterate through those refs and apply filters
@@ -920,17 +1425,44 @@
 int filter_refs(struct ref_array *array, struct ref_filter *filter, unsigned int type)
 {
 	struct ref_filter_cbdata ref_cbdata;
+	int ret = 0;
+	unsigned int broken = 0;
 
 	ref_cbdata.array = array;
 	ref_cbdata.filter = filter;
 
-	if (type & (FILTER_REFS_ALL | FILTER_REFS_INCLUDE_BROKEN))
-		return for_each_rawref(ref_filter_handler, &ref_cbdata);
-	else if (type & FILTER_REFS_ALL)
-		return for_each_ref(ref_filter_handler, &ref_cbdata);
-	else
+	if (type & FILTER_REFS_INCLUDE_BROKEN)
+		broken = 1;
+	filter->kind = type & FILTER_REFS_KIND_MASK;
+
+	/*  Simple per-ref filtering */
+	if (!filter->kind)
 		die("filter_refs: invalid type");
-	return 0;
+	else {
+		/*
+		 * For common cases where we need only branches or remotes or tags,
+		 * we only iterate through those refs. If a mix of refs is needed,
+		 * we iterate over all refs and filter out required refs with the help
+		 * of filter_ref_kind().
+		 */
+		if (filter->kind == FILTER_REFS_BRANCHES)
+			ret = for_each_fullref_in("refs/heads/", ref_filter_handler, &ref_cbdata, broken);
+		else if (filter->kind == FILTER_REFS_REMOTES)
+			ret = for_each_fullref_in("refs/remotes/", ref_filter_handler, &ref_cbdata, broken);
+		else if (filter->kind == FILTER_REFS_TAGS)
+			ret = for_each_fullref_in("refs/tags/", ref_filter_handler, &ref_cbdata, broken);
+		else if (filter->kind & FILTER_REFS_ALL)
+			ret = for_each_fullref_in("", ref_filter_handler, &ref_cbdata, broken);
+		if (!ret && (filter->kind & FILTER_REFS_DETACHED_HEAD))
+			head_ref(ref_filter_handler, &ref_cbdata);
+	}
+
+
+	/*  Filters that need revision walking */
+	if (filter->merge_commit)
+		do_merge_filter(&ref_cbdata);
+
+	return ret;
 }
 
 static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, struct ref_array_item *b)
@@ -941,19 +1473,19 @@
 
 	get_ref_atom_value(a, s->atom, &va);
 	get_ref_atom_value(b, s->atom, &vb);
-	switch (cmp_type) {
-	case FIELD_STR:
+	if (s->version)
+		cmp = versioncmp(va->s, vb->s);
+	else if (cmp_type == FIELD_STR)
 		cmp = strcmp(va->s, vb->s);
-		break;
-	default:
+	else {
 		if (va->ul < vb->ul)
 			cmp = -1;
 		else if (va->ul == vb->ul)
-			cmp = 0;
+			cmp = strcmp(a->refname, b->refname);
 		else
 			cmp = 1;
-		break;
 	}
+
 	return (s->reverse) ? -cmp : cmp;
 }
 
@@ -978,32 +1510,6 @@
 	qsort(array->items, array->nr, sizeof(struct ref_array_item *), compare_refs);
 }
 
-static void print_value(struct atom_value *v, int quote_style)
-{
-	struct strbuf sb = STRBUF_INIT;
-	switch (quote_style) {
-	case QUOTE_NONE:
-		fputs(v->s, stdout);
-		break;
-	case QUOTE_SHELL:
-		sq_quote_buf(&sb, v->s);
-		break;
-	case QUOTE_PERL:
-		perl_quote_buf(&sb, v->s);
-		break;
-	case QUOTE_PYTHON:
-		python_quote_buf(&sb, v->s);
-		break;
-	case QUOTE_TCL:
-		tcl_quote_buf(&sb, v->s);
-		break;
-	}
-	if (quote_style != QUOTE_NONE) {
-		fputs(sb.buf, stdout);
-		strbuf_release(&sb);
-	}
-}
-
 static int hex1(char ch)
 {
 	if ('0' <= ch && ch <= '9')
@@ -1022,8 +1528,10 @@
 		return -1;
 }
 
-static void emit(const char *cp, const char *ep)
+static void append_literal(const char *cp, const char *ep, struct ref_formatting_state *state)
 {
+	struct strbuf *s = &state->stack->output;
+
 	while (*cp && (!ep || cp < ep)) {
 		if (*cp == '%') {
 			if (cp[1] == '%')
@@ -1031,13 +1539,13 @@
 			else {
 				int ch = hex2(cp + 1);
 				if (0 <= ch) {
-					putchar(ch);
+					strbuf_addch(s, ch);
 					cp += 3;
 					continue;
 				}
 			}
 		}
-		putchar(*cp);
+		strbuf_addch(s, *cp);
 		cp++;
 	}
 }
@@ -1045,19 +1553,24 @@
 void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style)
 {
 	const char *cp, *sp, *ep;
+	struct strbuf *final_buf;
+	struct ref_formatting_state state = REF_FORMATTING_STATE_INIT;
+
+	state.quote_style = quote_style;
+	push_stack_element(&state.stack);
 
 	for (cp = format; *cp && (sp = find_next(cp)); cp = ep + 1) {
 		struct atom_value *atomv;
 
 		ep = strchr(sp, ')');
 		if (cp < sp)
-			emit(cp, sp);
+			append_literal(cp, sp, &state);
 		get_ref_atom_value(info, parse_ref_filter_atom(sp + 2, ep), &atomv);
-		print_value(atomv, quote_style);
+		atomv->handler(atomv, &state);
 	}
 	if (*cp) {
 		sp = cp + strlen(cp);
-		emit(cp, sp);
+		append_literal(cp, sp, &state);
 	}
 	if (need_color_reset_at_eol) {
 		struct atom_value resetv;
@@ -1066,8 +1579,13 @@
 		if (color_parse("reset", color) < 0)
 			die("BUG: couldn't parse 'reset' as a color");
 		resetv.s = color;
-		print_value(&resetv, quote_style);
+		append_atom(&resetv, &state);
 	}
+	if (state.stack->prev)
+		die(_("format: %%(end) atom missing"));
+	final_buf = &state.stack->output;
+	fwrite(final_buf->buf, 1, final_buf->len, stdout);
+	pop_stack_element(&state.stack);
 	putchar('\n');
 }
 
@@ -1100,7 +1618,29 @@
 		s->reverse = 1;
 		arg++;
 	}
+	if (skip_prefix(arg, "version:", &arg) ||
+	    skip_prefix(arg, "v:", &arg))
+		s->version = 1;
 	len = strlen(arg);
 	s->atom = parse_ref_filter_atom(arg, arg+len);
 	return 0;
 }
+
+int parse_opt_merge_filter(const struct option *opt, const char *arg, int unset)
+{
+	struct ref_filter *rf = opt->value;
+	unsigned char sha1[20];
+
+	rf->merge = starts_with(opt->long_name, "no")
+		? REF_FILTER_MERGED_OMIT
+		: REF_FILTER_MERGED_INCLUDE;
+
+	if (get_sha1(arg, sha1))
+		die(_("malformed object name %s"), arg);
+
+	rf->merge_commit = lookup_commit_reference_gently(sha1, 0);
+	if (!rf->merge_commit)
+		return opterror(opt, "must point to a commit", 0);
+
+	return 0;
+}
diff --git a/ref-filter.h b/ref-filter.h
index 6997984..14d435e 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -13,24 +13,31 @@
 #define QUOTE_PYTHON 4
 #define QUOTE_TCL 8
 
-#define FILTER_REFS_INCLUDE_BROKEN 0x1
-#define FILTER_REFS_ALL 0x2
+#define FILTER_REFS_INCLUDE_BROKEN 0x0001
+#define FILTER_REFS_TAGS           0x0002
+#define FILTER_REFS_BRANCHES       0x0004
+#define FILTER_REFS_REMOTES        0x0008
+#define FILTER_REFS_OTHERS         0x0010
+#define FILTER_REFS_ALL            (FILTER_REFS_TAGS | FILTER_REFS_BRANCHES | \
+				    FILTER_REFS_REMOTES | FILTER_REFS_OTHERS)
+#define FILTER_REFS_DETACHED_HEAD  0x0020
+#define FILTER_REFS_KIND_MASK      (FILTER_REFS_ALL | FILTER_REFS_DETACHED_HEAD)
 
-struct atom_value {
-	const char *s;
-	unsigned long ul; /* used for sorting when not FIELD_STR */
-};
+struct atom_value;
 
 struct ref_sorting {
 	struct ref_sorting *next;
 	int atom; /* index into used_atom array (internal) */
-	unsigned reverse : 1;
+	unsigned reverse : 1,
+		version : 1;
 };
 
 struct ref_array_item {
 	unsigned char objectname[20];
 	int flag;
+	unsigned int kind;
 	const char *symref;
+	struct commit *commit;
 	struct atom_value *value;
 	char refname[FLEX_ARRAY];
 };
@@ -38,10 +45,28 @@
 struct ref_array {
 	int nr, alloc;
 	struct ref_array_item **items;
+	struct rev_info *revs;
 };
 
 struct ref_filter {
 	const char **name_patterns;
+	struct sha1_array points_at;
+	struct commit_list *with_commit;
+
+	enum {
+		REF_FILTER_MERGED_NONE = 0,
+		REF_FILTER_MERGED_INCLUDE,
+		REF_FILTER_MERGED_OMIT
+	} merge;
+	struct commit *merge_commit;
+
+	unsigned int with_commit_tag_algo : 1,
+		match_as_path : 1,
+		detached : 1;
+	unsigned int kind,
+		lines;
+	int abbrev,
+		verbose;
 };
 
 struct ref_filter_cbdata {
@@ -49,6 +74,15 @@
 	struct ref_filter *filter;
 };
 
+/*  Macros for checking --merged and --no-merged options */
+#define _OPT_MERGED_NO_MERGED(option, filter, h) \
+	{ OPTION_CALLBACK, 0, option, (filter), N_("commit"), (h), \
+	  PARSE_OPT_LASTARG_DEFAULT | PARSE_OPT_NONEG, \
+	  parse_opt_merge_filter, (intptr_t) "HEAD" \
+	}
+#define OPT_MERGED(f, h) _OPT_MERGED_NO_MERGED("merged", f, h)
+#define OPT_NO_MERGED(f, h) _OPT_MERGED_NO_MERGED("no-merged", f, h)
+
 /*
  * API for filtering a set of refs. Based on the type of refs the user
  * has requested, we iterate through those refs and apply filters
@@ -70,5 +104,7 @@
 int parse_opt_ref_sorting(const struct option *opt, const char *arg, int unset);
 /*  Default sort option based on refname */
 struct ref_sorting *ref_default_sorting(void);
+/*  Function to parse --merged and --no-merged options */
+int parse_opt_merge_filter(const struct option *opt, const char *arg, int unset);
 
 #endif /*  REF_FILTER_H  */
diff --git a/reflog-walk.c b/reflog-walk.c
index f8e743a..0ebd1da 100644
--- a/reflog-walk.c
+++ b/reflog-walk.c
@@ -56,12 +56,11 @@
 		}
 	}
 	if (reflogs->nr == 0) {
-		int len = strlen(ref);
-		char *refname = xmalloc(len + 12);
-		sprintf(refname, "refs/%s", ref);
+		char *refname = xstrfmt("refs/%s", ref);
 		for_each_reflog_ent(refname, read_one_reflog, reflogs);
 		if (reflogs->nr == 0) {
-			sprintf(refname, "refs/heads/%s", ref);
+			free(refname);
+			refname = xstrfmt("refs/heads/%s", ref);
 			for_each_reflog_ent(refname, read_one_reflog, reflogs);
 		}
 		free(refname);
@@ -222,6 +221,7 @@
 	struct commit_info *commit_info =
 		get_commit_info(commit, &info->reflogs, 0);
 	struct commit_reflog *commit_reflog;
+	struct object *logobj;
 	struct reflog_info *reflog;
 
 	info->last_commit_reflog = NULL;
@@ -233,15 +233,20 @@
 		commit->parents = NULL;
 		return;
 	}
-
-	reflog = &commit_reflog->reflogs->items[commit_reflog->recno];
 	info->last_commit_reflog = commit_reflog;
-	commit_reflog->recno--;
-	commit_info->commit = (struct commit *)parse_object(reflog->osha1);
-	if (!commit_info->commit) {
+
+	do {
+		reflog = &commit_reflog->reflogs->items[commit_reflog->recno];
+		commit_reflog->recno--;
+		logobj = parse_object(reflog->osha1);
+	} while (commit_reflog->recno && (logobj && logobj->type != OBJ_COMMIT));
+
+	if (!logobj || logobj->type != OBJ_COMMIT) {
+		commit_info->commit = NULL;
 		commit->parents = NULL;
 		return;
 	}
+	commit_info->commit = (struct commit *)logobj;
 
 	commit->parents = xcalloc(1, sizeof(struct commit_list));
 	commit->parents->item = commit_info->commit;
diff --git a/refs.c b/refs.c
index 9ac9a67..b0e6ece 100644
--- a/refs.c
+++ b/refs.c
@@ -1,17 +1,13 @@
+/*
+ * The backend-independent part of the reference module.
+ */
+
 #include "cache.h"
 #include "lockfile.h"
 #include "refs.h"
+#include "refs/refs-internal.h"
 #include "object.h"
 #include "tag.h"
-#include "dir.h"
-#include "string-list.h"
-
-struct ref_lock {
-	char *ref_name;
-	char *orig_ref_name;
-	struct lock_file *lk;
-	struct object_id old_oid;
-};
 
 /*
  * How to handle various characters in refnames:
@@ -35,41 +31,6 @@
 };
 
 /*
- * Flag passed to lock_ref_sha1_basic() telling it to tolerate broken
- * refs (i.e., because the reference is about to be deleted anyway).
- */
-#define REF_DELETING	0x02
-
-/*
- * Used as a flag in ref_update::flags when a loose ref is being
- * pruned.
- */
-#define REF_ISPRUNING	0x04
-
-/*
- * Used as a flag in ref_update::flags when the reference should be
- * updated to new_sha1.
- */
-#define REF_HAVE_NEW	0x08
-
-/*
- * Used as a flag in ref_update::flags when old_sha1 should be
- * checked.
- */
-#define REF_HAVE_OLD	0x10
-
-/*
- * Used as a flag in ref_update::flags when the lockfile needs to be
- * committed.
- */
-#define REF_NEEDS_COMMIT 0x20
-
-/*
- * 0x40 is REF_FORCE_CREATE_REFLOG, so skip it if you're adding a
- * value to ref_update::flags
- */
-
-/*
  * Try to read one refname component from the front of refname.
  * Return the length of the component found, or -1 if the component is
  * not legal.  It is legal if it is something reasonable to have under
@@ -157,182 +118,13 @@
 	return 0;
 }
 
-struct ref_entry;
-
-/*
- * Information used (along with the information in ref_entry) to
- * describe a single cached reference.  This data structure only
- * occurs embedded in a union in struct ref_entry, and only when
- * (ref_entry->flag & REF_DIR) is zero.
- */
-struct ref_value {
-	/*
-	 * The name of the object to which this reference resolves
-	 * (which may be a tag object).  If REF_ISBROKEN, this is
-	 * null.  If REF_ISSYMREF, then this is the name of the object
-	 * referred to by the last reference in the symlink chain.
-	 */
-	struct object_id oid;
-
-	/*
-	 * If REF_KNOWS_PEELED, then this field holds the peeled value
-	 * of this reference, or null if the reference is known not to
-	 * be peelable.  See the documentation for peel_ref() for an
-	 * exact definition of "peelable".
-	 */
-	struct object_id peeled;
-};
-
-struct ref_cache;
-
-/*
- * Information used (along with the information in ref_entry) to
- * describe a level in the hierarchy of references.  This data
- * structure only occurs embedded in a union in struct ref_entry, and
- * only when (ref_entry.flag & REF_DIR) is set.  In that case,
- * (ref_entry.flag & REF_INCOMPLETE) determines whether the references
- * in the directory have already been read:
- *
- *     (ref_entry.flag & REF_INCOMPLETE) unset -- a directory of loose
- *         or packed references, already read.
- *
- *     (ref_entry.flag & REF_INCOMPLETE) set -- a directory of loose
- *         references that hasn't been read yet (nor has any of its
- *         subdirectories).
- *
- * Entries within a directory are stored within a growable array of
- * pointers to ref_entries (entries, nr, alloc).  Entries 0 <= i <
- * sorted are sorted by their component name in strcmp() order and the
- * remaining entries are unsorted.
- *
- * Loose references are read lazily, one directory at a time.  When a
- * directory of loose references is read, then all of the references
- * in that directory are stored, and REF_INCOMPLETE stubs are created
- * for any subdirectories, but the subdirectories themselves are not
- * read.  The reading is triggered by get_ref_dir().
- */
-struct ref_dir {
-	int nr, alloc;
-
-	/*
-	 * Entries with index 0 <= i < sorted are sorted by name.  New
-	 * entries are appended to the list unsorted, and are sorted
-	 * only when required; thus we avoid the need to sort the list
-	 * after the addition of every reference.
-	 */
-	int sorted;
-
-	/* A pointer to the ref_cache that contains this ref_dir. */
-	struct ref_cache *ref_cache;
-
-	struct ref_entry **entries;
-};
-
-/*
- * Bit values for ref_entry::flag.  REF_ISSYMREF=0x01,
- * REF_ISPACKED=0x02, REF_ISBROKEN=0x04 and REF_BAD_NAME=0x08 are
- * public values; see refs.h.
- */
-
-/*
- * The field ref_entry->u.value.peeled of this value entry contains
- * the correct peeled value for the reference, which might be
- * null_sha1 if the reference is not a tag or if it is broken.
- */
-#define REF_KNOWS_PEELED 0x10
-
-/* ref_entry represents a directory of references */
-#define REF_DIR 0x20
-
-/*
- * Entry has not yet been read from disk (used only for REF_DIR
- * entries representing loose references)
- */
-#define REF_INCOMPLETE 0x40
-
-/*
- * A ref_entry represents either a reference or a "subdirectory" of
- * references.
- *
- * Each directory in the reference namespace is represented by a
- * ref_entry with (flags & REF_DIR) set and containing a subdir member
- * that holds the entries in that directory that have been read so
- * far.  If (flags & REF_INCOMPLETE) is set, then the directory and
- * its subdirectories haven't been read yet.  REF_INCOMPLETE is only
- * used for loose reference directories.
- *
- * References are represented by a ref_entry with (flags & REF_DIR)
- * unset and a value member that describes the reference's value.  The
- * flag member is at the ref_entry level, but it is also needed to
- * interpret the contents of the value field (in other words, a
- * ref_value object is not very much use without the enclosing
- * ref_entry).
- *
- * Reference names cannot end with slash and directories' names are
- * always stored with a trailing slash (except for the top-level
- * directory, which is always denoted by "").  This has two nice
- * consequences: (1) when the entries in each subdir are sorted
- * lexicographically by name (as they usually are), the references in
- * a whole tree can be generated in lexicographic order by traversing
- * the tree in left-to-right, depth-first order; (2) the names of
- * references and subdirectories cannot conflict, and therefore the
- * presence of an empty subdirectory does not block the creation of a
- * similarly-named reference.  (The fact that reference names with the
- * same leading components can conflict *with each other* is a
- * separate issue that is regulated by verify_refname_available().)
- *
- * Please note that the name field contains the fully-qualified
- * reference (or subdirectory) name.  Space could be saved by only
- * storing the relative names.  But that would require the full names
- * to be generated on the fly when iterating in do_for_each_ref(), and
- * would break callback functions, who have always been able to assume
- * that the name strings that they are passed will not be freed during
- * the iteration.
- */
-struct ref_entry {
-	unsigned char flag; /* ISSYMREF? ISPACKED? */
-	union {
-		struct ref_value value; /* if not (flags&REF_DIR) */
-		struct ref_dir subdir; /* if (flags&REF_DIR) */
-	} u;
-	/*
-	 * The full name of the reference (e.g., "refs/heads/master")
-	 * or the full name of the directory with a trailing slash
-	 * (e.g., "refs/heads/"):
-	 */
-	char name[FLEX_ARRAY];
-};
-
-static void read_loose_refs(const char *dirname, struct ref_dir *dir);
-
-static struct ref_dir *get_ref_dir(struct ref_entry *entry)
-{
-	struct ref_dir *dir;
-	assert(entry->flag & REF_DIR);
-	dir = &entry->u.subdir;
-	if (entry->flag & REF_INCOMPLETE) {
-		read_loose_refs(entry->name, dir);
-		entry->flag &= ~REF_INCOMPLETE;
-	}
-	return dir;
-}
-
-/*
- * Check if a refname is safe.
- * For refs that start with "refs/" we consider it safe as long they do
- * not try to resolve to outside of refs/.
- *
- * For all other refs we only consider them safe iff they only contain
- * upper case characters and '_' (like "HEAD" AND "MERGE_HEAD", and not like
- * "config").
- */
-static int refname_is_safe(const char *refname)
+int refname_is_safe(const char *refname)
 {
 	if (starts_with(refname, "refs/")) {
 		char *buf;
 		int result;
 
-		buf = xmalloc(strlen(refname) + 1);
+		buf = xmallocz(strlen(refname));
 		/*
 		 * Does the refname try to escape refs/?
 		 * For example: refs/foo/../bar is safe but refs/foo/../../bar
@@ -350,1419 +142,6 @@
 	return 1;
 }
 
-static struct ref_entry *create_ref_entry(const char *refname,
-					  const unsigned char *sha1, int flag,
-					  int check_name)
-{
-	int len;
-	struct ref_entry *ref;
-
-	if (check_name &&
-	    check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
-		die("Reference has invalid format: '%s'", refname);
-	len = strlen(refname) + 1;
-	ref = xmalloc(sizeof(struct ref_entry) + len);
-	hashcpy(ref->u.value.oid.hash, sha1);
-	oidclr(&ref->u.value.peeled);
-	memcpy(ref->name, refname, len);
-	ref->flag = flag;
-	return ref;
-}
-
-static void clear_ref_dir(struct ref_dir *dir);
-
-static void free_ref_entry(struct ref_entry *entry)
-{
-	if (entry->flag & REF_DIR) {
-		/*
-		 * Do not use get_ref_dir() here, as that might
-		 * trigger the reading of loose refs.
-		 */
-		clear_ref_dir(&entry->u.subdir);
-	}
-	free(entry);
-}
-
-/*
- * Add a ref_entry to the end of dir (unsorted).  Entry is always
- * stored directly in dir; no recursion into subdirectories is
- * done.
- */
-static void add_entry_to_dir(struct ref_dir *dir, struct ref_entry *entry)
-{
-	ALLOC_GROW(dir->entries, dir->nr + 1, dir->alloc);
-	dir->entries[dir->nr++] = entry;
-	/* optimize for the case that entries are added in order */
-	if (dir->nr == 1 ||
-	    (dir->nr == dir->sorted + 1 &&
-	     strcmp(dir->entries[dir->nr - 2]->name,
-		    dir->entries[dir->nr - 1]->name) < 0))
-		dir->sorted = dir->nr;
-}
-
-/*
- * Clear and free all entries in dir, recursively.
- */
-static void clear_ref_dir(struct ref_dir *dir)
-{
-	int i;
-	for (i = 0; i < dir->nr; i++)
-		free_ref_entry(dir->entries[i]);
-	free(dir->entries);
-	dir->sorted = dir->nr = dir->alloc = 0;
-	dir->entries = NULL;
-}
-
-/*
- * Create a struct ref_entry object for the specified dirname.
- * dirname is the name of the directory with a trailing slash (e.g.,
- * "refs/heads/") or "" for the top-level directory.
- */
-static struct ref_entry *create_dir_entry(struct ref_cache *ref_cache,
-					  const char *dirname, size_t len,
-					  int incomplete)
-{
-	struct ref_entry *direntry;
-	direntry = xcalloc(1, sizeof(struct ref_entry) + len + 1);
-	memcpy(direntry->name, dirname, len);
-	direntry->name[len] = '\0';
-	direntry->u.subdir.ref_cache = ref_cache;
-	direntry->flag = REF_DIR | (incomplete ? REF_INCOMPLETE : 0);
-	return direntry;
-}
-
-static int ref_entry_cmp(const void *a, const void *b)
-{
-	struct ref_entry *one = *(struct ref_entry **)a;
-	struct ref_entry *two = *(struct ref_entry **)b;
-	return strcmp(one->name, two->name);
-}
-
-static void sort_ref_dir(struct ref_dir *dir);
-
-struct string_slice {
-	size_t len;
-	const char *str;
-};
-
-static int ref_entry_cmp_sslice(const void *key_, const void *ent_)
-{
-	const struct string_slice *key = key_;
-	const struct ref_entry *ent = *(const struct ref_entry * const *)ent_;
-	int cmp = strncmp(key->str, ent->name, key->len);
-	if (cmp)
-		return cmp;
-	return '\0' - (unsigned char)ent->name[key->len];
-}
-
-/*
- * Return the index of the entry with the given refname from the
- * ref_dir (non-recursively), sorting dir if necessary.  Return -1 if
- * no such entry is found.  dir must already be complete.
- */
-static int search_ref_dir(struct ref_dir *dir, const char *refname, size_t len)
-{
-	struct ref_entry **r;
-	struct string_slice key;
-
-	if (refname == NULL || !dir->nr)
-		return -1;
-
-	sort_ref_dir(dir);
-	key.len = len;
-	key.str = refname;
-	r = bsearch(&key, dir->entries, dir->nr, sizeof(*dir->entries),
-		    ref_entry_cmp_sslice);
-
-	if (r == NULL)
-		return -1;
-
-	return r - dir->entries;
-}
-
-/*
- * Search for a directory entry directly within dir (without
- * recursing).  Sort dir if necessary.  subdirname must be a directory
- * name (i.e., end in '/').  If mkdir is set, then create the
- * directory if it is missing; otherwise, return NULL if the desired
- * directory cannot be found.  dir must already be complete.
- */
-static struct ref_dir *search_for_subdir(struct ref_dir *dir,
-					 const char *subdirname, size_t len,
-					 int mkdir)
-{
-	int entry_index = search_ref_dir(dir, subdirname, len);
-	struct ref_entry *entry;
-	if (entry_index == -1) {
-		if (!mkdir)
-			return NULL;
-		/*
-		 * Since dir is complete, the absence of a subdir
-		 * means that the subdir really doesn't exist;
-		 * therefore, create an empty record for it but mark
-		 * the record complete.
-		 */
-		entry = create_dir_entry(dir->ref_cache, subdirname, len, 0);
-		add_entry_to_dir(dir, entry);
-	} else {
-		entry = dir->entries[entry_index];
-	}
-	return get_ref_dir(entry);
-}
-
-/*
- * If refname is a reference name, find the ref_dir within the dir
- * tree that should hold refname.  If refname is a directory name
- * (i.e., ends in '/'), then return that ref_dir itself.  dir must
- * represent the top-level directory and must already be complete.
- * Sort ref_dirs and recurse into subdirectories as necessary.  If
- * mkdir is set, then create any missing directories; otherwise,
- * return NULL if the desired directory cannot be found.
- */
-static struct ref_dir *find_containing_dir(struct ref_dir *dir,
-					   const char *refname, int mkdir)
-{
-	const char *slash;
-	for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
-		size_t dirnamelen = slash - refname + 1;
-		struct ref_dir *subdir;
-		subdir = search_for_subdir(dir, refname, dirnamelen, mkdir);
-		if (!subdir) {
-			dir = NULL;
-			break;
-		}
-		dir = subdir;
-	}
-
-	return dir;
-}
-
-/*
- * Find the value entry with the given name in dir, sorting ref_dirs
- * and recursing into subdirectories as necessary.  If the name is not
- * found or it corresponds to a directory entry, return NULL.
- */
-static struct ref_entry *find_ref(struct ref_dir *dir, const char *refname)
-{
-	int entry_index;
-	struct ref_entry *entry;
-	dir = find_containing_dir(dir, refname, 0);
-	if (!dir)
-		return NULL;
-	entry_index = search_ref_dir(dir, refname, strlen(refname));
-	if (entry_index == -1)
-		return NULL;
-	entry = dir->entries[entry_index];
-	return (entry->flag & REF_DIR) ? NULL : entry;
-}
-
-/*
- * Remove the entry with the given name from dir, recursing into
- * subdirectories as necessary.  If refname is the name of a directory
- * (i.e., ends with '/'), then remove the directory and its contents.
- * If the removal was successful, return the number of entries
- * remaining in the directory entry that contained the deleted entry.
- * If the name was not found, return -1.  Please note that this
- * function only deletes the entry from the cache; it does not delete
- * it from the filesystem or ensure that other cache entries (which
- * might be symbolic references to the removed entry) are updated.
- * Nor does it remove any containing dir entries that might be made
- * empty by the removal.  dir must represent the top-level directory
- * and must already be complete.
- */
-static int remove_entry(struct ref_dir *dir, const char *refname)
-{
-	int refname_len = strlen(refname);
-	int entry_index;
-	struct ref_entry *entry;
-	int is_dir = refname[refname_len - 1] == '/';
-	if (is_dir) {
-		/*
-		 * refname represents a reference directory.  Remove
-		 * the trailing slash; otherwise we will get the
-		 * directory *representing* refname rather than the
-		 * one *containing* it.
-		 */
-		char *dirname = xmemdupz(refname, refname_len - 1);
-		dir = find_containing_dir(dir, dirname, 0);
-		free(dirname);
-	} else {
-		dir = find_containing_dir(dir, refname, 0);
-	}
-	if (!dir)
-		return -1;
-	entry_index = search_ref_dir(dir, refname, refname_len);
-	if (entry_index == -1)
-		return -1;
-	entry = dir->entries[entry_index];
-
-	memmove(&dir->entries[entry_index],
-		&dir->entries[entry_index + 1],
-		(dir->nr - entry_index - 1) * sizeof(*dir->entries)
-		);
-	dir->nr--;
-	if (dir->sorted > entry_index)
-		dir->sorted--;
-	free_ref_entry(entry);
-	return dir->nr;
-}
-
-/*
- * Add a ref_entry to the ref_dir (unsorted), recursing into
- * subdirectories as necessary.  dir must represent the top-level
- * directory.  Return 0 on success.
- */
-static int add_ref(struct ref_dir *dir, struct ref_entry *ref)
-{
-	dir = find_containing_dir(dir, ref->name, 1);
-	if (!dir)
-		return -1;
-	add_entry_to_dir(dir, ref);
-	return 0;
-}
-
-/*
- * Emit a warning and return true iff ref1 and ref2 have the same name
- * and the same sha1.  Die if they have the same name but different
- * sha1s.
- */
-static int is_dup_ref(const struct ref_entry *ref1, const struct ref_entry *ref2)
-{
-	if (strcmp(ref1->name, ref2->name))
-		return 0;
-
-	/* Duplicate name; make sure that they don't conflict: */
-
-	if ((ref1->flag & REF_DIR) || (ref2->flag & REF_DIR))
-		/* This is impossible by construction */
-		die("Reference directory conflict: %s", ref1->name);
-
-	if (oidcmp(&ref1->u.value.oid, &ref2->u.value.oid))
-		die("Duplicated ref, and SHA1s don't match: %s", ref1->name);
-
-	warning("Duplicated ref: %s", ref1->name);
-	return 1;
-}
-
-/*
- * Sort the entries in dir non-recursively (if they are not already
- * sorted) and remove any duplicate entries.
- */
-static void sort_ref_dir(struct ref_dir *dir)
-{
-	int i, j;
-	struct ref_entry *last = NULL;
-
-	/*
-	 * This check also prevents passing a zero-length array to qsort(),
-	 * which is a problem on some platforms.
-	 */
-	if (dir->sorted == dir->nr)
-		return;
-
-	qsort(dir->entries, dir->nr, sizeof(*dir->entries), ref_entry_cmp);
-
-	/* Remove any duplicates: */
-	for (i = 0, j = 0; j < dir->nr; j++) {
-		struct ref_entry *entry = dir->entries[j];
-		if (last && is_dup_ref(last, entry))
-			free_ref_entry(entry);
-		else
-			last = dir->entries[i++] = entry;
-	}
-	dir->sorted = dir->nr = i;
-}
-
-/* Include broken references in a do_for_each_ref*() iteration: */
-#define DO_FOR_EACH_INCLUDE_BROKEN 0x01
-
-/*
- * Return true iff the reference described by entry can be resolved to
- * an object in the database.  Emit a warning if the referred-to
- * object does not exist.
- */
-static int ref_resolves_to_object(struct ref_entry *entry)
-{
-	if (entry->flag & REF_ISBROKEN)
-		return 0;
-	if (!has_sha1_file(entry->u.value.oid.hash)) {
-		error("%s does not point to a valid object!", entry->name);
-		return 0;
-	}
-	return 1;
-}
-
-/*
- * current_ref is a performance hack: when iterating over references
- * using the for_each_ref*() functions, current_ref is set to the
- * current reference's entry before calling the callback function.  If
- * the callback function calls peel_ref(), then peel_ref() first
- * checks whether the reference to be peeled is the current reference
- * (it usually is) and if so, returns that reference's peeled version
- * if it is available.  This avoids a refname lookup in a common case.
- */
-static struct ref_entry *current_ref;
-
-typedef int each_ref_entry_fn(struct ref_entry *entry, void *cb_data);
-
-struct ref_entry_cb {
-	const char *base;
-	int trim;
-	int flags;
-	each_ref_fn *fn;
-	void *cb_data;
-};
-
-/*
- * Handle one reference in a do_for_each_ref*()-style iteration,
- * calling an each_ref_fn for each entry.
- */
-static int do_one_ref(struct ref_entry *entry, void *cb_data)
-{
-	struct ref_entry_cb *data = cb_data;
-	struct ref_entry *old_current_ref;
-	int retval;
-
-	if (!starts_with(entry->name, data->base))
-		return 0;
-
-	if (!(data->flags & DO_FOR_EACH_INCLUDE_BROKEN) &&
-	      !ref_resolves_to_object(entry))
-		return 0;
-
-	/* Store the old value, in case this is a recursive call: */
-	old_current_ref = current_ref;
-	current_ref = entry;
-	retval = data->fn(entry->name + data->trim, &entry->u.value.oid,
-			  entry->flag, data->cb_data);
-	current_ref = old_current_ref;
-	return retval;
-}
-
-/*
- * Call fn for each reference in dir that has index in the range
- * offset <= index < dir->nr.  Recurse into subdirectories that are in
- * that index range, sorting them before iterating.  This function
- * does not sort dir itself; it should be sorted beforehand.  fn is
- * called for all references, including broken ones.
- */
-static int do_for_each_entry_in_dir(struct ref_dir *dir, int offset,
-				    each_ref_entry_fn fn, void *cb_data)
-{
-	int i;
-	assert(dir->sorted == dir->nr);
-	for (i = offset; i < dir->nr; i++) {
-		struct ref_entry *entry = dir->entries[i];
-		int retval;
-		if (entry->flag & REF_DIR) {
-			struct ref_dir *subdir = get_ref_dir(entry);
-			sort_ref_dir(subdir);
-			retval = do_for_each_entry_in_dir(subdir, 0, fn, cb_data);
-		} else {
-			retval = fn(entry, cb_data);
-		}
-		if (retval)
-			return retval;
-	}
-	return 0;
-}
-
-/*
- * Call fn for each reference in the union of dir1 and dir2, in order
- * by refname.  Recurse into subdirectories.  If a value entry appears
- * in both dir1 and dir2, then only process the version that is in
- * dir2.  The input dirs must already be sorted, but subdirs will be
- * sorted as needed.  fn is called for all references, including
- * broken ones.
- */
-static int do_for_each_entry_in_dirs(struct ref_dir *dir1,
-				     struct ref_dir *dir2,
-				     each_ref_entry_fn fn, void *cb_data)
-{
-	int retval;
-	int i1 = 0, i2 = 0;
-
-	assert(dir1->sorted == dir1->nr);
-	assert(dir2->sorted == dir2->nr);
-	while (1) {
-		struct ref_entry *e1, *e2;
-		int cmp;
-		if (i1 == dir1->nr) {
-			return do_for_each_entry_in_dir(dir2, i2, fn, cb_data);
-		}
-		if (i2 == dir2->nr) {
-			return do_for_each_entry_in_dir(dir1, i1, fn, cb_data);
-		}
-		e1 = dir1->entries[i1];
-		e2 = dir2->entries[i2];
-		cmp = strcmp(e1->name, e2->name);
-		if (cmp == 0) {
-			if ((e1->flag & REF_DIR) && (e2->flag & REF_DIR)) {
-				/* Both are directories; descend them in parallel. */
-				struct ref_dir *subdir1 = get_ref_dir(e1);
-				struct ref_dir *subdir2 = get_ref_dir(e2);
-				sort_ref_dir(subdir1);
-				sort_ref_dir(subdir2);
-				retval = do_for_each_entry_in_dirs(
-						subdir1, subdir2, fn, cb_data);
-				i1++;
-				i2++;
-			} else if (!(e1->flag & REF_DIR) && !(e2->flag & REF_DIR)) {
-				/* Both are references; ignore the one from dir1. */
-				retval = fn(e2, cb_data);
-				i1++;
-				i2++;
-			} else {
-				die("conflict between reference and directory: %s",
-				    e1->name);
-			}
-		} else {
-			struct ref_entry *e;
-			if (cmp < 0) {
-				e = e1;
-				i1++;
-			} else {
-				e = e2;
-				i2++;
-			}
-			if (e->flag & REF_DIR) {
-				struct ref_dir *subdir = get_ref_dir(e);
-				sort_ref_dir(subdir);
-				retval = do_for_each_entry_in_dir(
-						subdir, 0, fn, cb_data);
-			} else {
-				retval = fn(e, cb_data);
-			}
-		}
-		if (retval)
-			return retval;
-	}
-}
-
-/*
- * Load all of the refs from the dir into our in-memory cache. The hard work
- * of loading loose refs is done by get_ref_dir(), so we just need to recurse
- * through all of the sub-directories. We do not even need to care about
- * sorting, as traversal order does not matter to us.
- */
-static void prime_ref_dir(struct ref_dir *dir)
-{
-	int i;
-	for (i = 0; i < dir->nr; i++) {
-		struct ref_entry *entry = dir->entries[i];
-		if (entry->flag & REF_DIR)
-			prime_ref_dir(get_ref_dir(entry));
-	}
-}
-
-struct nonmatching_ref_data {
-	const struct string_list *skip;
-	const char *conflicting_refname;
-};
-
-static int nonmatching_ref_fn(struct ref_entry *entry, void *vdata)
-{
-	struct nonmatching_ref_data *data = vdata;
-
-	if (data->skip && string_list_has_string(data->skip, entry->name))
-		return 0;
-
-	data->conflicting_refname = entry->name;
-	return 1;
-}
-
-/*
- * Return 0 if a reference named refname could be created without
- * conflicting with the name of an existing reference in dir.
- * Otherwise, return a negative value and write an explanation to err.
- * If extras is non-NULL, it is a list of additional refnames with
- * which refname is not allowed to conflict. If skip is non-NULL,
- * ignore potential conflicts with refs in skip (e.g., because they
- * are scheduled for deletion in the same operation). Behavior is
- * undefined if the same name is listed in both extras and skip.
- *
- * Two reference names conflict if one of them exactly matches the
- * leading components of the other; e.g., "refs/foo/bar" conflicts
- * with both "refs/foo" and with "refs/foo/bar/baz" but not with
- * "refs/foo/bar" or "refs/foo/barbados".
- *
- * extras and skip must be sorted.
- */
-static int verify_refname_available(const char *refname,
-				    const struct string_list *extras,
-				    const struct string_list *skip,
-				    struct ref_dir *dir,
-				    struct strbuf *err)
-{
-	const char *slash;
-	int pos;
-	struct strbuf dirname = STRBUF_INIT;
-	int ret = -1;
-
-	/*
-	 * For the sake of comments in this function, suppose that
-	 * refname is "refs/foo/bar".
-	 */
-
-	assert(err);
-
-	strbuf_grow(&dirname, strlen(refname) + 1);
-	for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
-		/* Expand dirname to the new prefix, not including the trailing slash: */
-		strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
-
-		/*
-		 * We are still at a leading dir of the refname (e.g.,
-		 * "refs/foo"; if there is a reference with that name,
-		 * it is a conflict, *unless* it is in skip.
-		 */
-		if (dir) {
-			pos = search_ref_dir(dir, dirname.buf, dirname.len);
-			if (pos >= 0 &&
-			    (!skip || !string_list_has_string(skip, dirname.buf))) {
-				/*
-				 * We found a reference whose name is
-				 * a proper prefix of refname; e.g.,
-				 * "refs/foo", and is not in skip.
-				 */
-				strbuf_addf(err, "'%s' exists; cannot create '%s'",
-					    dirname.buf, refname);
-				goto cleanup;
-			}
-		}
-
-		if (extras && string_list_has_string(extras, dirname.buf) &&
-		    (!skip || !string_list_has_string(skip, dirname.buf))) {
-			strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
-				    refname, dirname.buf);
-			goto cleanup;
-		}
-
-		/*
-		 * Otherwise, we can try to continue our search with
-		 * the next component. So try to look up the
-		 * directory, e.g., "refs/foo/". If we come up empty,
-		 * we know there is nothing under this whole prefix,
-		 * but even in that case we still have to continue the
-		 * search for conflicts with extras.
-		 */
-		strbuf_addch(&dirname, '/');
-		if (dir) {
-			pos = search_ref_dir(dir, dirname.buf, dirname.len);
-			if (pos < 0) {
-				/*
-				 * There was no directory "refs/foo/",
-				 * so there is nothing under this
-				 * whole prefix. So there is no need
-				 * to continue looking for conflicting
-				 * references. But we need to continue
-				 * looking for conflicting extras.
-				 */
-				dir = NULL;
-			} else {
-				dir = get_ref_dir(dir->entries[pos]);
-			}
-		}
-	}
-
-	/*
-	 * We are at the leaf of our refname (e.g., "refs/foo/bar").
-	 * There is no point in searching for a reference with that
-	 * name, because a refname isn't considered to conflict with
-	 * itself. But we still need to check for references whose
-	 * names are in the "refs/foo/bar/" namespace, because they
-	 * *do* conflict.
-	 */
-	strbuf_addstr(&dirname, refname + dirname.len);
-	strbuf_addch(&dirname, '/');
-
-	if (dir) {
-		pos = search_ref_dir(dir, dirname.buf, dirname.len);
-
-		if (pos >= 0) {
-			/*
-			 * We found a directory named "$refname/"
-			 * (e.g., "refs/foo/bar/"). It is a problem
-			 * iff it contains any ref that is not in
-			 * "skip".
-			 */
-			struct nonmatching_ref_data data;
-
-			data.skip = skip;
-			data.conflicting_refname = NULL;
-			dir = get_ref_dir(dir->entries[pos]);
-			sort_ref_dir(dir);
-			if (do_for_each_entry_in_dir(dir, 0, nonmatching_ref_fn, &data)) {
-				strbuf_addf(err, "'%s' exists; cannot create '%s'",
-					    data.conflicting_refname, refname);
-				goto cleanup;
-			}
-		}
-	}
-
-	if (extras) {
-		/*
-		 * Check for entries in extras that start with
-		 * "$refname/". We do that by looking for the place
-		 * where "$refname/" would be inserted in extras. If
-		 * there is an entry at that position that starts with
-		 * "$refname/" and is not in skip, then we have a
-		 * conflict.
-		 */
-		for (pos = string_list_find_insert_index(extras, dirname.buf, 0);
-		     pos < extras->nr; pos++) {
-			const char *extra_refname = extras->items[pos].string;
-
-			if (!starts_with(extra_refname, dirname.buf))
-				break;
-
-			if (!skip || !string_list_has_string(skip, extra_refname)) {
-				strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
-					    refname, extra_refname);
-				goto cleanup;
-			}
-		}
-	}
-
-	/* No conflicts were found */
-	ret = 0;
-
-cleanup:
-	strbuf_release(&dirname);
-	return ret;
-}
-
-struct packed_ref_cache {
-	struct ref_entry *root;
-
-	/*
-	 * Count of references to the data structure in this instance,
-	 * including the pointer from ref_cache::packed if any.  The
-	 * data will not be freed as long as the reference count is
-	 * nonzero.
-	 */
-	unsigned int referrers;
-
-	/*
-	 * Iff the packed-refs file associated with this instance is
-	 * currently locked for writing, this points at the associated
-	 * lock (which is owned by somebody else).  The referrer count
-	 * is also incremented when the file is locked and decremented
-	 * when it is unlocked.
-	 */
-	struct lock_file *lock;
-
-	/* The metadata from when this packed-refs cache was read */
-	struct stat_validity validity;
-};
-
-/*
- * Future: need to be in "struct repository"
- * when doing a full libification.
- */
-static struct ref_cache {
-	struct ref_cache *next;
-	struct ref_entry *loose;
-	struct packed_ref_cache *packed;
-	/*
-	 * The submodule name, or "" for the main repo.  We allocate
-	 * length 1 rather than FLEX_ARRAY so that the main ref_cache
-	 * is initialized correctly.
-	 */
-	char name[1];
-} ref_cache, *submodule_ref_caches;
-
-/* Lock used for the main packed-refs file: */
-static struct lock_file packlock;
-
-/*
- * Increment the reference count of *packed_refs.
- */
-static void acquire_packed_ref_cache(struct packed_ref_cache *packed_refs)
-{
-	packed_refs->referrers++;
-}
-
-/*
- * Decrease the reference count of *packed_refs.  If it goes to zero,
- * free *packed_refs and return true; otherwise return false.
- */
-static int release_packed_ref_cache(struct packed_ref_cache *packed_refs)
-{
-	if (!--packed_refs->referrers) {
-		free_ref_entry(packed_refs->root);
-		stat_validity_clear(&packed_refs->validity);
-		free(packed_refs);
-		return 1;
-	} else {
-		return 0;
-	}
-}
-
-static void clear_packed_ref_cache(struct ref_cache *refs)
-{
-	if (refs->packed) {
-		struct packed_ref_cache *packed_refs = refs->packed;
-
-		if (packed_refs->lock)
-			die("internal error: packed-ref cache cleared while locked");
-		refs->packed = NULL;
-		release_packed_ref_cache(packed_refs);
-	}
-}
-
-static void clear_loose_ref_cache(struct ref_cache *refs)
-{
-	if (refs->loose) {
-		free_ref_entry(refs->loose);
-		refs->loose = NULL;
-	}
-}
-
-static struct ref_cache *create_ref_cache(const char *submodule)
-{
-	int len;
-	struct ref_cache *refs;
-	if (!submodule)
-		submodule = "";
-	len = strlen(submodule) + 1;
-	refs = xcalloc(1, sizeof(struct ref_cache) + len);
-	memcpy(refs->name, submodule, len);
-	return refs;
-}
-
-/*
- * Return a pointer to a ref_cache for the specified submodule. For
- * the main repository, use submodule==NULL. The returned structure
- * will be allocated and initialized but not necessarily populated; it
- * should not be freed.
- */
-static struct ref_cache *get_ref_cache(const char *submodule)
-{
-	struct ref_cache *refs;
-
-	if (!submodule || !*submodule)
-		return &ref_cache;
-
-	for (refs = submodule_ref_caches; refs; refs = refs->next)
-		if (!strcmp(submodule, refs->name))
-			return refs;
-
-	refs = create_ref_cache(submodule);
-	refs->next = submodule_ref_caches;
-	submodule_ref_caches = refs;
-	return refs;
-}
-
-/* The length of a peeled reference line in packed-refs, including EOL: */
-#define PEELED_LINE_LENGTH 42
-
-/*
- * The packed-refs header line that we write out.  Perhaps other
- * traits will be added later.  The trailing space is required.
- */
-static const char PACKED_REFS_HEADER[] =
-	"# pack-refs with: peeled fully-peeled \n";
-
-/*
- * Parse one line from a packed-refs file.  Write the SHA1 to sha1.
- * Return a pointer to the refname within the line (null-terminated),
- * or NULL if there was a problem.
- */
-static const char *parse_ref_line(struct strbuf *line, unsigned char *sha1)
-{
-	const char *ref;
-
-	/*
-	 * 42: the answer to everything.
-	 *
-	 * In this case, it happens to be the answer to
-	 *  40 (length of sha1 hex representation)
-	 *  +1 (space in between hex and name)
-	 *  +1 (newline at the end of the line)
-	 */
-	if (line->len <= 42)
-		return NULL;
-
-	if (get_sha1_hex(line->buf, sha1) < 0)
-		return NULL;
-	if (!isspace(line->buf[40]))
-		return NULL;
-
-	ref = line->buf + 41;
-	if (isspace(*ref))
-		return NULL;
-
-	if (line->buf[line->len - 1] != '\n')
-		return NULL;
-	line->buf[--line->len] = 0;
-
-	return ref;
-}
-
-/*
- * Read f, which is a packed-refs file, into dir.
- *
- * A comment line of the form "# pack-refs with: " may contain zero or
- * more traits. We interpret the traits as follows:
- *
- *   No traits:
- *
- *      Probably no references are peeled. But if the file contains a
- *      peeled value for a reference, we will use it.
- *
- *   peeled:
- *
- *      References under "refs/tags/", if they *can* be peeled, *are*
- *      peeled in this file. References outside of "refs/tags/" are
- *      probably not peeled even if they could have been, but if we find
- *      a peeled value for such a reference we will use it.
- *
- *   fully-peeled:
- *
- *      All references in the file that can be peeled are peeled.
- *      Inversely (and this is more important), any references in the
- *      file for which no peeled value is recorded is not peelable. This
- *      trait should typically be written alongside "peeled" for
- *      compatibility with older clients, but we do not require it
- *      (i.e., "peeled" is a no-op if "fully-peeled" is set).
- */
-static void read_packed_refs(FILE *f, struct ref_dir *dir)
-{
-	struct ref_entry *last = NULL;
-	struct strbuf line = STRBUF_INIT;
-	enum { PEELED_NONE, PEELED_TAGS, PEELED_FULLY } peeled = PEELED_NONE;
-
-	while (strbuf_getwholeline(&line, f, '\n') != EOF) {
-		unsigned char sha1[20];
-		const char *refname;
-		const char *traits;
-
-		if (skip_prefix(line.buf, "# pack-refs with:", &traits)) {
-			if (strstr(traits, " fully-peeled "))
-				peeled = PEELED_FULLY;
-			else if (strstr(traits, " peeled "))
-				peeled = PEELED_TAGS;
-			/* perhaps other traits later as well */
-			continue;
-		}
-
-		refname = parse_ref_line(&line, sha1);
-		if (refname) {
-			int flag = REF_ISPACKED;
-
-			if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
-				if (!refname_is_safe(refname))
-					die("packed refname is dangerous: %s", refname);
-				hashclr(sha1);
-				flag |= REF_BAD_NAME | REF_ISBROKEN;
-			}
-			last = create_ref_entry(refname, sha1, flag, 0);
-			if (peeled == PEELED_FULLY ||
-			    (peeled == PEELED_TAGS && starts_with(refname, "refs/tags/")))
-				last->flag |= REF_KNOWS_PEELED;
-			add_ref(dir, last);
-			continue;
-		}
-		if (last &&
-		    line.buf[0] == '^' &&
-		    line.len == PEELED_LINE_LENGTH &&
-		    line.buf[PEELED_LINE_LENGTH - 1] == '\n' &&
-		    !get_sha1_hex(line.buf + 1, sha1)) {
-			hashcpy(last->u.value.peeled.hash, sha1);
-			/*
-			 * Regardless of what the file header said,
-			 * we definitely know the value of *this*
-			 * reference:
-			 */
-			last->flag |= REF_KNOWS_PEELED;
-		}
-	}
-
-	strbuf_release(&line);
-}
-
-/*
- * Get the packed_ref_cache for the specified ref_cache, creating it
- * if necessary.
- */
-static struct packed_ref_cache *get_packed_ref_cache(struct ref_cache *refs)
-{
-	char *packed_refs_file;
-
-	if (*refs->name)
-		packed_refs_file = git_pathdup_submodule(refs->name, "packed-refs");
-	else
-		packed_refs_file = git_pathdup("packed-refs");
-
-	if (refs->packed &&
-	    !stat_validity_check(&refs->packed->validity, packed_refs_file))
-		clear_packed_ref_cache(refs);
-
-	if (!refs->packed) {
-		FILE *f;
-
-		refs->packed = xcalloc(1, sizeof(*refs->packed));
-		acquire_packed_ref_cache(refs->packed);
-		refs->packed->root = create_dir_entry(refs, "", 0, 0);
-		f = fopen(packed_refs_file, "r");
-		if (f) {
-			stat_validity_update(&refs->packed->validity, fileno(f));
-			read_packed_refs(f, get_ref_dir(refs->packed->root));
-			fclose(f);
-		}
-	}
-	free(packed_refs_file);
-	return refs->packed;
-}
-
-static struct ref_dir *get_packed_ref_dir(struct packed_ref_cache *packed_ref_cache)
-{
-	return get_ref_dir(packed_ref_cache->root);
-}
-
-static struct ref_dir *get_packed_refs(struct ref_cache *refs)
-{
-	return get_packed_ref_dir(get_packed_ref_cache(refs));
-}
-
-/*
- * Add a reference to the in-memory packed reference cache.  This may
- * only be called while the packed-refs file is locked (see
- * lock_packed_refs()).  To actually write the packed-refs file, call
- * commit_packed_refs().
- */
-static void add_packed_ref(const char *refname, const unsigned char *sha1)
-{
-	struct packed_ref_cache *packed_ref_cache =
-		get_packed_ref_cache(&ref_cache);
-
-	if (!packed_ref_cache->lock)
-		die("internal error: packed refs not locked");
-	add_ref(get_packed_ref_dir(packed_ref_cache),
-		create_ref_entry(refname, sha1, REF_ISPACKED, 1));
-}
-
-/*
- * Read the loose references from the namespace dirname into dir
- * (without recursing).  dirname must end with '/'.  dir must be the
- * directory entry corresponding to dirname.
- */
-static void read_loose_refs(const char *dirname, struct ref_dir *dir)
-{
-	struct ref_cache *refs = dir->ref_cache;
-	DIR *d;
-	struct dirent *de;
-	int dirnamelen = strlen(dirname);
-	struct strbuf refname;
-	struct strbuf path = STRBUF_INIT;
-	size_t path_baselen;
-
-	if (*refs->name)
-		strbuf_git_path_submodule(&path, refs->name, "%s", dirname);
-	else
-		strbuf_git_path(&path, "%s", dirname);
-	path_baselen = path.len;
-
-	d = opendir(path.buf);
-	if (!d) {
-		strbuf_release(&path);
-		return;
-	}
-
-	strbuf_init(&refname, dirnamelen + 257);
-	strbuf_add(&refname, dirname, dirnamelen);
-
-	while ((de = readdir(d)) != NULL) {
-		unsigned char sha1[20];
-		struct stat st;
-		int flag;
-
-		if (de->d_name[0] == '.')
-			continue;
-		if (ends_with(de->d_name, ".lock"))
-			continue;
-		strbuf_addstr(&refname, de->d_name);
-		strbuf_addstr(&path, de->d_name);
-		if (stat(path.buf, &st) < 0) {
-			; /* silently ignore */
-		} else if (S_ISDIR(st.st_mode)) {
-			strbuf_addch(&refname, '/');
-			add_entry_to_dir(dir,
-					 create_dir_entry(refs, refname.buf,
-							  refname.len, 1));
-		} else {
-			int read_ok;
-
-			if (*refs->name) {
-				hashclr(sha1);
-				flag = 0;
-				read_ok = !resolve_gitlink_ref(refs->name,
-							       refname.buf, sha1);
-			} else {
-				read_ok = !read_ref_full(refname.buf,
-							 RESOLVE_REF_READING,
-							 sha1, &flag);
-			}
-
-			if (!read_ok) {
-				hashclr(sha1);
-				flag |= REF_ISBROKEN;
-			} else if (is_null_sha1(sha1)) {
-				/*
-				 * It is so astronomically unlikely
-				 * that NULL_SHA1 is the SHA-1 of an
-				 * actual object that we consider its
-				 * appearance in a loose reference
-				 * file to be repo corruption
-				 * (probably due to a software bug).
-				 */
-				flag |= REF_ISBROKEN;
-			}
-
-			if (check_refname_format(refname.buf,
-						 REFNAME_ALLOW_ONELEVEL)) {
-				if (!refname_is_safe(refname.buf))
-					die("loose refname is dangerous: %s", refname.buf);
-				hashclr(sha1);
-				flag |= REF_BAD_NAME | REF_ISBROKEN;
-			}
-			add_entry_to_dir(dir,
-					 create_ref_entry(refname.buf, sha1, flag, 0));
-		}
-		strbuf_setlen(&refname, dirnamelen);
-		strbuf_setlen(&path, path_baselen);
-	}
-	strbuf_release(&refname);
-	strbuf_release(&path);
-	closedir(d);
-}
-
-static struct ref_dir *get_loose_refs(struct ref_cache *refs)
-{
-	if (!refs->loose) {
-		/*
-		 * Mark the top-level directory complete because we
-		 * are about to read the only subdirectory that can
-		 * hold references:
-		 */
-		refs->loose = create_dir_entry(refs, "", 0, 0);
-		/*
-		 * Create an incomplete entry for "refs/":
-		 */
-		add_entry_to_dir(get_ref_dir(refs->loose),
-				 create_dir_entry(refs, "refs/", 5, 1));
-	}
-	return get_ref_dir(refs->loose);
-}
-
-/* We allow "recursive" symbolic refs. Only within reason, though */
-#define MAXDEPTH 5
-#define MAXREFLEN (1024)
-
-/*
- * Called by resolve_gitlink_ref_recursive() after it failed to read
- * from the loose refs in ref_cache refs. Find <refname> in the
- * packed-refs file for the submodule.
- */
-static int resolve_gitlink_packed_ref(struct ref_cache *refs,
-				      const char *refname, unsigned char *sha1)
-{
-	struct ref_entry *ref;
-	struct ref_dir *dir = get_packed_refs(refs);
-
-	ref = find_ref(dir, refname);
-	if (ref == NULL)
-		return -1;
-
-	hashcpy(sha1, ref->u.value.oid.hash);
-	return 0;
-}
-
-static int resolve_gitlink_ref_recursive(struct ref_cache *refs,
-					 const char *refname, unsigned char *sha1,
-					 int recursion)
-{
-	int fd, len;
-	char buffer[128], *p;
-	char *path;
-
-	if (recursion > MAXDEPTH || strlen(refname) > MAXREFLEN)
-		return -1;
-	path = *refs->name
-		? git_pathdup_submodule(refs->name, "%s", refname)
-		: git_pathdup("%s", refname);
-	fd = open(path, O_RDONLY);
-	free(path);
-	if (fd < 0)
-		return resolve_gitlink_packed_ref(refs, refname, sha1);
-
-	len = read(fd, buffer, sizeof(buffer)-1);
-	close(fd);
-	if (len < 0)
-		return -1;
-	while (len && isspace(buffer[len-1]))
-		len--;
-	buffer[len] = 0;
-
-	/* Was it a detached head or an old-fashioned symlink? */
-	if (!get_sha1_hex(buffer, sha1))
-		return 0;
-
-	/* Symref? */
-	if (strncmp(buffer, "ref:", 4))
-		return -1;
-	p = buffer + 4;
-	while (isspace(*p))
-		p++;
-
-	return resolve_gitlink_ref_recursive(refs, p, sha1, recursion+1);
-}
-
-int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1)
-{
-	int len = strlen(path), retval;
-	char *submodule;
-	struct ref_cache *refs;
-
-	while (len && path[len-1] == '/')
-		len--;
-	if (!len)
-		return -1;
-	submodule = xstrndup(path, len);
-	refs = get_ref_cache(submodule);
-	free(submodule);
-
-	retval = resolve_gitlink_ref_recursive(refs, refname, sha1, 0);
-	return retval;
-}
-
-/*
- * Return the ref_entry for the given refname from the packed
- * references.  If it does not exist, return NULL.
- */
-static struct ref_entry *get_packed_ref(const char *refname)
-{
-	return find_ref(get_packed_refs(&ref_cache), refname);
-}
-
-/*
- * A loose ref file doesn't exist; check for a packed ref.  The
- * options are forwarded from resolve_safe_unsafe().
- */
-static int resolve_missing_loose_ref(const char *refname,
-				     int resolve_flags,
-				     unsigned char *sha1,
-				     int *flags)
-{
-	struct ref_entry *entry;
-
-	/*
-	 * The loose reference file does not exist; check for a packed
-	 * reference.
-	 */
-	entry = get_packed_ref(refname);
-	if (entry) {
-		hashcpy(sha1, entry->u.value.oid.hash);
-		if (flags)
-			*flags |= REF_ISPACKED;
-		return 0;
-	}
-	/* The reference is not a packed reference, either. */
-	if (resolve_flags & RESOLVE_REF_READING) {
-		errno = ENOENT;
-		return -1;
-	} else {
-		hashclr(sha1);
-		return 0;
-	}
-}
-
-/* This function needs to return a meaningful errno on failure */
-static const char *resolve_ref_unsafe_1(const char *refname,
-					int resolve_flags,
-					unsigned char *sha1,
-					int *flags,
-					struct strbuf *sb_path)
-{
-	int depth = MAXDEPTH;
-	ssize_t len;
-	char buffer[256];
-	static char refname_buffer[256];
-	int bad_name = 0;
-
-	if (flags)
-		*flags = 0;
-
-	if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
-		if (flags)
-			*flags |= REF_BAD_NAME;
-
-		if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
-		    !refname_is_safe(refname)) {
-			errno = EINVAL;
-			return NULL;
-		}
-		/*
-		 * dwim_ref() uses REF_ISBROKEN to distinguish between
-		 * missing refs and refs that were present but invalid,
-		 * to complain about the latter to stderr.
-		 *
-		 * We don't know whether the ref exists, so don't set
-		 * REF_ISBROKEN yet.
-		 */
-		bad_name = 1;
-	}
-	for (;;) {
-		const char *path;
-		struct stat st;
-		char *buf;
-		int fd;
-
-		if (--depth < 0) {
-			errno = ELOOP;
-			return NULL;
-		}
-
-		strbuf_reset(sb_path);
-		strbuf_git_path(sb_path, "%s", refname);
-		path = sb_path->buf;
-
-		/*
-		 * We might have to loop back here to avoid a race
-		 * condition: first we lstat() the file, then we try
-		 * to read it as a link or as a file.  But if somebody
-		 * changes the type of the file (file <-> directory
-		 * <-> symlink) between the lstat() and reading, then
-		 * we don't want to report that as an error but rather
-		 * try again starting with the lstat().
-		 */
-	stat_ref:
-		if (lstat(path, &st) < 0) {
-			if (errno != ENOENT)
-				return NULL;
-			if (resolve_missing_loose_ref(refname, resolve_flags,
-						      sha1, flags))
-				return NULL;
-			if (bad_name) {
-				hashclr(sha1);
-				if (flags)
-					*flags |= REF_ISBROKEN;
-			}
-			return refname;
-		}
-
-		/* Follow "normalized" - ie "refs/.." symlinks by hand */
-		if (S_ISLNK(st.st_mode)) {
-			len = readlink(path, buffer, sizeof(buffer)-1);
-			if (len < 0) {
-				if (errno == ENOENT || errno == EINVAL)
-					/* inconsistent with lstat; retry */
-					goto stat_ref;
-				else
-					return NULL;
-			}
-			buffer[len] = 0;
-			if (starts_with(buffer, "refs/") &&
-					!check_refname_format(buffer, 0)) {
-				strcpy(refname_buffer, buffer);
-				refname = refname_buffer;
-				if (flags)
-					*flags |= REF_ISSYMREF;
-				if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
-					hashclr(sha1);
-					return refname;
-				}
-				continue;
-			}
-		}
-
-		/* Is it a directory? */
-		if (S_ISDIR(st.st_mode)) {
-			errno = EISDIR;
-			return NULL;
-		}
-
-		/*
-		 * Anything else, just open it and try to use it as
-		 * a ref
-		 */
-		fd = open(path, O_RDONLY);
-		if (fd < 0) {
-			if (errno == ENOENT)
-				/* inconsistent with lstat; retry */
-				goto stat_ref;
-			else
-				return NULL;
-		}
-		len = read_in_full(fd, buffer, sizeof(buffer)-1);
-		if (len < 0) {
-			int save_errno = errno;
-			close(fd);
-			errno = save_errno;
-			return NULL;
-		}
-		close(fd);
-		while (len && isspace(buffer[len-1]))
-			len--;
-		buffer[len] = '\0';
-
-		/*
-		 * Is it a symbolic ref?
-		 */
-		if (!starts_with(buffer, "ref:")) {
-			/*
-			 * Please note that FETCH_HEAD has a second
-			 * line containing other data.
-			 */
-			if (get_sha1_hex(buffer, sha1) ||
-			    (buffer[40] != '\0' && !isspace(buffer[40]))) {
-				if (flags)
-					*flags |= REF_ISBROKEN;
-				errno = EINVAL;
-				return NULL;
-			}
-			if (bad_name) {
-				hashclr(sha1);
-				if (flags)
-					*flags |= REF_ISBROKEN;
-			}
-			return refname;
-		}
-		if (flags)
-			*flags |= REF_ISSYMREF;
-		buf = buffer + 4;
-		while (isspace(*buf))
-			buf++;
-		refname = strcpy(refname_buffer, buf);
-		if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
-			hashclr(sha1);
-			return refname;
-		}
-		if (check_refname_format(buf, REFNAME_ALLOW_ONELEVEL)) {
-			if (flags)
-				*flags |= REF_ISBROKEN;
-
-			if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
-			    !refname_is_safe(buf)) {
-				errno = EINVAL;
-				return NULL;
-			}
-			bad_name = 1;
-		}
-	}
-}
-
-const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
-			       unsigned char *sha1, int *flags)
-{
-	struct strbuf sb_path = STRBUF_INIT;
-	const char *ret = resolve_ref_unsafe_1(refname, resolve_flags,
-					       sha1, flags, &sb_path);
-	strbuf_release(&sb_path);
-	return ret;
-}
-
 char *resolve_refdup(const char *refname, int resolve_flags,
 		     unsigned char *sha1, int *flags)
 {
@@ -1805,39 +184,7 @@
 	return filter->fn(refname, oid, flags, filter->cb_data);
 }
 
-enum peel_status {
-	/* object was peeled successfully: */
-	PEEL_PEELED = 0,
-
-	/*
-	 * object cannot be peeled because the named object (or an
-	 * object referred to by a tag in the peel chain), does not
-	 * exist.
-	 */
-	PEEL_INVALID = -1,
-
-	/* object cannot be peeled because it is not a tag: */
-	PEEL_NON_TAG = -2,
-
-	/* ref_entry contains no peeled value because it is a symref: */
-	PEEL_IS_SYMREF = -3,
-
-	/*
-	 * ref_entry cannot be peeled because it is broken (i.e., the
-	 * symbolic reference cannot even be resolved to an object
-	 * name):
-	 */
-	PEEL_BROKEN = -4
-};
-
-/*
- * Peel the named object; i.e., if the object is a tag, resolve the
- * tag recursively until a non-tag is found.  If successful, store the
- * result to sha1 and return PEEL_PEELED.  If the object is not a tag
- * or is not valid, return PEEL_NON_TAG or PEEL_INVALID, respectively,
- * and leave sha1 unchanged.
- */
-static enum peel_status peel_object(const unsigned char *name, unsigned char *sha1)
+enum peel_status peel_object(const unsigned char *name, unsigned char *sha1)
 {
 	struct object *o = lookup_unknown_object(name);
 
@@ -1854,82 +201,10 @@
 	if (!o)
 		return PEEL_INVALID;
 
-	hashcpy(sha1, o->sha1);
+	hashcpy(sha1, o->oid.hash);
 	return PEEL_PEELED;
 }
 
-/*
- * Peel the entry (if possible) and return its new peel_status.  If
- * repeel is true, re-peel the entry even if there is an old peeled
- * value that is already stored in it.
- *
- * It is OK to call this function with a packed reference entry that
- * might be stale and might even refer to an object that has since
- * been garbage-collected.  In such a case, if the entry has
- * REF_KNOWS_PEELED then leave the status unchanged and return
- * PEEL_PEELED or PEEL_NON_TAG; otherwise, return PEEL_INVALID.
- */
-static enum peel_status peel_entry(struct ref_entry *entry, int repeel)
-{
-	enum peel_status status;
-
-	if (entry->flag & REF_KNOWS_PEELED) {
-		if (repeel) {
-			entry->flag &= ~REF_KNOWS_PEELED;
-			oidclr(&entry->u.value.peeled);
-		} else {
-			return is_null_oid(&entry->u.value.peeled) ?
-				PEEL_NON_TAG : PEEL_PEELED;
-		}
-	}
-	if (entry->flag & REF_ISBROKEN)
-		return PEEL_BROKEN;
-	if (entry->flag & REF_ISSYMREF)
-		return PEEL_IS_SYMREF;
-
-	status = peel_object(entry->u.value.oid.hash, entry->u.value.peeled.hash);
-	if (status == PEEL_PEELED || status == PEEL_NON_TAG)
-		entry->flag |= REF_KNOWS_PEELED;
-	return status;
-}
-
-int peel_ref(const char *refname, unsigned char *sha1)
-{
-	int flag;
-	unsigned char base[20];
-
-	if (current_ref && (current_ref->name == refname
-			    || !strcmp(current_ref->name, refname))) {
-		if (peel_entry(current_ref, 0))
-			return -1;
-		hashcpy(sha1, current_ref->u.value.peeled.hash);
-		return 0;
-	}
-
-	if (read_ref_full(refname, RESOLVE_REF_READING, base, &flag))
-		return -1;
-
-	/*
-	 * If the reference is packed, read its ref_entry from the
-	 * cache in the hope that we already know its peeled value.
-	 * We only try this optimization on packed references because
-	 * (a) forcing the filling of the loose reference cache could
-	 * be expensive and (b) loose references anyway usually do not
-	 * have REF_KNOWS_PEELED.
-	 */
-	if (flag & REF_ISPACKED) {
-		struct ref_entry *r = get_packed_ref(refname);
-		if (r) {
-			if (peel_entry(r, 0))
-				return -1;
-			hashcpy(sha1, r->u.value.peeled.hash);
-			return 0;
-		}
-	}
-
-	return peel_object(base, sha1);
-}
-
 struct warn_if_dangling_data {
 	FILE *fp;
 	const char *refname;
@@ -1982,138 +257,6 @@
 	for_each_rawref(warn_if_dangling_symref, &data);
 }
 
-/*
- * Call fn for each reference in the specified ref_cache, omitting
- * references not in the containing_dir of base.  fn is called for all
- * references, including broken ones.  If fn ever returns a non-zero
- * value, stop the iteration and return that value; otherwise, return
- * 0.
- */
-static int do_for_each_entry(struct ref_cache *refs, const char *base,
-			     each_ref_entry_fn fn, void *cb_data)
-{
-	struct packed_ref_cache *packed_ref_cache;
-	struct ref_dir *loose_dir;
-	struct ref_dir *packed_dir;
-	int retval = 0;
-
-	/*
-	 * We must make sure that all loose refs are read before accessing the
-	 * packed-refs file; this avoids a race condition in which loose refs
-	 * are migrated to the packed-refs file by a simultaneous process, but
-	 * our in-memory view is from before the migration. get_packed_ref_cache()
-	 * takes care of making sure our view is up to date with what is on
-	 * disk.
-	 */
-	loose_dir = get_loose_refs(refs);
-	if (base && *base) {
-		loose_dir = find_containing_dir(loose_dir, base, 0);
-	}
-	if (loose_dir)
-		prime_ref_dir(loose_dir);
-
-	packed_ref_cache = get_packed_ref_cache(refs);
-	acquire_packed_ref_cache(packed_ref_cache);
-	packed_dir = get_packed_ref_dir(packed_ref_cache);
-	if (base && *base) {
-		packed_dir = find_containing_dir(packed_dir, base, 0);
-	}
-
-	if (packed_dir && loose_dir) {
-		sort_ref_dir(packed_dir);
-		sort_ref_dir(loose_dir);
-		retval = do_for_each_entry_in_dirs(
-				packed_dir, loose_dir, fn, cb_data);
-	} else if (packed_dir) {
-		sort_ref_dir(packed_dir);
-		retval = do_for_each_entry_in_dir(
-				packed_dir, 0, fn, cb_data);
-	} else if (loose_dir) {
-		sort_ref_dir(loose_dir);
-		retval = do_for_each_entry_in_dir(
-				loose_dir, 0, fn, cb_data);
-	}
-
-	release_packed_ref_cache(packed_ref_cache);
-	return retval;
-}
-
-/*
- * Call fn for each reference in the specified ref_cache for which the
- * refname begins with base.  If trim is non-zero, then trim that many
- * characters off the beginning of each refname before passing the
- * refname to fn.  flags can be DO_FOR_EACH_INCLUDE_BROKEN to include
- * broken references in the iteration.  If fn ever returns a non-zero
- * value, stop the iteration and return that value; otherwise, return
- * 0.
- */
-static int do_for_each_ref(struct ref_cache *refs, const char *base,
-			   each_ref_fn fn, int trim, int flags, void *cb_data)
-{
-	struct ref_entry_cb data;
-	data.base = base;
-	data.trim = trim;
-	data.flags = flags;
-	data.fn = fn;
-	data.cb_data = cb_data;
-
-	if (ref_paranoia < 0)
-		ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0);
-	if (ref_paranoia)
-		data.flags |= DO_FOR_EACH_INCLUDE_BROKEN;
-
-	return do_for_each_entry(refs, base, do_one_ref, &data);
-}
-
-static int do_head_ref(const char *submodule, each_ref_fn fn, void *cb_data)
-{
-	struct object_id oid;
-	int flag;
-
-	if (submodule) {
-		if (resolve_gitlink_ref(submodule, "HEAD", oid.hash) == 0)
-			return fn("HEAD", &oid, 0, cb_data);
-
-		return 0;
-	}
-
-	if (!read_ref_full("HEAD", RESOLVE_REF_READING, oid.hash, &flag))
-		return fn("HEAD", &oid, flag, cb_data);
-
-	return 0;
-}
-
-int head_ref(each_ref_fn fn, void *cb_data)
-{
-	return do_head_ref(NULL, fn, cb_data);
-}
-
-int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
-{
-	return do_head_ref(submodule, fn, cb_data);
-}
-
-int for_each_ref(each_ref_fn fn, void *cb_data)
-{
-	return do_for_each_ref(&ref_cache, "", fn, 0, 0, cb_data);
-}
-
-int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
-{
-	return do_for_each_ref(get_ref_cache(submodule), "", fn, 0, 0, cb_data);
-}
-
-int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
-{
-	return do_for_each_ref(&ref_cache, prefix, fn, strlen(prefix), 0, cb_data);
-}
-
-int for_each_ref_in_submodule(const char *submodule, const char *prefix,
-		each_ref_fn fn, void *cb_data)
-{
-	return do_for_each_ref(get_ref_cache(submodule), prefix, fn, strlen(prefix), 0, cb_data);
-}
-
 int for_each_tag_ref(each_ref_fn fn, void *cb_data)
 {
 	return for_each_ref_in("refs/tags/", fn, cb_data);
@@ -2144,12 +287,6 @@
 	return for_each_ref_in_submodule(submodule, "refs/remotes/", fn, cb_data);
 }
 
-int for_each_replace_ref(each_ref_fn fn, void *cb_data)
-{
-	return do_for_each_ref(&ref_cache, git_replace_ref_base, fn,
-			       strlen(git_replace_ref_base), 0, cb_data);
-}
-
 int head_ref_namespaced(each_ref_fn fn, void *cb_data)
 {
 	struct strbuf buf = STRBUF_INIT;
@@ -2165,16 +302,6 @@
 	return ret;
 }
 
-int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
-{
-	struct strbuf buf = STRBUF_INIT;
-	int ret;
-	strbuf_addf(&buf, "%srefs/", get_git_namespace());
-	ret = do_for_each_ref(&ref_cache, buf.buf, fn, 0, 0, cb_data);
-	strbuf_release(&buf);
-	return ret;
-}
-
 int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
 	const char *prefix, void *cb_data)
 {
@@ -2190,8 +317,7 @@
 
 	if (!has_glob_specials(pattern)) {
 		/* Append implied '/' '*' if not present. */
-		if (real_pattern.buf[real_pattern.len - 1] != '/')
-			strbuf_addch(&real_pattern, '/');
+		strbuf_complete(&real_pattern, '/');
 		/* No need to check for '*', there is none. */
 		strbuf_addch(&real_pattern, '*');
 	}
@@ -2210,12 +336,6 @@
 	return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
 }
 
-int for_each_rawref(each_ref_fn fn, void *cb_data)
-{
-	return do_for_each_ref(&ref_cache, "", fn, 0,
-			       DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
-}
-
 const char *prettify_refname(const char *name)
 {
 	return name + (
@@ -2249,57 +369,6 @@
 	return 0;
 }
 
-static void unlock_ref(struct ref_lock *lock)
-{
-	/* Do not free lock->lk -- atexit() still looks at them */
-	if (lock->lk)
-		rollback_lock_file(lock->lk);
-	free(lock->ref_name);
-	free(lock->orig_ref_name);
-	free(lock);
-}
-
-/*
- * Verify that the reference locked by lock has the value old_sha1.
- * Fail if the reference doesn't exist and mustexist is set. Return 0
- * on success. On error, write an error message to err, set errno, and
- * return a negative value.
- */
-static int verify_lock(struct ref_lock *lock,
-		       const unsigned char *old_sha1, int mustexist,
-		       struct strbuf *err)
-{
-	assert(err);
-
-	if (read_ref_full(lock->ref_name,
-			  mustexist ? RESOLVE_REF_READING : 0,
-			  lock->old_oid.hash, NULL)) {
-		int save_errno = errno;
-		strbuf_addf(err, "can't verify ref %s", lock->ref_name);
-		errno = save_errno;
-		return -1;
-	}
-	if (hashcmp(lock->old_oid.hash, old_sha1)) {
-		strbuf_addf(err, "ref %s is at %s but expected %s",
-			    lock->ref_name,
-			    sha1_to_hex(lock->old_oid.hash),
-			    sha1_to_hex(old_sha1));
-		errno = EBUSY;
-		return -1;
-	}
-	return 0;
-}
-
-static int remove_empty_directories(struct strbuf *path)
-{
-	/*
-	 * we want to create a file but there is a directory there;
-	 * if that is an empty directory (or a directory that contains
-	 * only empty directories), remove them.
-	 */
-	return remove_dir_recursively(path, REMOVE_DIR_EMPTY_ONLY);
-}
-
 /*
  * *string and *len will only be substituted, and *string returned (for
  * later free()ing) if the string passed in is a magic short-hand form
@@ -2386,477 +455,10 @@
 	return logs_found;
 }
 
-/*
- * Locks a ref returning the lock on success and NULL on failure.
- * On failure errno is set to something meaningful.
- */
-static struct ref_lock *lock_ref_sha1_basic(const char *refname,
-					    const unsigned char *old_sha1,
-					    const struct string_list *extras,
-					    const struct string_list *skip,
-					    unsigned int flags, int *type_p,
-					    struct strbuf *err)
-{
-	struct strbuf ref_file = STRBUF_INIT;
-	struct strbuf orig_ref_file = STRBUF_INIT;
-	const char *orig_refname = refname;
-	struct ref_lock *lock;
-	int last_errno = 0;
-	int type, lflags;
-	int mustexist = (old_sha1 && !is_null_sha1(old_sha1));
-	int resolve_flags = 0;
-	int attempts_remaining = 3;
-
-	assert(err);
-
-	lock = xcalloc(1, sizeof(struct ref_lock));
-
-	if (mustexist)
-		resolve_flags |= RESOLVE_REF_READING;
-	if (flags & REF_DELETING) {
-		resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME;
-		if (flags & REF_NODEREF)
-			resolve_flags |= RESOLVE_REF_NO_RECURSE;
-	}
-
-	refname = resolve_ref_unsafe(refname, resolve_flags,
-				     lock->old_oid.hash, &type);
-	if (!refname && errno == EISDIR) {
-		/*
-		 * we are trying to lock foo but we used to
-		 * have foo/bar which now does not exist;
-		 * it is normal for the empty directory 'foo'
-		 * to remain.
-		 */
-		strbuf_git_path(&orig_ref_file, "%s", orig_refname);
-		if (remove_empty_directories(&orig_ref_file)) {
-			last_errno = errno;
-			if (!verify_refname_available(orig_refname, extras, skip,
-						      get_loose_refs(&ref_cache), err))
-				strbuf_addf(err, "there are still refs under '%s'",
-					    orig_refname);
-			goto error_return;
-		}
-		refname = resolve_ref_unsafe(orig_refname, resolve_flags,
-					     lock->old_oid.hash, &type);
-	}
-	if (type_p)
-	    *type_p = type;
-	if (!refname) {
-		last_errno = errno;
-		if (last_errno != ENOTDIR ||
-		    !verify_refname_available(orig_refname, extras, skip,
-					      get_loose_refs(&ref_cache), err))
-			strbuf_addf(err, "unable to resolve reference %s: %s",
-				    orig_refname, strerror(last_errno));
-
-		goto error_return;
-	}
-	/*
-	 * If the ref did not exist and we are creating it, make sure
-	 * there is no existing packed ref whose name begins with our
-	 * refname, nor a packed ref whose name is a proper prefix of
-	 * our refname.
-	 */
-	if (is_null_oid(&lock->old_oid) &&
-	    verify_refname_available(refname, extras, skip,
-				     get_packed_refs(&ref_cache), err)) {
-		last_errno = ENOTDIR;
-		goto error_return;
-	}
-
-	lock->lk = xcalloc(1, sizeof(struct lock_file));
-
-	lflags = 0;
-	if (flags & REF_NODEREF) {
-		refname = orig_refname;
-		lflags |= LOCK_NO_DEREF;
-	}
-	lock->ref_name = xstrdup(refname);
-	lock->orig_ref_name = xstrdup(orig_refname);
-	strbuf_git_path(&ref_file, "%s", refname);
-
- retry:
-	switch (safe_create_leading_directories_const(ref_file.buf)) {
-	case SCLD_OK:
-		break; /* success */
-	case SCLD_VANISHED:
-		if (--attempts_remaining > 0)
-			goto retry;
-		/* fall through */
-	default:
-		last_errno = errno;
-		strbuf_addf(err, "unable to create directory for %s",
-			    ref_file.buf);
-		goto error_return;
-	}
-
-	if (hold_lock_file_for_update(lock->lk, ref_file.buf, lflags) < 0) {
-		last_errno = errno;
-		if (errno == ENOENT && --attempts_remaining > 0)
-			/*
-			 * Maybe somebody just deleted one of the
-			 * directories leading to ref_file.  Try
-			 * again:
-			 */
-			goto retry;
-		else {
-			unable_to_lock_message(ref_file.buf, errno, err);
-			goto error_return;
-		}
-	}
-	if (old_sha1 && verify_lock(lock, old_sha1, mustexist, err)) {
-		last_errno = errno;
-		goto error_return;
-	}
-	goto out;
-
- error_return:
-	unlock_ref(lock);
-	lock = NULL;
-
- out:
-	strbuf_release(&ref_file);
-	strbuf_release(&orig_ref_file);
-	errno = last_errno;
-	return lock;
-}
-
-/*
- * Write an entry to the packed-refs file for the specified refname.
- * If peeled is non-NULL, write it as the entry's peeled value.
- */
-static void write_packed_entry(FILE *fh, char *refname, unsigned char *sha1,
-			       unsigned char *peeled)
-{
-	fprintf_or_die(fh, "%s %s\n", sha1_to_hex(sha1), refname);
-	if (peeled)
-		fprintf_or_die(fh, "^%s\n", sha1_to_hex(peeled));
-}
-
-/*
- * An each_ref_entry_fn that writes the entry to a packed-refs file.
- */
-static int write_packed_entry_fn(struct ref_entry *entry, void *cb_data)
-{
-	enum peel_status peel_status = peel_entry(entry, 0);
-
-	if (peel_status != PEEL_PEELED && peel_status != PEEL_NON_TAG)
-		error("internal error: %s is not a valid packed reference!",
-		      entry->name);
-	write_packed_entry(cb_data, entry->name, entry->u.value.oid.hash,
-			   peel_status == PEEL_PEELED ?
-			   entry->u.value.peeled.hash : NULL);
-	return 0;
-}
-
-/*
- * Lock the packed-refs file for writing. Flags is passed to
- * hold_lock_file_for_update(). Return 0 on success. On errors, set
- * errno appropriately and return a nonzero value.
- */
-static int lock_packed_refs(int flags)
-{
-	static int timeout_configured = 0;
-	static int timeout_value = 1000;
-
-	struct packed_ref_cache *packed_ref_cache;
-
-	if (!timeout_configured) {
-		git_config_get_int("core.packedrefstimeout", &timeout_value);
-		timeout_configured = 1;
-	}
-
-	if (hold_lock_file_for_update_timeout(
-			    &packlock, git_path("packed-refs"),
-			    flags, timeout_value) < 0)
-		return -1;
-	/*
-	 * Get the current packed-refs while holding the lock.  If the
-	 * packed-refs file has been modified since we last read it,
-	 * this will automatically invalidate the cache and re-read
-	 * the packed-refs file.
-	 */
-	packed_ref_cache = get_packed_ref_cache(&ref_cache);
-	packed_ref_cache->lock = &packlock;
-	/* Increment the reference count to prevent it from being freed: */
-	acquire_packed_ref_cache(packed_ref_cache);
-	return 0;
-}
-
-/*
- * Write the current version of the packed refs cache from memory to
- * disk. The packed-refs file must already be locked for writing (see
- * lock_packed_refs()). Return zero on success. On errors, set errno
- * and return a nonzero value
- */
-static int commit_packed_refs(void)
-{
-	struct packed_ref_cache *packed_ref_cache =
-		get_packed_ref_cache(&ref_cache);
-	int error = 0;
-	int save_errno = 0;
-	FILE *out;
-
-	if (!packed_ref_cache->lock)
-		die("internal error: packed-refs not locked");
-
-	out = fdopen_lock_file(packed_ref_cache->lock, "w");
-	if (!out)
-		die_errno("unable to fdopen packed-refs descriptor");
-
-	fprintf_or_die(out, "%s", PACKED_REFS_HEADER);
-	do_for_each_entry_in_dir(get_packed_ref_dir(packed_ref_cache),
-				 0, write_packed_entry_fn, out);
-
-	if (commit_lock_file(packed_ref_cache->lock)) {
-		save_errno = errno;
-		error = -1;
-	}
-	packed_ref_cache->lock = NULL;
-	release_packed_ref_cache(packed_ref_cache);
-	errno = save_errno;
-	return error;
-}
-
-/*
- * Rollback the lockfile for the packed-refs file, and discard the
- * in-memory packed reference cache.  (The packed-refs file will be
- * read anew if it is needed again after this function is called.)
- */
-static void rollback_packed_refs(void)
-{
-	struct packed_ref_cache *packed_ref_cache =
-		get_packed_ref_cache(&ref_cache);
-
-	if (!packed_ref_cache->lock)
-		die("internal error: packed-refs not locked");
-	rollback_lock_file(packed_ref_cache->lock);
-	packed_ref_cache->lock = NULL;
-	release_packed_ref_cache(packed_ref_cache);
-	clear_packed_ref_cache(&ref_cache);
-}
-
-struct ref_to_prune {
-	struct ref_to_prune *next;
-	unsigned char sha1[20];
-	char name[FLEX_ARRAY];
-};
-
-struct pack_refs_cb_data {
-	unsigned int flags;
-	struct ref_dir *packed_refs;
-	struct ref_to_prune *ref_to_prune;
-};
-
-/*
- * An each_ref_entry_fn that is run over loose references only.  If
- * the loose reference can be packed, add an entry in the packed ref
- * cache.  If the reference should be pruned, also add it to
- * ref_to_prune in the pack_refs_cb_data.
- */
-static int pack_if_possible_fn(struct ref_entry *entry, void *cb_data)
-{
-	struct pack_refs_cb_data *cb = cb_data;
-	enum peel_status peel_status;
-	struct ref_entry *packed_entry;
-	int is_tag_ref = starts_with(entry->name, "refs/tags/");
-
-	/* ALWAYS pack tags */
-	if (!(cb->flags & PACK_REFS_ALL) && !is_tag_ref)
-		return 0;
-
-	/* Do not pack symbolic or broken refs: */
-	if ((entry->flag & REF_ISSYMREF) || !ref_resolves_to_object(entry))
-		return 0;
-
-	/* Add a packed ref cache entry equivalent to the loose entry. */
-	peel_status = peel_entry(entry, 1);
-	if (peel_status != PEEL_PEELED && peel_status != PEEL_NON_TAG)
-		die("internal error peeling reference %s (%s)",
-		    entry->name, oid_to_hex(&entry->u.value.oid));
-	packed_entry = find_ref(cb->packed_refs, entry->name);
-	if (packed_entry) {
-		/* Overwrite existing packed entry with info from loose entry */
-		packed_entry->flag = REF_ISPACKED | REF_KNOWS_PEELED;
-		oidcpy(&packed_entry->u.value.oid, &entry->u.value.oid);
-	} else {
-		packed_entry = create_ref_entry(entry->name, entry->u.value.oid.hash,
-						REF_ISPACKED | REF_KNOWS_PEELED, 0);
-		add_ref(cb->packed_refs, packed_entry);
-	}
-	oidcpy(&packed_entry->u.value.peeled, &entry->u.value.peeled);
-
-	/* Schedule the loose reference for pruning if requested. */
-	if ((cb->flags & PACK_REFS_PRUNE)) {
-		int namelen = strlen(entry->name) + 1;
-		struct ref_to_prune *n = xcalloc(1, sizeof(*n) + namelen);
-		hashcpy(n->sha1, entry->u.value.oid.hash);
-		strcpy(n->name, entry->name);
-		n->next = cb->ref_to_prune;
-		cb->ref_to_prune = n;
-	}
-	return 0;
-}
-
-/*
- * Remove empty parents, but spare refs/ and immediate subdirs.
- * Note: munges *name.
- */
-static void try_remove_empty_parents(char *name)
-{
-	char *p, *q;
-	int i;
-	p = name;
-	for (i = 0; i < 2; i++) { /* refs/{heads,tags,...}/ */
-		while (*p && *p != '/')
-			p++;
-		/* tolerate duplicate slashes; see check_refname_format() */
-		while (*p == '/')
-			p++;
-	}
-	for (q = p; *q; q++)
-		;
-	while (1) {
-		while (q > p && *q != '/')
-			q--;
-		while (q > p && *(q-1) == '/')
-			q--;
-		if (q == p)
-			break;
-		*q = '\0';
-		if (rmdir(git_path("%s", name)))
-			break;
-	}
-}
-
-/* make sure nobody touched the ref, and unlink */
-static void prune_ref(struct ref_to_prune *r)
-{
-	struct ref_transaction *transaction;
-	struct strbuf err = STRBUF_INIT;
-
-	if (check_refname_format(r->name, 0))
-		return;
-
-	transaction = ref_transaction_begin(&err);
-	if (!transaction ||
-	    ref_transaction_delete(transaction, r->name, r->sha1,
-				   REF_ISPRUNING, NULL, &err) ||
-	    ref_transaction_commit(transaction, &err)) {
-		ref_transaction_free(transaction);
-		error("%s", err.buf);
-		strbuf_release(&err);
-		return;
-	}
-	ref_transaction_free(transaction);
-	strbuf_release(&err);
-	try_remove_empty_parents(r->name);
-}
-
-static void prune_refs(struct ref_to_prune *r)
-{
-	while (r) {
-		prune_ref(r);
-		r = r->next;
-	}
-}
-
-int pack_refs(unsigned int flags)
-{
-	struct pack_refs_cb_data cbdata;
-
-	memset(&cbdata, 0, sizeof(cbdata));
-	cbdata.flags = flags;
-
-	lock_packed_refs(LOCK_DIE_ON_ERROR);
-	cbdata.packed_refs = get_packed_refs(&ref_cache);
-
-	do_for_each_entry_in_dir(get_loose_refs(&ref_cache), 0,
-				 pack_if_possible_fn, &cbdata);
-
-	if (commit_packed_refs())
-		die_errno("unable to overwrite old ref-pack file");
-
-	prune_refs(cbdata.ref_to_prune);
-	return 0;
-}
-
-/*
- * Rewrite the packed-refs file, omitting any refs listed in
- * 'refnames'. On error, leave packed-refs unchanged, write an error
- * message to 'err', and return a nonzero value.
- *
- * The refs in 'refnames' needn't be sorted. `err` must not be NULL.
- */
-static int repack_without_refs(struct string_list *refnames, struct strbuf *err)
-{
-	struct ref_dir *packed;
-	struct string_list_item *refname;
-	int ret, needs_repacking = 0, removed = 0;
-
-	assert(err);
-
-	/* Look for a packed ref */
-	for_each_string_list_item(refname, refnames) {
-		if (get_packed_ref(refname->string)) {
-			needs_repacking = 1;
-			break;
-		}
-	}
-
-	/* Avoid locking if we have nothing to do */
-	if (!needs_repacking)
-		return 0; /* no refname exists in packed refs */
-
-	if (lock_packed_refs(0)) {
-		unable_to_lock_message(git_path("packed-refs"), errno, err);
-		return -1;
-	}
-	packed = get_packed_refs(&ref_cache);
-
-	/* Remove refnames from the cache */
-	for_each_string_list_item(refname, refnames)
-		if (remove_entry(packed, refname->string) != -1)
-			removed = 1;
-	if (!removed) {
-		/*
-		 * All packed entries disappeared while we were
-		 * acquiring the lock.
-		 */
-		rollback_packed_refs();
-		return 0;
-	}
-
-	/* Write what remains */
-	ret = commit_packed_refs();
-	if (ret)
-		strbuf_addf(err, "unable to overwrite old ref-pack file: %s",
-			    strerror(errno));
-	return ret;
-}
-
-static int delete_ref_loose(struct ref_lock *lock, int flag, struct strbuf *err)
-{
-	assert(err);
-
-	if (!(flag & REF_ISPACKED) || flag & REF_ISSYMREF) {
-		/*
-		 * loose.  The loose file name is the same as the
-		 * lockfile name, minus ".lock":
-		 */
-		char *loose_filename = get_locked_file_path(lock->lk);
-		int res = unlink_or_msg(loose_filename, err);
-		free(loose_filename);
-		if (res)
-			return 1;
-	}
-	return 0;
-}
-
 static int is_per_worktree_ref(const char *refname)
 {
-	return !strcmp(refname, "HEAD");
+	return !strcmp(refname, "HEAD") ||
+		starts_with(refname, "refs/bisect/");
 }
 
 static int is_pseudoref_syntax(const char *refname)
@@ -2980,254 +582,7 @@
 	return 0;
 }
 
-int delete_refs(struct string_list *refnames)
-{
-	struct strbuf err = STRBUF_INIT;
-	int i, result = 0;
-
-	if (!refnames->nr)
-		return 0;
-
-	result = repack_without_refs(refnames, &err);
-	if (result) {
-		/*
-		 * If we failed to rewrite the packed-refs file, then
-		 * it is unsafe to try to remove loose refs, because
-		 * doing so might expose an obsolete packed value for
-		 * a reference that might even point at an object that
-		 * has been garbage collected.
-		 */
-		if (refnames->nr == 1)
-			error(_("could not delete reference %s: %s"),
-			      refnames->items[0].string, err.buf);
-		else
-			error(_("could not delete references: %s"), err.buf);
-
-		goto out;
-	}
-
-	for (i = 0; i < refnames->nr; i++) {
-		const char *refname = refnames->items[i].string;
-
-		if (delete_ref(refname, NULL, 0))
-			result |= error(_("could not remove reference %s"), refname);
-	}
-
-out:
-	strbuf_release(&err);
-	return result;
-}
-
-/*
- * People using contrib's git-new-workdir have .git/logs/refs ->
- * /some/other/path/.git/logs/refs, and that may live on another device.
- *
- * IOW, to avoid cross device rename errors, the temporary renamed log must
- * live into logs/refs.
- */
-#define TMP_RENAMED_LOG  "logs/refs/.tmp-renamed-log"
-
-static int rename_tmp_log(const char *newrefname)
-{
-	int attempts_remaining = 4;
-	struct strbuf path = STRBUF_INIT;
-	int ret = -1;
-
- retry:
-	strbuf_reset(&path);
-	strbuf_git_path(&path, "logs/%s", newrefname);
-	switch (safe_create_leading_directories_const(path.buf)) {
-	case SCLD_OK:
-		break; /* success */
-	case SCLD_VANISHED:
-		if (--attempts_remaining > 0)
-			goto retry;
-		/* fall through */
-	default:
-		error("unable to create directory for %s", newrefname);
-		goto out;
-	}
-
-	if (rename(git_path(TMP_RENAMED_LOG), path.buf)) {
-		if ((errno==EISDIR || errno==ENOTDIR) && --attempts_remaining > 0) {
-			/*
-			 * rename(a, b) when b is an existing
-			 * directory ought to result in ISDIR, but
-			 * Solaris 5.8 gives ENOTDIR.  Sheesh.
-			 */
-			if (remove_empty_directories(&path)) {
-				error("Directory not empty: logs/%s", newrefname);
-				goto out;
-			}
-			goto retry;
-		} else if (errno == ENOENT && --attempts_remaining > 0) {
-			/*
-			 * Maybe another process just deleted one of
-			 * the directories in the path to newrefname.
-			 * Try again from the beginning.
-			 */
-			goto retry;
-		} else {
-			error("unable to move logfile "TMP_RENAMED_LOG" to logs/%s: %s",
-				newrefname, strerror(errno));
-			goto out;
-		}
-	}
-	ret = 0;
-out:
-	strbuf_release(&path);
-	return ret;
-}
-
-static int rename_ref_available(const char *oldname, const char *newname)
-{
-	struct string_list skip = STRING_LIST_INIT_NODUP;
-	struct strbuf err = STRBUF_INIT;
-	int ret;
-
-	string_list_insert(&skip, oldname);
-	ret = !verify_refname_available(newname, NULL, &skip,
-					get_packed_refs(&ref_cache), &err)
-		&& !verify_refname_available(newname, NULL, &skip,
-					     get_loose_refs(&ref_cache), &err);
-	if (!ret)
-		error("%s", err.buf);
-
-	string_list_clear(&skip, 0);
-	strbuf_release(&err);
-	return ret;
-}
-
-static int write_ref_to_lockfile(struct ref_lock *lock,
-				 const unsigned char *sha1, struct strbuf *err);
-static int commit_ref_update(struct ref_lock *lock,
-			     const unsigned char *sha1, const char *logmsg,
-			     int flags, struct strbuf *err);
-
-int rename_ref(const char *oldrefname, const char *newrefname, const char *logmsg)
-{
-	unsigned char sha1[20], orig_sha1[20];
-	int flag = 0, logmoved = 0;
-	struct ref_lock *lock;
-	struct stat loginfo;
-	int log = !lstat(git_path("logs/%s", oldrefname), &loginfo);
-	const char *symref = NULL;
-	struct strbuf err = STRBUF_INIT;
-
-	if (log && S_ISLNK(loginfo.st_mode))
-		return error("reflog for %s is a symlink", oldrefname);
-
-	symref = resolve_ref_unsafe(oldrefname, RESOLVE_REF_READING,
-				    orig_sha1, &flag);
-	if (flag & REF_ISSYMREF)
-		return error("refname %s is a symbolic ref, renaming it is not supported",
-			oldrefname);
-	if (!symref)
-		return error("refname %s not found", oldrefname);
-
-	if (!rename_ref_available(oldrefname, newrefname))
-		return 1;
-
-	if (log && rename(git_path("logs/%s", oldrefname), git_path(TMP_RENAMED_LOG)))
-		return error("unable to move logfile logs/%s to "TMP_RENAMED_LOG": %s",
-			oldrefname, strerror(errno));
-
-	if (delete_ref(oldrefname, orig_sha1, REF_NODEREF)) {
-		error("unable to delete old %s", oldrefname);
-		goto rollback;
-	}
-
-	if (!read_ref_full(newrefname, RESOLVE_REF_READING, sha1, NULL) &&
-	    delete_ref(newrefname, sha1, REF_NODEREF)) {
-		if (errno==EISDIR) {
-			struct strbuf path = STRBUF_INIT;
-			int result;
-
-			strbuf_git_path(&path, "%s", newrefname);
-			result = remove_empty_directories(&path);
-			strbuf_release(&path);
-
-			if (result) {
-				error("Directory not empty: %s", newrefname);
-				goto rollback;
-			}
-		} else {
-			error("unable to delete existing %s", newrefname);
-			goto rollback;
-		}
-	}
-
-	if (log && rename_tmp_log(newrefname))
-		goto rollback;
-
-	logmoved = log;
-
-	lock = lock_ref_sha1_basic(newrefname, NULL, NULL, NULL, 0, NULL, &err);
-	if (!lock) {
-		error("unable to rename '%s' to '%s': %s", oldrefname, newrefname, err.buf);
-		strbuf_release(&err);
-		goto rollback;
-	}
-	hashcpy(lock->old_oid.hash, orig_sha1);
-
-	if (write_ref_to_lockfile(lock, orig_sha1, &err) ||
-	    commit_ref_update(lock, orig_sha1, logmsg, 0, &err)) {
-		error("unable to write current sha1 into %s: %s", newrefname, err.buf);
-		strbuf_release(&err);
-		goto rollback;
-	}
-
-	return 0;
-
- rollback:
-	lock = lock_ref_sha1_basic(oldrefname, NULL, NULL, NULL, 0, NULL, &err);
-	if (!lock) {
-		error("unable to lock %s for rollback: %s", oldrefname, err.buf);
-		strbuf_release(&err);
-		goto rollbacklog;
-	}
-
-	flag = log_all_ref_updates;
-	log_all_ref_updates = 0;
-	if (write_ref_to_lockfile(lock, orig_sha1, &err) ||
-	    commit_ref_update(lock, orig_sha1, NULL, 0, &err)) {
-		error("unable to write current sha1 into %s: %s", oldrefname, err.buf);
-		strbuf_release(&err);
-	}
-	log_all_ref_updates = flag;
-
- rollbacklog:
-	if (logmoved && rename(git_path("logs/%s", newrefname), git_path("logs/%s", oldrefname)))
-		error("unable to restore logfile %s from %s: %s",
-			oldrefname, newrefname, strerror(errno));
-	if (!logmoved && log &&
-	    rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", oldrefname)))
-		error("unable to restore logfile %s from "TMP_RENAMED_LOG": %s",
-			oldrefname, strerror(errno));
-
-	return 1;
-}
-
-static int close_ref(struct ref_lock *lock)
-{
-	if (close_lock_file(lock->lk))
-		return -1;
-	return 0;
-}
-
-static int commit_ref(struct ref_lock *lock)
-{
-	if (commit_lock_file(lock->lk))
-		return -1;
-	return 0;
-}
-
-/*
- * copy the reflog message msg to buf, which has been allocated sufficiently
- * large, while cleaning up the whitespaces.  Especially, convert LF to space,
- * because reflog file is one line per entry.
- */
-static int copy_msg(char *buf, const char *msg)
+int copy_reflog_msg(char *buf, const char *msg)
 {
 	char *cp = buf;
 	char c;
@@ -3248,7 +603,7 @@
 	return cp - buf;
 }
 
-static int should_autocreate_reflog(const char *refname)
+int should_autocreate_reflog(const char *refname)
 {
 	if (!log_all_ref_updates)
 		return 0;
@@ -3258,305 +613,11 @@
 		!strcmp(refname, "HEAD");
 }
 
-/*
- * Create a reflog for a ref.  If force_create = 0, the reflog will
- * only be created for certain refs (those for which
- * should_autocreate_reflog returns non-zero.  Otherwise, create it
- * regardless of the ref name.  Fill in *err and return -1 on failure.
- */
-static int log_ref_setup(const char *refname, struct strbuf *logfile, struct strbuf *err, int force_create)
-{
-	int logfd, oflags = O_APPEND | O_WRONLY;
-
-	strbuf_git_path(logfile, "logs/%s", refname);
-	if (force_create || should_autocreate_reflog(refname)) {
-		if (safe_create_leading_directories(logfile->buf) < 0) {
-			strbuf_addf(err, "unable to create directory for %s: "
-				    "%s", logfile->buf, strerror(errno));
-			return -1;
-		}
-		oflags |= O_CREAT;
-	}
-
-	logfd = open(logfile->buf, oflags, 0666);
-	if (logfd < 0) {
-		if (!(oflags & O_CREAT) && (errno == ENOENT || errno == EISDIR))
-			return 0;
-
-		if (errno == EISDIR) {
-			if (remove_empty_directories(logfile)) {
-				strbuf_addf(err, "There are still logs under "
-					    "'%s'", logfile->buf);
-				return -1;
-			}
-			logfd = open(logfile->buf, oflags, 0666);
-		}
-
-		if (logfd < 0) {
-			strbuf_addf(err, "unable to append to %s: %s",
-				    logfile->buf, strerror(errno));
-			return -1;
-		}
-	}
-
-	adjust_shared_perm(logfile->buf);
-	close(logfd);
-	return 0;
-}
-
-
-int safe_create_reflog(const char *refname, int force_create, struct strbuf *err)
-{
-	int ret;
-	struct strbuf sb = STRBUF_INIT;
-
-	ret = log_ref_setup(refname, &sb, err, force_create);
-	strbuf_release(&sb);
-	return ret;
-}
-
-static int log_ref_write_fd(int fd, const unsigned char *old_sha1,
-			    const unsigned char *new_sha1,
-			    const char *committer, const char *msg)
-{
-	int msglen, written;
-	unsigned maxlen, len;
-	char *logrec;
-
-	msglen = msg ? strlen(msg) : 0;
-	maxlen = strlen(committer) + msglen + 100;
-	logrec = xmalloc(maxlen);
-	len = sprintf(logrec, "%s %s %s\n",
-		      sha1_to_hex(old_sha1),
-		      sha1_to_hex(new_sha1),
-		      committer);
-	if (msglen)
-		len += copy_msg(logrec + len - 1, msg) - 1;
-
-	written = len <= maxlen ? write_in_full(fd, logrec, len) : -1;
-	free(logrec);
-	if (written != len)
-		return -1;
-
-	return 0;
-}
-
-static int log_ref_write_1(const char *refname, const unsigned char *old_sha1,
-			   const unsigned char *new_sha1, const char *msg,
-			   struct strbuf *logfile, int flags,
-			   struct strbuf *err)
-{
-	int logfd, result, oflags = O_APPEND | O_WRONLY;
-
-	if (log_all_ref_updates < 0)
-		log_all_ref_updates = !is_bare_repository();
-
-	result = log_ref_setup(refname, logfile, err, flags & REF_FORCE_CREATE_REFLOG);
-
-	if (result)
-		return result;
-
-	logfd = open(logfile->buf, oflags);
-	if (logfd < 0)
-		return 0;
-	result = log_ref_write_fd(logfd, old_sha1, new_sha1,
-				  git_committer_info(0), msg);
-	if (result) {
-		strbuf_addf(err, "unable to append to %s: %s", logfile->buf,
-			    strerror(errno));
-		close(logfd);
-		return -1;
-	}
-	if (close(logfd)) {
-		strbuf_addf(err, "unable to append to %s: %s", logfile->buf,
-			    strerror(errno));
-		return -1;
-	}
-	return 0;
-}
-
-static int log_ref_write(const char *refname, const unsigned char *old_sha1,
-			 const unsigned char *new_sha1, const char *msg,
-			 int flags, struct strbuf *err)
-{
-	struct strbuf sb = STRBUF_INIT;
-	int ret = log_ref_write_1(refname, old_sha1, new_sha1, msg, &sb, flags,
-				  err);
-	strbuf_release(&sb);
-	return ret;
-}
-
 int is_branch(const char *refname)
 {
 	return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
 }
 
-/*
- * Write sha1 into the open lockfile, then close the lockfile. On
- * errors, rollback the lockfile, fill in *err and
- * return -1.
- */
-static int write_ref_to_lockfile(struct ref_lock *lock,
-				 const unsigned char *sha1, struct strbuf *err)
-{
-	static char term = '\n';
-	struct object *o;
-	int fd;
-
-	o = parse_object(sha1);
-	if (!o) {
-		strbuf_addf(err,
-			    "Trying to write ref %s with nonexistent object %s",
-			    lock->ref_name, sha1_to_hex(sha1));
-		unlock_ref(lock);
-		return -1;
-	}
-	if (o->type != OBJ_COMMIT && is_branch(lock->ref_name)) {
-		strbuf_addf(err,
-			    "Trying to write non-commit object %s to branch %s",
-			    sha1_to_hex(sha1), lock->ref_name);
-		unlock_ref(lock);
-		return -1;
-	}
-	fd = get_lock_file_fd(lock->lk);
-	if (write_in_full(fd, sha1_to_hex(sha1), 40) != 40 ||
-	    write_in_full(fd, &term, 1) != 1 ||
-	    close_ref(lock) < 0) {
-		strbuf_addf(err,
-			    "Couldn't write %s", get_lock_file_path(lock->lk));
-		unlock_ref(lock);
-		return -1;
-	}
-	return 0;
-}
-
-/*
- * Commit a change to a loose reference that has already been written
- * to the loose reference lockfile. Also update the reflogs if
- * necessary, using the specified lockmsg (which can be NULL).
- */
-static int commit_ref_update(struct ref_lock *lock,
-			     const unsigned char *sha1, const char *logmsg,
-			     int flags, struct strbuf *err)
-{
-	clear_loose_ref_cache(&ref_cache);
-	if (log_ref_write(lock->ref_name, lock->old_oid.hash, sha1, logmsg, flags, err) < 0 ||
-	    (strcmp(lock->ref_name, lock->orig_ref_name) &&
-	     log_ref_write(lock->orig_ref_name, lock->old_oid.hash, sha1, logmsg, flags, err) < 0)) {
-		char *old_msg = strbuf_detach(err, NULL);
-		strbuf_addf(err, "Cannot update the ref '%s': %s",
-			    lock->ref_name, old_msg);
-		free(old_msg);
-		unlock_ref(lock);
-		return -1;
-	}
-	if (strcmp(lock->orig_ref_name, "HEAD") != 0) {
-		/*
-		 * Special hack: If a branch is updated directly and HEAD
-		 * points to it (may happen on the remote side of a push
-		 * for example) then logically the HEAD reflog should be
-		 * updated too.
-		 * A generic solution implies reverse symref information,
-		 * but finding all symrefs pointing to the given branch
-		 * would be rather costly for this rare event (the direct
-		 * update of a branch) to be worth it.  So let's cheat and
-		 * check with HEAD only which should cover 99% of all usage
-		 * scenarios (even 100% of the default ones).
-		 */
-		unsigned char head_sha1[20];
-		int head_flag;
-		const char *head_ref;
-		head_ref = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
-					      head_sha1, &head_flag);
-		if (head_ref && (head_flag & REF_ISSYMREF) &&
-		    !strcmp(head_ref, lock->ref_name)) {
-			struct strbuf log_err = STRBUF_INIT;
-			if (log_ref_write("HEAD", lock->old_oid.hash, sha1,
-					  logmsg, 0, &log_err)) {
-				error("%s", log_err.buf);
-				strbuf_release(&log_err);
-			}
-		}
-	}
-	if (commit_ref(lock)) {
-		error("Couldn't set %s", lock->ref_name);
-		unlock_ref(lock);
-		return -1;
-	}
-
-	unlock_ref(lock);
-	return 0;
-}
-
-int create_symref(const char *ref_target, const char *refs_heads_master,
-		  const char *logmsg)
-{
-	char *lockpath = NULL;
-	char ref[1000];
-	int fd, len, written;
-	char *git_HEAD = git_pathdup("%s", ref_target);
-	unsigned char old_sha1[20], new_sha1[20];
-	struct strbuf err = STRBUF_INIT;
-
-	if (logmsg && read_ref(ref_target, old_sha1))
-		hashclr(old_sha1);
-
-	if (safe_create_leading_directories(git_HEAD) < 0)
-		return error("unable to create directory for %s", git_HEAD);
-
-#ifndef NO_SYMLINK_HEAD
-	if (prefer_symlink_refs) {
-		unlink(git_HEAD);
-		if (!symlink(refs_heads_master, git_HEAD))
-			goto done;
-		fprintf(stderr, "no symlink - falling back to symbolic ref\n");
-	}
-#endif
-
-	len = snprintf(ref, sizeof(ref), "ref: %s\n", refs_heads_master);
-	if (sizeof(ref) <= len) {
-		error("refname too long: %s", refs_heads_master);
-		goto error_free_return;
-	}
-	lockpath = mkpathdup("%s.lock", git_HEAD);
-	fd = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, 0666);
-	if (fd < 0) {
-		error("Unable to open %s for writing", lockpath);
-		goto error_free_return;
-	}
-	written = write_in_full(fd, ref, len);
-	if (close(fd) != 0 || written != len) {
-		error("Unable to write to %s", lockpath);
-		goto error_unlink_return;
-	}
-	if (rename(lockpath, git_HEAD) < 0) {
-		error("Unable to create %s", git_HEAD);
-		goto error_unlink_return;
-	}
-	if (adjust_shared_perm(git_HEAD)) {
-		error("Unable to fix permissions on %s", lockpath);
-	error_unlink_return:
-		unlink_or_warn(lockpath);
-	error_free_return:
-		free(lockpath);
-		free(git_HEAD);
-		return -1;
-	}
-	free(lockpath);
-
-#ifndef NO_SYMLINK_HEAD
-	done:
-#endif
-	if (logmsg && !read_ref(refs_heads_master, new_sha1) &&
-		log_ref_write(ref_target, old_sha1, new_sha1, logmsg, 0, &err)) {
-		error("%s", err.buf);
-		strbuf_release(&err);
-	}
-
-	free(git_HEAD);
-	return 0;
-}
-
 struct read_ref_at_cb {
 	const char *refname;
 	unsigned long at_time;
@@ -3675,287 +736,6 @@
 	return 1;
 }
 
-int reflog_exists(const char *refname)
-{
-	struct stat st;
-
-	return !lstat(git_path("logs/%s", refname), &st) &&
-		S_ISREG(st.st_mode);
-}
-
-int delete_reflog(const char *refname)
-{
-	return remove_path(git_path("logs/%s", refname));
-}
-
-static int show_one_reflog_ent(struct strbuf *sb, each_reflog_ent_fn fn, void *cb_data)
-{
-	unsigned char osha1[20], nsha1[20];
-	char *email_end, *message;
-	unsigned long timestamp;
-	int tz;
-
-	/* old SP new SP name <email> SP time TAB msg LF */
-	if (sb->len < 83 || sb->buf[sb->len - 1] != '\n' ||
-	    get_sha1_hex(sb->buf, osha1) || sb->buf[40] != ' ' ||
-	    get_sha1_hex(sb->buf + 41, nsha1) || sb->buf[81] != ' ' ||
-	    !(email_end = strchr(sb->buf + 82, '>')) ||
-	    email_end[1] != ' ' ||
-	    !(timestamp = strtoul(email_end + 2, &message, 10)) ||
-	    !message || message[0] != ' ' ||
-	    (message[1] != '+' && message[1] != '-') ||
-	    !isdigit(message[2]) || !isdigit(message[3]) ||
-	    !isdigit(message[4]) || !isdigit(message[5]))
-		return 0; /* corrupt? */
-	email_end[1] = '\0';
-	tz = strtol(message + 1, NULL, 10);
-	if (message[6] != '\t')
-		message += 6;
-	else
-		message += 7;
-	return fn(osha1, nsha1, sb->buf + 82, timestamp, tz, message, cb_data);
-}
-
-static char *find_beginning_of_line(char *bob, char *scan)
-{
-	while (bob < scan && *(--scan) != '\n')
-		; /* keep scanning backwards */
-	/*
-	 * Return either beginning of the buffer, or LF at the end of
-	 * the previous line.
-	 */
-	return scan;
-}
-
-int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn, void *cb_data)
-{
-	struct strbuf sb = STRBUF_INIT;
-	FILE *logfp;
-	long pos;
-	int ret = 0, at_tail = 1;
-
-	logfp = fopen(git_path("logs/%s", refname), "r");
-	if (!logfp)
-		return -1;
-
-	/* Jump to the end */
-	if (fseek(logfp, 0, SEEK_END) < 0)
-		return error("cannot seek back reflog for %s: %s",
-			     refname, strerror(errno));
-	pos = ftell(logfp);
-	while (!ret && 0 < pos) {
-		int cnt;
-		size_t nread;
-		char buf[BUFSIZ];
-		char *endp, *scanp;
-
-		/* Fill next block from the end */
-		cnt = (sizeof(buf) < pos) ? sizeof(buf) : pos;
-		if (fseek(logfp, pos - cnt, SEEK_SET))
-			return error("cannot seek back reflog for %s: %s",
-				     refname, strerror(errno));
-		nread = fread(buf, cnt, 1, logfp);
-		if (nread != 1)
-			return error("cannot read %d bytes from reflog for %s: %s",
-				     cnt, refname, strerror(errno));
-		pos -= cnt;
-
-		scanp = endp = buf + cnt;
-		if (at_tail && scanp[-1] == '\n')
-			/* Looking at the final LF at the end of the file */
-			scanp--;
-		at_tail = 0;
-
-		while (buf < scanp) {
-			/*
-			 * terminating LF of the previous line, or the beginning
-			 * of the buffer.
-			 */
-			char *bp;
-
-			bp = find_beginning_of_line(buf, scanp);
-
-			if (*bp == '\n') {
-				/*
-				 * The newline is the end of the previous line,
-				 * so we know we have complete line starting
-				 * at (bp + 1). Prefix it onto any prior data
-				 * we collected for the line and process it.
-				 */
-				strbuf_splice(&sb, 0, 0, bp + 1, endp - (bp + 1));
-				scanp = bp;
-				endp = bp + 1;
-				ret = show_one_reflog_ent(&sb, fn, cb_data);
-				strbuf_reset(&sb);
-				if (ret)
-					break;
-			} else if (!pos) {
-				/*
-				 * We are at the start of the buffer, and the
-				 * start of the file; there is no previous
-				 * line, and we have everything for this one.
-				 * Process it, and we can end the loop.
-				 */
-				strbuf_splice(&sb, 0, 0, buf, endp - buf);
-				ret = show_one_reflog_ent(&sb, fn, cb_data);
-				strbuf_reset(&sb);
-				break;
-			}
-
-			if (bp == buf) {
-				/*
-				 * We are at the start of the buffer, and there
-				 * is more file to read backwards. Which means
-				 * we are in the middle of a line. Note that we
-				 * may get here even if *bp was a newline; that
-				 * just means we are at the exact end of the
-				 * previous line, rather than some spot in the
-				 * middle.
-				 *
-				 * Save away what we have to be combined with
-				 * the data from the next read.
-				 */
-				strbuf_splice(&sb, 0, 0, buf, endp - buf);
-				break;
-			}
-		}
-
-	}
-	if (!ret && sb.len)
-		die("BUG: reverse reflog parser had leftover data");
-
-	fclose(logfp);
-	strbuf_release(&sb);
-	return ret;
-}
-
-int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_data)
-{
-	FILE *logfp;
-	struct strbuf sb = STRBUF_INIT;
-	int ret = 0;
-
-	logfp = fopen(git_path("logs/%s", refname), "r");
-	if (!logfp)
-		return -1;
-
-	while (!ret && !strbuf_getwholeline(&sb, logfp, '\n'))
-		ret = show_one_reflog_ent(&sb, fn, cb_data);
-	fclose(logfp);
-	strbuf_release(&sb);
-	return ret;
-}
-/*
- * Call fn for each reflog in the namespace indicated by name.  name
- * must be empty or end with '/'.  Name will be used as a scratch
- * space, but its contents will be restored before return.
- */
-static int do_for_each_reflog(struct strbuf *name, each_ref_fn fn, void *cb_data)
-{
-	DIR *d = opendir(git_path("logs/%s", name->buf));
-	int retval = 0;
-	struct dirent *de;
-	int oldlen = name->len;
-
-	if (!d)
-		return name->len ? errno : 0;
-
-	while ((de = readdir(d)) != NULL) {
-		struct stat st;
-
-		if (de->d_name[0] == '.')
-			continue;
-		if (ends_with(de->d_name, ".lock"))
-			continue;
-		strbuf_addstr(name, de->d_name);
-		if (stat(git_path("logs/%s", name->buf), &st) < 0) {
-			; /* silently ignore */
-		} else {
-			if (S_ISDIR(st.st_mode)) {
-				strbuf_addch(name, '/');
-				retval = do_for_each_reflog(name, fn, cb_data);
-			} else {
-				struct object_id oid;
-
-				if (read_ref_full(name->buf, 0, oid.hash, NULL))
-					retval = error("bad ref for %s", name->buf);
-				else
-					retval = fn(name->buf, &oid, 0, cb_data);
-			}
-			if (retval)
-				break;
-		}
-		strbuf_setlen(name, oldlen);
-	}
-	closedir(d);
-	return retval;
-}
-
-int for_each_reflog(each_ref_fn fn, void *cb_data)
-{
-	int retval;
-	struct strbuf name;
-	strbuf_init(&name, PATH_MAX);
-	retval = do_for_each_reflog(&name, fn, cb_data);
-	strbuf_release(&name);
-	return retval;
-}
-
-/**
- * Information needed for a single ref update. Set new_sha1 to the new
- * value or to null_sha1 to delete the ref. To check the old value
- * while the ref is locked, set (flags & REF_HAVE_OLD) and set
- * old_sha1 to the old value, or to null_sha1 to ensure the ref does
- * not exist before update.
- */
-struct ref_update {
-	/*
-	 * If (flags & REF_HAVE_NEW), set the reference to this value:
-	 */
-	unsigned char new_sha1[20];
-	/*
-	 * If (flags & REF_HAVE_OLD), check that the reference
-	 * previously had this value:
-	 */
-	unsigned char old_sha1[20];
-	/*
-	 * One or more of REF_HAVE_NEW, REF_HAVE_OLD, REF_NODEREF,
-	 * REF_DELETING, and REF_ISPRUNING:
-	 */
-	unsigned int flags;
-	struct ref_lock *lock;
-	int type;
-	char *msg;
-	const char refname[FLEX_ARRAY];
-};
-
-/*
- * Transaction states.
- * OPEN:   The transaction is in a valid state and can accept new updates.
- *         An OPEN transaction can be committed.
- * CLOSED: A closed transaction is no longer active and no other operations
- *         than free can be used on it in this state.
- *         A transaction can either become closed by successfully committing
- *         an active transaction or if there is a failure while building
- *         the transaction thus rendering it failed/inactive.
- */
-enum ref_transaction_state {
-	REF_TRANSACTION_OPEN   = 0,
-	REF_TRANSACTION_CLOSED = 1
-};
-
-/*
- * Data structure for holding a reference transaction, which can
- * consist of checks and updates to multiple references, carried out
- * as atomically as possible.  This structure is opaque to callers.
- */
-struct ref_transaction {
-	struct ref_update **updates;
-	size_t alloc;
-	size_t nr;
-	enum ref_transaction_state state;
-};
-
 struct ref_transaction *ref_transaction_begin(struct strbuf *err)
 {
 	assert(err);
@@ -3981,10 +761,8 @@
 static struct ref_update *add_update(struct ref_transaction *transaction,
 				     const char *refname)
 {
-	size_t len = strlen(refname);
-	struct ref_update *update = xcalloc(1, sizeof(*update) + len + 1);
-
-	strcpy((char *)update->refname, refname);
+	struct ref_update *update;
+	FLEX_ALLOC_STR(update, refname, refname);
 	ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
 	transaction->updates[transaction->nr++] = update;
 	return update;
@@ -4106,274 +884,6 @@
 	return 0;
 }
 
-static int ref_update_reject_duplicates(struct string_list *refnames,
-					struct strbuf *err)
-{
-	int i, n = refnames->nr;
-
-	assert(err);
-
-	for (i = 1; i < n; i++)
-		if (!strcmp(refnames->items[i - 1].string, refnames->items[i].string)) {
-			strbuf_addf(err,
-				    "Multiple updates for ref '%s' not allowed.",
-				    refnames->items[i].string);
-			return 1;
-		}
-	return 0;
-}
-
-int ref_transaction_commit(struct ref_transaction *transaction,
-			   struct strbuf *err)
-{
-	int ret = 0, i;
-	int n = transaction->nr;
-	struct ref_update **updates = transaction->updates;
-	struct string_list refs_to_delete = STRING_LIST_INIT_NODUP;
-	struct string_list_item *ref_to_delete;
-	struct string_list affected_refnames = STRING_LIST_INIT_NODUP;
-
-	assert(err);
-
-	if (transaction->state != REF_TRANSACTION_OPEN)
-		die("BUG: commit called for transaction that is not open");
-
-	if (!n) {
-		transaction->state = REF_TRANSACTION_CLOSED;
-		return 0;
-	}
-
-	/* Fail if a refname appears more than once in the transaction: */
-	for (i = 0; i < n; i++)
-		string_list_append(&affected_refnames, updates[i]->refname);
-	string_list_sort(&affected_refnames);
-	if (ref_update_reject_duplicates(&affected_refnames, err)) {
-		ret = TRANSACTION_GENERIC_ERROR;
-		goto cleanup;
-	}
-
-	/*
-	 * Acquire all locks, verify old values if provided, check
-	 * that new values are valid, and write new values to the
-	 * lockfiles, ready to be activated. Only keep one lockfile
-	 * open at a time to avoid running out of file descriptors.
-	 */
-	for (i = 0; i < n; i++) {
-		struct ref_update *update = updates[i];
-
-		if ((update->flags & REF_HAVE_NEW) &&
-		    is_null_sha1(update->new_sha1))
-			update->flags |= REF_DELETING;
-		update->lock = lock_ref_sha1_basic(
-				update->refname,
-				((update->flags & REF_HAVE_OLD) ?
-				 update->old_sha1 : NULL),
-				&affected_refnames, NULL,
-				update->flags,
-				&update->type,
-				err);
-		if (!update->lock) {
-			char *reason;
-
-			ret = (errno == ENOTDIR)
-				? TRANSACTION_NAME_CONFLICT
-				: TRANSACTION_GENERIC_ERROR;
-			reason = strbuf_detach(err, NULL);
-			strbuf_addf(err, "cannot lock ref '%s': %s",
-				    update->refname, reason);
-			free(reason);
-			goto cleanup;
-		}
-		if ((update->flags & REF_HAVE_NEW) &&
-		    !(update->flags & REF_DELETING)) {
-			int overwriting_symref = ((update->type & REF_ISSYMREF) &&
-						  (update->flags & REF_NODEREF));
-
-			if (!overwriting_symref &&
-			    !hashcmp(update->lock->old_oid.hash, update->new_sha1)) {
-				/*
-				 * The reference already has the desired
-				 * value, so we don't need to write it.
-				 */
-			} else if (write_ref_to_lockfile(update->lock,
-							 update->new_sha1,
-							 err)) {
-				char *write_err = strbuf_detach(err, NULL);
-
-				/*
-				 * The lock was freed upon failure of
-				 * write_ref_to_lockfile():
-				 */
-				update->lock = NULL;
-				strbuf_addf(err,
-					    "cannot update the ref '%s': %s",
-					    update->refname, write_err);
-				free(write_err);
-				ret = TRANSACTION_GENERIC_ERROR;
-				goto cleanup;
-			} else {
-				update->flags |= REF_NEEDS_COMMIT;
-			}
-		}
-		if (!(update->flags & REF_NEEDS_COMMIT)) {
-			/*
-			 * We didn't have to write anything to the lockfile.
-			 * Close it to free up the file descriptor:
-			 */
-			if (close_ref(update->lock)) {
-				strbuf_addf(err, "Couldn't close %s.lock",
-					    update->refname);
-				goto cleanup;
-			}
-		}
-	}
-
-	/* Perform updates first so live commits remain referenced */
-	for (i = 0; i < n; i++) {
-		struct ref_update *update = updates[i];
-
-		if (update->flags & REF_NEEDS_COMMIT) {
-			if (commit_ref_update(update->lock,
-					      update->new_sha1, update->msg,
-					      update->flags, err)) {
-				/* freed by commit_ref_update(): */
-				update->lock = NULL;
-				ret = TRANSACTION_GENERIC_ERROR;
-				goto cleanup;
-			} else {
-				/* freed by commit_ref_update(): */
-				update->lock = NULL;
-			}
-		}
-	}
-
-	/* Perform deletes now that updates are safely completed */
-	for (i = 0; i < n; i++) {
-		struct ref_update *update = updates[i];
-
-		if (update->flags & REF_DELETING) {
-			if (delete_ref_loose(update->lock, update->type, err)) {
-				ret = TRANSACTION_GENERIC_ERROR;
-				goto cleanup;
-			}
-
-			if (!(update->flags & REF_ISPRUNING))
-				string_list_append(&refs_to_delete,
-						   update->lock->ref_name);
-		}
-	}
-
-	if (repack_without_refs(&refs_to_delete, err)) {
-		ret = TRANSACTION_GENERIC_ERROR;
-		goto cleanup;
-	}
-	for_each_string_list_item(ref_to_delete, &refs_to_delete)
-		unlink_or_warn(git_path("logs/%s", ref_to_delete->string));
-	clear_loose_ref_cache(&ref_cache);
-
-cleanup:
-	transaction->state = REF_TRANSACTION_CLOSED;
-
-	for (i = 0; i < n; i++)
-		if (updates[i]->lock)
-			unlock_ref(updates[i]->lock);
-	string_list_clear(&refs_to_delete, 0);
-	string_list_clear(&affected_refnames, 0);
-	return ret;
-}
-
-static int ref_present(const char *refname,
-		       const struct object_id *oid, int flags, void *cb_data)
-{
-	struct string_list *affected_refnames = cb_data;
-
-	return string_list_has_string(affected_refnames, refname);
-}
-
-int initial_ref_transaction_commit(struct ref_transaction *transaction,
-				   struct strbuf *err)
-{
-	struct ref_dir *loose_refs = get_loose_refs(&ref_cache);
-	struct ref_dir *packed_refs = get_packed_refs(&ref_cache);
-	int ret = 0, i;
-	int n = transaction->nr;
-	struct ref_update **updates = transaction->updates;
-	struct string_list affected_refnames = STRING_LIST_INIT_NODUP;
-
-	assert(err);
-
-	if (transaction->state != REF_TRANSACTION_OPEN)
-		die("BUG: commit called for transaction that is not open");
-
-	/* Fail if a refname appears more than once in the transaction: */
-	for (i = 0; i < n; i++)
-		string_list_append(&affected_refnames, updates[i]->refname);
-	string_list_sort(&affected_refnames);
-	if (ref_update_reject_duplicates(&affected_refnames, err)) {
-		ret = TRANSACTION_GENERIC_ERROR;
-		goto cleanup;
-	}
-
-	/*
-	 * It's really undefined to call this function in an active
-	 * repository or when there are existing references: we are
-	 * only locking and changing packed-refs, so (1) any
-	 * simultaneous processes might try to change a reference at
-	 * the same time we do, and (2) any existing loose versions of
-	 * the references that we are setting would have precedence
-	 * over our values. But some remote helpers create the remote
-	 * "HEAD" and "master" branches before calling this function,
-	 * so here we really only check that none of the references
-	 * that we are creating already exists.
-	 */
-	if (for_each_rawref(ref_present, &affected_refnames))
-		die("BUG: initial ref transaction called with existing refs");
-
-	for (i = 0; i < n; i++) {
-		struct ref_update *update = updates[i];
-
-		if ((update->flags & REF_HAVE_OLD) &&
-		    !is_null_sha1(update->old_sha1))
-			die("BUG: initial ref transaction with old_sha1 set");
-		if (verify_refname_available(update->refname,
-					     &affected_refnames, NULL,
-					     loose_refs, err) ||
-		    verify_refname_available(update->refname,
-					     &affected_refnames, NULL,
-					     packed_refs, err)) {
-			ret = TRANSACTION_NAME_CONFLICT;
-			goto cleanup;
-		}
-	}
-
-	if (lock_packed_refs(0)) {
-		strbuf_addf(err, "unable to lock packed-refs file: %s",
-			    strerror(errno));
-		ret = TRANSACTION_GENERIC_ERROR;
-		goto cleanup;
-	}
-
-	for (i = 0; i < n; i++) {
-		struct ref_update *update = updates[i];
-
-		if ((update->flags & REF_HAVE_NEW) &&
-		    !is_null_sha1(update->new_sha1))
-			add_packed_ref(update->refname, update->new_sha1);
-	}
-
-	if (commit_packed_refs()) {
-		strbuf_addf(err, "unable to commit packed-refs file: %s",
-			    strerror(errno));
-		ret = TRANSACTION_GENERIC_ERROR;
-		goto cleanup;
-	}
-
-cleanup:
-	transaction->state = REF_TRANSACTION_CLOSED;
-	string_list_clear(&affected_refnames, 0);
-	return ret;
-}
-
 char *shorten_unambiguous_ref(const char *refname, int strict)
 {
 	int i;
@@ -4396,7 +906,7 @@
 			/* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
 			total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
 
-		scanf_fmts = xmalloc(nr_rules * sizeof(char *) + total_len);
+		scanf_fmts = xmalloc(st_add(st_mult(nr_rules, sizeof(char *)), total_len));
 
 		offset = 0;
 		for (i = 0; i < nr_rules; i++) {
@@ -4493,7 +1003,7 @@
 	return 0;
 }
 
-int ref_is_hidden(const char *refname)
+int ref_is_hidden(const char *refname, const char *refname_full)
 {
 	int i;
 
@@ -4501,6 +1011,7 @@
 		return 0;
 	for (i = hide_refs->nr - 1; i >= 0; i--) {
 		const char *match = hide_refs->items[i].string;
+		const char *subject;
 		int neg = 0;
 		int len;
 
@@ -4509,153 +1020,63 @@
 			match++;
 		}
 
-		if (!starts_with(refname, match))
+		if (*match == '^') {
+			subject = refname_full;
+			match++;
+		} else {
+			subject = refname;
+		}
+
+		/* refname can be NULL when namespaces are used. */
+		if (!subject || !starts_with(subject, match))
 			continue;
 		len = strlen(match);
-		if (!refname[len] || refname[len] == '/')
+		if (!subject[len] || subject[len] == '/')
 			return !neg;
 	}
 	return 0;
 }
 
-struct expire_reflog_cb {
-	unsigned int flags;
-	reflog_expiry_should_prune_fn *should_prune_fn;
-	void *policy_cb;
-	FILE *newlog;
-	unsigned char last_kept_sha1[20];
-};
-
-static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
-			     const char *email, unsigned long timestamp, int tz,
-			     const char *message, void *cb_data)
+const char *find_descendant_ref(const char *dirname,
+				const struct string_list *extras,
+				const struct string_list *skip)
 {
-	struct expire_reflog_cb *cb = cb_data;
-	struct expire_reflog_policy_cb *policy_cb = cb->policy_cb;
+	int pos;
 
-	if (cb->flags & EXPIRE_REFLOGS_REWRITE)
-		osha1 = cb->last_kept_sha1;
-
-	if ((*cb->should_prune_fn)(osha1, nsha1, email, timestamp, tz,
-				   message, policy_cb)) {
-		if (!cb->newlog)
-			printf("would prune %s", message);
-		else if (cb->flags & EXPIRE_REFLOGS_VERBOSE)
-			printf("prune %s", message);
-	} else {
-		if (cb->newlog) {
-			fprintf(cb->newlog, "%s %s %s %lu %+05d\t%s",
-				sha1_to_hex(osha1), sha1_to_hex(nsha1),
-				email, timestamp, tz, message);
-			hashcpy(cb->last_kept_sha1, nsha1);
-		}
-		if (cb->flags & EXPIRE_REFLOGS_VERBOSE)
-			printf("keep %s", message);
-	}
-	return 0;
-}
-
-int reflog_expire(const char *refname, const unsigned char *sha1,
-		 unsigned int flags,
-		 reflog_expiry_prepare_fn prepare_fn,
-		 reflog_expiry_should_prune_fn should_prune_fn,
-		 reflog_expiry_cleanup_fn cleanup_fn,
-		 void *policy_cb_data)
-{
-	static struct lock_file reflog_lock;
-	struct expire_reflog_cb cb;
-	struct ref_lock *lock;
-	char *log_file;
-	int status = 0;
-	int type;
-	struct strbuf err = STRBUF_INIT;
-
-	memset(&cb, 0, sizeof(cb));
-	cb.flags = flags;
-	cb.policy_cb = policy_cb_data;
-	cb.should_prune_fn = should_prune_fn;
+	if (!extras)
+		return NULL;
 
 	/*
-	 * The reflog file is locked by holding the lock on the
-	 * reference itself, plus we might need to update the
-	 * reference if --updateref was specified:
+	 * Look at the place where dirname would be inserted into
+	 * extras. If there is an entry at that position that starts
+	 * with dirname (remember, dirname includes the trailing
+	 * slash) and is not in skip, then we have a conflict.
 	 */
-	lock = lock_ref_sha1_basic(refname, sha1, NULL, NULL, 0, &type, &err);
-	if (!lock) {
-		error("cannot lock ref '%s': %s", refname, err.buf);
-		strbuf_release(&err);
-		return -1;
+	for (pos = string_list_find_insert_index(extras, dirname, 0);
+	     pos < extras->nr; pos++) {
+		const char *extra_refname = extras->items[pos].string;
+
+		if (!starts_with(extra_refname, dirname))
+			break;
+
+		if (!skip || !string_list_has_string(skip, extra_refname))
+			return extra_refname;
 	}
-	if (!reflog_exists(refname)) {
-		unlock_ref(lock);
-		return 0;
-	}
+	return NULL;
+}
 
-	log_file = git_pathdup("logs/%s", refname);
-	if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) {
-		/*
-		 * Even though holding $GIT_DIR/logs/$reflog.lock has
-		 * no locking implications, we use the lock_file
-		 * machinery here anyway because it does a lot of the
-		 * work we need, including cleaning up if the program
-		 * exits unexpectedly.
-		 */
-		if (hold_lock_file_for_update(&reflog_lock, log_file, 0) < 0) {
-			struct strbuf err = STRBUF_INIT;
-			unable_to_lock_message(log_file, errno, &err);
-			error("%s", err.buf);
-			strbuf_release(&err);
-			goto failure;
-		}
-		cb.newlog = fdopen_lock_file(&reflog_lock, "w");
-		if (!cb.newlog) {
-			error("cannot fdopen %s (%s)",
-			      get_lock_file_path(&reflog_lock), strerror(errno));
-			goto failure;
-		}
-	}
+int rename_ref_available(const char *oldname, const char *newname)
+{
+	struct string_list skip = STRING_LIST_INIT_NODUP;
+	struct strbuf err = STRBUF_INIT;
+	int ret;
 
-	(*prepare_fn)(refname, sha1, cb.policy_cb);
-	for_each_reflog_ent(refname, expire_reflog_ent, &cb);
-	(*cleanup_fn)(cb.policy_cb);
+	string_list_insert(&skip, oldname);
+	ret = !verify_refname_available(newname, NULL, &skip, &err);
+	if (!ret)
+		error("%s", err.buf);
 
-	if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) {
-		/*
-		 * It doesn't make sense to adjust a reference pointed
-		 * to by a symbolic ref based on expiring entries in
-		 * the symbolic reference's reflog. Nor can we update
-		 * a reference if there are no remaining reflog
-		 * entries.
-		 */
-		int update = (flags & EXPIRE_REFLOGS_UPDATE_REF) &&
-			!(type & REF_ISSYMREF) &&
-			!is_null_sha1(cb.last_kept_sha1);
-
-		if (close_lock_file(&reflog_lock)) {
-			status |= error("couldn't write %s: %s", log_file,
-					strerror(errno));
-		} else if (update &&
-			   (write_in_full(get_lock_file_fd(lock->lk),
-				sha1_to_hex(cb.last_kept_sha1), 40) != 40 ||
-			    write_str_in_full(get_lock_file_fd(lock->lk), "\n") != 1 ||
-			    close_ref(lock) < 0)) {
-			status |= error("couldn't write %s",
-					get_lock_file_path(lock->lk));
-			rollback_lock_file(&reflog_lock);
-		} else if (commit_lock_file(&reflog_lock)) {
-			status |= error("unable to write reflog %s: %s",
-					log_file, strerror(errno));
-		} else if (update && commit_ref(lock)) {
-			status |= error("couldn't set %s", lock->ref_name);
-		}
-	}
-	free(log_file);
-	unlock_ref(lock);
-	return status;
-
- failure:
-	rollback_lock_file(&reflog_lock);
-	free(log_file);
-	unlock_ref(lock);
-	return -1;
+	string_list_clear(&skip, 0);
+	strbuf_release(&err);
+	return ret;
 }
diff --git a/refs.h b/refs.h
index e9a5f32..19ebebc 100644
--- a/refs.h
+++ b/refs.h
@@ -109,6 +109,11 @@
  *   If this succeeds, the ref updates will have taken place and
  *   the transaction cannot be rolled back.
  *
+ * - Instead of `ref_transaction_commit`, use
+ *   `initial_ref_transaction_commit()` if the ref database is known
+ *   to be empty (e.g. during clone).  This is likely to be much
+ *   faster.
+ *
  * - At any time call `ref_transaction_free()` to discard the
  *   transaction and free associated resources.  In particular,
  *   this rolls back the transaction if it has not been
@@ -124,6 +129,13 @@
  *
  * The message is appended to err without first clearing err.
  * err will not be '\n' terminated.
+ *
+ * Caveats
+ * -------
+ *
+ * Note that no locks are taken, and no refs are read, until
+ * `ref_transaction_commit` is called.  So `ref_transaction_verify`
+ * won't report a verification failure until the commit is attempted.
  */
 struct ref_transaction;
 
@@ -173,6 +185,7 @@
 extern int head_ref(each_ref_fn fn, void *cb_data);
 extern int for_each_ref(each_ref_fn fn, void *cb_data);
 extern int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data);
+extern int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken);
 extern int for_each_tag_ref(each_ref_fn fn, void *cb_data);
 extern int for_each_branch_ref(each_ref_fn fn, void *cb_data);
 extern int for_each_remote_ref(each_ref_fn fn, void *cb_data);
@@ -443,7 +456,15 @@
 
 extern int parse_hide_refs_config(const char *var, const char *value, const char *);
 
-extern int ref_is_hidden(const char *);
+/*
+ * Check whether a ref is hidden. If no namespace is set, both the first and
+ * the second parameter point to the full ref name. If a namespace is set and
+ * the ref is inside that namespace, the first parameter is a pointer to the
+ * name of the ref with the namespace prefix removed. If a namespace is set and
+ * the ref is outside that namespace, the first parameter is NULL. The second
+ * parameter always points to the full ref name.
+ */
+extern int ref_is_hidden(const char *, const char *);
 
 enum ref_type {
 	REF_TYPE_PER_WORKTREE,
diff --git a/refs/files-backend.c b/refs/files-backend.c
new file mode 100644
index 0000000..de9af16
--- /dev/null
+++ b/refs/files-backend.c
@@ -0,0 +1,3521 @@
+#include "../cache.h"
+#include "../refs.h"
+#include "refs-internal.h"
+#include "../lockfile.h"
+#include "../object.h"
+#include "../dir.h"
+
+struct ref_lock {
+	char *ref_name;
+	char *orig_ref_name;
+	struct lock_file *lk;
+	struct object_id old_oid;
+};
+
+struct ref_entry;
+
+/*
+ * Information used (along with the information in ref_entry) to
+ * describe a single cached reference.  This data structure only
+ * occurs embedded in a union in struct ref_entry, and only when
+ * (ref_entry->flag & REF_DIR) is zero.
+ */
+struct ref_value {
+	/*
+	 * The name of the object to which this reference resolves
+	 * (which may be a tag object).  If REF_ISBROKEN, this is
+	 * null.  If REF_ISSYMREF, then this is the name of the object
+	 * referred to by the last reference in the symlink chain.
+	 */
+	struct object_id oid;
+
+	/*
+	 * If REF_KNOWS_PEELED, then this field holds the peeled value
+	 * of this reference, or null if the reference is known not to
+	 * be peelable.  See the documentation for peel_ref() for an
+	 * exact definition of "peelable".
+	 */
+	struct object_id peeled;
+};
+
+struct ref_cache;
+
+/*
+ * Information used (along with the information in ref_entry) to
+ * describe a level in the hierarchy of references.  This data
+ * structure only occurs embedded in a union in struct ref_entry, and
+ * only when (ref_entry.flag & REF_DIR) is set.  In that case,
+ * (ref_entry.flag & REF_INCOMPLETE) determines whether the references
+ * in the directory have already been read:
+ *
+ *     (ref_entry.flag & REF_INCOMPLETE) unset -- a directory of loose
+ *         or packed references, already read.
+ *
+ *     (ref_entry.flag & REF_INCOMPLETE) set -- a directory of loose
+ *         references that hasn't been read yet (nor has any of its
+ *         subdirectories).
+ *
+ * Entries within a directory are stored within a growable array of
+ * pointers to ref_entries (entries, nr, alloc).  Entries 0 <= i <
+ * sorted are sorted by their component name in strcmp() order and the
+ * remaining entries are unsorted.
+ *
+ * Loose references are read lazily, one directory at a time.  When a
+ * directory of loose references is read, then all of the references
+ * in that directory are stored, and REF_INCOMPLETE stubs are created
+ * for any subdirectories, but the subdirectories themselves are not
+ * read.  The reading is triggered by get_ref_dir().
+ */
+struct ref_dir {
+	int nr, alloc;
+
+	/*
+	 * Entries with index 0 <= i < sorted are sorted by name.  New
+	 * entries are appended to the list unsorted, and are sorted
+	 * only when required; thus we avoid the need to sort the list
+	 * after the addition of every reference.
+	 */
+	int sorted;
+
+	/* A pointer to the ref_cache that contains this ref_dir. */
+	struct ref_cache *ref_cache;
+
+	struct ref_entry **entries;
+};
+
+/*
+ * Bit values for ref_entry::flag.  REF_ISSYMREF=0x01,
+ * REF_ISPACKED=0x02, REF_ISBROKEN=0x04 and REF_BAD_NAME=0x08 are
+ * public values; see refs.h.
+ */
+
+/*
+ * The field ref_entry->u.value.peeled of this value entry contains
+ * the correct peeled value for the reference, which might be
+ * null_sha1 if the reference is not a tag or if it is broken.
+ */
+#define REF_KNOWS_PEELED 0x10
+
+/* ref_entry represents a directory of references */
+#define REF_DIR 0x20
+
+/*
+ * Entry has not yet been read from disk (used only for REF_DIR
+ * entries representing loose references)
+ */
+#define REF_INCOMPLETE 0x40
+
+/*
+ * A ref_entry represents either a reference or a "subdirectory" of
+ * references.
+ *
+ * Each directory in the reference namespace is represented by a
+ * ref_entry with (flags & REF_DIR) set and containing a subdir member
+ * that holds the entries in that directory that have been read so
+ * far.  If (flags & REF_INCOMPLETE) is set, then the directory and
+ * its subdirectories haven't been read yet.  REF_INCOMPLETE is only
+ * used for loose reference directories.
+ *
+ * References are represented by a ref_entry with (flags & REF_DIR)
+ * unset and a value member that describes the reference's value.  The
+ * flag member is at the ref_entry level, but it is also needed to
+ * interpret the contents of the value field (in other words, a
+ * ref_value object is not very much use without the enclosing
+ * ref_entry).
+ *
+ * Reference names cannot end with slash and directories' names are
+ * always stored with a trailing slash (except for the top-level
+ * directory, which is always denoted by "").  This has two nice
+ * consequences: (1) when the entries in each subdir are sorted
+ * lexicographically by name (as they usually are), the references in
+ * a whole tree can be generated in lexicographic order by traversing
+ * the tree in left-to-right, depth-first order; (2) the names of
+ * references and subdirectories cannot conflict, and therefore the
+ * presence of an empty subdirectory does not block the creation of a
+ * similarly-named reference.  (The fact that reference names with the
+ * same leading components can conflict *with each other* is a
+ * separate issue that is regulated by verify_refname_available().)
+ *
+ * Please note that the name field contains the fully-qualified
+ * reference (or subdirectory) name.  Space could be saved by only
+ * storing the relative names.  But that would require the full names
+ * to be generated on the fly when iterating in do_for_each_ref(), and
+ * would break callback functions, who have always been able to assume
+ * that the name strings that they are passed will not be freed during
+ * the iteration.
+ */
+struct ref_entry {
+	unsigned char flag; /* ISSYMREF? ISPACKED? */
+	union {
+		struct ref_value value; /* if not (flags&REF_DIR) */
+		struct ref_dir subdir; /* if (flags&REF_DIR) */
+	} u;
+	/*
+	 * The full name of the reference (e.g., "refs/heads/master")
+	 * or the full name of the directory with a trailing slash
+	 * (e.g., "refs/heads/"):
+	 */
+	char name[FLEX_ARRAY];
+};
+
+static void read_loose_refs(const char *dirname, struct ref_dir *dir);
+static int search_ref_dir(struct ref_dir *dir, const char *refname, size_t len);
+static struct ref_entry *create_dir_entry(struct ref_cache *ref_cache,
+					  const char *dirname, size_t len,
+					  int incomplete);
+static void add_entry_to_dir(struct ref_dir *dir, struct ref_entry *entry);
+
+static struct ref_dir *get_ref_dir(struct ref_entry *entry)
+{
+	struct ref_dir *dir;
+	assert(entry->flag & REF_DIR);
+	dir = &entry->u.subdir;
+	if (entry->flag & REF_INCOMPLETE) {
+		read_loose_refs(entry->name, dir);
+
+		/*
+		 * Manually add refs/bisect, which, being
+		 * per-worktree, might not appear in the directory
+		 * listing for refs/ in the main repo.
+		 */
+		if (!strcmp(entry->name, "refs/")) {
+			int pos = search_ref_dir(dir, "refs/bisect/", 12);
+			if (pos < 0) {
+				struct ref_entry *child_entry;
+				child_entry = create_dir_entry(dir->ref_cache,
+							       "refs/bisect/",
+							       12, 1);
+				add_entry_to_dir(dir, child_entry);
+				read_loose_refs("refs/bisect",
+						&child_entry->u.subdir);
+			}
+		}
+		entry->flag &= ~REF_INCOMPLETE;
+	}
+	return dir;
+}
+
+static struct ref_entry *create_ref_entry(const char *refname,
+					  const unsigned char *sha1, int flag,
+					  int check_name)
+{
+	struct ref_entry *ref;
+
+	if (check_name &&
+	    check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
+		die("Reference has invalid format: '%s'", refname);
+	FLEX_ALLOC_STR(ref, name, refname);
+	hashcpy(ref->u.value.oid.hash, sha1);
+	oidclr(&ref->u.value.peeled);
+	ref->flag = flag;
+	return ref;
+}
+
+static void clear_ref_dir(struct ref_dir *dir);
+
+static void free_ref_entry(struct ref_entry *entry)
+{
+	if (entry->flag & REF_DIR) {
+		/*
+		 * Do not use get_ref_dir() here, as that might
+		 * trigger the reading of loose refs.
+		 */
+		clear_ref_dir(&entry->u.subdir);
+	}
+	free(entry);
+}
+
+/*
+ * Add a ref_entry to the end of dir (unsorted).  Entry is always
+ * stored directly in dir; no recursion into subdirectories is
+ * done.
+ */
+static void add_entry_to_dir(struct ref_dir *dir, struct ref_entry *entry)
+{
+	ALLOC_GROW(dir->entries, dir->nr + 1, dir->alloc);
+	dir->entries[dir->nr++] = entry;
+	/* optimize for the case that entries are added in order */
+	if (dir->nr == 1 ||
+	    (dir->nr == dir->sorted + 1 &&
+	     strcmp(dir->entries[dir->nr - 2]->name,
+		    dir->entries[dir->nr - 1]->name) < 0))
+		dir->sorted = dir->nr;
+}
+
+/*
+ * Clear and free all entries in dir, recursively.
+ */
+static void clear_ref_dir(struct ref_dir *dir)
+{
+	int i;
+	for (i = 0; i < dir->nr; i++)
+		free_ref_entry(dir->entries[i]);
+	free(dir->entries);
+	dir->sorted = dir->nr = dir->alloc = 0;
+	dir->entries = NULL;
+}
+
+/*
+ * Create a struct ref_entry object for the specified dirname.
+ * dirname is the name of the directory with a trailing slash (e.g.,
+ * "refs/heads/") or "" for the top-level directory.
+ */
+static struct ref_entry *create_dir_entry(struct ref_cache *ref_cache,
+					  const char *dirname, size_t len,
+					  int incomplete)
+{
+	struct ref_entry *direntry;
+	FLEX_ALLOC_MEM(direntry, name, dirname, len);
+	direntry->u.subdir.ref_cache = ref_cache;
+	direntry->flag = REF_DIR | (incomplete ? REF_INCOMPLETE : 0);
+	return direntry;
+}
+
+static int ref_entry_cmp(const void *a, const void *b)
+{
+	struct ref_entry *one = *(struct ref_entry **)a;
+	struct ref_entry *two = *(struct ref_entry **)b;
+	return strcmp(one->name, two->name);
+}
+
+static void sort_ref_dir(struct ref_dir *dir);
+
+struct string_slice {
+	size_t len;
+	const char *str;
+};
+
+static int ref_entry_cmp_sslice(const void *key_, const void *ent_)
+{
+	const struct string_slice *key = key_;
+	const struct ref_entry *ent = *(const struct ref_entry * const *)ent_;
+	int cmp = strncmp(key->str, ent->name, key->len);
+	if (cmp)
+		return cmp;
+	return '\0' - (unsigned char)ent->name[key->len];
+}
+
+/*
+ * Return the index of the entry with the given refname from the
+ * ref_dir (non-recursively), sorting dir if necessary.  Return -1 if
+ * no such entry is found.  dir must already be complete.
+ */
+static int search_ref_dir(struct ref_dir *dir, const char *refname, size_t len)
+{
+	struct ref_entry **r;
+	struct string_slice key;
+
+	if (refname == NULL || !dir->nr)
+		return -1;
+
+	sort_ref_dir(dir);
+	key.len = len;
+	key.str = refname;
+	r = bsearch(&key, dir->entries, dir->nr, sizeof(*dir->entries),
+		    ref_entry_cmp_sslice);
+
+	if (r == NULL)
+		return -1;
+
+	return r - dir->entries;
+}
+
+/*
+ * Search for a directory entry directly within dir (without
+ * recursing).  Sort dir if necessary.  subdirname must be a directory
+ * name (i.e., end in '/').  If mkdir is set, then create the
+ * directory if it is missing; otherwise, return NULL if the desired
+ * directory cannot be found.  dir must already be complete.
+ */
+static struct ref_dir *search_for_subdir(struct ref_dir *dir,
+					 const char *subdirname, size_t len,
+					 int mkdir)
+{
+	int entry_index = search_ref_dir(dir, subdirname, len);
+	struct ref_entry *entry;
+	if (entry_index == -1) {
+		if (!mkdir)
+			return NULL;
+		/*
+		 * Since dir is complete, the absence of a subdir
+		 * means that the subdir really doesn't exist;
+		 * therefore, create an empty record for it but mark
+		 * the record complete.
+		 */
+		entry = create_dir_entry(dir->ref_cache, subdirname, len, 0);
+		add_entry_to_dir(dir, entry);
+	} else {
+		entry = dir->entries[entry_index];
+	}
+	return get_ref_dir(entry);
+}
+
+/*
+ * If refname is a reference name, find the ref_dir within the dir
+ * tree that should hold refname.  If refname is a directory name
+ * (i.e., ends in '/'), then return that ref_dir itself.  dir must
+ * represent the top-level directory and must already be complete.
+ * Sort ref_dirs and recurse into subdirectories as necessary.  If
+ * mkdir is set, then create any missing directories; otherwise,
+ * return NULL if the desired directory cannot be found.
+ */
+static struct ref_dir *find_containing_dir(struct ref_dir *dir,
+					   const char *refname, int mkdir)
+{
+	const char *slash;
+	for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
+		size_t dirnamelen = slash - refname + 1;
+		struct ref_dir *subdir;
+		subdir = search_for_subdir(dir, refname, dirnamelen, mkdir);
+		if (!subdir) {
+			dir = NULL;
+			break;
+		}
+		dir = subdir;
+	}
+
+	return dir;
+}
+
+/*
+ * Find the value entry with the given name in dir, sorting ref_dirs
+ * and recursing into subdirectories as necessary.  If the name is not
+ * found or it corresponds to a directory entry, return NULL.
+ */
+static struct ref_entry *find_ref(struct ref_dir *dir, const char *refname)
+{
+	int entry_index;
+	struct ref_entry *entry;
+	dir = find_containing_dir(dir, refname, 0);
+	if (!dir)
+		return NULL;
+	entry_index = search_ref_dir(dir, refname, strlen(refname));
+	if (entry_index == -1)
+		return NULL;
+	entry = dir->entries[entry_index];
+	return (entry->flag & REF_DIR) ? NULL : entry;
+}
+
+/*
+ * Remove the entry with the given name from dir, recursing into
+ * subdirectories as necessary.  If refname is the name of a directory
+ * (i.e., ends with '/'), then remove the directory and its contents.
+ * If the removal was successful, return the number of entries
+ * remaining in the directory entry that contained the deleted entry.
+ * If the name was not found, return -1.  Please note that this
+ * function only deletes the entry from the cache; it does not delete
+ * it from the filesystem or ensure that other cache entries (which
+ * might be symbolic references to the removed entry) are updated.
+ * Nor does it remove any containing dir entries that might be made
+ * empty by the removal.  dir must represent the top-level directory
+ * and must already be complete.
+ */
+static int remove_entry(struct ref_dir *dir, const char *refname)
+{
+	int refname_len = strlen(refname);
+	int entry_index;
+	struct ref_entry *entry;
+	int is_dir = refname[refname_len - 1] == '/';
+	if (is_dir) {
+		/*
+		 * refname represents a reference directory.  Remove
+		 * the trailing slash; otherwise we will get the
+		 * directory *representing* refname rather than the
+		 * one *containing* it.
+		 */
+		char *dirname = xmemdupz(refname, refname_len - 1);
+		dir = find_containing_dir(dir, dirname, 0);
+		free(dirname);
+	} else {
+		dir = find_containing_dir(dir, refname, 0);
+	}
+	if (!dir)
+		return -1;
+	entry_index = search_ref_dir(dir, refname, refname_len);
+	if (entry_index == -1)
+		return -1;
+	entry = dir->entries[entry_index];
+
+	memmove(&dir->entries[entry_index],
+		&dir->entries[entry_index + 1],
+		(dir->nr - entry_index - 1) * sizeof(*dir->entries)
+		);
+	dir->nr--;
+	if (dir->sorted > entry_index)
+		dir->sorted--;
+	free_ref_entry(entry);
+	return dir->nr;
+}
+
+/*
+ * Add a ref_entry to the ref_dir (unsorted), recursing into
+ * subdirectories as necessary.  dir must represent the top-level
+ * directory.  Return 0 on success.
+ */
+static int add_ref(struct ref_dir *dir, struct ref_entry *ref)
+{
+	dir = find_containing_dir(dir, ref->name, 1);
+	if (!dir)
+		return -1;
+	add_entry_to_dir(dir, ref);
+	return 0;
+}
+
+/*
+ * Emit a warning and return true iff ref1 and ref2 have the same name
+ * and the same sha1.  Die if they have the same name but different
+ * sha1s.
+ */
+static int is_dup_ref(const struct ref_entry *ref1, const struct ref_entry *ref2)
+{
+	if (strcmp(ref1->name, ref2->name))
+		return 0;
+
+	/* Duplicate name; make sure that they don't conflict: */
+
+	if ((ref1->flag & REF_DIR) || (ref2->flag & REF_DIR))
+		/* This is impossible by construction */
+		die("Reference directory conflict: %s", ref1->name);
+
+	if (oidcmp(&ref1->u.value.oid, &ref2->u.value.oid))
+		die("Duplicated ref, and SHA1s don't match: %s", ref1->name);
+
+	warning("Duplicated ref: %s", ref1->name);
+	return 1;
+}
+
+/*
+ * Sort the entries in dir non-recursively (if they are not already
+ * sorted) and remove any duplicate entries.
+ */
+static void sort_ref_dir(struct ref_dir *dir)
+{
+	int i, j;
+	struct ref_entry *last = NULL;
+
+	/*
+	 * This check also prevents passing a zero-length array to qsort(),
+	 * which is a problem on some platforms.
+	 */
+	if (dir->sorted == dir->nr)
+		return;
+
+	qsort(dir->entries, dir->nr, sizeof(*dir->entries), ref_entry_cmp);
+
+	/* Remove any duplicates: */
+	for (i = 0, j = 0; j < dir->nr; j++) {
+		struct ref_entry *entry = dir->entries[j];
+		if (last && is_dup_ref(last, entry))
+			free_ref_entry(entry);
+		else
+			last = dir->entries[i++] = entry;
+	}
+	dir->sorted = dir->nr = i;
+}
+
+/* Include broken references in a do_for_each_ref*() iteration: */
+#define DO_FOR_EACH_INCLUDE_BROKEN 0x01
+
+/*
+ * Return true iff the reference described by entry can be resolved to
+ * an object in the database.  Emit a warning if the referred-to
+ * object does not exist.
+ */
+static int ref_resolves_to_object(struct ref_entry *entry)
+{
+	if (entry->flag & REF_ISBROKEN)
+		return 0;
+	if (!has_sha1_file(entry->u.value.oid.hash)) {
+		error("%s does not point to a valid object!", entry->name);
+		return 0;
+	}
+	return 1;
+}
+
+/*
+ * current_ref is a performance hack: when iterating over references
+ * using the for_each_ref*() functions, current_ref is set to the
+ * current reference's entry before calling the callback function.  If
+ * the callback function calls peel_ref(), then peel_ref() first
+ * checks whether the reference to be peeled is the current reference
+ * (it usually is) and if so, returns that reference's peeled version
+ * if it is available.  This avoids a refname lookup in a common case.
+ */
+static struct ref_entry *current_ref;
+
+typedef int each_ref_entry_fn(struct ref_entry *entry, void *cb_data);
+
+struct ref_entry_cb {
+	const char *base;
+	int trim;
+	int flags;
+	each_ref_fn *fn;
+	void *cb_data;
+};
+
+/*
+ * Handle one reference in a do_for_each_ref*()-style iteration,
+ * calling an each_ref_fn for each entry.
+ */
+static int do_one_ref(struct ref_entry *entry, void *cb_data)
+{
+	struct ref_entry_cb *data = cb_data;
+	struct ref_entry *old_current_ref;
+	int retval;
+
+	if (!starts_with(entry->name, data->base))
+		return 0;
+
+	if (!(data->flags & DO_FOR_EACH_INCLUDE_BROKEN) &&
+	      !ref_resolves_to_object(entry))
+		return 0;
+
+	/* Store the old value, in case this is a recursive call: */
+	old_current_ref = current_ref;
+	current_ref = entry;
+	retval = data->fn(entry->name + data->trim, &entry->u.value.oid,
+			  entry->flag, data->cb_data);
+	current_ref = old_current_ref;
+	return retval;
+}
+
+/*
+ * Call fn for each reference in dir that has index in the range
+ * offset <= index < dir->nr.  Recurse into subdirectories that are in
+ * that index range, sorting them before iterating.  This function
+ * does not sort dir itself; it should be sorted beforehand.  fn is
+ * called for all references, including broken ones.
+ */
+static int do_for_each_entry_in_dir(struct ref_dir *dir, int offset,
+				    each_ref_entry_fn fn, void *cb_data)
+{
+	int i;
+	assert(dir->sorted == dir->nr);
+	for (i = offset; i < dir->nr; i++) {
+		struct ref_entry *entry = dir->entries[i];
+		int retval;
+		if (entry->flag & REF_DIR) {
+			struct ref_dir *subdir = get_ref_dir(entry);
+			sort_ref_dir(subdir);
+			retval = do_for_each_entry_in_dir(subdir, 0, fn, cb_data);
+		} else {
+			retval = fn(entry, cb_data);
+		}
+		if (retval)
+			return retval;
+	}
+	return 0;
+}
+
+/*
+ * Call fn for each reference in the union of dir1 and dir2, in order
+ * by refname.  Recurse into subdirectories.  If a value entry appears
+ * in both dir1 and dir2, then only process the version that is in
+ * dir2.  The input dirs must already be sorted, but subdirs will be
+ * sorted as needed.  fn is called for all references, including
+ * broken ones.
+ */
+static int do_for_each_entry_in_dirs(struct ref_dir *dir1,
+				     struct ref_dir *dir2,
+				     each_ref_entry_fn fn, void *cb_data)
+{
+	int retval;
+	int i1 = 0, i2 = 0;
+
+	assert(dir1->sorted == dir1->nr);
+	assert(dir2->sorted == dir2->nr);
+	while (1) {
+		struct ref_entry *e1, *e2;
+		int cmp;
+		if (i1 == dir1->nr) {
+			return do_for_each_entry_in_dir(dir2, i2, fn, cb_data);
+		}
+		if (i2 == dir2->nr) {
+			return do_for_each_entry_in_dir(dir1, i1, fn, cb_data);
+		}
+		e1 = dir1->entries[i1];
+		e2 = dir2->entries[i2];
+		cmp = strcmp(e1->name, e2->name);
+		if (cmp == 0) {
+			if ((e1->flag & REF_DIR) && (e2->flag & REF_DIR)) {
+				/* Both are directories; descend them in parallel. */
+				struct ref_dir *subdir1 = get_ref_dir(e1);
+				struct ref_dir *subdir2 = get_ref_dir(e2);
+				sort_ref_dir(subdir1);
+				sort_ref_dir(subdir2);
+				retval = do_for_each_entry_in_dirs(
+						subdir1, subdir2, fn, cb_data);
+				i1++;
+				i2++;
+			} else if (!(e1->flag & REF_DIR) && !(e2->flag & REF_DIR)) {
+				/* Both are references; ignore the one from dir1. */
+				retval = fn(e2, cb_data);
+				i1++;
+				i2++;
+			} else {
+				die("conflict between reference and directory: %s",
+				    e1->name);
+			}
+		} else {
+			struct ref_entry *e;
+			if (cmp < 0) {
+				e = e1;
+				i1++;
+			} else {
+				e = e2;
+				i2++;
+			}
+			if (e->flag & REF_DIR) {
+				struct ref_dir *subdir = get_ref_dir(e);
+				sort_ref_dir(subdir);
+				retval = do_for_each_entry_in_dir(
+						subdir, 0, fn, cb_data);
+			} else {
+				retval = fn(e, cb_data);
+			}
+		}
+		if (retval)
+			return retval;
+	}
+}
+
+/*
+ * Load all of the refs from the dir into our in-memory cache. The hard work
+ * of loading loose refs is done by get_ref_dir(), so we just need to recurse
+ * through all of the sub-directories. We do not even need to care about
+ * sorting, as traversal order does not matter to us.
+ */
+static void prime_ref_dir(struct ref_dir *dir)
+{
+	int i;
+	for (i = 0; i < dir->nr; i++) {
+		struct ref_entry *entry = dir->entries[i];
+		if (entry->flag & REF_DIR)
+			prime_ref_dir(get_ref_dir(entry));
+	}
+}
+
+struct nonmatching_ref_data {
+	const struct string_list *skip;
+	const char *conflicting_refname;
+};
+
+static int nonmatching_ref_fn(struct ref_entry *entry, void *vdata)
+{
+	struct nonmatching_ref_data *data = vdata;
+
+	if (data->skip && string_list_has_string(data->skip, entry->name))
+		return 0;
+
+	data->conflicting_refname = entry->name;
+	return 1;
+}
+
+/*
+ * Return 0 if a reference named refname could be created without
+ * conflicting with the name of an existing reference in dir.
+ * See verify_refname_available for more information.
+ */
+static int verify_refname_available_dir(const char *refname,
+					const struct string_list *extras,
+					const struct string_list *skip,
+					struct ref_dir *dir,
+					struct strbuf *err)
+{
+	const char *slash;
+	const char *extra_refname;
+	int pos;
+	struct strbuf dirname = STRBUF_INIT;
+	int ret = -1;
+
+	/*
+	 * For the sake of comments in this function, suppose that
+	 * refname is "refs/foo/bar".
+	 */
+
+	assert(err);
+
+	strbuf_grow(&dirname, strlen(refname) + 1);
+	for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
+		/* Expand dirname to the new prefix, not including the trailing slash: */
+		strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
+
+		/*
+		 * We are still at a leading dir of the refname (e.g.,
+		 * "refs/foo"; if there is a reference with that name,
+		 * it is a conflict, *unless* it is in skip.
+		 */
+		if (dir) {
+			pos = search_ref_dir(dir, dirname.buf, dirname.len);
+			if (pos >= 0 &&
+			    (!skip || !string_list_has_string(skip, dirname.buf))) {
+				/*
+				 * We found a reference whose name is
+				 * a proper prefix of refname; e.g.,
+				 * "refs/foo", and is not in skip.
+				 */
+				strbuf_addf(err, "'%s' exists; cannot create '%s'",
+					    dirname.buf, refname);
+				goto cleanup;
+			}
+		}
+
+		if (extras && string_list_has_string(extras, dirname.buf) &&
+		    (!skip || !string_list_has_string(skip, dirname.buf))) {
+			strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
+				    refname, dirname.buf);
+			goto cleanup;
+		}
+
+		/*
+		 * Otherwise, we can try to continue our search with
+		 * the next component. So try to look up the
+		 * directory, e.g., "refs/foo/". If we come up empty,
+		 * we know there is nothing under this whole prefix,
+		 * but even in that case we still have to continue the
+		 * search for conflicts with extras.
+		 */
+		strbuf_addch(&dirname, '/');
+		if (dir) {
+			pos = search_ref_dir(dir, dirname.buf, dirname.len);
+			if (pos < 0) {
+				/*
+				 * There was no directory "refs/foo/",
+				 * so there is nothing under this
+				 * whole prefix. So there is no need
+				 * to continue looking for conflicting
+				 * references. But we need to continue
+				 * looking for conflicting extras.
+				 */
+				dir = NULL;
+			} else {
+				dir = get_ref_dir(dir->entries[pos]);
+			}
+		}
+	}
+
+	/*
+	 * We are at the leaf of our refname (e.g., "refs/foo/bar").
+	 * There is no point in searching for a reference with that
+	 * name, because a refname isn't considered to conflict with
+	 * itself. But we still need to check for references whose
+	 * names are in the "refs/foo/bar/" namespace, because they
+	 * *do* conflict.
+	 */
+	strbuf_addstr(&dirname, refname + dirname.len);
+	strbuf_addch(&dirname, '/');
+
+	if (dir) {
+		pos = search_ref_dir(dir, dirname.buf, dirname.len);
+
+		if (pos >= 0) {
+			/*
+			 * We found a directory named "$refname/"
+			 * (e.g., "refs/foo/bar/"). It is a problem
+			 * iff it contains any ref that is not in
+			 * "skip".
+			 */
+			struct nonmatching_ref_data data;
+
+			data.skip = skip;
+			data.conflicting_refname = NULL;
+			dir = get_ref_dir(dir->entries[pos]);
+			sort_ref_dir(dir);
+			if (do_for_each_entry_in_dir(dir, 0, nonmatching_ref_fn, &data)) {
+				strbuf_addf(err, "'%s' exists; cannot create '%s'",
+					    data.conflicting_refname, refname);
+				goto cleanup;
+			}
+		}
+	}
+
+	extra_refname = find_descendant_ref(dirname.buf, extras, skip);
+	if (extra_refname)
+		strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
+			    refname, extra_refname);
+	else
+		ret = 0;
+
+cleanup:
+	strbuf_release(&dirname);
+	return ret;
+}
+
+struct packed_ref_cache {
+	struct ref_entry *root;
+
+	/*
+	 * Count of references to the data structure in this instance,
+	 * including the pointer from ref_cache::packed if any.  The
+	 * data will not be freed as long as the reference count is
+	 * nonzero.
+	 */
+	unsigned int referrers;
+
+	/*
+	 * Iff the packed-refs file associated with this instance is
+	 * currently locked for writing, this points at the associated
+	 * lock (which is owned by somebody else).  The referrer count
+	 * is also incremented when the file is locked and decremented
+	 * when it is unlocked.
+	 */
+	struct lock_file *lock;
+
+	/* The metadata from when this packed-refs cache was read */
+	struct stat_validity validity;
+};
+
+/*
+ * Future: need to be in "struct repository"
+ * when doing a full libification.
+ */
+static struct ref_cache {
+	struct ref_cache *next;
+	struct ref_entry *loose;
+	struct packed_ref_cache *packed;
+	/*
+	 * The submodule name, or "" for the main repo.  We allocate
+	 * length 1 rather than FLEX_ARRAY so that the main ref_cache
+	 * is initialized correctly.
+	 */
+	char name[1];
+} ref_cache, *submodule_ref_caches;
+
+/* Lock used for the main packed-refs file: */
+static struct lock_file packlock;
+
+/*
+ * Increment the reference count of *packed_refs.
+ */
+static void acquire_packed_ref_cache(struct packed_ref_cache *packed_refs)
+{
+	packed_refs->referrers++;
+}
+
+/*
+ * Decrease the reference count of *packed_refs.  If it goes to zero,
+ * free *packed_refs and return true; otherwise return false.
+ */
+static int release_packed_ref_cache(struct packed_ref_cache *packed_refs)
+{
+	if (!--packed_refs->referrers) {
+		free_ref_entry(packed_refs->root);
+		stat_validity_clear(&packed_refs->validity);
+		free(packed_refs);
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+static void clear_packed_ref_cache(struct ref_cache *refs)
+{
+	if (refs->packed) {
+		struct packed_ref_cache *packed_refs = refs->packed;
+
+		if (packed_refs->lock)
+			die("internal error: packed-ref cache cleared while locked");
+		refs->packed = NULL;
+		release_packed_ref_cache(packed_refs);
+	}
+}
+
+static void clear_loose_ref_cache(struct ref_cache *refs)
+{
+	if (refs->loose) {
+		free_ref_entry(refs->loose);
+		refs->loose = NULL;
+	}
+}
+
+/*
+ * Create a new submodule ref cache and add it to the internal
+ * set of caches.
+ */
+static struct ref_cache *create_ref_cache(const char *submodule)
+{
+	struct ref_cache *refs;
+	if (!submodule)
+		submodule = "";
+	FLEX_ALLOC_STR(refs, name, submodule);
+	refs->next = submodule_ref_caches;
+	submodule_ref_caches = refs;
+	return refs;
+}
+
+static struct ref_cache *lookup_ref_cache(const char *submodule)
+{
+	struct ref_cache *refs;
+
+	if (!submodule || !*submodule)
+		return &ref_cache;
+
+	for (refs = submodule_ref_caches; refs; refs = refs->next)
+		if (!strcmp(submodule, refs->name))
+			return refs;
+	return NULL;
+}
+
+/*
+ * Return a pointer to a ref_cache for the specified submodule. For
+ * the main repository, use submodule==NULL. The returned structure
+ * will be allocated and initialized but not necessarily populated; it
+ * should not be freed.
+ */
+static struct ref_cache *get_ref_cache(const char *submodule)
+{
+	struct ref_cache *refs = lookup_ref_cache(submodule);
+	if (!refs)
+		refs = create_ref_cache(submodule);
+	return refs;
+}
+
+/* The length of a peeled reference line in packed-refs, including EOL: */
+#define PEELED_LINE_LENGTH 42
+
+/*
+ * The packed-refs header line that we write out.  Perhaps other
+ * traits will be added later.  The trailing space is required.
+ */
+static const char PACKED_REFS_HEADER[] =
+	"# pack-refs with: peeled fully-peeled \n";
+
+/*
+ * Parse one line from a packed-refs file.  Write the SHA1 to sha1.
+ * Return a pointer to the refname within the line (null-terminated),
+ * or NULL if there was a problem.
+ */
+static const char *parse_ref_line(struct strbuf *line, unsigned char *sha1)
+{
+	const char *ref;
+
+	/*
+	 * 42: the answer to everything.
+	 *
+	 * In this case, it happens to be the answer to
+	 *  40 (length of sha1 hex representation)
+	 *  +1 (space in between hex and name)
+	 *  +1 (newline at the end of the line)
+	 */
+	if (line->len <= 42)
+		return NULL;
+
+	if (get_sha1_hex(line->buf, sha1) < 0)
+		return NULL;
+	if (!isspace(line->buf[40]))
+		return NULL;
+
+	ref = line->buf + 41;
+	if (isspace(*ref))
+		return NULL;
+
+	if (line->buf[line->len - 1] != '\n')
+		return NULL;
+	line->buf[--line->len] = 0;
+
+	return ref;
+}
+
+/*
+ * Read f, which is a packed-refs file, into dir.
+ *
+ * A comment line of the form "# pack-refs with: " may contain zero or
+ * more traits. We interpret the traits as follows:
+ *
+ *   No traits:
+ *
+ *      Probably no references are peeled. But if the file contains a
+ *      peeled value for a reference, we will use it.
+ *
+ *   peeled:
+ *
+ *      References under "refs/tags/", if they *can* be peeled, *are*
+ *      peeled in this file. References outside of "refs/tags/" are
+ *      probably not peeled even if they could have been, but if we find
+ *      a peeled value for such a reference we will use it.
+ *
+ *   fully-peeled:
+ *
+ *      All references in the file that can be peeled are peeled.
+ *      Inversely (and this is more important), any references in the
+ *      file for which no peeled value is recorded is not peelable. This
+ *      trait should typically be written alongside "peeled" for
+ *      compatibility with older clients, but we do not require it
+ *      (i.e., "peeled" is a no-op if "fully-peeled" is set).
+ */
+static void read_packed_refs(FILE *f, struct ref_dir *dir)
+{
+	struct ref_entry *last = NULL;
+	struct strbuf line = STRBUF_INIT;
+	enum { PEELED_NONE, PEELED_TAGS, PEELED_FULLY } peeled = PEELED_NONE;
+
+	while (strbuf_getwholeline(&line, f, '\n') != EOF) {
+		unsigned char sha1[20];
+		const char *refname;
+		const char *traits;
+
+		if (skip_prefix(line.buf, "# pack-refs with:", &traits)) {
+			if (strstr(traits, " fully-peeled "))
+				peeled = PEELED_FULLY;
+			else if (strstr(traits, " peeled "))
+				peeled = PEELED_TAGS;
+			/* perhaps other traits later as well */
+			continue;
+		}
+
+		refname = parse_ref_line(&line, sha1);
+		if (refname) {
+			int flag = REF_ISPACKED;
+
+			if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
+				if (!refname_is_safe(refname))
+					die("packed refname is dangerous: %s", refname);
+				hashclr(sha1);
+				flag |= REF_BAD_NAME | REF_ISBROKEN;
+			}
+			last = create_ref_entry(refname, sha1, flag, 0);
+			if (peeled == PEELED_FULLY ||
+			    (peeled == PEELED_TAGS && starts_with(refname, "refs/tags/")))
+				last->flag |= REF_KNOWS_PEELED;
+			add_ref(dir, last);
+			continue;
+		}
+		if (last &&
+		    line.buf[0] == '^' &&
+		    line.len == PEELED_LINE_LENGTH &&
+		    line.buf[PEELED_LINE_LENGTH - 1] == '\n' &&
+		    !get_sha1_hex(line.buf + 1, sha1)) {
+			hashcpy(last->u.value.peeled.hash, sha1);
+			/*
+			 * Regardless of what the file header said,
+			 * we definitely know the value of *this*
+			 * reference:
+			 */
+			last->flag |= REF_KNOWS_PEELED;
+		}
+	}
+
+	strbuf_release(&line);
+}
+
+/*
+ * Get the packed_ref_cache for the specified ref_cache, creating it
+ * if necessary.
+ */
+static struct packed_ref_cache *get_packed_ref_cache(struct ref_cache *refs)
+{
+	char *packed_refs_file;
+
+	if (*refs->name)
+		packed_refs_file = git_pathdup_submodule(refs->name, "packed-refs");
+	else
+		packed_refs_file = git_pathdup("packed-refs");
+
+	if (refs->packed &&
+	    !stat_validity_check(&refs->packed->validity, packed_refs_file))
+		clear_packed_ref_cache(refs);
+
+	if (!refs->packed) {
+		FILE *f;
+
+		refs->packed = xcalloc(1, sizeof(*refs->packed));
+		acquire_packed_ref_cache(refs->packed);
+		refs->packed->root = create_dir_entry(refs, "", 0, 0);
+		f = fopen(packed_refs_file, "r");
+		if (f) {
+			stat_validity_update(&refs->packed->validity, fileno(f));
+			read_packed_refs(f, get_ref_dir(refs->packed->root));
+			fclose(f);
+		}
+	}
+	free(packed_refs_file);
+	return refs->packed;
+}
+
+static struct ref_dir *get_packed_ref_dir(struct packed_ref_cache *packed_ref_cache)
+{
+	return get_ref_dir(packed_ref_cache->root);
+}
+
+static struct ref_dir *get_packed_refs(struct ref_cache *refs)
+{
+	return get_packed_ref_dir(get_packed_ref_cache(refs));
+}
+
+/*
+ * Add a reference to the in-memory packed reference cache.  This may
+ * only be called while the packed-refs file is locked (see
+ * lock_packed_refs()).  To actually write the packed-refs file, call
+ * commit_packed_refs().
+ */
+static void add_packed_ref(const char *refname, const unsigned char *sha1)
+{
+	struct packed_ref_cache *packed_ref_cache =
+		get_packed_ref_cache(&ref_cache);
+
+	if (!packed_ref_cache->lock)
+		die("internal error: packed refs not locked");
+	add_ref(get_packed_ref_dir(packed_ref_cache),
+		create_ref_entry(refname, sha1, REF_ISPACKED, 1));
+}
+
+/*
+ * Read the loose references from the namespace dirname into dir
+ * (without recursing).  dirname must end with '/'.  dir must be the
+ * directory entry corresponding to dirname.
+ */
+static void read_loose_refs(const char *dirname, struct ref_dir *dir)
+{
+	struct ref_cache *refs = dir->ref_cache;
+	DIR *d;
+	struct dirent *de;
+	int dirnamelen = strlen(dirname);
+	struct strbuf refname;
+	struct strbuf path = STRBUF_INIT;
+	size_t path_baselen;
+
+	if (*refs->name)
+		strbuf_git_path_submodule(&path, refs->name, "%s", dirname);
+	else
+		strbuf_git_path(&path, "%s", dirname);
+	path_baselen = path.len;
+
+	d = opendir(path.buf);
+	if (!d) {
+		strbuf_release(&path);
+		return;
+	}
+
+	strbuf_init(&refname, dirnamelen + 257);
+	strbuf_add(&refname, dirname, dirnamelen);
+
+	while ((de = readdir(d)) != NULL) {
+		unsigned char sha1[20];
+		struct stat st;
+		int flag;
+
+		if (de->d_name[0] == '.')
+			continue;
+		if (ends_with(de->d_name, ".lock"))
+			continue;
+		strbuf_addstr(&refname, de->d_name);
+		strbuf_addstr(&path, de->d_name);
+		if (stat(path.buf, &st) < 0) {
+			; /* silently ignore */
+		} else if (S_ISDIR(st.st_mode)) {
+			strbuf_addch(&refname, '/');
+			add_entry_to_dir(dir,
+					 create_dir_entry(refs, refname.buf,
+							  refname.len, 1));
+		} else {
+			int read_ok;
+
+			if (*refs->name) {
+				hashclr(sha1);
+				flag = 0;
+				read_ok = !resolve_gitlink_ref(refs->name,
+							       refname.buf, sha1);
+			} else {
+				read_ok = !read_ref_full(refname.buf,
+							 RESOLVE_REF_READING,
+							 sha1, &flag);
+			}
+
+			if (!read_ok) {
+				hashclr(sha1);
+				flag |= REF_ISBROKEN;
+			} else if (is_null_sha1(sha1)) {
+				/*
+				 * It is so astronomically unlikely
+				 * that NULL_SHA1 is the SHA-1 of an
+				 * actual object that we consider its
+				 * appearance in a loose reference
+				 * file to be repo corruption
+				 * (probably due to a software bug).
+				 */
+				flag |= REF_ISBROKEN;
+			}
+
+			if (check_refname_format(refname.buf,
+						 REFNAME_ALLOW_ONELEVEL)) {
+				if (!refname_is_safe(refname.buf))
+					die("loose refname is dangerous: %s", refname.buf);
+				hashclr(sha1);
+				flag |= REF_BAD_NAME | REF_ISBROKEN;
+			}
+			add_entry_to_dir(dir,
+					 create_ref_entry(refname.buf, sha1, flag, 0));
+		}
+		strbuf_setlen(&refname, dirnamelen);
+		strbuf_setlen(&path, path_baselen);
+	}
+	strbuf_release(&refname);
+	strbuf_release(&path);
+	closedir(d);
+}
+
+static struct ref_dir *get_loose_refs(struct ref_cache *refs)
+{
+	if (!refs->loose) {
+		/*
+		 * Mark the top-level directory complete because we
+		 * are about to read the only subdirectory that can
+		 * hold references:
+		 */
+		refs->loose = create_dir_entry(refs, "", 0, 0);
+		/*
+		 * Create an incomplete entry for "refs/":
+		 */
+		add_entry_to_dir(get_ref_dir(refs->loose),
+				 create_dir_entry(refs, "refs/", 5, 1));
+	}
+	return get_ref_dir(refs->loose);
+}
+
+/* We allow "recursive" symbolic refs. Only within reason, though */
+#define MAXDEPTH 5
+#define MAXREFLEN (1024)
+
+/*
+ * Called by resolve_gitlink_ref_recursive() after it failed to read
+ * from the loose refs in ref_cache refs. Find <refname> in the
+ * packed-refs file for the submodule.
+ */
+static int resolve_gitlink_packed_ref(struct ref_cache *refs,
+				      const char *refname, unsigned char *sha1)
+{
+	struct ref_entry *ref;
+	struct ref_dir *dir = get_packed_refs(refs);
+
+	ref = find_ref(dir, refname);
+	if (ref == NULL)
+		return -1;
+
+	hashcpy(sha1, ref->u.value.oid.hash);
+	return 0;
+}
+
+static int resolve_gitlink_ref_recursive(struct ref_cache *refs,
+					 const char *refname, unsigned char *sha1,
+					 int recursion)
+{
+	int fd, len;
+	char buffer[128], *p;
+	char *path;
+
+	if (recursion > MAXDEPTH || strlen(refname) > MAXREFLEN)
+		return -1;
+	path = *refs->name
+		? git_pathdup_submodule(refs->name, "%s", refname)
+		: git_pathdup("%s", refname);
+	fd = open(path, O_RDONLY);
+	free(path);
+	if (fd < 0)
+		return resolve_gitlink_packed_ref(refs, refname, sha1);
+
+	len = read(fd, buffer, sizeof(buffer)-1);
+	close(fd);
+	if (len < 0)
+		return -1;
+	while (len && isspace(buffer[len-1]))
+		len--;
+	buffer[len] = 0;
+
+	/* Was it a detached head or an old-fashioned symlink? */
+	if (!get_sha1_hex(buffer, sha1))
+		return 0;
+
+	/* Symref? */
+	if (strncmp(buffer, "ref:", 4))
+		return -1;
+	p = buffer + 4;
+	while (isspace(*p))
+		p++;
+
+	return resolve_gitlink_ref_recursive(refs, p, sha1, recursion+1);
+}
+
+int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1)
+{
+	int len = strlen(path), retval;
+	struct strbuf submodule = STRBUF_INIT;
+	struct ref_cache *refs;
+
+	while (len && path[len-1] == '/')
+		len--;
+	if (!len)
+		return -1;
+
+	strbuf_add(&submodule, path, len);
+	refs = lookup_ref_cache(submodule.buf);
+	if (!refs) {
+		if (!is_nonbare_repository_dir(&submodule)) {
+			strbuf_release(&submodule);
+			return -1;
+		}
+		refs = create_ref_cache(submodule.buf);
+	}
+	strbuf_release(&submodule);
+
+	retval = resolve_gitlink_ref_recursive(refs, refname, sha1, 0);
+	return retval;
+}
+
+/*
+ * Return the ref_entry for the given refname from the packed
+ * references.  If it does not exist, return NULL.
+ */
+static struct ref_entry *get_packed_ref(const char *refname)
+{
+	return find_ref(get_packed_refs(&ref_cache), refname);
+}
+
+/*
+ * A loose ref file doesn't exist; check for a packed ref.  The
+ * options are forwarded from resolve_safe_unsafe().
+ */
+static int resolve_missing_loose_ref(const char *refname,
+				     int resolve_flags,
+				     unsigned char *sha1,
+				     int *flags)
+{
+	struct ref_entry *entry;
+
+	/*
+	 * The loose reference file does not exist; check for a packed
+	 * reference.
+	 */
+	entry = get_packed_ref(refname);
+	if (entry) {
+		hashcpy(sha1, entry->u.value.oid.hash);
+		if (flags)
+			*flags |= REF_ISPACKED;
+		return 0;
+	}
+	/* The reference is not a packed reference, either. */
+	if (resolve_flags & RESOLVE_REF_READING) {
+		errno = ENOENT;
+		return -1;
+	} else {
+		hashclr(sha1);
+		return 0;
+	}
+}
+
+/* This function needs to return a meaningful errno on failure */
+static const char *resolve_ref_1(const char *refname,
+				 int resolve_flags,
+				 unsigned char *sha1,
+				 int *flags,
+				 struct strbuf *sb_refname,
+				 struct strbuf *sb_path,
+				 struct strbuf *sb_contents)
+{
+	int depth = MAXDEPTH;
+	int bad_name = 0;
+
+	if (flags)
+		*flags = 0;
+
+	if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
+		if (flags)
+			*flags |= REF_BAD_NAME;
+
+		if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
+		    !refname_is_safe(refname)) {
+			errno = EINVAL;
+			return NULL;
+		}
+		/*
+		 * dwim_ref() uses REF_ISBROKEN to distinguish between
+		 * missing refs and refs that were present but invalid,
+		 * to complain about the latter to stderr.
+		 *
+		 * We don't know whether the ref exists, so don't set
+		 * REF_ISBROKEN yet.
+		 */
+		bad_name = 1;
+	}
+	for (;;) {
+		const char *path;
+		struct stat st;
+		char *buf;
+		int fd;
+
+		if (--depth < 0) {
+			errno = ELOOP;
+			return NULL;
+		}
+
+		strbuf_reset(sb_path);
+		strbuf_git_path(sb_path, "%s", refname);
+		path = sb_path->buf;
+
+		/*
+		 * We might have to loop back here to avoid a race
+		 * condition: first we lstat() the file, then we try
+		 * to read it as a link or as a file.  But if somebody
+		 * changes the type of the file (file <-> directory
+		 * <-> symlink) between the lstat() and reading, then
+		 * we don't want to report that as an error but rather
+		 * try again starting with the lstat().
+		 */
+	stat_ref:
+		if (lstat(path, &st) < 0) {
+			if (errno != ENOENT)
+				return NULL;
+			if (resolve_missing_loose_ref(refname, resolve_flags,
+						      sha1, flags))
+				return NULL;
+			if (bad_name) {
+				hashclr(sha1);
+				if (flags)
+					*flags |= REF_ISBROKEN;
+			}
+			return refname;
+		}
+
+		/* Follow "normalized" - ie "refs/.." symlinks by hand */
+		if (S_ISLNK(st.st_mode)) {
+			strbuf_reset(sb_contents);
+			if (strbuf_readlink(sb_contents, path, 0) < 0) {
+				if (errno == ENOENT || errno == EINVAL)
+					/* inconsistent with lstat; retry */
+					goto stat_ref;
+				else
+					return NULL;
+			}
+			if (starts_with(sb_contents->buf, "refs/") &&
+			    !check_refname_format(sb_contents->buf, 0)) {
+				strbuf_swap(sb_refname, sb_contents);
+				refname = sb_refname->buf;
+				if (flags)
+					*flags |= REF_ISSYMREF;
+				if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
+					hashclr(sha1);
+					return refname;
+				}
+				continue;
+			}
+		}
+
+		/* Is it a directory? */
+		if (S_ISDIR(st.st_mode)) {
+			errno = EISDIR;
+			return NULL;
+		}
+
+		/*
+		 * Anything else, just open it and try to use it as
+		 * a ref
+		 */
+		fd = open(path, O_RDONLY);
+		if (fd < 0) {
+			if (errno == ENOENT)
+				/* inconsistent with lstat; retry */
+				goto stat_ref;
+			else
+				return NULL;
+		}
+		strbuf_reset(sb_contents);
+		if (strbuf_read(sb_contents, fd, 256) < 0) {
+			int save_errno = errno;
+			close(fd);
+			errno = save_errno;
+			return NULL;
+		}
+		close(fd);
+		strbuf_rtrim(sb_contents);
+
+		/*
+		 * Is it a symbolic ref?
+		 */
+		if (!starts_with(sb_contents->buf, "ref:")) {
+			/*
+			 * Please note that FETCH_HEAD has a second
+			 * line containing other data.
+			 */
+			if (get_sha1_hex(sb_contents->buf, sha1) ||
+			    (sb_contents->buf[40] != '\0' && !isspace(sb_contents->buf[40]))) {
+				if (flags)
+					*flags |= REF_ISBROKEN;
+				errno = EINVAL;
+				return NULL;
+			}
+			if (bad_name) {
+				hashclr(sha1);
+				if (flags)
+					*flags |= REF_ISBROKEN;
+			}
+			return refname;
+		}
+		if (flags)
+			*flags |= REF_ISSYMREF;
+		buf = sb_contents->buf + 4;
+		while (isspace(*buf))
+			buf++;
+		strbuf_reset(sb_refname);
+		strbuf_addstr(sb_refname, buf);
+		refname = sb_refname->buf;
+		if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
+			hashclr(sha1);
+			return refname;
+		}
+		if (check_refname_format(buf, REFNAME_ALLOW_ONELEVEL)) {
+			if (flags)
+				*flags |= REF_ISBROKEN;
+
+			if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
+			    !refname_is_safe(buf)) {
+				errno = EINVAL;
+				return NULL;
+			}
+			bad_name = 1;
+		}
+	}
+}
+
+const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
+			       unsigned char *sha1, int *flags)
+{
+	static struct strbuf sb_refname = STRBUF_INIT;
+	struct strbuf sb_contents = STRBUF_INIT;
+	struct strbuf sb_path = STRBUF_INIT;
+	const char *ret;
+
+	ret = resolve_ref_1(refname, resolve_flags, sha1, flags,
+			    &sb_refname, &sb_path, &sb_contents);
+	strbuf_release(&sb_path);
+	strbuf_release(&sb_contents);
+	return ret;
+}
+
+/*
+ * Peel the entry (if possible) and return its new peel_status.  If
+ * repeel is true, re-peel the entry even if there is an old peeled
+ * value that is already stored in it.
+ *
+ * It is OK to call this function with a packed reference entry that
+ * might be stale and might even refer to an object that has since
+ * been garbage-collected.  In such a case, if the entry has
+ * REF_KNOWS_PEELED then leave the status unchanged and return
+ * PEEL_PEELED or PEEL_NON_TAG; otherwise, return PEEL_INVALID.
+ */
+static enum peel_status peel_entry(struct ref_entry *entry, int repeel)
+{
+	enum peel_status status;
+
+	if (entry->flag & REF_KNOWS_PEELED) {
+		if (repeel) {
+			entry->flag &= ~REF_KNOWS_PEELED;
+			oidclr(&entry->u.value.peeled);
+		} else {
+			return is_null_oid(&entry->u.value.peeled) ?
+				PEEL_NON_TAG : PEEL_PEELED;
+		}
+	}
+	if (entry->flag & REF_ISBROKEN)
+		return PEEL_BROKEN;
+	if (entry->flag & REF_ISSYMREF)
+		return PEEL_IS_SYMREF;
+
+	status = peel_object(entry->u.value.oid.hash, entry->u.value.peeled.hash);
+	if (status == PEEL_PEELED || status == PEEL_NON_TAG)
+		entry->flag |= REF_KNOWS_PEELED;
+	return status;
+}
+
+int peel_ref(const char *refname, unsigned char *sha1)
+{
+	int flag;
+	unsigned char base[20];
+
+	if (current_ref && (current_ref->name == refname
+			    || !strcmp(current_ref->name, refname))) {
+		if (peel_entry(current_ref, 0))
+			return -1;
+		hashcpy(sha1, current_ref->u.value.peeled.hash);
+		return 0;
+	}
+
+	if (read_ref_full(refname, RESOLVE_REF_READING, base, &flag))
+		return -1;
+
+	/*
+	 * If the reference is packed, read its ref_entry from the
+	 * cache in the hope that we already know its peeled value.
+	 * We only try this optimization on packed references because
+	 * (a) forcing the filling of the loose reference cache could
+	 * be expensive and (b) loose references anyway usually do not
+	 * have REF_KNOWS_PEELED.
+	 */
+	if (flag & REF_ISPACKED) {
+		struct ref_entry *r = get_packed_ref(refname);
+		if (r) {
+			if (peel_entry(r, 0))
+				return -1;
+			hashcpy(sha1, r->u.value.peeled.hash);
+			return 0;
+		}
+	}
+
+	return peel_object(base, sha1);
+}
+
+/*
+ * Call fn for each reference in the specified ref_cache, omitting
+ * references not in the containing_dir of base.  fn is called for all
+ * references, including broken ones.  If fn ever returns a non-zero
+ * value, stop the iteration and return that value; otherwise, return
+ * 0.
+ */
+static int do_for_each_entry(struct ref_cache *refs, const char *base,
+			     each_ref_entry_fn fn, void *cb_data)
+{
+	struct packed_ref_cache *packed_ref_cache;
+	struct ref_dir *loose_dir;
+	struct ref_dir *packed_dir;
+	int retval = 0;
+
+	/*
+	 * We must make sure that all loose refs are read before accessing the
+	 * packed-refs file; this avoids a race condition in which loose refs
+	 * are migrated to the packed-refs file by a simultaneous process, but
+	 * our in-memory view is from before the migration. get_packed_ref_cache()
+	 * takes care of making sure our view is up to date with what is on
+	 * disk.
+	 */
+	loose_dir = get_loose_refs(refs);
+	if (base && *base) {
+		loose_dir = find_containing_dir(loose_dir, base, 0);
+	}
+	if (loose_dir)
+		prime_ref_dir(loose_dir);
+
+	packed_ref_cache = get_packed_ref_cache(refs);
+	acquire_packed_ref_cache(packed_ref_cache);
+	packed_dir = get_packed_ref_dir(packed_ref_cache);
+	if (base && *base) {
+		packed_dir = find_containing_dir(packed_dir, base, 0);
+	}
+
+	if (packed_dir && loose_dir) {
+		sort_ref_dir(packed_dir);
+		sort_ref_dir(loose_dir);
+		retval = do_for_each_entry_in_dirs(
+				packed_dir, loose_dir, fn, cb_data);
+	} else if (packed_dir) {
+		sort_ref_dir(packed_dir);
+		retval = do_for_each_entry_in_dir(
+				packed_dir, 0, fn, cb_data);
+	} else if (loose_dir) {
+		sort_ref_dir(loose_dir);
+		retval = do_for_each_entry_in_dir(
+				loose_dir, 0, fn, cb_data);
+	}
+
+	release_packed_ref_cache(packed_ref_cache);
+	return retval;
+}
+
+/*
+ * Call fn for each reference in the specified ref_cache for which the
+ * refname begins with base.  If trim is non-zero, then trim that many
+ * characters off the beginning of each refname before passing the
+ * refname to fn.  flags can be DO_FOR_EACH_INCLUDE_BROKEN to include
+ * broken references in the iteration.  If fn ever returns a non-zero
+ * value, stop the iteration and return that value; otherwise, return
+ * 0.
+ */
+static int do_for_each_ref(struct ref_cache *refs, const char *base,
+			   each_ref_fn fn, int trim, int flags, void *cb_data)
+{
+	struct ref_entry_cb data;
+	data.base = base;
+	data.trim = trim;
+	data.flags = flags;
+	data.fn = fn;
+	data.cb_data = cb_data;
+
+	if (ref_paranoia < 0)
+		ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0);
+	if (ref_paranoia)
+		data.flags |= DO_FOR_EACH_INCLUDE_BROKEN;
+
+	return do_for_each_entry(refs, base, do_one_ref, &data);
+}
+
+static int do_head_ref(const char *submodule, each_ref_fn fn, void *cb_data)
+{
+	struct object_id oid;
+	int flag;
+
+	if (submodule) {
+		if (resolve_gitlink_ref(submodule, "HEAD", oid.hash) == 0)
+			return fn("HEAD", &oid, 0, cb_data);
+
+		return 0;
+	}
+
+	if (!read_ref_full("HEAD", RESOLVE_REF_READING, oid.hash, &flag))
+		return fn("HEAD", &oid, flag, cb_data);
+
+	return 0;
+}
+
+int head_ref(each_ref_fn fn, void *cb_data)
+{
+	return do_head_ref(NULL, fn, cb_data);
+}
+
+int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
+{
+	return do_head_ref(submodule, fn, cb_data);
+}
+
+int for_each_ref(each_ref_fn fn, void *cb_data)
+{
+	return do_for_each_ref(&ref_cache, "", fn, 0, 0, cb_data);
+}
+
+int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
+{
+	return do_for_each_ref(get_ref_cache(submodule), "", fn, 0, 0, cb_data);
+}
+
+int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
+{
+	return do_for_each_ref(&ref_cache, prefix, fn, strlen(prefix), 0, cb_data);
+}
+
+int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
+{
+	unsigned int flag = 0;
+
+	if (broken)
+		flag = DO_FOR_EACH_INCLUDE_BROKEN;
+	return do_for_each_ref(&ref_cache, prefix, fn, 0, flag, cb_data);
+}
+
+int for_each_ref_in_submodule(const char *submodule, const char *prefix,
+		each_ref_fn fn, void *cb_data)
+{
+	return do_for_each_ref(get_ref_cache(submodule), prefix, fn, strlen(prefix), 0, cb_data);
+}
+
+int for_each_replace_ref(each_ref_fn fn, void *cb_data)
+{
+	return do_for_each_ref(&ref_cache, git_replace_ref_base, fn,
+			       strlen(git_replace_ref_base), 0, cb_data);
+}
+
+int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
+{
+	struct strbuf buf = STRBUF_INIT;
+	int ret;
+	strbuf_addf(&buf, "%srefs/", get_git_namespace());
+	ret = do_for_each_ref(&ref_cache, buf.buf, fn, 0, 0, cb_data);
+	strbuf_release(&buf);
+	return ret;
+}
+
+int for_each_rawref(each_ref_fn fn, void *cb_data)
+{
+	return do_for_each_ref(&ref_cache, "", fn, 0,
+			       DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
+}
+
+static void unlock_ref(struct ref_lock *lock)
+{
+	/* Do not free lock->lk -- atexit() still looks at them */
+	if (lock->lk)
+		rollback_lock_file(lock->lk);
+	free(lock->ref_name);
+	free(lock->orig_ref_name);
+	free(lock);
+}
+
+/*
+ * Verify that the reference locked by lock has the value old_sha1.
+ * Fail if the reference doesn't exist and mustexist is set. Return 0
+ * on success. On error, write an error message to err, set errno, and
+ * return a negative value.
+ */
+static int verify_lock(struct ref_lock *lock,
+		       const unsigned char *old_sha1, int mustexist,
+		       struct strbuf *err)
+{
+	assert(err);
+
+	if (read_ref_full(lock->ref_name,
+			  mustexist ? RESOLVE_REF_READING : 0,
+			  lock->old_oid.hash, NULL)) {
+		int save_errno = errno;
+		strbuf_addf(err, "can't verify ref %s", lock->ref_name);
+		errno = save_errno;
+		return -1;
+	}
+	if (hashcmp(lock->old_oid.hash, old_sha1)) {
+		strbuf_addf(err, "ref %s is at %s but expected %s",
+			    lock->ref_name,
+			    sha1_to_hex(lock->old_oid.hash),
+			    sha1_to_hex(old_sha1));
+		errno = EBUSY;
+		return -1;
+	}
+	return 0;
+}
+
+static int remove_empty_directories(struct strbuf *path)
+{
+	/*
+	 * we want to create a file but there is a directory there;
+	 * if that is an empty directory (or a directory that contains
+	 * only empty directories), remove them.
+	 */
+	return remove_dir_recursively(path, REMOVE_DIR_EMPTY_ONLY);
+}
+
+/*
+ * Locks a ref returning the lock on success and NULL on failure.
+ * On failure errno is set to something meaningful.
+ */
+static struct ref_lock *lock_ref_sha1_basic(const char *refname,
+					    const unsigned char *old_sha1,
+					    const struct string_list *extras,
+					    const struct string_list *skip,
+					    unsigned int flags, int *type_p,
+					    struct strbuf *err)
+{
+	struct strbuf ref_file = STRBUF_INIT;
+	struct strbuf orig_ref_file = STRBUF_INIT;
+	const char *orig_refname = refname;
+	struct ref_lock *lock;
+	int last_errno = 0;
+	int type, lflags;
+	int mustexist = (old_sha1 && !is_null_sha1(old_sha1));
+	int resolve_flags = 0;
+	int attempts_remaining = 3;
+
+	assert(err);
+
+	lock = xcalloc(1, sizeof(struct ref_lock));
+
+	if (mustexist)
+		resolve_flags |= RESOLVE_REF_READING;
+	if (flags & REF_DELETING) {
+		resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME;
+		if (flags & REF_NODEREF)
+			resolve_flags |= RESOLVE_REF_NO_RECURSE;
+	}
+
+	refname = resolve_ref_unsafe(refname, resolve_flags,
+				     lock->old_oid.hash, &type);
+	if (!refname && errno == EISDIR) {
+		/*
+		 * we are trying to lock foo but we used to
+		 * have foo/bar which now does not exist;
+		 * it is normal for the empty directory 'foo'
+		 * to remain.
+		 */
+		strbuf_git_path(&orig_ref_file, "%s", orig_refname);
+		if (remove_empty_directories(&orig_ref_file)) {
+			last_errno = errno;
+			if (!verify_refname_available_dir(orig_refname, extras, skip,
+							  get_loose_refs(&ref_cache), err))
+				strbuf_addf(err, "there are still refs under '%s'",
+					    orig_refname);
+			goto error_return;
+		}
+		refname = resolve_ref_unsafe(orig_refname, resolve_flags,
+					     lock->old_oid.hash, &type);
+	}
+	if (type_p)
+	    *type_p = type;
+	if (!refname) {
+		last_errno = errno;
+		if (last_errno != ENOTDIR ||
+		    !verify_refname_available_dir(orig_refname, extras, skip,
+						  get_loose_refs(&ref_cache), err))
+			strbuf_addf(err, "unable to resolve reference %s: %s",
+				    orig_refname, strerror(last_errno));
+
+		goto error_return;
+	}
+	/*
+	 * If the ref did not exist and we are creating it, make sure
+	 * there is no existing packed ref whose name begins with our
+	 * refname, nor a packed ref whose name is a proper prefix of
+	 * our refname.
+	 */
+	if (is_null_oid(&lock->old_oid) &&
+	    verify_refname_available_dir(refname, extras, skip,
+					 get_packed_refs(&ref_cache), err)) {
+		last_errno = ENOTDIR;
+		goto error_return;
+	}
+
+	lock->lk = xcalloc(1, sizeof(struct lock_file));
+
+	lflags = 0;
+	if (flags & REF_NODEREF) {
+		refname = orig_refname;
+		lflags |= LOCK_NO_DEREF;
+	}
+	lock->ref_name = xstrdup(refname);
+	lock->orig_ref_name = xstrdup(orig_refname);
+	strbuf_git_path(&ref_file, "%s", refname);
+
+ retry:
+	switch (safe_create_leading_directories_const(ref_file.buf)) {
+	case SCLD_OK:
+		break; /* success */
+	case SCLD_VANISHED:
+		if (--attempts_remaining > 0)
+			goto retry;
+		/* fall through */
+	default:
+		last_errno = errno;
+		strbuf_addf(err, "unable to create directory for %s",
+			    ref_file.buf);
+		goto error_return;
+	}
+
+	if (hold_lock_file_for_update(lock->lk, ref_file.buf, lflags) < 0) {
+		last_errno = errno;
+		if (errno == ENOENT && --attempts_remaining > 0)
+			/*
+			 * Maybe somebody just deleted one of the
+			 * directories leading to ref_file.  Try
+			 * again:
+			 */
+			goto retry;
+		else {
+			unable_to_lock_message(ref_file.buf, errno, err);
+			goto error_return;
+		}
+	}
+	if (old_sha1 && verify_lock(lock, old_sha1, mustexist, err)) {
+		last_errno = errno;
+		goto error_return;
+	}
+	goto out;
+
+ error_return:
+	unlock_ref(lock);
+	lock = NULL;
+
+ out:
+	strbuf_release(&ref_file);
+	strbuf_release(&orig_ref_file);
+	errno = last_errno;
+	return lock;
+}
+
+/*
+ * Write an entry to the packed-refs file for the specified refname.
+ * If peeled is non-NULL, write it as the entry's peeled value.
+ */
+static void write_packed_entry(FILE *fh, char *refname, unsigned char *sha1,
+			       unsigned char *peeled)
+{
+	fprintf_or_die(fh, "%s %s\n", sha1_to_hex(sha1), refname);
+	if (peeled)
+		fprintf_or_die(fh, "^%s\n", sha1_to_hex(peeled));
+}
+
+/*
+ * An each_ref_entry_fn that writes the entry to a packed-refs file.
+ */
+static int write_packed_entry_fn(struct ref_entry *entry, void *cb_data)
+{
+	enum peel_status peel_status = peel_entry(entry, 0);
+
+	if (peel_status != PEEL_PEELED && peel_status != PEEL_NON_TAG)
+		error("internal error: %s is not a valid packed reference!",
+		      entry->name);
+	write_packed_entry(cb_data, entry->name, entry->u.value.oid.hash,
+			   peel_status == PEEL_PEELED ?
+			   entry->u.value.peeled.hash : NULL);
+	return 0;
+}
+
+/*
+ * Lock the packed-refs file for writing. Flags is passed to
+ * hold_lock_file_for_update(). Return 0 on success. On errors, set
+ * errno appropriately and return a nonzero value.
+ */
+static int lock_packed_refs(int flags)
+{
+	static int timeout_configured = 0;
+	static int timeout_value = 1000;
+
+	struct packed_ref_cache *packed_ref_cache;
+
+	if (!timeout_configured) {
+		git_config_get_int("core.packedrefstimeout", &timeout_value);
+		timeout_configured = 1;
+	}
+
+	if (hold_lock_file_for_update_timeout(
+			    &packlock, git_path("packed-refs"),
+			    flags, timeout_value) < 0)
+		return -1;
+	/*
+	 * Get the current packed-refs while holding the lock.  If the
+	 * packed-refs file has been modified since we last read it,
+	 * this will automatically invalidate the cache and re-read
+	 * the packed-refs file.
+	 */
+	packed_ref_cache = get_packed_ref_cache(&ref_cache);
+	packed_ref_cache->lock = &packlock;
+	/* Increment the reference count to prevent it from being freed: */
+	acquire_packed_ref_cache(packed_ref_cache);
+	return 0;
+}
+
+/*
+ * Write the current version of the packed refs cache from memory to
+ * disk. The packed-refs file must already be locked for writing (see
+ * lock_packed_refs()). Return zero on success. On errors, set errno
+ * and return a nonzero value
+ */
+static int commit_packed_refs(void)
+{
+	struct packed_ref_cache *packed_ref_cache =
+		get_packed_ref_cache(&ref_cache);
+	int error = 0;
+	int save_errno = 0;
+	FILE *out;
+
+	if (!packed_ref_cache->lock)
+		die("internal error: packed-refs not locked");
+
+	out = fdopen_lock_file(packed_ref_cache->lock, "w");
+	if (!out)
+		die_errno("unable to fdopen packed-refs descriptor");
+
+	fprintf_or_die(out, "%s", PACKED_REFS_HEADER);
+	do_for_each_entry_in_dir(get_packed_ref_dir(packed_ref_cache),
+				 0, write_packed_entry_fn, out);
+
+	if (commit_lock_file(packed_ref_cache->lock)) {
+		save_errno = errno;
+		error = -1;
+	}
+	packed_ref_cache->lock = NULL;
+	release_packed_ref_cache(packed_ref_cache);
+	errno = save_errno;
+	return error;
+}
+
+/*
+ * Rollback the lockfile for the packed-refs file, and discard the
+ * in-memory packed reference cache.  (The packed-refs file will be
+ * read anew if it is needed again after this function is called.)
+ */
+static void rollback_packed_refs(void)
+{
+	struct packed_ref_cache *packed_ref_cache =
+		get_packed_ref_cache(&ref_cache);
+
+	if (!packed_ref_cache->lock)
+		die("internal error: packed-refs not locked");
+	rollback_lock_file(packed_ref_cache->lock);
+	packed_ref_cache->lock = NULL;
+	release_packed_ref_cache(packed_ref_cache);
+	clear_packed_ref_cache(&ref_cache);
+}
+
+struct ref_to_prune {
+	struct ref_to_prune *next;
+	unsigned char sha1[20];
+	char name[FLEX_ARRAY];
+};
+
+struct pack_refs_cb_data {
+	unsigned int flags;
+	struct ref_dir *packed_refs;
+	struct ref_to_prune *ref_to_prune;
+};
+
+/*
+ * An each_ref_entry_fn that is run over loose references only.  If
+ * the loose reference can be packed, add an entry in the packed ref
+ * cache.  If the reference should be pruned, also add it to
+ * ref_to_prune in the pack_refs_cb_data.
+ */
+static int pack_if_possible_fn(struct ref_entry *entry, void *cb_data)
+{
+	struct pack_refs_cb_data *cb = cb_data;
+	enum peel_status peel_status;
+	struct ref_entry *packed_entry;
+	int is_tag_ref = starts_with(entry->name, "refs/tags/");
+
+	/* Do not pack per-worktree refs: */
+	if (ref_type(entry->name) != REF_TYPE_NORMAL)
+		return 0;
+
+	/* ALWAYS pack tags */
+	if (!(cb->flags & PACK_REFS_ALL) && !is_tag_ref)
+		return 0;
+
+	/* Do not pack symbolic or broken refs: */
+	if ((entry->flag & REF_ISSYMREF) || !ref_resolves_to_object(entry))
+		return 0;
+
+	/* Add a packed ref cache entry equivalent to the loose entry. */
+	peel_status = peel_entry(entry, 1);
+	if (peel_status != PEEL_PEELED && peel_status != PEEL_NON_TAG)
+		die("internal error peeling reference %s (%s)",
+		    entry->name, oid_to_hex(&entry->u.value.oid));
+	packed_entry = find_ref(cb->packed_refs, entry->name);
+	if (packed_entry) {
+		/* Overwrite existing packed entry with info from loose entry */
+		packed_entry->flag = REF_ISPACKED | REF_KNOWS_PEELED;
+		oidcpy(&packed_entry->u.value.oid, &entry->u.value.oid);
+	} else {
+		packed_entry = create_ref_entry(entry->name, entry->u.value.oid.hash,
+						REF_ISPACKED | REF_KNOWS_PEELED, 0);
+		add_ref(cb->packed_refs, packed_entry);
+	}
+	oidcpy(&packed_entry->u.value.peeled, &entry->u.value.peeled);
+
+	/* Schedule the loose reference for pruning if requested. */
+	if ((cb->flags & PACK_REFS_PRUNE)) {
+		struct ref_to_prune *n;
+		FLEX_ALLOC_STR(n, name, entry->name);
+		hashcpy(n->sha1, entry->u.value.oid.hash);
+		n->next = cb->ref_to_prune;
+		cb->ref_to_prune = n;
+	}
+	return 0;
+}
+
+/*
+ * Remove empty parents, but spare refs/ and immediate subdirs.
+ * Note: munges *name.
+ */
+static void try_remove_empty_parents(char *name)
+{
+	char *p, *q;
+	int i;
+	p = name;
+	for (i = 0; i < 2; i++) { /* refs/{heads,tags,...}/ */
+		while (*p && *p != '/')
+			p++;
+		/* tolerate duplicate slashes; see check_refname_format() */
+		while (*p == '/')
+			p++;
+	}
+	for (q = p; *q; q++)
+		;
+	while (1) {
+		while (q > p && *q != '/')
+			q--;
+		while (q > p && *(q-1) == '/')
+			q--;
+		if (q == p)
+			break;
+		*q = '\0';
+		if (rmdir(git_path("%s", name)))
+			break;
+	}
+}
+
+/* make sure nobody touched the ref, and unlink */
+static void prune_ref(struct ref_to_prune *r)
+{
+	struct ref_transaction *transaction;
+	struct strbuf err = STRBUF_INIT;
+
+	if (check_refname_format(r->name, 0))
+		return;
+
+	transaction = ref_transaction_begin(&err);
+	if (!transaction ||
+	    ref_transaction_delete(transaction, r->name, r->sha1,
+				   REF_ISPRUNING, NULL, &err) ||
+	    ref_transaction_commit(transaction, &err)) {
+		ref_transaction_free(transaction);
+		error("%s", err.buf);
+		strbuf_release(&err);
+		return;
+	}
+	ref_transaction_free(transaction);
+	strbuf_release(&err);
+	try_remove_empty_parents(r->name);
+}
+
+static void prune_refs(struct ref_to_prune *r)
+{
+	while (r) {
+		prune_ref(r);
+		r = r->next;
+	}
+}
+
+int pack_refs(unsigned int flags)
+{
+	struct pack_refs_cb_data cbdata;
+
+	memset(&cbdata, 0, sizeof(cbdata));
+	cbdata.flags = flags;
+
+	lock_packed_refs(LOCK_DIE_ON_ERROR);
+	cbdata.packed_refs = get_packed_refs(&ref_cache);
+
+	do_for_each_entry_in_dir(get_loose_refs(&ref_cache), 0,
+				 pack_if_possible_fn, &cbdata);
+
+	if (commit_packed_refs())
+		die_errno("unable to overwrite old ref-pack file");
+
+	prune_refs(cbdata.ref_to_prune);
+	return 0;
+}
+
+/*
+ * Rewrite the packed-refs file, omitting any refs listed in
+ * 'refnames'. On error, leave packed-refs unchanged, write an error
+ * message to 'err', and return a nonzero value.
+ *
+ * The refs in 'refnames' needn't be sorted. `err` must not be NULL.
+ */
+static int repack_without_refs(struct string_list *refnames, struct strbuf *err)
+{
+	struct ref_dir *packed;
+	struct string_list_item *refname;
+	int ret, needs_repacking = 0, removed = 0;
+
+	assert(err);
+
+	/* Look for a packed ref */
+	for_each_string_list_item(refname, refnames) {
+		if (get_packed_ref(refname->string)) {
+			needs_repacking = 1;
+			break;
+		}
+	}
+
+	/* Avoid locking if we have nothing to do */
+	if (!needs_repacking)
+		return 0; /* no refname exists in packed refs */
+
+	if (lock_packed_refs(0)) {
+		unable_to_lock_message(git_path("packed-refs"), errno, err);
+		return -1;
+	}
+	packed = get_packed_refs(&ref_cache);
+
+	/* Remove refnames from the cache */
+	for_each_string_list_item(refname, refnames)
+		if (remove_entry(packed, refname->string) != -1)
+			removed = 1;
+	if (!removed) {
+		/*
+		 * All packed entries disappeared while we were
+		 * acquiring the lock.
+		 */
+		rollback_packed_refs();
+		return 0;
+	}
+
+	/* Write what remains */
+	ret = commit_packed_refs();
+	if (ret)
+		strbuf_addf(err, "unable to overwrite old ref-pack file: %s",
+			    strerror(errno));
+	return ret;
+}
+
+static int delete_ref_loose(struct ref_lock *lock, int flag, struct strbuf *err)
+{
+	assert(err);
+
+	if (!(flag & REF_ISPACKED) || flag & REF_ISSYMREF) {
+		/*
+		 * loose.  The loose file name is the same as the
+		 * lockfile name, minus ".lock":
+		 */
+		char *loose_filename = get_locked_file_path(lock->lk);
+		int res = unlink_or_msg(loose_filename, err);
+		free(loose_filename);
+		if (res)
+			return 1;
+	}
+	return 0;
+}
+
+int delete_refs(struct string_list *refnames)
+{
+	struct strbuf err = STRBUF_INIT;
+	int i, result = 0;
+
+	if (!refnames->nr)
+		return 0;
+
+	result = repack_without_refs(refnames, &err);
+	if (result) {
+		/*
+		 * If we failed to rewrite the packed-refs file, then
+		 * it is unsafe to try to remove loose refs, because
+		 * doing so might expose an obsolete packed value for
+		 * a reference that might even point at an object that
+		 * has been garbage collected.
+		 */
+		if (refnames->nr == 1)
+			error(_("could not delete reference %s: %s"),
+			      refnames->items[0].string, err.buf);
+		else
+			error(_("could not delete references: %s"), err.buf);
+
+		goto out;
+	}
+
+	for (i = 0; i < refnames->nr; i++) {
+		const char *refname = refnames->items[i].string;
+
+		if (delete_ref(refname, NULL, 0))
+			result |= error(_("could not remove reference %s"), refname);
+	}
+
+out:
+	strbuf_release(&err);
+	return result;
+}
+
+/*
+ * People using contrib's git-new-workdir have .git/logs/refs ->
+ * /some/other/path/.git/logs/refs, and that may live on another device.
+ *
+ * IOW, to avoid cross device rename errors, the temporary renamed log must
+ * live into logs/refs.
+ */
+#define TMP_RENAMED_LOG  "logs/refs/.tmp-renamed-log"
+
+static int rename_tmp_log(const char *newrefname)
+{
+	int attempts_remaining = 4;
+	struct strbuf path = STRBUF_INIT;
+	int ret = -1;
+
+ retry:
+	strbuf_reset(&path);
+	strbuf_git_path(&path, "logs/%s", newrefname);
+	switch (safe_create_leading_directories_const(path.buf)) {
+	case SCLD_OK:
+		break; /* success */
+	case SCLD_VANISHED:
+		if (--attempts_remaining > 0)
+			goto retry;
+		/* fall through */
+	default:
+		error("unable to create directory for %s", newrefname);
+		goto out;
+	}
+
+	if (rename(git_path(TMP_RENAMED_LOG), path.buf)) {
+		if ((errno==EISDIR || errno==ENOTDIR) && --attempts_remaining > 0) {
+			/*
+			 * rename(a, b) when b is an existing
+			 * directory ought to result in ISDIR, but
+			 * Solaris 5.8 gives ENOTDIR.  Sheesh.
+			 */
+			if (remove_empty_directories(&path)) {
+				error("Directory not empty: logs/%s", newrefname);
+				goto out;
+			}
+			goto retry;
+		} else if (errno == ENOENT && --attempts_remaining > 0) {
+			/*
+			 * Maybe another process just deleted one of
+			 * the directories in the path to newrefname.
+			 * Try again from the beginning.
+			 */
+			goto retry;
+		} else {
+			error("unable to move logfile "TMP_RENAMED_LOG" to logs/%s: %s",
+				newrefname, strerror(errno));
+			goto out;
+		}
+	}
+	ret = 0;
+out:
+	strbuf_release(&path);
+	return ret;
+}
+
+int verify_refname_available(const char *newname,
+			     struct string_list *extras,
+			     struct string_list *skip,
+			     struct strbuf *err)
+{
+	struct ref_dir *packed_refs = get_packed_refs(&ref_cache);
+	struct ref_dir *loose_refs = get_loose_refs(&ref_cache);
+
+	if (verify_refname_available_dir(newname, extras, skip,
+					 packed_refs, err) ||
+	    verify_refname_available_dir(newname, extras, skip,
+					 loose_refs, err))
+		return -1;
+
+	return 0;
+}
+
+static int write_ref_to_lockfile(struct ref_lock *lock,
+				 const unsigned char *sha1, struct strbuf *err);
+static int commit_ref_update(struct ref_lock *lock,
+			     const unsigned char *sha1, const char *logmsg,
+			     int flags, struct strbuf *err);
+
+int rename_ref(const char *oldrefname, const char *newrefname, const char *logmsg)
+{
+	unsigned char sha1[20], orig_sha1[20];
+	int flag = 0, logmoved = 0;
+	struct ref_lock *lock;
+	struct stat loginfo;
+	int log = !lstat(git_path("logs/%s", oldrefname), &loginfo);
+	const char *symref = NULL;
+	struct strbuf err = STRBUF_INIT;
+
+	if (log && S_ISLNK(loginfo.st_mode))
+		return error("reflog for %s is a symlink", oldrefname);
+
+	symref = resolve_ref_unsafe(oldrefname, RESOLVE_REF_READING,
+				    orig_sha1, &flag);
+	if (flag & REF_ISSYMREF)
+		return error("refname %s is a symbolic ref, renaming it is not supported",
+			oldrefname);
+	if (!symref)
+		return error("refname %s not found", oldrefname);
+
+	if (!rename_ref_available(oldrefname, newrefname))
+		return 1;
+
+	if (log && rename(git_path("logs/%s", oldrefname), git_path(TMP_RENAMED_LOG)))
+		return error("unable to move logfile logs/%s to "TMP_RENAMED_LOG": %s",
+			oldrefname, strerror(errno));
+
+	if (delete_ref(oldrefname, orig_sha1, REF_NODEREF)) {
+		error("unable to delete old %s", oldrefname);
+		goto rollback;
+	}
+
+	if (!read_ref_full(newrefname, RESOLVE_REF_READING, sha1, NULL) &&
+	    delete_ref(newrefname, sha1, REF_NODEREF)) {
+		if (errno==EISDIR) {
+			struct strbuf path = STRBUF_INIT;
+			int result;
+
+			strbuf_git_path(&path, "%s", newrefname);
+			result = remove_empty_directories(&path);
+			strbuf_release(&path);
+
+			if (result) {
+				error("Directory not empty: %s", newrefname);
+				goto rollback;
+			}
+		} else {
+			error("unable to delete existing %s", newrefname);
+			goto rollback;
+		}
+	}
+
+	if (log && rename_tmp_log(newrefname))
+		goto rollback;
+
+	logmoved = log;
+
+	lock = lock_ref_sha1_basic(newrefname, NULL, NULL, NULL, 0, NULL, &err);
+	if (!lock) {
+		error("unable to rename '%s' to '%s': %s", oldrefname, newrefname, err.buf);
+		strbuf_release(&err);
+		goto rollback;
+	}
+	hashcpy(lock->old_oid.hash, orig_sha1);
+
+	if (write_ref_to_lockfile(lock, orig_sha1, &err) ||
+	    commit_ref_update(lock, orig_sha1, logmsg, 0, &err)) {
+		error("unable to write current sha1 into %s: %s", newrefname, err.buf);
+		strbuf_release(&err);
+		goto rollback;
+	}
+
+	return 0;
+
+ rollback:
+	lock = lock_ref_sha1_basic(oldrefname, NULL, NULL, NULL, 0, NULL, &err);
+	if (!lock) {
+		error("unable to lock %s for rollback: %s", oldrefname, err.buf);
+		strbuf_release(&err);
+		goto rollbacklog;
+	}
+
+	flag = log_all_ref_updates;
+	log_all_ref_updates = 0;
+	if (write_ref_to_lockfile(lock, orig_sha1, &err) ||
+	    commit_ref_update(lock, orig_sha1, NULL, 0, &err)) {
+		error("unable to write current sha1 into %s: %s", oldrefname, err.buf);
+		strbuf_release(&err);
+	}
+	log_all_ref_updates = flag;
+
+ rollbacklog:
+	if (logmoved && rename(git_path("logs/%s", newrefname), git_path("logs/%s", oldrefname)))
+		error("unable to restore logfile %s from %s: %s",
+			oldrefname, newrefname, strerror(errno));
+	if (!logmoved && log &&
+	    rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", oldrefname)))
+		error("unable to restore logfile %s from "TMP_RENAMED_LOG": %s",
+			oldrefname, strerror(errno));
+
+	return 1;
+}
+
+static int close_ref(struct ref_lock *lock)
+{
+	if (close_lock_file(lock->lk))
+		return -1;
+	return 0;
+}
+
+static int commit_ref(struct ref_lock *lock)
+{
+	if (commit_lock_file(lock->lk))
+		return -1;
+	return 0;
+}
+
+/*
+ * Create a reflog for a ref.  If force_create = 0, the reflog will
+ * only be created for certain refs (those for which
+ * should_autocreate_reflog returns non-zero.  Otherwise, create it
+ * regardless of the ref name.  Fill in *err and return -1 on failure.
+ */
+static int log_ref_setup(const char *refname, struct strbuf *logfile, struct strbuf *err, int force_create)
+{
+	int logfd, oflags = O_APPEND | O_WRONLY;
+
+	strbuf_git_path(logfile, "logs/%s", refname);
+	if (force_create || should_autocreate_reflog(refname)) {
+		if (safe_create_leading_directories(logfile->buf) < 0) {
+			strbuf_addf(err, "unable to create directory for %s: "
+				    "%s", logfile->buf, strerror(errno));
+			return -1;
+		}
+		oflags |= O_CREAT;
+	}
+
+	logfd = open(logfile->buf, oflags, 0666);
+	if (logfd < 0) {
+		if (!(oflags & O_CREAT) && (errno == ENOENT || errno == EISDIR))
+			return 0;
+
+		if (errno == EISDIR) {
+			if (remove_empty_directories(logfile)) {
+				strbuf_addf(err, "There are still logs under "
+					    "'%s'", logfile->buf);
+				return -1;
+			}
+			logfd = open(logfile->buf, oflags, 0666);
+		}
+
+		if (logfd < 0) {
+			strbuf_addf(err, "unable to append to %s: %s",
+				    logfile->buf, strerror(errno));
+			return -1;
+		}
+	}
+
+	adjust_shared_perm(logfile->buf);
+	close(logfd);
+	return 0;
+}
+
+
+int safe_create_reflog(const char *refname, int force_create, struct strbuf *err)
+{
+	int ret;
+	struct strbuf sb = STRBUF_INIT;
+
+	ret = log_ref_setup(refname, &sb, err, force_create);
+	strbuf_release(&sb);
+	return ret;
+}
+
+static int log_ref_write_fd(int fd, const unsigned char *old_sha1,
+			    const unsigned char *new_sha1,
+			    const char *committer, const char *msg)
+{
+	int msglen, written;
+	unsigned maxlen, len;
+	char *logrec;
+
+	msglen = msg ? strlen(msg) : 0;
+	maxlen = strlen(committer) + msglen + 100;
+	logrec = xmalloc(maxlen);
+	len = xsnprintf(logrec, maxlen, "%s %s %s\n",
+			sha1_to_hex(old_sha1),
+			sha1_to_hex(new_sha1),
+			committer);
+	if (msglen)
+		len += copy_reflog_msg(logrec + len - 1, msg) - 1;
+
+	written = len <= maxlen ? write_in_full(fd, logrec, len) : -1;
+	free(logrec);
+	if (written != len)
+		return -1;
+
+	return 0;
+}
+
+static int log_ref_write_1(const char *refname, const unsigned char *old_sha1,
+			   const unsigned char *new_sha1, const char *msg,
+			   struct strbuf *logfile, int flags,
+			   struct strbuf *err)
+{
+	int logfd, result, oflags = O_APPEND | O_WRONLY;
+
+	if (log_all_ref_updates < 0)
+		log_all_ref_updates = !is_bare_repository();
+
+	result = log_ref_setup(refname, logfile, err, flags & REF_FORCE_CREATE_REFLOG);
+
+	if (result)
+		return result;
+
+	logfd = open(logfile->buf, oflags);
+	if (logfd < 0)
+		return 0;
+	result = log_ref_write_fd(logfd, old_sha1, new_sha1,
+				  git_committer_info(0), msg);
+	if (result) {
+		strbuf_addf(err, "unable to append to %s: %s", logfile->buf,
+			    strerror(errno));
+		close(logfd);
+		return -1;
+	}
+	if (close(logfd)) {
+		strbuf_addf(err, "unable to append to %s: %s", logfile->buf,
+			    strerror(errno));
+		return -1;
+	}
+	return 0;
+}
+
+static int log_ref_write(const char *refname, const unsigned char *old_sha1,
+			 const unsigned char *new_sha1, const char *msg,
+			 int flags, struct strbuf *err)
+{
+	return files_log_ref_write(refname, old_sha1, new_sha1, msg, flags,
+				   err);
+}
+
+int files_log_ref_write(const char *refname, const unsigned char *old_sha1,
+			const unsigned char *new_sha1, const char *msg,
+			int flags, struct strbuf *err)
+{
+	struct strbuf sb = STRBUF_INIT;
+	int ret = log_ref_write_1(refname, old_sha1, new_sha1, msg, &sb, flags,
+				  err);
+	strbuf_release(&sb);
+	return ret;
+}
+
+/*
+ * Write sha1 into the open lockfile, then close the lockfile. On
+ * errors, rollback the lockfile, fill in *err and
+ * return -1.
+ */
+static int write_ref_to_lockfile(struct ref_lock *lock,
+				 const unsigned char *sha1, struct strbuf *err)
+{
+	static char term = '\n';
+	struct object *o;
+	int fd;
+
+	o = parse_object(sha1);
+	if (!o) {
+		strbuf_addf(err,
+			    "Trying to write ref %s with nonexistent object %s",
+			    lock->ref_name, sha1_to_hex(sha1));
+		unlock_ref(lock);
+		return -1;
+	}
+	if (o->type != OBJ_COMMIT && is_branch(lock->ref_name)) {
+		strbuf_addf(err,
+			    "Trying to write non-commit object %s to branch %s",
+			    sha1_to_hex(sha1), lock->ref_name);
+		unlock_ref(lock);
+		return -1;
+	}
+	fd = get_lock_file_fd(lock->lk);
+	if (write_in_full(fd, sha1_to_hex(sha1), 40) != 40 ||
+	    write_in_full(fd, &term, 1) != 1 ||
+	    close_ref(lock) < 0) {
+		strbuf_addf(err,
+			    "Couldn't write %s", get_lock_file_path(lock->lk));
+		unlock_ref(lock);
+		return -1;
+	}
+	return 0;
+}
+
+/*
+ * Commit a change to a loose reference that has already been written
+ * to the loose reference lockfile. Also update the reflogs if
+ * necessary, using the specified lockmsg (which can be NULL).
+ */
+static int commit_ref_update(struct ref_lock *lock,
+			     const unsigned char *sha1, const char *logmsg,
+			     int flags, struct strbuf *err)
+{
+	clear_loose_ref_cache(&ref_cache);
+	if (log_ref_write(lock->ref_name, lock->old_oid.hash, sha1, logmsg, flags, err) < 0 ||
+	    (strcmp(lock->ref_name, lock->orig_ref_name) &&
+	     log_ref_write(lock->orig_ref_name, lock->old_oid.hash, sha1, logmsg, flags, err) < 0)) {
+		char *old_msg = strbuf_detach(err, NULL);
+		strbuf_addf(err, "Cannot update the ref '%s': %s",
+			    lock->ref_name, old_msg);
+		free(old_msg);
+		unlock_ref(lock);
+		return -1;
+	}
+	if (strcmp(lock->orig_ref_name, "HEAD") != 0) {
+		/*
+		 * Special hack: If a branch is updated directly and HEAD
+		 * points to it (may happen on the remote side of a push
+		 * for example) then logically the HEAD reflog should be
+		 * updated too.
+		 * A generic solution implies reverse symref information,
+		 * but finding all symrefs pointing to the given branch
+		 * would be rather costly for this rare event (the direct
+		 * update of a branch) to be worth it.  So let's cheat and
+		 * check with HEAD only which should cover 99% of all usage
+		 * scenarios (even 100% of the default ones).
+		 */
+		unsigned char head_sha1[20];
+		int head_flag;
+		const char *head_ref;
+		head_ref = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
+					      head_sha1, &head_flag);
+		if (head_ref && (head_flag & REF_ISSYMREF) &&
+		    !strcmp(head_ref, lock->ref_name)) {
+			struct strbuf log_err = STRBUF_INIT;
+			if (log_ref_write("HEAD", lock->old_oid.hash, sha1,
+					  logmsg, 0, &log_err)) {
+				error("%s", log_err.buf);
+				strbuf_release(&log_err);
+			}
+		}
+	}
+	if (commit_ref(lock)) {
+		error("Couldn't set %s", lock->ref_name);
+		unlock_ref(lock);
+		return -1;
+	}
+
+	unlock_ref(lock);
+	return 0;
+}
+
+int create_symref(const char *ref_target, const char *refs_heads_master,
+		  const char *logmsg)
+{
+	char *lockpath = NULL;
+	char ref[1000];
+	int fd, len, written;
+	char *git_HEAD = git_pathdup("%s", ref_target);
+	unsigned char old_sha1[20], new_sha1[20];
+	struct strbuf err = STRBUF_INIT;
+
+	if (logmsg && read_ref(ref_target, old_sha1))
+		hashclr(old_sha1);
+
+	if (safe_create_leading_directories(git_HEAD) < 0)
+		return error("unable to create directory for %s", git_HEAD);
+
+#ifndef NO_SYMLINK_HEAD
+	if (prefer_symlink_refs) {
+		unlink(git_HEAD);
+		if (!symlink(refs_heads_master, git_HEAD))
+			goto done;
+		fprintf(stderr, "no symlink - falling back to symbolic ref\n");
+	}
+#endif
+
+	len = snprintf(ref, sizeof(ref), "ref: %s\n", refs_heads_master);
+	if (sizeof(ref) <= len) {
+		error("refname too long: %s", refs_heads_master);
+		goto error_free_return;
+	}
+	lockpath = mkpathdup("%s.lock", git_HEAD);
+	fd = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, 0666);
+	if (fd < 0) {
+		error("Unable to open %s for writing", lockpath);
+		goto error_free_return;
+	}
+	written = write_in_full(fd, ref, len);
+	if (close(fd) != 0 || written != len) {
+		error("Unable to write to %s", lockpath);
+		goto error_unlink_return;
+	}
+	if (rename(lockpath, git_HEAD) < 0) {
+		error("Unable to create %s", git_HEAD);
+		goto error_unlink_return;
+	}
+	if (adjust_shared_perm(git_HEAD)) {
+		error("Unable to fix permissions on %s", lockpath);
+	error_unlink_return:
+		unlink_or_warn(lockpath);
+	error_free_return:
+		free(lockpath);
+		free(git_HEAD);
+		return -1;
+	}
+	free(lockpath);
+
+#ifndef NO_SYMLINK_HEAD
+	done:
+#endif
+	if (logmsg && !read_ref(refs_heads_master, new_sha1) &&
+		log_ref_write(ref_target, old_sha1, new_sha1, logmsg, 0, &err)) {
+		error("%s", err.buf);
+		strbuf_release(&err);
+	}
+
+	free(git_HEAD);
+	return 0;
+}
+
+int reflog_exists(const char *refname)
+{
+	struct stat st;
+
+	return !lstat(git_path("logs/%s", refname), &st) &&
+		S_ISREG(st.st_mode);
+}
+
+int delete_reflog(const char *refname)
+{
+	return remove_path(git_path("logs/%s", refname));
+}
+
+static int show_one_reflog_ent(struct strbuf *sb, each_reflog_ent_fn fn, void *cb_data)
+{
+	unsigned char osha1[20], nsha1[20];
+	char *email_end, *message;
+	unsigned long timestamp;
+	int tz;
+
+	/* old SP new SP name <email> SP time TAB msg LF */
+	if (sb->len < 83 || sb->buf[sb->len - 1] != '\n' ||
+	    get_sha1_hex(sb->buf, osha1) || sb->buf[40] != ' ' ||
+	    get_sha1_hex(sb->buf + 41, nsha1) || sb->buf[81] != ' ' ||
+	    !(email_end = strchr(sb->buf + 82, '>')) ||
+	    email_end[1] != ' ' ||
+	    !(timestamp = strtoul(email_end + 2, &message, 10)) ||
+	    !message || message[0] != ' ' ||
+	    (message[1] != '+' && message[1] != '-') ||
+	    !isdigit(message[2]) || !isdigit(message[3]) ||
+	    !isdigit(message[4]) || !isdigit(message[5]))
+		return 0; /* corrupt? */
+	email_end[1] = '\0';
+	tz = strtol(message + 1, NULL, 10);
+	if (message[6] != '\t')
+		message += 6;
+	else
+		message += 7;
+	return fn(osha1, nsha1, sb->buf + 82, timestamp, tz, message, cb_data);
+}
+
+static char *find_beginning_of_line(char *bob, char *scan)
+{
+	while (bob < scan && *(--scan) != '\n')
+		; /* keep scanning backwards */
+	/*
+	 * Return either beginning of the buffer, or LF at the end of
+	 * the previous line.
+	 */
+	return scan;
+}
+
+int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn, void *cb_data)
+{
+	struct strbuf sb = STRBUF_INIT;
+	FILE *logfp;
+	long pos;
+	int ret = 0, at_tail = 1;
+
+	logfp = fopen(git_path("logs/%s", refname), "r");
+	if (!logfp)
+		return -1;
+
+	/* Jump to the end */
+	if (fseek(logfp, 0, SEEK_END) < 0)
+		return error("cannot seek back reflog for %s: %s",
+			     refname, strerror(errno));
+	pos = ftell(logfp);
+	while (!ret && 0 < pos) {
+		int cnt;
+		size_t nread;
+		char buf[BUFSIZ];
+		char *endp, *scanp;
+
+		/* Fill next block from the end */
+		cnt = (sizeof(buf) < pos) ? sizeof(buf) : pos;
+		if (fseek(logfp, pos - cnt, SEEK_SET))
+			return error("cannot seek back reflog for %s: %s",
+				     refname, strerror(errno));
+		nread = fread(buf, cnt, 1, logfp);
+		if (nread != 1)
+			return error("cannot read %d bytes from reflog for %s: %s",
+				     cnt, refname, strerror(errno));
+		pos -= cnt;
+
+		scanp = endp = buf + cnt;
+		if (at_tail && scanp[-1] == '\n')
+			/* Looking at the final LF at the end of the file */
+			scanp--;
+		at_tail = 0;
+
+		while (buf < scanp) {
+			/*
+			 * terminating LF of the previous line, or the beginning
+			 * of the buffer.
+			 */
+			char *bp;
+
+			bp = find_beginning_of_line(buf, scanp);
+
+			if (*bp == '\n') {
+				/*
+				 * The newline is the end of the previous line,
+				 * so we know we have complete line starting
+				 * at (bp + 1). Prefix it onto any prior data
+				 * we collected for the line and process it.
+				 */
+				strbuf_splice(&sb, 0, 0, bp + 1, endp - (bp + 1));
+				scanp = bp;
+				endp = bp + 1;
+				ret = show_one_reflog_ent(&sb, fn, cb_data);
+				strbuf_reset(&sb);
+				if (ret)
+					break;
+			} else if (!pos) {
+				/*
+				 * We are at the start of the buffer, and the
+				 * start of the file; there is no previous
+				 * line, and we have everything for this one.
+				 * Process it, and we can end the loop.
+				 */
+				strbuf_splice(&sb, 0, 0, buf, endp - buf);
+				ret = show_one_reflog_ent(&sb, fn, cb_data);
+				strbuf_reset(&sb);
+				break;
+			}
+
+			if (bp == buf) {
+				/*
+				 * We are at the start of the buffer, and there
+				 * is more file to read backwards. Which means
+				 * we are in the middle of a line. Note that we
+				 * may get here even if *bp was a newline; that
+				 * just means we are at the exact end of the
+				 * previous line, rather than some spot in the
+				 * middle.
+				 *
+				 * Save away what we have to be combined with
+				 * the data from the next read.
+				 */
+				strbuf_splice(&sb, 0, 0, buf, endp - buf);
+				break;
+			}
+		}
+
+	}
+	if (!ret && sb.len)
+		die("BUG: reverse reflog parser had leftover data");
+
+	fclose(logfp);
+	strbuf_release(&sb);
+	return ret;
+}
+
+int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_data)
+{
+	FILE *logfp;
+	struct strbuf sb = STRBUF_INIT;
+	int ret = 0;
+
+	logfp = fopen(git_path("logs/%s", refname), "r");
+	if (!logfp)
+		return -1;
+
+	while (!ret && !strbuf_getwholeline(&sb, logfp, '\n'))
+		ret = show_one_reflog_ent(&sb, fn, cb_data);
+	fclose(logfp);
+	strbuf_release(&sb);
+	return ret;
+}
+/*
+ * Call fn for each reflog in the namespace indicated by name.  name
+ * must be empty or end with '/'.  Name will be used as a scratch
+ * space, but its contents will be restored before return.
+ */
+static int do_for_each_reflog(struct strbuf *name, each_ref_fn fn, void *cb_data)
+{
+	DIR *d = opendir(git_path("logs/%s", name->buf));
+	int retval = 0;
+	struct dirent *de;
+	int oldlen = name->len;
+
+	if (!d)
+		return name->len ? errno : 0;
+
+	while ((de = readdir(d)) != NULL) {
+		struct stat st;
+
+		if (de->d_name[0] == '.')
+			continue;
+		if (ends_with(de->d_name, ".lock"))
+			continue;
+		strbuf_addstr(name, de->d_name);
+		if (stat(git_path("logs/%s", name->buf), &st) < 0) {
+			; /* silently ignore */
+		} else {
+			if (S_ISDIR(st.st_mode)) {
+				strbuf_addch(name, '/');
+				retval = do_for_each_reflog(name, fn, cb_data);
+			} else {
+				struct object_id oid;
+
+				if (read_ref_full(name->buf, 0, oid.hash, NULL))
+					retval = error("bad ref for %s", name->buf);
+				else
+					retval = fn(name->buf, &oid, 0, cb_data);
+			}
+			if (retval)
+				break;
+		}
+		strbuf_setlen(name, oldlen);
+	}
+	closedir(d);
+	return retval;
+}
+
+int for_each_reflog(each_ref_fn fn, void *cb_data)
+{
+	int retval;
+	struct strbuf name;
+	strbuf_init(&name, PATH_MAX);
+	retval = do_for_each_reflog(&name, fn, cb_data);
+	strbuf_release(&name);
+	return retval;
+}
+
+static int ref_update_reject_duplicates(struct string_list *refnames,
+					struct strbuf *err)
+{
+	int i, n = refnames->nr;
+
+	assert(err);
+
+	for (i = 1; i < n; i++)
+		if (!strcmp(refnames->items[i - 1].string, refnames->items[i].string)) {
+			strbuf_addf(err,
+				    "Multiple updates for ref '%s' not allowed.",
+				    refnames->items[i].string);
+			return 1;
+		}
+	return 0;
+}
+
+int ref_transaction_commit(struct ref_transaction *transaction,
+			   struct strbuf *err)
+{
+	int ret = 0, i;
+	int n = transaction->nr;
+	struct ref_update **updates = transaction->updates;
+	struct string_list refs_to_delete = STRING_LIST_INIT_NODUP;
+	struct string_list_item *ref_to_delete;
+	struct string_list affected_refnames = STRING_LIST_INIT_NODUP;
+
+	assert(err);
+
+	if (transaction->state != REF_TRANSACTION_OPEN)
+		die("BUG: commit called for transaction that is not open");
+
+	if (!n) {
+		transaction->state = REF_TRANSACTION_CLOSED;
+		return 0;
+	}
+
+	/* Fail if a refname appears more than once in the transaction: */
+	for (i = 0; i < n; i++)
+		string_list_append(&affected_refnames, updates[i]->refname);
+	string_list_sort(&affected_refnames);
+	if (ref_update_reject_duplicates(&affected_refnames, err)) {
+		ret = TRANSACTION_GENERIC_ERROR;
+		goto cleanup;
+	}
+
+	/*
+	 * Acquire all locks, verify old values if provided, check
+	 * that new values are valid, and write new values to the
+	 * lockfiles, ready to be activated. Only keep one lockfile
+	 * open at a time to avoid running out of file descriptors.
+	 */
+	for (i = 0; i < n; i++) {
+		struct ref_update *update = updates[i];
+
+		if ((update->flags & REF_HAVE_NEW) &&
+		    is_null_sha1(update->new_sha1))
+			update->flags |= REF_DELETING;
+		update->lock = lock_ref_sha1_basic(
+				update->refname,
+				((update->flags & REF_HAVE_OLD) ?
+				 update->old_sha1 : NULL),
+				&affected_refnames, NULL,
+				update->flags,
+				&update->type,
+				err);
+		if (!update->lock) {
+			char *reason;
+
+			ret = (errno == ENOTDIR)
+				? TRANSACTION_NAME_CONFLICT
+				: TRANSACTION_GENERIC_ERROR;
+			reason = strbuf_detach(err, NULL);
+			strbuf_addf(err, "cannot lock ref '%s': %s",
+				    update->refname, reason);
+			free(reason);
+			goto cleanup;
+		}
+		if ((update->flags & REF_HAVE_NEW) &&
+		    !(update->flags & REF_DELETING)) {
+			int overwriting_symref = ((update->type & REF_ISSYMREF) &&
+						  (update->flags & REF_NODEREF));
+
+			if (!overwriting_symref &&
+			    !hashcmp(update->lock->old_oid.hash, update->new_sha1)) {
+				/*
+				 * The reference already has the desired
+				 * value, so we don't need to write it.
+				 */
+			} else if (write_ref_to_lockfile(update->lock,
+							 update->new_sha1,
+							 err)) {
+				char *write_err = strbuf_detach(err, NULL);
+
+				/*
+				 * The lock was freed upon failure of
+				 * write_ref_to_lockfile():
+				 */
+				update->lock = NULL;
+				strbuf_addf(err,
+					    "cannot update the ref '%s': %s",
+					    update->refname, write_err);
+				free(write_err);
+				ret = TRANSACTION_GENERIC_ERROR;
+				goto cleanup;
+			} else {
+				update->flags |= REF_NEEDS_COMMIT;
+			}
+		}
+		if (!(update->flags & REF_NEEDS_COMMIT)) {
+			/*
+			 * We didn't have to write anything to the lockfile.
+			 * Close it to free up the file descriptor:
+			 */
+			if (close_ref(update->lock)) {
+				strbuf_addf(err, "Couldn't close %s.lock",
+					    update->refname);
+				goto cleanup;
+			}
+		}
+	}
+
+	/* Perform updates first so live commits remain referenced */
+	for (i = 0; i < n; i++) {
+		struct ref_update *update = updates[i];
+
+		if (update->flags & REF_NEEDS_COMMIT) {
+			if (commit_ref_update(update->lock,
+					      update->new_sha1, update->msg,
+					      update->flags, err)) {
+				/* freed by commit_ref_update(): */
+				update->lock = NULL;
+				ret = TRANSACTION_GENERIC_ERROR;
+				goto cleanup;
+			} else {
+				/* freed by commit_ref_update(): */
+				update->lock = NULL;
+			}
+		}
+	}
+
+	/* Perform deletes now that updates are safely completed */
+	for (i = 0; i < n; i++) {
+		struct ref_update *update = updates[i];
+
+		if (update->flags & REF_DELETING) {
+			if (delete_ref_loose(update->lock, update->type, err)) {
+				ret = TRANSACTION_GENERIC_ERROR;
+				goto cleanup;
+			}
+
+			if (!(update->flags & REF_ISPRUNING))
+				string_list_append(&refs_to_delete,
+						   update->lock->ref_name);
+		}
+	}
+
+	if (repack_without_refs(&refs_to_delete, err)) {
+		ret = TRANSACTION_GENERIC_ERROR;
+		goto cleanup;
+	}
+	for_each_string_list_item(ref_to_delete, &refs_to_delete)
+		unlink_or_warn(git_path("logs/%s", ref_to_delete->string));
+	clear_loose_ref_cache(&ref_cache);
+
+cleanup:
+	transaction->state = REF_TRANSACTION_CLOSED;
+
+	for (i = 0; i < n; i++)
+		if (updates[i]->lock)
+			unlock_ref(updates[i]->lock);
+	string_list_clear(&refs_to_delete, 0);
+	string_list_clear(&affected_refnames, 0);
+	return ret;
+}
+
+static int ref_present(const char *refname,
+		       const struct object_id *oid, int flags, void *cb_data)
+{
+	struct string_list *affected_refnames = cb_data;
+
+	return string_list_has_string(affected_refnames, refname);
+}
+
+int initial_ref_transaction_commit(struct ref_transaction *transaction,
+				   struct strbuf *err)
+{
+	int ret = 0, i;
+	int n = transaction->nr;
+	struct ref_update **updates = transaction->updates;
+	struct string_list affected_refnames = STRING_LIST_INIT_NODUP;
+
+	assert(err);
+
+	if (transaction->state != REF_TRANSACTION_OPEN)
+		die("BUG: commit called for transaction that is not open");
+
+	/* Fail if a refname appears more than once in the transaction: */
+	for (i = 0; i < n; i++)
+		string_list_append(&affected_refnames, updates[i]->refname);
+	string_list_sort(&affected_refnames);
+	if (ref_update_reject_duplicates(&affected_refnames, err)) {
+		ret = TRANSACTION_GENERIC_ERROR;
+		goto cleanup;
+	}
+
+	/*
+	 * It's really undefined to call this function in an active
+	 * repository or when there are existing references: we are
+	 * only locking and changing packed-refs, so (1) any
+	 * simultaneous processes might try to change a reference at
+	 * the same time we do, and (2) any existing loose versions of
+	 * the references that we are setting would have precedence
+	 * over our values. But some remote helpers create the remote
+	 * "HEAD" and "master" branches before calling this function,
+	 * so here we really only check that none of the references
+	 * that we are creating already exists.
+	 */
+	if (for_each_rawref(ref_present, &affected_refnames))
+		die("BUG: initial ref transaction called with existing refs");
+
+	for (i = 0; i < n; i++) {
+		struct ref_update *update = updates[i];
+
+		if ((update->flags & REF_HAVE_OLD) &&
+		    !is_null_sha1(update->old_sha1))
+			die("BUG: initial ref transaction with old_sha1 set");
+		if (verify_refname_available(update->refname,
+					     &affected_refnames, NULL,
+					     err)) {
+			ret = TRANSACTION_NAME_CONFLICT;
+			goto cleanup;
+		}
+	}
+
+	if (lock_packed_refs(0)) {
+		strbuf_addf(err, "unable to lock packed-refs file: %s",
+			    strerror(errno));
+		ret = TRANSACTION_GENERIC_ERROR;
+		goto cleanup;
+	}
+
+	for (i = 0; i < n; i++) {
+		struct ref_update *update = updates[i];
+
+		if ((update->flags & REF_HAVE_NEW) &&
+		    !is_null_sha1(update->new_sha1))
+			add_packed_ref(update->refname, update->new_sha1);
+	}
+
+	if (commit_packed_refs()) {
+		strbuf_addf(err, "unable to commit packed-refs file: %s",
+			    strerror(errno));
+		ret = TRANSACTION_GENERIC_ERROR;
+		goto cleanup;
+	}
+
+cleanup:
+	transaction->state = REF_TRANSACTION_CLOSED;
+	string_list_clear(&affected_refnames, 0);
+	return ret;
+}
+
+struct expire_reflog_cb {
+	unsigned int flags;
+	reflog_expiry_should_prune_fn *should_prune_fn;
+	void *policy_cb;
+	FILE *newlog;
+	unsigned char last_kept_sha1[20];
+};
+
+static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
+			     const char *email, unsigned long timestamp, int tz,
+			     const char *message, void *cb_data)
+{
+	struct expire_reflog_cb *cb = cb_data;
+	struct expire_reflog_policy_cb *policy_cb = cb->policy_cb;
+
+	if (cb->flags & EXPIRE_REFLOGS_REWRITE)
+		osha1 = cb->last_kept_sha1;
+
+	if ((*cb->should_prune_fn)(osha1, nsha1, email, timestamp, tz,
+				   message, policy_cb)) {
+		if (!cb->newlog)
+			printf("would prune %s", message);
+		else if (cb->flags & EXPIRE_REFLOGS_VERBOSE)
+			printf("prune %s", message);
+	} else {
+		if (cb->newlog) {
+			fprintf(cb->newlog, "%s %s %s %lu %+05d\t%s",
+				sha1_to_hex(osha1), sha1_to_hex(nsha1),
+				email, timestamp, tz, message);
+			hashcpy(cb->last_kept_sha1, nsha1);
+		}
+		if (cb->flags & EXPIRE_REFLOGS_VERBOSE)
+			printf("keep %s", message);
+	}
+	return 0;
+}
+
+int reflog_expire(const char *refname, const unsigned char *sha1,
+		 unsigned int flags,
+		 reflog_expiry_prepare_fn prepare_fn,
+		 reflog_expiry_should_prune_fn should_prune_fn,
+		 reflog_expiry_cleanup_fn cleanup_fn,
+		 void *policy_cb_data)
+{
+	static struct lock_file reflog_lock;
+	struct expire_reflog_cb cb;
+	struct ref_lock *lock;
+	char *log_file;
+	int status = 0;
+	int type;
+	struct strbuf err = STRBUF_INIT;
+
+	memset(&cb, 0, sizeof(cb));
+	cb.flags = flags;
+	cb.policy_cb = policy_cb_data;
+	cb.should_prune_fn = should_prune_fn;
+
+	/*
+	 * The reflog file is locked by holding the lock on the
+	 * reference itself, plus we might need to update the
+	 * reference if --updateref was specified:
+	 */
+	lock = lock_ref_sha1_basic(refname, sha1, NULL, NULL, 0, &type, &err);
+	if (!lock) {
+		error("cannot lock ref '%s': %s", refname, err.buf);
+		strbuf_release(&err);
+		return -1;
+	}
+	if (!reflog_exists(refname)) {
+		unlock_ref(lock);
+		return 0;
+	}
+
+	log_file = git_pathdup("logs/%s", refname);
+	if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) {
+		/*
+		 * Even though holding $GIT_DIR/logs/$reflog.lock has
+		 * no locking implications, we use the lock_file
+		 * machinery here anyway because it does a lot of the
+		 * work we need, including cleaning up if the program
+		 * exits unexpectedly.
+		 */
+		if (hold_lock_file_for_update(&reflog_lock, log_file, 0) < 0) {
+			struct strbuf err = STRBUF_INIT;
+			unable_to_lock_message(log_file, errno, &err);
+			error("%s", err.buf);
+			strbuf_release(&err);
+			goto failure;
+		}
+		cb.newlog = fdopen_lock_file(&reflog_lock, "w");
+		if (!cb.newlog) {
+			error("cannot fdopen %s (%s)",
+			      get_lock_file_path(&reflog_lock), strerror(errno));
+			goto failure;
+		}
+	}
+
+	(*prepare_fn)(refname, sha1, cb.policy_cb);
+	for_each_reflog_ent(refname, expire_reflog_ent, &cb);
+	(*cleanup_fn)(cb.policy_cb);
+
+	if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) {
+		/*
+		 * It doesn't make sense to adjust a reference pointed
+		 * to by a symbolic ref based on expiring entries in
+		 * the symbolic reference's reflog. Nor can we update
+		 * a reference if there are no remaining reflog
+		 * entries.
+		 */
+		int update = (flags & EXPIRE_REFLOGS_UPDATE_REF) &&
+			!(type & REF_ISSYMREF) &&
+			!is_null_sha1(cb.last_kept_sha1);
+
+		if (close_lock_file(&reflog_lock)) {
+			status |= error("couldn't write %s: %s", log_file,
+					strerror(errno));
+		} else if (update &&
+			   (write_in_full(get_lock_file_fd(lock->lk),
+				sha1_to_hex(cb.last_kept_sha1), 40) != 40 ||
+			    write_str_in_full(get_lock_file_fd(lock->lk), "\n") != 1 ||
+			    close_ref(lock) < 0)) {
+			status |= error("couldn't write %s",
+					get_lock_file_path(lock->lk));
+			rollback_lock_file(&reflog_lock);
+		} else if (commit_lock_file(&reflog_lock)) {
+			status |= error("unable to write reflog '%s' (%s)",
+					log_file, strerror(errno));
+		} else if (update && commit_ref(lock)) {
+			status |= error("couldn't set %s", lock->ref_name);
+		}
+	}
+	free(log_file);
+	unlock_ref(lock);
+	return status;
+
+ failure:
+	rollback_lock_file(&reflog_lock);
+	free(log_file);
+	unlock_ref(lock);
+	return -1;
+}
diff --git a/refs/refs-internal.h b/refs/refs-internal.h
new file mode 100644
index 0000000..c7dded3
--- /dev/null
+++ b/refs/refs-internal.h
@@ -0,0 +1,200 @@
+#ifndef REFS_REFS_INTERNAL_H
+#define REFS_REFS_INTERNAL_H
+
+/*
+ * Data structures and functions for the internal use of the refs
+ * module. Code outside of the refs module should use only the public
+ * functions defined in "refs.h", and should *not* include this file.
+ */
+
+/*
+ * Flag passed to lock_ref_sha1_basic() telling it to tolerate broken
+ * refs (i.e., because the reference is about to be deleted anyway).
+ */
+#define REF_DELETING	0x02
+
+/*
+ * Used as a flag in ref_update::flags when a loose ref is being
+ * pruned.
+ */
+#define REF_ISPRUNING	0x04
+
+/*
+ * Used as a flag in ref_update::flags when the reference should be
+ * updated to new_sha1.
+ */
+#define REF_HAVE_NEW	0x08
+
+/*
+ * Used as a flag in ref_update::flags when old_sha1 should be
+ * checked.
+ */
+#define REF_HAVE_OLD	0x10
+
+/*
+ * Used as a flag in ref_update::flags when the lockfile needs to be
+ * committed.
+ */
+#define REF_NEEDS_COMMIT 0x20
+
+/*
+ * 0x40 is REF_FORCE_CREATE_REFLOG, so skip it if you're adding a
+ * value to ref_update::flags
+ */
+
+/*
+ * Return true iff refname is minimally safe. "Safe" here means that
+ * deleting a loose reference by this name will not do any damage, for
+ * example by causing a file that is not a reference to be deleted.
+ * This function does not check that the reference name is legal; for
+ * that, use check_refname_format().
+ *
+ * We consider a refname that starts with "refs/" to be safe as long
+ * as any ".." components that it might contain do not escape "refs/".
+ * Names that do not start with "refs/" are considered safe iff they
+ * consist entirely of upper case characters and '_' (like "HEAD" and
+ * "MERGE_HEAD" but not "config" or "FOO/BAR").
+ */
+int refname_is_safe(const char *refname);
+
+enum peel_status {
+	/* object was peeled successfully: */
+	PEEL_PEELED = 0,
+
+	/*
+	 * object cannot be peeled because the named object (or an
+	 * object referred to by a tag in the peel chain), does not
+	 * exist.
+	 */
+	PEEL_INVALID = -1,
+
+	/* object cannot be peeled because it is not a tag: */
+	PEEL_NON_TAG = -2,
+
+	/* ref_entry contains no peeled value because it is a symref: */
+	PEEL_IS_SYMREF = -3,
+
+	/*
+	 * ref_entry cannot be peeled because it is broken (i.e., the
+	 * symbolic reference cannot even be resolved to an object
+	 * name):
+	 */
+	PEEL_BROKEN = -4
+};
+
+/*
+ * Peel the named object; i.e., if the object is a tag, resolve the
+ * tag recursively until a non-tag is found.  If successful, store the
+ * result to sha1 and return PEEL_PEELED.  If the object is not a tag
+ * or is not valid, return PEEL_NON_TAG or PEEL_INVALID, respectively,
+ * and leave sha1 unchanged.
+ */
+enum peel_status peel_object(const unsigned char *name, unsigned char *sha1);
+
+/*
+ * Return 0 if a reference named refname could be created without
+ * conflicting with the name of an existing reference. Otherwise,
+ * return a negative value and write an explanation to err. If extras
+ * is non-NULL, it is a list of additional refnames with which refname
+ * is not allowed to conflict. If skip is non-NULL, ignore potential
+ * conflicts with refs in skip (e.g., because they are scheduled for
+ * deletion in the same operation). Behavior is undefined if the same
+ * name is listed in both extras and skip.
+ *
+ * Two reference names conflict if one of them exactly matches the
+ * leading components of the other; e.g., "foo/bar" conflicts with
+ * both "foo" and with "foo/bar/baz" but not with "foo/bar" or
+ * "foo/barbados".
+ *
+ * extras and skip must be sorted.
+ */
+int verify_refname_available(const char *newname,
+			     struct string_list *extras,
+			     struct string_list *skip,
+			     struct strbuf *err);
+
+/*
+ * Copy the reflog message msg to buf, which has been allocated sufficiently
+ * large, while cleaning up the whitespaces.  Especially, convert LF to space,
+ * because reflog file is one line per entry.
+ */
+int copy_reflog_msg(char *buf, const char *msg);
+
+int should_autocreate_reflog(const char *refname);
+
+/**
+ * Information needed for a single ref update. Set new_sha1 to the new
+ * value or to null_sha1 to delete the ref. To check the old value
+ * while the ref is locked, set (flags & REF_HAVE_OLD) and set
+ * old_sha1 to the old value, or to null_sha1 to ensure the ref does
+ * not exist before update.
+ */
+struct ref_update {
+	/*
+	 * If (flags & REF_HAVE_NEW), set the reference to this value:
+	 */
+	unsigned char new_sha1[20];
+	/*
+	 * If (flags & REF_HAVE_OLD), check that the reference
+	 * previously had this value:
+	 */
+	unsigned char old_sha1[20];
+	/*
+	 * One or more of REF_HAVE_NEW, REF_HAVE_OLD, REF_NODEREF,
+	 * REF_DELETING, and REF_ISPRUNING:
+	 */
+	unsigned int flags;
+	struct ref_lock *lock;
+	int type;
+	char *msg;
+	const char refname[FLEX_ARRAY];
+};
+
+/*
+ * Transaction states.
+ * OPEN:   The transaction is in a valid state and can accept new updates.
+ *         An OPEN transaction can be committed.
+ * CLOSED: A closed transaction is no longer active and no other operations
+ *         than free can be used on it in this state.
+ *         A transaction can either become closed by successfully committing
+ *         an active transaction or if there is a failure while building
+ *         the transaction thus rendering it failed/inactive.
+ */
+enum ref_transaction_state {
+	REF_TRANSACTION_OPEN   = 0,
+	REF_TRANSACTION_CLOSED = 1
+};
+
+/*
+ * Data structure for holding a reference transaction, which can
+ * consist of checks and updates to multiple references, carried out
+ * as atomically as possible.  This structure is opaque to callers.
+ */
+struct ref_transaction {
+	struct ref_update **updates;
+	size_t alloc;
+	size_t nr;
+	enum ref_transaction_state state;
+};
+
+int files_log_ref_write(const char *refname, const unsigned char *old_sha1,
+			const unsigned char *new_sha1, const char *msg,
+			int flags, struct strbuf *err);
+
+/*
+ * Check for entries in extras that are within the specified
+ * directory, where dirname is a reference directory name including
+ * the trailing slash (e.g., "refs/heads/foo/"). Ignore any
+ * conflicting references that are found in skip. If there is a
+ * conflicting reference, return its name.
+ *
+ * extras and skip must be sorted lists of reference names. Either one
+ * can be NULL, signifying the empty list.
+ */
+const char *find_descendant_ref(const char *dirname,
+				const struct string_list *extras,
+				const struct string_list *skip);
+
+int rename_ref_available(const char *oldname, const char *newname);
+
+#endif /* REFS_REFS_INTERNAL_H */
diff --git a/remote-curl.c b/remote-curl.c
index 71fbbb6..e65ea59 100644
--- a/remote-curl.c
+++ b/remote-curl.c
@@ -168,11 +168,8 @@
 				    url.buf);
 			data[i] = 0;
 			ref_name = mid + 1;
-			ref = xmalloc(sizeof(struct ref) +
-				      strlen(ref_name) + 1);
-			memset(ref, 0, sizeof(struct ref));
-			strcpy(ref->name, ref_name);
-			get_sha1_hex(start, ref->old_sha1);
+			ref = alloc_ref(ref_name);
+			get_oid_hex(start, &ref->old_oid);
 			if (!refs)
 				refs = ref;
 			if (last_ref)
@@ -351,7 +348,7 @@
 		if (posn->symref)
 			printf("@%s %s\n", posn->symref, posn->name);
 		else
-			printf("%s %s\n", sha1_to_hex(posn->old_sha1), posn->name);
+			printf("%s %s\n", oid_to_hex(&posn->old_oid), posn->name);
 	}
 	printf("\n");
 	fflush(stdout);
@@ -442,8 +439,20 @@
 	err = run_one_slot(slot, results);
 
 	if (err != HTTP_OK && err != HTTP_REAUTH) {
-		error("RPC failed; result=%d, HTTP code = %ld",
-		      results->curl_result, results->http_code);
+		struct strbuf msg = STRBUF_INIT;
+		if (results->http_code && results->http_code != 200)
+			strbuf_addf(&msg, "HTTP %ld", results->http_code);
+		if (results->curl_result != CURLE_OK) {
+			if (msg.len)
+				strbuf_addch(&msg, ' ');
+			strbuf_addf(&msg, "curl %d", results->curl_result);
+			if (curl_errorstr[0]) {
+				strbuf_addch(&msg, ' ');
+				strbuf_addstr(&msg, curl_errorstr);
+			}
+		}
+		error("RPC failed; %s", msg.buf);
+		strbuf_release(&msg);
 	}
 
 	return err;
@@ -699,13 +708,14 @@
 static int fetch_dumb(int nr_heads, struct ref **to_fetch)
 {
 	struct walker *walker;
-	char **targets = xmalloc(nr_heads * sizeof(char*));
+	char **targets;
 	int ret, i;
 
+	ALLOC_ARRAY(targets, nr_heads);
 	if (options.depth)
 		die("dumb http transport does not support --depth");
 	for (i = 0; i < nr_heads; i++)
-		targets[i] = xstrdup(sha1_to_hex(to_fetch[i]->old_sha1));
+		targets[i] = xstrdup(oid_to_hex(&to_fetch[i]->old_oid));
 
 	walker = get_http_walker(url.buf);
 	walker->get_all = 1;
@@ -766,7 +776,7 @@
 		if (!*ref->name)
 			die("cannot fetch by sha1 over smart http");
 		packet_buf_write(&preamble, "%s %s\n",
-				 sha1_to_hex(ref->old_sha1), ref->name);
+				 oid_to_hex(&ref->old_oid), ref->name);
 	}
 	packet_buf_flush(&preamble);
 
@@ -806,19 +816,19 @@
 		if (skip_prefix(buf->buf, "fetch ", &p)) {
 			const char *name;
 			struct ref *ref;
-			unsigned char old_sha1[20];
+			struct object_id old_oid;
 
-			if (strlen(p) < 40 || get_sha1_hex(p, old_sha1))
+			if (get_oid_hex(p, &old_oid))
 				die("protocol error: expected sha/ref, got %s'", p);
-			if (p[40] == ' ')
-				name = p + 41;
-			else if (!p[40])
+			if (p[GIT_SHA1_HEXSZ] == ' ')
+				name = p + GIT_SHA1_HEXSZ + 1;
+			else if (!p[GIT_SHA1_HEXSZ])
 				name = "";
 			else
 				die("protocol error: expected sha/ref, got %s'", p);
 
 			ref = alloc_ref(name);
-			hashcpy(ref->old_sha1, old_sha1);
+			oidcpy(&ref->old_oid, &old_oid);
 
 			*list = ref;
 			list = &ref->next;
@@ -848,23 +858,22 @@
 
 static int push_dav(int nr_spec, char **specs)
 {
-	const char **argv = xmalloc((10 + nr_spec) * sizeof(char*));
-	int argc = 0, i;
+	struct child_process child = CHILD_PROCESS_INIT;
+	size_t i;
 
-	argv[argc++] = "http-push";
-	argv[argc++] = "--helper-status";
+	child.git_cmd = 1;
+	argv_array_push(&child.args, "http-push");
+	argv_array_push(&child.args, "--helper-status");
 	if (options.dry_run)
-		argv[argc++] = "--dry-run";
+		argv_array_push(&child.args, "--dry-run");
 	if (options.verbosity > 1)
-		argv[argc++] = "--verbose";
-	argv[argc++] = url.buf;
+		argv_array_push(&child.args, "--verbose");
+	argv_array_push(&child.args, url.buf);
 	for (i = 0; i < nr_spec; i++)
-		argv[argc++] = specs[i];
-	argv[argc++] = NULL;
+		argv_array_push(&child.args, specs[i]);
 
-	if (run_command_v_opt(argv, RUN_GIT_CMD))
-		die("git-%s failed", argv[0]);
-	free(argv);
+	if (run_command(&child))
+		die("git-http-push failed");
 	return 0;
 }
 
diff --git a/remote.c b/remote.c
index ee6edfa..6e5c1a8 100644
--- a/remote.c
+++ b/remote.c
@@ -8,6 +8,7 @@
 #include "tag.h"
 #include "string-list.h"
 #include "mergesort.h"
+#include "argv-array.h"
 
 enum map_direction { FROM_SRC, FROM_DST };
 
@@ -54,9 +55,6 @@
 static struct rewrites rewrites;
 static struct rewrites rewrites_push;
 
-#define BUF_SIZE (2048)
-static char buffer[BUF_SIZE];
-
 static int valid_remote(const struct remote *remote)
 {
 	return (!!remote->url) || (!!remote->foreign_vcs);
@@ -65,7 +63,6 @@
 static const char *alias_url(const char *url, struct rewrites *r)
 {
 	int i, j;
-	char *ret;
 	struct counted_string *longest;
 	int longest_i;
 
@@ -86,11 +83,7 @@
 	if (!longest)
 		return url;
 
-	ret = xmalloc(r->rewrite[longest_i]->baselen +
-		     (strlen(url) - longest->len) + 1);
-	strcpy(ret, r->rewrite[longest_i]->base);
-	strcpy(ret + r->rewrite[longest_i]->baselen, url + longest->len);
-	return ret;
+	return xstrfmt("%s%s", r->rewrite[longest_i]->base, url + longest->len);
 }
 
 static void add_push_refspec(struct remote *remote, const char *ref)
@@ -248,106 +241,77 @@
 	rewrite->instead_of_nr++;
 }
 
+static const char *skip_spaces(const char *s)
+{
+	while (isspace(*s))
+		s++;
+	return s;
+}
+
 static void read_remotes_file(struct remote *remote)
 {
+	struct strbuf buf = STRBUF_INIT;
 	FILE *f = fopen(git_path("remotes/%s", remote->name), "r");
 
 	if (!f)
 		return;
 	remote->origin = REMOTE_REMOTES;
-	while (fgets(buffer, BUF_SIZE, f)) {
-		int value_list;
-		char *s, *p;
+	while (strbuf_getline(&buf, f, '\n') != EOF) {
+		const char *v;
 
-		if (starts_with(buffer, "URL:")) {
-			value_list = 0;
-			s = buffer + 4;
-		} else if (starts_with(buffer, "Push:")) {
-			value_list = 1;
-			s = buffer + 5;
-		} else if (starts_with(buffer, "Pull:")) {
-			value_list = 2;
-			s = buffer + 5;
-		} else
-			continue;
+		strbuf_rtrim(&buf);
 
-		while (isspace(*s))
-			s++;
-		if (!*s)
-			continue;
-
-		p = s + strlen(s);
-		while (isspace(p[-1]))
-			*--p = 0;
-
-		switch (value_list) {
-		case 0:
-			add_url_alias(remote, xstrdup(s));
-			break;
-		case 1:
-			add_push_refspec(remote, xstrdup(s));
-			break;
-		case 2:
-			add_fetch_refspec(remote, xstrdup(s));
-			break;
-		}
+		if (skip_prefix(buf.buf, "URL:", &v))
+			add_url_alias(remote, xstrdup(skip_spaces(v)));
+		else if (skip_prefix(buf.buf, "Push:", &v))
+			add_push_refspec(remote, xstrdup(skip_spaces(v)));
+		else if (skip_prefix(buf.buf, "Pull:", &v))
+			add_fetch_refspec(remote, xstrdup(skip_spaces(v)));
 	}
+	strbuf_release(&buf);
 	fclose(f);
 }
 
 static void read_branches_file(struct remote *remote)
 {
 	char *frag;
-	struct strbuf branch = STRBUF_INIT;
-	int n = 1000;
-	FILE *f = fopen(git_path("branches/%.*s", n, remote->name), "r");
-	char *s, *p;
-	int len;
+	struct strbuf buf = STRBUF_INIT;
+	FILE *f = fopen(git_path("branches/%s", remote->name), "r");
 
 	if (!f)
 		return;
-	s = fgets(buffer, BUF_SIZE, f);
+
+	strbuf_getline(&buf, f, '\n');
 	fclose(f);
-	if (!s)
+	strbuf_trim(&buf);
+	if (!buf.len) {
+		strbuf_release(&buf);
 		return;
-	while (isspace(*s))
-		s++;
-	if (!*s)
-		return;
+	}
+
 	remote->origin = REMOTE_BRANCHES;
-	p = s + strlen(s);
-	while (isspace(p[-1]))
-		*--p = 0;
-	len = p - s;
-	p = xmalloc(len + 1);
-	strcpy(p, s);
 
 	/*
 	 * The branches file would have URL and optionally
 	 * #branch specified.  The "master" (or specified) branch is
-	 * fetched and stored in the local branch of the same name.
+	 * fetched and stored in the local branch matching the
+	 * remote name.
 	 */
-	frag = strchr(p, '#');
-	if (frag) {
+	frag = strchr(buf.buf, '#');
+	if (frag)
 		*(frag++) = '\0';
-		strbuf_addf(&branch, "refs/heads/%s", frag);
-	} else
-		strbuf_addstr(&branch, "refs/heads/master");
+	else
+		frag = "master";
 
-	strbuf_addf(&branch, ":refs/heads/%s", remote->name);
-	add_url_alias(remote, p);
-	add_fetch_refspec(remote, strbuf_detach(&branch, NULL));
+	add_url_alias(remote, strbuf_detach(&buf, NULL));
+	add_fetch_refspec(remote, xstrfmt("refs/heads/%s:refs/heads/%s",
+					  frag, remote->name));
+
 	/*
 	 * Cogito compatible push: push current HEAD to remote #branch
 	 * (master if missing)
 	 */
-	strbuf_init(&branch, 0);
-	strbuf_addstr(&branch, "HEAD");
-	if (frag)
-		strbuf_addf(&branch, ":refs/heads/%s", frag);
-	else
-		strbuf_addstr(&branch, ":refs/heads/master");
-	add_push_refspec(remote, strbuf_detach(&branch, NULL));
+	add_push_refspec(remote, xstrfmt("HEAD:refs/heads/%s", frag));
 	remote->fetch_tags = 1; /* always auto-follow */
 }
 
@@ -492,7 +456,7 @@
 static void read_config(void)
 {
 	static int loaded;
-	unsigned char sha1[20];
+	struct object_id oid;
 	const char *head_ref;
 	int flag;
 
@@ -501,7 +465,7 @@
 	loaded = 1;
 
 	current_branch = NULL;
-	head_ref = resolve_ref_unsafe("HEAD", 0, sha1, &flag);
+	head_ref = resolve_ref_unsafe("HEAD", 0, oid.hash, &flag);
 	if (head_ref && (flag & REF_ISSYMREF) &&
 	    skip_prefix(head_ref, "refs/heads/", &head_ref)) {
 		current_branch = make_branch(head_ref, 0);
@@ -580,12 +544,12 @@
 		flags = REFNAME_ALLOW_ONELEVEL | (is_glob ? REFNAME_REFSPEC_PATTERN : 0);
 
 		if (fetch) {
-			unsigned char unused[40];
+			struct object_id unused;
 
 			/* LHS */
 			if (!*rs[i].src)
 				; /* empty is ok; it means "HEAD" */
-			else if (llen == 40 && !get_sha1_hex(rs[i].src, unused))
+			else if (llen == GIT_SHA1_HEXSZ && !get_oid_hex(rs[i].src, &unused))
 				rs[i].exact_sha1 = 1; /* ok */
 			else if (!check_refname_format(rs[i].src, flags))
 				; /* valid looking ref is ok */
@@ -964,7 +928,7 @@
 		const char *name)
 {
 	size_t len = strlen(name);
-	struct ref *ref = xcalloc(1, sizeof(struct ref) + prefixlen + len + 1);
+	struct ref *ref = xcalloc(1, st_add4(sizeof(*ref), prefixlen, len, 1));
 	memcpy(ref->name, prefix, prefixlen);
 	memcpy(ref->name + prefixlen, name, len);
 	return ref;
@@ -981,9 +945,9 @@
 	size_t len;
 	if (!ref)
 		return NULL;
-	len = strlen(ref->name);
-	cpy = xmalloc(sizeof(struct ref) + len + 1);
-	memcpy(cpy, ref, sizeof(struct ref) + len + 1);
+	len = st_add3(sizeof(struct ref), strlen(ref->name), 1);
+	cpy = xmalloc(len);
+	memcpy(cpy, ref, len);
 	cpy->next = NULL;
 	cpy->symref = xstrdup_or_null(ref->symref);
 	cpy->remote_status = xstrdup_or_null(ref->remote_status);
@@ -1111,14 +1075,14 @@
 static struct ref *alloc_delete_ref(void)
 {
 	struct ref *ref = alloc_ref("(delete)");
-	hashclr(ref->new_sha1);
+	oidclr(&ref->new_oid);
 	return ref;
 }
 
 static int try_explicit_object_name(const char *name,
 				    struct ref **match)
 {
-	unsigned char sha1[20];
+	struct object_id oid;
 
 	if (!*name) {
 		if (match)
@@ -1126,12 +1090,12 @@
 		return 0;
 	}
 
-	if (get_sha1(name, sha1))
+	if (get_sha1(name, oid.hash))
 		return -1;
 
 	if (match) {
 		*match = alloc_ref(name);
-		hashcpy((*match)->new_sha1, sha1);
+		oidcpy(&(*match)->new_oid, &oid);
 	}
 	return 0;
 }
@@ -1146,10 +1110,10 @@
 static char *guess_ref(const char *name, struct ref *peer)
 {
 	struct strbuf buf = STRBUF_INIT;
-	unsigned char sha1[20];
+	struct object_id oid;
 
 	const char *r = resolve_ref_unsafe(peer->name, RESOLVE_REF_READING,
-					   sha1, NULL);
+					   oid.hash, NULL);
 	if (!r)
 		return NULL;
 
@@ -1207,12 +1171,12 @@
 		return -1;
 
 	if (!dst_value) {
-		unsigned char sha1[20];
+		struct object_id oid;
 		int flag;
 
 		dst_value = resolve_ref_unsafe(matched_src->name,
 					       RESOLVE_REF_READING,
-					       sha1, &flag);
+					       oid.hash, &flag);
 		if (!dst_value ||
 		    ((flag & REF_ISSYMREF) &&
 		     !starts_with(dst_value, "refs/heads/")))
@@ -1226,7 +1190,7 @@
 	case 0:
 		if (starts_with(dst_value, "refs/"))
 			matched_dst = make_linked_ref(dst_value, dst_tail);
-		else if (is_null_sha1(matched_src->new_sha1))
+		else if (is_null_oid(&matched_src->new_oid))
 			error("unable to delete '%s': remote ref does not exist",
 			      dst_value);
 		else if ((dst_guess = guess_ref(dst_value, matched_src)))
@@ -1328,13 +1292,13 @@
 	int nr, alloc;
 };
 
-static void add_to_tips(struct tips *tips, const unsigned char *sha1)
+static void add_to_tips(struct tips *tips, const struct object_id *oid)
 {
 	struct commit *commit;
 
-	if (is_null_sha1(sha1))
+	if (is_null_oid(oid))
 		return;
-	commit = lookup_commit_reference_gently(sha1, 1);
+	commit = lookup_commit_reference_gently(oid->hash, 1);
 	if (!commit || (commit->object.flags & TMP_MARK))
 		return;
 	commit->object.flags |= TMP_MARK;
@@ -1357,10 +1321,10 @@
 	memset(&sent_tips, 0, sizeof(sent_tips));
 	for (ref = *dst; ref; ref = ref->next) {
 		if (ref->peer_ref &&
-		    !is_null_sha1(ref->peer_ref->new_sha1))
-			add_to_tips(&sent_tips, ref->peer_ref->new_sha1);
+		    !is_null_oid(&ref->peer_ref->new_oid))
+			add_to_tips(&sent_tips, &ref->peer_ref->new_oid);
 		else
-			add_to_tips(&sent_tips, ref->old_sha1);
+			add_to_tips(&sent_tips, &ref->old_oid);
 		if (starts_with(ref->name, "refs/tags/"))
 			string_list_append(&dst_tag, ref->name);
 	}
@@ -1374,7 +1338,7 @@
 			continue; /* not a tag */
 		if (string_list_has_string(&dst_tag, ref->name))
 			continue; /* they already have it */
-		if (sha1_object_info(ref->new_sha1, NULL) != OBJ_TAG)
+		if (sha1_object_info(ref->new_oid.hash, NULL) != OBJ_TAG)
 			continue; /* be conservative */
 		item = string_list_append(&src_tag, ref->name);
 		item->util = ref;
@@ -1394,9 +1358,9 @@
 			struct ref *dst_ref;
 			struct commit *commit;
 
-			if (is_null_sha1(ref->new_sha1))
+			if (is_null_oid(&ref->new_oid))
 				continue;
-			commit = lookup_commit_reference_gently(ref->new_sha1, 1);
+			commit = lookup_commit_reference_gently(ref->new_oid.hash, 1);
 			if (!commit)
 				/* not pushing a commit, which is not an error */
 				continue;
@@ -1410,7 +1374,7 @@
 
 			/* Add it in */
 			dst_ref = make_linked_ref(ref->name, dst_tail);
-			hashcpy(dst_ref->new_sha1, ref->new_sha1);
+			oidcpy(&dst_ref->new_oid, &ref->new_oid);
 			dst_ref->peer_ref = copy_ref(ref);
 		}
 	}
@@ -1517,7 +1481,7 @@
 
 			/* Create a new one and link it */
 			dst_peer = make_linked_ref(dst_name, &dst_tail);
-			hashcpy(dst_peer->new_sha1, ref->new_sha1);
+			oidcpy(&dst_peer->new_oid, &ref->new_oid);
 			string_list_insert(&dst_ref_index,
 				dst_peer->name)->util = dst_peer;
 		}
@@ -1569,23 +1533,20 @@
 		int reject_reason = 0;
 
 		if (ref->peer_ref)
-			hashcpy(ref->new_sha1, ref->peer_ref->new_sha1);
+			oidcpy(&ref->new_oid, &ref->peer_ref->new_oid);
 		else if (!send_mirror)
 			continue;
 
-		ref->deletion = is_null_sha1(ref->new_sha1);
+		ref->deletion = is_null_oid(&ref->new_oid);
 		if (!ref->deletion &&
-			!hashcmp(ref->old_sha1, ref->new_sha1)) {
+			!oidcmp(&ref->old_oid, &ref->new_oid)) {
 			ref->status = REF_STATUS_UPTODATE;
 			continue;
 		}
 
 		/*
-		 * Bypass the usual "must fast-forward" check but
-		 * replace it with a weaker "the old value must be
-		 * this value we observed".  If the remote ref has
-		 * moved and is now different from what we expect,
-		 * reject any push.
+		 * If the remote ref has moved and is now different
+		 * from what we expect, reject any push.
 		 *
 		 * It also is an error if the user told us to check
 		 * with the remote-tracking branch to find the value
@@ -1594,12 +1555,16 @@
 		 */
 		if (ref->expect_old_sha1) {
 			if (ref->expect_old_no_trackback ||
-			    hashcmp(ref->old_sha1, ref->old_sha1_expect))
+			    oidcmp(&ref->old_oid, &ref->old_oid_expect))
 				reject_reason = REF_STATUS_REJECT_STALE;
+			else
+				/* If the ref isn't stale then force the update. */
+				force_ref_update = 1;
 		}
 
 		/*
-		 * The usual "must fast-forward" rules.
+		 * If the update isn't already rejected then check
+		 * the usual "must fast-forward" rules.
 		 *
 		 * Decide whether an individual refspec A:B can be
 		 * pushed.  The push will succeed if any of the
@@ -1618,15 +1583,15 @@
 		 *     passing the --force argument
 		 */
 
-		else if (!ref->deletion && !is_null_sha1(ref->old_sha1)) {
+		if (!reject_reason && !ref->deletion && !is_null_oid(&ref->old_oid)) {
 			if (starts_with(ref->name, "refs/tags/"))
 				reject_reason = REF_STATUS_REJECT_ALREADY_EXISTS;
-			else if (!has_sha1_file(ref->old_sha1))
+			else if (!has_object_file(&ref->old_oid))
 				reject_reason = REF_STATUS_REJECT_FETCH_FIRST;
-			else if (!lookup_commit_reference_gently(ref->old_sha1, 1) ||
-				 !lookup_commit_reference_gently(ref->new_sha1, 1))
+			else if (!lookup_commit_reference_gently(ref->old_oid.hash, 1) ||
+				 !lookup_commit_reference_gently(ref->new_oid.hash, 1))
 				reject_reason = REF_STATUS_REJECT_NEEDS_FORCE;
-			else if (!ref_newer(ref->new_sha1, ref->old_sha1))
+			else if (!ref_newer(&ref->new_oid, &ref->old_oid))
 				reject_reason = REF_STATUS_REJECT_NONFASTFORWARD;
 		}
 
@@ -1645,7 +1610,7 @@
 {
 	struct remote *remote;
 	char *ref;
-	unsigned char sha1[20];
+	struct object_id oid;
 	int i;
 
 	if (!ret)
@@ -1671,7 +1636,7 @@
 		    strcmp(ret->remote_name, "."))
 			continue;
 		if (dwim_ref(ret->merge_name[i], strlen(ret->merge_name[i]),
-			     sha1, &ref) == 1)
+			     oid.hash, &ref) == 1)
 			ret->merge[i]->dst = ref;
 		else
 			ret->merge[i]->dst = xstrdup(ret->merge_name[i]);
@@ -1831,10 +1796,10 @@
 
 static int ignore_symref_update(const char *refname)
 {
-	unsigned char sha1[20];
+	struct object_id oid;
 	int flag;
 
-	if (!resolve_ref_unsafe(refname, 0, sha1, &flag))
+	if (!resolve_ref_unsafe(refname, 0, oid.hash, &flag))
 		return 0; /* non-existing refs are OK */
 	return (flag & REF_ISSYMREF);
 }
@@ -1925,7 +1890,7 @@
 
 		if (refspec->exact_sha1) {
 			ref_map = alloc_ref(name);
-			get_sha1_hex(name, ref_map->old_sha1);
+			get_oid_hex(name, &ref_map->old_oid);
 		} else {
 			ref_map = get_remote_ref(remote_refs, name);
 		}
@@ -1966,7 +1931,7 @@
 		return 0;
 	for (; list; list = list->next)
 		if (!strcmp(ref->symref, list->name)) {
-			hashcpy(ref->old_sha1, list->old_sha1);
+			oidcpy(&ref->old_oid, &list->old_oid);
 			return 0;
 		}
 	return 1;
@@ -1980,7 +1945,7 @@
 	}
 }
 
-int ref_newer(const unsigned char *new_sha1, const unsigned char *old_sha1)
+int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid)
 {
 	struct object *o;
 	struct commit *old, *new;
@@ -1991,12 +1956,12 @@
 	 * Both new and old must be commit-ish and new is descendant of
 	 * old.  Otherwise we require --force.
 	 */
-	o = deref_tag(parse_object(old_sha1), NULL, 0);
+	o = deref_tag(parse_object(old_oid->hash), NULL, 0);
 	if (!o || o->type != OBJ_COMMIT)
 		return 0;
 	old = (struct commit *) o;
 
-	o = deref_tag(parse_object(new_sha1), NULL, 0);
+	o = deref_tag(parse_object(new_oid->hash), NULL, 0);
 	if (!o || o->type != OBJ_COMMIT)
 		return 0;
 	new = (struct commit *) o;
@@ -2031,12 +1996,11 @@
 int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
 		       const char **upstream_name)
 {
-	unsigned char sha1[20];
+	struct object_id oid;
 	struct commit *ours, *theirs;
-	char symmetric[84];
 	struct rev_info revs;
-	const char *rev_argv[10], *base;
-	int rev_argc;
+	const char *base;
+	struct argv_array argv = ARGV_ARRAY_INIT;
 
 	/* Cannot stat unless we are marked to build on top of somebody else. */
 	base = branch_get_upstream(branch, NULL);
@@ -2046,15 +2010,15 @@
 		return -1;
 
 	/* Cannot stat if what we used to build on no longer exists */
-	if (read_ref(base, sha1))
+	if (read_ref(base, oid.hash))
 		return -1;
-	theirs = lookup_commit_reference(sha1);
+	theirs = lookup_commit_reference(oid.hash);
 	if (!theirs)
 		return -1;
 
-	if (read_ref(branch->refname, sha1))
+	if (read_ref(branch->refname, oid.hash))
 		return -1;
-	ours = lookup_commit_reference(sha1);
+	ours = lookup_commit_reference(oid.hash);
 	if (!ours)
 		return -1;
 
@@ -2065,19 +2029,15 @@
 	}
 
 	/* Run "rev-list --left-right ours...theirs" internally... */
-	rev_argc = 0;
-	rev_argv[rev_argc++] = NULL;
-	rev_argv[rev_argc++] = "--left-right";
-	rev_argv[rev_argc++] = symmetric;
-	rev_argv[rev_argc++] = "--";
-	rev_argv[rev_argc] = NULL;
-
-	strcpy(symmetric, sha1_to_hex(ours->object.sha1));
-	strcpy(symmetric + 40, "...");
-	strcpy(symmetric + 43, sha1_to_hex(theirs->object.sha1));
+	argv_array_push(&argv, ""); /* ignored */
+	argv_array_push(&argv, "--left-right");
+	argv_array_pushf(&argv, "%s...%s",
+			 oid_to_hex(&ours->object.oid),
+			 oid_to_hex(&theirs->object.oid));
+	argv_array_push(&argv, "--");
 
 	init_revisions(&revs, NULL);
-	setup_revisions(rev_argc, rev_argv, &revs, NULL);
+	setup_revisions(argv.argc, argv.argv, &revs, NULL);
 	if (prepare_revision_walk(&revs))
 		die("revision walk setup failed");
 
@@ -2097,6 +2057,8 @@
 	/* clear object flags smudged by the above traversal */
 	clear_commit_marks(ours, ALL_REV_FLAGS);
 	clear_commit_marks(theirs, ALL_REV_FLAGS);
+
+	argv_array_clear(&argv);
 	return 0;
 }
 
@@ -2171,16 +2133,13 @@
 {
 	struct ref ***local_tail = cb_data;
 	struct ref *ref;
-	int len;
 
 	/* we already know it starts with refs/ to get here */
 	if (check_refname_format(refname + 5, 0))
 		return 0;
 
-	len = strlen(refname) + 1;
-	ref = xcalloc(1, sizeof(*ref) + len);
-	hashcpy(ref->new_sha1, oid->hash);
-	memcpy(ref->name, refname, len);
+	ref = alloc_ref(refname);
+	oidcpy(&ref->new_oid, oid);
 	**local_tail = ref;
 	*local_tail = &ref->next;
 	return 0;
@@ -2216,7 +2175,7 @@
 	/* If refs/heads/master could be right, it is. */
 	if (!all) {
 		r = find_ref_by_name(refs, "refs/heads/master");
-		if (r && !hashcmp(r->old_sha1, head->old_sha1))
+		if (r && !oidcmp(&r->old_oid, &head->old_oid))
 			return copy_ref(r);
 	}
 
@@ -2224,7 +2183,7 @@
 	for (r = refs; r; r = r->next) {
 		if (r != head &&
 		    starts_with(r->name, "refs/heads/") &&
-		    !hashcmp(r->old_sha1, head->old_sha1)) {
+		    !oidcmp(&r->old_oid, &head->old_oid)) {
 			*tail = copy_ref(r);
 			tail = &((*tail)->next);
 			if (!all)
@@ -2272,7 +2231,7 @@
 
 	if (stale) {
 		struct ref *ref = make_linked_ref(refname, &info->stale_refs_tail);
-		hashcpy(ref->new_sha1, oid->hash);
+		oidcpy(&ref->new_oid, oid);
 	}
 
 clean_exit:
@@ -2367,14 +2326,14 @@
  * If we cannot do so, return negative to signal an error.
  */
 static int remote_tracking(struct remote *remote, const char *refname,
-			   unsigned char sha1[20])
+			   struct object_id *oid)
 {
 	char *dst;
 
 	dst = apply_refspecs(remote->fetch, remote->fetch_refspec_nr, refname);
 	if (!dst)
 		return -1; /* no tracking ref for refname at remote */
-	if (read_ref(dst, sha1))
+	if (read_ref(dst, oid->hash))
 		return -1; /* we know what the tracking ref is but we cannot read it */
 	return 0;
 }
@@ -2392,8 +2351,8 @@
 			continue;
 		ref->expect_old_sha1 = 1;
 		if (!entry->use_tracking)
-			hashcpy(ref->old_sha1_expect, cas->entry[i].expect);
-		else if (remote_tracking(remote, ref->name, ref->old_sha1_expect))
+			hashcpy(ref->old_oid_expect.hash, cas->entry[i].expect);
+		else if (remote_tracking(remote, ref->name, &ref->old_oid_expect))
 			ref->expect_old_no_trackback = 1;
 		return;
 	}
@@ -2403,7 +2362,7 @@
 		return;
 
 	ref->expect_old_sha1 = 1;
-	if (remote_tracking(remote, ref->name, ref->old_sha1_expect))
+	if (remote_tracking(remote, ref->name, &ref->old_oid_expect))
 		ref->expect_old_no_trackback = 1;
 }
 
diff --git a/remote.h b/remote.h
index 312b7ca..4a039ba 100644
--- a/remote.h
+++ b/remote.h
@@ -79,9 +79,9 @@
 
 struct ref {
 	struct ref *next;
-	unsigned char old_sha1[20];
-	unsigned char new_sha1[20];
-	unsigned char old_sha1_expect[20]; /* used by expect-old */
+	struct object_id old_oid;
+	struct object_id new_oid;
+	struct object_id old_oid_expect; /* used by expect-old */
 	char *symref;
 	unsigned int
 		force:1,
@@ -150,7 +150,7 @@
 				     struct sha1_array *shallow);
 
 int resolve_remote_symref(struct ref *ref, struct ref *list);
-int ref_newer(const unsigned char *new_sha1, const unsigned char *old_sha1);
+int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid);
 
 /*
  * Remove and free all but the first of any entries in the input list
diff --git a/rerere.c b/rerere.c
index d90057b..403c700 100644
--- a/rerere.c
+++ b/rerere.c
@@ -20,45 +20,74 @@
 /* automatically update cleanly resolved paths to the index */
 static int rerere_autoupdate;
 
-const char *rerere_path(const char *hex, const char *file)
+static void free_rerere_id(struct string_list_item *item)
 {
-	return git_path("rr-cache/%s/%s", hex, file);
+	free(item->util);
 }
 
-static int has_rerere_resolution(const char *hex)
+static const char *rerere_id_hex(const struct rerere_id *id)
+{
+	return id->hex;
+}
+
+const char *rerere_path(const struct rerere_id *id, const char *file)
+{
+	if (!file)
+		return git_path("rr-cache/%s", rerere_id_hex(id));
+
+	return git_path("rr-cache/%s/%s", rerere_id_hex(id), file);
+}
+
+static int has_rerere_resolution(const struct rerere_id *id)
 {
 	struct stat st;
-	return !stat(rerere_path(hex, "postimage"), &st);
+
+	return !stat(rerere_path(id, "postimage"), &st);
 }
 
+static struct rerere_id *new_rerere_id_hex(char *hex)
+{
+	struct rerere_id *id = xmalloc(sizeof(*id));
+	strcpy(id->hex, hex);
+	return id;
+}
+
+static struct rerere_id *new_rerere_id(unsigned char *sha1)
+{
+	return new_rerere_id_hex(sha1_to_hex(sha1));
+}
+
+/*
+ * $GIT_DIR/MERGE_RR file is a collection of records, each of which is
+ * "conflict ID", a HT and pathname, terminated with a NUL, and is
+ * used to keep track of the set of paths that "rerere" may need to
+ * work on (i.e. what is left by the previous invocation of "git
+ * rerere" during the current conflict resolution session).
+ */
 static void read_rr(struct string_list *rr)
 {
-	unsigned char sha1[20];
-	char buf[PATH_MAX];
+	struct strbuf buf = STRBUF_INIT;
 	FILE *in = fopen(git_path_merge_rr(), "r");
+
 	if (!in)
 		return;
-	while (fread(buf, 40, 1, in) == 1) {
-		int i;
-		char *name;
-		if (get_sha1_hex(buf, sha1))
+	while (!strbuf_getwholeline(&buf, in, '\0')) {
+		char *path;
+		unsigned char sha1[20];
+		struct rerere_id *id;
+
+		/* There has to be the hash, tab, path and then NUL */
+		if (buf.len < 42 || get_sha1_hex(buf.buf, sha1))
 			die("corrupt MERGE_RR");
-		buf[40] = '\0';
-		name = xstrdup(buf);
-		if (fgetc(in) != '\t')
+
+		if (buf.buf[40] != '\t')
 			die("corrupt MERGE_RR");
-		for (i = 0; i < sizeof(buf); i++) {
-			int c = fgetc(in);
-			if (c < 0)
-				die("corrupt MERGE_RR");
-			buf[i] = c;
-			if (c == 0)
-				 break;
-		}
-		if (i == sizeof(buf))
-			die("filename too long");
-		string_list_insert(rr, buf)->util = name;
+		buf.buf[40] = '\0';
+		path = buf.buf + 41;
+		id = new_rerere_id_hex(buf.buf);
+		string_list_insert(rr, path)->util = id;
 	}
+	strbuf_release(&buf);
 	fclose(in);
 }
 
@@ -68,22 +97,42 @@
 {
 	int i;
 	for (i = 0; i < rr->nr; i++) {
-		const char *path;
-		int length;
-		if (!rr->items[i].util)
+		struct strbuf buf = STRBUF_INIT;
+		struct rerere_id *id;
+
+		assert(rr->items[i].util != RERERE_RESOLVED);
+
+		id = rr->items[i].util;
+		if (!id)
 			continue;
-		path = rr->items[i].string;
-		length = strlen(path) + 1;
-		if (write_in_full(out_fd, rr->items[i].util, 40) != 40 ||
-		    write_str_in_full(out_fd, "\t") != 1 ||
-		    write_in_full(out_fd, path, length) != length)
+		strbuf_addf(&buf, "%s\t%s%c",
+			    rerere_id_hex(id),
+			    rr->items[i].string, 0);
+		if (write_in_full(out_fd, buf.buf, buf.len) != buf.len)
 			die("unable to write rerere record");
+
+		strbuf_release(&buf);
 	}
 	if (commit_lock_file(&write_lock) != 0)
 		die("unable to write rerere record");
 	return 0;
 }
 
+/*
+ * "rerere" interacts with conflicted file contents using this I/O
+ * abstraction.  It reads a conflicted contents from one place via
+ * "getline()" method, and optionally can write it out after
+ * normalizing the conflicted hunks to the "output".  Subclasses of
+ * rerere_io embed this structure at the beginning of their own
+ * rerere_io object.
+ */
+struct rerere_io {
+	int (*getline)(struct strbuf *, struct rerere_io *);
+	FILE *output;
+	int wrerror;
+	/* some more stuff */
+};
+
 static void ferr_write(const void *p, size_t count, FILE *fp, int *err)
 {
 	if (!count || *err)
@@ -97,31 +146,34 @@
 	ferr_write(s, strlen(s), fp, err);
 }
 
-struct rerere_io {
-	int (*getline)(struct strbuf *, struct rerere_io *);
-	FILE *output;
-	int wrerror;
-	/* some more stuff */
-};
-
 static void rerere_io_putstr(const char *str, struct rerere_io *io)
 {
 	if (io->output)
 		ferr_puts(str, io->output, &io->wrerror);
 }
 
+/*
+ * Write a conflict marker to io->output (if defined).
+ */
 static void rerere_io_putconflict(int ch, int size, struct rerere_io *io)
 {
 	char buf[64];
 
 	while (size) {
-		if (size < sizeof(buf) - 2) {
+		if (size <= sizeof(buf) - 2) {
 			memset(buf, ch, size);
 			buf[size] = '\n';
 			buf[size + 1] = '\0';
 			size = 0;
 		} else {
 			int sz = sizeof(buf) - 1;
+
+			/*
+			 * Make sure we will not write everything out
+			 * in this round by leaving at least 1 byte
+			 * for the next round, giving the next round
+			 * a chance to add the terminating LF.  Yuck.
+			 */
 			if (size <= sz)
 				sz -= (sz - size) + 1;
 			memset(buf, ch, sz);
@@ -138,19 +190,42 @@
 		ferr_write(mem, sz, io->output, &io->wrerror);
 }
 
+/*
+ * Subclass of rerere_io that reads from an on-disk file
+ */
 struct rerere_io_file {
 	struct rerere_io io;
 	FILE *input;
 };
 
+/*
+ * ... and its getline() method implementation
+ */
 static int rerere_file_getline(struct strbuf *sb, struct rerere_io *io_)
 {
 	struct rerere_io_file *io = (struct rerere_io_file *)io_;
 	return strbuf_getwholeline(sb, io->input, '\n');
 }
 
-static int is_cmarker(char *buf, int marker_char, int marker_size, int want_sp)
+/*
+ * Require the exact number of conflict marker letters, no more, no
+ * less, followed by SP or any whitespace
+ * (including LF).
+ */
+static int is_cmarker(char *buf, int marker_char, int marker_size)
 {
+	int want_sp;
+
+	/*
+	 * The beginning of our version and the end of their version
+	 * always are labeled like "<<<<< ours" or ">>>>> theirs",
+	 * hence we set want_sp for them.  Note that the version from
+	 * the common ancestor in diff3-style output is not always
+	 * labelled (e.g. "||||| common" is often seen but "|||||"
+	 * alone is also valid), so we do not set want_sp.
+	 */
+	want_sp = (marker_char == '<') || (marker_char == '>');
+
 	while (marker_size--)
 		if (*buf++ != marker_char)
 			return 0;
@@ -159,6 +234,21 @@
 	return isspace(*buf);
 }
 
+/*
+ * Read contents a file with conflicts, normalize the conflicts
+ * by (1) discarding the common ancestor version in diff3-style,
+ * (2) reordering our side and their side so that whichever sorts
+ * alphabetically earlier comes before the other one, while
+ * computing the "conflict ID", which is just an SHA-1 hash of
+ * one side of the conflict, NUL, the other side of the conflict,
+ * and NUL concatenated together.
+ *
+ * Return the number of conflict hunks found.
+ *
+ * NEEDSWORK: the logic and theory of operation behind this conflict
+ * normalization may deserve to be documented somewhere, perhaps in
+ * Documentation/technical/rerere.txt.
+ */
 static int handle_path(unsigned char *sha1, struct rerere_io *io, int marker_size)
 {
 	git_SHA_CTX ctx;
@@ -173,19 +263,19 @@
 		git_SHA1_Init(&ctx);
 
 	while (!io->getline(&buf, io)) {
-		if (is_cmarker(buf.buf, '<', marker_size, 1)) {
+		if (is_cmarker(buf.buf, '<', marker_size)) {
 			if (hunk != RR_CONTEXT)
 				goto bad;
 			hunk = RR_SIDE_1;
-		} else if (is_cmarker(buf.buf, '|', marker_size, 0)) {
+		} else if (is_cmarker(buf.buf, '|', marker_size)) {
 			if (hunk != RR_SIDE_1)
 				goto bad;
 			hunk = RR_ORIGINAL;
-		} else if (is_cmarker(buf.buf, '=', marker_size, 0)) {
+		} else if (is_cmarker(buf.buf, '=', marker_size)) {
 			if (hunk != RR_SIDE_1 && hunk != RR_ORIGINAL)
 				goto bad;
 			hunk = RR_SIDE_2;
-		} else if (is_cmarker(buf.buf, '>', marker_size, 1)) {
+		} else if (is_cmarker(buf.buf, '>', marker_size)) {
 			if (hunk != RR_SIDE_2)
 				goto bad;
 			if (strbuf_cmp(&one, &two) > 0)
@@ -229,6 +319,10 @@
 	return hunk_no;
 }
 
+/*
+ * Scan the path for conflicts, do the "handle_path()" thing above, and
+ * return the number of conflict hunks found.
+ */
 static int handle_file(const char *path, unsigned char *sha1, const char *output)
 {
 	int hunk_no = 0;
@@ -270,11 +364,18 @@
 	return hunk_no;
 }
 
+/*
+ * Subclass of rerere_io that reads from an in-core buffer that is a
+ * strbuf
+ */
 struct rerere_io_mem {
 	struct rerere_io io;
 	struct strbuf input;
 };
 
+/*
+ * ... and its getline() method implementation
+ */
 static int rerere_mem_getline(struct strbuf *sb, struct rerere_io *io_)
 {
 	struct rerere_io_mem *io = (struct rerere_io_mem *)io_;
@@ -313,24 +414,23 @@
 		return -1;
 	pos = -pos - 1;
 
-	for (i = 0; i < 3; i++) {
+	while (pos < active_nr) {
 		enum object_type type;
 		unsigned long size;
-		int j;
 
-		if (active_nr <= pos)
-			break;
 		ce = active_cache[pos++];
 		if (ce_namelen(ce) != len || memcmp(ce->name, path, len))
-			continue;
-		j = ce_stage(ce) - 1;
-		mmfile[j].ptr = read_sha1_file(ce->sha1, &type, &size);
-		mmfile[j].size = size;
+			break;
+		i = ce_stage(ce) - 1;
+		if (!mmfile[i].ptr) {
+			mmfile[i].ptr = read_sha1_file(ce->sha1, &type, &size);
+			mmfile[i].size = size;
+		}
 	}
-	for (i = 0; i < 3; i++) {
+	for (i = 0; i < 3; i++)
 		if (!mmfile[i].ptr && !mmfile[i].size)
 			mmfile[i].ptr = xstrdup("");
-	}
+
 	/*
 	 * NEEDSWORK: handle conflicts from merges with
 	 * merge.renormalize set, too
@@ -350,6 +450,10 @@
 	strbuf_init(&io.input, 0);
 	strbuf_attach(&io.input, result.ptr, result.size, result.size);
 
+	/*
+	 * Grab the conflict ID and optionally write the original
+	 * contents with conflict markers out.
+	 */
 	hunk_no = handle_path(sha1, (struct rerere_io *)&io, marker_size);
 	strbuf_release(&io.input);
 	if (io.io.output)
@@ -357,6 +461,14 @@
 	return hunk_no;
 }
 
+/*
+ * Look at a cache entry at "i" and see if it is not conflicting,
+ * conflicting and we are willing to handle, or conflicting and
+ * we are unable to handle, and return the determination in *type.
+ * Return the cache index to be looked at next, by skipping the
+ * stages we have already looked at in this invocation of this
+ * function.
+ */
 static int check_one_conflict(int i, int *type)
 {
 	const struct cache_entry *e = active_cache[i];
@@ -367,10 +479,8 @@
 	}
 
 	*type = PUNTED;
-	if (ce_stage(e) == 1) {
-		if (active_nr <= ++i)
-			return i + 1;
-	}
+	while (ce_stage(active_cache[i]) == 1)
+		i++;
 
 	/* Only handle regular files with both stages #2 and #3 */
 	if (i + 1 < active_nr) {
@@ -390,6 +500,17 @@
 	return i;
 }
 
+/*
+ * Scan the index and find paths that have conflicts that rerere can
+ * handle, i.e. the ones that has both stages #2 and #3.
+ *
+ * NEEDSWORK: we do not record or replay a previous "resolve by
+ * deletion" for a delete-modify conflict, as that is inherently risky
+ * without knowing what modification is being discarded.  The only
+ * safe case, i.e. both side doing the deletion and modification that
+ * are identical to the previous round, might want to be handled,
+ * though.
+ */
 static int find_conflict(struct string_list *conflict)
 {
 	int i;
@@ -406,6 +527,21 @@
 	return 0;
 }
 
+/*
+ * The merge_rr list is meant to hold outstanding conflicted paths
+ * that rerere could handle.  Abuse the list by adding other types of
+ * entries to allow the caller to show "rerere remaining".
+ *
+ * - Conflicted paths that rerere does not handle are added
+ * - Conflicted paths that have been resolved are marked as such
+ *   by storing RERERE_RESOLVED to .util field (where conflict ID
+ *   is expected to be stored).
+ *
+ * Do *not* write MERGE_RR file out after calling this function.
+ *
+ * NEEDSWORK: we may want to fix the caller that implements "rerere
+ * remaining" to do this without abusing merge_rr.
+ */
 int rerere_remaining(struct string_list *merge_rr)
 {
 	int i;
@@ -424,7 +560,7 @@
 			struct string_list_item *it;
 			it = string_list_lookup(merge_rr, (const char *)e->name);
 			if (it != NULL) {
-				free(it->util);
+				free_rerere_id(it);
 				it->util = RERERE_RESOLVED;
 			}
 		}
@@ -432,40 +568,67 @@
 	return 0;
 }
 
-static int merge(const char *name, const char *path)
+/*
+ * Find the conflict identified by "id"; the change between its
+ * "preimage" (i.e. a previous contents with conflict markers) and its
+ * "postimage" (i.e. the corresponding contents with conflicts
+ * resolved) may apply cleanly to the contents stored in "path", i.e.
+ * the conflict this time around.
+ *
+ * Returns 0 for successful replay of recorded resolution, or non-zero
+ * for failure.
+ */
+static int merge(const struct rerere_id *id, const char *path)
 {
+	FILE *f;
 	int ret;
 	mmfile_t cur = {NULL, 0}, base = {NULL, 0}, other = {NULL, 0};
 	mmbuffer_t result = {NULL, 0};
 
-	if (handle_file(path, NULL, rerere_path(name, "thisimage")) < 0)
-		return 1;
-
-	if (read_mmfile(&cur, rerere_path(name, "thisimage")) ||
-			read_mmfile(&base, rerere_path(name, "preimage")) ||
-			read_mmfile(&other, rerere_path(name, "postimage"))) {
+	/*
+	 * Normalize the conflicts in path and write it out to
+	 * "thisimage" temporary file.
+	 */
+	if (handle_file(path, NULL, rerere_path(id, "thisimage")) < 0) {
 		ret = 1;
 		goto out;
 	}
-	ret = ll_merge(&result, path, &base, NULL, &cur, "", &other, "", NULL);
-	if (!ret) {
-		FILE *f;
 
-		if (utime(rerere_path(name, "postimage"), NULL) < 0)
-			warning("failed utime() on %s: %s",
-					rerere_path(name, "postimage"),
-					strerror(errno));
-		f = fopen(path, "w");
-		if (!f)
-			return error("Could not open %s: %s", path,
-				     strerror(errno));
-		if (fwrite(result.ptr, result.size, 1, f) != 1)
-			error("Could not write %s: %s", path, strerror(errno));
-		if (fclose(f))
-			return error("Writing %s failed: %s", path,
-				     strerror(errno));
+	if (read_mmfile(&cur, rerere_path(id, "thisimage")) ||
+	    read_mmfile(&base, rerere_path(id, "preimage")) ||
+	    read_mmfile(&other, rerere_path(id, "postimage"))) {
+		ret = 1;
+		goto out;
 	}
 
+	/*
+	 * A three-way merge. Note that this honors user-customizable
+	 * low-level merge driver settings.
+	 */
+	ret = ll_merge(&result, path, &base, NULL, &cur, "", &other, "", NULL);
+	if (ret)
+		goto out;
+
+	/*
+	 * A successful replay of recorded resolution.
+	 * Mark that "postimage" was used to help gc.
+	 */
+	if (utime(rerere_path(id, "postimage"), NULL) < 0)
+		warning("failed utime() on %s: %s",
+			rerere_path(id, "postimage"),
+			strerror(errno));
+
+	/* Update "path" with the resolution */
+	f = fopen(path, "w");
+	if (!f)
+		return error("Could not open %s: %s", path,
+			     strerror(errno));
+	if (fwrite(result.ptr, result.size, 1, f) != 1)
+		error("Could not write %s: %s", path, strerror(errno));
+	if (fclose(f))
+		return error("Writing %s failed: %s", path,
+			     strerror(errno));
+
 out:
 	free(cur.ptr);
 	free(base.ptr);
@@ -487,6 +650,8 @@
 		struct string_list_item *item = &update->items[i];
 		if (add_file_to_cache(item->string, 0))
 			exit(128);
+		fprintf(stderr, "Staged '%s' using previous resolution.\n",
+			item->string);
 	}
 
 	if (active_cache_changed) {
@@ -496,6 +661,41 @@
 		rollback_lock_file(&index_lock);
 }
 
+/*
+ * The path indicated by rr_item may still have conflict for which we
+ * have a recorded resolution, in which case replay it and optionally
+ * update it.  Or it may have been resolved by the user and we may
+ * only have the preimage for that conflict, in which case the result
+ * needs to be recorded as a resolution in a postimage file.
+ */
+static void do_rerere_one_path(struct string_list_item *rr_item,
+			       struct string_list *update)
+{
+	const char *path = rr_item->string;
+	const struct rerere_id *id = rr_item->util;
+
+	/* Is there a recorded resolution we could attempt to apply? */
+	if (has_rerere_resolution(id)) {
+		if (merge(id, path))
+			return; /* failed to replay */
+
+		if (rerere_autoupdate)
+			string_list_insert(update, path);
+		else
+			fprintf(stderr,
+				"Resolved '%s' using previous resolution.\n",
+				path);
+	} else if (!handle_file(path, NULL, NULL)) {
+		/* The user has resolved it. */
+		copy_file(rerere_path(id, "postimage"), path, 0666);
+		fprintf(stderr, "Recorded resolution for '%s'.\n", path);
+	} else {
+		return;
+	}
+	free_rerere_id(rr_item);
+	rr_item->util = NULL;
+}
+
 static int do_plain_rerere(struct string_list *rr, int fd)
 {
 	struct string_list conflict = STRING_LIST_INIT_DUP;
@@ -505,65 +705,55 @@
 	find_conflict(&conflict);
 
 	/*
-	 * MERGE_RR records paths with conflicts immediately after merge
-	 * failed.  Some of the conflicted paths might have been hand resolved
-	 * in the working tree since then, but the initial run would catch all
-	 * and register their preimages.
+	 * MERGE_RR records paths with conflicts immediately after
+	 * merge failed.  Some of the conflicted paths might have been
+	 * hand resolved in the working tree since then, but the
+	 * initial run would catch all and register their preimages.
 	 */
-
 	for (i = 0; i < conflict.nr; i++) {
+		struct rerere_id *id;
+		unsigned char sha1[20];
 		const char *path = conflict.items[i].string;
-		if (!string_list_has_string(rr, path)) {
-			unsigned char sha1[20];
-			char *hex;
-			int ret;
-			ret = handle_file(path, sha1, NULL);
-			if (ret < 1)
-				continue;
-			hex = xstrdup(sha1_to_hex(sha1));
-			string_list_insert(rr, path)->util = hex;
-			if (mkdir_in_gitdir(git_path("rr-cache/%s", hex)))
-				continue;
-			handle_file(path, NULL, rerere_path(hex, "preimage"));
-			fprintf(stderr, "Recorded preimage for '%s'\n", path);
-		}
-	}
-
-	/*
-	 * Now some of the paths that had conflicts earlier might have been
-	 * hand resolved.  Others may be similar to a conflict already that
-	 * was resolved before.
-	 */
-
-	for (i = 0; i < rr->nr; i++) {
 		int ret;
-		const char *path = rr->items[i].string;
-		const char *name = (const char *)rr->items[i].util;
 
-		if (has_rerere_resolution(name)) {
-			if (!merge(name, path)) {
-				const char *msg;
-				if (rerere_autoupdate) {
-					string_list_insert(&update, path);
-					msg = "Staged '%s' using previous resolution.\n";
-				} else
-					msg = "Resolved '%s' using previous resolution.\n";
-				fprintf(stderr, msg, path);
-				goto mark_resolved;
-			}
-		}
-
-		/* Let's see if we have resolved it. */
-		ret = handle_file(path, NULL, NULL);
-		if (ret)
+		if (string_list_has_string(rr, path))
 			continue;
 
-		fprintf(stderr, "Recorded resolution for '%s'.\n", path);
-		copy_file(rerere_path(name, "postimage"), path, 0666);
-	mark_resolved:
-		rr->items[i].util = NULL;
+		/*
+		 * Ask handle_file() to scan and assign a
+		 * conflict ID.  No need to write anything out
+		 * yet.
+		 */
+		ret = handle_file(path, sha1, NULL);
+		if (ret < 1)
+			continue;
+
+		id = new_rerere_id(sha1);
+		string_list_insert(rr, path)->util = id;
+
+		/*
+		 * If the directory does not exist, create
+		 * it.  mkdir_in_gitdir() will fail with
+		 * EEXIST if there already is one.
+		 *
+		 * NEEDSWORK: make sure "gc" does not remove
+		 * preimage without removing the directory.
+		 */
+		if (mkdir_in_gitdir(rerere_path(id, NULL)))
+			continue;
+
+		/*
+		 * We are the first to encounter this
+		 * conflict.  Ask handle_file() to write the
+		 * normalized contents to the "preimage" file.
+		 */
+		handle_file(path, NULL, rerere_path(id, "preimage"));
+		fprintf(stderr, "Recorded preimage for '%s'\n", path);
 	}
 
+	for (i = 0; i < rr->nr; i++)
+		do_rerere_one_path(&rr->items[i], &update);
+
 	if (update.nr)
 		update_paths(&update);
 
@@ -614,6 +804,11 @@
 	return fd;
 }
 
+/*
+ * The main entry point that is called internally from codepaths that
+ * perform mergy operations, possibly leaving conflicted index entries
+ * and working tree files.
+ */
 int rerere(int flags)
 {
 	struct string_list merge_rr = STRING_LIST_INIT_DUP;
@@ -628,25 +823,42 @@
 static int rerere_forget_one_path(const char *path, struct string_list *rr)
 {
 	const char *filename;
-	char *hex;
+	struct rerere_id *id;
 	unsigned char sha1[20];
 	int ret;
+	struct string_list_item *item;
 
+	/*
+	 * Recreate the original conflict from the stages in the
+	 * index and compute the conflict ID
+	 */
 	ret = handle_cache(path, sha1, NULL);
 	if (ret < 1)
 		return error("Could not parse conflict hunks in '%s'", path);
-	hex = xstrdup(sha1_to_hex(sha1));
-	filename = rerere_path(hex, "postimage");
+
+	/* Nuke the recorded resolution for the conflict */
+	id = new_rerere_id(sha1);
+	filename = rerere_path(id, "postimage");
 	if (unlink(filename))
 		return (errno == ENOENT
 			? error("no remembered resolution for %s", path)
 			: error("cannot unlink %s: %s", filename, strerror(errno)));
 
-	handle_cache(path, sha1, rerere_path(hex, "preimage"));
+	/*
+	 * Update the preimage so that the user can resolve the
+	 * conflict in the working tree, run us again to record
+	 * the postimage.
+	 */
+	handle_cache(path, sha1, rerere_path(id, "preimage"));
 	fprintf(stderr, "Updated preimage for '%s'\n", path);
 
-
-	string_list_insert(rr, path)->util = hex;
+	/*
+	 * And remember that we can record resolution for this
+	 * conflict when the user is done.
+	 */
+	item = string_list_insert(rr, path);
+	free_rerere_id(item);
+	item->util = id;
 	fprintf(stderr, "Forgot resolution for %s\n", path);
 	return 0;
 }
@@ -664,6 +876,11 @@
 	if (fd < 0)
 		return 0;
 
+	/*
+	 * The paths may have been resolved (incorrectly);
+	 * recover the original conflicted state and then
+	 * find the conflicted paths.
+	 */
 	unmerge_cache(pathspec);
 	find_conflict(&conflict);
 	for (i = 0; i < conflict.nr; i++) {
@@ -676,24 +893,51 @@
 	return write_rr(&merge_rr, fd);
 }
 
-static time_t rerere_created_at(const char *name)
+/*
+ * Garbage collection support
+ */
+
+/*
+ * Note that this is not reentrant but is used only one-at-a-time
+ * so it does not matter right now.
+ */
+static struct rerere_id *dirname_to_id(const char *name)
 {
-	struct stat st;
-	return stat(rerere_path(name, "preimage"), &st) ? (time_t) 0 : st.st_mtime;
+	static struct rerere_id id;
+	strcpy(id.hex, name);
+	return &id;
 }
 
-static time_t rerere_last_used_at(const char *name)
+static time_t rerere_created_at(const char *dir_name)
 {
 	struct stat st;
-	return stat(rerere_path(name, "postimage"), &st) ? (time_t) 0 : st.st_mtime;
+	struct rerere_id *id = dirname_to_id(dir_name);
+
+	return stat(rerere_path(id, "preimage"), &st) ? (time_t) 0 : st.st_mtime;
 }
 
-static void unlink_rr_item(const char *name)
+static time_t rerere_last_used_at(const char *dir_name)
 {
-	unlink(rerere_path(name, "thisimage"));
-	unlink(rerere_path(name, "preimage"));
-	unlink(rerere_path(name, "postimage"));
-	rmdir(git_path("rr-cache/%s", name));
+	struct stat st;
+	struct rerere_id *id = dirname_to_id(dir_name);
+
+	return stat(rerere_path(id, "postimage"), &st) ? (time_t) 0 : st.st_mtime;
+}
+
+/*
+ * Remove the recorded resolution for a given conflict ID
+ */
+static void unlink_rr_item(struct rerere_id *id)
+{
+	unlink(rerere_path(id, "thisimage"));
+	unlink(rerere_path(id, "preimage"));
+	unlink(rerere_path(id, "postimage"));
+	/*
+	 * NEEDSWORK: what if this rmdir() fails?  Wouldn't we then
+	 * assume that we already have preimage recorded in
+	 * do_plain_rerere()?
+	 */
+	rmdir(rerere_path(id, NULL));
 }
 
 void rerere_gc(struct string_list *rr)
@@ -715,6 +959,7 @@
 	dir = opendir(git_path("rr-cache"));
 	if (!dir)
 		die_errno("unable to open rr-cache directory");
+	/* Collect stale conflict IDs ... */
 	while ((e = readdir(dir))) {
 		if (is_dot_or_dotdot(e->d_name))
 			continue;
@@ -732,12 +977,20 @@
 			string_list_append(&to_remove, e->d_name);
 	}
 	closedir(dir);
+	/* ... and then remove them one-by-one */
 	for (i = 0; i < to_remove.nr; i++)
-		unlink_rr_item(to_remove.items[i].string);
+		unlink_rr_item(dirname_to_id(to_remove.items[i].string));
 	string_list_clear(&to_remove, 0);
 	rollback_lock_file(&write_lock);
 }
 
+/*
+ * During a conflict resolution, after "rerere" recorded the
+ * preimages, abandon them if the user did not resolve them or
+ * record their resolutions.  And drop $GIT_DIR/MERGE_RR.
+ *
+ * NEEDSWORK: shouldn't we be calling this from "reset --hard"?
+ */
 void rerere_clear(struct string_list *merge_rr)
 {
 	int i;
@@ -746,9 +999,9 @@
 		return;
 
 	for (i = 0; i < merge_rr->nr; i++) {
-		const char *name = (const char *)merge_rr->items[i].util;
-		if (!has_rerere_resolution(name))
-			unlink_rr_item(name);
+		struct rerere_id *id = merge_rr->items[i].util;
+		if (!has_rerere_resolution(id))
+			unlink_rr_item(id);
 	}
 	unlink_or_warn(git_path_merge_rr());
 	rollback_lock_file(&write_lock);
diff --git a/rerere.h b/rerere.h
index 407d599..1222e91 100644
--- a/rerere.h
+++ b/rerere.h
@@ -16,9 +16,19 @@
  */
 extern void *RERERE_RESOLVED;
 
+struct rerere_id {
+	char hex[41];
+};
+
 extern int setup_rerere(struct string_list *, int);
 extern int rerere(int);
-extern const char *rerere_path(const char *hex, const char *file);
+/*
+ * Given the conflict ID and the name of a "file" used for replaying
+ * the recorded resolution (e.g. "preimage", "postimage"), return the
+ * path to that filesystem entity.  With "file" specified with NULL,
+ * return the path to the directory that houses these files.
+ */
+extern const char *rerere_path(const struct rerere_id *, const char *file);
 extern int rerere_forget(struct pathspec *);
 extern int rerere_remaining(struct string_list *);
 extern void rerere_clear(struct string_list *);
diff --git a/revision.c b/revision.c
index 8435ce5..224ed19 100644
--- a/revision.c
+++ b/revision.c
@@ -29,7 +29,7 @@
 {
 	const char *p;
 
-	fprintf(out, "%s ", sha1_to_hex(obj->sha1));
+	fprintf(out, "%s ", oid_to_hex(&obj->oid));
 	for (p = name; *p && *p != '\n'; p++)
 		fputc(*p, out);
 	fputc('\n', out);
@@ -50,10 +50,10 @@
 	struct name_entry entry;
 	struct object *obj = &tree->object;
 
-	if (!has_sha1_file(obj->sha1))
+	if (!has_object_file(&obj->oid))
 		return;
 	if (parse_tree(tree) < 0)
-		die("bad tree %s", sha1_to_hex(obj->sha1));
+		die("bad tree %s", oid_to_hex(&obj->oid));
 
 	init_tree_desc(&desc, tree->buffer, tree->size);
 	while (tree_entry(&desc, &entry)) {
@@ -110,7 +110,7 @@
 			 * it is popped next time around, we won't be trying
 			 * to parse it and get an error.
 			 */
-			if (!has_sha1_file(commit->object.sha1))
+			if (!has_object_file(&commit->object.oid))
 				commit->object.parsed = 1;
 
 			if (commit->object.flags & UNINTERESTING)
@@ -228,11 +228,11 @@
 			add_pending_object(revs, object, tag->tag);
 		if (!tag->tagged)
 			die("bad tag");
-		object = parse_object(tag->tagged->sha1);
+		object = parse_object(tag->tagged->oid.hash);
 		if (!object) {
 			if (flags & UNINTERESTING)
 				return NULL;
-			die("bad object %s", sha1_to_hex(tag->tagged->sha1));
+			die("bad object %s", oid_to_hex(&tag->tagged->oid));
 		}
 		object->flags |= flags;
 		/*
@@ -455,7 +455,7 @@
 
 	tree_difference = REV_TREE_SAME;
 	DIFF_OPT_CLR(&revs->pruning, HAS_CHANGES);
-	if (diff_tree_sha1(t1->object.sha1, t2->object.sha1, "",
+	if (diff_tree_sha1(t1->object.oid.hash, t2->object.oid.hash, "",
 			   &revs->pruning) < 0)
 		return REV_TREE_DIFFERENT;
 	return tree_difference;
@@ -471,7 +471,7 @@
 
 	tree_difference = REV_TREE_SAME;
 	DIFF_OPT_CLR(&revs->pruning, HAS_CHANGES);
-	retval = diff_tree_sha1(NULL, t1->object.sha1, "", &revs->pruning);
+	retval = diff_tree_sha1(NULL, t1->object.oid.hash, "", &revs->pruning);
 
 	return retval >= 0 && (tree_difference == REV_TREE_SAME);
 }
@@ -484,7 +484,7 @@
 static struct treesame_state *initialise_treesame(struct rev_info *revs, struct commit *commit)
 {
 	unsigned n = commit_list_count(commit->parents);
-	struct treesame_state *st = xcalloc(1, sizeof(*st) + n);
+	struct treesame_state *st = xcalloc(1, st_add(sizeof(*st), n));
 	st->nparents = n;
 	add_decoration(&revs->treesame, &commit->object, st);
 	return st;
@@ -555,7 +555,7 @@
 
 		st = lookup_decoration(&revs->treesame, &commit->object);
 		if (!st)
-			die("update_treesame %s", sha1_to_hex(commit->object.sha1));
+			die("update_treesame %s", oid_to_hex(&commit->object.oid));
 		relevant_parents = 0;
 		relevant_change = irrelevant_change = 0;
 		for (p = commit->parents, n = 0; p; n++, p = p->next) {
@@ -653,8 +653,8 @@
 		}
 		if (parse_commit(p) < 0)
 			die("cannot simplify commit %s (because of %s)",
-			    sha1_to_hex(commit->object.sha1),
-			    sha1_to_hex(p->object.sha1));
+			    oid_to_hex(&commit->object.oid),
+			    oid_to_hex(&p->object.oid));
 		switch (rev_compare_tree(revs, p, commit)) {
 		case REV_TREE_SAME:
 			if (!revs->simplify_history || !relevant_commit(p)) {
@@ -686,8 +686,8 @@
 				 */
 				if (parse_commit(p) < 0)
 					die("cannot simplify commit %s (invalid %s)",
-					    sha1_to_hex(commit->object.sha1),
-					    sha1_to_hex(p->object.sha1));
+					    oid_to_hex(&commit->object.oid),
+					    oid_to_hex(&p->object.oid));
 				p->parents = NULL;
 			}
 		/* fallthrough */
@@ -699,7 +699,7 @@
 				irrelevant_change = 1;
 			continue;
 		}
-		die("bad tree compare for commit %s", sha1_to_hex(commit->object.sha1));
+		die("bad tree compare for commit %s", oid_to_hex(&commit->object.oid));
 	}
 
 	/*
@@ -1134,7 +1134,7 @@
 {
 	while (commit_list) {
 		struct object *object = &commit_list->item->object;
-		add_rev_cmdline(revs, object, sha1_to_hex(object->sha1),
+		add_rev_cmdline(revs, object, oid_to_hex(&object->oid),
 				whence, flags);
 		commit_list = commit_list->next;
 	}
@@ -1323,7 +1323,7 @@
 			break;
 		if (!((struct tag*)it)->tagged)
 			return 0;
-		hashcpy(sha1, ((struct tag*)it)->tagged->sha1);
+		hashcpy(sha1, ((struct tag*)it)->tagged->oid.hash);
 	}
 	if (it->type != OBJ_COMMIT)
 		return 0;
@@ -1380,7 +1380,7 @@
 	while (commit_list) {
 		struct object *object = &commit_list->item->object;
 		object->flags |= flags;
-		add_pending_object(revs, object, sha1_to_hex(object->sha1));
+		add_pending_object(revs, object, oid_to_hex(&object->oid));
 		commit_list = commit_list->next;
 	}
 }
@@ -1500,10 +1500,10 @@
 
 				a = (a_obj->type == OBJ_COMMIT
 				     ? (struct commit *)a_obj
-				     : lookup_commit_reference(a_obj->sha1));
+				     : lookup_commit_reference(a_obj->oid.hash));
 				b = (b_obj->type == OBJ_COMMIT
 				     ? (struct commit *)b_obj
-				     : lookup_commit_reference(b_obj->sha1));
+				     : lookup_commit_reference(b_obj->oid.hash));
 				if (!a || !b)
 					goto missing;
 				exclude = get_merge_bases(a, b);
@@ -1993,7 +1993,7 @@
 	} else if (!strcmp(arg, "--ignore-missing")) {
 		revs->ignore_missing = 1;
 	} else {
-		int opts = diff_opt_parse(&revs->diffopt, argv, argc);
+		int opts = diff_opt_parse(&revs->diffopt, argv, argc, revs->prefix);
 		if (!opts)
 			unkv[(*unkc)++] = arg;
 		return opts;
@@ -2883,7 +2883,7 @@
 	if (opt->show_notes) {
 		if (!buf.len)
 			strbuf_addstr(&buf, message);
-		format_display_notes(commit->object.sha1, &buf, encoding, 1);
+		format_display_notes(commit->object.oid.hash, &buf, encoding, 1);
 	}
 
 	/*
@@ -2913,7 +2913,7 @@
 {
 	if (commit->object.flags & SHOWN)
 		return commit_ignore;
-	if (revs->unpacked && has_sha1_pack(commit->object.sha1))
+	if (revs->unpacked && has_sha1_pack(commit->object.oid.hash))
 		return commit_ignore;
 	if (revs->show_all)
 		return commit_show;
@@ -3039,7 +3039,7 @@
 		struct commit_list *p;
 		for (p = revs->previous_parents; p; p = p->next)
 			if (p->item == NULL || /* first commit */
-			    !hashcmp(p->item->object.sha1, commit->object.sha1))
+			    !oidcmp(&p->item->object.oid, &commit->object.oid))
 				break;
 		revs->linear = p != NULL;
 	}
@@ -3077,7 +3077,7 @@
 			if (add_parents_to_list(revs, commit, &revs->commits, NULL) < 0) {
 				if (!revs->ignore_missing_links)
 					die("Failed to traverse parents of commit %s",
-						sha1_to_hex(commit->object.sha1));
+						oid_to_hex(&commit->object.oid));
 			}
 		}
 
@@ -3086,7 +3086,7 @@
 			continue;
 		case commit_error:
 			die("Failed to simplify parents of commit %s",
-			    sha1_to_hex(commit->object.sha1));
+			    oid_to_hex(&commit->object.oid));
 		default:
 			if (revs->track_linear)
 				track_linear(revs, commit);
diff --git a/revision.h b/revision.h
index 9741302..dca0d38 100644
--- a/revision.h
+++ b/revision.h
@@ -135,6 +135,7 @@
 			pretty_given:1,
 			abbrev_commit:1,
 			abbrev_commit_given:1,
+			zero_commit:1,
 			use_terminator:1,
 			missing_newline:1,
 			date_mode_explicit:1,
diff --git a/run-command.c b/run-command.c
index 84e4ce6..2392b1e 100644
--- a/run-command.c
+++ b/run-command.c
@@ -158,50 +158,41 @@
 	return -1;
 }
 
-static const char **prepare_shell_cmd(const char **argv)
+static const char **prepare_shell_cmd(struct argv_array *out, const char **argv)
 {
-	int argc, nargc = 0;
-	const char **nargv;
-
-	for (argc = 0; argv[argc]; argc++)
-		; /* just counting */
-	/* +1 for NULL, +3 for "sh -c" plus extra $0 */
-	nargv = xmalloc(sizeof(*nargv) * (argc + 1 + 3));
-
-	if (argc < 1)
+	if (!argv[0])
 		die("BUG: shell command is empty");
 
 	if (strcspn(argv[0], "|&;<>()$`\\\"' \t\n*?[#~=%") != strlen(argv[0])) {
 #ifndef GIT_WINDOWS_NATIVE
-		nargv[nargc++] = SHELL_PATH;
+		argv_array_push(out, SHELL_PATH);
 #else
-		nargv[nargc++] = "sh";
+		argv_array_push(out, "sh");
 #endif
-		nargv[nargc++] = "-c";
+		argv_array_push(out, "-c");
 
-		if (argc < 2)
-			nargv[nargc++] = argv[0];
-		else {
-			struct strbuf arg0 = STRBUF_INIT;
-			strbuf_addf(&arg0, "%s \"$@\"", argv[0]);
-			nargv[nargc++] = strbuf_detach(&arg0, NULL);
-		}
+		/*
+		 * If we have no extra arguments, we do not even need to
+		 * bother with the "$@" magic.
+		 */
+		if (!argv[1])
+			argv_array_push(out, argv[0]);
+		else
+			argv_array_pushf(out, "%s \"$@\"", argv[0]);
 	}
 
-	for (argc = 0; argv[argc]; argc++)
-		nargv[nargc++] = argv[argc];
-	nargv[nargc] = NULL;
-
-	return nargv;
+	argv_array_pushv(out, argv);
+	return out->argv;
 }
 
 #ifndef GIT_WINDOWS_NATIVE
 static int execv_shell_cmd(const char **argv)
 {
-	const char **nargv = prepare_shell_cmd(argv);
-	trace_argv_printf(nargv, "trace: exec:");
-	sane_execvp(nargv[0], (char **)nargv);
-	free(nargv);
+	struct argv_array nargv = ARGV_ARRAY_INIT;
+	prepare_shell_cmd(&nargv, argv);
+	trace_argv_printf(nargv.argv, "trace: exec:");
+	sane_execvp(nargv.argv[0], (char **)nargv.argv);
+	argv_array_clear(&nargv);
 	return -1;
 }
 #endif
@@ -455,6 +446,7 @@
 {
 	int fhin = 0, fhout = 1, fherr = 2;
 	const char **sargv = cmd->argv;
+	struct argv_array nargv = ARGV_ARRAY_INIT;
 
 	if (cmd->no_stdin)
 		fhin = open("/dev/null", O_RDWR);
@@ -480,9 +472,9 @@
 		fhout = dup(cmd->out);
 
 	if (cmd->git_cmd)
-		cmd->argv = prepare_git_cmd(cmd->argv);
+		cmd->argv = prepare_git_cmd(&nargv, cmd->argv);
 	else if (cmd->use_shell)
-		cmd->argv = prepare_shell_cmd(cmd->argv);
+		cmd->argv = prepare_shell_cmd(&nargv, cmd->argv);
 
 	cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, (char**) cmd->env,
 			cmd->dir, fhin, fhout, fherr);
@@ -492,9 +484,7 @@
 	if (cmd->clean_on_exit && cmd->pid >= 0)
 		mark_child_for_cleanup(cmd->pid);
 
-	if (cmd->git_cmd)
-		free(cmd->argv);
-
+	argv_array_clear(&nargv);
 	cmd->argv = sargv;
 	if (fhin != 0)
 		close(fhin);
@@ -607,7 +597,7 @@
 {
 	vreportf("fatal: ", err, params);
 
-	if (!pthread_equal(main_thread, pthread_self())) {
+	if (in_async()) {
 		struct async *async = pthread_getspecific(async_key);
 		if (async->proc_in >= 0)
 			close(async->proc_in);
@@ -626,6 +616,18 @@
 	return ret != NULL;
 }
 
+int in_async(void)
+{
+	if (!main_thread_set)
+		return 0; /* no asyncs started yet */
+	return !pthread_equal(main_thread, pthread_self());
+}
+
+void NORETURN async_exit(int code)
+{
+	pthread_exit((void *)(intptr_t)code);
+}
+
 #else
 
 static struct {
@@ -665,6 +667,17 @@
 }
 #define atexit git_atexit
 
+static int process_is_async;
+int in_async(void)
+{
+	return process_is_async;
+}
+
+void NORETURN async_exit(int code)
+{
+	exit(code);
+}
+
 #endif
 
 int start_async(struct async *async)
@@ -724,6 +737,7 @@
 		if (need_out)
 			close(fdout[0]);
 		git_atexit_clear();
+		process_is_async = 1;
 		exit(!!async->proc(proc_in, proc_out, async->data));
 	}
 
diff --git a/run-command.h b/run-command.h
index f315868..c0969c7 100644
--- a/run-command.h
+++ b/run-command.h
@@ -120,5 +120,7 @@
 
 int start_async(struct async *async);
 int finish_async(struct async *async);
+int in_async(void);
+void NORETURN async_exit(int code);
 
 #endif
diff --git a/send-pack.c b/send-pack.c
index c6a4030..047bd18 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -102,11 +102,11 @@
 			break;
 
 	while (refs) {
-		if (!is_null_sha1(refs->old_sha1) &&
-		    !feed_object(refs->old_sha1, po.in, 1))
+		if (!is_null_oid(&refs->old_oid) &&
+		    !feed_object(refs->old_oid.hash, po.in, 1))
 			break;
-		if (!is_null_sha1(refs->new_sha1) &&
-		    !feed_object(refs->new_sha1, po.in, 0))
+		if (!is_null_oid(&refs->new_oid) &&
+		    !feed_object(refs->new_oid.hash, po.in, 0))
 			break;
 		refs = refs->next;
 	}
@@ -284,8 +284,8 @@
 			continue;
 		update_seen = 1;
 		strbuf_addf(&cert, "%s %s %s\n",
-			    sha1_to_hex(ref->old_sha1),
-			    sha1_to_hex(ref->new_sha1),
+			    oid_to_hex(&ref->old_oid),
+			    oid_to_hex(&ref->new_oid),
 			    ref->name);
 	}
 	if (!update_seen)
@@ -487,8 +487,8 @@
 		if (check_to_send_update(ref, args) < 0)
 			continue;
 
-		old_hex = sha1_to_hex(ref->old_sha1);
-		new_hex = sha1_to_hex(ref->new_sha1);
+		old_hex = oid_to_hex(&ref->old_oid);
+		new_hex = oid_to_hex(&ref->new_oid);
 		if (!cmds_sent) {
 			packet_buf_write(&req_buf,
 					 "%s %s %s%c%s",
diff --git a/sequencer.c b/sequencer.c
index a0600ae..e60e75a 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -124,42 +124,33 @@
 
 struct commit_message {
 	char *parent_label;
-	const char *label;
-	const char *subject;
+	char *label;
+	char *subject;
 	const char *message;
 };
 
 static int get_message(struct commit *commit, struct commit_message *out)
 {
 	const char *abbrev, *subject;
-	int abbrev_len, subject_len;
-	char *q;
+	int subject_len;
 
-	if (!git_commit_encoding)
-		git_commit_encoding = "UTF-8";
-
-	out->message = logmsg_reencode(commit, NULL, git_commit_encoding);
-	abbrev = find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV);
-	abbrev_len = strlen(abbrev);
+	out->message = logmsg_reencode(commit, NULL, get_commit_output_encoding());
+	abbrev = find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV);
 
 	subject_len = find_commit_subject(out->message, &subject);
 
-	out->parent_label = xmalloc(strlen("parent of ") + abbrev_len +
-			      strlen("... ") + subject_len + 1);
-	q = out->parent_label;
-	q = mempcpy(q, "parent of ", strlen("parent of "));
-	out->label = q;
-	q = mempcpy(q, abbrev, abbrev_len);
-	q = mempcpy(q, "... ", strlen("... "));
-	out->subject = q;
-	q = mempcpy(q, subject, subject_len);
-	*q = '\0';
+	out->subject = xmemdupz(subject, subject_len);
+	out->label = xstrfmt("%s... %s", abbrev, out->subject);
+	out->parent_label = xstrfmt("parent of %s", out->label);
+
 	return 0;
 }
 
 static void free_message(struct commit *commit, struct commit_message *msg)
 {
 	free(msg->parent_label);
+	free(msg->label);
+	free(msg->subject);
 	unuse_commit_buffer(commit, msg->message);
 }
 
@@ -346,7 +337,7 @@
 		if (cache_tree_update(&the_index, 0))
 			return error(_("Unable to update cache tree\n"));
 
-	return !hashcmp(active_cache_tree->sha1, head_commit->tree->object.sha1);
+	return !hashcmp(active_cache_tree->sha1, head_commit->tree->object.oid.hash);
 }
 
 /*
@@ -397,18 +388,18 @@
 
 	if (parse_commit(commit))
 		return error(_("Could not parse commit %s\n"),
-			     sha1_to_hex(commit->object.sha1));
+			     oid_to_hex(&commit->object.oid));
 	if (commit->parents) {
 		struct commit *parent = commit->parents->item;
 		if (parse_commit(parent))
 			return error(_("Could not parse parent commit %s\n"),
-				sha1_to_hex(parent->object.sha1));
-		ptree_sha1 = parent->tree->object.sha1;
+				oid_to_hex(&parent->object.oid));
+		ptree_sha1 = parent->tree->object.oid.hash;
 	} else {
 		ptree_sha1 = EMPTY_TREE_SHA1_BIN; /* commit is root */
 	}
 
-	return !hashcmp(ptree_sha1, commit->tree->object.sha1);
+	return !hashcmp(ptree_sha1, commit->tree->object.oid.hash);
 }
 
 /*
@@ -486,7 +477,7 @@
 
 		if (!opts->mainline)
 			return error(_("Commit %s is a merge but no -m option was given."),
-				sha1_to_hex(commit->object.sha1));
+				oid_to_hex(&commit->object.oid));
 
 		for (cnt = 1, p = commit->parents;
 		     cnt != opts->mainline && p;
@@ -494,28 +485,28 @@
 			p = p->next;
 		if (cnt != opts->mainline || !p)
 			return error(_("Commit %s does not have parent %d"),
-				sha1_to_hex(commit->object.sha1), opts->mainline);
+				oid_to_hex(&commit->object.oid), opts->mainline);
 		parent = p->item;
 	} else if (0 < opts->mainline)
 		return error(_("Mainline was specified but commit %s is not a merge."),
-			sha1_to_hex(commit->object.sha1));
+			oid_to_hex(&commit->object.oid));
 	else
 		parent = commit->parents->item;
 
 	if (opts->allow_ff &&
-	    ((parent && !hashcmp(parent->object.sha1, head)) ||
+	    ((parent && !hashcmp(parent->object.oid.hash, head)) ||
 	     (!parent && unborn)))
-		return fast_forward_to(commit->object.sha1, head, unborn, opts);
+		return fast_forward_to(commit->object.oid.hash, head, unborn, opts);
 
 	if (parent && parse_commit(parent) < 0)
 		/* TRANSLATORS: The first %s will be "revert" or
 		   "cherry-pick", the second %s a SHA1 */
 		return error(_("%s: cannot parse parent commit %s"),
-			action_name(opts), sha1_to_hex(parent->object.sha1));
+			action_name(opts), oid_to_hex(&parent->object.oid));
 
 	if (get_message(commit, &msg) != 0)
 		return error(_("Cannot get commit message for %s"),
-			sha1_to_hex(commit->object.sha1));
+			oid_to_hex(&commit->object.oid));
 
 	/*
 	 * "commit" is an existing commit.  We would want to apply
@@ -532,11 +523,11 @@
 		strbuf_addstr(&msgbuf, "Revert \"");
 		strbuf_addstr(&msgbuf, msg.subject);
 		strbuf_addstr(&msgbuf, "\"\n\nThis reverts commit ");
-		strbuf_addstr(&msgbuf, sha1_to_hex(commit->object.sha1));
+		strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
 
 		if (commit->parents && commit->parents->next) {
 			strbuf_addstr(&msgbuf, ", reversing\nchanges made to ");
-			strbuf_addstr(&msgbuf, sha1_to_hex(parent->object.sha1));
+			strbuf_addstr(&msgbuf, oid_to_hex(&parent->object.oid));
 		}
 		strbuf_addstr(&msgbuf, ".\n");
 	} else {
@@ -562,7 +553,7 @@
 			if (!has_conforming_footer(&msgbuf, NULL, 0))
 				strbuf_addch(&msgbuf, '\n');
 			strbuf_addstr(&msgbuf, cherry_picked_prefix);
-			strbuf_addstr(&msgbuf, sha1_to_hex(commit->object.sha1));
+			strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
 			strbuf_addstr(&msgbuf, ")\n");
 		}
 	}
@@ -592,17 +583,17 @@
 	 * write it at all.
 	 */
 	if (opts->action == REPLAY_PICK && !opts->no_commit && (res == 0 || res == 1))
-		update_ref(NULL, "CHERRY_PICK_HEAD", commit->object.sha1, NULL,
+		update_ref(NULL, "CHERRY_PICK_HEAD", commit->object.oid.hash, NULL,
 			   REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
 	if (opts->action == REPLAY_REVERT && ((opts->no_commit && res == 0) || res == 1))
-		update_ref(NULL, "REVERT_HEAD", commit->object.sha1, NULL,
+		update_ref(NULL, "REVERT_HEAD", commit->object.oid.hash, NULL,
 			   REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
 
 	if (res) {
 		error(opts->action == REPLAY_REVERT
 		      ? _("could not revert %s... %s")
 		      : _("could not apply %s... %s"),
-		      find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV),
+		      find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV),
 		      msg.subject);
 		print_advice(res == 1, opts);
 		rerere(opts->allow_rerere_auto);
@@ -664,7 +655,7 @@
 
 	for (cur = todo_list; cur; cur = cur->next) {
 		const char *commit_buffer = get_commit_buffer(cur->item, NULL);
-		sha1_abbrev = find_unique_abbrev(cur->item->object.sha1, DEFAULT_ABBREV);
+		sha1_abbrev = find_unique_abbrev(cur->item->object.oid.hash, DEFAULT_ABBREV);
 		subject_len = find_commit_subject(commit_buffer, &subject);
 		strbuf_addf(buf, "%s %s %.*s\n", action_str, sha1_abbrev,
 			subject_len, subject);
diff --git a/server-info.c b/server-info.c
index c82e9ee..5a86e29 100644
--- a/server-info.c
+++ b/server-info.c
@@ -62,7 +62,7 @@
 		o = deref_tag(o, path, 0);
 		if (o)
 			if (fprintf(fp, "%s	%s^{}\n",
-				sha1_to_hex(o->sha1), path) < 0)
+				oid_to_hex(&o->oid), path) < 0)
 				return -1;
 	}
 	return 0;
diff --git a/setup.c b/setup.c
index 1a374f2..de1a2a7 100644
--- a/setup.c
+++ b/setup.c
@@ -88,7 +88,7 @@
 	const char *orig = path;
 	char *sanitized;
 	if (is_absolute_path(orig)) {
-		sanitized = xmalloc(strlen(path) + 1);
+		sanitized = xmallocz(strlen(path));
 		if (remaining_prefix)
 			*remaining_prefix = 0;
 		if (normalize_path_copy_len(sanitized, path, remaining_prefix)) {
@@ -100,10 +100,7 @@
 			return NULL;
 		}
 	} else {
-		sanitized = xmalloc(len + strlen(path) + 1);
-		if (len)
-			memcpy(sanitized, prefix, len);
-		strcpy(sanitized + len, path);
+		sanitized = xstrfmt("%.*s%s", len, prefix, path);
 		if (remaining_prefix)
 			*remaining_prefix = len;
 		if (normalize_path_copy_len(sanitized, sanitized, remaining_prefix)) {
@@ -142,9 +139,7 @@
 		if (arg[2] == '\0') /* ":/" is root dir, always exists */
 			return 1;
 		name = arg + 2;
-	} else if (!no_wildcard(arg))
-		return 1;
-	else if (prefix)
+	} else if (prefix)
 		name = prefix_filename(prefix, strlen(prefix), arg);
 	else
 		name = arg;
@@ -205,7 +200,7 @@
 {
 	if (*arg == '-')
 		die("bad flag '%s' used after filename", arg);
-	if (check_filename(prefix, arg))
+	if (check_filename(prefix, arg) || !no_wildcard(arg))
 		return;
 	die_verify_filename(prefix, arg, diagnose_misspelt_rev);
 }
@@ -315,6 +310,23 @@
 	return ret;
 }
 
+int is_nonbare_repository_dir(struct strbuf *path)
+{
+	int ret = 0;
+	int gitfile_error;
+	size_t orig_path_len = path->len;
+	assert(orig_path_len != 0);
+	strbuf_complete(path, '/');
+	strbuf_addstr(path, ".git");
+	if (read_gitfile_gently(path->buf, &gitfile_error) || is_git_directory(path->buf))
+		ret = 1;
+	if (gitfile_error == READ_GITFILE_ERR_OPEN_FAILED ||
+	    gitfile_error == READ_GITFILE_ERR_READ_FAILED)
+		ret = 1;
+	strbuf_setlen(path, orig_path_len);
+	return ret;
+}
+
 int is_inside_git_dir(void)
 {
 	if (inside_git_dir < 0)
@@ -437,17 +449,6 @@
 	return ret;
 }
 
-static void update_linked_gitdir(const char *gitfile, const char *gitdir)
-{
-	struct strbuf path = STRBUF_INIT;
-	struct stat st;
-
-	strbuf_addf(&path, "%s/gitdir", gitdir);
-	if (stat(path.buf, &st) || st.st_mtime + 24 * 3600 < time(NULL))
-		write_file(path.buf, "%s", gitfile);
-	strbuf_release(&path);
-}
-
 /*
  * Try to read the location of the git directory from the .git file,
  * return path to git directory if found.
@@ -485,14 +486,13 @@
 		error_code = READ_GITFILE_ERR_OPEN_FAILED;
 		goto cleanup_return;
 	}
-	buf = xmalloc(st.st_size + 1);
+	buf = xmallocz(st.st_size);
 	len = read_in_full(fd, buf, st.st_size);
 	close(fd);
 	if (len != st.st_size) {
 		error_code = READ_GITFILE_ERR_READ_FAILED;
 		goto cleanup_return;
 	}
-	buf[len] = '\0';
 	if (!starts_with(buf, "gitdir: ")) {
 		error_code = READ_GITFILE_ERR_INVALID_FORMAT;
 		goto cleanup_return;
@@ -508,11 +508,8 @@
 
 	if (!is_absolute_path(dir) && (slash = strrchr(path, '/'))) {
 		size_t pathlen = slash+1 - path;
-		size_t dirlen = pathlen + len - 8;
-		dir = xmalloc(dirlen + 1);
-		strncpy(dir, path, pathlen);
-		strncpy(dir + pathlen, buf + 8, len - 8);
-		dir[dirlen] = '\0';
+		dir = xstrfmt("%.*s%.*s", (int)pathlen, path,
+			      (int)(len - 8), buf + 8);
 		free(buf);
 		buf = dir;
 	}
@@ -520,7 +517,6 @@
 		error_code = READ_GITFILE_ERR_NOT_A_REPO;
 		goto cleanup_return;
 	}
-	update_linked_gitdir(path, dir);
 	path = real_path(dir);
 
 cleanup_return:
diff --git a/sha1_file.c b/sha1_file.c
index 7228969..b516874 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -36,6 +36,7 @@
 static inline uintmax_t sz_fmt(size_t s) { return s; }
 
 const unsigned char null_sha1[20];
+const struct object_id null_oid;
 
 /*
  * This is meant to hold a *small* number of objects that you would
@@ -208,44 +209,25 @@
  * provided by the caller.  which should be "pack" or "idx".
  */
 static char *sha1_get_pack_name(const unsigned char *sha1,
-				char **name, char **base, const char *which)
+				struct strbuf *buf,
+				const char *which)
 {
-	static const char hex[] = "0123456789abcdef";
-	char *buf;
-	int i;
-
-	if (!*base) {
-		const char *sha1_file_directory = get_object_directory();
-		int len = strlen(sha1_file_directory);
-		*base = xmalloc(len + 60);
-		sprintf(*base, "%s/pack/pack-1234567890123456789012345678901234567890.%s",
-			sha1_file_directory, which);
-		*name = *base + len + 11;
-	}
-
-	buf = *name;
-
-	for (i = 0; i < 20; i++) {
-		unsigned int val = *sha1++;
-		*buf++ = hex[val >> 4];
-		*buf++ = hex[val & 0xf];
-	}
-
-	return *base;
+	strbuf_reset(buf);
+	strbuf_addf(buf, "%s/pack/pack-%s.%s", get_object_directory(),
+		    sha1_to_hex(sha1), which);
+	return buf->buf;
 }
 
 char *sha1_pack_name(const unsigned char *sha1)
 {
-	static char *name, *base;
-
-	return sha1_get_pack_name(sha1, &name, &base, "pack");
+	static struct strbuf buf = STRBUF_INIT;
+	return sha1_get_pack_name(sha1, &buf, "pack");
 }
 
 char *sha1_pack_index_name(const unsigned char *sha1)
 {
-	static char *name, *base;
-
-	return sha1_get_pack_name(sha1, &name, &base, "idx");
+	static struct strbuf buf = STRBUF_INIT;
+	return sha1_get_pack_name(sha1, &buf, "idx");
 }
 
 struct alternate_object_database *alt_odb_list;
@@ -271,7 +253,7 @@
 {
 	struct alternate_object_database *ent;
 	struct alternate_object_database *alt;
-	int pfxlen, entlen;
+	size_t pfxlen, entlen;
 	struct strbuf pathbuf = STRBUF_INIT;
 
 	if (!is_absolute_path(entry) && relative_base) {
@@ -291,8 +273,8 @@
 	while (pfxlen && pathbuf.buf[pfxlen-1] == '/')
 		pfxlen -= 1;
 
-	entlen = pfxlen + 43; /* '/' + 2 hex + '/' + 38 hex + NUL */
-	ent = xmalloc(sizeof(*ent) + entlen);
+	entlen = st_add(pfxlen, 43); /* '/' + 2 hex + '/' + 38 hex + NUL */
+	ent = xmalloc(st_add(sizeof(*ent), entlen));
 	memcpy(ent->base, pathbuf.buf, pfxlen);
 	strbuf_release(&pathbuf);
 
@@ -671,13 +653,15 @@
 int open_pack_index(struct packed_git *p)
 {
 	char *idx_name;
+	size_t len;
 	int ret;
 
 	if (p->index_data)
 		return 0;
 
-	idx_name = xstrdup(p->pack_name);
-	strcpy(idx_name + strlen(idx_name) - strlen(".pack"), ".idx");
+	if (!strip_suffix(p->pack_name, ".pack", &len))
+		die("BUG: pack_name does not end in .pack");
+	idx_name = xstrfmt("%.*s.idx", (int)len, p->pack_name);
 	ret = check_packed_git_idx(idx_name, p);
 	free(idx_name);
 	return ret;
@@ -1092,6 +1076,8 @@
 		die("packfile %s cannot be accessed", p->pack_name);
 	if (offset > (p->pack_size - 20))
 		die("offset beyond end of packfile (truncated pack?)");
+	if (offset < 0)
+		die(_("offset before end of packfile (broken .idx?)"));
 
 	if (!win || !in_window(win, offset)) {
 		if (win)
@@ -1150,7 +1136,7 @@
 
 static struct packed_git *alloc_packed_git(int extra)
 {
-	struct packed_git *p = xmalloc(sizeof(*p) + extra);
+	struct packed_git *p = xmalloc(st_add(sizeof(*p), extra));
 	memset(p, 0, sizeof(*p));
 	p->pack_fd = -1;
 	return p;
@@ -1161,11 +1147,12 @@
 	release_pack_memory(size);
 }
 
-struct packed_git *add_packed_git(const char *path, int path_len, int local)
+struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
 {
 	static int have_set_try_to_free_routine;
 	struct stat st;
-	struct packed_git *p = alloc_packed_git(path_len + 2);
+	size_t alloc;
+	struct packed_git *p;
 
 	if (!have_set_try_to_free_routine) {
 		have_set_try_to_free_routine = 1;
@@ -1176,18 +1163,22 @@
 	 * Make sure a corresponding .pack file exists and that
 	 * the index looks sane.
 	 */
-	path_len -= strlen(".idx");
-	if (path_len < 1) {
-		free(p);
+	if (!strip_suffix_mem(path, &path_len, ".idx"))
 		return NULL;
-	}
+
+	/*
+	 * ".pack" is long enough to hold any suffix we're adding (and
+	 * the use xsnprintf double-checks that)
+	 */
+	alloc = st_add3(path_len, strlen(".pack"), 1);
+	p = alloc_packed_git(alloc);
 	memcpy(p->pack_name, path, path_len);
 
-	strcpy(p->pack_name + path_len, ".keep");
+	xsnprintf(p->pack_name + path_len, alloc - path_len, ".keep");
 	if (!access(p->pack_name, F_OK))
 		p->pack_keep = 1;
 
-	strcpy(p->pack_name + path_len, ".pack");
+	xsnprintf(p->pack_name + path_len, alloc - path_len, ".pack");
 	if (stat(p->pack_name, &st) || !S_ISREG(st.st_mode)) {
 		free(p);
 		return NULL;
@@ -1207,9 +1198,10 @@
 struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path)
 {
 	const char *path = sha1_pack_name(sha1);
-	struct packed_git *p = alloc_packed_git(strlen(path) + 1);
+	size_t alloc = st_add(strlen(path), 1);
+	struct packed_git *p = alloc_packed_git(alloc);
 
-	strcpy(p->pack_name, path);
+	memcpy(p->pack_name, path, alloc); /* includes NUL */
 	hashcpy(p->sha1, sha1);
 	if (check_packed_git_idx(idx_path, p)) {
 		free(p);
@@ -1423,10 +1415,12 @@
 {
 	unsigned i;
 	for (i = 0; i < p->num_bad_objects; i++)
-		if (!hashcmp(sha1, p->bad_object_sha1 + 20 * i))
+		if (!hashcmp(sha1, p->bad_object_sha1 + GIT_SHA1_RAWSZ * i))
 			return;
-	p->bad_object_sha1 = xrealloc(p->bad_object_sha1, 20 * (p->num_bad_objects + 1));
-	hashcpy(p->bad_object_sha1 + 20 * p->num_bad_objects, sha1);
+	p->bad_object_sha1 = xrealloc(p->bad_object_sha1,
+				      st_mult(GIT_SHA1_RAWSZ,
+					      st_add(p->num_bad_objects, 1)));
+	hashcpy(p->bad_object_sha1 + GIT_SHA1_RAWSZ * p->num_bad_objects, sha1);
 	p->num_bad_objects++;
 }
 
@@ -1468,7 +1462,7 @@
 		return -1;
 
 	/* Generate the header */
-	hdrlen = sprintf(hdr, "%s %lu", typename(obj_type), size) + 1;
+	hdrlen = xsnprintf(hdr, sizeof(hdr), "%s %lu", typename(obj_type), size) + 1;
 
 	/* Sha1.. */
 	git_SHA1_Init(&c);
@@ -1952,7 +1946,7 @@
 		/* Push the object we're going to leave behind */
 		if (poi_stack_nr >= poi_stack_alloc && poi_stack == small_poi_stack) {
 			poi_stack_alloc = alloc_nr(poi_stack_nr);
-			poi_stack = xmalloc(sizeof(off_t)*poi_stack_alloc);
+			ALLOC_ARRAY(poi_stack, poi_stack_alloc);
 			memcpy(poi_stack, small_poi_stack, sizeof(off_t)*poi_stack_nr);
 		} else {
 			ALLOC_GROW(poi_stack, poi_stack_nr+1, poi_stack_alloc);
@@ -2318,7 +2312,7 @@
 		if (delta_stack_nr >= delta_stack_alloc
 		    && delta_stack == small_delta_stack) {
 			delta_stack_alloc = alloc_nr(delta_stack_nr);
-			delta_stack = xmalloc(sizeof(*delta_stack)*delta_stack_alloc);
+			ALLOC_ARRAY(delta_stack, delta_stack_alloc);
 			memcpy(delta_stack, small_delta_stack,
 			       sizeof(*delta_stack)*delta_stack_nr);
 		} else {
@@ -2456,6 +2450,20 @@
 	}
 }
 
+void check_pack_index_ptr(const struct packed_git *p, const void *vptr)
+{
+	const unsigned char *ptr = vptr;
+	const unsigned char *start = p->index_data;
+	const unsigned char *end = start + p->index_size;
+	if (ptr < start)
+		die(_("offset before start of pack index for %s (corrupt index?)"),
+		    p->pack_name);
+	/* No need to check for underflow; .idx files must be at least 8 bytes */
+	if (ptr >= end - 8)
+		die(_("offset beyond end of pack index for %s (truncated index?)"),
+		    p->pack_name);
+}
+
 off_t nth_packed_object_offset(const struct packed_git *p, uint32_t n)
 {
 	const unsigned char *index = p->index_data;
@@ -2469,6 +2477,7 @@
 		if (!(off & 0x80000000))
 			return off;
 		index += p->num_objects * 4 + (off & 0x7fffffff) * 8;
+		check_pack_index_ptr(p, index);
 		return (((uint64_t)ntohl(*((uint32_t *)(index + 0)))) << 32) |
 				   ntohl(*((uint32_t *)(index + 4)));
 	}
@@ -2934,7 +2943,7 @@
 	git_SHA_CTX c;
 
 	/* Generate the header */
-	*hdrlen = sprintf(hdr, "%s %lu", type, len)+1;
+	*hdrlen = xsnprintf(hdr, *hdrlen, "%s %lu", type, len)+1;
 
 	/* Sha1.. */
 	git_SHA1_Init(&c);
@@ -2997,7 +3006,7 @@
                    unsigned char *sha1)
 {
 	char hdr[32];
-	int hdrlen;
+	int hdrlen = sizeof(hdr);
 	write_sha1_file_prepare(buf, len, type, sha1, hdr, &hdrlen);
 	return 0;
 }
@@ -3027,29 +3036,31 @@
  * We want to avoid cross-directory filename renames, because those
  * can have problems on various filesystems (FAT, NFS, Coda).
  */
-static int create_tmpfile(char *buffer, size_t bufsiz, const char *filename)
+static int create_tmpfile(struct strbuf *tmp, const char *filename)
 {
 	int fd, dirlen = directory_size(filename);
 
-	if (dirlen + 20 > bufsiz) {
-		errno = ENAMETOOLONG;
-		return -1;
-	}
-	memcpy(buffer, filename, dirlen);
-	strcpy(buffer + dirlen, "tmp_obj_XXXXXX");
-	fd = git_mkstemp_mode(buffer, 0444);
+	strbuf_reset(tmp);
+	strbuf_add(tmp, filename, dirlen);
+	strbuf_addstr(tmp, "tmp_obj_XXXXXX");
+	fd = git_mkstemp_mode(tmp->buf, 0444);
 	if (fd < 0 && dirlen && errno == ENOENT) {
-		/* Make sure the directory exists */
-		memcpy(buffer, filename, dirlen);
-		buffer[dirlen-1] = 0;
-		if (mkdir(buffer, 0777) && errno != EEXIST)
+		/*
+		 * Make sure the directory exists; note that the contents
+		 * of the buffer are undefined after mkstemp returns an
+		 * error, so we have to rewrite the whole buffer from
+		 * scratch.
+		 */
+		strbuf_reset(tmp);
+		strbuf_add(tmp, filename, dirlen - 1);
+		if (mkdir(tmp->buf, 0777) && errno != EEXIST)
 			return -1;
-		if (adjust_shared_perm(buffer))
+		if (adjust_shared_perm(tmp->buf))
 			return -1;
 
 		/* Try again */
-		strcpy(buffer + dirlen - 1, "/tmp_obj_XXXXXX");
-		fd = git_mkstemp_mode(buffer, 0444);
+		strbuf_addstr(tmp, "/tmp_obj_XXXXXX");
+		fd = git_mkstemp_mode(tmp->buf, 0444);
 	}
 	return fd;
 }
@@ -3062,10 +3073,10 @@
 	git_zstream stream;
 	git_SHA_CTX c;
 	unsigned char parano_sha1[20];
-	static char tmp_file[PATH_MAX];
+	static struct strbuf tmp_file = STRBUF_INIT;
 	const char *filename = sha1_file_name(sha1);
 
-	fd = create_tmpfile(tmp_file, sizeof(tmp_file), filename);
+	fd = create_tmpfile(&tmp_file, filename);
 	if (fd < 0) {
 		if (errno == EACCES)
 			return error("insufficient permission for adding an object to repository database %s", get_object_directory());
@@ -3114,12 +3125,12 @@
 		struct utimbuf utb;
 		utb.actime = mtime;
 		utb.modtime = mtime;
-		if (utime(tmp_file, &utb) < 0)
+		if (utime(tmp_file.buf, &utb) < 0)
 			warning("failed utime() on %s: %s",
-				tmp_file, strerror(errno));
+				tmp_file.buf, strerror(errno));
 	}
 
-	return finalize_object_file(tmp_file, filename);
+	return finalize_object_file(tmp_file.buf, filename);
 }
 
 static int freshen_loose_object(const unsigned char *sha1)
@@ -3143,7 +3154,7 @@
 int write_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *sha1)
 {
 	char hdr[32];
-	int hdrlen;
+	int hdrlen = sizeof(hdr);
 
 	/* Normally if we have it in the pack then we do not bother writing
 	 * it out into .git/objects/??/?{38} file.
@@ -3161,7 +3172,8 @@
 	int hdrlen, status = 0;
 
 	/* type string, SP, %lu of the length plus NUL must fit this */
-	header = xmalloc(strlen(type) + 32);
+	hdrlen = strlen(type) + 32;
+	header = xmalloc(hdrlen);
 	write_sha1_file_prepare(buf, len, type, sha1, header, &hdrlen);
 
 	if (!(flags & HASH_WRITE_OBJECT))
@@ -3189,7 +3201,7 @@
 	buf = read_packed_sha1(sha1, &type, &len);
 	if (!buf)
 		return error("cannot read sha1_file for %s", sha1_to_hex(sha1));
-	hdrlen = sprintf(hdr, "%s %lu", typename(type), len) + 1;
+	hdrlen = xsnprintf(hdr, sizeof(hdr), "%s %lu", typename(type), len) + 1;
 	ret = write_loose_object(sha1, hdr, hdrlen, buf, len, mtime);
 	free(buf);
 
@@ -3224,6 +3236,11 @@
 	return find_pack_entry(sha1, &e);
 }
 
+int has_object_file(const struct object_id *oid)
+{
+	return has_sha1_file(oid->hash);
+}
+
 static void check_tree(const void *buf, size_t size)
 {
 	struct tree_desc desc;
diff --git a/sha1_name.c b/sha1_name.c
index da6874c..ab5a163 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -87,20 +87,23 @@
 		 * object databases including our own.
 		 */
 		const char *objdir = get_object_directory();
-		int objdir_len = strlen(objdir);
-		int entlen = objdir_len + 43;
-		fakeent = xmalloc(sizeof(*fakeent) + entlen);
+		size_t objdir_len = strlen(objdir);
+		fakeent = xmalloc(st_add3(sizeof(*fakeent), objdir_len, 43));
 		memcpy(fakeent->base, objdir, objdir_len);
 		fakeent->name = fakeent->base + objdir_len + 1;
 		fakeent->name[-1] = '/';
 	}
 	fakeent->next = alt_odb_list;
 
-	sprintf(hex, "%.2s", hex_pfx);
+	xsnprintf(hex, sizeof(hex), "%.2s", hex_pfx);
 	for (alt = fakeent; alt && !ds->ambiguous; alt = alt->next) {
 		struct dirent *de;
 		DIR *dir;
-		sprintf(alt->name, "%.2s/", hex_pfx);
+		/*
+		 * every alt_odb struct has 42 extra bytes after the base
+		 * for exactly this purpose
+		 */
+		xsnprintf(alt->name, 42, "%.2s/", hex_pfx);
 		dir = opendir(alt->base);
 		if (!dir)
 			continue;
@@ -368,14 +371,13 @@
 	return ds.ambiguous;
 }
 
-const char *find_unique_abbrev(const unsigned char *sha1, int len)
+int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len)
 {
 	int status, exists;
-	static char hex[41];
 
-	memcpy(hex, sha1_to_hex(sha1), 40);
+	sha1_to_hex_r(hex, sha1);
 	if (len == 40 || !len)
-		return hex;
+		return 40;
 	exists = has_sha1_file(sha1);
 	while (len < 40) {
 		unsigned char sha1_ret[20];
@@ -384,10 +386,17 @@
 		    ? !status
 		    : status == SHORT_NAME_NOT_FOUND) {
 			hex[len] = 0;
-			return hex;
+			return len;
 		}
 		len++;
 	}
+	return len;
+}
+
+const char *find_unique_abbrev(const unsigned char *sha1, int len)
+{
+	static char hex[GIT_SHA1_HEXSZ + 1];
+	find_unique_abbrev_r(hex, sha1, len);
 	return hex;
 }
 
@@ -606,13 +615,13 @@
 	if (parse_commit(commit))
 		return -1;
 	if (!idx) {
-		hashcpy(result, commit->object.sha1);
+		hashcpy(result, commit->object.oid.hash);
 		return 0;
 	}
 	p = commit->parents;
 	while (p) {
 		if (!--idx) {
-			hashcpy(result, p->item->object.sha1);
+			hashcpy(result, p->item->object.oid.hash);
 			return 0;
 		}
 		p = p->next;
@@ -639,7 +648,7 @@
 			return -1;
 		commit = commit->parents->item;
 	}
-	hashcpy(result, commit->object.sha1);
+	hashcpy(result, commit->object.oid.hash);
 	return 0;
 }
 
@@ -649,7 +658,7 @@
 	if (name && !namelen)
 		namelen = strlen(name);
 	while (1) {
-		if (!o || (!o->parsed && !parse_object(o->sha1)))
+		if (!o || (!o->parsed && !parse_object(o->oid.hash)))
 			return NULL;
 		if (expected_type == OBJ_ANY || o->type == expected_type)
 			return o;
@@ -726,9 +735,9 @@
 		return -1;
 	if (!expected_type) {
 		o = deref_tag(o, name, sp - name - 2);
-		if (!o || (!o->parsed && !parse_object(o->sha1)))
+		if (!o || (!o->parsed && !parse_object(o->oid.hash)))
 			return -1;
-		hashcpy(sha1, o->sha1);
+		hashcpy(sha1, o->oid.hash);
 		return 0;
 	}
 
@@ -741,7 +750,7 @@
 	if (!o)
 		return -1;
 
-	hashcpy(sha1, o->sha1);
+	hashcpy(sha1, o->oid.hash);
 	if (sp[0] == '/') {
 		/* "$commit^{/foo}" */
 		char *prefix;
@@ -872,12 +881,12 @@
 
 	if (prefix[0] == '!') {
 		if (prefix[1] != '!')
-			die ("Invalid search pattern: %s", prefix);
+			return -1;
 		prefix++;
 	}
 
 	if (regcomp(&regex, prefix, REG_EXTENDED))
-		die("Invalid search pattern: %s", prefix);
+		return -1;
 
 	for (l = list; l; l = l->next) {
 		l->item->object.flags |= ONELINE_SEEN;
@@ -889,7 +898,7 @@
 		int matches;
 
 		commit = pop_most_recent_commit(&list, ONELINE_SEEN);
-		if (!parse_object(commit->object.sha1))
+		if (!parse_object(commit->object.oid.hash))
 			continue;
 		buf = get_commit_buffer(commit, NULL);
 		p = strstr(buf, "\n\n");
@@ -897,7 +906,7 @@
 		unuse_commit_buffer(commit, buf);
 
 		if (matches) {
-			hashcpy(sha1, commit->object.sha1);
+			hashcpy(sha1, commit->object.oid.hash);
 			found = 1;
 			break;
 		}
@@ -1012,7 +1021,7 @@
 		st = -1;
 	else {
 		st = 0;
-		hashcpy(sha1, mbs->item->object.sha1);
+		hashcpy(sha1, mbs->item->object.oid.hash);
 	}
 	free_commit_list(mbs);
 	return st;
@@ -1283,8 +1292,7 @@
 	const struct cache_entry *ce;
 	int pos;
 	unsigned namelen = strlen(filename);
-	unsigned fullnamelen;
-	char *fullname;
+	struct strbuf fullname = STRBUF_INIT;
 
 	if (!prefix)
 		prefix = "";
@@ -1304,21 +1312,19 @@
 	}
 
 	/* Confusion between relative and absolute filenames? */
-	fullnamelen = namelen + strlen(prefix);
-	fullname = xmalloc(fullnamelen + 1);
-	strcpy(fullname, prefix);
-	strcat(fullname, filename);
-	pos = cache_name_pos(fullname, fullnamelen);
+	strbuf_addstr(&fullname, prefix);
+	strbuf_addstr(&fullname, filename);
+	pos = cache_name_pos(fullname.buf, fullname.len);
 	if (pos < 0)
 		pos = -pos - 1;
 	if (pos < active_nr) {
 		ce = active_cache[pos];
-		if (ce_namelen(ce) == fullnamelen &&
-		    !memcmp(ce->name, fullname, fullnamelen))
+		if (ce_namelen(ce) == fullname.len &&
+		    !memcmp(ce->name, fullname.buf, fullname.len))
 			die("Path '%s' is in the index, but not '%s'.\n"
 			    "Did you mean ':%d:%s' aka ':%d:./%s'?",
-			    fullname, filename,
-			    ce_stage(ce), fullname,
+			    fullname.buf, filename,
+			    ce_stage(ce), fullname.buf,
 			    ce_stage(ce), filename);
 	}
 
@@ -1328,7 +1334,7 @@
 		die("Path '%s' does not exist (neither on disk nor in the index).",
 		    filename);
 
-	free(fullname);
+	strbuf_release(&fullname);
 }
 
 
diff --git a/shallow.c b/shallow.c
index 4dcb454..4d554ca 100644
--- a/shallow.c
+++ b/shallow.c
@@ -10,7 +10,6 @@
 #include "diff.h"
 #include "revision.h"
 #include "commit-slab.h"
-#include "sigchain.h"
 
 static int is_shallow = -1;
 static struct stat_validity shallow_stat;
@@ -106,7 +105,7 @@
 		cur_depth++;
 		if ((depth != INFINITE_DEPTH && cur_depth >= depth) ||
 		    (is_repository_shallow() && !commit->parents &&
-		     (graft = lookup_commit_graft(commit->object.sha1)) != NULL &&
+		     (graft = lookup_commit_graft(commit->object.oid.hash)) != NULL &&
 		     graft->nr_parent < 0)) {
 			commit_list_insert(commit, &result);
 			commit->object.flags |= shallow_flag;
@@ -168,7 +167,7 @@
 		if (!c || !(c->object.flags & SEEN)) {
 			if (data->flags & VERBOSE)
 				printf("Removing %s from .git/shallow\n",
-				       sha1_to_hex(c->object.sha1));
+				       oid_to_hex(&c->object.oid));
 			return 0;
 		}
 	}
@@ -316,8 +315,8 @@
 	info->shallow = sa;
 	if (!sa)
 		return;
-	info->ours = xmalloc(sizeof(*info->ours) * sa->nr);
-	info->theirs = xmalloc(sizeof(*info->theirs) * sa->nr);
+	ALLOC_ARRAY(info->ours, sa->nr);
+	ALLOC_ARRAY(info->theirs, sa->nr);
 	for (i = 0; i < sa->nr; i++) {
 		if (has_sha1_file(sa->sha1[i])) {
 			struct commit_graft *graft;
@@ -390,7 +389,7 @@
 	unsigned int i, nr;
 	struct commit_list *head = NULL;
 	int bitmap_nr = (info->nr_bits + 31) / 32;
-	int bitmap_size = bitmap_nr * sizeof(uint32_t);
+	size_t bitmap_size = st_mult(bitmap_nr, sizeof(uint32_t));
 	uint32_t *tmp = xmalloc(bitmap_size); /* to be freed before return */
 	uint32_t *bitmap = paint_alloc(info);
 	struct commit *c = lookup_commit_reference_gently(sha1, 1);
@@ -427,7 +426,7 @@
 
 		if (parse_commit(c))
 			die("unable to parse commit %s",
-			    sha1_to_hex(c->object.sha1));
+			    oid_to_hex(&c->object.oid));
 
 		for (p = c->parents; p; p = p->next) {
 			uint32_t **p_refs = ref_bitmap_at(&info->ref_bitmap,
@@ -488,7 +487,7 @@
 	struct paint_info pi;
 
 	trace_printf_key(&trace_shallow, "shallow: assign_shallow_commits_to_refs\n");
-	shallow = xmalloc(sizeof(*shallow) * (info->nr_ours + info->nr_theirs));
+	ALLOC_ARRAY(shallow, info->nr_ours + info->nr_theirs);
 	for (i = 0; i < info->nr_ours; i++)
 		shallow[nr_shallow++] = info->ours[i];
 	for (i = 0; i < info->nr_theirs; i++)
diff --git a/show-index.c b/show-index.c
index d9e4903..acf8d54 100644
--- a/show-index.c
+++ b/show-index.c
@@ -50,7 +50,8 @@
 			unsigned char sha1[20];
 			uint32_t crc;
 			uint32_t off;
-		} *entries = xmalloc(nr * sizeof(entries[0]));
+		} *entries;
+		ALLOC_ARRAY(entries, nr);
 		for (i = 0; i < nr; i++)
 			if (fread(entries[i].sha1, 20, 1, stdin) != 1)
 				die("unable to read sha1 %u/%u", i, nr);
diff --git a/sideband.c b/sideband.c
index 7f9dc22..fde8adc 100644
--- a/sideband.c
+++ b/sideband.c
@@ -137,11 +137,11 @@
 		if (packet_max - 5 < n)
 			n = packet_max - 5;
 		if (0 <= band) {
-			sprintf(hdr, "%04x", n + 5);
+			xsnprintf(hdr, sizeof(hdr), "%04x", n + 5);
 			hdr[4] = band;
 			write_or_die(fd, hdr, 5);
 		} else {
-			sprintf(hdr, "%04x", n + 4);
+			xsnprintf(hdr, sizeof(hdr), "%04x", n + 4);
 			write_or_die(fd, hdr, 4);
 		}
 		write_or_die(fd, p, n);
diff --git a/strbuf.c b/strbuf.c
index 9583875..de7a7c2 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -245,8 +245,8 @@
 	static char prefix2[2];
 
 	if (prefix1[0] != comment_line_char) {
-		sprintf(prefix1, "%c ", comment_line_char);
-		sprintf(prefix2, "%c", comment_line_char);
+		xsnprintf(prefix1, sizeof(prefix1), "%c ", comment_line_char);
+		xsnprintf(prefix2, sizeof(prefix2), "%c", comment_line_char);
 	}
 	add_lines(out, prefix1, prefix2, buf, size);
 }
@@ -685,7 +685,7 @@
 	size_t len, i;
 
 	len = strlen(string);
-	result = xmalloc(len + 1);
+	result = xmallocz(len);
 	for (i = 0; i < len; i++)
 		result[i] = tolower(string[i]);
 	result[i] = '\0';
@@ -744,6 +744,15 @@
 	strbuf_setlen(sb, sb->len + len);
 }
 
+void strbuf_add_unique_abbrev(struct strbuf *sb, const unsigned char *sha1,
+			      int abbrev_len)
+{
+	int r;
+	strbuf_grow(sb, GIT_SHA1_HEXSZ + 1);
+	r = find_unique_abbrev_r(sb->buf + sb->len, sha1, abbrev_len);
+	strbuf_setlen(sb, sb->len + r);
+}
+
 /*
  * Returns the length of a line, without trailing spaces.
  *
diff --git a/strbuf.h b/strbuf.h
index 5397d91..7123fca 100644
--- a/strbuf.h
+++ b/strbuf.h
@@ -484,6 +484,14 @@
 extern void strbuf_list_free(struct strbuf **);
 
 /**
+ * Add the abbreviation, as generated by find_unique_abbrev, of `sha1` to
+ * the strbuf `sb`.
+ */
+extern void strbuf_add_unique_abbrev(struct strbuf *sb,
+				     const unsigned char *sha1,
+				     int abbrev_len);
+
+/**
  * Launch the user preferred editor to edit a file and fill the buffer
  * with the file's contents upon the user completing their editing. The
  * third argument can be used to set the environment which the editor is
@@ -500,10 +508,21 @@
  */
 extern void strbuf_addstr_xml_quoted(struct strbuf *sb, const char *s);
 
+/**
+ * "Complete" the contents of `sb` by ensuring that either it ends with the
+ * character `term`, or it is empty.  This can be used, for example,
+ * to ensure that text ends with a newline, but without creating an empty
+ * blank line if there is no content in the first place.
+ */
+static inline void strbuf_complete(struct strbuf *sb, char term)
+{
+	if (sb->len && sb->buf[sb->len - 1] != term)
+		strbuf_addch(sb, term);
+}
+
 static inline void strbuf_complete_line(struct strbuf *sb)
 {
-	if (sb->len && sb->buf[sb->len - 1] != '\n')
-		strbuf_addch(sb, '\n');
+	strbuf_complete(sb, '\n');
 }
 
 extern int strbuf_branchname(struct strbuf *sb, const char *name);
diff --git a/submodule-config.c b/submodule-config.c
index 393de53..fe8ceab 100644
--- a/submodule-config.c
+++ b/submodule-config.c
@@ -228,6 +228,35 @@
 	return parse_fetch_recurse(opt, arg, 1);
 }
 
+static int parse_push_recurse(const char *opt, const char *arg,
+			       int die_on_error)
+{
+	switch (git_config_maybe_bool(opt, arg)) {
+	case 1:
+		/* There's no simple "on" value when pushing */
+		if (die_on_error)
+			die("bad %s argument: %s", opt, arg);
+		else
+			return RECURSE_SUBMODULES_ERROR;
+	case 0:
+		return RECURSE_SUBMODULES_OFF;
+	default:
+		if (!strcmp(arg, "on-demand"))
+			return RECURSE_SUBMODULES_ON_DEMAND;
+		else if (!strcmp(arg, "check"))
+			return RECURSE_SUBMODULES_CHECK;
+		else if (die_on_error)
+			die("bad %s argument: %s", opt, arg);
+		else
+			return RECURSE_SUBMODULES_ERROR;
+	}
+}
+
+int parse_push_recurse_submodules_arg(const char *opt, const char *arg)
+{
+	return parse_push_recurse(opt, arg, 1);
+}
+
 static void warn_multiple_config(const unsigned char *commit_sha1,
 				 const char *name, const char *option)
 {
@@ -257,78 +286,62 @@
 	if (!name_and_item_from_var(var, &name, &item))
 		return 0;
 
-	submodule = lookup_or_create_by_name(me->cache, me->gitmodules_sha1,
-			name.buf);
+	submodule = lookup_or_create_by_name(me->cache,
+					     me->gitmodules_sha1,
+					     name.buf);
 
 	if (!strcmp(item.buf, "path")) {
-		struct strbuf path = STRBUF_INIT;
-		if (!value) {
+		if (!value)
 			ret = config_error_nonbool(var);
-			goto release_return;
-		}
-		if (!me->overwrite && submodule->path != NULL) {
+		else if (!me->overwrite && submodule->path != NULL)
 			warn_multiple_config(me->commit_sha1, submodule->name,
 					"path");
-			goto release_return;
+		else {
+			if (submodule->path)
+				cache_remove_path(me->cache, submodule);
+			free((void *) submodule->path);
+			submodule->path = xstrdup(value);
+			cache_put_path(me->cache, submodule);
 		}
-
-		if (submodule->path)
-			cache_remove_path(me->cache, submodule);
-		free((void *) submodule->path);
-		strbuf_addstr(&path, value);
-		submodule->path = strbuf_detach(&path, NULL);
-		cache_put_path(me->cache, submodule);
 	} else if (!strcmp(item.buf, "fetchrecursesubmodules")) {
 		/* when parsing worktree configurations we can die early */
 		int die_on_error = is_null_sha1(me->gitmodules_sha1);
 		if (!me->overwrite &&
-		    submodule->fetch_recurse != RECURSE_SUBMODULES_NONE) {
+		    submodule->fetch_recurse != RECURSE_SUBMODULES_NONE)
 			warn_multiple_config(me->commit_sha1, submodule->name,
 					"fetchrecursesubmodules");
-			goto release_return;
-		}
-
-		submodule->fetch_recurse = parse_fetch_recurse(var, value,
+		else
+			submodule->fetch_recurse = parse_fetch_recurse(
+								var, value,
 								die_on_error);
 	} else if (!strcmp(item.buf, "ignore")) {
-		struct strbuf ignore = STRBUF_INIT;
-		if (!me->overwrite && submodule->ignore != NULL) {
+		if (!value)
+			ret = config_error_nonbool(var);
+		else if (!me->overwrite && submodule->ignore != NULL)
 			warn_multiple_config(me->commit_sha1, submodule->name,
 					"ignore");
-			goto release_return;
-		}
-		if (!value) {
-			ret = config_error_nonbool(var);
-			goto release_return;
-		}
-		if (strcmp(value, "untracked") && strcmp(value, "dirty") &&
-		    strcmp(value, "all") && strcmp(value, "none")) {
+		else if (strcmp(value, "untracked") &&
+			 strcmp(value, "dirty") &&
+			 strcmp(value, "all") &&
+			 strcmp(value, "none"))
 			warning("Invalid parameter '%s' for config option "
 					"'submodule.%s.ignore'", value, var);
-			goto release_return;
+		else {
+			free((void *) submodule->ignore);
+			submodule->ignore = xstrdup(value);
 		}
-
-		free((void *) submodule->ignore);
-		strbuf_addstr(&ignore, value);
-		submodule->ignore = strbuf_detach(&ignore, NULL);
 	} else if (!strcmp(item.buf, "url")) {
-		struct strbuf url = STRBUF_INIT;
 		if (!value) {
 			ret = config_error_nonbool(var);
-			goto release_return;
-		}
-		if (!me->overwrite && submodule->url != NULL) {
+		} else if (!me->overwrite && submodule->url != NULL) {
 			warn_multiple_config(me->commit_sha1, submodule->name,
 					"url");
-			goto release_return;
+		} else {
+			free((void *) submodule->url);
+			submodule->url = xstrdup(value);
 		}
-
-		free((void *) submodule->url);
-		strbuf_addstr(&url, value);
-		submodule->url = strbuf_detach(&url, NULL);
 	}
 
-release_return:
 	strbuf_release(&name);
 	strbuf_release(&item);
 
diff --git a/submodule-config.h b/submodule-config.h
index 9061e4e..9bfa65a 100644
--- a/submodule-config.h
+++ b/submodule-config.h
@@ -19,6 +19,7 @@
 };
 
 int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg);
+int parse_push_recurse_submodules_arg(const char *opt, const char *arg);
 int parse_submodule_config_option(const char *var, const char *value);
 const struct submodule *submodule_from_name(const unsigned char *commit_sha1,
 		const char *name);
diff --git a/submodule.c b/submodule.c
index a458100..2a6cc9e 100644
--- a/submodule.c
+++ b/submodule.c
@@ -68,7 +68,7 @@
 	strbuf_addstr(&entry, "submodule.");
 	strbuf_addstr(&entry, submodule->name);
 	strbuf_addstr(&entry, ".path");
-	if (git_config_set_in_file(".gitmodules", entry.buf, newpath) < 0) {
+	if (git_config_set_in_file_gently(".gitmodules", entry.buf, newpath) < 0) {
 		/* Maybe the user already did that, don't error out here */
 		warning(_("Could not update .gitmodules entry %s"), entry.buf);
 		strbuf_release(&entry);
@@ -122,6 +122,7 @@
 	struct strbuf objects_directory = STRBUF_INIT;
 	struct alternate_object_database *alt_odb;
 	int ret = 0;
+	size_t alloc;
 
 	strbuf_git_path_submodule(&objects_directory, path, "objects/");
 	if (!is_directory(objects_directory.buf)) {
@@ -136,9 +137,10 @@
 					objects_directory.len))
 			goto done;
 
-	alt_odb = xmalloc(objects_directory.len + 42 + sizeof(*alt_odb));
+	alloc = st_add(objects_directory.len, 42); /* for "12/345..." sha1 */
+	alt_odb = xmalloc(st_add(sizeof(*alt_odb), alloc));
 	alt_odb->next = alt_odb_list;
-	strcpy(alt_odb->base, objects_directory.buf);
+	xsnprintf(alt_odb->base, alloc, "%s", objects_directory.buf);
 	alt_odb->name = alt_odb->base + objects_directory.len;
 	alt_odb->name[2] = '/';
 	alt_odb->name[40] = '\0';
@@ -247,7 +249,7 @@
 	for (list = merge_bases; list; list = list->next) {
 		list->item->object.flags |= UNINTERESTING;
 		add_pending_object(rev, &list->item->object,
-			sha1_to_hex(list->item->object.sha1));
+			oid_to_hex(&list->item->object.oid));
 	}
 	return prepare_revision_walk(rev);
 }
@@ -595,7 +597,7 @@
 			diff_opts.output_format |= DIFF_FORMAT_CALLBACK;
 			diff_opts.format_callback = submodule_collect_changed_cb;
 			diff_setup_done(&diff_opts);
-			diff_tree_sha1(parent->item->object.sha1, commit->object.sha1, "", &diff_opts);
+			diff_tree_sha1(parent->item->object.oid.hash, commit->object.oid.hash, "", &diff_opts);
 			diffcore_std(&diff_opts);
 			diff_flush(&diff_opts);
 			parent = parent->next;
@@ -873,7 +875,7 @@
 
 	/* get all revisions that merge commit a */
 	snprintf(merged_revision, sizeof(merged_revision), "^%s",
-			sha1_to_hex(a->object.sha1));
+			oid_to_hex(&a->object.oid));
 	init_revisions(&revs, NULL);
 	rev_opts.submodule = path;
 	setup_revisions(ARRAY_SIZE(rev_args)-1, rev_args, &revs, &rev_opts);
@@ -1004,7 +1006,7 @@
 			"by using:\n\n"
 			"  git update-index --cacheinfo 160000 %s \"%s\"\n\n"
 			"which will accept this suggestion.\n",
-			sha1_to_hex(merges.objects[0].item->sha1), path);
+			oid_to_hex(&merges.objects[0].item->oid), path);
 		break;
 
 	default:
@@ -1032,11 +1034,9 @@
 	/* Update core.worktree setting */
 	strbuf_reset(&file_name);
 	strbuf_addf(&file_name, "%s/config", git_dir);
-	if (git_config_set_in_file(file_name.buf, "core.worktree",
-				   relative_path(real_work_tree, git_dir,
-						 &rel_path)))
-		die(_("Could not set core.worktree in %s"),
-		    file_name.buf);
+	git_config_set_in_file(file_name.buf, "core.worktree",
+			       relative_path(real_work_tree, git_dir,
+					     &rel_path));
 
 	strbuf_release(&file_name);
 	strbuf_release(&rel_path);
diff --git a/submodule.h b/submodule.h
index 5507c3d..ddff512 100644
--- a/submodule.h
+++ b/submodule.h
@@ -5,6 +5,7 @@
 struct argv_array;
 
 enum {
+	RECURSE_SUBMODULES_CHECK = -4,
 	RECURSE_SUBMODULES_ERROR = -3,
 	RECURSE_SUBMODULES_NONE = -2,
 	RECURSE_SUBMODULES_ON_DEMAND = -1,
diff --git a/t/README b/t/README
index 35438bc..1dc908e 100644
--- a/t/README
+++ b/t/README
@@ -563,6 +563,11 @@
    argument.  This is primarily meant for use during the
    development of a new test script.
 
+ - debug <git-command>
+
+   Run a git command inside a debugger. This is primarily meant for
+   use when debugging a failing test script.
+
  - test_done
 
    Your test script must have test_done at the end.  Its purpose
diff --git a/t/annotate-tests.sh b/t/annotate-tests.sh
index b1673b3..093832f 100644
--- a/t/annotate-tests.sh
+++ b/t/annotate-tests.sh
@@ -68,6 +68,13 @@
 	check_count A 2
 '
 
+test_expect_success 'blame by tag objects' '
+	git tag -m "test tag" testTag &&
+	git tag -m "test tag #2" testTag2 testTag &&
+	check_count -h testTag A 2 &&
+	check_count -h testTag2 A 2
+'
+
 test_expect_success 'setup B lines' '
 	echo "2A quick brown fox jumps over the" >>file &&
 	echo "lazy dog" >>file &&
diff --git a/t/lib-git-p4.sh b/t/lib-git-p4.sh
index 7548225..f9ae1d7 100644
--- a/t/lib-git-p4.sh
+++ b/t/lib-git-p4.sh
@@ -6,6 +6,14 @@
 # a subdirectory called "$git"
 TEST_NO_CREATE_REPO=NoThanks
 
+# Some operations require multiple attempts to be successful. Define
+# here the maximal retry timeout in seconds.
+RETRY_TIMEOUT=60
+
+# Sometimes p4d seems to hang. Terminate the p4d process automatically after
+# the defined timeout in seconds.
+P4D_TIMEOUT=300
+
 . ./test-lib.sh
 
 if ! test_have_prereq PYTHON
@@ -36,6 +44,15 @@
 	echo "$path"
 }
 
+# On Solaris the 'date +%s' function is not supported and therefore we
+# need this replacement.
+# Attention: This function is not safe again against time offset updates
+# at runtime (e.g. via NTP). The 'clock_gettime(CLOCK_MONOTONIC)'
+# function could fix that but it is not in Python until 3.3.
+time_in_seconds() {
+	python -c 'import time; print int(time.time())'
+}
+
 # Try to pick a unique port: guess a large number, then hope
 # no more than one of each test is running.
 #
@@ -57,6 +74,15 @@
 git="$TRASH_DIRECTORY/git"
 pidfile="$TRASH_DIRECTORY/p4d.pid"
 
+# Sometimes "prove" seems to hang on exit because p4d is still running
+cleanup() {
+	if test -f "$pidfile"
+	then
+		kill -9 $(cat "$pidfile") 2>/dev/null && exit 255
+	fi
+}
+trap cleanup EXIT
+
 # git p4 submit generates a temp file, which will
 # not get cleaned up if the submission fails.  Don't
 # clutter up /tmp on the test machine.
@@ -81,6 +107,19 @@
 	# will be caught with the "kill -0" check below.
 	i=${P4D_START_PATIENCE:-300}
 	pid=$(cat "$pidfile")
+
+	timeout=$(($(time_in_seconds) + $P4D_TIMEOUT))
+	while true
+	do
+		if test $(time_in_seconds) -gt $timeout
+		then
+			kill -9 $pid
+			exit 1
+		fi
+		sleep 1
+	done &
+	watchdog_pid=$!
+
 	ready=
 	while test $i -gt 0
 	do
@@ -121,22 +160,36 @@
 	EOF
 }
 
+retry_until_success() {
+	timeout=$(($(time_in_seconds) + $RETRY_TIMEOUT))
+	until "$@" 2>/dev/null || test $(time_in_seconds) -gt $timeout
+	do
+		sleep 1
+	done
+}
+
+retry_until_fail() {
+	timeout=$(($(time_in_seconds) + $RETRY_TIMEOUT))
+	until ! "$@" 2>/dev/null || test $(time_in_seconds) -gt $timeout
+	do
+		sleep 1
+	done
+}
+
 kill_p4d() {
 	pid=$(cat "$pidfile")
-	# it had better exist for the first kill
-	kill $pid &&
-	for i in 1 2 3 4 5 ; do
-		kill $pid >/dev/null 2>&1 || break
-		sleep 1
-	done &&
+	retry_until_fail kill $pid
+	retry_until_fail kill -9 $pid
 	# complain if it would not die
 	test_must_fail kill $pid >/dev/null 2>&1 &&
-	rm -rf "$db" "$cli" "$pidfile"
+	rm -rf "$db" "$cli" "$pidfile" &&
+	retry_until_fail kill -9 $watchdog_pid
 }
 
 cleanup_git() {
-	rm -rf "$git" &&
-	mkdir "$git"
+	retry_until_success rm -r "$git"
+	test_must_fail test -d "$git" &&
+	retry_until_success mkdir "$git"
 }
 
 marshal_dump() {
diff --git a/t/perf/p7000-filter-branch.sh b/t/perf/p7000-filter-branch.sh
new file mode 100755
index 0000000..15ee5d1
--- /dev/null
+++ b/t/perf/p7000-filter-branch.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+test_description='performance of filter-branch'
+. ./perf-lib.sh
+
+test_perf_default_repo
+test_checkout_worktree
+
+test_expect_success 'mark bases for tests' '
+	git tag -f tip &&
+	git tag -f base HEAD~100
+'
+
+test_perf 'noop filter' '
+	git checkout --detach tip &&
+	git filter-branch -f base..HEAD
+'
+
+test_done
diff --git a/t/perf/p7300-clean.sh b/t/perf/p7300-clean.sh
index ec94cdd..7c1888a 100755
--- a/t/perf/p7300-clean.sh
+++ b/t/perf/p7300-clean.sh
@@ -28,4 +28,8 @@
 	git clean -n -q -f -f -d 100000_sub_dirs/
 '
 
+test_perf 'ls-files -o' '
+	git ls-files -o
+'
+
 test_done
diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index 7de8d85..f91bbcf 100755
--- a/t/t0001-init.sh
+++ b/t/t0001-init.sh
@@ -202,8 +202,8 @@
 	x$(git config -f shared-honor-global/.git/config core.sharedRepository)
 '
 
-test_expect_success 'init rejects insanely long --template' '
-	test_must_fail git init --template=$(printf "x%09999dx" 1) test
+test_expect_success 'init allows insanely long --template' '
+	git init --template=$(printf "x%09999dx" 1) test
 '
 
 test_expect_success 'init creates a new directory' '
diff --git a/t/t0002-gitfile.sh b/t/t0002-gitfile.sh
index 9670e8c..3afe012 100755
--- a/t/t0002-gitfile.sh
+++ b/t/t0002-gitfile.sh
@@ -99,7 +99,7 @@
 	test "$SHA" = "$(git rev-list HEAD)"
 '
 
-test_expect_success 'setup_git_dir twice in subdir' '
+test_expect_failure 'setup_git_dir twice in subdir' '
 	git init sgd &&
 	(
 		cd sgd &&
diff --git a/t/t0027-auto-crlf.sh b/t/t0027-auto-crlf.sh
index 1a56e5e..b343651 100755
--- a/t/t0027-auto-crlf.sh
+++ b/t/t0027-auto-crlf.sh
@@ -55,6 +55,26 @@
 	esac
 }
 
+create_NNO_files () {
+	lfname=$1
+	crlfname=$2
+	lfmixcrlf=$3
+	lfmixcr=$4
+	crlfnul=$5
+	for crlf in false true input
+	do
+		for attr in "" auto text -text lf crlf
+		do
+			pfx=NNO_${crlf}_attr_${attr} &&
+			cp $lfname    ${pfx}_LF.txt &&
+			cp $crlfname  ${pfx}_CRLF.txt &&
+			cp $lfmixcrlf ${pfx}_CRLF_mix_LF.txt &&
+			cp $lfmixcr   ${pfx}_LF_mix_CR.txt &&
+			cp $crlfnul   ${pfx}_CRLF_nul.txt
+		done
+	done
+}
+
 check_warning () {
 	case "$1" in
 	LF_CRLF) echo "warning: LF will be replaced by CRLF" >"$2".expect ;;
@@ -62,7 +82,7 @@
 	'')	                                                 >"$2".expect ;;
 	*) echo >&2 "Illegal 1": "$1" ; return false ;;
 	esac
-	grep "will be replaced by" "$2" | sed -e "s/\(.*\) in [^ ]*$/\1/" >"$2".actual
+	grep "will be replaced by" "$2" | sed -e "s/\(.*\) in [^ ]*$/\1/" | uniq  >"$2".actual
 	test_cmp "$2".expect "$2".actual
 }
 
@@ -71,19 +91,10 @@
 	attr=$2
 	lfname=$3
 	crlfname=$4
-	repoMIX=$5
-	lfmixcrlf=$6
-	lfmixcr=$7
-	crlfnul=$8
+	lfmixcrlf=$5
+	lfmixcr=$6
+	crlfnul=$7
 	pfx=crlf_${crlf}_attr_${attr}
-	# Special handling for repoMIX: It should already be in the repo
-	# with CRLF
-	f=repoMIX
-	fname=${pfx}_$f.txt
-	echo >.gitattributes &&
-	cp $f $fname &&
-	git -c core.autocrlf=false add $fname 2>"${pfx}_$f.err" &&
-	git commit -m "repoMIX" &&
 	create_gitattributes "$attr" &&
 	for f in LF CRLF repoMIX LF_mix_CR CRLF_mix_LF LF_nul CRLF_nul
 	do
@@ -99,6 +110,45 @@
 	check_warning "$crlfnul" ${pfx}_CRLF_nul.err
 }
 
+commit_chk_wrnNNO () {
+	crlf=$1
+	attr=$2
+	lfwarn=$3
+	crlfwarn=$4
+	lfmixcrlf=$5
+	lfmixcr=$6
+	crlfnul=$7
+	pfx=NNO_${crlf}_attr_${attr}
+	#Commit files on top of existing file
+	create_gitattributes "$attr" &&
+	for f in LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
+	do
+		fname=${pfx}_$f.txt &&
+		cp $f $fname &&
+		git -c core.autocrlf=$crlf add $fname 2>/dev/null &&
+		git -c core.autocrlf=$crlf commit -m "commit_$fname" $fname >"${pfx}_$f.err" 2>&1
+	done
+
+	test_expect_success "commit NNO files crlf=$crlf attr=$attr LF" '
+		check_warning "$lfwarn" ${pfx}_LF.err
+	'
+	test_expect_success "commit NNO files crlf=$crlf attr=$attr CRLF" '
+		check_warning "$crlfwarn" ${pfx}_CRLF.err
+	'
+
+	test_expect_success "commit NNO files crlf=$crlf attr=$attr CRLF_mix_LF" '
+		check_warning "$lfmixcrlf" ${pfx}_CRLF_mix_LF.err
+	'
+
+	test_expect_success "commit NNO files crlf=$crlf attr=$attr LF_mix_cr" '
+		check_warning "$lfmixcr" ${pfx}_LF_mix_CR.err
+	'
+
+	test_expect_success "commit NNO files crlf=$crlf attr=$attr CRLF_nul" '
+		check_warning "$crlfnul" ${pfx}_CRLF_nul.err
+	'
+}
+
 check_files_in_repo () {
 	crlf=$1
 	attr=$2
@@ -115,6 +165,31 @@
 	compare_files $crlfnul ${pfx}CRLF_nul.txt
 }
 
+check_in_repo_NNO () {
+	crlf=$1
+	attr=$2
+	lfname=$3
+	crlfname=$4
+	lfmixcrlf=$5
+	lfmixcr=$6
+	crlfnul=$7
+	pfx=NNO_${crlf}_attr_${attr}_
+	test_expect_success "compare_files $lfname ${pfx}LF.txt" '
+		compare_files $lfname ${pfx}LF.txt
+	'
+	test_expect_success "compare_files $crlfname ${pfx}CRLF.txt" '
+		compare_files $crlfname ${pfx}CRLF.txt
+	'
+	test_expect_success "compare_files $lfmixcrlf ${pfx}CRLF_mix_LF.txt" '
+		compare_files $lfmixcrlf ${pfx}CRLF_mix_LF.txt
+	'
+	test_expect_success "compare_files $lfmixcr ${pfx}LF_mix_CR.txt" '
+		compare_files $lfmixcr ${pfx}LF_mix_CR.txt
+	'
+	test_expect_success "compare_files $crlfnul ${pfx}CRLF_nul.txt" '
+		compare_files $crlfnul ${pfx}CRLF_nul.txt
+	'
+}
 
 checkout_files () {
 	eol=$1
@@ -169,7 +244,11 @@
 	printf "line1\nline2\rline3"     >LF_mix_CR &&
 	printf "line1\r\nline2\rline3"   >CRLF_mix_CR &&
 	printf "line1Q\r\nline2\r\nline3" | q_to_nul >CRLF_nul &&
-	printf "line1Q\nline2\nline3" | q_to_nul >LF_nul
+	printf "line1Q\nline2\nline3" | q_to_nul >LF_nul &&
+	create_NNO_files CRLF_mix_LF CRLF_mix_LF CRLF_mix_LF CRLF_mix_LF CRLF_mix_LF &&
+	git -c core.autocrlf=false add NNO_*.txt &&
+	git commit -m "mixed line endings" &&
+	test_tick
 '
 
 
@@ -191,46 +270,72 @@
 	WAMIX=CRLF_LF
 fi
 
-#                         attr   LF        CRLF      repoMIX   CRLFmixLF LFmixCR   CRLFNUL
+#                         attr   LF        CRLF      CRLFmixLF LFmixCR   CRLFNUL
 test_expect_success 'commit files empty attr' '
-	commit_check_warn false ""     ""        ""        ""        ""        ""        "" &&
-	commit_check_warn true  ""     "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" ""        "" &&
-	commit_check_warn input ""     ""        "CRLF_LF" "CRLF_LF" "CRLF_LF" ""        ""
+	commit_check_warn false ""     ""        ""        ""        ""        "" &&
+	commit_check_warn true  ""     "LF_CRLF" ""        "LF_CRLF" ""        "" &&
+	commit_check_warn input ""     ""        "CRLF_LF" "CRLF_LF" ""        ""
 '
 
 test_expect_success 'commit files attr=auto' '
-	commit_check_warn false "auto" "$WILC"   "$WICL"   "$WAMIX"  "$WAMIX"  ""        "" &&
-	commit_check_warn true  "auto" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" ""        "" &&
-	commit_check_warn input "auto" ""        "CRLF_LF" "CRLF_LF" "CRLF_LF" ""        ""
+	commit_check_warn false "auto" "$WILC"   "$WICL"   "$WAMIX"  ""        "" &&
+	commit_check_warn true  "auto" "LF_CRLF" ""        "LF_CRLF" ""        "" &&
+	commit_check_warn input "auto" ""        "CRLF_LF" "CRLF_LF" ""        ""
 '
 
 test_expect_success 'commit files attr=text' '
-	commit_check_warn false "text" "$WILC"   "$WICL"   "$WAMIX"  "$WAMIX"  "$WILC"   "$WICL"   &&
-	commit_check_warn true  "text" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" "LF_CRLF" ""        &&
-	commit_check_warn input "text" ""        "CRLF_LF" "CRLF_LF" "CRLF_LF" ""        "CRLF_LF"
+	commit_check_warn false "text" "$WILC"   "$WICL"   "$WAMIX"  "$WILC"   "$WICL"   &&
+	commit_check_warn true  "text" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" ""        &&
+	commit_check_warn input "text" ""        "CRLF_LF" "CRLF_LF" ""        "CRLF_LF"
 '
 
 test_expect_success 'commit files attr=-text' '
-	commit_check_warn false "-text" ""       ""        ""        ""        ""        "" &&
-	commit_check_warn true  "-text" ""       ""        ""        ""        ""        "" &&
-	commit_check_warn input "-text" ""       ""        ""        ""        ""        ""
+	commit_check_warn false "-text" ""       ""        ""        ""        "" &&
+	commit_check_warn true  "-text" ""       ""        ""        ""        "" &&
+	commit_check_warn input "-text" ""       ""        ""        ""        ""
 '
 
 test_expect_success 'commit files attr=lf' '
-	commit_check_warn false "lf"    ""       "CRLF_LF" "CRLF_LF" "CRLF_LF"  ""       "CRLF_LF" &&
-	commit_check_warn true  "lf"    ""       "CRLF_LF" "CRLF_LF" "CRLF_LF"  ""       "CRLF_LF" &&
-	commit_check_warn input "lf"    ""       "CRLF_LF" "CRLF_LF" "CRLF_LF"  ""       "CRLF_LF"
+	commit_check_warn false "lf"    ""       "CRLF_LF" "CRLF_LF"  ""       "CRLF_LF" &&
+	commit_check_warn true  "lf"    ""       "CRLF_LF" "CRLF_LF"  ""       "CRLF_LF" &&
+	commit_check_warn input "lf"    ""       "CRLF_LF" "CRLF_LF"  ""       "CRLF_LF"
 '
 
 test_expect_success 'commit files attr=crlf' '
-	commit_check_warn false "crlf" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" "LF_CRLF" "" &&
-	commit_check_warn true  "crlf" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" "LF_CRLF" "" &&
-	commit_check_warn input "crlf" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" "LF_CRLF" ""
+	commit_check_warn false "crlf" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" "" &&
+	commit_check_warn true  "crlf" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" "" &&
+	commit_check_warn input "crlf" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" ""
 '
 
+#                       attr   LF        CRLF      CRLFmixLF 	 LF_mix_CR   CRLFNUL
+commit_chk_wrnNNO false ""     ""        ""        ""        	 ""        	 ""
+commit_chk_wrnNNO true  ""     "LF_CRLF" ""        ""        	 ""        	 ""
+commit_chk_wrnNNO input ""     ""        ""        ""        	 ""        	 ""
+
+
+commit_chk_wrnNNO false "auto" "$WILC"   "$WICL"   "$WAMIX"  	 ""        	 ""
+commit_chk_wrnNNO true  "auto" "LF_CRLF" ""        "LF_CRLF" 	 ""        	 ""
+commit_chk_wrnNNO input "auto" ""        "CRLF_LF" "CRLF_LF" 	 ""        	 ""
+
+commit_chk_wrnNNO false "text" "$WILC"   "$WICL"   "$WAMIX"  	 "$WILC"   	 "$WICL"
+commit_chk_wrnNNO true  "text" "LF_CRLF" ""        "LF_CRLF" 	 "LF_CRLF" 	 ""
+commit_chk_wrnNNO input "text" ""        "CRLF_LF" "CRLF_LF" 	 ""        	 "CRLF_LF"
+
+commit_chk_wrnNNO false "-text" ""       ""        ""        	 ""        	 ""
+commit_chk_wrnNNO true  "-text" ""       ""        ""        	 ""        	 ""
+commit_chk_wrnNNO input "-text" ""       ""        ""        	 ""        	 ""
+
+commit_chk_wrnNNO false "lf"    ""       "CRLF_LF" "CRLF_LF" 	  ""       	 "CRLF_LF"
+commit_chk_wrnNNO true  "lf"    ""       "CRLF_LF" "CRLF_LF" 	  ""       	 "CRLF_LF"
+commit_chk_wrnNNO input "lf"    ""       "CRLF_LF" "CRLF_LF" 	  ""       	 "CRLF_LF"
+
+commit_chk_wrnNNO false "crlf" "LF_CRLF" ""        "LF_CRLF" 	 "LF_CRLF" 	 ""
+commit_chk_wrnNNO true  "crlf" "LF_CRLF" ""        "LF_CRLF" 	 "LF_CRLF" 	 ""
+commit_chk_wrnNNO input "crlf" "LF_CRLF" ""        "LF_CRLF" 	 "LF_CRLF" 	 ""
+
 test_expect_success 'create files cleanup' '
 	rm -f *.txt &&
-	git reset --hard
+	git -c core.autocrlf=false reset --hard
 '
 
 test_expect_success 'commit empty gitattribues' '
@@ -257,6 +362,24 @@
 	check_files_in_repo input "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
 '
 
+#                       attr    LF        CRLF      CRLF_mix_LF  LF_mix_CR 	CRLFNUL
+check_in_repo_NNO false ""      LF        CRLF      CRLF_mix_LF  LF_mix_CR 	CRLF_nul
+check_in_repo_NNO true  ""      LF        CRLF      CRLF_mix_LF  LF_mix_CR 	CRLF_nul
+check_in_repo_NNO input ""      LF        CRLF      CRLF_mix_LF  LF_mix_CR 	CRLF_nul
+
+check_in_repo_NNO false "auto"  LF        LF        LF           LF_mix_CR 	CRLF_nul
+check_in_repo_NNO true  "auto"  LF        LF        LF           LF_mix_CR 	CRLF_nul
+check_in_repo_NNO input "auto"  LF        LF        LF           LF_mix_CR 	CRLF_nul
+
+check_in_repo_NNO false "text"  LF        LF        LF           LF_mix_CR 	LF_nul
+check_in_repo_NNO true  "text"  LF        LF        LF           LF_mix_CR 	LF_nul
+check_in_repo_NNO input "text"  LF        LF        LF           LF_mix_CR 	LF_nul
+
+check_in_repo_NNO false "-text" LF        CRLF      CRLF_mix_LF  LF_mix_CR 	CRLF_nul
+check_in_repo_NNO true  "-text" LF        CRLF      CRLF_mix_LF  LF_mix_CR 	CRLF_nul
+check_in_repo_NNO input "-text" LF        CRLF      CRLF_mix_LF  LF_mix_CR 	CRLF_nul
+
+
 ################################################################################
 # Check how files in the repo are changed when they are checked out
 # How to read the table below:
diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh
index 93605f4..f0152a7 100755
--- a/t/t0060-path-utils.sh
+++ b/t/t0060-path-utils.sh
@@ -59,6 +59,9 @@
 	;;
 esac
 
+test_expect_success basename 'test-path-utils basename'
+test_expect_success dirname 'test-path-utils dirname'
+
 norm_path "" ""
 norm_path . ""
 norm_path ./ ""
@@ -266,15 +269,21 @@
 test_git_path GIT_COMMON_DIR=bar index                    .git/index
 test_git_path GIT_COMMON_DIR=bar HEAD                     .git/HEAD
 test_git_path GIT_COMMON_DIR=bar logs/HEAD                .git/logs/HEAD
+test_git_path GIT_COMMON_DIR=bar logs/refs/bisect/foo     .git/logs/refs/bisect/foo
+test_git_path GIT_COMMON_DIR=bar logs/refs/bisec/foo      bar/logs/refs/bisec/foo
+test_git_path GIT_COMMON_DIR=bar logs/refs/bisec          bar/logs/refs/bisec
+test_git_path GIT_COMMON_DIR=bar logs/refs/bisectfoo      bar/logs/refs/bisectfoo
 test_git_path GIT_COMMON_DIR=bar objects                  bar/objects
 test_git_path GIT_COMMON_DIR=bar objects/bar              bar/objects/bar
 test_git_path GIT_COMMON_DIR=bar info/exclude             bar/info/exclude
 test_git_path GIT_COMMON_DIR=bar info/grafts              bar/info/grafts
 test_git_path GIT_COMMON_DIR=bar info/sparse-checkout     .git/info/sparse-checkout
+test_git_path GIT_COMMON_DIR=bar info//sparse-checkout    .git/info//sparse-checkout
 test_git_path GIT_COMMON_DIR=bar remotes/bar              bar/remotes/bar
 test_git_path GIT_COMMON_DIR=bar branches/bar             bar/branches/bar
 test_git_path GIT_COMMON_DIR=bar logs/refs/heads/master   bar/logs/refs/heads/master
 test_git_path GIT_COMMON_DIR=bar refs/heads/master        bar/refs/heads/master
+test_git_path GIT_COMMON_DIR=bar refs/bisect/foo          .git/refs/bisect/foo
 test_git_path GIT_COMMON_DIR=bar hooks/me                 bar/hooks/me
 test_git_path GIT_COMMON_DIR=bar config                   bar/config
 test_git_path GIT_COMMON_DIR=bar packed-refs              bar/packed-refs
diff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh
index 91235b7..9863d0d 100755
--- a/t/t1308-config-set.sh
+++ b/t/t1308-config-set.sh
@@ -218,4 +218,15 @@
 	test_i18ngrep "fatal: .*alias\.br.*\.git/config.*line 2" result
 '
 
+test_expect_success 'error on modifying repo config without repo' '
+	mkdir no-repo &&
+	(
+		GIT_CEILING_DIRECTORIES=$(pwd) &&
+		export GIT_CEILING_DIRECTORIES &&
+		cd no-repo &&
+		test_must_fail git config a.b c 2>err &&
+		grep "not in a git directory" err
+	)
+'
+
 test_done
diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh
index 97406fa..af1b20d 100755
--- a/t/t1400-update-ref.sh
+++ b/t/t1400-update-ref.sh
@@ -1130,4 +1130,23 @@
 )
 '
 
+test_expect_success 'handle per-worktree refs in refs/bisect' '
+	git commit --allow-empty -m "initial commit" &&
+	git worktree add -b branch worktree &&
+	(
+		cd worktree &&
+		git commit --allow-empty -m "test commit"  &&
+		git for-each-ref >for-each-ref.out &&
+		! grep refs/bisect for-each-ref.out &&
+		git update-ref refs/bisect/something HEAD &&
+		git rev-parse refs/bisect/something >../worktree-head &&
+		git for-each-ref | grep refs/bisect/something
+	) &&
+	test_path_is_missing .git/refs/bisect &&
+	test_must_fail git rev-parse refs/bisect/something &&
+	git update-ref refs/bisect/something HEAD &&
+	git rev-parse refs/bisect/something >main-head &&
+	! test_cmp main-head worktree-head
+'
+
 test_done
diff --git a/t/t1401-symbolic-ref.sh b/t/t1401-symbolic-ref.sh
index 64968b7..1f0dff3 100755
--- a/t/t1401-symbolic-ref.sh
+++ b/t/t1401-symbolic-ref.sh
@@ -63,6 +63,35 @@
 '
 reset_to_sane
 
+test_expect_success 'create large ref name' '
+	# make 256+ character ref; some systems may not handle that,
+	# so be gentle
+	long=0123456789abcdef &&
+	long=$long/$long/$long/$long &&
+	long=$long/$long/$long/$long &&
+	long_ref=refs/heads/$long &&
+	tree=$(git write-tree) &&
+	commit=$(echo foo | git commit-tree $tree) &&
+	if git update-ref $long_ref $commit; then
+		test_set_prereq LONG_REF
+	else
+		echo >&2 "long refs not supported"
+	fi
+'
+
+test_expect_success LONG_REF 'symbolic-ref can point to large ref name' '
+	git symbolic-ref HEAD $long_ref &&
+	echo $long_ref >expect &&
+	git symbolic-ref HEAD >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success LONG_REF 'we can parse long symbolic ref' '
+	echo $commit >expect &&
+	git rev-parse --verify HEAD >actual &&
+	test_cmp expect actual
+'
+
 test_expect_success 'symbolic-ref reports failure in exit code' '
 	test_when_finished "rm -f .git/HEAD.lock" &&
 	>.git/HEAD.lock &&
diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh
index b79049f..17a194b 100755
--- a/t/t1410-reflog.sh
+++ b/t/t1410-reflog.sh
@@ -325,4 +325,17 @@
 	test_cmp expect actual
 '
 
+test_expect_success 'no segfaults for reflog containing non-commit sha1s' '
+	git update-ref --create-reflog -m "Creating ref" \
+		refs/tests/tree-in-reflog HEAD &&
+	git update-ref -m "Forcing tree" refs/tests/tree-in-reflog HEAD^{tree} &&
+	git update-ref -m "Restoring to commit" refs/tests/tree-in-reflog HEAD &&
+	git reflog refs/tests/tree-in-reflog
+'
+
+test_expect_failure 'reflog with non-commit entries displays all entries' '
+	git reflog refs/tests/tree-in-reflog >actual &&
+	test_line_count = 3 actual
+'
+
 test_done
diff --git a/t/t1430-bad-ref-name.sh b/t/t1430-bad-ref-name.sh
index 16d0b8b..c465abe 100755
--- a/t/t1430-bad-ref-name.sh
+++ b/t/t1430-bad-ref-name.sh
@@ -38,18 +38,20 @@
 	test_must_fail git fast-import <input
 '
 
-test_expect_success 'git branch shows badly named ref' '
+test_expect_success 'git branch shows badly named ref as warning' '
 	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
 	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
-	git branch >output &&
-	grep -e "broken\.\.\.ref" output
+	git branch >output 2>error &&
+	grep -e "broken\.\.\.ref" error &&
+	! grep -e "broken\.\.\.ref" output
 '
 
 test_expect_success 'branch -d can delete badly named ref' '
 	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
 	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
 	git branch -d broken...ref &&
-	git branch >output &&
+	git branch >output 2>error &&
+	! grep -e "broken\.\.\.ref" error &&
 	! grep -e "broken\.\.\.ref" output
 '
 
@@ -57,7 +59,8 @@
 	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
 	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
 	git branch -D broken...ref &&
-	git branch >output &&
+	git branch >output 2>error &&
+	! grep -e "broken\.\.\.ref" error &&
 	! grep -e "broken\.\.\.ref" output
 '
 
@@ -85,7 +88,8 @@
 test_expect_success 'git branch cannot create a badly named ref' '
 	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
 	test_must_fail git branch broken...ref &&
-	git branch >output &&
+	git branch >output 2>error &&
+	! grep -e "broken\.\.\.ref" error &&
 	! grep -e "broken\.\.\.ref" output
 '
 
@@ -95,7 +99,8 @@
 	git branch goodref &&
 	test_must_fail git branch -m goodref broken...ref &&
 	test_cmp_rev master goodref &&
-	git branch >output &&
+	git branch >output 2>error &&
+	! grep -e "broken\.\.\.ref" error &&
 	! grep -e "broken\.\.\.ref" output
 '
 
@@ -104,14 +109,16 @@
 	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
 	git branch -m broken...ref renamed &&
 	test_cmp_rev master renamed &&
-	git branch >output &&
+	git branch >output 2>error &&
+	! grep -e "broken\.\.\.ref" error &&
 	! grep -e "broken\.\.\.ref" output
 '
 
 test_expect_success 'push cannot create a badly named ref' '
 	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
 	test_must_fail git push "file://$(pwd)" HEAD:refs/heads/broken...ref &&
-	git branch >output &&
+	git branch >output 2>error &&
+	! grep -e "broken\.\.\.ref" error &&
 	! grep -e "broken\.\.\.ref" output
 '
 
@@ -131,7 +138,8 @@
 		cp .git/refs/heads/master .git/refs/heads/broken...ref
 	) &&
 	git -C src push --mirror "file://$top/dest" &&
-	git -C dest branch >output &&
+	git -C dest branch >output 2>error &&
+	! grep -e "broken\.\.\.ref" error &&
 	! grep -e "broken\.\.\.ref" output
 '
 
@@ -159,7 +167,8 @@
 	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
 	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
 	git update-ref -d refs/heads/broken...ref &&
-	git branch >output &&
+	git branch >output 2>error &&
+	! grep -e "broken\.\.\.ref" error &&
 	! grep -e "broken\.\.\.ref" output
 '
 
diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh
index dc09797..e66b7cb 100755
--- a/t/t1450-fsck.sh
+++ b/t/t1450-fsck.sh
@@ -176,6 +176,18 @@
 	grep "error in commit $new.*integer overflow" out
 '
 
+test_expect_success 'commit with NUL in header' '
+	git cat-file commit HEAD >basis &&
+	sed "s/author ./author Q/" <basis | q_to_nul >commit-NUL-header &&
+	new=$(git hash-object -t commit -w --stdin <commit-NUL-header) &&
+	test_when_finished "remove_object $new" &&
+	git update-ref refs/heads/bogus "$new" &&
+	test_when_finished "git update-ref -d refs/heads/bogus" &&
+	test_must_fail git fsck 2>out &&
+	cat out &&
+	grep "error in commit $new.*unterminated header: NUL at offset" out
+'
+
 test_expect_success 'malformatted tree object' '
 	test_when_finished "git update-ref -d refs/tags/wrong" &&
 	test_when_finished "remove_object \$T" &&
@@ -276,6 +288,26 @@
 	grep "error in tag .*: invalid author/committer" out
 '
 
+test_expect_success 'tag with NUL in header' '
+	sha=$(git rev-parse HEAD) &&
+	q_to_nul >tag-NUL-header <<-EOF &&
+	object $sha
+	type commit
+	tag contains-Q-in-header
+	tagger T A Gger <tagger@example.com> 1234567890 -0000
+
+	This is an invalid tag.
+	EOF
+
+	tag=$(git hash-object --literally -t tag -w --stdin <tag-NUL-header) &&
+	test_when_finished "remove_object $tag" &&
+	echo $tag >.git/refs/tags/wrong &&
+	test_when_finished "git update-ref -d refs/tags/wrong" &&
+	test_must_fail git fsck --tags 2>out &&
+	cat out &&
+	grep "error in tag $tag.*unterminated header: NUL at offset" out
+'
+
 test_expect_success 'cleaned up' '
 	git fsck >actual 2>&1 &&
 	test_cmp empty actual
diff --git a/t/t1501-worktree.sh b/t/t1501-work-tree.sh
similarity index 100%
rename from t/t1501-worktree.sh
rename to t/t1501-work-tree.sh
diff --git a/t/t1509-root-worktree.sh b/t/t1509-root-work-tree.sh
similarity index 100%
rename from t/t1509-root-worktree.sh
rename to t/t1509-root-work-tree.sh
diff --git a/t/t2019-checkout-ambiguous-ref.sh b/t/t2019-checkout-ambiguous-ref.sh
index 199b22d..b99d519 100755
--- a/t/t2019-checkout-ambiguous-ref.sh
+++ b/t/t2019-checkout-ambiguous-ref.sh
@@ -56,30 +56,4 @@
 	test_i18ngrep ! "^HEAD is now at" stderr
 '
 
-test_expect_success 'wildcard ambiguation, paths win' '
-	git init ambi &&
-	(
-		cd ambi &&
-		echo a >a.c &&
-		git add a.c &&
-		echo b >a.c &&
-		git checkout "*.c" &&
-		echo a >expect &&
-		test_cmp expect a.c
-	)
-'
-
-test_expect_success !MINGW 'wildcard ambiguation, refs lose' '
-	git init ambi2 &&
-	(
-		cd ambi2 &&
-		echo a >"*.c" &&
-		git add . &&
-		test_must_fail git show :"*.c" &&
-		git show :"*.c" -- >actual &&
-		echo a >expect &&
-		test_cmp expect actual
-	)
-'
-
 test_done
diff --git a/t/t2027-worktree-list.sh b/t/t2027-worktree-list.sh
new file mode 100755
index 0000000..1b1b65a
--- /dev/null
+++ b/t/t2027-worktree-list.sh
@@ -0,0 +1,99 @@
+#!/bin/sh
+
+test_description='test git worktree list'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+	test_commit init
+'
+
+test_expect_success 'rev-parse --git-common-dir on main worktree' '
+	git rev-parse --git-common-dir >actual &&
+	echo .git >expected &&
+	test_cmp expected actual &&
+	mkdir sub &&
+	git -C sub rev-parse --git-common-dir >actual2 &&
+	echo sub/.git >expected2 &&
+	test_cmp expected2 actual2
+'
+
+test_expect_success '"list" all worktrees from main' '
+	echo "$(git rev-parse --show-toplevel) $(git rev-parse --short HEAD) [$(git symbolic-ref --short HEAD)]" >expect &&
+	test_when_finished "rm -rf here && git worktree prune" &&
+	git worktree add --detach here master &&
+	echo "$(git -C here rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >>expect &&
+	git worktree list | sed "s/  */ /g" >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success '"list" all worktrees from linked' '
+	echo "$(git rev-parse --show-toplevel) $(git rev-parse --short HEAD) [$(git symbolic-ref --short HEAD)]" >expect &&
+	test_when_finished "rm -rf here && git worktree prune" &&
+	git worktree add --detach here master &&
+	echo "$(git -C here rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >>expect &&
+	git -C here worktree list | sed "s/  */ /g" >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success '"list" all worktrees --porcelain' '
+	echo "worktree $(git rev-parse --show-toplevel)" >expect &&
+	echo "HEAD $(git rev-parse HEAD)" >>expect &&
+	echo "branch $(git symbolic-ref HEAD)" >>expect &&
+	echo >>expect &&
+	test_when_finished "rm -rf here && git worktree prune" &&
+	git worktree add --detach here master &&
+	echo "worktree $(git -C here rev-parse --show-toplevel)" >>expect &&
+	echo "HEAD $(git rev-parse HEAD)" >>expect &&
+	echo "detached" >>expect &&
+	echo >>expect &&
+	git worktree list --porcelain >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'bare repo setup' '
+	git init --bare bare1 &&
+	echo "data" >file1 &&
+	git add file1 &&
+	git commit -m"File1: add data" &&
+	git push bare1 master &&
+	git reset --hard HEAD^
+'
+
+test_expect_success '"list" all worktrees from bare main' '
+	test_when_finished "rm -rf there && git -C bare1 worktree prune" &&
+	git -C bare1 worktree add --detach ../there master &&
+	echo "$(pwd)/bare1 (bare)" >expect &&
+	echo "$(git -C there rev-parse --show-toplevel) $(git -C there rev-parse --short HEAD) (detached HEAD)" >>expect &&
+	git -C bare1 worktree list | sed "s/  */ /g" >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success '"list" all worktrees --porcelain from bare main' '
+	test_when_finished "rm -rf there && git -C bare1 worktree prune" &&
+	git -C bare1 worktree add --detach ../there master &&
+	echo "worktree $(pwd)/bare1" >expect &&
+	echo "bare" >>expect &&
+	echo >>expect &&
+	echo "worktree $(git -C there rev-parse --show-toplevel)" >>expect &&
+	echo "HEAD $(git -C there rev-parse HEAD)" >>expect &&
+	echo "detached" >>expect &&
+	echo >>expect &&
+	git -C bare1 worktree list --porcelain >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success '"list" all worktrees from linked with a bare main' '
+	test_when_finished "rm -rf there && git -C bare1 worktree prune" &&
+	git -C bare1 worktree add --detach ../there master &&
+	echo "$(pwd)/bare1 (bare)" >expect &&
+	echo "$(git -C there rev-parse --show-toplevel) $(git -C there rev-parse --short HEAD) (detached HEAD)" >>expect &&
+	git -C there worktree list | sed "s/  */ /g" >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'bare repo cleanup' '
+	rm -rf bare1
+'
+
+test_done
diff --git a/t/t3000-ls-files-others.sh b/t/t3000-ls-files-others.sh
index 88be904..c525656 100755
--- a/t/t3000-ls-files-others.sh
+++ b/t/t3000-ls-files-others.sh
@@ -65,6 +65,13 @@
 	test_cmp expected3 output
 '
 
+test_expect_success 'ls-files --others handles non-submodule .git' '
+	mkdir not-a-submodule &&
+	echo foo >not-a-submodule/.git &&
+	git ls-files -o >output &&
+	test_cmp expected1 output
+'
+
 test_expect_success SYMLINKS 'ls-files --others with symlinked submodule' '
 	git init super &&
 	git init sub &&
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index cdaf6f6..a897248 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -446,6 +446,13 @@
 	test_must_fail git branch --set-upstream-to HEAD^{}
 '
 
+test_expect_success '--set-upstream-to fails on locked config' '
+	test_when_finished "rm -f .git/config.lock" &&
+	>.git/config.lock &&
+	git branch locked &&
+	test_must_fail git branch --set-upstream-to locked
+'
+
 test_expect_success 'use --set-upstream-to modify HEAD' '
 	test_config branch.master.remote foo &&
 	test_config branch.master.merge foo &&
@@ -466,6 +473,13 @@
 	test_must_fail git branch --unset-upstream i-dont-exist
 '
 
+test_expect_success '--unset-upstream should fail if config is locked' '
+	test_when_finished "rm -f .git/config.lock" &&
+	git branch --set-upstream-to locked &&
+	>.git/config.lock &&
+	test_must_fail git branch --unset-upstream
+'
+
 test_expect_success 'test --unset-upstream on HEAD' '
 	git branch my14 &&
 	test_config branch.master.remote foo &&
@@ -579,7 +593,7 @@
 	git config remote.ambi1.fetch refs/heads/lalala:refs/heads/master &&
 	git config remote.ambi2.url lilili &&
 	git config remote.ambi2.fetch refs/heads/lilili:refs/heads/master &&
-	git branch all1 master &&
+	test_must_fail git branch all1 master &&
 	test -z "$(git config branch.all1.merge)"
 '
 
diff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh
index 16efe7a..4261403 100755
--- a/t/t3203-branch-output.sh
+++ b/t/t3203-branch-output.sh
@@ -156,4 +156,32 @@
 	test_i18ncmp expect actual
 '
 
+test_expect_success 'git branch `--sort` option' '
+	cat >expect <<-\EOF &&
+	* (HEAD detached from fromtag)
+	  branch-two
+	  branch-one
+	  master
+	EOF
+	git branch --sort=objectsize >actual &&
+	test_i18ncmp expect actual
+'
+
+test_expect_success 'git branch --points-at option' '
+	cat >expect <<-\EOF &&
+	  branch-one
+	  master
+	EOF
+	git branch --points-at=branch-one >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'ambiguous branch/tag not marked' '
+	git tag ambiguous &&
+	git branch ambiguous &&
+	echo "  ambiguous" >expect &&
+	git branch --list ambiguous >actual &&
+	test_cmp expect actual
+'
+
 test_done
diff --git a/t/t3210-pack-refs.sh b/t/t3210-pack-refs.sh
index 7b5b6d4..db244d2 100755
--- a/t/t3210-pack-refs.sh
+++ b/t/t3210-pack-refs.sh
@@ -160,6 +160,13 @@
 	test_path_is_missing .git/refs/top
 '
 
+test_expect_success 'do not pack ref in refs/bisect' '
+	git update-ref refs/bisect/local HEAD &&
+	git pack-refs --all --prune &&
+	! grep refs/bisect/local .git/packed-refs >/dev/null &&
+	test_path_is_file .git/refs/bisect/local
+'
+
 test_expect_success 'disable reflogs' '
 	git config core.logallrefupdates false &&
 	rm -rf .git/logs
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 9067e02..544f9ad 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -1006,6 +1006,22 @@
 	test $(cat file1) = Z
 '
 
+test_expect_success 'interrupted rebase -i with --strategy and -X' '
+	git checkout -b conflict-merge-use-theirs-interrupted conflict-branch &&
+	git reset --hard HEAD^ &&
+	>breakpoint &&
+	git add breakpoint &&
+	git commit -m "breakpoint for interactive mode" &&
+	echo five >conflict &&
+	echo Z >file1 &&
+	git commit -a -m "one file conflict" &&
+	set_fake_editor &&
+	FAKE_LINES="edit 1 2" git rebase -i --strategy=recursive -Xours conflict-branch &&
+	git rebase --continue &&
+	test $(git show conflict-branch:conflict) = $(cat conflict) &&
+	test $(cat file1) = Z
+'
+
 test_expect_success 'rebase -i error on commits with \ in message' '
 	current_head=$(git rev-parse HEAD) &&
 	test_when_finished "git rebase --abort; git reset --hard $current_head; rm -f error" &&
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index 890db11..646c475 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -1431,4 +1431,18 @@
 	test_line_count = 2 list
 '
 
+test_expect_success 'format-patch --zero-commit' '
+	git format-patch --zero-commit --stdout v2..v1 >patch2 &&
+	grep "^From " patch2 | sort | uniq >actual &&
+	echo "From $_z40 Mon Sep 17 00:00:00 2001" >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success 'From line has expected format' '
+	git format-patch --stdout v2..v1 >patch2 &&
+	grep "^From " patch2 >from &&
+	grep "^From $_x40 Mon Sep 17 00:00:00 2001$" patch2 >filtered &&
+	test_cmp from filtered
+'
+
 test_done
diff --git a/t/t4056-diff-order.sh b/t/t4056-diff-order.sh
index c0460bb..43dd474 100755
--- a/t/t4056-diff-order.sh
+++ b/t/t4056-diff-order.sh
@@ -68,6 +68,12 @@
 	test_must_fail git diff -Ounreadable_file --name-only HEAD^..HEAD
 '
 
+test_expect_success "orderfile using option from subdir with --output" '
+	mkdir subdir &&
+	git -C subdir diff -O../order_file_1 --output ../actual --name-only HEAD^..HEAD &&
+	test_cmp expect_1 actual
+'
+
 for i in 1 2
 do
 	test_expect_success "orderfile using option ($i)" '
diff --git a/t/t5313-pack-bounds-checks.sh b/t/t5313-pack-bounds-checks.sh
new file mode 100755
index 0000000..a8a587a
--- /dev/null
+++ b/t/t5313-pack-bounds-checks.sh
@@ -0,0 +1,179 @@
+#!/bin/sh
+
+test_description='bounds-checking of access to mmapped on-disk file formats'
+. ./test-lib.sh
+
+clear_base () {
+	test_when_finished 'restore_base' &&
+	rm -f $base
+}
+
+restore_base () {
+	cp base-backup/* .git/objects/pack/
+}
+
+do_pack () {
+	pack_objects=$1; shift
+	sha1=$(
+		for i in $pack_objects
+		do
+			echo $i
+		done | git pack-objects "$@" .git/objects/pack/pack
+	) &&
+	pack=.git/objects/pack/pack-$sha1.pack &&
+	idx=.git/objects/pack/pack-$sha1.idx &&
+	chmod +w $pack $idx &&
+	test_when_finished 'rm -f "$pack" "$idx"'
+}
+
+munge () {
+	printf "$3" | dd of="$1" bs=1 conv=notrunc seek=$2
+}
+
+# Offset in a v2 .idx to its initial and extended offset tables. For an index
+# with "nr" objects, this is:
+#
+#   magic(4) + version(4) + fan-out(4*256) + sha1s(20*nr) + crc(4*nr),
+#
+# for the initial, and another ofs(4*nr) past that for the extended.
+#
+ofs_table () {
+	echo $((4 + 4 + 4*256 + 20*$1 + 4*$1))
+}
+extended_table () {
+	echo $(($(ofs_table "$1") + 4*$1))
+}
+
+test_expect_success 'set up base packfile and variables' '
+	# the hash of this content starts with ff, which
+	# makes some later computations much simpler
+	echo 74 >file &&
+	git add file &&
+	git commit -m base &&
+	git repack -ad &&
+	base=$(echo .git/objects/pack/*) &&
+	chmod +w $base &&
+	mkdir base-backup &&
+	cp $base base-backup/ &&
+	object=$(git rev-parse HEAD:file)
+'
+
+test_expect_success 'pack/index object count mismatch' '
+	do_pack $object &&
+	munge $pack 8 "\377\0\0\0" &&
+	clear_base &&
+
+	# We enumerate the objects from the completely-fine
+	# .idx, but notice later that the .pack is bogus
+	# and fail to show any data.
+	echo "$object missing" >expect &&
+	git cat-file --batch-all-objects --batch-check >actual &&
+	test_cmp expect actual &&
+
+	# ...and here fail to load the object (without segfaulting),
+	# but fallback to a good copy if available.
+	test_must_fail git cat-file blob $object &&
+	restore_base &&
+	git cat-file blob $object >actual &&
+	test_cmp file actual &&
+
+	# ...and make sure that index-pack --verify, which has its
+	# own reading routines, does not segfault.
+	test_must_fail git index-pack --verify $pack
+'
+
+test_expect_success 'matched bogus object count' '
+	do_pack $object &&
+	munge $pack 8 "\377\0\0\0" &&
+	munge $idx $((255 * 4)) "\377\0\0\0" &&
+	clear_base &&
+
+	# Unlike above, we should notice early that the .idx is totally
+	# bogus, and not even enumerate its contents.
+	>expect &&
+	git cat-file --batch-all-objects --batch-check >actual &&
+	test_cmp expect actual &&
+
+	# But as before, we can do the same object-access checks.
+	test_must_fail git cat-file blob $object &&
+	restore_base &&
+	git cat-file blob $object >actual &&
+	test_cmp file actual &&
+
+	test_must_fail git index-pack --verify $pack
+'
+
+# Note that we cannot check the fallback case for these
+# further .idx tests, as we notice the problem in functions
+# whose interface doesn't allow an error return (like use_pack()),
+# and thus we just die().
+#
+# There's also no point in doing enumeration tests, as
+# we are munging offsets here, which are about looking up
+# specific objects.
+
+test_expect_success 'bogus object offset (v1)' '
+	do_pack $object --index-version=1 &&
+	munge $idx $((4 * 256)) "\377\0\0\0" &&
+	clear_base &&
+	test_must_fail git cat-file blob $object &&
+	test_must_fail git index-pack --verify $pack
+'
+
+test_expect_success 'bogus object offset (v2, no msb)' '
+	do_pack $object --index-version=2 &&
+	munge $idx $(ofs_table 1) "\0\377\0\0" &&
+	clear_base &&
+	test_must_fail git cat-file blob $object &&
+	test_must_fail git index-pack --verify $pack
+'
+
+test_expect_success 'bogus offset into v2 extended table' '
+	do_pack $object --index-version=2 &&
+	munge $idx $(ofs_table 1) "\377\0\0\0" &&
+	clear_base &&
+	test_must_fail git cat-file blob $object &&
+	test_must_fail git index-pack --verify $pack
+'
+
+test_expect_success 'bogus offset inside v2 extended table' '
+	# We need two objects here, so we can plausibly require
+	# an extended table (if the first object were larger than 2^31).
+	do_pack "$object $(git rev-parse HEAD)" --index-version=2 &&
+
+	# We have to make extra room for the table, so we cannot
+	# just munge in place as usual.
+	{
+		dd if=$idx bs=1 count=$(($(ofs_table 2) + 4)) &&
+		printf "\200\0\0\0" &&
+		printf "\377\0\0\0\0\0\0\0" &&
+		dd if=$idx bs=1 skip=$(extended_table 2)
+	} >tmp &&
+	mv tmp "$idx" &&
+	clear_base &&
+	test_must_fail git cat-file blob $object &&
+	test_must_fail git index-pack --verify $pack
+'
+
+test_expect_success 'bogus OFS_DELTA in packfile' '
+	# Generate a pack with a delta in it.
+	base=$(test-genrandom foo 3000 | git hash-object --stdin -w) &&
+	delta=$(test-genrandom foo 2000 | git hash-object --stdin -w) &&
+	do_pack "$base $delta" --delta-base-offset &&
+	rm -f .git/objects/??/* &&
+
+	# Double check that we have the delta we expect.
+	echo $base >expect &&
+	echo $delta | git cat-file --batch-check="%(deltabase)" >actual &&
+	test_cmp expect actual &&
+
+	# Now corrupt it. We assume the varint size for the delta is small
+	# enough to fit in the first byte (which it should be, since it
+	# is a pure deletion from the base), and that original ofs_delta
+	# takes 2 bytes (which it should, as it should be ~3000).
+	ofs=$(git show-index <$idx | grep $delta | cut -d" " -f1) &&
+	munge $pack $(($ofs + 1)) "\177\377" &&
+	test_must_fail git cat-file blob $delta >/dev/null
+'
+
+test_done
diff --git a/t/t5504-fetch-receive-strict.sh b/t/t5504-fetch-receive-strict.sh
index 44f3d5f..a3e12d2 100755
--- a/t/t5504-fetch-receive-strict.sh
+++ b/t/t5504-fetch-receive-strict.sh
@@ -100,8 +100,11 @@
 		git config receive.fsckobjects true &&
 		git config transfer.fsckobjects false
 	) &&
-	test_must_fail git push --porcelain dst master:refs/heads/test >act &&
-	test_cmp exp act
+	test_must_fail ok=sigpipe git push --porcelain dst master:refs/heads/test >act &&
+	{
+		test_cmp exp act ||
+		! test -s act
+	}
 '
 
 test_expect_success 'push with transfer.fsckobjects' '
@@ -111,8 +114,7 @@
 		cd dst &&
 		git config transfer.fsckobjects true
 	) &&
-	test_must_fail git push --porcelain dst master:refs/heads/test >act &&
-	test_cmp exp act
+	test_must_fail ok=sigpipe git push --porcelain dst master:refs/heads/test >act
 '
 
 cat >bogus-commit <<\EOF
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index 7a8499c..013e03d 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -919,6 +919,28 @@
 	cmp expect actual
 '
 
+get_url_test () {
+	cat >expect &&
+	git remote get-url "$@" >actual &&
+	test_cmp expect actual
+}
+
+test_expect_success 'get-url on new remote' '
+	echo foo | get_url_test someremote &&
+	echo foo | get_url_test --all someremote &&
+	echo foo | get_url_test --push someremote &&
+	echo foo | get_url_test --push --all someremote
+'
+
+test_expect_success 'remote set-url with locked config' '
+	test_when_finished "rm -f .git/config.lock" &&
+	git config --get-all remote.someremote.url >expect &&
+	>.git/config.lock &&
+	test_must_fail git remote set-url someremote baz &&
+	git config --get-all remote.someremote.url >actual &&
+	cmp expect actual
+'
+
 test_expect_success 'remote set-url bar' '
 	git remote set-url someremote bar &&
 	echo bar >expect &&
@@ -961,6 +983,13 @@
 	cmp expect actual
 '
 
+test_expect_success 'get-url with different urls' '
+	echo baz | get_url_test someremote &&
+	echo baz | get_url_test --all someremote &&
+	echo zot | get_url_test --push someremote &&
+	echo zot | get_url_test --push --all someremote
+'
+
 test_expect_success 'remote set-url --push qux zot' '
 	git remote set-url --push someremote qux zot &&
 	echo qux >expect &&
@@ -995,6 +1024,14 @@
 	cmp expect actual
 '
 
+test_expect_success 'get-url on multi push remote' '
+	echo foo | get_url_test --push someremote &&
+	get_url_test --push --all someremote <<-\EOF
+	foo
+	aaa
+	EOF
+'
+
 test_expect_success 'remote set-url --push bar aaa' '
 	git remote set-url --push someremote bar aaa &&
 	echo foo >expect &&
@@ -1039,6 +1076,14 @@
 	cmp expect actual
 '
 
+test_expect_success 'get-url on multi fetch remote' '
+	echo baz | get_url_test someremote &&
+	get_url_test --all someremote <<-\EOF
+	baz
+	bbb
+	EOF
+'
+
 test_expect_success 'remote set-url --delete .*' '
 	test_must_fail git remote set-url --delete someremote .\* &&
 	echo "YYY" >expect &&
@@ -1108,6 +1153,7 @@
 test_extra_arg remove origin
 test_extra_arg set-head origin master
 # set-branches takes any number of args
+test_extra_arg get-url origin newurl
 test_extra_arg set-url origin newurl oldurl
 # show takes any number of args
 # prune takes any number of args
diff --git a/t/t5509-fetch-push-namespaces.sh b/t/t5509-fetch-push-namespaces.sh
index cc0b31f..bc44ac3 100755
--- a/t/t5509-fetch-push-namespaces.sh
+++ b/t/t5509-fetch-push-namespaces.sh
@@ -82,4 +82,45 @@
 	)
 '
 
+test_expect_success 'hide namespaced refs with transfer.hideRefs' '
+	GIT_NAMESPACE=namespace \
+		git -C pushee -c transfer.hideRefs=refs/tags \
+		ls-remote "ext::git %s ." >actual &&
+	printf "$commit1\trefs/heads/master\n" >expected &&
+	test_cmp expected actual
+'
+
+test_expect_success 'check that transfer.hideRefs does not match unstripped refs' '
+	GIT_NAMESPACE=namespace \
+		git -C pushee -c transfer.hideRefs=refs/namespaces/namespace/refs/tags \
+		ls-remote "ext::git %s ." >actual &&
+	printf "$commit1\trefs/heads/master\n" >expected &&
+	printf "$commit0\trefs/tags/0\n" >>expected &&
+	printf "$commit1\trefs/tags/1\n" >>expected &&
+	test_cmp expected actual
+'
+
+test_expect_success 'hide full refs with transfer.hideRefs' '
+	GIT_NAMESPACE=namespace \
+		git -C pushee -c transfer.hideRefs="^refs/namespaces/namespace/refs/tags" \
+		ls-remote "ext::git %s ." >actual &&
+	printf "$commit1\trefs/heads/master\n" >expected &&
+	test_cmp expected actual
+'
+
+test_expect_success 'try to update a hidden ref' '
+	test_config -C pushee transfer.hideRefs refs/heads/master &&
+	test_must_fail git -C original push pushee-namespaced master
+'
+
+test_expect_success 'try to update a ref that is not hidden' '
+	test_config -C pushee transfer.hideRefs refs/namespaces/namespace/refs/heads/master &&
+	git -C original push pushee-namespaced master
+'
+
+test_expect_success 'try to update a hidden full ref' '
+	test_config -C pushee transfer.hideRefs "^refs/namespaces/namespace/refs/heads/master" &&
+	test_must_fail git -C original push pushee-namespaced master
+'
+
 test_done
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index 0ba9db0..e3ee4bd 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -708,4 +708,17 @@
 	)
 '
 
+test_expect_success 'fetching with auto-gc does not lock up' '
+	write_script askyesno <<-\EOF &&
+	echo "$*" &&
+	false
+	EOF
+	git clone "file://$D" auto-gc &&
+	test_commit test2 &&
+	cd auto-gc &&
+	git config gc.autoPackLimit 1 &&
+	GIT_ASK_YESNO="$D/askyesno" git fetch >fetch.out 2>&1 &&
+	! grep "Should I try again" fetch.out
+'
+
 test_done
diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
index ec22c98..0a87e19 100755
--- a/t/t5516-fetch-push.sh
+++ b/t/t5516-fetch-push.sh
@@ -1162,15 +1162,15 @@
 		mk_empty shallow &&
 		(
 			cd shallow &&
-			test_must_fail git fetch ../testrepo/.git $SHA1_3 &&
-			test_must_fail git fetch ../testrepo/.git $SHA1_1 &&
+			test_must_fail ok=sigpipe git fetch ../testrepo/.git $SHA1_3 &&
+			test_must_fail ok=sigpipe git fetch ../testrepo/.git $SHA1_1 &&
 			git --git-dir=../testrepo/.git config uploadpack.allowreachablesha1inwant true &&
 			git fetch ../testrepo/.git $SHA1_1 &&
 			git cat-file commit $SHA1_1 &&
 			test_must_fail git cat-file commit $SHA1_2 &&
 			git fetch ../testrepo/.git $SHA1_2 &&
 			git cat-file commit $SHA1_2 &&
-			test_must_fail git fetch ../testrepo/.git $SHA1_3
+			test_must_fail ok=sigpipe git fetch ../testrepo/.git $SHA1_3
 		)
 	'
 done
diff --git a/t/t5531-deep-submodule-push.sh b/t/t5531-deep-submodule-push.sh
index 6507487..198ce84 100755
--- a/t/t5531-deep-submodule-push.sh
+++ b/t/t5531-deep-submodule-push.sh
@@ -64,7 +64,12 @@
 		cd work &&
 		git add gar/bage &&
 		git commit -m "Third commit for gar/bage" &&
-		test_must_fail git push --recurse-submodules=check ../pub.git master
+		# the push should fail with --recurse-submodules=check
+		# on the command line...
+		test_must_fail git push --recurse-submodules=check ../pub.git master &&
+
+		# ...or if specified in the configuration..
+		test_must_fail git -c push.recurseSubmodules=check push ../pub.git master
 	)
 '
 
@@ -79,6 +84,216 @@
 	)
 '
 
+test_expect_success 'push succeeds if submodule commit not on remote but using on-demand on command line' '
+	(
+		cd work/gar/bage &&
+		>recurse-on-demand-on-command-line &&
+		git add recurse-on-demand-on-command-line &&
+		git commit -m "Recurse on-demand on command line junk"
+	) &&
+	(
+		cd work &&
+		git add gar/bage &&
+		git commit -m "Recurse on-demand on command line for gar/bage" &&
+		git push --recurse-submodules=on-demand ../pub.git master &&
+		# Check that the supermodule commit got there
+		git fetch ../pub.git &&
+		git diff --quiet FETCH_HEAD master &&
+		# Check that the submodule commit got there too
+		cd gar/bage &&
+		git diff --quiet origin/master master
+	)
+'
+
+test_expect_success 'push succeeds if submodule commit not on remote but using on-demand from config' '
+	(
+		cd work/gar/bage &&
+		>recurse-on-demand-from-config &&
+		git add recurse-on-demand-from-config &&
+		git commit -m "Recurse on-demand from config junk"
+	) &&
+	(
+		cd work &&
+		git add gar/bage &&
+		git commit -m "Recurse on-demand from config for gar/bage" &&
+		git -c push.recurseSubmodules=on-demand push ../pub.git master &&
+		# Check that the supermodule commit got there
+		git fetch ../pub.git &&
+		git diff --quiet FETCH_HEAD master &&
+		# Check that the submodule commit got there too
+		cd gar/bage &&
+		git diff --quiet origin/master master
+	)
+'
+
+test_expect_success 'push recurse-submodules on command line overrides config' '
+	(
+		cd work/gar/bage &&
+		>recurse-check-on-command-line-overriding-config &&
+		git add recurse-check-on-command-line-overriding-config &&
+		git commit -m "Recurse on command-line overriding config junk"
+	) &&
+	(
+		cd work &&
+		git add gar/bage &&
+		git commit -m "Recurse on command-line overriding config for gar/bage" &&
+
+		# Ensure that we can override on-demand in the config
+		# to just check submodules
+		test_must_fail git -c push.recurseSubmodules=on-demand push --recurse-submodules=check ../pub.git master &&
+		# Check that the supermodule commit did not get there
+		git fetch ../pub.git &&
+		git diff --quiet FETCH_HEAD master^ &&
+		# Check that the submodule commit did not get there
+		(cd gar/bage && git diff --quiet origin/master master^) &&
+
+		# Ensure that we can override check in the config to
+		# disable submodule recursion entirely
+		(cd gar/bage && git diff --quiet origin/master master^) &&
+		git -c push.recurseSubmodules=on-demand push --recurse-submodules=no ../pub.git master &&
+		git fetch ../pub.git &&
+		git diff --quiet FETCH_HEAD master &&
+		(cd gar/bage && git diff --quiet origin/master master^) &&
+
+		# Ensure that we can override check in the config to
+		# disable submodule recursion entirely (alternative form)
+		git -c push.recurseSubmodules=on-demand push --no-recurse-submodules ../pub.git master &&
+		git fetch ../pub.git &&
+		git diff --quiet FETCH_HEAD master &&
+		(cd gar/bage && git diff --quiet origin/master master^) &&
+
+		# Ensure that we can override check in the config to
+		# push the submodule too
+		git -c push.recurseSubmodules=check push --recurse-submodules=on-demand ../pub.git master &&
+		git fetch ../pub.git &&
+		git diff --quiet FETCH_HEAD master &&
+		(cd gar/bage && git diff --quiet origin/master master)
+	)
+'
+
+test_expect_success 'push recurse-submodules last one wins on command line' '
+	(
+		cd work/gar/bage &&
+		>recurse-check-on-command-line-overriding-earlier-command-line &&
+		git add recurse-check-on-command-line-overriding-earlier-command-line &&
+		git commit -m "Recurse on command-line overridiing earlier command-line junk"
+	) &&
+	(
+		cd work &&
+		git add gar/bage &&
+		git commit -m "Recurse on command-line overriding earlier command-line for gar/bage" &&
+
+		# should result in "check"
+		test_must_fail git push --recurse-submodules=on-demand --recurse-submodules=check ../pub.git master &&
+		# Check that the supermodule commit did not get there
+		git fetch ../pub.git &&
+		git diff --quiet FETCH_HEAD master^ &&
+		# Check that the submodule commit did not get there
+		(cd gar/bage && git diff --quiet origin/master master^) &&
+
+		# should result in "no"
+		git push --recurse-submodules=on-demand --recurse-submodules=no ../pub.git master &&
+		# Check that the supermodule commit did get there
+		git fetch ../pub.git &&
+		git diff --quiet FETCH_HEAD master &&
+		# Check that the submodule commit did not get there
+		(cd gar/bage && git diff --quiet origin/master master^) &&
+
+		# should result in "no"
+		git push --recurse-submodules=on-demand --no-recurse-submodules ../pub.git master &&
+		# Check that the submodule commit did not get there
+		(cd gar/bage && git diff --quiet origin/master master^) &&
+
+		# But the options in the other order should push the submodule
+		git push --recurse-submodules=check --recurse-submodules=on-demand ../pub.git master &&
+		# Check that the submodule commit did get there
+		git fetch ../pub.git &&
+		(cd gar/bage && git diff --quiet origin/master master)
+	)
+'
+
+test_expect_success 'push succeeds if submodule commit not on remote using on-demand from cmdline overriding config' '
+	(
+		cd work/gar/bage &&
+		>recurse-on-demand-on-command-line-overriding-config &&
+		git add recurse-on-demand-on-command-line-overriding-config &&
+		git commit -m "Recurse on-demand on command-line overriding config junk"
+	) &&
+	(
+		cd work &&
+		git add gar/bage &&
+		git commit -m "Recurse on-demand on command-line overriding config for gar/bage" &&
+		git -c push.recurseSubmodules=check push --recurse-submodules=on-demand ../pub.git master &&
+		# Check that the supermodule commit got there
+		git fetch ../pub.git &&
+		git diff --quiet FETCH_HEAD master &&
+		# Check that the submodule commit got there
+		cd gar/bage &&
+		git diff --quiet origin/master master
+	)
+'
+
+test_expect_success 'push succeeds if submodule commit disabling recursion from cmdline overriding config' '
+	(
+		cd work/gar/bage &&
+		>recurse-disable-on-command-line-overriding-config &&
+		git add recurse-disable-on-command-line-overriding-config &&
+		git commit -m "Recurse disable on command-line overriding config junk"
+	) &&
+	(
+		cd work &&
+		git add gar/bage &&
+		git commit -m "Recurse disable on command-line overriding config for gar/bage" &&
+		git -c push.recurseSubmodules=check push --recurse-submodules=no ../pub.git master &&
+		# Check that the supermodule commit got there
+		git fetch ../pub.git &&
+		git diff --quiet FETCH_HEAD master &&
+		# But that the submodule commit did not
+		( cd gar/bage && git diff --quiet origin/master master^ ) &&
+		# Now push it to avoid confusing future tests
+		git push --recurse-submodules=on-demand ../pub.git master
+	)
+'
+
+test_expect_success 'push succeeds if submodule commit disabling recursion from cmdline (alternative form) overriding config' '
+	(
+		cd work/gar/bage &&
+		>recurse-disable-on-command-line-alt-overriding-config &&
+		git add recurse-disable-on-command-line-alt-overriding-config &&
+		git commit -m "Recurse disable on command-line alternative overriding config junk"
+	) &&
+	(
+		cd work &&
+		git add gar/bage &&
+		git commit -m "Recurse disable on command-line alternative overriding config for gar/bage" &&
+		git -c push.recurseSubmodules=check push --no-recurse-submodules ../pub.git master &&
+		# Check that the supermodule commit got there
+		git fetch ../pub.git &&
+		git diff --quiet FETCH_HEAD master &&
+		# But that the submodule commit did not
+		( cd gar/bage && git diff --quiet origin/master master^ ) &&
+		# Now push it to avoid confusing future tests
+		git push --recurse-submodules=on-demand ../pub.git master
+	)
+'
+
+test_expect_success 'push fails if recurse submodules option passed as yes' '
+	(
+		cd work/gar/bage &&
+		>recurse-push-fails-if-recurse-submodules-passed-as-yes &&
+		git add recurse-push-fails-if-recurse-submodules-passed-as-yes &&
+		git commit -m "Recurse push fails if recurse submodules option passed as yes"
+	) &&
+	(
+		cd work &&
+		git add gar/bage &&
+		git commit -m "Recurse push fails if recurse submodules option passed as yes for gar/bage" &&
+		test_must_fail git push --recurse-submodules=yes ../pub.git master &&
+		test_must_fail git -c push.recurseSubmodules=yes push ../pub.git master &&
+		git push --recurse-submodules=on-demand ../pub.git master
+	)
+'
+
 test_expect_success 'push fails when commit on multiple branches if one branch has no remote' '
 	(
 		cd work/gar/bage &&
diff --git a/t/t5533-push-cas.sh b/t/t5533-push-cas.sh
index c402d8d..c732012 100755
--- a/t/t5533-push-cas.sh
+++ b/t/t5533-push-cas.sh
@@ -25,7 +25,8 @@
 	(
 		cd dst &&
 		test_commit D &&
-		test_must_fail git push --force-with-lease=master:master origin master
+		test_must_fail git push --force-with-lease=master:master origin master 2>err &&
+		grep "stale info" err
 	) &&
 	git ls-remote . refs/heads/master >expect &&
 	git ls-remote src refs/heads/master >actual &&
@@ -37,7 +38,8 @@
 	(
 		cd dst &&
 		test_commit D &&
-		git push --force --force-with-lease=master:master origin master
+		git push --force --force-with-lease=master:master origin master 2>err &&
+		grep "forced update" err
 	) &&
 	git ls-remote dst refs/heads/master >expect &&
 	git ls-remote src refs/heads/master >actual &&
@@ -101,7 +103,8 @@
 	(
 		cd dst &&
 		test_commit D &&
-		git push --force-with-lease=master origin master
+		git push --force-with-lease=master origin master 2>err &&
+		! grep "forced update" err
 	) &&
 	git ls-remote dst refs/heads/master >expect &&
 	git ls-remote src refs/heads/master >actual &&
@@ -114,7 +117,8 @@
 		cd dst &&
 		git reset --hard HEAD^ &&
 		test_commit D &&
-		git push --force-with-lease=master origin master
+		git push --force-with-lease=master origin master 2>err &&
+		grep "forced update" err
 	) &&
 	git ls-remote dst refs/heads/master >expect &&
 	git ls-remote src refs/heads/master >actual &&
@@ -147,7 +151,8 @@
 	setup_srcdst_basic &&
 	(
 		cd dst &&
-		git push --force-with-lease=master origin :master
+		git push --force-with-lease=master origin :master 2>err &&
+		grep deleted err
 	) &&
 	>expect &&
 	git ls-remote src refs/heads/master >actual &&
diff --git a/t/t5700-clone-reference.sh b/t/t5700-clone-reference.sh
index 2250ef4..dfa1bf7 100755
--- a/t/t5700-clone-reference.sh
+++ b/t/t5700-clone-reference.sh
@@ -210,4 +210,15 @@
 	test_line_count = 1 packs.txt
 '
 
+test_expect_success 'clone, dissociate from alternates' '
+	rm -fr A B C &&
+	test_create_repo A &&
+	commit_in A file1 &&
+	git clone --reference=A A B &&
+	test_line_count = 1 B/.git/objects/info/alternates &&
+	git clone --local --dissociate B C &&
+	! test -f C/.git/objects/info/alternates &&
+	( cd C && git fsck )
+'
+
 test_done
diff --git a/t/t5802-connect-helper.sh b/t/t5802-connect-helper.sh
index 878faf2..b7a7f9d 100755
--- a/t/t5802-connect-helper.sh
+++ b/t/t5802-connect-helper.sh
@@ -69,4 +69,32 @@
 	test_cmp expect actual
 '
 
+
+test_expect_success 'set up fake git-daemon' '
+	mkdir remote &&
+	git init --bare remote/one.git &&
+	mkdir remote/host &&
+	git init --bare remote/host/two.git &&
+	write_script fake-daemon <<-\EOF &&
+	git daemon --inetd \
+		--informative-errors \
+		--export-all \
+		--base-path="$TRASH_DIRECTORY/remote" \
+		--interpolated-path="$TRASH_DIRECTORY/remote/%H%D" \
+		"$TRASH_DIRECTORY/remote"
+	EOF
+	export TRASH_DIRECTORY &&
+	PATH=$TRASH_DIRECTORY:$PATH
+'
+
+test_expect_success 'ext command can connect to git daemon (no vhost)' '
+	rm -rf dst &&
+	git clone "ext::fake-daemon %G/one.git" dst
+'
+
+test_expect_success 'ext command can connect to git daemon (vhost)' '
+	rm -rf dst &&
+	git clone "ext::fake-daemon %G/two.git %Vhost" dst
+'
+
 test_done
diff --git a/t/t6023-merge-file.sh b/t/t6023-merge-file.sh
index 190ee90..20aee43 100755
--- a/t/t6023-merge-file.sh
+++ b/t/t6023-merge-file.sh
@@ -346,4 +346,17 @@
 	 printf "line1\nline2\nline3x\nline3y" >expect.txt &&
 	 test_cmp expect.txt output.txt'
 
+test_expect_success 'conflict sections match existing line endings' '
+	printf "1\\r\\n2\\r\\n3" >crlf-orig.txt &&
+	printf "1\\r\\n2\\r\\n4" >crlf-diff1.txt &&
+	printf "1\\r\\n2\\r\\n5" >crlf-diff2.txt &&
+	test_must_fail git -c core.eol=crlf merge-file -p \
+		crlf-diff1.txt crlf-orig.txt crlf-diff2.txt >crlf.txt &&
+	test $(tr "\015" Q <crlf.txt | grep "^[<=>].*Q$" | wc -l) = 3 &&
+	test $(tr "\015" Q <crlf.txt | grep "[345]Q$" | wc -l) = 3 &&
+	test_must_fail git -c core.eol=crlf merge-file -p \
+		nolf-diff1.txt nolf-orig.txt nolf-diff2.txt >nolf.txt &&
+	test $(tr "\015" Q <nolf.txt | grep "^[<=>].*Q$" | wc -l) = 0
+'
+
 test_done
diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh
index 9e2c203..e74662b 100755
--- a/t/t6030-bisect-porcelain.sh
+++ b/t/t6030-bisect-porcelain.sh
@@ -759,4 +759,139 @@
 	git bisect reset
 '
 
+test_expect_success 'bisect starts with only one new' '
+	git bisect reset &&
+	git bisect start &&
+	git bisect new $HASH4 &&
+	git bisect next
+'
+
+test_expect_success 'bisect does not start with only one old' '
+	git bisect reset &&
+	git bisect start &&
+	git bisect old $HASH1 &&
+	test_must_fail git bisect next
+'
+
+test_expect_success 'bisect start with one new and old' '
+	git bisect reset &&
+	git bisect start &&
+	git bisect old $HASH1 &&
+	git bisect new $HASH4 &&
+	git bisect new &&
+	git bisect new >bisect_result &&
+	grep "$HASH2 is the first new commit" bisect_result &&
+	git bisect log >log_to_replay.txt &&
+	git bisect reset
+'
+
+test_expect_success 'bisect replay with old and new' '
+	git bisect replay log_to_replay.txt >bisect_result &&
+	grep "$HASH2 is the first new commit" bisect_result &&
+	git bisect reset
+'
+
+test_expect_success 'bisect cannot mix old/new and good/bad' '
+	git bisect start &&
+	git bisect bad $HASH4 &&
+	test_must_fail git bisect old $HASH1
+'
+
+test_expect_success 'bisect terms needs 0 or 1 argument' '
+	git bisect reset &&
+	test_must_fail git bisect terms only-one &&
+	test_must_fail git bisect terms 1 2 &&
+	test_must_fail git bisect terms 2>actual &&
+	echo "no terms defined" >expected &&
+	test_cmp expected actual
+'
+
+test_expect_success 'bisect terms shows good/bad after start' '
+	git bisect reset &&
+	git bisect start HEAD $HASH1 &&
+	git bisect terms --term-good >actual &&
+	echo good >expected &&
+	test_cmp expected actual &&
+	git bisect terms --term-bad >actual &&
+	echo bad >expected &&
+	test_cmp expected actual
+'
+
+test_expect_success 'bisect start with one term1 and term2' '
+	git bisect reset &&
+	git bisect start --term-old term2 --term-new term1 &&
+	git bisect term2 $HASH1 &&
+	git bisect term1 $HASH4 &&
+	git bisect term1 &&
+	git bisect term1 >bisect_result &&
+	grep "$HASH2 is the first term1 commit" bisect_result &&
+	git bisect log >log_to_replay.txt &&
+	git bisect reset
+'
+
+test_expect_success 'bisect replay with term1 and term2' '
+	git bisect replay log_to_replay.txt >bisect_result &&
+	grep "$HASH2 is the first term1 commit" bisect_result &&
+	git bisect reset
+'
+
+test_expect_success 'bisect start term1 term2' '
+	git bisect reset &&
+	git bisect start --term-new term1 --term-old term2 $HASH4 $HASH1 &&
+	git bisect term1 &&
+	git bisect term1 >bisect_result &&
+	grep "$HASH2 is the first term1 commit" bisect_result &&
+	git bisect log >log_to_replay.txt &&
+	git bisect reset
+'
+
+test_expect_success 'bisect cannot mix terms' '
+	git bisect reset &&
+	git bisect start --term-good term1 --term-bad term2 $HASH4 $HASH1 &&
+	test_must_fail git bisect a &&
+	test_must_fail git bisect b &&
+	test_must_fail git bisect bad &&
+	test_must_fail git bisect good &&
+	test_must_fail git bisect new &&
+	test_must_fail git bisect old
+'
+
+test_expect_success 'bisect terms rejects invalid terms' '
+	git bisect reset &&
+	test_must_fail git bisect start --term-good invalid..term &&
+	test_must_fail git bisect terms --term-bad invalid..term &&
+	test_must_fail git bisect terms --term-good bad &&
+	test_must_fail git bisect terms --term-good old &&
+	test_must_fail git bisect terms --term-good skip &&
+	test_must_fail git bisect terms --term-good reset &&
+	test_path_is_missing .git/BISECT_TERMS
+'
+
+test_expect_success 'bisect start --term-* does store terms' '
+	git bisect reset &&
+	git bisect start --term-bad=one --term-good=two &&
+	git bisect terms >actual &&
+	cat <<-EOF >expected &&
+	Your current terms are two for the old state
+	and one for the new state.
+	EOF
+	test_cmp expected actual &&
+	git bisect terms --term-bad >actual &&
+	echo one >expected &&
+	test_cmp expected actual &&
+	git bisect terms --term-good >actual &&
+	echo two >expected &&
+	test_cmp expected actual
+'
+
+test_expect_success 'bisect start takes options and revs in any order' '
+	git bisect reset &&
+	git bisect start --term-good one $HASH4 \
+		--term-good two --term-bad bad-term \
+		$HASH1 --term-good three -- &&
+	(git bisect terms --term-bad && git bisect terms --term-good) >actual &&
+	printf "%s\n%s\n" bad-term three >expected &&
+	test_cmp expected actual
+'
+
 test_done
diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh
index 4d5a25e..c630aba 100755
--- a/t/t6050-replace.sh
+++ b/t/t6050-replace.sh
@@ -351,11 +351,15 @@
 	test_cmp expected actual
 '
 
-test_expect_success 'setup a fake editor' '
-	write_script fakeeditor <<-\EOF
+test_expect_success 'setup fake editors' '
+	write_script fakeeditor <<-\EOF &&
 		sed -e "s/A U Thor/A fake Thor/" "$1" >"$1.new"
 		mv "$1.new" "$1"
 	EOF
+	write_script failingfakeeditor <<-\EOF
+		./fakeeditor "$@"
+		false
+	EOF
 '
 
 test_expect_success '--edit with and without already replaced object' '
@@ -372,7 +376,7 @@
 test_expect_success '--edit and change nothing or command failed' '
 	git replace -d "$PARA3" &&
 	test_must_fail env GIT_EDITOR=true git replace --edit "$PARA3" &&
-	test_must_fail env GIT_EDITOR="./fakeeditor;false" git replace --edit "$PARA3" &&
+	test_must_fail env GIT_EDITOR="./failingfakeeditor" git replace --edit "$PARA3" &&
 	GIT_EDITOR=./fakeeditor git replace --edit "$PARA3" &&
 	git replace -l | grep "$PARA3" &&
 	git cat-file commit "$PARA3" | grep "A fake Thor"
diff --git a/t/t6133-pathspec-rev-dwim.sh b/t/t6133-pathspec-rev-dwim.sh
new file mode 100755
index 0000000..a290ffc
--- /dev/null
+++ b/t/t6133-pathspec-rev-dwim.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+test_description='test dwim of revs versus pathspecs in revision parser'
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+	test_commit base &&
+	echo content >"br[ack]ets" &&
+	git add . &&
+	test_tick &&
+	git commit -m brackets
+'
+
+test_expect_success 'non-rev wildcard dwims to pathspec' '
+	git log -- "*.t" >expect &&
+	git log    "*.t" >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'tree:path with metacharacters dwims to rev' '
+	git show "HEAD:br[ack]ets" -- >expect &&
+	git show "HEAD:br[ack]ets"    >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success '^{foo} with metacharacters dwims to rev' '
+	git log "HEAD^{/b.*}" -- >expect &&
+	git log "HEAD^{/b.*}"    >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success '@{foo} with metacharacters dwims to rev' '
+	git log "HEAD@{now [or thereabouts]}" -- >expect &&
+	git log "HEAD@{now [or thereabouts]}"    >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success ':/*.t from a subdir dwims to a pathspec' '
+	mkdir subdir &&
+	(
+		cd subdir &&
+		git log -- ":/*.t" >expect &&
+		git log    ":/*.t" >actual &&
+		test_cmp expect actual
+	)
+'
+
+test_done
diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh
index 7c9bec7..19a2823 100755
--- a/t/t6300-for-each-ref.sh
+++ b/t/t6300-for-each-ref.sh
@@ -8,8 +8,8 @@
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-gpg.sh
 
-# Mon Jul 3 15:18:43 2006 +0000
-datestamp=1151939923
+# Mon Jul 3 23:18:43 2006 +0000
+datestamp=1151968723
 setdate_and_increment () {
     GIT_COMMITTER_DATE="$datestamp +0200"
     datestamp=$(expr "$datestamp" + 1)
@@ -49,11 +49,17 @@
 }
 
 test_atom head refname refs/heads/master
+test_atom head refname:short master
+test_atom head refname:strip=1 heads/master
+test_atom head refname:strip=2 master
 test_atom head upstream refs/remotes/origin/master
+test_atom head upstream:short origin/master
 test_atom head push refs/remotes/myfork/master
+test_atom head push:short myfork/master
 test_atom head objecttype commit
 test_atom head objectsize 171
 test_atom head objectname $(git rev-parse refs/heads/master)
+test_atom head objectname:short $(git rev-parse --short refs/heads/master)
 test_atom head tree $(git rev-parse refs/heads/master^{tree})
 test_atom head parent ''
 test_atom head numparent 0
@@ -61,21 +67,21 @@
 test_atom head type ''
 test_atom head '*objectname' ''
 test_atom head '*objecttype' ''
-test_atom head author 'A U Thor <author@example.com> 1151939924 +0200'
+test_atom head author 'A U Thor <author@example.com> 1151968724 +0200'
 test_atom head authorname 'A U Thor'
 test_atom head authoremail '<author@example.com>'
-test_atom head authordate 'Mon Jul 3 17:18:44 2006 +0200'
-test_atom head committer 'C O Mitter <committer@example.com> 1151939923 +0200'
+test_atom head authordate 'Tue Jul 4 01:18:44 2006 +0200'
+test_atom head committer 'C O Mitter <committer@example.com> 1151968723 +0200'
 test_atom head committername 'C O Mitter'
 test_atom head committeremail '<committer@example.com>'
-test_atom head committerdate 'Mon Jul 3 17:18:43 2006 +0200'
+test_atom head committerdate 'Tue Jul 4 01:18:43 2006 +0200'
 test_atom head tag ''
 test_atom head tagger ''
 test_atom head taggername ''
 test_atom head taggeremail ''
 test_atom head taggerdate ''
-test_atom head creator 'C O Mitter <committer@example.com> 1151939923 +0200'
-test_atom head creatordate 'Mon Jul 3 17:18:43 2006 +0200'
+test_atom head creator 'C O Mitter <committer@example.com> 1151968723 +0200'
+test_atom head creatordate 'Tue Jul 4 01:18:43 2006 +0200'
 test_atom head subject 'Initial'
 test_atom head contents:subject 'Initial'
 test_atom head body ''
@@ -86,17 +92,19 @@
 test_atom head HEAD '*'
 
 test_atom tag refname refs/tags/testtag
+test_atom tag refname:short testtag
 test_atom tag upstream ''
 test_atom tag push ''
 test_atom tag objecttype tag
 test_atom tag objectsize 154
 test_atom tag objectname $(git rev-parse refs/tags/testtag)
+test_atom tag objectname:short $(git rev-parse --short refs/tags/testtag)
 test_atom tag tree ''
 test_atom tag parent ''
 test_atom tag numparent ''
 test_atom tag object $(git rev-parse refs/tags/testtag^0)
 test_atom tag type 'commit'
-test_atom tag '*objectname' '67a36f10722846e891fbada1ba48ed035de75581'
+test_atom tag '*objectname' 'ea122842f48be4afb2d1fc6a4b96c05885ab7463'
 test_atom tag '*objecttype' 'commit'
 test_atom tag author ''
 test_atom tag authorname ''
@@ -107,18 +115,18 @@
 test_atom tag committeremail ''
 test_atom tag committerdate ''
 test_atom tag tag 'testtag'
-test_atom tag tagger 'C O Mitter <committer@example.com> 1151939925 +0200'
+test_atom tag tagger 'C O Mitter <committer@example.com> 1151968725 +0200'
 test_atom tag taggername 'C O Mitter'
 test_atom tag taggeremail '<committer@example.com>'
-test_atom tag taggerdate 'Mon Jul 3 17:18:45 2006 +0200'
-test_atom tag creator 'C O Mitter <committer@example.com> 1151939925 +0200'
-test_atom tag creatordate 'Mon Jul 3 17:18:45 2006 +0200'
-test_atom tag subject 'Tagging at 1151939927'
-test_atom tag contents:subject 'Tagging at 1151939927'
+test_atom tag taggerdate 'Tue Jul 4 01:18:45 2006 +0200'
+test_atom tag creator 'C O Mitter <committer@example.com> 1151968725 +0200'
+test_atom tag creatordate 'Tue Jul 4 01:18:45 2006 +0200'
+test_atom tag subject 'Tagging at 1151968727'
+test_atom tag contents:subject 'Tagging at 1151968727'
 test_atom tag body ''
 test_atom tag contents:body ''
 test_atom tag contents:signature ''
-test_atom tag contents 'Tagging at 1151939927
+test_atom tag contents 'Tagging at 1151968727
 '
 test_atom tag HEAD ' '
 
@@ -126,6 +134,16 @@
 	test_must_fail git for-each-ref --format="%(INVALID)" refs/heads
 '
 
+test_expect_success 'arguments to :strip must be positive integers' '
+	test_must_fail git for-each-ref --format="%(refname:strip=0)" &&
+	test_must_fail git for-each-ref --format="%(refname:strip=-1)" &&
+	test_must_fail git for-each-ref --format="%(refname:strip=foo)"
+'
+
+test_expect_success 'stripping refnames too far gives an error' '
+	test_must_fail git for-each-ref --format="%(refname:strip=3)"
+'
+
 test_expect_success 'Check format specifiers are ignored in naming date atoms' '
 	git for-each-ref --format="%(authordate)" refs/heads &&
 	git for-each-ref --format="%(authordate:default) %(authordate)" refs/heads &&
@@ -146,95 +164,123 @@
 	test_must_fail git for-each-ref --format="%(authordate:INVALID)" refs/heads
 '
 
-cat >expected <<\EOF
-'refs/heads/master' 'Mon Jul 3 17:18:43 2006 +0200' 'Mon Jul 3 17:18:44 2006 +0200'
-'refs/tags/testtag' 'Mon Jul 3 17:18:45 2006 +0200'
-EOF
+test_date () {
+	f=$1 &&
+	committer_date=$2 &&
+	author_date=$3 &&
+	tagger_date=$4 &&
+	cat >expected <<-EOF &&
+	'refs/heads/master' '$committer_date' '$author_date'
+	'refs/tags/testtag' '$tagger_date'
+	EOF
+	(
+		git for-each-ref --shell \
+			--format="%(refname) %(committerdate${f:+:$f}) %(authordate${f:+:$f})" \
+			refs/heads &&
+		git for-each-ref --shell \
+			--format="%(refname) %(taggerdate${f:+:$f})" \
+			refs/tags
+	) >actual &&
+	test_cmp expected actual
+}
 
 test_expect_success 'Check unformatted date fields output' '
-	(git for-each-ref --shell --format="%(refname) %(committerdate) %(authordate)" refs/heads &&
-	git for-each-ref --shell --format="%(refname) %(taggerdate)" refs/tags) >actual &&
-	test_cmp expected actual
+	test_date "" \
+		"Tue Jul 4 01:18:43 2006 +0200" \
+		"Tue Jul 4 01:18:44 2006 +0200" \
+		"Tue Jul 4 01:18:45 2006 +0200"
 '
 
 test_expect_success 'Check format "default" formatted date fields output' '
-	f=default &&
-	(git for-each-ref --shell --format="%(refname) %(committerdate:$f) %(authordate:$f)" refs/heads &&
-	git for-each-ref --shell --format="%(refname) %(taggerdate:$f)" refs/tags) >actual &&
-	test_cmp expected actual
+	test_date default \
+		"Tue Jul 4 01:18:43 2006 +0200" \
+		"Tue Jul 4 01:18:44 2006 +0200" \
+		"Tue Jul 4 01:18:45 2006 +0200"
+'
+
+test_expect_success 'Check format "default-local" date fields output' '
+	test_date default-local "Mon Jul 3 23:18:43 2006" "Mon Jul 3 23:18:44 2006" "Mon Jul 3 23:18:45 2006"
 '
 
 # Don't know how to do relative check because I can't know when this script
 # is going to be run and can't fake the current time to git, and hence can't
 # provide expected output.  Instead, I'll just make sure that "relative"
 # doesn't exit in error
-#
-#cat >expected <<\EOF
-#
-#EOF
-#
 test_expect_success 'Check format "relative" date fields output' '
 	f=relative &&
 	(git for-each-ref --shell --format="%(refname) %(committerdate:$f) %(authordate:$f)" refs/heads &&
 	git for-each-ref --shell --format="%(refname) %(taggerdate:$f)" refs/tags) >actual
 '
 
-cat >expected <<\EOF
-'refs/heads/master' '2006-07-03' '2006-07-03'
-'refs/tags/testtag' '2006-07-03'
-EOF
+# We just check that this is the same as "relative" for now.
+test_expect_success 'Check format "relative-local" date fields output' '
+	test_date relative-local \
+		"$(git for-each-ref --format="%(committerdate:relative)" refs/heads)" \
+		"$(git for-each-ref --format="%(authordate:relative)" refs/heads)" \
+		"$(git for-each-ref --format="%(taggerdate:relative)" refs/tags)"
+'
 
 test_expect_success 'Check format "short" date fields output' '
-	f=short &&
-	(git for-each-ref --shell --format="%(refname) %(committerdate:$f) %(authordate:$f)" refs/heads &&
-	git for-each-ref --shell --format="%(refname) %(taggerdate:$f)" refs/tags) >actual &&
-	test_cmp expected actual
+	test_date short 2006-07-04 2006-07-04 2006-07-04
 '
 
-cat >expected <<\EOF
-'refs/heads/master' 'Mon Jul 3 15:18:43 2006' 'Mon Jul 3 15:18:44 2006'
-'refs/tags/testtag' 'Mon Jul 3 15:18:45 2006'
-EOF
+test_expect_success 'Check format "short-local" date fields output' '
+	test_date short-local 2006-07-03 2006-07-03 2006-07-03
+'
 
 test_expect_success 'Check format "local" date fields output' '
-	f=local &&
-	(git for-each-ref --shell --format="%(refname) %(committerdate:$f) %(authordate:$f)" refs/heads &&
-	git for-each-ref --shell --format="%(refname) %(taggerdate:$f)" refs/tags) >actual &&
-	test_cmp expected actual
+	test_date local \
+		"Mon Jul 3 23:18:43 2006" \
+		"Mon Jul 3 23:18:44 2006" \
+		"Mon Jul 3 23:18:45 2006"
 '
 
-cat >expected <<\EOF
-'refs/heads/master' '2006-07-03 17:18:43 +0200' '2006-07-03 17:18:44 +0200'
-'refs/tags/testtag' '2006-07-03 17:18:45 +0200'
-EOF
-
 test_expect_success 'Check format "iso8601" date fields output' '
-	f=iso8601 &&
-	(git for-each-ref --shell --format="%(refname) %(committerdate:$f) %(authordate:$f)" refs/heads &&
-	git for-each-ref --shell --format="%(refname) %(taggerdate:$f)" refs/tags) >actual &&
-	test_cmp expected actual
+	test_date iso8601 \
+		"2006-07-04 01:18:43 +0200" \
+		"2006-07-04 01:18:44 +0200" \
+		"2006-07-04 01:18:45 +0200"
 '
 
-cat >expected <<\EOF
-'refs/heads/master' 'Mon, 3 Jul 2006 17:18:43 +0200' 'Mon, 3 Jul 2006 17:18:44 +0200'
-'refs/tags/testtag' 'Mon, 3 Jul 2006 17:18:45 +0200'
-EOF
+test_expect_success 'Check format "iso8601-local" date fields output' '
+	test_date iso8601-local "2006-07-03 23:18:43 +0000" "2006-07-03 23:18:44 +0000" "2006-07-03 23:18:45 +0000"
+'
 
 test_expect_success 'Check format "rfc2822" date fields output' '
-	f=rfc2822 &&
-	(git for-each-ref --shell --format="%(refname) %(committerdate:$f) %(authordate:$f)" refs/heads &&
-	git for-each-ref --shell --format="%(refname) %(taggerdate:$f)" refs/tags) >actual &&
-	test_cmp expected actual
+	test_date rfc2822 \
+		"Tue, 4 Jul 2006 01:18:43 +0200" \
+		"Tue, 4 Jul 2006 01:18:44 +0200" \
+		"Tue, 4 Jul 2006 01:18:45 +0200"
+'
+
+test_expect_success 'Check format "rfc2822-local" date fields output' '
+	test_date rfc2822-local "Mon, 3 Jul 2006 23:18:43 +0000" "Mon, 3 Jul 2006 23:18:44 +0000" "Mon, 3 Jul 2006 23:18:45 +0000"
+'
+
+test_expect_success 'Check format "raw" date fields output' '
+	test_date raw "1151968723 +0200" "1151968724 +0200" "1151968725 +0200"
+'
+
+test_expect_success 'Check format "raw-local" date fields output' '
+	test_date raw-local "1151968723 +0000" "1151968724 +0000" "1151968725 +0000"
 '
 
 test_expect_success 'Check format of strftime date fields' '
-	echo "my date is 2006-07-03" >expected &&
+	echo "my date is 2006-07-04" >expected &&
 	git for-each-ref \
 	  --format="%(authordate:format:my date is %Y-%m-%d)" \
 	  refs/heads >actual &&
 	test_cmp expected actual
 '
 
+test_expect_success 'Check format of strftime-local date fields' '
+	echo "my date is 2006-07-03" >expected &&
+	git for-each-ref \
+	  --format="%(authordate:format-local:my date is %Y-%m-%d)" \
+	  refs/heads >actual &&
+	test_cmp expected actual
+'
+
 test_expect_success 'exercise strftime with odd fields' '
 	echo >expected &&
 	git for-each-ref --format="%(authordate:format:)" refs/heads >actual &&
@@ -310,47 +356,14 @@
 	"
 done
 
-cat >expected <<\EOF
-master
-testtag
-EOF
-
-test_expect_success 'Check short refname format' '
-	(git for-each-ref --format="%(refname:short)" refs/heads &&
-	git for-each-ref --format="%(refname:short)" refs/tags) >actual &&
-	test_cmp expected actual
-'
-
-cat >expected <<EOF
-origin/master
-EOF
-
-test_expect_success 'Check short upstream format' '
-	git for-each-ref --format="%(upstream:short)" refs/heads >actual &&
-	test_cmp expected actual
-'
-
 test_expect_success 'setup for upstream:track[short]' '
 	test_commit two
 '
 
-cat >expected <<EOF
-[ahead 1]
-EOF
-
-test_expect_success 'Check upstream:track format' '
-	git for-each-ref --format="%(upstream:track)" refs/heads >actual &&
-	test_cmp expected actual
-'
-
-cat >expected <<EOF
->
-EOF
-
-test_expect_success 'Check upstream:trackshort format' '
-	git for-each-ref --format="%(upstream:trackshort)" refs/heads >actual &&
-	test_cmp expected actual
-'
+test_atom head upstream:track '[ahead 1]'
+test_atom head upstream:trackshort '>'
+test_atom head push:track '[ahead 1]'
+test_atom head push:trackshort '>'
 
 test_expect_success 'Check that :track[short] cannot be used with other atoms' '
 	test_must_fail git for-each-ref --format="%(refname:track)" 2>/dev/null &&
@@ -370,21 +383,6 @@
 	test_cmp expected actual
 '
 
-test_expect_success '%(push) supports tracking specifiers, too' '
-	echo "[ahead 1]" >expected &&
-	git for-each-ref --format="%(push:track)" refs/heads >actual &&
-	test_cmp expected actual
-'
-
-cat >expected <<EOF
-$(git rev-parse --short HEAD)
-EOF
-
-test_expect_success 'Check short objectname format' '
-	git for-each-ref --format="%(objectname:short)" refs/heads >actual &&
-	test_cmp expected actual
-'
-
 test_expect_success 'Check for invalid refname format' '
 	test_must_fail git for-each-ref --format="%(refname:INVALID)"
 '
@@ -546,8 +544,8 @@
 $sig"
 
 cat >expected <<EOF
-$(git rev-parse refs/tags/master) <committer@example.com> refs/tags/master
 $(git rev-parse refs/tags/bogo) <committer@example.com> refs/tags/bogo
+$(git rev-parse refs/tags/master) <committer@example.com> refs/tags/master
 EOF
 
 test_expect_success 'Verify sort with multiple keys' '
diff --git a/t/t6302-for-each-ref-filter.sh b/t/t6302-for-each-ref-filter.sh
new file mode 100755
index 0000000..fe4796c
--- /dev/null
+++ b/t/t6302-for-each-ref-filter.sh
@@ -0,0 +1,258 @@
+#!/bin/sh
+
+test_description='test for-each-refs usage of ref-filter APIs'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-gpg.sh
+
+if ! test_have_prereq GPG
+then
+	skip_all="skipping for-each-ref tests, GPG not available"
+	test_done
+fi
+
+test_expect_success 'setup some history and refs' '
+	test_commit one &&
+	test_commit two &&
+	test_commit three &&
+	git checkout -b side &&
+	test_commit four &&
+	git tag -s -m "A signed tag message" signed-tag &&
+	git tag -s -m "Annonated doubly" double-tag signed-tag &&
+	git checkout master &&
+	git update-ref refs/odd/spot master
+'
+
+test_expect_success 'filtering with --points-at' '
+	cat >expect <<-\EOF &&
+	refs/heads/master
+	refs/odd/spot
+	refs/tags/three
+	EOF
+	git for-each-ref --format="%(refname)" --points-at=master >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'check signed tags with --points-at' '
+	sed -e "s/Z$//" >expect <<-\EOF &&
+	refs/heads/side Z
+	refs/tags/four Z
+	refs/tags/signed-tag four
+	EOF
+	git for-each-ref --format="%(refname) %(*subject)" --points-at=side >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'filtering with --merged' '
+	cat >expect <<-\EOF &&
+	refs/heads/master
+	refs/odd/spot
+	refs/tags/one
+	refs/tags/three
+	refs/tags/two
+	EOF
+	git for-each-ref --format="%(refname)" --merged=master >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'filtering with --no-merged' '
+	cat >expect <<-\EOF &&
+	refs/heads/side
+	refs/tags/double-tag
+	refs/tags/four
+	refs/tags/signed-tag
+	EOF
+	git for-each-ref --format="%(refname)" --no-merged=master >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'filtering with --contains' '
+	cat >expect <<-\EOF &&
+	refs/heads/master
+	refs/heads/side
+	refs/odd/spot
+	refs/tags/double-tag
+	refs/tags/four
+	refs/tags/signed-tag
+	refs/tags/three
+	refs/tags/two
+	EOF
+	git for-each-ref --format="%(refname)" --contains=two >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success '%(color) must fail' '
+	test_must_fail git for-each-ref --format="%(color)%(refname)"
+'
+
+test_expect_success 'left alignment is default' '
+	cat >expect <<-\EOF &&
+	refname is refs/heads/master  |refs/heads/master
+	refname is refs/heads/side    |refs/heads/side
+	refname is refs/odd/spot      |refs/odd/spot
+	refname is refs/tags/double-tag|refs/tags/double-tag
+	refname is refs/tags/four     |refs/tags/four
+	refname is refs/tags/one      |refs/tags/one
+	refname is refs/tags/signed-tag|refs/tags/signed-tag
+	refname is refs/tags/three    |refs/tags/three
+	refname is refs/tags/two      |refs/tags/two
+	EOF
+	git for-each-ref --format="%(align:30)refname is %(refname)%(end)|%(refname)" >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'middle alignment' '
+	cat >expect <<-\EOF &&
+	| refname is refs/heads/master |refs/heads/master
+	|  refname is refs/heads/side  |refs/heads/side
+	|   refname is refs/odd/spot   |refs/odd/spot
+	|refname is refs/tags/double-tag|refs/tags/double-tag
+	|  refname is refs/tags/four   |refs/tags/four
+	|   refname is refs/tags/one   |refs/tags/one
+	|refname is refs/tags/signed-tag|refs/tags/signed-tag
+	|  refname is refs/tags/three  |refs/tags/three
+	|   refname is refs/tags/two   |refs/tags/two
+	EOF
+	git for-each-ref --format="|%(align:middle,30)refname is %(refname)%(end)|%(refname)" >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'right alignment' '
+	cat >expect <<-\EOF &&
+	|  refname is refs/heads/master|refs/heads/master
+	|    refname is refs/heads/side|refs/heads/side
+	|      refname is refs/odd/spot|refs/odd/spot
+	|refname is refs/tags/double-tag|refs/tags/double-tag
+	|     refname is refs/tags/four|refs/tags/four
+	|      refname is refs/tags/one|refs/tags/one
+	|refname is refs/tags/signed-tag|refs/tags/signed-tag
+	|    refname is refs/tags/three|refs/tags/three
+	|      refname is refs/tags/two|refs/tags/two
+	EOF
+	git for-each-ref --format="|%(align:30,right)refname is %(refname)%(end)|%(refname)" >actual &&
+	test_cmp expect actual
+'
+
+# Individual atoms inside %(align:...) and %(end) must not be quoted.
+
+test_expect_success 'alignment with format quote' "
+	cat >expect <<-\EOF &&
+	|'      '\''master| A U Thor'\''      '|
+	|'       '\''side| A U Thor'\''       '|
+	|'     '\''odd/spot| A U Thor'\''     '|
+	|'        '\''double-tag| '\''        '|
+	|'       '\''four| A U Thor'\''       '|
+	|'       '\''one| A U Thor'\''        '|
+	|'        '\''signed-tag| '\''        '|
+	|'      '\''three| A U Thor'\''       '|
+	|'       '\''two| A U Thor'\''        '|
+	EOF
+	git for-each-ref --shell --format=\"|%(align:30,middle)'%(refname:short)| %(authorname)'%(end)|\" >actual &&
+	test_cmp expect actual
+"
+
+test_expect_success 'nested alignment with quote formatting' "
+	cat >expect <<-\EOF &&
+	|'         master               '|
+	|'           side               '|
+	|'       odd/spot               '|
+	|'     double-tag               '|
+	|'           four               '|
+	|'            one               '|
+	|'     signed-tag               '|
+	|'          three               '|
+	|'            two               '|
+	EOF
+	git for-each-ref --shell --format='|%(align:30,left)%(align:15,right)%(refname:short)%(end)%(end)|' >actual &&
+	test_cmp expect actual
+"
+
+test_expect_success 'check `%(contents:lines=1)`' '
+	cat >expect <<-\EOF &&
+	master |three
+	side |four
+	odd/spot |three
+	double-tag |Annonated doubly
+	four |four
+	one |one
+	signed-tag |A signed tag message
+	three |three
+	two |two
+	EOF
+	git for-each-ref --format="%(refname:short) |%(contents:lines=1)" >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'check `%(contents:lines=0)`' '
+	cat >expect <<-\EOF &&
+	master |
+	side |
+	odd/spot |
+	double-tag |
+	four |
+	one |
+	signed-tag |
+	three |
+	two |
+	EOF
+	git for-each-ref --format="%(refname:short) |%(contents:lines=0)" >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'check `%(contents:lines=99999)`' '
+	cat >expect <<-\EOF &&
+	master |three
+	side |four
+	odd/spot |three
+	double-tag |Annonated doubly
+	four |four
+	one |one
+	signed-tag |A signed tag message
+	three |three
+	two |two
+	EOF
+	git for-each-ref --format="%(refname:short) |%(contents:lines=99999)" >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success '`%(contents:lines=-1)` should fail' '
+	test_must_fail git for-each-ref --format="%(refname:short) |%(contents:lines=-1)"
+'
+
+test_expect_success 'setup for version sort' '
+	test_commit foo1.3 &&
+	test_commit foo1.6 &&
+	test_commit foo1.10
+'
+
+test_expect_success 'version sort' '
+	git for-each-ref --sort=version:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
+	cat >expect <<-\EOF &&
+	foo1.3
+	foo1.6
+	foo1.10
+	EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'version sort (shortened)' '
+	git for-each-ref --sort=v:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
+	cat >expect <<-\EOF &&
+	foo1.3
+	foo1.6
+	foo1.10
+	EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'reverse version sort' '
+	git for-each-ref --sort=-version:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
+	cat >expect <<-\EOF &&
+	foo1.10
+	foo1.6
+	foo1.3
+	EOF
+	test_cmp expect actual
+'
+
+test_done
diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh
index 869e0bf..edb8341 100755
--- a/t/t7003-filter-branch.sh
+++ b/t/t7003-filter-branch.sh
@@ -333,6 +333,14 @@
 	test_cmp expect actual
 '
 
+test_expect_success 'prune empty works even without index/tree filters' '
+	git rev-list HEAD >expect &&
+	git commit --allow-empty -m empty &&
+	git filter-branch -f --prune-empty HEAD &&
+	git rev-list HEAD >actual &&
+	test_cmp expect actual
+'
+
 test_expect_success '--remap-to-ancestor with filename filters' '
 	git checkout master &&
 	git reset --hard A &&
diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index d31788c..c64579f 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -1462,13 +1462,7 @@
 
 test_expect_success 'invalid sort parameter in configuratoin' '
 	git config tag.sort "v:notvalid" &&
-	git tag -l "foo*" >actual &&
-	cat >expect <<-\EOF &&
-	foo1.10
-	foo1.3
-	foo1.6
-	EOF
-	test_cmp expect actual
+	test_must_fail git tag -l "foo*"
 '
 
 test_expect_success 'version sort with prerelease reordering' '
@@ -1525,4 +1519,51 @@
 	test_cmp expect actual
 '
 
+test_expect_success '--format should list tags as per format given' '
+	cat >expect <<-\EOF &&
+	refname : refs/tags/foo1.10
+	refname : refs/tags/foo1.3
+	refname : refs/tags/foo1.6
+	refname : refs/tags/foo1.6-rc1
+	refname : refs/tags/foo1.6-rc2
+	EOF
+	git tag -l --format="refname : %(refname)" "foo*" >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'setup --merged test tags' '
+	git tag mergetest-1 HEAD~2 &&
+	git tag mergetest-2 HEAD~1 &&
+	git tag mergetest-3 HEAD
+'
+
+test_expect_success '--merged cannot be used in non-list mode' '
+	test_must_fail git tag --merged=mergetest-2 foo
+'
+
+test_expect_success '--merged shows merged tags' '
+	cat >expect <<-\EOF &&
+	mergetest-1
+	mergetest-2
+	EOF
+	git tag -l --merged=mergetest-2 mergetest-* >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success '--no-merged show unmerged tags' '
+	cat >expect <<-\EOF &&
+	mergetest-3
+	EOF
+	git tag -l --no-merged=mergetest-2 mergetest-* >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'ambiguous branch/tags not marked' '
+	git tag ambiguous &&
+	git branch ambiguous &&
+	echo ambiguous >expect &&
+	git tag -l ambiguous >actual &&
+	test_cmp expect actual
+'
+
 test_done
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index 540771c..be82a75 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -999,5 +999,30 @@
 	)
 '
 
+test_expect_success 'submodule helper list is not confused by common prefixes' '
+	mkdir -p dir1/b &&
+	(
+		cd dir1/b &&
+		git init &&
+		echo hi >testfile2 &&
+		git add . &&
+		git commit -m "test1"
+	) &&
+	mkdir -p dir2/b &&
+	(
+		cd dir2/b &&
+		git init &&
+		echo hello >testfile1 &&
+		git add .  &&
+		git commit -m "test2"
+	) &&
+	git submodule add /dir1/b dir1/b &&
+	git submodule add /dir2/b dir2/b &&
+	git commit -m "first submodule commit" &&
+	git submodule--helper list dir1/b |cut -c51- >actual &&
+	echo "dir1/b" >expect &&
+	test_cmp expect actual
+'
+
 
 test_done
diff --git a/t/t7409-submodule-detached-worktree.sh b/t/t7409-submodule-detached-work-tree.sh
similarity index 100%
rename from t/t7409-submodule-detached-worktree.sh
rename to t/t7409-submodule-detached-work-tree.sh
diff --git a/t/t8005-blame-i18n.sh b/t/t8005-blame-i18n.sh
index 847d098..75da219 100755
--- a/t/t8005-blame-i18n.sh
+++ b/t/t8005-blame-i18n.sh
@@ -33,11 +33,15 @@
 summary $SJIS_MSG
 EOF
 
+filter_author_summary () {
+	sed -n -e '/^author /p' -e '/^summary /p' "$@"
+}
+
 test_expect_success !MINGW \
 	'blame respects i18n.commitencoding' '
-	git blame --incremental file | \
-		egrep "^(author|summary) " > actual &&
-	test_cmp actual expected
+	git blame --incremental file >output &&
+	filter_author_summary output >actual &&
+	test_cmp expected actual
 '
 
 cat >expected <<EOF
@@ -52,9 +56,9 @@
 test_expect_success !MINGW \
 	'blame respects i18n.logoutputencoding' '
 	git config i18n.logoutputencoding eucJP &&
-	git blame --incremental file | \
-		egrep "^(author|summary) " > actual &&
-	test_cmp actual expected
+	git blame --incremental file >output &&
+	filter_author_summary output >actual &&
+	test_cmp expected actual
 '
 
 cat >expected <<EOF
@@ -68,9 +72,9 @@
 
 test_expect_success !MINGW \
 	'blame respects --encoding=UTF-8' '
-	git blame --incremental --encoding=UTF-8 file | \
-		egrep "^(author|summary) " > actual &&
-	test_cmp actual expected
+	git blame --incremental --encoding=UTF-8 file >output &&
+	filter_author_summary output >actual &&
+	test_cmp expected actual
 '
 
 cat >expected <<EOF
@@ -84,9 +88,9 @@
 
 test_expect_success !MINGW \
 	'blame respects --encoding=none' '
-	git blame --incremental --encoding=none file | \
-		egrep "^(author|summary) " > actual &&
-	test_cmp actual expected
+	git blame --incremental --encoding=none file >output &&
+	filter_author_summary output >actual &&
+	test_cmp expected actual
 '
 
 test_done
diff --git a/t/t8009-blame-vs-topicbranches.sh b/t/t8009-blame-vs-topicbranches.sh
new file mode 100755
index 0000000..72596e3
--- /dev/null
+++ b/t/t8009-blame-vs-topicbranches.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+test_description='blaming trough history with topic branches'
+. ./test-lib.sh
+
+# Creates the history shown below. '*'s mark the first parent in the merges.
+# The only line of file.t is changed in commit B2
+#
+#        +---C1
+#       /      \
+# A0--A1--*A2--*A3
+#   \     /
+#    B1-B2
+#
+test_expect_success setup '
+	test_commit A0 file.t line0 &&
+	test_commit A1 &&
+	git reset --hard A0 &&
+	test_commit B1 &&
+	test_commit B2 file.t line0changed &&
+	git reset --hard A1 &&
+	test_merge A2 B2 &&
+	git reset --hard A1 &&
+	test_commit C1 &&
+	git reset --hard A2 &&
+	test_merge A3 C1
+	'
+
+test_expect_success 'blame --reverse --first-parent finds A1' '
+	git blame --porcelain --reverse --first-parent A0..A3 -- file.t >actual_full &&
+	head -n 1 <actual_full | sed -e "s/ .*//" >actual &&
+	git rev-parse A1 >expect &&
+	test_cmp expect actual
+	'
+
+test_done
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index 5b4a5ce..834d91a 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -1527,6 +1527,21 @@
 	test_cover_addresses "Cc"
 '
 
+test_expect_success $PREREQ 'escaped quotes in sendemail.aliasfiletype=mutt' '
+	clean_fake_sendmail &&
+	echo "alias sbd \\\"Dot U. Sir\\\" <somebody@example.org>" >.mutt &&
+	git config --replace-all sendemail.aliasesfile "$(pwd)/.mutt" &&
+	git config sendemail.aliasfiletype mutt &&
+	git send-email \
+		--from="Example <nobody@example.com>" \
+		--to=sbd \
+		--smtp-server="$(pwd)/fake.sendmail" \
+		outdir/0001-*.patch \
+		2>errors >out &&
+	grep "^!somebody@example\.org!$" commandline1 &&
+	grep -F "To: \"Dot U. Sir\" <somebody@example.org>" out
+'
+
 test_expect_success $PREREQ 'sendemail.aliasfiletype=mailrc' '
 	clean_fake_sendmail &&
 	echo "alias sbd  somebody@example.org" >.mailrc &&
@@ -1555,6 +1570,88 @@
 	grep "^!someone@example\.org!$" commandline1
 '
 
+test_dump_aliases () {
+	msg="$1" && shift &&
+	filetype="$1" && shift &&
+	printf '%s\n' "$@" >expect &&
+	cat >.tmp-email-aliases &&
+
+	test_expect_success $PREREQ "$msg" '
+		clean_fake_sendmail && rm -fr outdir &&
+		git config --replace-all sendemail.aliasesfile \
+			"$(pwd)/.tmp-email-aliases" &&
+		git config sendemail.aliasfiletype "$filetype" &&
+		git send-email --dump-aliases 2>errors >actual &&
+		test_cmp expect actual
+	'
+}
+
+test_dump_aliases '--dump-aliases sendmail format' \
+	'sendmail' \
+	'abgroup' \
+	'alice' \
+	'bcgrp' \
+	'bob' \
+	'chloe' <<-\EOF
+	alice: Alice W Land <awol@example.com>
+	bob: Robert Bobbyton <bob@example.com>
+	chloe: chloe@example.com
+	abgroup: alice, bob
+	bcgrp: bob, chloe, Other <o@example.com>
+	EOF
+
+test_dump_aliases '--dump-aliases mutt format' \
+	'mutt' \
+	'alice' \
+	'bob' \
+	'chloe' \
+	'donald' <<-\EOF
+	alias alice Alice W Land <awol@example.com>
+	alias donald Donald C Carlton <donc@example.com>
+	alias bob Robert Bobbyton <bob@example.com>
+	alias chloe chloe@example.com
+	EOF
+
+test_dump_aliases '--dump-aliases mailrc format' \
+	'mailrc' \
+	'alice' \
+	'bob' \
+	'chloe' \
+	'eve' <<-\EOF
+	alias alice   Alice W Land <awol@example.com>
+	alias eve     Eve <eve@example.com>
+	alias bob     Robert Bobbyton <bob@example.com>
+	alias chloe   chloe@example.com
+	EOF
+
+test_dump_aliases '--dump-aliases pine format' \
+	'pine' \
+	'alice' \
+	'bob' \
+	'chloe' \
+	'eve' <<-\EOF
+	alice	Alice W Land	<awol@example.com>
+	eve	Eve	<eve@example.com>
+	bob	Robert	Bobbyton <bob@example.com>
+	chloe		chloe@example.com
+	EOF
+
+test_dump_aliases '--dump-aliases gnus format' \
+	'gnus' \
+	'alice' \
+	'bob' \
+	'chloe' \
+	'eve' <<-\EOF
+	(define-mail-alias "alice" "awol@example.com")
+	(define-mail-alias "eve" "eve@example.com")
+	(define-mail-alias "bob" "bob@example.com")
+	(define-mail-alias "chloe" "chloe@example.com")
+	EOF
+
+test_expect_success '--dump-aliases must be used alone' '
+	test_must_fail git send-email --dump-aliases --to=janice@example.com -1 refs/heads/accounting
+'
+
 test_sendmail_aliases () {
 	msg="$1" && shift &&
 	expect="$@" &&
diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh
index 812c9cd..7117719 100755
--- a/t/t9200-git-cvsexportcommit.sh
+++ b/t/t9200-git-cvsexportcommit.sh
@@ -35,7 +35,7 @@
 
 check_entries () {
 	# $1 == directory, $2 == expected
-	grep '^/' "$1/CVS/Entries" | sort | cut -d/ -f2,3,5 >actual
+	sed -ne '/^\//p' "$1/CVS/Entries" | sort | cut -d/ -f2,3,5 >actual
 	if test -z "$2"
 	then
 		>expected
diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh
index 9984c48..14a9384 100755
--- a/t/t9300-fast-import.sh
+++ b/t/t9300-fast-import.sh
@@ -47,1077 +47,1075 @@
 file6_data='#!/bin/sh
 echo "$@"'
 
->empty
-
 ###
 ### series A
 ###
 
-test_tick
-
 test_expect_success 'empty stream succeeds' '
 	git fast-import </dev/null
 '
 
-cat >input <<INPUT_END
-blob
-mark :2
-data <<EOF
-$file2_data
-EOF
+test_expect_success 'A: create pack from stdin' '
+	test_tick &&
+	cat >input <<-INPUT_END &&
+	blob
+	mark :2
+	data <<EOF
+	$file2_data
+	EOF
 
-blob
-mark :3
-data <<END
-$file3_data
-END
+	blob
+	mark :3
+	data <<END
+	$file3_data
+	END
 
-blob
-mark :4
-data $file4_len
-$file4_data
-commit refs/heads/master
-mark :5
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-initial
-COMMIT
+	blob
+	mark :4
+	data $file4_len
+	$file4_data
+	commit refs/heads/master
+	mark :5
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	initial
+	COMMIT
 
-M 644 :2 file2
-M 644 :3 file3
-M 755 :4 file4
+	M 644 :2 file2
+	M 644 :3 file3
+	M 755 :4 file4
 
-tag series-A
-from :5
-data <<EOF
-An annotated tag without a tagger
-EOF
+	tag series-A
+	from :5
+	data <<EOF
+	An annotated tag without a tagger
+	EOF
 
-tag series-A-blob
-from :3
-data <<EOF
-An annotated tag that annotates a blob.
-EOF
+	tag series-A-blob
+	from :3
+	data <<EOF
+	An annotated tag that annotates a blob.
+	EOF
 
-INPUT_END
-test_expect_success \
-    'A: create pack from stdin' \
-    'git fast-import --export-marks=marks.out <input &&
-	 git whatchanged master'
+	INPUT_END
+	git fast-import --export-marks=marks.out <input &&
+	git whatchanged master
+'
 
 test_expect_success 'A: verify pack' '
 	verify_packs
 '
 
-cat >expect <<EOF
-author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+test_expect_success 'A: verify commit' '
+	cat >expect <<-EOF &&
+	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 
-initial
-EOF
-test_expect_success \
-	'A: verify commit' \
-	'git cat-file commit master | sed 1d >actual &&
-	test_cmp expect actual'
+	initial
+	EOF
+	git cat-file commit master | sed 1d >actual &&
+	test_cmp expect actual
+'
 
-cat >expect <<EOF
-100644 blob file2
-100644 blob file3
-100755 blob file4
-EOF
-test_expect_success \
-	'A: verify tree' \
-	'git cat-file -p master^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
-	 test_cmp expect actual'
+test_expect_success 'A: verify tree' '
+	cat >expect <<-EOF &&
+	100644 blob file2
+	100644 blob file3
+	100755 blob file4
+	EOF
+	git cat-file -p master^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
+	test_cmp expect actual
+'
 
-echo "$file2_data" >expect
-test_expect_success \
-	'A: verify file2' \
-	'git cat-file blob master:file2 >actual && test_cmp expect actual'
+test_expect_success 'A: verify file2' '
+	echo "$file2_data" >expect &&
+	git cat-file blob master:file2 >actual &&
+	test_cmp expect actual
+'
 
-echo "$file3_data" >expect
-test_expect_success \
-	'A: verify file3' \
-	'git cat-file blob master:file3 >actual && test_cmp expect actual'
+test_expect_success 'A: verify file3' '
+	echo "$file3_data" >expect &&
+	git cat-file blob master:file3 >actual &&
+	test_cmp expect actual
+'
 
-printf "$file4_data" >expect
-test_expect_success \
-	'A: verify file4' \
-	'git cat-file blob master:file4 >actual && test_cmp expect actual'
+test_expect_success 'A: verify file4' '
+	printf "$file4_data" >expect &&
+	git cat-file blob master:file4 >actual &&
+	test_cmp expect actual
+'
 
-cat >expect <<EOF
-object $(git rev-parse refs/heads/master)
-type commit
-tag series-A
-
-An annotated tag without a tagger
-EOF
 test_expect_success 'A: verify tag/series-A' '
+	cat >expect <<-EOF &&
+	object $(git rev-parse refs/heads/master)
+	type commit
+	tag series-A
+
+	An annotated tag without a tagger
+	EOF
 	git cat-file tag tags/series-A >actual &&
 	test_cmp expect actual
 '
 
-cat >expect <<EOF
-object $(git rev-parse refs/heads/master:file3)
-type blob
-tag series-A-blob
-
-An annotated tag that annotates a blob.
-EOF
 test_expect_success 'A: verify tag/series-A-blob' '
+	cat >expect <<-EOF &&
+	object $(git rev-parse refs/heads/master:file3)
+	type blob
+	tag series-A-blob
+
+	An annotated tag that annotates a blob.
+	EOF
 	git cat-file tag tags/series-A-blob >actual &&
 	test_cmp expect actual
 '
 
-cat >expect <<EOF
-:2 `git rev-parse --verify master:file2`
-:3 `git rev-parse --verify master:file3`
-:4 `git rev-parse --verify master:file4`
-:5 `git rev-parse --verify master^0`
-EOF
-test_expect_success \
-	'A: verify marks output' \
-	'test_cmp expect marks.out'
+test_expect_success 'A: verify marks output' '
+	cat >expect <<-EOF &&
+	:2 `git rev-parse --verify master:file2`
+	:3 `git rev-parse --verify master:file3`
+	:4 `git rev-parse --verify master:file4`
+	:5 `git rev-parse --verify master^0`
+	EOF
+	test_cmp expect marks.out
+'
 
-test_expect_success \
-	'A: verify marks import' \
-	'git fast-import \
+test_expect_success 'A: verify marks import' '
+	git fast-import \
 		--import-marks=marks.out \
 		--export-marks=marks.new \
 		</dev/null &&
-	test_cmp expect marks.new'
+	test_cmp expect marks.new
+'
 
-test_tick
-new_blob=$(echo testing | git hash-object --stdin)
-cat >input <<INPUT_END
-tag series-A-blob-2
-from $(git rev-parse refs/heads/master:file3)
-data <<EOF
-Tag blob by sha1.
-EOF
+test_expect_success 'A: tag blob by sha1' '
+	test_tick &&
+	new_blob=$(echo testing | git hash-object --stdin) &&
+	cat >input <<-INPUT_END &&
+	tag series-A-blob-2
+	from $(git rev-parse refs/heads/master:file3)
+	data <<EOF
+	Tag blob by sha1.
+	EOF
 
-blob
-mark :6
-data <<EOF
-testing
-EOF
+	blob
+	mark :6
+	data <<EOF
+	testing
+	EOF
 
-commit refs/heads/new_blob
-committer  <> 0 +0000
-data 0
-M 644 :6 new_blob
-#pretend we got sha1 from fast-import
-ls "new_blob"
+	commit refs/heads/new_blob
+	committer  <> 0 +0000
+	data 0
+	M 644 :6 new_blob
+	#pretend we got sha1 from fast-import
+	ls "new_blob"
 
-tag series-A-blob-3
-from $new_blob
-data <<EOF
-Tag new_blob.
-EOF
-INPUT_END
+	tag series-A-blob-3
+	from $new_blob
+	data <<EOF
+	Tag new_blob.
+	EOF
+	INPUT_END
 
-cat >expect <<EOF
-object $(git rev-parse refs/heads/master:file3)
-type blob
-tag series-A-blob-2
+	cat >expect <<-EOF &&
+	object $(git rev-parse refs/heads/master:file3)
+	type blob
+	tag series-A-blob-2
 
-Tag blob by sha1.
-object $new_blob
-type blob
-tag series-A-blob-3
+	Tag blob by sha1.
+	object $new_blob
+	type blob
+	tag series-A-blob-3
 
-Tag new_blob.
-EOF
+	Tag new_blob.
+	EOF
 
-test_expect_success \
-	'A: tag blob by sha1' \
-	'git fast-import <input &&
+	git fast-import <input &&
 	git cat-file tag tags/series-A-blob-2 >actual &&
 	git cat-file tag tags/series-A-blob-3 >>actual &&
-	test_cmp expect actual'
+	test_cmp expect actual
+'
 
-test_tick
-cat >input <<INPUT_END
-commit refs/heads/verify--import-marks
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-recreate from :5
-COMMIT
+test_expect_success 'A: verify marks import does not crash' '
+	test_tick &&
+	cat >input <<-INPUT_END &&
+	commit refs/heads/verify--import-marks
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	recreate from :5
+	COMMIT
 
-from :5
-M 755 :2 copy-of-file2
+	from :5
+	M 755 :2 copy-of-file2
 
-INPUT_END
-test_expect_success \
-	'A: verify marks import does not crash' \
-	'git fast-import --import-marks=marks.out <input &&
-	 git whatchanged verify--import-marks'
+	INPUT_END
+
+	git fast-import --import-marks=marks.out <input &&
+	git whatchanged verify--import-marks
+'
 
 test_expect_success 'A: verify pack' '
 	verify_packs
 '
 
-cat >expect <<EOF
-:000000 100755 0000000000000000000000000000000000000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 A	copy-of-file2
-EOF
-git diff-tree -M -r master verify--import-marks >actual
-test_expect_success \
-	'A: verify diff' \
-	'compare_diff_raw expect actual &&
-	 test `git rev-parse --verify master:file2` \
-	    = `git rev-parse --verify verify--import-marks:copy-of-file2`'
-
-test_tick
-mt=$(git hash-object --stdin < /dev/null)
-: >input.blob
-: >marks.exp
-: >tree.exp
-
-cat >input.commit <<EOF
-commit refs/heads/verify--dump-marks
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-test the sparse array dumping routines with exponentially growing marks
-COMMIT
-EOF
-
-i=0
-l=4
-m=6
-n=7
-while test "$i" -lt 27; do
-    cat >>input.blob <<EOF
-blob
-mark :$l
-data 0
-blob
-mark :$m
-data 0
-blob
-mark :$n
-data 0
-EOF
-    echo "M 100644 :$l l$i" >>input.commit
-    echo "M 100644 :$m m$i" >>input.commit
-    echo "M 100644 :$n n$i" >>input.commit
-
-    echo ":$l $mt" >>marks.exp
-    echo ":$m $mt" >>marks.exp
-    echo ":$n $mt" >>marks.exp
-
-    printf "100644 blob $mt\tl$i\n" >>tree.exp
-    printf "100644 blob $mt\tm$i\n" >>tree.exp
-    printf "100644 blob $mt\tn$i\n" >>tree.exp
-
-    l=$(($l + $l))
-    m=$(($m + $m))
-    n=$(($l + $n))
-
-    i=$((1 + $i))
-done
-
-sort tree.exp > tree.exp_s
+test_expect_success 'A: verify diff' '
+	cat >expect <<-EOF &&
+	:000000 100755 0000000000000000000000000000000000000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 A	copy-of-file2
+	EOF
+	git diff-tree -M -r master verify--import-marks >actual &&
+	compare_diff_raw expect actual &&
+	test `git rev-parse --verify master:file2` \
+	    = `git rev-parse --verify verify--import-marks:copy-of-file2`
+'
 
 test_expect_success 'A: export marks with large values' '
+	test_tick &&
+	mt=$(git hash-object --stdin < /dev/null) &&
+	>input.blob &&
+	>marks.exp &&
+	>tree.exp &&
+
+	cat >input.commit <<-EOF &&
+	commit refs/heads/verify--dump-marks
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	test the sparse array dumping routines with exponentially growing marks
+	COMMIT
+	EOF
+
+	i=0 l=4 m=6 n=7 &&
+	while test "$i" -lt 27
+	do
+		cat >>input.blob <<-EOF &&
+		blob
+		mark :$l
+		data 0
+		blob
+		mark :$m
+		data 0
+		blob
+		mark :$n
+		data 0
+		EOF
+		echo "M 100644 :$l l$i" >>input.commit &&
+		echo "M 100644 :$m m$i" >>input.commit &&
+		echo "M 100644 :$n n$i" >>input.commit &&
+
+		echo ":$l $mt" >>marks.exp &&
+		echo ":$m $mt" >>marks.exp &&
+		echo ":$n $mt" >>marks.exp &&
+
+		printf "100644 blob $mt\tl$i\n" >>tree.exp &&
+		printf "100644 blob $mt\tm$i\n" >>tree.exp &&
+		printf "100644 blob $mt\tn$i\n" >>tree.exp &&
+
+		l=$(($l + $l)) &&
+		m=$(($m + $m)) &&
+		n=$(($l + $n)) &&
+
+		i=$((1 + $i)) || return 1
+	done &&
+
+	sort tree.exp > tree.exp_s &&
+
 	cat input.blob input.commit | git fast-import --export-marks=marks.large &&
 	git ls-tree refs/heads/verify--dump-marks >tree.out &&
 	test_cmp tree.exp_s tree.out &&
-	test_cmp marks.exp marks.large'
+	test_cmp marks.exp marks.large
+'
 
 ###
 ### series B
 ###
 
-test_tick
-cat >input <<INPUT_END
-commit refs/heads/branch
-mark :1
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-corrupt
-COMMIT
-
-from refs/heads/master
-M 755 0000000000000000000000000000000000000001 zero1
-
-INPUT_END
 test_expect_success 'B: fail on invalid blob sha1' '
-    test_must_fail git fast-import <input
+	test_tick &&
+	cat >input <<-INPUT_END &&
+	commit refs/heads/branch
+	mark :1
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	corrupt
+	COMMIT
+
+	from refs/heads/master
+	M 755 0000000000000000000000000000000000000001 zero1
+
+	INPUT_END
+
+	test_when_finished "rm -f .git/objects/pack_* .git/objects/index_*" &&
+	test_must_fail git fast-import <input
 '
-rm -f .git/objects/pack_* .git/objects/index_*
 
-cat >input <<INPUT_END
-commit TEMP_TAG
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-tag base
-COMMIT
+test_expect_success 'B: accept branch name "TEMP_TAG"' '
+	cat >input <<-INPUT_END &&
+	commit TEMP_TAG
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	tag base
+	COMMIT
 
-from refs/heads/master
+	from refs/heads/master
 
-INPUT_END
-test_expect_success \
-    'B: accept branch name "TEMP_TAG"' \
-    'git fast-import <input &&
-	 test -f .git/TEMP_TAG &&
-	 test `git rev-parse master` = `git rev-parse TEMP_TAG^`'
-rm -f .git/TEMP_TAG
+	INPUT_END
 
-git gc 2>/dev/null >/dev/null
-git prune 2>/dev/null >/dev/null
+	test_when_finished "rm -f .git/TEMP_TAG
+		git gc
+		git prune" &&
+	git fast-import <input &&
+	test -f .git/TEMP_TAG &&
+	test `git rev-parse master` = `git rev-parse TEMP_TAG^`
+'
 
-cat >input <<INPUT_END
-commit refs/heads/empty-committer-1
-committer  <> $GIT_COMMITTER_DATE
-data <<COMMIT
-empty commit
-COMMIT
-INPUT_END
 test_expect_success 'B: accept empty committer' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/empty-committer-1
+	committer  <> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	empty commit
+	COMMIT
+	INPUT_END
+
+	test_when_finished "git update-ref -d refs/heads/empty-committer-1
+		git gc
+		git prune" &&
 	git fast-import <input &&
 	out=$(git fsck) &&
 	echo "$out" &&
 	test -z "$out"
 '
-git update-ref -d refs/heads/empty-committer-1 || true
 
-git gc 2>/dev/null >/dev/null
-git prune 2>/dev/null >/dev/null
-
-cat >input <<INPUT_END
-commit refs/heads/empty-committer-2
-committer <a@b.com> $GIT_COMMITTER_DATE
-data <<COMMIT
-empty commit
-COMMIT
-INPUT_END
 test_expect_success 'B: accept and fixup committer with no name' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/empty-committer-2
+	committer <a@b.com> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	empty commit
+	COMMIT
+	INPUT_END
+
+	test_when_finished "git update-ref -d refs/heads/empty-committer-2
+		git gc
+		git prune" &&
 	git fast-import <input &&
 	out=$(git fsck) &&
 	echo "$out" &&
 	test -z "$out"
 '
-git update-ref -d refs/heads/empty-committer-2 || true
 
-git gc 2>/dev/null >/dev/null
-git prune 2>/dev/null >/dev/null
-
-cat >input <<INPUT_END
-commit refs/heads/invalid-committer
-committer Name email> $GIT_COMMITTER_DATE
-data <<COMMIT
-empty commit
-COMMIT
-INPUT_END
 test_expect_success 'B: fail on invalid committer (1)' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/invalid-committer
+	committer Name email> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	empty commit
+	COMMIT
+	INPUT_END
+
+	test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
 	test_must_fail git fast-import <input
 '
-git update-ref -d refs/heads/invalid-committer || true
 
-cat >input <<INPUT_END
-commit refs/heads/invalid-committer
-committer Name <e<mail> $GIT_COMMITTER_DATE
-data <<COMMIT
-empty commit
-COMMIT
-INPUT_END
 test_expect_success 'B: fail on invalid committer (2)' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/invalid-committer
+	committer Name <e<mail> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	empty commit
+	COMMIT
+	INPUT_END
+
+	test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
 	test_must_fail git fast-import <input
 '
-git update-ref -d refs/heads/invalid-committer || true
 
-cat >input <<INPUT_END
-commit refs/heads/invalid-committer
-committer Name <email>> $GIT_COMMITTER_DATE
-data <<COMMIT
-empty commit
-COMMIT
-INPUT_END
 test_expect_success 'B: fail on invalid committer (3)' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/invalid-committer
+	committer Name <email>> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	empty commit
+	COMMIT
+	INPUT_END
+
+	test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
 	test_must_fail git fast-import <input
 '
-git update-ref -d refs/heads/invalid-committer || true
 
-cat >input <<INPUT_END
-commit refs/heads/invalid-committer
-committer Name <email $GIT_COMMITTER_DATE
-data <<COMMIT
-empty commit
-COMMIT
-INPUT_END
 test_expect_success 'B: fail on invalid committer (4)' '
-	test_must_fail git fast-import <input
-'
-git update-ref -d refs/heads/invalid-committer || true
+	cat >input <<-INPUT_END &&
+	commit refs/heads/invalid-committer
+	committer Name <email $GIT_COMMITTER_DATE
+	data <<COMMIT
+	empty commit
+	COMMIT
+	INPUT_END
 
-cat >input <<INPUT_END
-commit refs/heads/invalid-committer
-committer Name<email> $GIT_COMMITTER_DATE
-data <<COMMIT
-empty commit
-COMMIT
-INPUT_END
-test_expect_success 'B: fail on invalid committer (5)' '
+	test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
 	test_must_fail git fast-import <input
 '
-git update-ref -d refs/heads/invalid-committer || true
+
+test_expect_success 'B: fail on invalid committer (5)' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/invalid-committer
+	committer Name<email> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	empty commit
+	COMMIT
+	INPUT_END
+
+	test_when_finished "git update-ref -d refs/heads/invalid-committer" &&
+	test_must_fail git fast-import <input
+'
 
 ###
 ### series C
 ###
 
-newf=`echo hi newf | git hash-object -w --stdin`
-oldf=`git rev-parse --verify master:file2`
-test_tick
-cat >input <<INPUT_END
-commit refs/heads/branch
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-second
-COMMIT
+test_expect_success 'C: incremental import create pack from stdin' '
+	newf=`echo hi newf | git hash-object -w --stdin` &&
+	oldf=`git rev-parse --verify master:file2` &&
+	test_tick &&
+	cat >input <<-INPUT_END &&
+	commit refs/heads/branch
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	second
+	COMMIT
 
-from refs/heads/master
-M 644 $oldf file2/oldf
-M 755 $newf file2/newf
-D file3
+	from refs/heads/master
+	M 644 $oldf file2/oldf
+	M 755 $newf file2/newf
+	D file3
 
-INPUT_END
-test_expect_success \
-    'C: incremental import create pack from stdin' \
-    'git fast-import <input &&
-	 git whatchanged branch'
+	INPUT_END
+
+	git fast-import <input &&
+	git whatchanged branch
+'
 
 test_expect_success 'C: verify pack' '
 	verify_packs
 '
 
-test_expect_success \
-	'C: validate reuse existing blob' \
-	'test $newf = `git rev-parse --verify branch:file2/newf` &&
-	 test $oldf = `git rev-parse --verify branch:file2/oldf`'
+test_expect_success 'C: validate reuse existing blob' '
+	test $newf = `git rev-parse --verify branch:file2/newf` &&
+	test $oldf = `git rev-parse --verify branch:file2/oldf`
+'
 
-cat >expect <<EOF
-parent `git rev-parse --verify master^0`
-author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+test_expect_success 'C: verify commit' '
+	cat >expect <<-EOF &&
+	parent `git rev-parse --verify master^0`
+	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 
-second
-EOF
-test_expect_success \
-	'C: verify commit' \
-	'git cat-file commit branch | sed 1d >actual &&
-	 test_cmp expect actual'
+	second
+	EOF
 
-cat >expect <<EOF
-:000000 100755 0000000000000000000000000000000000000000 f1fb5da718392694d0076d677d6d0e364c79b0bc A	file2/newf
-:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 R100	file2	file2/oldf
-:100644 000000 0d92e9f3374ae2947c23aa477cbc68ce598135f1 0000000000000000000000000000000000000000 D	file3
-EOF
-git diff-tree -M -r master branch >actual
-test_expect_success \
-	'C: validate rename result' \
-	'compare_diff_raw expect actual'
+	git cat-file commit branch | sed 1d >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'C: validate rename result' '
+	cat >expect <<-EOF &&
+	:000000 100755 0000000000000000000000000000000000000000 f1fb5da718392694d0076d677d6d0e364c79b0bc A	file2/newf
+	:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 R100	file2	file2/oldf
+	:100644 000000 0d92e9f3374ae2947c23aa477cbc68ce598135f1 0000000000000000000000000000000000000000 D	file3
+	EOF
+	git diff-tree -M -r master branch >actual &&
+	compare_diff_raw expect actual
+'
 
 ###
 ### series D
 ###
 
-test_tick
-cat >input <<INPUT_END
-commit refs/heads/branch
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-third
-COMMIT
+test_expect_success 'D: inline data in commit' '
+	test_tick &&
+	cat >input <<-INPUT_END &&
+	commit refs/heads/branch
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	third
+	COMMIT
 
-from refs/heads/branch^0
-M 644 inline newdir/interesting
-data <<EOF
-$file5_data
-EOF
+	from refs/heads/branch^0
+	M 644 inline newdir/interesting
+	data <<EOF
+	$file5_data
+	EOF
 
-M 755 inline newdir/exec.sh
-data <<EOF
-$file6_data
-EOF
+	M 755 inline newdir/exec.sh
+	data <<EOF
+	$file6_data
+	EOF
 
-INPUT_END
-test_expect_success \
-    'D: inline data in commit' \
-    'git fast-import <input &&
-	 git whatchanged branch'
+	INPUT_END
+
+	git fast-import <input &&
+	git whatchanged branch
+'
 
 test_expect_success 'D: verify pack' '
 	verify_packs
 '
 
-cat >expect <<EOF
-:000000 100755 0000000000000000000000000000000000000000 e74b7d465e52746be2b4bae983670711e6e66657 A	newdir/exec.sh
-:000000 100644 0000000000000000000000000000000000000000 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 A	newdir/interesting
-EOF
-git diff-tree -M -r branch^ branch >actual
-test_expect_success \
-	'D: validate new files added' \
-	'compare_diff_raw expect actual'
+test_expect_success 'D: validate new files added' '
+	cat >expect <<-EOF &&
+	:000000 100755 0000000000000000000000000000000000000000 e74b7d465e52746be2b4bae983670711e6e66657 A	newdir/exec.sh
+	:000000 100644 0000000000000000000000000000000000000000 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 A	newdir/interesting
+	EOF
+	git diff-tree -M -r branch^ branch >actual &&
+	compare_diff_raw expect actual
+'
 
-echo "$file5_data" >expect
-test_expect_success \
-	'D: verify file5' \
-	'git cat-file blob branch:newdir/interesting >actual &&
-	 test_cmp expect actual'
+test_expect_success 'D: verify file5' '
+	echo "$file5_data" >expect &&
+	git cat-file blob branch:newdir/interesting >actual &&
+	test_cmp expect actual
+'
 
-echo "$file6_data" >expect
-test_expect_success \
-	'D: verify file6' \
-	'git cat-file blob branch:newdir/exec.sh >actual &&
-	 test_cmp expect actual'
+test_expect_success 'D: verify file6' '
+	echo "$file6_data" >expect &&
+	git cat-file blob branch:newdir/exec.sh >actual &&
+	test_cmp expect actual
+'
 
 ###
 ### series E
 ###
 
-cat >input <<INPUT_END
-commit refs/heads/branch
-author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> Tue Feb 6 11:22:18 2007 -0500
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> Tue Feb 6 12:35:02 2007 -0500
-data <<COMMIT
-RFC 2822 type date
-COMMIT
-
-from refs/heads/branch^0
-
-INPUT_END
 test_expect_success 'E: rfc2822 date, --date-format=raw' '
-    test_must_fail git fast-import --date-format=raw <input
+	cat >input <<-INPUT_END &&
+	commit refs/heads/branch
+	author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> Tue Feb 6 11:22:18 2007 -0500
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> Tue Feb 6 12:35:02 2007 -0500
+	data <<COMMIT
+	RFC 2822 type date
+	COMMIT
+
+	from refs/heads/branch^0
+
+	INPUT_END
+
+	test_must_fail git fast-import --date-format=raw <input
 '
-test_expect_success \
-    'E: rfc2822 date, --date-format=rfc2822' \
-    'git fast-import --date-format=rfc2822 <input'
+test_expect_success 'E: rfc2822 date, --date-format=rfc2822' '
+	git fast-import --date-format=rfc2822 <input
+'
 
 test_expect_success 'E: verify pack' '
 	verify_packs
 '
 
-cat >expect <<EOF
-author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> 1170778938 -0500
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1170783302 -0500
+test_expect_success 'E: verify commit' '
+	cat >expect <<-EOF &&
+	author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> 1170778938 -0500
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1170783302 -0500
 
-RFC 2822 type date
-EOF
-test_expect_success \
-	'E: verify commit' \
-	'git cat-file commit branch | sed 1,2d >actual &&
-	test_cmp expect actual'
+	RFC 2822 type date
+	EOF
+	git cat-file commit branch | sed 1,2d >actual &&
+	test_cmp expect actual
+'
 
 ###
 ### series F
 ###
 
-old_branch=`git rev-parse --verify branch^0`
-test_tick
-cat >input <<INPUT_END
-commit refs/heads/branch
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-losing things already?
-COMMIT
+test_expect_success 'F: non-fast-forward update skips' '
+	old_branch=`git rev-parse --verify branch^0` &&
+	test_tick &&
+	cat >input <<-INPUT_END &&
+	commit refs/heads/branch
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	losing things already?
+	COMMIT
 
-from refs/heads/branch~1
+	from refs/heads/branch~1
 
-reset refs/heads/other
-from refs/heads/branch
+	reset refs/heads/other
+	from refs/heads/branch
 
-INPUT_END
-test_expect_success \
-    'F: non-fast-forward update skips' \
-    'if git fast-import <input
-	 then
-		echo BAD gfi did not fail
-		return 1
-	 else
-		if test $old_branch = `git rev-parse --verify branch^0`
-		then
-			: branch unaffected and failure returned
-			return 0
-		else
-			echo BAD gfi changed branch $old_branch
-			return 1
-		fi
-	 fi
-	'
+	INPUT_END
+
+	test_must_fail git fast-import <input &&
+	# branch must remain unaffected
+	test $old_branch = `git rev-parse --verify branch^0`
+'
 
 test_expect_success 'F: verify pack' '
 	verify_packs
 '
 
-cat >expect <<EOF
-tree `git rev-parse branch~1^{tree}`
-parent `git rev-parse branch~1`
-author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+test_expect_success 'F: verify other commit' '
+	cat >expect <<-EOF &&
+	tree `git rev-parse branch~1^{tree}`
+	parent `git rev-parse branch~1`
+	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 
-losing things already?
-EOF
-test_expect_success \
-	'F: verify other commit' \
-	'git cat-file commit other >actual &&
-	test_cmp expect actual'
+	losing things already?
+	EOF
+	git cat-file commit other >actual &&
+	test_cmp expect actual
+'
 
 ###
 ### series G
 ###
 
-old_branch=`git rev-parse --verify branch^0`
-test_tick
-cat >input <<INPUT_END
-commit refs/heads/branch
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-losing things already?
-COMMIT
+test_expect_success 'G: non-fast-forward update forced' '
+	old_branch=`git rev-parse --verify branch^0` &&
+	test_tick &&
+	cat >input <<-INPUT_END &&
+	commit refs/heads/branch
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	losing things already?
+	COMMIT
 
-from refs/heads/branch~1
+	from refs/heads/branch~1
 
-INPUT_END
-test_expect_success \
-    'G: non-fast-forward update forced' \
-    'git fast-import --force <input'
+	INPUT_END
+	git fast-import --force <input
+'
 
 test_expect_success 'G: verify pack' '
 	verify_packs
 '
 
-test_expect_success \
-	'G: branch changed, but logged' \
-	'test $old_branch != `git rev-parse --verify branch^0` &&
-	 test $old_branch = `git rev-parse --verify branch@{1}`'
+test_expect_success 'G: branch changed, but logged' '
+	test $old_branch != `git rev-parse --verify branch^0` &&
+	test $old_branch = `git rev-parse --verify branch@{1}`
+'
 
 ###
 ### series H
 ###
 
-test_tick
-cat >input <<INPUT_END
-commit refs/heads/H
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-third
-COMMIT
+test_expect_success 'H: deletall, add 1' '
+	test_tick &&
+	cat >input <<-INPUT_END &&
+	commit refs/heads/H
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	third
+	COMMIT
 
-from refs/heads/branch^0
-M 644 inline i-will-die
-data <<EOF
-this file will never exist.
-EOF
+	from refs/heads/branch^0
+	M 644 inline i-will-die
+	data <<EOF
+	this file will never exist.
+	EOF
 
-deleteall
-M 644 inline h/e/l/lo
-data <<EOF
-$file5_data
-EOF
+	deleteall
+	M 644 inline h/e/l/lo
+	data <<EOF
+	$file5_data
+	EOF
 
-INPUT_END
-test_expect_success \
-    'H: deletall, add 1' \
-    'git fast-import <input &&
-	 git whatchanged H'
+	INPUT_END
+	git fast-import <input &&
+	git whatchanged H
+'
 
 test_expect_success 'H: verify pack' '
 	verify_packs
 '
 
-cat >expect <<EOF
-:100755 000000 f1fb5da718392694d0076d677d6d0e364c79b0bc 0000000000000000000000000000000000000000 D	file2/newf
-:100644 000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 0000000000000000000000000000000000000000 D	file2/oldf
-:100755 000000 85df50785d62d3b05ab03d9cbf7e4a0b49449730 0000000000000000000000000000000000000000 D	file4
-:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 R100	newdir/interesting	h/e/l/lo
-:100755 000000 e74b7d465e52746be2b4bae983670711e6e66657 0000000000000000000000000000000000000000 D	newdir/exec.sh
-EOF
-git diff-tree -M -r H^ H >actual
-test_expect_success \
-	'H: validate old files removed, new files added' \
-	'compare_diff_raw expect actual'
+test_expect_success 'H: validate old files removed, new files added' '
+	cat >expect <<-EOF &&
+	:100755 000000 f1fb5da718392694d0076d677d6d0e364c79b0bc 0000000000000000000000000000000000000000 D	file2/newf
+	:100644 000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 0000000000000000000000000000000000000000 D	file2/oldf
+	:100755 000000 85df50785d62d3b05ab03d9cbf7e4a0b49449730 0000000000000000000000000000000000000000 D	file4
+	:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 R100	newdir/interesting	h/e/l/lo
+	:100755 000000 e74b7d465e52746be2b4bae983670711e6e66657 0000000000000000000000000000000000000000 D	newdir/exec.sh
+	EOF
+	git diff-tree -M -r H^ H >actual &&
+	compare_diff_raw expect actual
+'
 
-echo "$file5_data" >expect
-test_expect_success \
-	'H: verify file' \
-	'git cat-file blob H:h/e/l/lo >actual &&
-	 test_cmp expect actual'
+test_expect_success 'H: verify file' '
+	echo "$file5_data" >expect &&
+	git cat-file blob H:h/e/l/lo >actual &&
+	test_cmp expect actual
+'
 
 ###
 ### series I
 ###
 
-cat >input <<INPUT_END
-commit refs/heads/export-boundary
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-we have a border.  its only 40 characters wide.
-COMMIT
+test_expect_success 'I: export-pack-edges' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/export-boundary
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	we have a border.  its only 40 characters wide.
+	COMMIT
 
-from refs/heads/branch
+	from refs/heads/branch
 
-INPUT_END
-test_expect_success \
-    'I: export-pack-edges' \
-    'git fast-import --export-pack-edges=edges.list <input'
+	INPUT_END
+	git fast-import --export-pack-edges=edges.list <input
+'
 
-cat >expect <<EOF
-.git/objects/pack/pack-.pack: `git rev-parse --verify export-boundary`
-EOF
-test_expect_success \
-	'I: verify edge list' \
-	'sed -e s/pack-.*pack/pack-.pack/ edges.list >actual &&
-	 test_cmp expect actual'
+test_expect_success 'I: verify edge list' '
+	cat >expect <<-EOF &&
+	.git/objects/pack/pack-.pack: `git rev-parse --verify export-boundary`
+	EOF
+	sed -e s/pack-.*pack/pack-.pack/ edges.list >actual &&
+	test_cmp expect actual
+'
 
 ###
 ### series J
 ###
 
-cat >input <<INPUT_END
-commit refs/heads/J
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-create J
-COMMIT
+test_expect_success 'J: reset existing branch creates empty commit' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/J
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	create J
+	COMMIT
 
-from refs/heads/branch
+	from refs/heads/branch
 
-reset refs/heads/J
+	reset refs/heads/J
 
-commit refs/heads/J
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-initialize J
-COMMIT
+	commit refs/heads/J
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	initialize J
+	COMMIT
 
-INPUT_END
-test_expect_success \
-    'J: reset existing branch creates empty commit' \
-    'git fast-import <input'
-test_expect_success \
-	'J: branch has 1 commit, empty tree' \
-	'test 1 = `git rev-list J | wc -l` &&
-	 test 0 = `git ls-tree J | wc -l`'
+	INPUT_END
+	git fast-import <input
+'
+test_expect_success 'J: branch has 1 commit, empty tree' '
+	test 1 = `git rev-list J | wc -l` &&
+	test 0 = `git ls-tree J | wc -l`
+'
 
-cat >input <<INPUT_END
-reset refs/heads/J2
+test_expect_success 'J: tag must fail on empty branch' '
+	cat >input <<-INPUT_END &&
+	reset refs/heads/J2
 
-tag wrong_tag
-from refs/heads/J2
-data <<EOF
-Tag branch that was reset.
-EOF
-INPUT_END
-test_expect_success \
-	'J: tag must fail on empty branch' \
-	'test_must_fail git fast-import <input'
+	tag wrong_tag
+	from refs/heads/J2
+	data <<EOF
+	Tag branch that was reset.
+	EOF
+	INPUT_END
+	test_must_fail git fast-import <input
+'
+
 ###
 ### series K
 ###
 
-cat >input <<INPUT_END
-commit refs/heads/K
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-create K
-COMMIT
+test_expect_success 'K: reinit branch with from' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/K
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	create K
+	COMMIT
 
-from refs/heads/branch
+	from refs/heads/branch
 
-commit refs/heads/K
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-redo K
-COMMIT
+	commit refs/heads/K
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	redo K
+	COMMIT
 
-from refs/heads/branch^1
+	from refs/heads/branch^1
 
-INPUT_END
-test_expect_success \
-    'K: reinit branch with from' \
-    'git fast-import <input'
-test_expect_success \
-    'K: verify K^1 = branch^1' \
-    'test `git rev-parse --verify branch^1` \
-		= `git rev-parse --verify K^1`'
+	INPUT_END
+	git fast-import <input
+'
+test_expect_success 'K: verify K^1 = branch^1' '
+	test `git rev-parse --verify branch^1` \
+		= `git rev-parse --verify K^1`
+'
 
 ###
 ### series L
 ###
 
-cat >input <<INPUT_END
-blob
-mark :1
-data <<EOF
-some data
-EOF
+test_expect_success 'L: verify internal tree sorting' '
+	cat >input <<-INPUT_END &&
+	blob
+	mark :1
+	data <<EOF
+	some data
+	EOF
 
-blob
-mark :2
-data <<EOF
-other data
-EOF
+	blob
+	mark :2
+	data <<EOF
+	other data
+	EOF
 
-commit refs/heads/L
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-create L
-COMMIT
+	commit refs/heads/L
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	create L
+	COMMIT
 
-M 644 :1 b.
-M 644 :1 b/other
-M 644 :1 ba
+	M 644 :1 b.
+	M 644 :1 b/other
+	M 644 :1 ba
 
-commit refs/heads/L
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-update L
-COMMIT
+	commit refs/heads/L
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	update L
+	COMMIT
 
-M 644 :2 b.
-M 644 :2 b/other
-M 644 :2 ba
-INPUT_END
+	M 644 :2 b.
+	M 644 :2 b/other
+	M 644 :2 ba
+	INPUT_END
 
-cat >expect <<EXPECT_END
-:100644 100644 4268632... 55d3a52... M	b.
-:040000 040000 0ae5cac... 443c768... M	b
-:100644 100644 4268632... 55d3a52... M	ba
-EXPECT_END
+	cat >expect <<-EXPECT_END &&
+	:100644 100644 4268632... 55d3a52... M	b.
+	:040000 040000 0ae5cac... 443c768... M	b
+	:100644 100644 4268632... 55d3a52... M	ba
+	EXPECT_END
 
-test_expect_success \
-    'L: verify internal tree sorting' \
-	'git fast-import <input &&
-	 git diff-tree --abbrev --raw L^ L >output &&
-	 test_cmp expect output'
+	git fast-import <input &&
+	git diff-tree --abbrev --raw L^ L >output &&
+	test_cmp expect output
+'
 
-cat >input <<INPUT_END
-blob
-mark :1
-data <<EOF
-the data
-EOF
+test_expect_success 'L: nested tree copy does not corrupt deltas' '
+	cat >input <<-INPUT_END &&
+	blob
+	mark :1
+	data <<EOF
+	the data
+	EOF
 
-commit refs/heads/L2
-committer C O Mitter <committer@example.com> 1112912473 -0700
-data <<COMMIT
-init L2
-COMMIT
-M 644 :1 a/b/c
-M 644 :1 a/b/d
-M 644 :1 a/e/f
+	commit refs/heads/L2
+	committer C O Mitter <committer@example.com> 1112912473 -0700
+	data <<COMMIT
+	init L2
+	COMMIT
+	M 644 :1 a/b/c
+	M 644 :1 a/b/d
+	M 644 :1 a/e/f
 
-commit refs/heads/L2
-committer C O Mitter <committer@example.com> 1112912473 -0700
-data <<COMMIT
-update L2
-COMMIT
-C a g
-C a/e g/b
-M 644 :1 g/b/h
-INPUT_END
+	commit refs/heads/L2
+	committer C O Mitter <committer@example.com> 1112912473 -0700
+	data <<COMMIT
+	update L2
+	COMMIT
+	C a g
+	C a/e g/b
+	M 644 :1 g/b/h
+	INPUT_END
 
-cat <<EOF >expect
-g/b/f
-g/b/h
-EOF
+	cat >expect <<-\EOF &&
+	g/b/f
+	g/b/h
+	EOF
 
-test_expect_success \
-    'L: nested tree copy does not corrupt deltas' \
-	'git fast-import <input &&
+	test_when_finished "git update-ref -d refs/heads/L2" &&
+	git fast-import <input &&
 	git ls-tree L2 g/b/ >tmp &&
 	cat tmp | cut -f 2 >actual &&
 	test_cmp expect actual &&
-	git fsck `git rev-parse L2`'
-
-git update-ref -d refs/heads/L2
+	git fsck `git rev-parse L2`
+'
 
 ###
 ### series M
 ###
 
-test_tick
-cat >input <<INPUT_END
-commit refs/heads/M1
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-file rename
-COMMIT
+test_expect_success 'M: rename file in same subdirectory' '
+	test_tick &&
+	cat >input <<-INPUT_END &&
+	commit refs/heads/M1
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	file rename
+	COMMIT
 
-from refs/heads/branch^0
-R file2/newf file2/n.e.w.f
+	from refs/heads/branch^0
+	R file2/newf file2/n.e.w.f
 
-INPUT_END
+	INPUT_END
 
-cat >expect <<EOF
-:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100	file2/newf	file2/n.e.w.f
-EOF
-test_expect_success \
-	'M: rename file in same subdirectory' \
-	'git fast-import <input &&
-	 git diff-tree -M -r M1^ M1 >actual &&
-	 compare_diff_raw expect actual'
+	cat >expect <<-EOF &&
+	:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100	file2/newf	file2/n.e.w.f
+	EOF
+	git fast-import <input &&
+	git diff-tree -M -r M1^ M1 >actual &&
+	compare_diff_raw expect actual
+'
 
-cat >input <<INPUT_END
-commit refs/heads/M2
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-file rename
-COMMIT
+test_expect_success 'M: rename file to new subdirectory' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/M2
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	file rename
+	COMMIT
 
-from refs/heads/branch^0
-R file2/newf i/am/new/to/you
+	from refs/heads/branch^0
+	R file2/newf i/am/new/to/you
 
-INPUT_END
+	INPUT_END
 
-cat >expect <<EOF
-:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100	file2/newf	i/am/new/to/you
-EOF
-test_expect_success \
-	'M: rename file to new subdirectory' \
-	'git fast-import <input &&
-	 git diff-tree -M -r M2^ M2 >actual &&
-	 compare_diff_raw expect actual'
+	cat >expect <<-EOF &&
+	:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100	file2/newf	i/am/new/to/you
+	EOF
+	git fast-import <input &&
+	git diff-tree -M -r M2^ M2 >actual &&
+	compare_diff_raw expect actual
+'
 
-cat >input <<INPUT_END
-commit refs/heads/M3
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-file rename
-COMMIT
+test_expect_success 'M: rename subdirectory to new subdirectory' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/M3
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	file rename
+	COMMIT
 
-from refs/heads/M2^0
-R i other/sub
+	from refs/heads/M2^0
+	R i other/sub
 
-INPUT_END
+	INPUT_END
 
-cat >expect <<EOF
-:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100	i/am/new/to/you	other/sub/am/new/to/you
-EOF
-test_expect_success \
-	'M: rename subdirectory to new subdirectory' \
-	'git fast-import <input &&
-	 git diff-tree -M -r M3^ M3 >actual &&
-	 compare_diff_raw expect actual'
+	cat >expect <<-EOF &&
+	:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100	i/am/new/to/you	other/sub/am/new/to/you
+	EOF
+	git fast-import <input &&
+	git diff-tree -M -r M3^ M3 >actual &&
+	compare_diff_raw expect actual
+'
 
-cat >input <<INPUT_END
-commit refs/heads/M4
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-rename root
-COMMIT
+test_expect_success 'M: rename root to subdirectory' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/M4
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	rename root
+	COMMIT
 
-from refs/heads/M2^0
-R "" sub
+	from refs/heads/M2^0
+	R "" sub
 
-INPUT_END
+	INPUT_END
 
-cat >expect <<EOF
-:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 R100	file2/oldf	sub/file2/oldf
-:100755 100755 85df50785d62d3b05ab03d9cbf7e4a0b49449730 85df50785d62d3b05ab03d9cbf7e4a0b49449730 R100	file4	sub/file4
-:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100	i/am/new/to/you	sub/i/am/new/to/you
-:100755 100755 e74b7d465e52746be2b4bae983670711e6e66657 e74b7d465e52746be2b4bae983670711e6e66657 R100	newdir/exec.sh	sub/newdir/exec.sh
-:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 R100	newdir/interesting	sub/newdir/interesting
-EOF
-test_expect_success \
-	'M: rename root to subdirectory' \
-	'git fast-import <input &&
-	 git diff-tree -M -r M4^ M4 >actual &&
-	 cat actual &&
-	 compare_diff_raw expect actual'
+	cat >expect <<-EOF &&
+	:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 R100	file2/oldf	sub/file2/oldf
+	:100755 100755 85df50785d62d3b05ab03d9cbf7e4a0b49449730 85df50785d62d3b05ab03d9cbf7e4a0b49449730 R100	file4	sub/file4
+	:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100	i/am/new/to/you	sub/i/am/new/to/you
+	:100755 100755 e74b7d465e52746be2b4bae983670711e6e66657 e74b7d465e52746be2b4bae983670711e6e66657 R100	newdir/exec.sh	sub/newdir/exec.sh
+	:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 R100	newdir/interesting	sub/newdir/interesting
+	EOF
+	git fast-import <input &&
+	git diff-tree -M -r M4^ M4 >actual &&
+	cat actual &&
+	compare_diff_raw expect actual
+'
 
 ###
 ### series N
 ###
 
-test_tick
-cat >input <<INPUT_END
-commit refs/heads/N1
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-file copy
-COMMIT
+test_expect_success 'N: copy file in same subdirectory' '
+	test_tick &&
+	cat >input <<-INPUT_END &&
+	commit refs/heads/N1
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	file copy
+	COMMIT
 
-from refs/heads/branch^0
-C file2/newf file2/n.e.w.f
+	from refs/heads/branch^0
+	C file2/newf file2/n.e.w.f
 
-INPUT_END
+	INPUT_END
 
-cat >expect <<EOF
-:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100	file2/newf	file2/n.e.w.f
-EOF
-test_expect_success \
-	'N: copy file in same subdirectory' \
-	'git fast-import <input &&
-	 git diff-tree -C --find-copies-harder -r N1^ N1 >actual &&
-	 compare_diff_raw expect actual'
+	cat >expect <<-EOF &&
+	:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100	file2/newf	file2/n.e.w.f
+	EOF
+	git fast-import <input &&
+	git diff-tree -C --find-copies-harder -r N1^ N1 >actual &&
+	compare_diff_raw expect actual
+'
 
-cat >input <<INPUT_END
-commit refs/heads/N2
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-clean directory copy
-COMMIT
+test_expect_success 'N: copy then modify subdirectory' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/N2
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	clean directory copy
+	COMMIT
 
-from refs/heads/branch^0
-C file2 file3
+	from refs/heads/branch^0
+	C file2 file3
 
-commit refs/heads/N2
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-modify directory copy
-COMMIT
+	commit refs/heads/N2
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	modify directory copy
+	COMMIT
 
-M 644 inline file3/file5
-data <<EOF
-$file5_data
-EOF
+	M 644 inline file3/file5
+	data <<EOF
+	$file5_data
+	EOF
 
-INPUT_END
+	INPUT_END
 
-cat >expect <<EOF
-:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 C100	newdir/interesting	file3/file5
-:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100	file2/newf	file3/newf
-:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100	file2/oldf	file3/oldf
-EOF
-test_expect_success \
-	'N: copy then modify subdirectory' \
-	'git fast-import <input &&
-	 git diff-tree -C --find-copies-harder -r N2^^ N2 >actual &&
-	 compare_diff_raw expect actual'
-
-cat >input <<INPUT_END
-commit refs/heads/N3
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-dirty directory copy
-COMMIT
-
-from refs/heads/branch^0
-M 644 inline file2/file5
-data <<EOF
-$file5_data
-EOF
-
-C file2 file3
-D file2/file5
-
-INPUT_END
-
-test_expect_success \
-	'N: copy dirty subdirectory' \
-	'git fast-import <input &&
-	 test `git rev-parse N2^{tree}` = `git rev-parse N3^{tree}`'
-
-test_expect_success \
-	'N: copy directory by id' \
-	'cat >expect <<-\EOF &&
+	cat >expect <<-EOF &&
+	:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 C100	newdir/interesting	file3/file5
 	:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100	file2/newf	file3/newf
 	:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100	file2/oldf	file3/oldf
 	EOF
-	 subdir=$(git rev-parse refs/heads/branch^0:file2) &&
-	 cat >input <<-INPUT_END &&
+	git fast-import <input &&
+	git diff-tree -C --find-copies-harder -r N2^^ N2 >actual &&
+	compare_diff_raw expect actual
+'
+
+test_expect_success 'N: copy dirty subdirectory' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/N3
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	dirty directory copy
+	COMMIT
+
+	from refs/heads/branch^0
+	M 644 inline file2/file5
+	data <<EOF
+	$file5_data
+	EOF
+
+	C file2 file3
+	D file2/file5
+
+	INPUT_END
+
+	git fast-import <input &&
+	test `git rev-parse N2^{tree}` = `git rev-parse N3^{tree}`
+'
+
+test_expect_success 'N: copy directory by id' '
+	cat >expect <<-\EOF &&
+	:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100	file2/newf	file3/newf
+	:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100	file2/oldf	file3/oldf
+	EOF
+	subdir=$(git rev-parse refs/heads/branch^0:file2) &&
+	cat >input <<-INPUT_END &&
 	commit refs/heads/N4
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1127,9 +1125,10 @@
 	from refs/heads/branch^0
 	M 040000 $subdir file3
 	INPUT_END
-	 git fast-import <input &&
-	 git diff-tree -C --find-copies-harder -r N4^ N4 >actual &&
-	 compare_diff_raw expect actual'
+	git fast-import <input &&
+	git diff-tree -C --find-copies-harder -r N4^ N4 >actual &&
+	compare_diff_raw expect actual
+'
 
 test_expect_success PIPE 'N: read and copy directory' '
 	cat >expect <<-\EOF &&
@@ -1202,14 +1201,13 @@
 	test_cmp expect actual
 '
 
-test_expect_success \
-	'N: copy root directory by tree hash' \
-	'cat >expect <<-\EOF &&
+test_expect_success 'N: copy root directory by tree hash' '
+	cat >expect <<-\EOF &&
 	:100755 000000 f1fb5da718392694d0076d677d6d0e364c79b0bc 0000000000000000000000000000000000000000 D	file3/newf
 	:100644 000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 0000000000000000000000000000000000000000 D	file3/oldf
 	EOF
-	 root=$(git rev-parse refs/heads/branch^0^{tree}) &&
-	 cat >input <<-INPUT_END &&
+	root=$(git rev-parse refs/heads/branch^0^{tree}) &&
+	cat >input <<-INPUT_END &&
 	commit refs/heads/N6
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1219,20 +1217,20 @@
 	from refs/heads/branch^0
 	M 040000 $root ""
 	INPUT_END
-	 git fast-import <input &&
-	 git diff-tree -C --find-copies-harder -r N4 N6 >actual &&
-	 compare_diff_raw expect actual'
+	git fast-import <input &&
+	git diff-tree -C --find-copies-harder -r N4 N6 >actual &&
+	compare_diff_raw expect actual
+'
 
-test_expect_success \
-	'N: copy root by path' \
-	'cat >expect <<-\EOF &&
+test_expect_success 'N: copy root by path' '
+	cat >expect <<-\EOF &&
 	:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100	file2/newf	oldroot/file2/newf
 	:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100	file2/oldf	oldroot/file2/oldf
 	:100755 100755 85df50785d62d3b05ab03d9cbf7e4a0b49449730 85df50785d62d3b05ab03d9cbf7e4a0b49449730 C100	file4	oldroot/file4
 	:100755 100755 e74b7d465e52746be2b4bae983670711e6e66657 e74b7d465e52746be2b4bae983670711e6e66657 C100	newdir/exec.sh	oldroot/newdir/exec.sh
 	:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 C100	newdir/interesting	oldroot/newdir/interesting
 	EOF
-	 cat >input <<-INPUT_END &&
+	cat >input <<-INPUT_END &&
 	commit refs/heads/N-copy-root-path
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1242,21 +1240,21 @@
 	from refs/heads/branch^0
 	C "" oldroot
 	INPUT_END
-	 git fast-import <input &&
-	 git diff-tree -C --find-copies-harder -r branch N-copy-root-path >actual &&
-	 compare_diff_raw expect actual'
+	git fast-import <input &&
+	git diff-tree -C --find-copies-harder -r branch N-copy-root-path >actual &&
+	compare_diff_raw expect actual
+'
 
-test_expect_success \
-	'N: delete directory by copying' \
-	'cat >expect <<-\EOF &&
+test_expect_success 'N: delete directory by copying' '
+	cat >expect <<-\EOF &&
 	OBJID
 	:100644 000000 OBJID OBJID D	foo/bar/qux
 	OBJID
 	:000000 100644 OBJID OBJID A	foo/bar/baz
 	:000000 100644 OBJID OBJID A	foo/bar/qux
 	EOF
-	 empty_tree=$(git mktree </dev/null) &&
-	 cat >input <<-INPUT_END &&
+	empty_tree=$(git mktree </dev/null) &&
+	cat >input <<-INPUT_END &&
 	commit refs/heads/N-delete
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1282,21 +1280,21 @@
 
 	M 040000 $empty_tree foo/bar/qux
 	INPUT_END
-	 git fast-import <input &&
-	 git rev-list N-delete |
+	git fast-import <input &&
+	git rev-list N-delete |
 		git diff-tree -r --stdin --root --always |
 		sed -e "s/$_x40/OBJID/g" >actual &&
-	 test_cmp expect actual'
+	test_cmp expect actual
+'
 
-test_expect_success \
-	'N: modify copied tree' \
-	'cat >expect <<-\EOF &&
+test_expect_success 'N: modify copied tree' '
+	cat >expect <<-\EOF &&
 	:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 C100	newdir/interesting	file3/file5
 	:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100	file2/newf	file3/newf
 	:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100	file2/oldf	file3/oldf
 	EOF
-	 subdir=$(git rev-parse refs/heads/branch^0:file2) &&
-	 cat >input <<-INPUT_END &&
+	subdir=$(git rev-parse refs/heads/branch^0:file2) &&
+	cat >input <<-INPUT_END &&
 	commit refs/heads/N5
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1317,14 +1315,14 @@
 	$file5_data
 	EOF
 	INPUT_END
-	 git fast-import <input &&
-	 git diff-tree -C --find-copies-harder -r N5^^ N5 >actual &&
-	 compare_diff_raw expect actual'
+	git fast-import <input &&
+	git diff-tree -C --find-copies-harder -r N5^^ N5 >actual &&
+	compare_diff_raw expect actual
+'
 
-test_expect_success \
-	'N: reject foo/ syntax' \
-	'subdir=$(git rev-parse refs/heads/branch^0:file2) &&
-	 test_must_fail git fast-import <<-INPUT_END
+test_expect_success 'N: reject foo/ syntax' '
+	subdir=$(git rev-parse refs/heads/branch^0:file2) &&
+	test_must_fail git fast-import <<-INPUT_END
 	commit refs/heads/N5B
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1333,11 +1331,11 @@
 
 	from refs/heads/branch^0
 	M 040000 $subdir file3/
-	INPUT_END'
+	INPUT_END
+'
 
-test_expect_success \
-	'N: reject foo/ syntax in copy source' \
-	'test_must_fail git fast-import <<-INPUT_END
+test_expect_success 'N: reject foo/ syntax in copy source' '
+	test_must_fail git fast-import <<-INPUT_END
 	commit refs/heads/N5C
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1346,11 +1344,11 @@
 
 	from refs/heads/branch^0
 	C file2/ file3
-	INPUT_END'
+	INPUT_END
+'
 
-test_expect_success \
-	'N: reject foo/ syntax in rename source' \
-	'test_must_fail git fast-import <<-INPUT_END
+test_expect_success 'N: reject foo/ syntax in rename source' '
+	test_must_fail git fast-import <<-INPUT_END
 	commit refs/heads/N5D
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1359,11 +1357,11 @@
 
 	from refs/heads/branch^0
 	R file2/ file3
-	INPUT_END'
+	INPUT_END
+'
 
-test_expect_success \
-	'N: reject foo/ syntax in ls argument' \
-	'test_must_fail git fast-import <<-INPUT_END
+test_expect_success 'N: reject foo/ syntax in ls argument' '
+	test_must_fail git fast-import <<-INPUT_END
 	commit refs/heads/N5E
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1372,13 +1370,13 @@
 
 	from refs/heads/branch^0
 	ls "file2/"
-	INPUT_END'
+	INPUT_END
+'
 
-test_expect_success \
-	'N: copy to root by id and modify' \
-	'echo "hello, world" >expect.foo &&
-	 echo hello >expect.bar &&
-	 git fast-import <<-SETUP_END &&
+test_expect_success 'N: copy to root by id and modify' '
+	echo "hello, world" >expect.foo &&
+	echo hello >expect.bar &&
+	git fast-import <<-SETUP_END &&
 	commit refs/heads/N7
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1392,8 +1390,8 @@
 	EOF
 	SETUP_END
 
-	 tree=$(git rev-parse --verify N7:) &&
-	 git fast-import <<-INPUT_END &&
+	tree=$(git rev-parse --verify N7:) &&
+	git fast-import <<-INPUT_END &&
 	commit refs/heads/N8
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1406,15 +1404,15 @@
 	hello, world
 	EOF
 	INPUT_END
-	 git show N8:foo/foo >actual.foo &&
-	 git show N8:foo/bar >actual.bar &&
-	 test_cmp expect.foo actual.foo &&
-	 test_cmp expect.bar actual.bar'
+	git show N8:foo/foo >actual.foo &&
+	git show N8:foo/bar >actual.bar &&
+	test_cmp expect.foo actual.foo &&
+	test_cmp expect.bar actual.bar
+'
 
-test_expect_success \
-	'N: extract subtree' \
-	'branch=$(git rev-parse --verify refs/heads/branch^{tree}) &&
-	 cat >input <<-INPUT_END &&
+test_expect_success 'N: extract subtree' '
+	branch=$(git rev-parse --verify refs/heads/branch^{tree}) &&
+	cat >input <<-INPUT_END &&
 	commit refs/heads/N9
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1424,14 +1422,14 @@
 	M 040000 $branch ""
 	C "newdir" ""
 	INPUT_END
-	 git fast-import <input &&
-	 git diff --exit-code branch:newdir N9'
+	git fast-import <input &&
+	git diff --exit-code branch:newdir N9
+'
 
-test_expect_success \
-	'N: modify subtree, extract it, and modify again' \
-	'echo hello >expect.baz &&
-	 echo hello, world >expect.qux &&
-	 git fast-import <<-SETUP_END &&
+test_expect_success 'N: modify subtree, extract it, and modify again' '
+	echo hello >expect.baz &&
+	echo hello, world >expect.qux &&
+	git fast-import <<-SETUP_END &&
 	commit refs/heads/N10
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1445,8 +1443,8 @@
 	EOF
 	SETUP_END
 
-	 tree=$(git rev-parse --verify N10:) &&
-	 git fast-import <<-INPUT_END &&
+	tree=$(git rev-parse --verify N10:) &&
+	git fast-import <<-INPUT_END &&
 	commit refs/heads/N11
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 	data <<COMMIT
@@ -1461,676 +1459,692 @@
 	R "foo" ""
 	C "bar/qux" "bar/quux"
 	INPUT_END
-	 git show N11:bar/baz >actual.baz &&
-	 git show N11:bar/qux >actual.qux &&
-	 git show N11:bar/quux >actual.quux &&
-	 test_cmp expect.baz actual.baz &&
-	 test_cmp expect.qux actual.qux &&
-	 test_cmp expect.qux actual.quux'
+	git show N11:bar/baz >actual.baz &&
+	git show N11:bar/qux >actual.qux &&
+	git show N11:bar/quux >actual.quux &&
+	test_cmp expect.baz actual.baz &&
+	test_cmp expect.qux actual.qux &&
+	test_cmp expect.qux actual.quux'
 
 ###
 ### series O
 ###
 
-cat >input <<INPUT_END
-#we will
-commit refs/heads/O1
-# -- ignore all of this text
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-# $GIT_COMMITTER_NAME has inserted here for his benefit.
-data <<COMMIT
-dirty directory copy
-COMMIT
+test_expect_success 'O: comments are all skipped' '
+	cat >input <<-INPUT_END &&
+	#we will
+	commit refs/heads/O1
+	# -- ignore all of this text
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	# $GIT_COMMITTER_NAME has inserted here for his benefit.
+	data <<COMMIT
+	dirty directory copy
+	COMMIT
 
-# don't forget the import blank line!
-#
-# yes, we started from our usual base of branch^0.
-# i like branch^0.
-from refs/heads/branch^0
-# and we need to reuse file2/file5 from N3 above.
-M 644 inline file2/file5
-# otherwise the tree will be different
-data <<EOF
-$file5_data
-EOF
+	# do not forget the import blank line!
+	#
+	# yes, we started from our usual base of branch^0.
+	# i like branch^0.
+	from refs/heads/branch^0
+	# and we need to reuse file2/file5 from N3 above.
+	M 644 inline file2/file5
+	# otherwise the tree will be different
+	data <<EOF
+	$file5_data
+	EOF
 
-# don't forget to copy file2 to file3
-C file2 file3
-#
-# or to delete file5 from file2.
-D file2/file5
-# are we done yet?
+	# do not forget to copy file2 to file3
+	C file2 file3
+	#
+	# or to delete file5 from file2.
+	D file2/file5
+	# are we done yet?
 
-INPUT_END
+	INPUT_END
 
-test_expect_success \
-	'O: comments are all skipped' \
-	'git fast-import <input &&
-	 test `git rev-parse N3` = `git rev-parse O1`'
+	git fast-import <input &&
+	test `git rev-parse N3` = `git rev-parse O1`
+'
 
-cat >input <<INPUT_END
-commit refs/heads/O2
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-dirty directory copy
-COMMIT
-from refs/heads/branch^0
-M 644 inline file2/file5
-data <<EOF
-$file5_data
-EOF
-C file2 file3
-D file2/file5
+test_expect_success 'O: blank lines not necessary after data commands' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/O2
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	dirty directory copy
+	COMMIT
+	from refs/heads/branch^0
+	M 644 inline file2/file5
+	data <<EOF
+	$file5_data
+	EOF
+	C file2 file3
+	D file2/file5
 
-INPUT_END
+	INPUT_END
 
-test_expect_success \
-	'O: blank lines not necessary after data commands' \
-	'git fast-import <input &&
-	 test `git rev-parse N3` = `git rev-parse O2`'
+	git fast-import <input &&
+	test `git rev-parse N3` = `git rev-parse O2`
+'
 
-test_expect_success \
-	'O: repack before next test' \
-	'git repack -a -d'
+test_expect_success 'O: repack before next test' '
+	git repack -a -d
+'
 
-cat >input <<INPUT_END
-commit refs/heads/O3
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-zstring
-COMMIT
-commit refs/heads/O3
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-zof
-COMMIT
-checkpoint
-commit refs/heads/O3
-mark :5
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-zempty
-COMMIT
-checkpoint
-commit refs/heads/O3
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-zcommits
-COMMIT
-reset refs/tags/O3-2nd
-from :5
-reset refs/tags/O3-3rd
-from :5
-INPUT_END
+test_expect_success 'O: blank lines not necessary after other commands' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/O3
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	zstring
+	COMMIT
+	commit refs/heads/O3
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	zof
+	COMMIT
+	checkpoint
+	commit refs/heads/O3
+	mark :5
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	zempty
+	COMMIT
+	checkpoint
+	commit refs/heads/O3
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	zcommits
+	COMMIT
+	reset refs/tags/O3-2nd
+	from :5
+	reset refs/tags/O3-3rd
+	from :5
+	INPUT_END
 
-cat >expect <<INPUT_END
-string
-of
-empty
-commits
-INPUT_END
-test_expect_success \
-	'O: blank lines not necessary after other commands' \
-	'git fast-import <input &&
-	 test 8 = `find .git/objects/pack -type f | wc -l` &&
-	 test `git rev-parse refs/tags/O3-2nd` = `git rev-parse O3^` &&
-	 git log --reverse --pretty=oneline O3 | sed s/^.*z// >actual &&
-	 test_cmp expect actual'
+	cat >expect <<-INPUT_END &&
+	string
+	of
+	empty
+	commits
+	INPUT_END
 
-cat >input <<INPUT_END
-commit refs/heads/O4
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-zstring
-COMMIT
-commit refs/heads/O4
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-zof
-COMMIT
-progress Two commits down, 2 to go!
-commit refs/heads/O4
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-zempty
-COMMIT
-progress Three commits down, 1 to go!
-commit refs/heads/O4
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-zcommits
-COMMIT
-progress I'm done!
-INPUT_END
-test_expect_success \
-	'O: progress outputs as requested by input' \
-	'git fast-import <input >actual &&
-	 grep "progress " <input >expect &&
-	 test_cmp expect actual'
+	git fast-import <input &&
+	test 8 = `find .git/objects/pack -type f | wc -l` &&
+	test `git rev-parse refs/tags/O3-2nd` = `git rev-parse O3^` &&
+	git log --reverse --pretty=oneline O3 | sed s/^.*z// >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'O: progress outputs as requested by input' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/O4
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	zstring
+	COMMIT
+	commit refs/heads/O4
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	zof
+	COMMIT
+	progress Two commits down, 2 to go!
+	commit refs/heads/O4
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	zempty
+	COMMIT
+	progress Three commits down, 1 to go!
+	commit refs/heads/O4
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	zcommits
+	COMMIT
+	progress done!
+	INPUT_END
+	git fast-import <input >actual &&
+	grep "progress " <input >expect &&
+	test_cmp expect actual
+'
 
 ###
 ### series P (gitlinks)
 ###
 
-cat >input <<INPUT_END
-blob
-mark :1
-data 10
-test file
+test_expect_success 'P: superproject & submodule mix' '
+	cat >input <<-INPUT_END &&
+	blob
+	mark :1
+	data 10
+	test file
 
-reset refs/heads/sub
-commit refs/heads/sub
-mark :2
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data 12
-sub_initial
-M 100644 :1 file
+	reset refs/heads/sub
+	commit refs/heads/sub
+	mark :2
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data 12
+	sub_initial
+	M 100644 :1 file
 
-blob
-mark :3
-data <<DATAEND
-[submodule "sub"]
-	path = sub
-	url = "`pwd`/sub"
-DATAEND
+	blob
+	mark :3
+	data <<DATAEND
+	[submodule "sub"]
+		path = sub
+		url = "`pwd`/sub"
+	DATAEND
 
-commit refs/heads/subuse1
-mark :4
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data 8
-initial
-from refs/heads/master
-M 100644 :3 .gitmodules
-M 160000 :2 sub
+	commit refs/heads/subuse1
+	mark :4
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data 8
+	initial
+	from refs/heads/master
+	M 100644 :3 .gitmodules
+	M 160000 :2 sub
 
-blob
-mark :5
-data 20
-test file
-more data
+	blob
+	mark :5
+	data 20
+	test file
+	more data
 
-commit refs/heads/sub
-mark :6
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data 11
-sub_second
-from :2
-M 100644 :5 file
+	commit refs/heads/sub
+	mark :6
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data 11
+	sub_second
+	from :2
+	M 100644 :5 file
 
-commit refs/heads/subuse1
-mark :7
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data 7
-second
-from :4
-M 160000 :6 sub
+	commit refs/heads/subuse1
+	mark :7
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data 7
+	second
+	from :4
+	M 160000 :6 sub
 
-INPUT_END
+	INPUT_END
 
-test_expect_success \
-	'P: superproject & submodule mix' \
-	'git fast-import <input &&
-	 git checkout subuse1 &&
-	 rm -rf sub && mkdir sub && (cd sub &&
-	 git init &&
-	 git fetch --update-head-ok .. refs/heads/sub:refs/heads/master &&
-	 git checkout master) &&
-	 git submodule init &&
-	 git submodule update'
+	git fast-import <input &&
+	git checkout subuse1 &&
+	rm -rf sub &&
+	mkdir sub &&
+	(
+		cd sub &&
+		git init &&
+		git fetch --update-head-ok .. refs/heads/sub:refs/heads/master &&
+		git checkout master
+	) &&
+	git submodule init &&
+	git submodule update
+'
 
-SUBLAST=$(git rev-parse --verify sub)
-SUBPREV=$(git rev-parse --verify sub^)
+test_expect_success 'P: verbatim SHA gitlinks' '
+	SUBLAST=$(git rev-parse --verify sub) &&
+	SUBPREV=$(git rev-parse --verify sub^) &&
 
-cat >input <<INPUT_END
-blob
-mark :1
-data <<DATAEND
-[submodule "sub"]
-	path = sub
-	url = "`pwd`/sub"
-DATAEND
+	cat >input <<-INPUT_END &&
+	blob
+	mark :1
+	data <<DATAEND
+	[submodule "sub"]
+		path = sub
+		url = "`pwd`/sub"
+	DATAEND
 
-commit refs/heads/subuse2
-mark :2
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data 8
-initial
-from refs/heads/master
-M 100644 :1 .gitmodules
-M 160000 $SUBPREV sub
+	commit refs/heads/subuse2
+	mark :2
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data 8
+	initial
+	from refs/heads/master
+	M 100644 :1 .gitmodules
+	M 160000 $SUBPREV sub
 
-commit refs/heads/subuse2
-mark :3
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data 7
-second
-from :2
-M 160000 $SUBLAST sub
+	commit refs/heads/subuse2
+	mark :3
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data 7
+	second
+	from :2
+	M 160000 $SUBLAST sub
 
-INPUT_END
+	INPUT_END
 
-test_expect_success \
-	'P: verbatim SHA gitlinks' \
-	'git branch -D sub &&
-	 git gc && git prune &&
-	 git fast-import <input &&
-	 test $(git rev-parse --verify subuse2) = $(git rev-parse --verify subuse1)'
-
-test_tick
-cat >input <<INPUT_END
-commit refs/heads/subuse3
-mark :1
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-corrupt
-COMMIT
-
-from refs/heads/subuse2
-M 160000 inline sub
-data <<DATA
-$SUBPREV
-DATA
-
-INPUT_END
+	git branch -D sub &&
+	git gc &&
+	git prune &&
+	git fast-import <input &&
+	test $(git rev-parse --verify subuse2) = $(git rev-parse --verify subuse1)
+'
 
 test_expect_success 'P: fail on inline gitlink' '
-    test_must_fail git fast-import <input'
+	test_tick &&
+	cat >input <<-INPUT_END &&
+	commit refs/heads/subuse3
+	mark :1
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	corrupt
+	COMMIT
 
-test_tick
-cat >input <<INPUT_END
-blob
-mark :1
-data <<DATA
-$SUBPREV
-DATA
+	from refs/heads/subuse2
+	M 160000 inline sub
+	data <<DATA
+	$SUBPREV
+	DATA
 
-commit refs/heads/subuse3
-mark :2
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-corrupt
-COMMIT
+	INPUT_END
 
-from refs/heads/subuse2
-M 160000 :1 sub
-
-INPUT_END
+	test_must_fail git fast-import <input
+'
 
 test_expect_success 'P: fail on blob mark in gitlink' '
-    test_must_fail git fast-import <input'
+	test_tick &&
+	cat >input <<-INPUT_END &&
+	blob
+	mark :1
+	data <<DATA
+	$SUBPREV
+	DATA
+
+	commit refs/heads/subuse3
+	mark :2
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	corrupt
+	COMMIT
+
+	from refs/heads/subuse2
+	M 160000 :1 sub
+
+	INPUT_END
+
+	test_must_fail git fast-import <input
+'
 
 ###
 ### series Q (notes)
 ###
 
-note1_data="The first note for the first commit"
-note2_data="The first note for the second commit"
-note3_data="The first note for the third commit"
-note1b_data="The second note for the first commit"
-note1c_data="The third note for the first commit"
-note2b_data="The second note for the second commit"
+test_expect_success 'Q: commit notes' '
+	note1_data="The first note for the first commit" &&
+	note2_data="The first note for the second commit" &&
+	note3_data="The first note for the third commit" &&
+	note1b_data="The second note for the first commit" &&
+	note1c_data="The third note for the first commit" &&
+	note2b_data="The second note for the second commit" &&
 
-test_tick
-cat >input <<INPUT_END
-blob
-mark :2
-data <<EOF
-$file2_data
-EOF
+	test_tick &&
+	cat >input <<-INPUT_END &&
+	blob
+	mark :2
+	data <<EOF
+	$file2_data
+	EOF
 
-commit refs/heads/notes-test
-mark :3
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-first (:3)
-COMMIT
+	commit refs/heads/notes-test
+	mark :3
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	first (:3)
+	COMMIT
 
-M 644 :2 file2
+	M 644 :2 file2
 
-blob
-mark :4
-data $file4_len
-$file4_data
-commit refs/heads/notes-test
-mark :5
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-second (:5)
-COMMIT
+	blob
+	mark :4
+	data $file4_len
+	$file4_data
+	commit refs/heads/notes-test
+	mark :5
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	second (:5)
+	COMMIT
 
-M 644 :4 file4
+	M 644 :4 file4
 
-commit refs/heads/notes-test
-mark :6
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-third (:6)
-COMMIT
+	commit refs/heads/notes-test
+	mark :6
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	third (:6)
+	COMMIT
 
-M 644 inline file5
-data <<EOF
-$file5_data
-EOF
+	M 644 inline file5
+	data <<EOF
+	$file5_data
+	EOF
 
-M 755 inline file6
-data <<EOF
-$file6_data
-EOF
+	M 755 inline file6
+	data <<EOF
+	$file6_data
+	EOF
 
-blob
-mark :7
-data <<EOF
-$note1_data
-EOF
+	blob
+	mark :7
+	data <<EOF
+	$note1_data
+	EOF
 
-blob
-mark :8
-data <<EOF
-$note2_data
-EOF
+	blob
+	mark :8
+	data <<EOF
+	$note2_data
+	EOF
 
-commit refs/notes/foobar
-mark :9
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-notes (:9)
-COMMIT
+	commit refs/notes/foobar
+	mark :9
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	notes (:9)
+	COMMIT
 
-N :7 :3
-N :8 :5
-N inline :6
-data <<EOF
-$note3_data
-EOF
+	N :7 :3
+	N :8 :5
+	N inline :6
+	data <<EOF
+	$note3_data
+	EOF
 
-commit refs/notes/foobar
-mark :10
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-notes (:10)
-COMMIT
+	commit refs/notes/foobar
+	mark :10
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	notes (:10)
+	COMMIT
 
-N inline :3
-data <<EOF
-$note1b_data
-EOF
+	N inline :3
+	data <<EOF
+	$note1b_data
+	EOF
 
-commit refs/notes/foobar2
-mark :11
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-notes (:11)
-COMMIT
+	commit refs/notes/foobar2
+	mark :11
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	notes (:11)
+	COMMIT
 
-N inline :3
-data <<EOF
-$note1c_data
-EOF
+	N inline :3
+	data <<EOF
+	$note1c_data
+	EOF
 
-commit refs/notes/foobar
-mark :12
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-notes (:12)
-COMMIT
+	commit refs/notes/foobar
+	mark :12
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	notes (:12)
+	COMMIT
 
-deleteall
-N inline :5
-data <<EOF
-$note2b_data
-EOF
+	deleteall
+	N inline :5
+	data <<EOF
+	$note2b_data
+	EOF
 
-INPUT_END
+	INPUT_END
 
-test_expect_success \
-	'Q: commit notes' \
-	'git fast-import <input &&
-	 git whatchanged notes-test'
+	git fast-import <input &&
+	git whatchanged notes-test
+'
 
 test_expect_success 'Q: verify pack' '
 	verify_packs
 '
 
-commit1=$(git rev-parse notes-test~2)
-commit2=$(git rev-parse notes-test^)
-commit3=$(git rev-parse notes-test)
+test_expect_success 'Q: verify first commit' '
+	commit1=$(git rev-parse notes-test~2) &&
+	commit2=$(git rev-parse notes-test^) &&
+	commit3=$(git rev-parse notes-test) &&
 
-cat >expect <<EOF
-author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	cat >expect <<-EOF &&
+	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 
-first (:3)
-EOF
-test_expect_success \
-	'Q: verify first commit' \
-	'git cat-file commit notes-test~2 | sed 1d >actual &&
-	test_cmp expect actual'
+	first (:3)
+	EOF
+	git cat-file commit notes-test~2 | sed 1d >actual &&
+	test_cmp expect actual
+'
 
-cat >expect <<EOF
-parent $commit1
-author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+test_expect_success 'Q: verify second commit' '
+	cat >expect <<-EOF &&
+	parent $commit1
+	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 
-second (:5)
-EOF
-test_expect_success \
-	'Q: verify second commit' \
-	'git cat-file commit notes-test^ | sed 1d >actual &&
-	test_cmp expect actual'
+	second (:5)
+	EOF
+	git cat-file commit notes-test^ | sed 1d >actual &&
+	test_cmp expect actual
+'
 
-cat >expect <<EOF
-parent $commit2
-author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+test_expect_success 'Q: verify third commit' '
+	cat >expect <<-EOF &&
+	parent $commit2
+	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 
-third (:6)
-EOF
-test_expect_success \
-	'Q: verify third commit' \
-	'git cat-file commit notes-test | sed 1d >actual &&
-	test_cmp expect actual'
+	third (:6)
+	EOF
+	git cat-file commit notes-test | sed 1d >actual &&
+	test_cmp expect actual
+'
 
-cat >expect <<EOF
-author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+test_expect_success 'Q: verify first notes commit' '
+	cat >expect <<-EOF &&
+	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 
-notes (:9)
-EOF
-test_expect_success \
-	'Q: verify first notes commit' \
-	'git cat-file commit refs/notes/foobar~2 | sed 1d >actual &&
-	test_cmp expect actual'
+	notes (:9)
+	EOF
+	git cat-file commit refs/notes/foobar~2 | sed 1d >actual &&
+	test_cmp expect actual
+'
 
-cat >expect.unsorted <<EOF
-100644 blob $commit1
-100644 blob $commit2
-100644 blob $commit3
-EOF
-cat expect.unsorted | sort >expect
-test_expect_success \
-	'Q: verify first notes tree' \
-	'git cat-file -p refs/notes/foobar~2^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
-	 test_cmp expect actual'
+test_expect_success 'Q: verify first notes tree' '
+	cat >expect.unsorted <<-EOF &&
+	100644 blob $commit1
+	100644 blob $commit2
+	100644 blob $commit3
+	EOF
+	cat expect.unsorted | sort >expect &&
+	git cat-file -p refs/notes/foobar~2^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
+	test_cmp expect actual
+'
 
-echo "$note1_data" >expect
-test_expect_success \
-	'Q: verify first note for first commit' \
-	'git cat-file blob refs/notes/foobar~2:$commit1 >actual && test_cmp expect actual'
+test_expect_success 'Q: verify first note for first commit' '
+	echo "$note1_data" >expect &&
+	git cat-file blob refs/notes/foobar~2:$commit1 >actual &&
+	test_cmp expect actual
+'
 
-echo "$note2_data" >expect
-test_expect_success \
-	'Q: verify first note for second commit' \
-	'git cat-file blob refs/notes/foobar~2:$commit2 >actual && test_cmp expect actual'
+test_expect_success 'Q: verify first note for second commit' '
+	echo "$note2_data" >expect &&
+	git cat-file blob refs/notes/foobar~2:$commit2 >actual &&
+	test_cmp expect actual
+'
 
-echo "$note3_data" >expect
-test_expect_success \
-	'Q: verify first note for third commit' \
-	'git cat-file blob refs/notes/foobar~2:$commit3 >actual && test_cmp expect actual'
+test_expect_success 'Q: verify first note for third commit' '
+	echo "$note3_data" >expect &&
+	git cat-file blob refs/notes/foobar~2:$commit3 >actual &&
+	test_cmp expect actual
+'
 
-cat >expect <<EOF
-parent `git rev-parse --verify refs/notes/foobar~2`
-author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+test_expect_success 'Q: verify second notes commit' '
+	cat >expect <<-EOF &&
+	parent `git rev-parse --verify refs/notes/foobar~2`
+	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 
-notes (:10)
-EOF
-test_expect_success \
-	'Q: verify second notes commit' \
-	'git cat-file commit refs/notes/foobar^ | sed 1d >actual &&
-	test_cmp expect actual'
+	notes (:10)
+	EOF
+	git cat-file commit refs/notes/foobar^ | sed 1d >actual &&
+	test_cmp expect actual
+'
 
-cat >expect.unsorted <<EOF
-100644 blob $commit1
-100644 blob $commit2
-100644 blob $commit3
-EOF
-cat expect.unsorted | sort >expect
-test_expect_success \
-	'Q: verify second notes tree' \
-	'git cat-file -p refs/notes/foobar^^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
-	 test_cmp expect actual'
+test_expect_success 'Q: verify second notes tree' '
+	cat >expect.unsorted <<-EOF &&
+	100644 blob $commit1
+	100644 blob $commit2
+	100644 blob $commit3
+	EOF
+	cat expect.unsorted | sort >expect &&
+	git cat-file -p refs/notes/foobar^^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
+	test_cmp expect actual
+'
 
-echo "$note1b_data" >expect
-test_expect_success \
-	'Q: verify second note for first commit' \
-	'git cat-file blob refs/notes/foobar^:$commit1 >actual && test_cmp expect actual'
+test_expect_success 'Q: verify second note for first commit' '
+	echo "$note1b_data" >expect &&
+	git cat-file blob refs/notes/foobar^:$commit1 >actual &&
+	test_cmp expect actual
+'
 
-echo "$note2_data" >expect
-test_expect_success \
-	'Q: verify first note for second commit' \
-	'git cat-file blob refs/notes/foobar^:$commit2 >actual && test_cmp expect actual'
+test_expect_success 'Q: verify first note for second commit' '
+	echo "$note2_data" >expect &&
+	git cat-file blob refs/notes/foobar^:$commit2 >actual &&
+	test_cmp expect actual
+'
 
-echo "$note3_data" >expect
-test_expect_success \
-	'Q: verify first note for third commit' \
-	'git cat-file blob refs/notes/foobar^:$commit3 >actual && test_cmp expect actual'
+test_expect_success 'Q: verify first note for third commit' '
+	echo "$note3_data" >expect &&
+	git cat-file blob refs/notes/foobar^:$commit3 >actual &&
+	test_cmp expect actual
+'
 
-cat >expect <<EOF
-author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+test_expect_success 'Q: verify third notes commit' '
+	cat >expect <<-EOF &&
+	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 
-notes (:11)
-EOF
-test_expect_success \
-	'Q: verify third notes commit' \
-	'git cat-file commit refs/notes/foobar2 | sed 1d >actual &&
-	test_cmp expect actual'
+	notes (:11)
+	EOF
+	git cat-file commit refs/notes/foobar2 | sed 1d >actual &&
+	test_cmp expect actual
+'
 
-cat >expect.unsorted <<EOF
-100644 blob $commit1
-EOF
-cat expect.unsorted | sort >expect
-test_expect_success \
-	'Q: verify third notes tree' \
-	'git cat-file -p refs/notes/foobar2^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
-	 test_cmp expect actual'
+test_expect_success 'Q: verify third notes tree' '
+	cat >expect.unsorted <<-EOF &&
+	100644 blob $commit1
+	EOF
+	cat expect.unsorted | sort >expect &&
+	git cat-file -p refs/notes/foobar2^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
+	test_cmp expect actual
+'
 
-echo "$note1c_data" >expect
-test_expect_success \
-	'Q: verify third note for first commit' \
-	'git cat-file blob refs/notes/foobar2:$commit1 >actual && test_cmp expect actual'
+test_expect_success 'Q: verify third note for first commit' '
+	echo "$note1c_data" >expect &&
+	git cat-file blob refs/notes/foobar2:$commit1 >actual &&
+	test_cmp expect actual
+'
 
-cat >expect <<EOF
-parent `git rev-parse --verify refs/notes/foobar^`
-author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+test_expect_success 'Q: verify fourth notes commit' '
+	cat >expect <<-EOF &&
+	parent `git rev-parse --verify refs/notes/foobar^`
+	author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 
-notes (:12)
-EOF
-test_expect_success \
-	'Q: verify fourth notes commit' \
-	'git cat-file commit refs/notes/foobar | sed 1d >actual &&
-	test_cmp expect actual'
+	notes (:12)
+	EOF
+	git cat-file commit refs/notes/foobar | sed 1d >actual &&
+	test_cmp expect actual
+'
 
-cat >expect.unsorted <<EOF
-100644 blob $commit2
-EOF
-cat expect.unsorted | sort >expect
-test_expect_success \
-	'Q: verify fourth notes tree' \
-	'git cat-file -p refs/notes/foobar^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
-	 test_cmp expect actual'
+test_expect_success 'Q: verify fourth notes tree' '
+	cat >expect.unsorted <<-EOF &&
+	100644 blob $commit2
+	EOF
+	cat expect.unsorted | sort >expect &&
+	git cat-file -p refs/notes/foobar^{tree} | sed "s/ [0-9a-f]*	/ /" >actual &&
+	test_cmp expect actual
+'
 
-echo "$note2b_data" >expect
-test_expect_success \
-	'Q: verify second note for second commit' \
-	'git cat-file blob refs/notes/foobar:$commit2 >actual && test_cmp expect actual'
+test_expect_success 'Q: verify second note for second commit' '
+	echo "$note2b_data" >expect &&
+	git cat-file blob refs/notes/foobar:$commit2 >actual &&
+	test_cmp expect actual
+'
 
-cat >input <<EOF
-reset refs/heads/Q0
+test_expect_success 'Q: deny note on empty branch' '
+	cat >input <<-EOF &&
+	reset refs/heads/Q0
 
-commit refs/heads/note-Q0
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-Note for an empty branch.
-COMMIT
+	commit refs/heads/note-Q0
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	Note for an empty branch.
+	COMMIT
 
-N inline refs/heads/Q0
-data <<NOTE
-some note
-NOTE
-EOF
-test_expect_success \
-	'Q: deny note on empty branch' \
-	'test_must_fail git fast-import <input'
+	N inline refs/heads/Q0
+	data <<NOTE
+	some note
+	NOTE
+	EOF
+	test_must_fail git fast-import <input
+'
 ###
 ### series R (feature and option)
 ###
 
-cat >input <<EOF
-feature no-such-feature-exists
-EOF
-
 test_expect_success 'R: abort on unsupported feature' '
+	cat >input <<-EOF &&
+	feature no-such-feature-exists
+	EOF
+
 	test_must_fail git fast-import <input
 '
 
-cat >input <<EOF
-feature date-format=now
-EOF
-
 test_expect_success 'R: supported feature is accepted' '
+	cat >input <<-EOF &&
+	feature date-format=now
+	EOF
+
 	git fast-import <input
 '
 
-cat >input << EOF
-blob
-data 3
-hi
-feature date-format=now
-EOF
-
 test_expect_success 'R: abort on receiving feature after data command' '
+	cat >input <<-EOF &&
+	blob
+	data 3
+	hi
+	feature date-format=now
+	EOF
+
 	test_must_fail git fast-import <input
 '
 
-cat >input << EOF
-feature import-marks=git.marks
-feature import-marks=git2.marks
-EOF
-
 test_expect_success 'R: only one import-marks feature allowed per stream' '
+	cat >input <<-EOF &&
+	feature import-marks=git.marks
+	feature import-marks=git2.marks
+	EOF
+
 	test_must_fail git fast-import <input
 '
 
-cat >input << EOF
-feature export-marks=git.marks
-blob
-mark :1
-data 3
-hi
+test_expect_success 'R: export-marks feature results in a marks file being created' '
+	cat >input <<-EOF &&
+	feature export-marks=git.marks
+	blob
+	mark :1
+	data 3
+	hi
 
-EOF
+	EOF
 
-test_expect_success \
-    'R: export-marks feature results in a marks file being created' \
-    'cat input | git fast-import &&
-    grep :1 git.marks'
+	cat input | git fast-import &&
+	grep :1 git.marks
+'
 
-test_expect_success \
-    'R: export-marks options can be overridden by commandline options' \
-    'cat input | git fast-import --export-marks=other.marks &&
-    grep :1 other.marks'
+test_expect_success 'R: export-marks options can be overridden by commandline options' '
+	cat input | git fast-import --export-marks=other.marks &&
+	grep :1 other.marks
+'
 
 test_expect_success 'R: catch typo in marks file name' '
 	test_must_fail git fast-import --import-marks=nonexistent.marks </dev/null &&
@@ -2234,62 +2248,62 @@
 	test_cmp expect io.marks
 '
 
-cat >input << EOF
-feature import-marks=marks.out
-feature export-marks=marks.new
-EOF
+test_expect_success 'R: import to output marks works without any content' '
+	cat >input <<-EOF &&
+	feature import-marks=marks.out
+	feature export-marks=marks.new
+	EOF
 
-test_expect_success \
-    'R: import to output marks works without any content' \
-    'cat input | git fast-import &&
-    test_cmp marks.out marks.new'
+	cat input | git fast-import &&
+	test_cmp marks.out marks.new
+'
 
-cat >input <<EOF
-feature import-marks=nonexistent.marks
-feature export-marks=marks.new
-EOF
+test_expect_success 'R: import marks prefers commandline marks file over the stream' '
+	cat >input <<-EOF &&
+	feature import-marks=nonexistent.marks
+	feature export-marks=marks.new
+	EOF
 
-test_expect_success \
-    'R: import marks prefers commandline marks file over the stream' \
-    'cat input | git fast-import --import-marks=marks.out &&
-    test_cmp marks.out marks.new'
+	cat input | git fast-import --import-marks=marks.out &&
+	test_cmp marks.out marks.new
+'
 
 
-cat >input <<EOF
-feature import-marks=nonexistent.marks
-feature export-marks=combined.marks
-EOF
-
 test_expect_success 'R: multiple --import-marks= should be honoured' '
-    head -n2 marks.out > one.marks &&
-    tail -n +3 marks.out > two.marks &&
-    git fast-import --import-marks=one.marks --import-marks=two.marks <input &&
-    test_cmp marks.out combined.marks
-'
+	cat >input <<-EOF &&
+	feature import-marks=nonexistent.marks
+	feature export-marks=combined.marks
+	EOF
 
-cat >input <<EOF
-feature relative-marks
-feature import-marks=relative.in
-feature export-marks=relative.out
-EOF
+	head -n2 marks.out > one.marks &&
+	tail -n +3 marks.out > two.marks &&
+	git fast-import --import-marks=one.marks --import-marks=two.marks <input &&
+	test_cmp marks.out combined.marks
+'
 
 test_expect_success 'R: feature relative-marks should be honoured' '
-    mkdir -p .git/info/fast-import/ &&
-    cp marks.new .git/info/fast-import/relative.in &&
-    git fast-import <input &&
-    test_cmp marks.new .git/info/fast-import/relative.out
+	cat >input <<-EOF &&
+	feature relative-marks
+	feature import-marks=relative.in
+	feature export-marks=relative.out
+	EOF
+
+	mkdir -p .git/info/fast-import/ &&
+	cp marks.new .git/info/fast-import/relative.in &&
+	git fast-import <input &&
+	test_cmp marks.new .git/info/fast-import/relative.out
 '
 
-cat >input <<EOF
-feature relative-marks
-feature import-marks=relative.in
-feature no-relative-marks
-feature export-marks=non-relative.out
-EOF
-
 test_expect_success 'R: feature no-relative-marks should be honoured' '
-    git fast-import <input &&
-    test_cmp marks.new non-relative.out
+	cat >input <<-EOF &&
+	feature relative-marks
+	feature import-marks=relative.in
+	feature no-relative-marks
+	feature export-marks=non-relative.out
+	EOF
+
+	git fast-import <input &&
+	test_cmp marks.new non-relative.out
 '
 
 test_expect_success 'R: feature ls supported' '
@@ -2330,12 +2344,12 @@
 	cat-blob $blob
 	EOF
 	test_cmp expect actual.3 &&
-	test_cmp empty actual.1 &&
+	test_must_be_empty actual.1 &&
 	git fast-import 3>actual.3 >actual.1 <<-EOF &&
 	option cat-blob-fd=3
 	cat-blob $blob
 	EOF
-	test_cmp empty actual.3 &&
+	test_must_be_empty actual.3 &&
 	test_cmp expect actual.1
 '
 
@@ -2549,17 +2563,17 @@
 	test_cmp expect actual
 '
 
-cat >input << EOF
-option git quiet
-blob
-data 3
-hi
-
-EOF
-
 test_expect_success 'R: quiet option results in no stats being output' '
-    cat input | git fast-import 2> output &&
-    test_cmp empty output
+	cat >input <<-EOF &&
+	option git quiet
+	blob
+	data 3
+	hi
+
+	EOF
+
+	cat input | git fast-import 2> output &&
+	test_must_be_empty output
 '
 
 test_expect_success 'R: feature done means terminating "done" is mandatory' '
@@ -2604,16 +2618,16 @@
 	test_cmp expect actual
 '
 
-cat >input <<EOF
-option git non-existing-option
-EOF
-
 test_expect_success 'R: die on unknown option' '
-    test_must_fail git fast-import <input
+	cat >input <<-EOF &&
+	option git non-existing-option
+	EOF
+
+	test_must_fail git fast-import <input
 '
 
 test_expect_success 'R: unknown commandline options are rejected' '\
-    test_must_fail git fast-import --non-existing-option < /dev/null
+	test_must_fail git fast-import --non-existing-option < /dev/null
 '
 
 test_expect_success 'R: die on invalid option argument' '
@@ -2624,41 +2638,41 @@
 	test_must_fail git fast-import --depth="5 elephants" </dev/null
 '
 
-cat >input <<EOF
-option non-existing-vcs non-existing-option
-EOF
-
 test_expect_success 'R: ignore non-git options' '
-    git fast-import <input
+	cat >input <<-EOF &&
+	option non-existing-vcs non-existing-option
+	EOF
+
+	git fast-import <input
 '
 
 ##
 ## R: very large blobs
 ##
-blobsize=$((2*1024*1024 + 53))
-test-genrandom bar $blobsize >expect
-cat >input <<INPUT_END
-commit refs/heads/big-file
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-R - big file
-COMMIT
+test_expect_success 'R: blob bigger than threshold' '
+	blobsize=$((2*1024*1024 + 53)) &&
+	test-genrandom bar $blobsize >expect &&
+	cat >input <<-INPUT_END &&
+	commit refs/heads/big-file
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	R - big file
+	COMMIT
 
-M 644 inline big1
-data $blobsize
-INPUT_END
-cat expect >>input
-cat >>input <<INPUT_END
-M 644 inline big2
-data $blobsize
-INPUT_END
-cat expect >>input
-echo >>input
+	M 644 inline big1
+	data $blobsize
+	INPUT_END
+	cat expect >>input &&
+	cat >>input <<-INPUT_END &&
+	M 644 inline big2
+	data $blobsize
+	INPUT_END
+	cat expect >>input &&
+	echo >>input &&
 
-test_expect_success \
-	'R: blob bigger than threshold' \
-	'test_create_repo R &&
-	 git --git-dir=R/.git fast-import --big-file-threshold=1 <input'
+	test_create_repo R &&
+	git --git-dir=R/.git fast-import --big-file-threshold=1 <input
+'
 
 test_expect_success 'R: verify created pack' '
 	(
@@ -2667,17 +2681,18 @@
 	)
 '
 
-test_expect_success \
-	'R: verify written objects' \
-	'git --git-dir=R/.git cat-file blob big-file:big1 >actual &&
-	 test_cmp_bin expect actual &&
-	 a=$(git --git-dir=R/.git rev-parse big-file:big1) &&
-	 b=$(git --git-dir=R/.git rev-parse big-file:big2) &&
-	 test $a = $b'
-test_expect_success \
-	'R: blob appears only once' \
-	'n=$(grep $a verify | wc -l) &&
-	 test 1 = $n'
+test_expect_success 'R: verify written objects' '
+	git --git-dir=R/.git cat-file blob big-file:big1 >actual &&
+	test_cmp_bin expect actual &&
+	a=$(git --git-dir=R/.git rev-parse big-file:big1) &&
+	b=$(git --git-dir=R/.git rev-parse big-file:big2) &&
+	test $a = $b
+'
+
+test_expect_success 'R: blob appears only once' '
+	n=$(grep $a verify | wc -l) &&
+	test 1 = $n
+'
 
 ###
 ### series S
@@ -2710,46 +2725,46 @@
 #
 #   Invalid dataref ..
 #
-test_tick
-
-cat >input <<INPUT_END
-commit refs/heads/S
-mark :301
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-commit 1
-COMMIT
-M 100644 inline hello.c
-data <<BLOB
-blob 1
-BLOB
-
-commit refs/heads/S
-mark :302
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-commit 2
-COMMIT
-from :301
-M 100644 inline hello.c
-data <<BLOB
-blob 2
-BLOB
-
-blob
-mark :403
-data <<BLOB
-blob 3
-BLOB
-
-blob
-mark :202
-data <<BLOB
-note 2
-BLOB
-INPUT_END
-
 test_expect_success 'S: initialize for S tests' '
+	test_tick &&
+
+	cat >input <<-INPUT_END &&
+	commit refs/heads/S
+	mark :301
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	commit 1
+	COMMIT
+	M 100644 inline hello.c
+	data <<BLOB
+	blob 1
+	BLOB
+
+	commit refs/heads/S
+	mark :302
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	commit 2
+	COMMIT
+	from :301
+	M 100644 inline hello.c
+	data <<BLOB
+	blob 2
+	BLOB
+
+	blob
+	mark :403
+	data <<BLOB
+	blob 3
+	BLOB
+
+	blob
+	mark :202
+	data <<BLOB
+	note 2
+	BLOB
+	INPUT_END
+
 	git fast-import --export-marks=marks <input
 '
 
@@ -3001,103 +3016,103 @@
 ### series U (filedelete)
 ###
 
-cat >input <<INPUT_END
-commit refs/heads/U
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-test setup
-COMMIT
-M 100644 inline hello.c
-data <<BLOB
-blob 1
-BLOB
-M 100644 inline good/night.txt
-data <<BLOB
-sleep well
-BLOB
-M 100644 inline good/bye.txt
-data <<BLOB
-au revoir
-BLOB
-
-INPUT_END
-
 test_expect_success 'U: initialize for U tests' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/U
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	test setup
+	COMMIT
+	M 100644 inline hello.c
+	data <<BLOB
+	blob 1
+	BLOB
+	M 100644 inline good/night.txt
+	data <<BLOB
+	sleep well
+	BLOB
+	M 100644 inline good/bye.txt
+	data <<BLOB
+	au revoir
+	BLOB
+
+	INPUT_END
+
 	git fast-import <input
 '
 
-cat >input <<INPUT_END
-commit refs/heads/U
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-delete good/night.txt
-COMMIT
-from refs/heads/U^0
-D good/night.txt
-
-INPUT_END
-
 test_expect_success 'U: filedelete file succeeds' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/U
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	delete good/night.txt
+	COMMIT
+	from refs/heads/U^0
+	D good/night.txt
+
+	INPUT_END
+
 	git fast-import <input
 '
 
-cat >expect <<EOF
-:100644 000000 2907ebb4bf85d91bf0716bb3bd8a68ef48d6da76 0000000000000000000000000000000000000000 D	good/night.txt
-EOF
-
-git diff-tree -M -r U^1 U >actual
-
 test_expect_success 'U: validate file delete result' '
+	cat >expect <<-EOF &&
+	:100644 000000 2907ebb4bf85d91bf0716bb3bd8a68ef48d6da76 0000000000000000000000000000000000000000 D	good/night.txt
+	EOF
+
+	git diff-tree -M -r U^1 U >actual &&
+
 	compare_diff_raw expect actual
 '
 
-cat >input <<INPUT_END
-commit refs/heads/U
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-delete good dir
-COMMIT
-from refs/heads/U^0
-D good
-
-INPUT_END
-
 test_expect_success 'U: filedelete directory succeeds' '
+	cat >input <<-INPUT_END &&
+	commit refs/heads/U
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	delete good dir
+	COMMIT
+	from refs/heads/U^0
+	D good
+
+	INPUT_END
+
 	git fast-import <input
 '
 
-cat >expect <<EOF
-:100644 000000 69cb75792f55123d8389c156b0b41c2ff00ed507 0000000000000000000000000000000000000000 D	good/bye.txt
-EOF
-
-git diff-tree -M -r U^1 U >actual
-
 test_expect_success 'U: validate directory delete result' '
+	cat >expect <<-EOF &&
+	:100644 000000 69cb75792f55123d8389c156b0b41c2ff00ed507 0000000000000000000000000000000000000000 D	good/bye.txt
+	EOF
+
+	git diff-tree -M -r U^1 U >actual &&
+
 	compare_diff_raw expect actual
 '
 
-cat >input <<INPUT_END
-commit refs/heads/U
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-must succeed
-COMMIT
-from refs/heads/U^0
-D ""
-
-INPUT_END
-
 test_expect_success 'U: filedelete root succeeds' '
-    git fast-import <input
+	cat >input <<-INPUT_END &&
+	commit refs/heads/U
+	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+	data <<COMMIT
+	must succeed
+	COMMIT
+	from refs/heads/U^0
+	D ""
+
+	INPUT_END
+
+	git fast-import <input
 '
 
-cat >expect <<EOF
-:100644 000000 c18147dc648481eeb65dc5e66628429a64843327 0000000000000000000000000000000000000000 D	hello.c
-EOF
-
-git diff-tree -M -r U^1 U >actual
-
 test_expect_success 'U: validate root delete result' '
+	cat >expect <<-EOF &&
+	:100644 000000 c18147dc648481eeb65dc5e66628429a64843327 0000000000000000000000000000000000000000 D	hello.c
+	EOF
+
+	git diff-tree -M -r U^1 U >actual &&
+
 	compare_diff_raw expect actual
 '
 
diff --git a/t/t9815-git-p4-submit-fail.sh b/t/t9815-git-p4-submit-fail.sh
index 4cff6a7..37b42d0 100755
--- a/t/t9815-git-p4-submit-fail.sh
+++ b/t/t9815-git-p4-submit-fail.sh
@@ -417,11 +417,8 @@
 		! p4 fstat -T action text &&
 		test_path_is_file text+x &&
 		! p4 fstat -T action text+x &&
-		if test_have_prereq !CYGWIN
-		then
-			stat --format=%A text | egrep ^-r-- &&
-			stat --format=%A text+x | egrep ^-r-x
-		fi
+		ls -l text | egrep ^-r-- &&
+		ls -l text+x | egrep ^-r-x
 	)
 '
 
diff --git a/t/t9818-git-p4-block.sh b/t/t9818-git-p4-block.sh
index 3b3ae1f..8840a18 100755
--- a/t/t9818-git-p4-block.sh
+++ b/t/t9818-git-p4-block.sh
@@ -84,7 +84,7 @@
 	(cd "$cli" &&
 		>$1 &&
 		p4 add $1 &&
-		p4 submit -d "Added a file" $1
+		p4 submit -d "Added file $1" $1
 	)
 }
 
@@ -112,6 +112,32 @@
 	)
 '
 
+# Handling of multiple depot paths:
+#    git p4 clone //depot/pathA //depot/pathB
+#
+test_expect_success 'Create a repo with multiple depot paths' '
+	client_view "//depot/pathA/... //client/pathA/..." \
+		    "//depot/pathB/... //client/pathB/..." &&
+	mkdir -p "$cli/pathA" "$cli/pathB" &&
+	for p in pathA pathB
+	do
+		for i in $(test_seq 1 10)
+		do
+			p4_add_file "$p/file$p$i"
+		done
+	done
+'
+
+test_expect_success 'Clone repo with multiple depot paths' '
+	(
+		cd "$git" &&
+		git p4 clone --changes-block-size=4 //depot/pathA@all //depot/pathB@all \
+			--destination=dest &&
+		ls -1 dest >log &&
+		test_line_count = 20 log
+	)
+'
+
 test_expect_success 'kill p4d' '
 	kill_p4d
 '
diff --git a/t/t9819-git-p4-case-folding.sh b/t/t9819-git-p4-case-folding.sh
index 78f1d0f..d808c00 100755
--- a/t/t9819-git-p4-case-folding.sh
+++ b/t/t9819-git-p4-case-folding.sh
@@ -4,6 +4,12 @@
 
 . ./lib-git-p4.sh
 
+if test_have_prereq CASE_INSENSITIVE_FS
+then
+	skip_all='skipping P4 case-folding tests; case insensitive file system detected'
+	test_done
+fi
+
 test_expect_success 'start p4d with case folding enabled' '
 	start_p4d -C1
 '
diff --git a/t/t9822-git-p4-path-encoding.sh b/t/t9822-git-p4-path-encoding.sh
new file mode 100755
index 0000000..7b83e69
--- /dev/null
+++ b/t/t9822-git-p4-path-encoding.sh
@@ -0,0 +1,58 @@
+#!/bin/sh
+
+test_description='Clone repositories with non ASCII paths'
+
+. ./lib-git-p4.sh
+
+UTF8_ESCAPED="a-\303\244_o-\303\266_u-\303\274.txt"
+ISO8859_ESCAPED="a-\344_o-\366_u-\374.txt"
+
+test_expect_success 'start p4d' '
+	start_p4d
+'
+
+test_expect_success 'Create a repo containing iso8859-1 encoded paths' '
+	(
+		cd "$cli" &&
+		ISO8859="$(printf "$ISO8859_ESCAPED")" &&
+		echo content123 >"$ISO8859" &&
+		p4 add "$ISO8859" &&
+		p4 submit -d "test commit"
+	)
+'
+
+test_expect_failure 'Clone auto-detects depot with iso8859-1 paths' '
+	git p4 clone --destination="$git" //depot &&
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		UTF8="$(printf "$UTF8_ESCAPED")" &&
+		echo "$UTF8" >expect &&
+		git -c core.quotepath=false ls-files >actual &&
+		test_cmp expect actual
+	)
+'
+
+test_expect_success 'Clone repo containing iso8859-1 encoded paths with git-p4.pathEncoding' '
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init . &&
+		git config git-p4.pathEncoding iso8859-1 &&
+		git p4 clone --use-client-spec --destination="$git" //depot &&
+		UTF8="$(printf "$UTF8_ESCAPED")" &&
+		echo "$UTF8" >expect &&
+		git -c core.quotepath=false ls-files >actual &&
+		test_cmp expect actual &&
+
+		echo content123 >expect &&
+		cat "$UTF8" >actual &&
+		test_cmp expect actual
+	)
+'
+
+test_expect_success 'kill p4d' '
+	kill_p4d
+'
+
+test_done
diff --git a/t/t9823-git-p4-mock-lfs.sh b/t/t9823-git-p4-mock-lfs.sh
new file mode 100755
index 0000000..1f2dc36
--- /dev/null
+++ b/t/t9823-git-p4-mock-lfs.sh
@@ -0,0 +1,192 @@
+#!/bin/sh
+
+test_description='Clone repositories and store files in Mock LFS'
+
+. ./lib-git-p4.sh
+
+test_file_is_not_in_mock_lfs () {
+	FILE="$1" &&
+	CONTENT="$2" &&
+	echo "$CONTENT" >expect_content &&
+	test_path_is_file "$FILE" &&
+	test_cmp expect_content "$FILE"
+}
+
+test_file_is_in_mock_lfs () {
+	FILE="$1" &&
+	CONTENT="$2" &&
+	LOCAL_STORAGE=".git/mock-storage/local/$CONTENT" &&
+	SERVER_STORAGE=".git/mock-storage/remote/$CONTENT" &&
+	echo "pointer-$CONTENT" >expect_pointer &&
+	echo "$CONTENT" >expect_content &&
+	test_path_is_file "$FILE" &&
+	test_path_is_file "$LOCAL_STORAGE" &&
+	test_path_is_file "$SERVER_STORAGE" &&
+	test_cmp expect_pointer "$FILE" &&
+	test_cmp expect_content "$LOCAL_STORAGE" &&
+	test_cmp expect_content "$SERVER_STORAGE"
+}
+
+test_file_is_deleted_in_mock_lfs () {
+	FILE="$1" &&
+	CONTENT="$2" &&
+	LOCAL_STORAGE=".git/mock-storage/local/$CONTENT" &&
+	SERVER_STORAGE=".git/mock-storage/remote/$CONTENT" &&
+	echo "pointer-$CONTENT" >expect_pointer &&
+	echo "$CONTENT" >expect_content &&
+	test_path_is_missing "$FILE" &&
+	test_path_is_file "$LOCAL_STORAGE" &&
+	test_path_is_file "$SERVER_STORAGE" &&
+	test_cmp expect_content "$LOCAL_STORAGE" &&
+	test_cmp expect_content "$SERVER_STORAGE"
+}
+
+test_file_count_in_dir () {
+	DIR="$1" &&
+	EXPECTED_COUNT="$2" &&
+	find "$DIR" -type f >actual &&
+	test_line_count = $EXPECTED_COUNT actual
+}
+
+test_expect_success 'start p4d' '
+	start_p4d
+'
+
+test_expect_success 'Create repo with binary files' '
+	client_view "//depot/... //client/..." &&
+	(
+		cd "$cli" &&
+
+		echo "content 1 txt 23 bytes" >file1.txt &&
+		p4 add file1.txt &&
+		echo "content 2-3 bin 25 bytes" >file2.dat &&
+		p4 add file2.dat &&
+		p4 submit -d "Add text and binary file" &&
+
+		mkdir "path with spaces" &&
+		echo "content 2-3 bin 25 bytes" >"path with spaces/file3.bin" &&
+		p4 add "path with spaces/file3.bin" &&
+		p4 submit -d "Add another binary file with same content and spaces in path" &&
+
+		echo "content 4 bin 26 bytes XX" >file4.bin &&
+		p4 add file4.bin &&
+		p4 submit -d "Add another binary file with different content"
+	)
+'
+
+test_expect_success 'Store files in Mock LFS based on size (>24 bytes)' '
+	client_view "//depot/... //client/..." &&
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init . &&
+		git config git-p4.useClientSpec true &&
+		git config git-p4.largeFileSystem MockLFS &&
+		git config git-p4.largeFileThreshold 24 &&
+		git config git-p4.largeFilePush True &&
+		git p4 clone --destination="$git" //depot@all &&
+
+		test_file_is_not_in_mock_lfs file1.txt "content 1 txt 23 bytes" &&
+		test_file_is_in_mock_lfs file2.dat "content 2-3 bin 25 bytes" &&
+		test_file_is_in_mock_lfs "path with spaces/file3.bin" "content 2-3 bin 25 bytes" &&
+		test_file_is_in_mock_lfs file4.bin "content 4 bin 26 bytes XX" &&
+
+		test_file_count_in_dir ".git/mock-storage/local" 2 &&
+		test_file_count_in_dir ".git/mock-storage/remote" 2
+	)
+'
+
+test_expect_success 'Store files in Mock LFS based on extension (dat)' '
+	client_view "//depot/... //client/..." &&
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init . &&
+		git config git-p4.useClientSpec true &&
+		git config git-p4.largeFileSystem MockLFS &&
+		git config git-p4.largeFileExtensions dat &&
+		git config git-p4.largeFilePush True &&
+		git p4 clone --destination="$git" //depot@all &&
+
+		test_file_is_not_in_mock_lfs file1.txt "content 1 txt 23 bytes" &&
+		test_file_is_in_mock_lfs file2.dat "content 2-3 bin 25 bytes" &&
+		test_file_is_not_in_mock_lfs "path with spaces/file3.bin" "content 2-3 bin 25 bytes" &&
+		test_file_is_not_in_mock_lfs file4.bin "content 4 bin 26 bytes XX" &&
+
+		test_file_count_in_dir ".git/mock-storage/local" 1 &&
+		test_file_count_in_dir ".git/mock-storage/remote" 1
+	)
+'
+
+test_expect_success 'Store files in Mock LFS based on extension (dat) and use git p4 sync and no client spec' '
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init &&
+		git config git-p4.useClientSpec true &&
+		git config git-p4.largeFileSystem MockLFS &&
+		git config git-p4.largeFileExtensions dat &&
+		git config git-p4.largeFilePush True &&
+		git p4 sync //depot &&
+		git checkout p4/master &&
+
+		test_file_is_not_in_mock_lfs file1.txt "content 1 txt 23 bytes" &&
+		test_file_is_in_mock_lfs file2.dat "content 2-3 bin 25 bytes" &&
+		test_file_is_not_in_mock_lfs "path with spaces/file3.bin" "content 2-3 bin 25 bytes" &&
+		test_file_is_not_in_mock_lfs file4.bin "content 4 bin 26 bytes XX" &&
+
+		test_file_count_in_dir ".git/mock-storage/local" 1 &&
+		test_file_count_in_dir ".git/mock-storage/remote" 1
+	)
+'
+
+test_expect_success 'Remove file from repo and store files in Mock LFS based on size (>24 bytes)' '
+	client_view "//depot/... //client/..." &&
+	(
+		cd "$cli" &&
+		p4 delete file4.bin &&
+		p4 submit -d "Remove file"
+	) &&
+
+	client_view "//depot/... //client/..." &&
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init . &&
+		git config git-p4.useClientSpec true &&
+		git config git-p4.largeFileSystem MockLFS &&
+		git config git-p4.largeFileThreshold 24 &&
+		git config git-p4.largeFilePush True &&
+		git p4 clone --destination="$git" //depot@all &&
+
+		test_file_is_not_in_mock_lfs file1.txt "content 1 txt 23 bytes" &&
+		test_file_is_in_mock_lfs file2.dat "content 2-3 bin 25 bytes" &&
+		test_file_is_in_mock_lfs "path with spaces/file3.bin" "content 2-3 bin 25 bytes" &&
+		test_file_is_deleted_in_mock_lfs file4.bin "content 4 bin 26 bytes XX" &&
+
+		test_file_count_in_dir ".git/mock-storage/local" 2 &&
+		test_file_count_in_dir ".git/mock-storage/remote" 2
+	)
+'
+
+test_expect_success 'Run git p4 submit in repo configured with large file system' '
+	client_view "//depot/... //client/..." &&
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init . &&
+		git config git-p4.useClientSpec true &&
+		git config git-p4.largeFileSystem MockLFS &&
+		git config git-p4.largeFileThreshold 24 &&
+		git config git-p4.largeFilePush True &&
+		git p4 clone --destination="$git" //depot@all &&
+
+		test_must_fail git p4 submit
+	)
+'
+
+test_expect_success 'kill p4d' '
+	kill_p4d
+'
+
+test_done
diff --git a/t/t9824-git-p4-git-lfs.sh b/t/t9824-git-p4-git-lfs.sh
new file mode 100755
index 0000000..0b664a3
--- /dev/null
+++ b/t/t9824-git-p4-git-lfs.sh
@@ -0,0 +1,288 @@
+#!/bin/sh
+
+test_description='Clone repositories and store files in Git LFS'
+
+. ./lib-git-p4.sh
+
+git lfs help >/dev/null 2>&1 || {
+	skip_all='skipping git p4 Git LFS tests; Git LFS not found'
+	test_done
+}
+
+test_file_in_lfs () {
+	FILE="$1" &&
+	SIZE="$2" &&
+	EXPECTED_CONTENT="$3" &&
+	cat "$FILE" | grep "size $SIZE" &&
+	HASH=$(cat "$FILE" | grep "oid sha256:" | sed -e "s/oid sha256://g") &&
+	LFS_FILE=".git/lfs/objects/$(echo "$HASH" | cut -c1-2)/$(echo "$HASH" | cut -c3-4)/$HASH" &&
+	echo $EXPECTED_CONTENT >expect &&
+	test_path_is_file "$FILE" &&
+	test_path_is_file "$LFS_FILE" &&
+	test_cmp expect "$LFS_FILE"
+}
+
+test_file_count_in_dir () {
+	DIR="$1" &&
+	EXPECTED_COUNT="$2" &&
+	find "$DIR" -type f >actual &&
+	test_line_count = $EXPECTED_COUNT actual
+}
+
+test_expect_success 'start p4d' '
+	start_p4d
+'
+
+test_expect_success 'Create repo with binary files' '
+	client_view "//depot/... //client/..." &&
+	(
+		cd "$cli" &&
+
+		echo "content 1 txt 23 bytes" >file1.txt &&
+		p4 add file1.txt &&
+		echo "content 2-3 bin 25 bytes" >file2.dat &&
+		p4 add file2.dat &&
+		p4 submit -d "Add text and binary file" &&
+
+		mkdir "path with spaces" &&
+		echo "content 2-3 bin 25 bytes" >"path with spaces/file3.bin" &&
+		p4 add "path with spaces/file3.bin" &&
+		p4 submit -d "Add another binary file with same content and spaces in path" &&
+
+		echo "content 4 bin 26 bytes XX" >file4.bin &&
+		p4 add file4.bin &&
+		p4 submit -d "Add another binary file with different content"
+	)
+'
+
+test_expect_success 'Store files in LFS based on size (>24 bytes)' '
+	client_view "//depot/... //client/..." &&
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init . &&
+		git config git-p4.useClientSpec true &&
+		git config git-p4.largeFileSystem GitLFS &&
+		git config git-p4.largeFileThreshold 24 &&
+		git p4 clone --destination="$git" //depot@all &&
+
+		test_file_in_lfs file2.dat 25 "content 2-3 bin 25 bytes" &&
+		test_file_in_lfs "path with spaces/file3.bin" 25 "content 2-3 bin 25 bytes" &&
+		test_file_in_lfs file4.bin 26 "content 4 bin 26 bytes XX" &&
+
+		test_file_count_in_dir ".git/lfs/objects" 2 &&
+
+		cat >expect <<-\EOF &&
+
+		#
+		# Git LFS (see https://git-lfs.github.com/)
+		#
+		/file2.dat filter=lfs -text
+		/file4.bin filter=lfs -text
+		/path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs -text
+		EOF
+		test_path_is_file .gitattributes &&
+		test_cmp expect .gitattributes
+	)
+'
+
+test_expect_success 'Store files in LFS based on size (>25 bytes)' '
+	client_view "//depot/... //client/..." &&
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init . &&
+		git config git-p4.useClientSpec true &&
+		git config git-p4.largeFileSystem GitLFS &&
+		git config git-p4.largeFileThreshold 25 &&
+		git p4 clone --destination="$git" //depot@all &&
+
+		test_file_in_lfs file4.bin 26 "content 4 bin 26 bytes XX" &&
+		test_file_count_in_dir ".git/lfs/objects" 1 &&
+
+		cat >expect <<-\EOF &&
+
+		#
+		# Git LFS (see https://git-lfs.github.com/)
+		#
+		/file4.bin filter=lfs -text
+		EOF
+		test_path_is_file .gitattributes &&
+		test_cmp expect .gitattributes
+	)
+'
+
+test_expect_success 'Store files in LFS based on extension (dat)' '
+	client_view "//depot/... //client/..." &&
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init . &&
+		git config git-p4.useClientSpec true &&
+		git config git-p4.largeFileSystem GitLFS &&
+		git config git-p4.largeFileExtensions dat &&
+		git p4 clone --destination="$git" //depot@all &&
+
+		test_file_in_lfs file2.dat 25 "content 2-3 bin 25 bytes" &&
+		test_file_count_in_dir ".git/lfs/objects" 1 &&
+
+		cat >expect <<-\EOF &&
+
+		#
+		# Git LFS (see https://git-lfs.github.com/)
+		#
+		*.dat filter=lfs -text
+		EOF
+		test_path_is_file .gitattributes &&
+		test_cmp expect .gitattributes
+	)
+'
+
+test_expect_success 'Store files in LFS based on size (>25 bytes) and extension (dat)' '
+	client_view "//depot/... //client/..." &&
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init . &&
+		git config git-p4.useClientSpec true &&
+		git config git-p4.largeFileSystem GitLFS &&
+		git config git-p4.largeFileExtensions dat &&
+		git config git-p4.largeFileThreshold 25 &&
+		git p4 clone --destination="$git" //depot@all &&
+
+		test_file_in_lfs file2.dat 25 "content 2-3 bin 25 bytes" &&
+		test_file_in_lfs file4.bin 26 "content 4 bin 26 bytes XX" &&
+		test_file_count_in_dir ".git/lfs/objects" 2 &&
+
+		cat >expect <<-\EOF &&
+
+		#
+		# Git LFS (see https://git-lfs.github.com/)
+		#
+		*.dat filter=lfs -text
+		/file4.bin filter=lfs -text
+		EOF
+		test_path_is_file .gitattributes &&
+		test_cmp expect .gitattributes
+	)
+'
+
+test_expect_success 'Remove file from repo and store files in LFS based on size (>24 bytes)' '
+	client_view "//depot/... //client/..." &&
+	(
+		cd "$cli" &&
+		p4 delete file4.bin &&
+		p4 submit -d "Remove file"
+	) &&
+
+	client_view "//depot/... //client/..." &&
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init . &&
+		git config git-p4.useClientSpec true &&
+		git config git-p4.largeFileSystem GitLFS &&
+		git config git-p4.largeFileThreshold 24 &&
+		git p4 clone --destination="$git" //depot@all &&
+
+		test_file_in_lfs file2.dat 25 "content 2-3 bin 25 bytes" &&
+		test_file_in_lfs "path with spaces/file3.bin" 25 "content 2-3 bin 25 bytes" &&
+		test_path_is_missing file4.bin &&
+		test_file_count_in_dir ".git/lfs/objects" 2 &&
+
+		cat >expect <<-\EOF &&
+
+		#
+		# Git LFS (see https://git-lfs.github.com/)
+		#
+		/file2.dat filter=lfs -text
+		/path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs -text
+		EOF
+		test_path_is_file .gitattributes &&
+		test_cmp expect .gitattributes
+	)
+'
+
+test_expect_success 'Add .gitattributes and store files in LFS based on size (>24 bytes)' '
+	client_view "//depot/... //client/..." &&
+	(
+		cd "$cli" &&
+		echo "*.txt text" >.gitattributes &&
+		p4 add .gitattributes &&
+		p4 submit -d "Add .gitattributes"
+	) &&
+
+	client_view "//depot/... //client/..." &&
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init . &&
+		git config git-p4.useClientSpec true &&
+		git config git-p4.largeFileSystem GitLFS &&
+		git config git-p4.largeFileThreshold 24 &&
+		git p4 clone --destination="$git" //depot@all &&
+
+		test_file_in_lfs file2.dat 25 "content 2-3 bin 25 bytes" &&
+		test_file_in_lfs "path with spaces/file3.bin" 25 "content 2-3 bin 25 bytes" &&
+		test_path_is_missing file4.bin &&
+		test_file_count_in_dir ".git/lfs/objects" 2 &&
+
+		cat >expect <<-\EOF &&
+		*.txt text
+
+		#
+		# Git LFS (see https://git-lfs.github.com/)
+		#
+		/file2.dat filter=lfs -text
+		/path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs -text
+		EOF
+		test_path_is_file .gitattributes &&
+		test_cmp expect .gitattributes
+	)
+'
+
+test_expect_success 'Add big files to repo and store files in LFS based on compressed size (>28 bytes)' '
+	client_view "//depot/... //client/..." &&
+	(
+		cd "$cli" &&
+		echo "content 5 bin 40 bytes XXXXXXXXXXXXXXXX" >file5.bin &&
+		p4 add file5.bin &&
+		p4 submit -d "Add file with small footprint after compression" &&
+
+		echo "content 6 bin 39 bytes XXXXXYYYYYZZZZZ" >file6.bin &&
+		p4 add file6.bin &&
+		p4 submit -d "Add file with large footprint after compression"
+	) &&
+
+	client_view "//depot/... //client/..." &&
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init . &&
+		git config git-p4.useClientSpec true &&
+		git config git-p4.largeFileSystem GitLFS &&
+		git config git-p4.largeFileCompressedThreshold 28 &&
+		# We only import HEAD here ("@all" is missing!)
+		git p4 clone --destination="$git" //depot &&
+
+		test_file_in_lfs file6.bin 13 "content 6 bin 39 bytes XXXXXYYYYYZZZZZ"
+		test_file_count_in_dir ".git/lfs/objects" 1 &&
+
+		cat >expect <<-\EOF &&
+		*.txt text
+
+		#
+		# Git LFS (see https://git-lfs.github.com/)
+		#
+		/file6.bin filter=lfs -text
+		EOF
+		test_path_is_file .gitattributes &&
+		test_cmp expect .gitattributes
+	)
+'
+
+test_expect_success 'kill p4d' '
+	kill_p4d
+'
+
+test_done
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index 6dffb8b..8d99eb3 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -145,6 +145,14 @@
 	fi
 }
 
+# Wrap git in gdb. Adding this to a command can make it easier to
+# understand what is going on in a failing test.
+#
+# Example: "debug git checkout master".
+debug () {
+	 GIT_TEST_GDB=1 "$@"
+}
+
 # Call test_commit with the arguments "<message> [<file> [<contents> [<tag>]]]"
 #
 # This will commit a file with the given contents and the given commit
@@ -561,6 +569,21 @@
 	fi
 }
 
+# Returns success if a comma separated string of keywords ($1) contains a
+# given keyword ($2).
+# Examples:
+# `list_contains "foo,bar" bar` returns 0
+# `list_contains "foo" bar` returns 1
+
+list_contains () {
+	case ",$1," in
+	*,$2,*)
+		return 0
+		;;
+	esac
+	return 1
+}
+
 # This is not among top-level (test_expect_success | test_expect_failure)
 # but is a prefix that can be used in the test script, like:
 #
@@ -574,18 +597,34 @@
 # the failure could be due to a segv.  We want a controlled failure.
 
 test_must_fail () {
+	case "$1" in
+	ok=*)
+		_test_ok=${1#ok=}
+		shift
+		;;
+	*)
+		_test_ok=
+		;;
+	esac
 	"$@"
 	exit_code=$?
-	if test $exit_code = 0; then
+	if test $exit_code -eq 0 && ! list_contains "$_test_ok" success
+	then
 		echo >&2 "test_must_fail: command succeeded: $*"
 		return 1
-	elif test $exit_code -gt 129 && test $exit_code -le 192; then
-		echo >&2 "test_must_fail: died by signal: $*"
+	elif test $exit_code -eq 141 && list_contains "$_test_ok" sigpipe
+	then
+		return 0
+	elif test $exit_code -gt 129 && test $exit_code -le 192
+	then
+		echo >&2 "test_must_fail: died by signal $(($exit_code - 128)): $*"
 		return 1
-	elif test $exit_code = 127; then
+	elif test $exit_code -eq 127
+	then
 		echo >&2 "test_must_fail: command not found: $*"
 		return 1
-	elif test $exit_code = 126; then
+	elif test $exit_code -eq 126
+	then
 		echo >&2 "test_must_fail: valgrind error: $*"
 		return 1
 	fi
@@ -604,16 +643,7 @@
 # because we want to notice if it fails due to segv.
 
 test_might_fail () {
-	"$@"
-	exit_code=$?
-	if test $exit_code -gt 129 && test $exit_code -le 192; then
-		echo >&2 "test_might_fail: died by signal: $*"
-		return 1
-	elif test $exit_code = 127; then
-		echo >&2 "test_might_fail: command not found: $*"
-		return 1
-	fi
-	return 0
+	test_must_fail ok=success "$@"
 }
 
 # Similar to test_must_fail and test_might_fail, but check that a
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 16c4d7b..51e4a88 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -907,9 +907,11 @@
 		y="$*"
 	fi
 
-	while echo "$y"
+	i=0
+	while test $i -lt 99
 	do
-		:
+		echo "$y"
+		i=$(($i+1))
 	done
 }
 
@@ -1054,20 +1056,28 @@
 	test "$uid" != 0
 '
 
-# On a filesystem that lacks SANITY, a file can be deleted even if
-# the containing directory doesn't have write permissions, or a file
-# can be accessed even if the containing directory doesn't have read
-# or execute permissions, causing our tests that validate that Git
-# works sensibly in such situations.
+# SANITY is about "can you correctly predict what the filesystem would
+# do by only looking at the permission bits of the files and
+# directories?"  A typical example of !SANITY is running the test
+# suite as root, where a test may expect "chmod -r file && cat file"
+# to fail because file is supposed to be unreadable after a successful
+# chmod.  In an environment (i.e. combination of what filesystem is
+# being used and who is running the tests) that lacks SANITY, you may
+# be able to delete or create a file when the containing directory
+# doesn't have write permissions, or access a file even if the
+# containing directory doesn't have read or execute permissions.
+
 test_lazy_prereq SANITY '
 	mkdir SANETESTD.1 SANETESTD.2 &&
 
 	chmod +w SANETESTD.1 SANETESTD.2 &&
 	>SANETESTD.1/x 2>SANETESTD.2/x &&
 	chmod -w SANETESTD.1 &&
+	chmod -r SANETESTD.1/x &&
 	chmod -rx SANETESTD.2 ||
 	error "bug in test sript: cannot prepare SANETESTD"
 
+	! test -r SANETESTD.1/x &&
 	! rm SANETESTD.1/x && ! test -f SANETESTD.2/x
 	status=$?
 
diff --git a/tag.c b/tag.c
index 5b0ac62..d72f742 100644
--- a/tag.c
+++ b/tag.c
@@ -10,7 +10,7 @@
 {
 	while (o && o->type == OBJ_TAG)
 		if (((struct tag *)o)->tagged)
-			o = parse_object(((struct tag *)o)->tagged->sha1);
+			o = parse_object(((struct tag *)o)->tagged->oid.hash);
 		else
 			o = NULL;
 	if (!o && warn) {
@@ -24,7 +24,7 @@
 struct object *deref_tag_noverify(struct object *o)
 {
 	while (o && o->type == OBJ_TAG) {
-		o = parse_object(o->sha1);
+		o = parse_object(o->oid.hash);
 		if (o && o->type == OBJ_TAG && ((struct tag *)o)->tagged)
 			o = ((struct tag *)o)->tagged;
 		else
@@ -82,7 +82,7 @@
 	nl = memchr(bufptr, '\n', tail - bufptr);
 	if (!nl || sizeof(type) <= (nl - bufptr))
 		return -1;
-	strncpy(type, bufptr, nl - bufptr);
+	memcpy(type, bufptr, nl - bufptr);
 	type[nl - bufptr] = '\0';
 	bufptr = nl + 1;
 
@@ -127,14 +127,14 @@
 
 	if (item->object.parsed)
 		return 0;
-	data = read_sha1_file(item->object.sha1, &type, &size);
+	data = read_sha1_file(item->object.oid.hash, &type, &size);
 	if (!data)
 		return error("Could not read %s",
-			     sha1_to_hex(item->object.sha1));
+			     oid_to_hex(&item->object.oid));
 	if (type != OBJ_TAG) {
 		free(data);
 		return error("Object %s not a tag",
-			     sha1_to_hex(item->object.sha1));
+			     oid_to_hex(&item->object.oid));
 	}
 	ret = parse_tag_buffer(item, data, size);
 	free(data);
diff --git a/templates/hooks--update.sample b/templates/hooks--update.sample
index d847583..80ba941 100755
--- a/templates/hooks--update.sample
+++ b/templates/hooks--update.sample
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# An example hook script to blocks unannotated tags from entering.
+# An example hook script to block unannotated tags from entering.
 # Called by "git receive-pack" with arguments: refname sha1-old sha1-new
 #
 # To enable this hook, rename this file to "update".
diff --git a/test-dump-cache-tree.c b/test-dump-cache-tree.c
index 54c0872..bb53c0a 100644
--- a/test-dump-cache-tree.c
+++ b/test-dump-cache-tree.c
@@ -47,7 +47,7 @@
 		struct cache_tree_sub *rdwn;
 
 		rdwn = cache_tree_sub(ref, down->name);
-		sprintf(path, "%s%.*s/", pfx, down->namelen, down->name);
+		xsnprintf(path, sizeof(path), "%s%.*s/", pfx, down->namelen, down->name);
 		if (dump_cache_tree(down->cache_tree, rdwn->cache_tree, path))
 			errs = 1;
 	}
diff --git a/test-match-trees.c b/test-match-trees.c
index 2ef725e..109f03e 100644
--- a/test-match-trees.c
+++ b/test-match-trees.c
@@ -17,7 +17,7 @@
 	if (!two)
 		die("not a tree-ish %s", av[2]);
 
-	shift_tree(one->object.sha1, two->object.sha1, shifted, -1);
+	shift_tree(one->object.oid.hash, two->object.oid.hash, shifted, -1);
 	printf("shifted: %s\n", sha1_to_hex(shifted));
 
 	exit(0);
diff --git a/test-path-utils.c b/test-path-utils.c
index c67bf65..0c15f18 100644
--- a/test-path-utils.c
+++ b/test-path-utils.c
@@ -8,21 +8,14 @@
  */
 static int normalize_ceiling_entry(struct string_list_item *item, void *unused)
 {
-	const char *ceil = item->string;
-	int len = strlen(ceil);
-	char buf[PATH_MAX+1];
+	char *ceil = item->string;
 
-	if (len == 0)
+	if (!*ceil)
 		die("Empty path is not supported");
-	if (len > PATH_MAX)
-		die("Path \"%s\" is too long", ceil);
 	if (!is_absolute_path(ceil))
 		die("Path \"%s\" is not absolute", ceil);
-	if (normalize_path_copy(buf, ceil) < 0)
+	if (normalize_path_copy(ceil, ceil) < 0)
 		die("Path \"%s\" could not be normalized", ceil);
-	len = strlen(buf);
-	free(item->string);
-	item->string = xstrdup(buf);
 	return 1;
 }
 
@@ -39,10 +32,134 @@
 		die("Bad value: %s\n", input);
 }
 
+struct test_data {
+	const char *from;  /* input:  transform from this ... */
+	const char *to;    /* output: ... to this.            */
+	const char *alternative; /* output: ... or this.      */
+};
+
+static int test_function(struct test_data *data, char *(*func)(char *input),
+	const char *funcname)
+{
+	int failed = 0, i;
+	char buffer[1024];
+	char *to;
+
+	for (i = 0; data[i].to; i++) {
+		if (!data[i].from)
+			to = func(NULL);
+		else {
+			strcpy(buffer, data[i].from);
+			to = func(buffer);
+		}
+		if (!strcmp(to, data[i].to))
+			continue;
+		if (!data[i].alternative)
+			error("FAIL: %s(%s) => '%s' != '%s'\n",
+				funcname, data[i].from, to, data[i].to);
+		else if (!strcmp(to, data[i].alternative))
+			continue;
+		else
+			error("FAIL: %s(%s) => '%s' != '%s', '%s'\n",
+				funcname, data[i].from, to, data[i].to,
+				data[i].alternative);
+		failed = 1;
+	}
+	return failed;
+}
+
+static struct test_data basename_data[] = {
+	/* --- POSIX type paths --- */
+	{ NULL,              "."    },
+	{ "",                "."    },
+	{ ".",               "."    },
+	{ "..",              ".."   },
+	{ "/",               "/"    },
+	{ "//",              "/", "//" },
+	{ "///",             "/", "//" },
+	{ "////",            "/", "//" },
+	{ "usr",             "usr"  },
+	{ "/usr",            "usr"  },
+	{ "/usr/",           "usr"  },
+	{ "/usr//",          "usr"  },
+	{ "/usr/lib",        "lib"  },
+	{ "usr/lib",         "lib"  },
+	{ "usr/lib///",      "lib"  },
+
+#if defined(__MINGW32__) || defined(_MSC_VER)
+	/* --- win32 type paths --- */
+	{ "\\usr",           "usr"  },
+	{ "\\usr\\",         "usr"  },
+	{ "\\usr\\\\",       "usr"  },
+	{ "\\usr\\lib",      "lib"  },
+	{ "usr\\lib",        "lib"  },
+	{ "usr\\lib\\\\\\",  "lib"  },
+	{ "C:/usr",          "usr"  },
+	{ "C:/usr",          "usr"  },
+	{ "C:/usr/",         "usr"  },
+	{ "C:/usr//",        "usr"  },
+	{ "C:/usr/lib",      "lib"  },
+	{ "C:usr/lib",       "lib"  },
+	{ "C:usr/lib///",    "lib"  },
+	{ "C:",              "."    },
+	{ "C:a",             "a"    },
+	{ "C:/",             "/"    },
+	{ "C:///",           "/"    },
+	{ "\\",              "\\", "/" },
+	{ "\\\\",            "\\", "/" },
+	{ "\\\\\\",          "\\", "/" },
+#endif
+	{ NULL,              NULL   }
+};
+
+static struct test_data dirname_data[] = {
+	/* --- POSIX type paths --- */
+	{ NULL,              "."      },
+	{ "",                "."      },
+	{ ".",               "."      },
+	{ "..",              "."      },
+	{ "/",               "/"      },
+	{ "//",              "/", "//" },
+	{ "///",             "/", "//" },
+	{ "////",            "/", "//" },
+	{ "usr",             "."      },
+	{ "/usr",            "/"      },
+	{ "/usr/",           "/"      },
+	{ "/usr//",          "/"      },
+	{ "/usr/lib",        "/usr"   },
+	{ "usr/lib",         "usr"    },
+	{ "usr/lib///",      "usr"    },
+
+#if defined(__MINGW32__) || defined(_MSC_VER)
+	/* --- win32 type paths --- */
+	{ "\\",              "\\"     },
+	{ "\\\\",            "\\\\"   },
+	{ "\\usr",           "\\"     },
+	{ "\\usr\\",         "\\"     },
+	{ "\\usr\\\\",       "\\"     },
+	{ "\\usr\\lib",      "\\usr"  },
+	{ "usr\\lib",        "usr"    },
+	{ "usr\\lib\\\\\\",  "usr"    },
+	{ "C:a",             "C:."    },
+	{ "C:/",             "C:/"    },
+	{ "C:///",           "C:/"    },
+	{ "C:/usr",          "C:/"    },
+	{ "C:/usr/",         "C:/"    },
+	{ "C:/usr//",        "C:/"    },
+	{ "C:/usr/lib",      "C:/usr" },
+	{ "C:usr/lib",       "C:usr"  },
+	{ "C:usr/lib///",    "C:usr"  },
+	{ "\\\\\\",          "\\"     },
+	{ "\\\\\\\\",        "\\"     },
+	{ "C:",              "C:.", "." },
+#endif
+	{ NULL,              NULL     }
+};
+
 int main(int argc, char **argv)
 {
 	if (argc == 3 && !strcmp(argv[1], "normalize_path_copy")) {
-		char *buf = xmalloc(PATH_MAX + 1);
+		char *buf = xmallocz(strlen(argv[2]));
 		int rv = normalize_path_copy(buf, argv[2]);
 		if (rv)
 			buf = "++failed++";
@@ -133,6 +250,12 @@
 		return 0;
 	}
 
+	if (argc == 2 && !strcmp(argv[1], "basename"))
+		return test_function(basename_data, basename, argv[1]);
+
+	if (argc == 2 && !strcmp(argv[1], "dirname"))
+		return test_function(dirname_data, dirname, argv[1]);
+
 	fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
 		argv[1] ? argv[1] : "(there was none)");
 	return 1;
diff --git a/trace.c b/trace.c
index 7393926..4aeea60 100644
--- a/trace.c
+++ b/trace.c
@@ -277,25 +277,24 @@
 
 static const char *quote_crnl(const char *path)
 {
-	static char new_path[PATH_MAX];
-	const char *p2 = path;
-	char *p1 = new_path;
+	static struct strbuf new_path = STRBUF_INIT;
 
 	if (!path)
 		return NULL;
 
-	while (*p2) {
-		switch (*p2) {
-		case '\\': *p1++ = '\\'; *p1++ = '\\'; break;
-		case '\n': *p1++ = '\\'; *p1++ = 'n'; break;
-		case '\r': *p1++ = '\\'; *p1++ = 'r'; break;
+	strbuf_reset(&new_path);
+
+	while (*path) {
+		switch (*path) {
+		case '\\': strbuf_addstr(&new_path, "\\\\"); break;
+		case '\n': strbuf_addstr(&new_path, "\\n"); break;
+		case '\r': strbuf_addstr(&new_path, "\\r"); break;
 		default:
-			*p1++ = *p2;
+			strbuf_addch(&new_path, *path);
 		}
-		p2++;
+		path++;
 	}
-	*p1 = '\0';
-	return new_path;
+	return new_path.buf;
 }
 
 /* FIXME: move prefix to startup_info struct and get rid of this arg */
diff --git a/transport-helper.c b/transport-helper.c
index 63d5427..0eb3cf0 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -346,7 +346,7 @@
 			continue;
 
 		strbuf_addf(&buf, "fetch %s %s\n",
-			    sha1_to_hex(posn->old_sha1),
+			    oid_to_hex(&posn->old_oid),
 			    posn->symref ? posn->symref : posn->name);
 	}
 
@@ -489,7 +489,7 @@
 		else
 			private = xstrdup(name);
 		if (private) {
-			if (read_ref(private, posn->old_sha1) < 0)
+			if (read_ref(private, posn->old_oid.hash) < 0)
 				die("Could not read ref %s", private);
 			free(private);
 		}
@@ -756,7 +756,7 @@
 		private = apply_refspecs(data->refspecs, data->refspec_nr, ref->name);
 		if (!private)
 			continue;
-		update_ref("update by helper", private, ref->new_sha1, NULL, 0, 0);
+		update_ref("update by helper", private, ref->new_oid.hash, NULL, 0, 0);
 		free(private);
 	}
 	strbuf_release(&buf);
@@ -818,7 +818,7 @@
 			if (ref->peer_ref)
 				strbuf_addstr(&buf, ref->peer_ref->name);
 			else
-				strbuf_addstr(&buf, sha1_to_hex(ref->new_sha1));
+				strbuf_addstr(&buf, oid_to_hex(&ref->new_oid));
 		}
 		strbuf_addch(&buf, ':');
 		strbuf_addstr(&buf, ref->name);
@@ -827,14 +827,14 @@
 		/*
 		 * The "--force-with-lease" options without explicit
 		 * values to expect have already been expanded into
-		 * the ref->old_sha1_expect[] field; we can ignore
+		 * the ref->old_oid_expect[] field; we can ignore
 		 * transport->smart_options->cas altogether and instead
 		 * can enumerate them from the refs.
 		 */
 		if (ref->expect_old_sha1) {
 			struct strbuf cas = STRBUF_INIT;
 			strbuf_addf(&cas, "%s:%s",
-				    ref->name, sha1_to_hex(ref->old_sha1_expect));
+				    ref->name, oid_to_hex(&ref->old_oid_expect));
 			string_list_append(&cas_options, strbuf_detach(&cas, NULL));
 		}
 	}
@@ -878,13 +878,13 @@
 
 	for (ref = remote_refs; ref; ref = ref->next) {
 		char *private;
-		unsigned char sha1[20];
+		struct object_id oid;
 
 		private = apply_refspecs(data->refspecs, data->refspec_nr, ref->name);
-		if (private && !get_sha1(private, sha1)) {
+		if (private && !get_sha1(private, oid.hash)) {
 			strbuf_addf(&buf, "^%s", private);
 			string_list_append(&revlist_args, strbuf_detach(&buf, NULL));
-			hashcpy(ref->old_sha1, sha1);
+			oidcpy(&ref->old_oid, &oid);
 		}
 		free(private);
 
@@ -898,7 +898,7 @@
 					name = resolve_ref_unsafe(
 						 ref->peer_ref->name,
 						 RESOLVE_REF_READING,
-						 sha1, &flag);
+						 oid.hash, &flag);
 					if (!name || !(flag & REF_ISSYMREF))
 						name = ref->peer_ref->name;
 
@@ -1016,12 +1016,12 @@
 		if (buf.buf[0] == '@')
 			(*tail)->symref = xstrdup(buf.buf + 1);
 		else if (buf.buf[0] != '?')
-			get_sha1_hex(buf.buf, (*tail)->old_sha1);
+			get_oid_hex(buf.buf, &(*tail)->old_oid);
 		if (eon) {
 			if (has_attribute(eon + 1, "unchanged")) {
 				(*tail)->status |= REF_STATUS_UPTODATE;
 				if (read_ref((*tail)->name,
-					     (*tail)->old_sha1) < 0)
+					     (*tail)->old_oid.hash) < 0)
 					die(N_("Could not read ref %s"),
 					    (*tail)->name);
 			}
diff --git a/transport.c b/transport.c
index 37e4f5e..988047b 100644
--- a/transport.c
+++ b/transport.c
@@ -80,7 +80,7 @@
 				continue;
 			next = alloc_ref(path->buf + name_offset);
 			if (read_in_full(fd, buffer, 40) != 40 ||
-					get_sha1_hex(buffer, next->old_sha1)) {
+					get_oid_hex(buffer, &next->old_oid)) {
 				close(fd);
 				free(next);
 				continue;
@@ -132,7 +132,7 @@
 		if (!(*list)->next || cmp < 0) {
 			struct ref *next = alloc_ref(buffer + 41);
 			buffer[40] = '\0';
-			if (get_sha1_hex(buffer, next->old_sha1)) {
+			if (get_oid_hex(buffer, &next->old_oid)) {
 				warning ("invalid SHA-1: %s", buffer);
 				free(next);
 				continue;
@@ -163,7 +163,7 @@
 			continue;
 		if (!ref->peer_ref)
 			continue;
-		if (is_null_sha1(ref->new_sha1))
+		if (is_null_oid(&ref->new_oid))
 			continue;
 
 		/* Follow symbolic refs (mainly for HEAD). */
@@ -413,7 +413,7 @@
 	for (i = 0; i < data->header.references.nr; i++) {
 		struct ref_list_entry *e = data->header.references.list + i;
 		struct ref *ref = alloc_ref(e->name);
-		hashcpy(ref->old_sha1, e->sha1);
+		hashcpy(ref->old_oid.hash, e->sha1);
 		ref->next = result;
 		result = ref;
 	}
@@ -609,7 +609,7 @@
 			delete_ref(rs.dst, NULL, 0);
 		} else
 			update_ref("update by push", rs.dst,
-					ref->new_sha1, NULL, 0, 0);
+					ref->new_oid.hash, NULL, 0, 0);
 		free(rs.dst);
 	}
 }
@@ -649,29 +649,30 @@
 {
 	if (ref->deletion)
 		print_ref_status('-', "[deleted]", ref, NULL, NULL, porcelain);
-	else if (is_null_sha1(ref->old_sha1))
+	else if (is_null_oid(&ref->old_oid))
 		print_ref_status('*',
 			(starts_with(ref->name, "refs/tags/") ? "[new tag]" :
 			"[new branch]"),
 			ref, ref->peer_ref, NULL, porcelain);
 	else {
-		char quickref[84];
+		struct strbuf quickref = STRBUF_INIT;
 		char type;
 		const char *msg;
 
-		strcpy(quickref, status_abbrev(ref->old_sha1));
+		strbuf_addstr(&quickref, status_abbrev(ref->old_oid.hash));
 		if (ref->forced_update) {
-			strcat(quickref, "...");
+			strbuf_addstr(&quickref, "...");
 			type = '+';
 			msg = "forced update";
 		} else {
-			strcat(quickref, "..");
+			strbuf_addstr(&quickref, "..");
 			type = ' ';
 			msg = NULL;
 		}
-		strcat(quickref, status_abbrev(ref->new_sha1));
+		strbuf_addstr(&quickref, status_abbrev(ref->new_oid.hash));
 
-		print_ref_status(type, quickref, ref, ref->peer_ref, msg, porcelain);
+		print_ref_status(type, quickref.buf, ref, ref->peer_ref, msg, porcelain);
+		strbuf_release(&quickref);
 	}
 }
 
@@ -1139,8 +1140,8 @@
 
 		strbuf_reset(&buf);
 		strbuf_addf( &buf, "%s %s %s %s\n",
-			 r->peer_ref->name, sha1_to_hex(r->new_sha1),
-			 r->name, sha1_to_hex(r->old_sha1));
+			 r->peer_ref->name, oid_to_hex(&r->new_oid),
+			 r->name, oid_to_hex(&r->old_oid));
 
 		if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
 			/* We do not mind if a hook does not read all refs. */
@@ -1224,8 +1225,8 @@
 		if ((flags & TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND) && !is_bare_repository()) {
 			struct ref *ref = remote_refs;
 			for (; ref; ref = ref->next)
-				if (!is_null_sha1(ref->new_sha1) &&
-				    !push_unpushed_submodules(ref->new_sha1,
+				if (!is_null_oid(&ref->new_oid) &&
+				    !push_unpushed_submodules(ref->new_oid.hash,
 					    transport->remote->name))
 				    die ("Failed to push all needed submodules!");
 		}
@@ -1236,8 +1237,8 @@
 			struct string_list needs_pushing = STRING_LIST_INIT_DUP;
 
 			for (; ref; ref = ref->next)
-				if (!is_null_sha1(ref->new_sha1) &&
-				    find_unpushed_submodules(ref->new_sha1,
+				if (!is_null_oid(&ref->new_oid) &&
+				    find_unpushed_submodules(ref->new_oid.hash,
 					    transport->remote->name, &needs_pushing))
 					die_with_unpushed_submodules(&needs_pushing);
 		}
@@ -1290,8 +1291,8 @@
 	for (rm = refs; rm; rm = rm->next) {
 		nr_refs++;
 		if (rm->peer_ref &&
-		    !is_null_sha1(rm->old_sha1) &&
-		    !hashcmp(rm->peer_ref->old_sha1, rm->old_sha1))
+		    !is_null_oid(&rm->old_oid) &&
+		    !oidcmp(&rm->peer_ref->old_oid, &rm->old_oid))
 			continue;
 		ALLOC_GROW(heads, nr_heads + 1, nr_alloc);
 		heads[nr_heads++] = rm;
@@ -1305,7 +1306,7 @@
 		 * This condition shouldn't be met in a non-deepening fetch
 		 * (see builtin/fetch.c:quickfetch()).
 		 */
-		heads = xmalloc(nr_refs * sizeof(*heads));
+		ALLOC_ARRAY(heads, nr_refs);
 		for (rm = refs; rm; rm = rm->next)
 			heads[nr_heads++] = rm;
 	}
@@ -1349,7 +1350,7 @@
  */
 char *transport_anonymize_url(const char *url)
 {
-	char *anon_url, *scheme_prefix, *anon_part;
+	char *scheme_prefix, *anon_part;
 	size_t anon_len, prefix_len = 0;
 
 	anon_part = strchr(url, '@');
@@ -1383,10 +1384,8 @@
 			goto literal_copy;
 		prefix_len = scheme_prefix - url + 3;
 	}
-	anon_url = xcalloc(1, 1 + prefix_len + anon_len);
-	memcpy(anon_url, url, prefix_len);
-	memcpy(anon_url + prefix_len, anon_part, anon_len);
-	return anon_url;
+	return xstrfmt("%.*s%.*s", (int)prefix_len, url,
+		       (int)anon_len, anon_part);
 literal_copy:
 	return xstrdup(url);
 }
diff --git a/transport.h b/transport.h
index 4336dd3..8ebaaf2 100644
--- a/transport.h
+++ b/transport.h
@@ -74,15 +74,15 @@
 	/**
 	 * Push the objects and refs. Send the necessary objects, and
 	 * then, for any refs where peer_ref is set and
-	 * peer_ref->new_sha1 is different from old_sha1, tell the
-	 * remote side to update each ref in the list from old_sha1 to
-	 * peer_ref->new_sha1.
+	 * peer_ref->new_oid is different from old_oid, tell the
+	 * remote side to update each ref in the list from old_oid to
+	 * peer_ref->new_oid.
 	 *
 	 * Where possible, set the status for each ref appropriately.
 	 *
 	 * The transport must modify new_sha1 in the ref to the new
 	 * value if the remote accepted the change. Note that this
-	 * could be a different value from peer_ref->new_sha1 if the
+	 * could be a different value from peer_ref->new_oid if the
 	 * process involved generating new commits.
 	 **/
 	int (*push_refs)(struct transport *transport, struct ref *refs, int flags);
diff --git a/tree.c b/tree.c
index 413a5b1..f79ff98 100644
--- a/tree.c
+++ b/tree.c
@@ -102,7 +102,7 @@
 				    sha1_to_hex(entry.sha1),
 				    base->buf, entry.path);
 
-			hashcpy(sha1, commit->tree->object.sha1);
+			hashcpy(sha1, commit->tree->object.oid.hash);
 		}
 		else
 			continue;
@@ -212,15 +212,15 @@
 
 	if (item->object.parsed)
 		return 0;
-	buffer = read_sha1_file(item->object.sha1, &type, &size);
+	buffer = read_sha1_file(item->object.oid.hash, &type, &size);
 	if (!buffer)
 		return quiet_on_missing ? -1 :
 			error("Could not read %s",
-			     sha1_to_hex(item->object.sha1));
+			     oid_to_hex(&item->object.oid));
 	if (type != OBJ_TREE) {
 		free(buffer);
 		return error("Object %s not a tree",
-			     sha1_to_hex(item->object.sha1));
+			     oid_to_hex(&item->object.oid));
 	}
 	return parse_tree_buffer(item, buffer, size);
 }
@@ -248,6 +248,6 @@
 		else
 			return NULL;
 		if (!obj->parsed)
-			parse_object(obj->sha1);
+			parse_object(obj->oid.hash);
 	} while (1);
 }
diff --git a/unpack-trees.c b/unpack-trees.c
index f932e80..8e2032f 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -1350,9 +1350,7 @@
 	 * Then we need to make sure that we do not lose a locally
 	 * present file that is not ignored.
 	 */
-	pathbuf = xmalloc(namelen + 2);
-	memcpy(pathbuf, ce->name, namelen);
-	strcpy(pathbuf+namelen, "/");
+	pathbuf = xstrfmt("%.*s/", namelen, ce->name);
 
 	memset(&d, 0, sizeof(d));
 	if (o->dir)
diff --git a/upload-pack.c b/upload-pack.c
index d0bc3ca..b3f6653 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -130,14 +130,14 @@
 
 	for (i = 0; i < want_obj.nr; i++)
 		fprintf(pipe_fd, "%s\n",
-			sha1_to_hex(want_obj.objects[i].item->sha1));
+			oid_to_hex(&want_obj.objects[i].item->oid));
 	fprintf(pipe_fd, "--not\n");
 	for (i = 0; i < have_obj.nr; i++)
 		fprintf(pipe_fd, "%s\n",
-			sha1_to_hex(have_obj.objects[i].item->sha1));
+			oid_to_hex(&have_obj.objects[i].item->oid));
 	for (i = 0; i < extra_edge_obj.nr; i++)
 		fprintf(pipe_fd, "%s\n",
-			sha1_to_hex(extra_edge_obj.objects[i].item->sha1));
+			oid_to_hex(&extra_edge_obj.objects[i].item->oid));
 	fprintf(pipe_fd, "\n");
 	fflush(pipe_fd);
 	fclose(pipe_fd);
@@ -324,7 +324,7 @@
 			break;
 		}
 		if (!commit->object.parsed)
-			parse_object(commit->object.sha1);
+			parse_object(commit->object.oid.hash);
 		if (commit->object.flags & REACHABLE)
 			continue;
 		commit->object.flags |= REACHABLE;
@@ -491,7 +491,7 @@
 			continue;
 		if (!is_our_ref(o))
 			continue;
-		memcpy(namebuf + 1, sha1_to_hex(o->sha1), 40);
+		memcpy(namebuf + 1, oid_to_hex(&o->oid), GIT_SHA1_HEXSZ);
 		if (write_in_full(cmd.in, namebuf, 42) < 0)
 			goto error;
 	}
@@ -500,7 +500,7 @@
 		o = want_obj.objects[i].item;
 		if (is_our_ref(o))
 			continue;
-		memcpy(namebuf, sha1_to_hex(o->sha1), 40);
+		memcpy(namebuf, oid_to_hex(&o->oid), GIT_SHA1_HEXSZ);
 		if (write_in_full(cmd.in, namebuf, 41) < 0)
 			goto error;
 	}
@@ -534,7 +534,7 @@
 		o = want_obj.objects[i].item;
 		if (!is_our_ref(o))
 			die("git upload-pack: not our ref %s",
-			    sha1_to_hex(o->sha1));
+			    oid_to_hex(&o->oid));
 	}
 }
 
@@ -646,8 +646,8 @@
 			struct object *object = &result->item->object;
 			if (!(object->flags & (CLIENT_SHALLOW|NOT_SHALLOW))) {
 				packet_write(1, "shallow %s",
-						sha1_to_hex(object->sha1));
-				register_shallow(object->sha1);
+						oid_to_hex(&object->oid));
+				register_shallow(object->oid.hash);
 				shallow_nr++;
 			}
 			result = result->next;
@@ -658,10 +658,10 @@
 			if (object->flags & NOT_SHALLOW) {
 				struct commit_list *parents;
 				packet_write(1, "unshallow %s",
-					sha1_to_hex(object->sha1));
+					oid_to_hex(&object->oid));
 				object->flags &= ~CLIENT_SHALLOW;
 				/* make sure the real parents are parsed */
-				unregister_shallow(object->sha1);
+				unregister_shallow(object->oid.hash);
 				object->parsed = 0;
 				parse_commit_or_die((struct commit *)object);
 				parents = ((struct commit *)object)->parents;
@@ -673,14 +673,14 @@
 				add_object_array(object, NULL, &extra_edge_obj);
 			}
 			/* make sure commit traversal conforms to client */
-			register_shallow(object->sha1);
+			register_shallow(object->oid.hash);
 		}
 		packet_flush(1);
 	} else
 		if (shallows.nr > 0) {
 			int i;
 			for (i = 0; i < shallows.nr; i++)
-				register_shallow(shallows.objects[i].item->sha1);
+				register_shallow(shallows.objects[i].item->oid.hash);
 		}
 
 	shallow_nr += shallows.nr;
@@ -688,11 +688,12 @@
 }
 
 /* return non-zero if the ref is hidden, otherwise 0 */
-static int mark_our_ref(const char *refname, const struct object_id *oid)
+static int mark_our_ref(const char *refname, const char *refname_full,
+			const struct object_id *oid)
 {
 	struct object *o = lookup_unknown_object(oid->hash);
 
-	if (ref_is_hidden(refname)) {
+	if (ref_is_hidden(refname, refname_full)) {
 		o->flags |= HIDDEN_REF;
 		return 1;
 	}
@@ -700,10 +701,12 @@
 	return 0;
 }
 
-static int check_ref(const char *refname, const struct object_id *oid,
+static int check_ref(const char *refname_full, const struct object_id *oid,
 		     int flag, void *cb_data)
 {
-	mark_our_ref(refname, oid);
+	const char *refname = strip_namespace(refname_full);
+
+	mark_our_ref(refname, refname_full, oid);
 	return 0;
 }
 
@@ -726,7 +729,7 @@
 	const char *refname_nons = strip_namespace(refname);
 	struct object_id peeled;
 
-	if (mark_our_ref(refname, oid))
+	if (mark_our_ref(refname_nons, refname, oid))
 		return 0;
 
 	if (capabilities) {
diff --git a/url.c b/url.c
index 7ca2a69..2d89ad1 100644
--- a/url.c
+++ b/url.c
@@ -120,8 +120,7 @@
 void end_url_with_slash(struct strbuf *buf, const char *url)
 {
 	strbuf_addstr(buf, url);
-	if (buf->len && buf->buf[buf->len - 1] != '/')
-		strbuf_addch(buf, '/');
+	strbuf_complete(buf, '/');
 }
 
 void str_end_url_with_slash(const char *url, char **dest) {
diff --git a/userdiff.h b/userdiff.h
index 4a7e78f..2ef0ce5 100644
--- a/userdiff.h
+++ b/userdiff.h
@@ -23,6 +23,10 @@
 struct userdiff_driver *userdiff_find_by_name(const char *name);
 struct userdiff_driver *userdiff_find_by_path(const char *path);
 
+/*
+ * Initialize any textconv-related fields in the driver and return it, or NULL
+ * if it does not have textconv enabled at all.
+ */
 struct userdiff_driver *userdiff_get_textconv(struct userdiff_driver *driver);
 
 #endif /* USERDIFF */
diff --git a/utf8.c b/utf8.c
index 28e6d76..00e10c8 100644
--- a/utf8.c
+++ b/utf8.c
@@ -644,3 +644,24 @@
 	*text += strlen(utf8_bom);
 	return 1;
 }
+
+void strbuf_utf8_align(struct strbuf *buf, align_type position, unsigned int width,
+		       const char *s)
+{
+	int slen = strlen(s);
+	int display_len = utf8_strnwidth(s, slen, 0);
+	int utf8_compensation = slen - display_len;
+
+	if (display_len >= width) {
+		strbuf_addstr(buf, s);
+		return;
+	}
+
+	if (position == ALIGN_LEFT)
+		strbuf_addf(buf, "%-*s", width + utf8_compensation, s);
+	else if (position == ALIGN_MIDDLE) {
+		int left = (width - display_len) / 2;
+		strbuf_addf(buf, "%*s%-*s", left, "", width - left + utf8_compensation, s);
+	} else if (position == ALIGN_RIGHT)
+		strbuf_addf(buf, "%*s", width + utf8_compensation, s);
+}
diff --git a/utf8.h b/utf8.h
index 5a9e94b..7930b44 100644
--- a/utf8.h
+++ b/utf8.h
@@ -55,4 +55,19 @@
  */
 int is_hfs_dotgit(const char *path);
 
+typedef enum {
+	ALIGN_LEFT,
+	ALIGN_MIDDLE,
+	ALIGN_RIGHT
+} align_type;
+
+/*
+ * Align the string given and store it into a strbuf as per the
+ * 'position' and 'width'. If the given string length is larger than
+ * 'width' than then the input string is not truncated and no
+ * alignment is done.
+ */
+void strbuf_utf8_align(struct strbuf *buf, align_type position, unsigned int width,
+		       const char *s);
+
 #endif
diff --git a/walker.c b/walker.c
index 44a936c..7b7e72b 100644
--- a/walker.c
+++ b/walker.c
@@ -17,10 +17,9 @@
 
 static void report_missing(const struct object *obj)
 {
-	char missing_hex[41];
-	strcpy(missing_hex, sha1_to_hex(obj->sha1));
 	fprintf(stderr, "Cannot obtain needed %s %s\n",
-		obj->type ? typename(obj->type): "object", missing_hex);
+		obj->type ? typename(obj->type): "object",
+		oid_to_hex(&obj->oid));
 	if (!is_null_sha1(current_commit_sha1))
 		fprintf(stderr, "while processing commit %s.\n",
 			sha1_to_hex(current_commit_sha1));
@@ -79,9 +78,9 @@
 	if (commit->object.flags & COMPLETE)
 		return 0;
 
-	hashcpy(current_commit_sha1, commit->object.sha1);
+	hashcpy(current_commit_sha1, commit->object.oid.hash);
 
-	walker_say(walker, "walk %s\n", sha1_to_hex(commit->object.sha1));
+	walker_say(walker, "walk %s\n", oid_to_hex(&commit->object.oid));
 
 	if (walker->get_tree) {
 		if (process(walker, &commit->tree->object))
@@ -131,7 +130,7 @@
 	}
 	return error("Unable to determine requirements "
 		     "of type %s for %s",
-		     typename(obj->type), sha1_to_hex(obj->sha1));
+		     typename(obj->type), oid_to_hex(&obj->oid));
 }
 
 static int process(struct walker *walker, struct object *obj)
@@ -140,14 +139,14 @@
 		return 0;
 	obj->flags |= SEEN;
 
-	if (has_sha1_file(obj->sha1)) {
+	if (has_object_file(&obj->oid)) {
 		/* We already have it, so we should scan it now. */
 		obj->flags |= TO_SCAN;
 	}
 	else {
 		if (obj->flags & COMPLETE)
 			return 0;
-		walker->prefetch(walker, obj->sha1);
+		walker->prefetch(walker, obj->oid.hash);
 	}
 
 	object_list_insert(obj, process_queue_end);
@@ -171,13 +170,13 @@
 		 * the queue because we needed to fetch it first.
 		 */
 		if (! (obj->flags & TO_SCAN)) {
-			if (walker->fetch(walker, obj->sha1)) {
+			if (walker->fetch(walker, obj->oid.hash)) {
 				report_missing(obj);
 				return -1;
 			}
 		}
 		if (!obj->type)
-			parse_object(obj->sha1);
+			parse_object(obj->oid.hash);
 		if (process_object(walker, obj))
 			return -1;
 	}
@@ -191,7 +190,7 @@
 	if (!check_refname_format(target, 0)) {
 		struct ref *ref = alloc_ref(target);
 		if (!walker->fetch_ref(walker, ref)) {
-			hashcpy(sha1, ref->old_sha1);
+			hashcpy(sha1, ref->old_oid.hash);
 			free(ref);
 			return 0;
 		}
diff --git a/worktree.c b/worktree.c
new file mode 100644
index 0000000..6181a66
--- /dev/null
+++ b/worktree.c
@@ -0,0 +1,219 @@
+#include "cache.h"
+#include "refs.h"
+#include "strbuf.h"
+#include "worktree.h"
+
+void free_worktrees(struct worktree **worktrees)
+{
+	int i = 0;
+
+	for (i = 0; worktrees[i]; i++) {
+		free(worktrees[i]->path);
+		free(worktrees[i]->git_dir);
+		free(worktrees[i]->head_ref);
+		free(worktrees[i]);
+	}
+	free (worktrees);
+}
+
+/*
+ * read 'path_to_ref' into 'ref'.  Also if is_detached is not NULL,
+ * set is_detached to 1 (0) if the ref is detatched (is not detached).
+ *
+ * $GIT_COMMON_DIR/$symref (e.g. HEAD) is practically outside $GIT_DIR so
+ * for linked worktrees, `resolve_ref_unsafe()` won't work (it uses
+ * git_path). Parse the ref ourselves.
+ *
+ * return -1 if the ref is not a proper ref, 0 otherwise (success)
+ */
+static int parse_ref(char *path_to_ref, struct strbuf *ref, int *is_detached)
+{
+	if (is_detached)
+		*is_detached = 0;
+	if (!strbuf_readlink(ref, path_to_ref, 0)) {
+		/* HEAD is symbolic link */
+		if (!starts_with(ref->buf, "refs/") ||
+				check_refname_format(ref->buf, 0))
+			return -1;
+	} else if (strbuf_read_file(ref, path_to_ref, 0) >= 0) {
+		/* textual symref or detached */
+		if (!starts_with(ref->buf, "ref:")) {
+			if (is_detached)
+				*is_detached = 1;
+		} else {
+			strbuf_remove(ref, 0, strlen("ref:"));
+			strbuf_trim(ref);
+			if (check_refname_format(ref->buf, 0))
+				return -1;
+		}
+	} else
+		return -1;
+	return 0;
+}
+
+/**
+ * Add the head_sha1 and head_ref (if not detached) to the given worktree
+ */
+static void add_head_info(struct strbuf *head_ref, struct worktree *worktree)
+{
+	if (head_ref->len) {
+		if (worktree->is_detached) {
+			get_sha1_hex(head_ref->buf, worktree->head_sha1);
+		} else {
+			resolve_ref_unsafe(head_ref->buf, 0, worktree->head_sha1, NULL);
+			worktree->head_ref = strbuf_detach(head_ref, NULL);
+		}
+	}
+}
+
+/**
+ * get the main worktree
+ */
+static struct worktree *get_main_worktree(void)
+{
+	struct worktree *worktree = NULL;
+	struct strbuf path = STRBUF_INIT;
+	struct strbuf worktree_path = STRBUF_INIT;
+	struct strbuf gitdir = STRBUF_INIT;
+	struct strbuf head_ref = STRBUF_INIT;
+	int is_bare = 0;
+	int is_detached = 0;
+
+	strbuf_addf(&gitdir, "%s", absolute_path(get_git_common_dir()));
+	strbuf_addbuf(&worktree_path, &gitdir);
+	is_bare = !strbuf_strip_suffix(&worktree_path, "/.git");
+	if (is_bare)
+		strbuf_strip_suffix(&worktree_path, "/.");
+
+	strbuf_addf(&path, "%s/HEAD", get_git_common_dir());
+
+	if (parse_ref(path.buf, &head_ref, &is_detached) < 0)
+		goto done;
+
+	worktree = xmalloc(sizeof(struct worktree));
+	worktree->path = strbuf_detach(&worktree_path, NULL);
+	worktree->git_dir = strbuf_detach(&gitdir, NULL);
+	worktree->is_bare = is_bare;
+	worktree->head_ref = NULL;
+	worktree->is_detached = is_detached;
+	add_head_info(&head_ref, worktree);
+
+done:
+	strbuf_release(&path);
+	strbuf_release(&gitdir);
+	strbuf_release(&worktree_path);
+	strbuf_release(&head_ref);
+	return worktree;
+}
+
+static struct worktree *get_linked_worktree(const char *id)
+{
+	struct worktree *worktree = NULL;
+	struct strbuf path = STRBUF_INIT;
+	struct strbuf worktree_path = STRBUF_INIT;
+	struct strbuf gitdir = STRBUF_INIT;
+	struct strbuf head_ref = STRBUF_INIT;
+	int is_detached = 0;
+
+	if (!id)
+		die("Missing linked worktree name");
+
+	strbuf_addf(&gitdir, "%s/worktrees/%s",
+			absolute_path(get_git_common_dir()), id);
+	strbuf_addf(&path, "%s/gitdir", gitdir.buf);
+	if (strbuf_read_file(&worktree_path, path.buf, 0) <= 0)
+		/* invalid gitdir file */
+		goto done;
+
+	strbuf_rtrim(&worktree_path);
+	if (!strbuf_strip_suffix(&worktree_path, "/.git")) {
+		strbuf_reset(&worktree_path);
+		strbuf_addstr(&worktree_path, absolute_path("."));
+		strbuf_strip_suffix(&worktree_path, "/.");
+	}
+
+	strbuf_reset(&path);
+	strbuf_addf(&path, "%s/worktrees/%s/HEAD", get_git_common_dir(), id);
+
+	if (parse_ref(path.buf, &head_ref, &is_detached) < 0)
+		goto done;
+
+	worktree = xmalloc(sizeof(struct worktree));
+	worktree->path = strbuf_detach(&worktree_path, NULL);
+	worktree->git_dir = strbuf_detach(&gitdir, NULL);
+	worktree->is_bare = 0;
+	worktree->head_ref = NULL;
+	worktree->is_detached = is_detached;
+	add_head_info(&head_ref, worktree);
+
+done:
+	strbuf_release(&path);
+	strbuf_release(&gitdir);
+	strbuf_release(&worktree_path);
+	strbuf_release(&head_ref);
+	return worktree;
+}
+
+struct worktree **get_worktrees(void)
+{
+	struct worktree **list = NULL;
+	struct strbuf path = STRBUF_INIT;
+	DIR *dir;
+	struct dirent *d;
+	int counter = 0, alloc = 2;
+
+	list = xmalloc(alloc * sizeof(struct worktree *));
+
+	if ((list[counter] = get_main_worktree()))
+		counter++;
+
+	strbuf_addf(&path, "%s/worktrees", get_git_common_dir());
+	dir = opendir(path.buf);
+	strbuf_release(&path);
+	if (dir) {
+		while ((d = readdir(dir)) != NULL) {
+			struct worktree *linked = NULL;
+			if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
+				continue;
+
+			if ((linked = get_linked_worktree(d->d_name))) {
+				ALLOC_GROW(list, counter + 1, alloc);
+				list[counter++] = linked;
+			}
+		}
+		closedir(dir);
+	}
+	ALLOC_GROW(list, counter + 1, alloc);
+	list[counter] = NULL;
+	return list;
+}
+
+char *find_shared_symref(const char *symref, const char *target)
+{
+	char *existing = NULL;
+	struct strbuf path = STRBUF_INIT;
+	struct strbuf sb = STRBUF_INIT;
+	struct worktree **worktrees = get_worktrees();
+	int i = 0;
+
+	for (i = 0; worktrees[i]; i++) {
+		strbuf_reset(&path);
+		strbuf_reset(&sb);
+		strbuf_addf(&path, "%s/%s", worktrees[i]->git_dir, symref);
+
+		if (parse_ref(path.buf, &sb, NULL)) {
+			continue;
+		}
+
+		if (!strcmp(sb.buf, target)) {
+			existing = xstrdup(worktrees[i]->path);
+			break;
+		}
+	}
+
+	strbuf_release(&path);
+	strbuf_release(&sb);
+	free_worktrees(worktrees);
+
+	return existing;
+}
diff --git a/worktree.h b/worktree.h
new file mode 100644
index 0000000..b4b3dda
--- /dev/null
+++ b/worktree.h
@@ -0,0 +1,38 @@
+#ifndef WORKTREE_H
+#define WORKTREE_H
+
+struct worktree {
+	char *path;
+	char *git_dir;
+	char *head_ref;
+	unsigned char head_sha1[20];
+	int is_detached;
+	int is_bare;
+};
+
+/* Functions for acting on the information about worktrees. */
+
+/*
+ * Get the worktrees.  The primary worktree will always be the first returned,
+ * and linked worktrees will be pointed to by 'next' in each subsequent
+ * worktree.  No specific ordering is done on the linked worktrees.
+ *
+ * The caller is responsible for freeing the memory from the returned
+ * worktree(s).
+ */
+extern struct worktree **get_worktrees(void);
+
+/*
+ * Free up the memory for worktree(s)
+ */
+extern void free_worktrees(struct worktree **);
+
+/*
+ * Check if a per-worktree symref points to a ref in the main worktree
+ * or any linked worktree, and return the path to the exising worktree
+ * if it is.  Returns NULL if there is no existing ref.  The caller is
+ * responsible for freeing the returned path.
+ */
+extern char *find_shared_symref(const char *symref, const char *target);
+
+#endif
diff --git a/wrap-for-bin.sh b/wrap-for-bin.sh
index 701d233..db0ec6a 100644
--- a/wrap-for-bin.sh
+++ b/wrap-for-bin.sh
@@ -19,4 +19,10 @@
 PATH='@@BUILD_DIR@@/bin-wrappers:'"$PATH"
 export GIT_EXEC_PATH GITPERLLIB PATH GIT_TEXTDOMAINDIR
 
-exec "${GIT_EXEC_PATH}/@@PROG@@" "$@"
+if test -n "$GIT_TEST_GDB"
+then
+	unset GIT_TEST_GDB
+	exec gdb --args "${GIT_EXEC_PATH}/@@PROG@@" "$@"
+else
+	exec "${GIT_EXEC_PATH}/@@PROG@@" "$@"
+fi
diff --git a/wrapper.c b/wrapper.c
index dae5675..32c6c60 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -152,6 +152,9 @@
 {
 	void *ret;
 
+	if (unsigned_mult_overflows(nmemb, size))
+		die("data too large to fit into virtual memory space");
+
 	memory_limit_check(size * nmemb, 0);
 	ret = calloc(nmemb, size);
 	if (!ret && (!nmemb || !size))
@@ -375,6 +378,19 @@
 	return stream;
 }
 
+FILE *fopen_for_writing(const char *path)
+{
+	FILE *ret = fopen(path, "w");
+
+	if (!ret && errno == EPERM) {
+		if (!unlink(path))
+			ret = fopen(path, "w");
+		else
+			errno = EPERM;
+	}
+	return ret;
+}
+
 int xmkstemp(char *template)
 {
 	int fd;
@@ -609,6 +625,22 @@
 	return strbuf_detach(&sb, NULL);
 }
 
+int xsnprintf(char *dst, size_t max, const char *fmt, ...)
+{
+	va_list ap;
+	int len;
+
+	va_start(ap, fmt);
+	len = vsnprintf(dst, max, fmt, ap);
+	va_end(ap);
+
+	if (len < 0)
+		die("BUG: your snprintf is broken");
+	if (len >= max)
+		die("BUG: attempt to snprintf into too-small buffer");
+	return len;
+}
+
 static int write_file_v(const char *path, int fatal,
 			const char *fmt, va_list params)
 {
diff --git a/write_or_die.c b/write_or_die.c
index e7afe7a..49e80aa 100644
--- a/write_or_die.c
+++ b/write_or_die.c
@@ -1,8 +1,12 @@
 #include "cache.h"
+#include "run-command.h"
 
 static void check_pipe(int err)
 {
 	if (err == EPIPE) {
+		if (in_async())
+			async_exit(141);
+
 		signal(SIGPIPE, SIG_DFL);
 		raise(SIGPIPE);
 		/* Should never happen, but just in case... */
diff --git a/wt-status.c b/wt-status.c
index ced53dd..bba2596 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -1346,7 +1346,7 @@
 	    (!hashcmp(cb.nsha1, sha1) ||
 	     /* perhaps sha1 is a tag, try to dereference to a commit */
 	     ((commit = lookup_commit_reference_gently(sha1, 1)) != NULL &&
-	      !hashcmp(cb.nsha1, commit->object.sha1)))) {
+	      !hashcmp(cb.nsha1, commit->object.oid.hash)))) {
 		const char *from = ref;
 		if (!skip_prefix(from, "refs/tags/", &from))
 			skip_prefix(from, "refs/remotes/", &from);
diff --git a/xdiff-interface.c b/xdiff-interface.c
index cb67c1c..54236f2 100644
--- a/xdiff-interface.c
+++ b/xdiff-interface.c
@@ -265,7 +265,7 @@
 	for (i = 0, regs->nr = 1; value[i]; i++)
 		if (value[i] == '\n')
 			regs->nr++;
-	regs->array = xmalloc(regs->nr * sizeof(struct ff_reg));
+	ALLOC_ARRAY(regs->array, regs->nr);
 	for (i = 0; i < regs->nr; i++) {
 		struct ff_reg *reg = regs->array + i;
 		const char *ep = strchr(value, '\n'), *expression;
diff --git a/xdiff/xdiff.h b/xdiff/xdiff.h
index c033991..4fb7e79 100644
--- a/xdiff/xdiff.h
+++ b/xdiff/xdiff.h
@@ -42,7 +42,6 @@
 #define XDF_IGNORE_BLANK_LINES (1 << 7)
 
 #define XDL_EMIT_FUNCNAMES (1 << 0)
-#define XDL_EMIT_COMMON (1 << 1)
 #define XDL_EMIT_FUNCCONTEXT (1 << 2)
 
 #define XDL_MMB_READONLY (1 << 0)
diff --git a/xdiff/xemit.c b/xdiff/xemit.c
index 4266ada..993724b 100644
--- a/xdiff/xemit.c
+++ b/xdiff/xemit.c
@@ -120,21 +120,6 @@
 	return -1;
 }
 
-static int xdl_emit_common(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
-                           xdemitconf_t const *xecfg) {
-	xdfile_t *xdf = &xe->xdf2;
-	const char *rchg = xdf->rchg;
-	long ix;
-
-	for (ix = 0; ix < xdf->nrec; ix++) {
-		if (rchg[ix])
-			continue;
-		if (xdl_emit_record(xdf, ix, "", ecb))
-			return -1;
-	}
-	return 0;
-}
-
 struct func_line {
 	long len;
 	char buf[80];
@@ -170,9 +155,6 @@
 	long funclineprev = -1;
 	struct func_line func_line = { 0 };
 
-	if (xecfg->flags & XDL_EMIT_COMMON)
-		return xdl_emit_common(xe, xscr, ecb, xecfg);
-
 	for (xch = xscr; xch; xch = xche->next) {
 		xche = xdl_get_hunk(&xch, xecfg);
 		if (!xch)
diff --git a/xdiff/xmerge.c b/xdiff/xmerge.c
index 625198e..f338ad6 100644
--- a/xdiff/xmerge.c
+++ b/xdiff/xmerge.c
@@ -109,7 +109,7 @@
 	return 0;
 }
 
-static int xdl_recs_copy_0(int use_orig, xdfenv_t *xe, int i, int count, int add_nl, char *dest)
+static int xdl_recs_copy_0(int use_orig, xdfenv_t *xe, int i, int count, int needs_cr, int add_nl, char *dest)
 {
 	xrecord_t **recs;
 	int size = 0;
@@ -125,6 +125,12 @@
 	if (add_nl) {
 		i = recs[count - 1]->size;
 		if (i == 0 || recs[count - 1]->ptr[i - 1] != '\n') {
+			if (needs_cr) {
+				if (dest)
+					dest[size] = '\r';
+				size++;
+			}
+
 			if (dest)
 				dest[size] = '\n';
 			size++;
@@ -133,14 +139,58 @@
 	return size;
 }
 
-static int xdl_recs_copy(xdfenv_t *xe, int i, int count, int add_nl, char *dest)
+static int xdl_recs_copy(xdfenv_t *xe, int i, int count, int needs_cr, int add_nl, char *dest)
 {
-	return xdl_recs_copy_0(0, xe, i, count, add_nl, dest);
+	return xdl_recs_copy_0(0, xe, i, count, needs_cr, add_nl, dest);
 }
 
-static int xdl_orig_copy(xdfenv_t *xe, int i, int count, int add_nl, char *dest)
+static int xdl_orig_copy(xdfenv_t *xe, int i, int count, int needs_cr, int add_nl, char *dest)
 {
-	return xdl_recs_copy_0(1, xe, i, count, add_nl, dest);
+	return xdl_recs_copy_0(1, xe, i, count, needs_cr, add_nl, dest);
+}
+
+/*
+ * Returns 1 if the i'th line ends in CR/LF (if it is the last line and
+ * has no eol, the preceding line, if any), 0 if it ends in LF-only, and
+ * -1 if the line ending cannot be determined.
+ */
+static int is_eol_crlf(xdfile_t *file, int i)
+{
+	long size;
+
+	if (i < file->nrec - 1)
+		/* All lines before the last *must* end in LF */
+		return (size = file->recs[i]->size) > 1 &&
+			file->recs[i]->ptr[size - 2] == '\r';
+	if (!file->nrec)
+		/* Cannot determine eol style from empty file */
+		return -1;
+	if ((size = file->recs[i]->size) &&
+			file->recs[i]->ptr[size - 1] == '\n')
+		/* Last line; ends in LF; Is it CR/LF? */
+		return size > 1 &&
+			file->recs[i]->ptr[size - 2] == '\r';
+	if (!i)
+		/* The only line has no eol */
+		return -1;
+	/* Determine eol from second-to-last line */
+	return (size = file->recs[i - 1]->size) > 1 &&
+		file->recs[i - 1]->ptr[size - 2] == '\r';
+}
+
+static int is_cr_needed(xdfenv_t *xe1, xdfenv_t *xe2, xdmerge_t *m)
+{
+	int needs_cr;
+
+	/* Match post-images' preceding, or first, lines' end-of-line style */
+	needs_cr = is_eol_crlf(&xe1->xdf2, m->i1 ? m->i1 - 1 : 0);
+	if (needs_cr)
+		needs_cr = is_eol_crlf(&xe2->xdf2, m->i2 ? m->i2 - 1 : 0);
+	/* Look at pre-image's first line, unless we already settled on LF */
+	if (needs_cr)
+		needs_cr = is_eol_crlf(&xe1->xdf1, 0);
+	/* If still undecided, use LF-only */
+	return needs_cr < 0 ? 0 : needs_cr;
 }
 
 static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
@@ -152,16 +202,17 @@
 	int marker1_size = (name1 ? strlen(name1) + 1 : 0);
 	int marker2_size = (name2 ? strlen(name2) + 1 : 0);
 	int marker3_size = (name3 ? strlen(name3) + 1 : 0);
+	int needs_cr = is_cr_needed(xe1, xe2, m);
 
 	if (marker_size <= 0)
 		marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
 
 	/* Before conflicting part */
-	size += xdl_recs_copy(xe1, i, m->i1 - i, 0,
+	size += xdl_recs_copy(xe1, i, m->i1 - i, 0, 0,
 			      dest ? dest + size : NULL);
 
 	if (!dest) {
-		size += marker_size + 1 + marker1_size;
+		size += marker_size + 1 + needs_cr + marker1_size;
 	} else {
 		memset(dest + size, '<', marker_size);
 		size += marker_size;
@@ -170,17 +221,19 @@
 			memcpy(dest + size + 1, name1, marker1_size - 1);
 			size += marker1_size;
 		}
+		if (needs_cr)
+			dest[size++] = '\r';
 		dest[size++] = '\n';
 	}
 
 	/* Postimage from side #1 */
-	size += xdl_recs_copy(xe1, m->i1, m->chg1, 1,
+	size += xdl_recs_copy(xe1, m->i1, m->chg1, needs_cr, 1,
 			      dest ? dest + size : NULL);
 
 	if (style == XDL_MERGE_DIFF3) {
 		/* Shared preimage */
 		if (!dest) {
-			size += marker_size + 1 + marker3_size;
+			size += marker_size + 1 + needs_cr + marker3_size;
 		} else {
 			memset(dest + size, '|', marker_size);
 			size += marker_size;
@@ -189,25 +242,29 @@
 				memcpy(dest + size + 1, name3, marker3_size - 1);
 				size += marker3_size;
 			}
+			if (needs_cr)
+				dest[size++] = '\r';
 			dest[size++] = '\n';
 		}
-		size += xdl_orig_copy(xe1, m->i0, m->chg0, 1,
+		size += xdl_orig_copy(xe1, m->i0, m->chg0, needs_cr, 1,
 				      dest ? dest + size : NULL);
 	}
 
 	if (!dest) {
-		size += marker_size + 1;
+		size += marker_size + 1 + needs_cr;
 	} else {
 		memset(dest + size, '=', marker_size);
 		size += marker_size;
+		if (needs_cr)
+			dest[size++] = '\r';
 		dest[size++] = '\n';
 	}
 
 	/* Postimage from side #2 */
-	size += xdl_recs_copy(xe2, m->i2, m->chg2, 1,
+	size += xdl_recs_copy(xe2, m->i2, m->chg2, needs_cr, 1,
 			      dest ? dest + size : NULL);
 	if (!dest) {
-		size += marker_size + 1 + marker2_size;
+		size += marker_size + 1 + needs_cr + marker2_size;
 	} else {
 		memset(dest + size, '>', marker_size);
 		size += marker_size;
@@ -216,6 +273,8 @@
 			memcpy(dest + size + 1, name2, marker2_size - 1);
 			size += marker2_size;
 		}
+		if (needs_cr)
+			dest[size++] = '\r';
 		dest[size++] = '\n';
 	}
 	return size;
@@ -241,21 +300,24 @@
 						  marker_size);
 		else if (m->mode & 3) {
 			/* Before conflicting part */
-			size += xdl_recs_copy(xe1, i, m->i1 - i, 0,
+			size += xdl_recs_copy(xe1, i, m->i1 - i, 0, 0,
 					      dest ? dest + size : NULL);
 			/* Postimage from side #1 */
-			if (m->mode & 1)
-				size += xdl_recs_copy(xe1, m->i1, m->chg1, (m->mode & 2),
+			if (m->mode & 1) {
+				int needs_cr = is_cr_needed(xe1, xe2, m);
+
+				size += xdl_recs_copy(xe1, m->i1, m->chg1, needs_cr, (m->mode & 2),
 						      dest ? dest + size : NULL);
+			}
 			/* Postimage from side #2 */
 			if (m->mode & 2)
-				size += xdl_recs_copy(xe2, m->i2, m->chg2, 0,
+				size += xdl_recs_copy(xe2, m->i2, m->chg2, 0, 0,
 						      dest ? dest + size : NULL);
 		} else
 			continue;
 		i = m->i1 + m->chg1;
 	}
-	size += xdl_recs_copy(xe1, i, xe1->xdf2.nrec - i, 0,
+	size += xdl_recs_copy(xe1, i, xe1->xdf2.nrec - i, 0, 0,
 			      dest ? dest + size : NULL);
 	return size;
 }
@@ -579,8 +641,11 @@
 	result->ptr = NULL;
 	result->size = 0;
 
-	if (xdl_do_diff(orig, mf1, xpp, &xe1) < 0 ||
-			xdl_do_diff(orig, mf2, xpp, &xe2) < 0) {
+	if (xdl_do_diff(orig, mf1, xpp, &xe1) < 0) {
+		return -1;
+	}
+	if (xdl_do_diff(orig, mf2, xpp, &xe2) < 0) {
+		xdl_free_env(&xe1);
 		return -1;
 	}
 	if (xdl_change_compact(&xe1.xdf1, &xe1.xdf2, xpp->flags) < 0 ||
@@ -592,6 +657,8 @@
 	if (xdl_change_compact(&xe2.xdf1, &xe2.xdf2, xpp->flags) < 0 ||
 	    xdl_change_compact(&xe2.xdf2, &xe2.xdf1, xpp->flags) < 0 ||
 	    xdl_build_script(&xe2, &xscr2) < 0) {
+		xdl_free_script(xscr1);
+		xdl_free_env(&xe1);
 		xdl_free_env(&xe2);
 		return -1;
 	}